Android之多语言设置

2023-05-16

随着毕设的一步步推进。今天给毕设加了多语言适配。虽然只设配了英语跟简体中文、繁体英文。但是道理是相同的,其它语种也是一个道理。

首先,我们附上项目地址:https://github.com/RuijiePan/FileManager.git
欢迎star、fork。

直接附上关键代码:

/**
 * Created by panruijie on 2017/3/15.
 * Email : zquprj@gmail.com
 */

public class LanguageUtil {

    private static LanguageUtil sInstacne;
    private Context mContext;

    //单例初始化
    public static void init(Context mContext) {
        if (sInstacne == null) {
            synchronized (LanguageUtil.class) {
                if (sInstacne == null) {
                    sInstacne = new LanguageUtil(mContext);
                }
            }
        }
    }

    public static LanguageUtil getInstance() {

        if (sInstacne == null) {
            throw new IllegalStateException("You must be init LanguageUtil first");
        }
        return sInstacne;
    }

    private LanguageUtil(Context context) {
        //防止内存泄漏
        this.mContext = context.getApplicationContext();
    }

    //设置语言配置
    public void setConfiguration() {
        //首先获取本地配置,因为6.0以上的设备需要特别处理,否则按下方的方法处理即可
        Locale targetLocale = getTragetLocale();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Locale.setDefault(targetLocale);
        } else {
            Resources resources = mContext.getResources();
            Configuration config =      resources.getConfiguration();
            DisplayMetrics dm = resources.getDisplayMetrics();
            config.locale = targetLocale;
            resources.updateConfiguration(config, dm);
        }

    }

    /**
     * 如果不是英文、简体中文、繁体中文,默认返回英文
     * 自己定义的是跟随系统、英文、简体中文、繁体中文四种格式
     * @return
     */
    private Locale getTragetLocale() {
        //从SharedPreferences中取出配置,看看是哪种语言
        int userType = SharedUtil.getInt(mContext, AppConstant.LANGUAGE);

        if (userType == LanguageType.FOLLOW_SYSTEM) {
            Locale sysType = getSysLocale();
            if (sysType.equals(Locale.ENGLISH)) {
                return Locale.ENGLISH;
            } else if (sysType.equals(Locale.SIMPLIFIED_CHINESE)) {
                return Locale.SIMPLIFIED_CHINESE;
            } else if (sysType.equals(Locale.TRADITIONAL_CHINESE)) {
                return Locale.TRADITIONAL_CHINESE;
            }
            return Locale.ENGLISH;
        } else if (userType == LanguageType.ENGLISH) {
            return Locale.ENGLISH;
        } else if (userType == LanguageType.SIMPLE_CHINISE) {
            return Locale.SIMPLIFIED_CHINESE;
        } else if (userType == LanguageType.TRADITIONAL_CHINESE) {
            return Locale.TRADITIONAL_CHINESE;
        }

        return Locale.ENGLISH;
    }

    //6.0以上获取方式需要特殊处理一下
    private Locale getSysLocale() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
            return mContext.getResources().getConfiguration().locale;
        } else {
            return mContext.getResources().getConfiguration().getLocales().get(0);
        }
    }

    //修改了语言之后,修改SharedPreferences里面的配置信息,通过rxbus进行通知页面进行重新加载。可以用eventbus或者广播,你喜欢就行。
    public void updateLanguage(int languageType) {
        if (languageType != SharedUtil.getInt(mContext, AppConstant.LANGUAGE)) {
            SharedUtil.putInt(mContext, AppConstant.LANGUAGE, languageType);
            RxBus.getDefault().post(new LanguageEvent());
        }
    }

    //这里是获取对应的配置信息代表的名字:分别是:跟随系统、英文、简体中文、繁体中文
    public String getLanguageName() {
        int languageType = SharedUtil.getInt(mContext, AppConstant.LANGUAGE);
        if (languageType == LanguageType.ENGLISH) {
            return mContext.getString(R.string.settings_language_english);
        } else if (languageType == LanguageType.SIMPLE_CHINISE) {
            return mContext.getString(R.string.settings_language_simple_chinise);
        } else if (languageType == LanguageType.TRADITIONAL_CHINESE) {
            return mContext.getString(R.string.settings_language_traditional_chinise);
        }

        return mContext.getString(R.string.settings_language_follow_system);
    }
}

下面是上述用到的语言信息lei,你有几种语言就配置几个。

/**
 * Created by panruijie on 2017/3/15.
 * Email : zquprj@gmail.com
 */

public class LanguageType {

    public static final int FOLLOW_SYSTEM = 0;
    public static final int ENGLISH = 1;
    public static final int SIMPLE_CHINISE = 2;
    public static final int TRADITIONAL_CHINESE = 3;
}

接下来,到这里,代码层面已经可以实现多语言了。那么,如何配置多种string类型,用于多语言的切换呢。

首先,我们来到项目的res/values下.右键new->values resource file,接着便会出现图2.
这里写图片描述
(图1)

到这里,我们在file name填上strings,由于原本已经有一个strings文件了。那么等下再构建的时候系统会自动帮我们构造一个strings的文件夹用于存放不同语种的strings.xml。在图2这里选择Local,接着点’》’即可。
这里写图片描述
(图2)

到这里,就是选择你所要的国家了,假如我要中国,而且不分地区,那么在specific region only那里选择any region即可。同理,其它语种一次类推。
这里写图片描述
(图3)

到这里,我们只需在我们自己的基类BaseActivity的oncretae里面添加一句LanguageUtil.getInstance().setConfiguration();即可实现语言的动态设置。

还有就是,在更换语言设置的时候,记得要reload一下界面。否则语言不会刷新。就是在接受到语言更改事件的时候进行更新。代码如下:

    public void reload() {
        Intent intent = getIntent();
        overridePendingTransition(0, 0);
        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        finish();
        overridePendingTransition(0, 0);
        startActivity(intent);
    }

如果还有疑问,可以留言。或者star、fork我的代码看一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android之多语言设置 的相关文章

  • 如何做Android - 滑动抽屉从左到右滑动..?

    如何将android滑动抽屉从LTR滑动 使用时android orientation horizontal 它从 RTL 滑出 我该如何进行 LTR 谢谢 我找到了答案表格 Here http blog sephiroth it 2011
  • 如何在android中实现触摸平滑图像橡皮擦?

    我已经从 API 演示中看到了finturePaint java 我想实现触摸平滑橡皮擦 通过在android中触摸移动来擦除部分图像 FingerPaint 告诉我要实现这个 mPaint setXfermode new PorterDu
  • AdapterContextMenuInfo 始终为 null

    我尝试通过 android 开发文档中的书来做到这一点 this didn t create a menu i don t know why registerForContextMenu getListView setListAdapter
  • 如何正确释放Android MediaPlayer

    我正在尝试向我的 Android 应用程序添加一个按钮 当点击该按钮时它会播放 MP3 我已经让它工作了 但没有办法释放 mediaPlayer 对象 因此即使在我离开活动后它仍然会继续播放 如果我在react 方法之外初始化MediaPl
  • 如何在我现有的 Android 应用程序中使用 Telegram API(包括聊天应用程序)?

    我想使用 telegram API 在我现有的 Android 应用程序中开发聊天功能 我不知道如何实施 我认为 看看Telegram 数据库库 测试版 从这里TDLib https core telegram org tdlib 俄语 但
  • Bitmap.getPixels() 中的 IllegalArgumentException

    我想将数据从位图复制到int using getPixels 这是我当前的代码 int pixels new int myBitmap getHeight myBitmap getWidth myBitmap getPixels pixel
  • 如何更改终端的默认目录?

    我想更改 Android Studio v2 2 2 终端的默认目录 当我打开终端时 它基于项目的目录 C 项目路径 我经常需要使用adb shell 所以我必须导航到 SDK 路径 平台工具 才能使用 adb 命令 是否可以更改终端的默认
  • Dialog.setTitle 不显示标题

    我正在尝试向我的对话框添加自定义标题 但是每当我运行我的应用程序时 它都不会显示标题 我创建对话框的代码是 final Dialog passwordDialog new Dialog this passwordDialog setCont
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • 使用片段时应用程序崩溃

    我正在处理碎片和 我的代码中有一个我找不到的问题 logcat 指向我的一个片段中的这段代码 Override public View onCreateView LayoutInflater inflater ViewGroup conta
  • 对于一个单元格,RecyclerView onBindViewHolder 调用次数过多

    我正在将 RecyclerView 与 GridLayoutManager 一起使用 对于网格中的每个项目 我需要调用 REST api 来检索数据 然后 从远程异步获取数据后 我使用 UIL 加载 显示图像 一切似乎都很好 但我发现 on
  • WorkManager 或 AlarmManager 用于日常请求然后通知工作?

    这是用例 用户设置具有特定时间的每日通知 在指定时间 发出网络请求以获取一些数据 然后使用检索到的数据显示通知 我不确定是否应该使用 AlarmManager 还是 WorkManager 来实现这个用例 据我了解 AlarmManager
  • Dagger 2 没有生成我的组件类

    我正在使用 Dagger 2 创建我的依赖注入 几个小时前它还在工作 但现在不再生成组件 这是我创建组件的地方 public class App extends Application CacheComponent mCacheCompon
  • Android 如何将总天数准确更改为年、月、日?

    我正在做一个应用程序 该应用程序与根据给定的生日日期输入获取一个人的年龄有关 为此 我从下面的代码中获取从该日期到当前日期的总天数 String strThatDay 1991 05 10 SimpleDateFormat formatte
  • Android 中的处理程序与异步调用

    目前我正在使用处理程序来调用 Web 服务方法以使其在后台运行 问题是它需要更多的时间来给出响应 在性能方面似乎更昂贵 现在我计划使用异步调用 哪一个是最好的 Android 中的处理程序和异步调用有什么区别 请帮我想出一个最好的解决方案
  • 卡片视图 单击卡片移至新活动

    我是 Android 编程新手 正在研究卡片布局 我想知道如何使其可点击 android clickable true android foreground android attr selectableItemBackground 我的卡
  • 如何检查 Android 中的同步设置

    我正在构建一个 Android 应用程序 我需要检查设备中注册的每个单独帐户的同步设置 我知道我可以通过 ContentResolver 类来做到这一点 但我遇到了一些问题 我已设法获取设备上所有帐户的列表 但我不知道在运行时从哪里获取特定
  • 通过系统应用程序以编程方式静默安装 apk(无需 root)

    我有带有 android sharedUserId android uid system UID 1000 的系统级应用程序 设备未root INSTALL PACKAGES 权限包含在清单中 我可以静默安装下载的 apk 吗 我已经发现这
  • Dagger 2 中“HasFragmentInjector”的实际用法是什么

    我之前已经实现了 dagger2 v2 2 但现在他们也添加了 dagger android 部分 所以我正在用它创建示例项目 我知道旧的方法论 Provide and Modules and 成分等注释 但从 Dagger 2 8 开始
  • 发布的 Android apk 出现错误“包文件未正确签名”

    我最近将我的应用程序上传到 Android 市场 但是由于错误 下载时它拒绝运行 包文件未正确签名 我首先使用 eclipse 发布了数据包 右键单击导出 创建密钥库然后发布 但它拒绝工作 然后我下载了 keytool 和 jarsigne

随机推荐