在仍然使用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...... 展开详请

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

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

AWS lambda通过私有Hostzone DNS连接到内部ELB

goodbad从精力旺盛的种马过渡到精光内蕴的骏马。
将负载均衡器放置在私有子网中时,只能从VPC内部访问Internet。如果这是你的意图,那好吧。如果您希望Lambda函数能够访问内部负载均衡器,则需要将Lambda函数放在同一个VPC中。 如果在VPC私有子网中同时具有负载均衡器和Lambda,并且您希望使用专用DNS名称,...... 展开详请

从嵌套数据源创建表格单元格

goodbad从精力旺盛的种马过渡到精光内蕴的骏马。
已采纳
问题是,你要追加的返回值$.each是undefined到第二个TD。使用了$.map而不是$.each: tr.append($('<td>').append("<p>" + val.carepathway.name + "</p>")) .append( $('<td>...... 展开详请

Facebook Graph API:Comments API不会返回其他用户发表的评论

goodbad从精力旺盛的种马过渡到精光内蕴的骏马。
在搜索Facebook博客后,发现它是由Facebook做出的有目的的改变:https://developers.facebook.com/blog/post/2018/05/01/facebook-login-updates-further-protect-privacy/ ...... 展开详请

关于作者

goodbad

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

所属标签

扫码关注云+社区