Android 实现资源国际化(多语言)

news2024/12/24 10:09:40

目录

一、介绍

二、字符串资源

三、图片资源

四、日期和时间格式

五、其他

六、应用内切换语言

七、资源文件命名规则


一、介绍

        Android国际化(多语言)是一种开发技术,旨在使Android应用程序能够在「不同语言和文化环境」下运行,并为用户提供本地化的体验。这是为了确保应用程序在全球范围内都能够被理解和使用,而不仅仅局限于特定地区或语言的用户。通过遵循一下命名规则,Android系统能够在用户更改语言和地区设置时「自动选择正确的资源文件」,以提供本地化的用户体验。

二、字符串资源

        将应用中的文本内容(如标签、按钮文本、提示信息等)提取为字符串资源,并将这些字符串放入XML文件中,而不是直接硬编码到代码中。这样,可以为不同的语言和地区创建不同的字符串资源文件,以便本地化。

三、图片资源

        提供不同语言/分辨率设置图片资源,以适应不同设备和地区的要求。例如图片上包含艺术字,这样的话就需要根据不同地区和语言来分别加在。

四、日期和时间格式

        在应用程序中使用本地化的日期和时间格式,以便根据用户的区域设置显示正确的日期和时间。

    //传入不同格式,根据当前语言显示对应格式
    private static SimpleDateFormat getFormat(String enFormat,String zhFormat){
        SimpleDateFormat dateFormat;
        if (LangSPUtils.isEn(MyApplication.getContext())) {
            dateFormat = new SimpleDateFormat(enFormat, Locale.ENGLISH);
        }else {
            dateFormat = new SimpleDateFormat(zhFormat,Locale.SIMPLIFIED_CHINESE);
        }
        return dateFormat;
    }
    
    public static final String EN_YYYY_MMM_DD = "yyyy.MMM.dd";
    public static final String ZH_YYYY_MM_DD = "yyyy年MM月dd日";
    
    public static String getNowDateString(Date date) {
        return getFormat(EN_YYYY_MMM_DD,ZH_YYYY_MM_DD).format(date);
    }

五、其他

如果在细致一些可以在以下方面着手

  • 5.1 「支持多屏幕尺寸和分辨率」:确保应用程序的布局和资源适应不同的屏幕尺寸和分辨率,以便在各种设备上正确显示。

  • 5.2 「支持多方向」:为应用程序的布局和资源提供横向和纵向两种方向的支持,以适应设备的旋转。

  • 5.3 「货币和数字格式」:根据用户的区域设置来显示货币符号、千位分隔符和小数点等数字格式。

  • 5.4 「文字顺序」:有些地区文字是从右至左显示,而非从左往后。

  • 5.5 「版本」:res中的资源不只可以根据方向/语言来设置,也可以根据系统版本来进行设置。

六、应用内切换语言

        Application中读取用户语言设置,如果没读取到用户设置语言,则使用系统默认语言。

    public static void setLanguage(Context context, String lang) {
        Locale sta = context.getResources().getConfiguration().locale;
        Resources resources = context.getResources();// 获得res资源对象
        Configuration config = resources.getConfiguration();// 获得设置对象
        DisplayMetrics dm = resources.getDisplayMetrics();// 获得屏幕参数:主要是分辨率,像素等。
        // 获取设置语言
        if (!MStringUtils.isNullOrEmpty(lang)) {
            if (LangSPUtils.zh_CN.equals(lang)) {
                config.locale = Locale.SIMPLIFIED_CHINESE;
                LangSPUtils.putString(LangSPUtils.KEY_LANG, LangSPUtils.zh_CN, context);
            } else if (LangSPUtils.zh_TW.equals(lang)) {
                config.locale = Locale.TRADITIONAL_CHINESE;
                LangSPUtils.putString(LangSPUtils.KEY_LANG, LangSPUtils.zh_TW, context);
            } else {
                config.locale = Locale.US; // 英文
                LangSPUtils.putString(LangSPUtils.KEY_LANG, LangSPUtils.en_US, context);
            }
        } else {
            // 第一次语言设置,取系统语言
            String languages = sta.getLanguage();
            String country = sta.getCountry();
            if (languages=="zh"){
                if (country.equals("CN")){
                    config.locale = Locale.SIMPLIFIED_CHINESE;
                    LangSPUtils.putString(LangSPUtils.KEY_LANG, LangSPUtils.zh_CN, context);
                }else{
                    //再细致一些可以分香港/澳门/台湾繁体
                    config.locale = Locale.TRADITIONAL_CHINESE;
                    LangSPUtils.putString(LangSPUtils.KEY_LANG, LangSPUtils.zh_TW, context);
                }
            }else {
                config.locale = Locale.US; // 英文
                LangSPUtils.putString(LangSPUtils.KEY_LANG, LangSPUtils.en_US, context);
            }
        }
    }

        Activity.attachBaseContext()中设置使用的语言资源。

public class LaunchActivity extends Activity {
    protected void attachBaseContext(Context newBase) {
        String lang = LangSPUtils.getString(LangSPUtils.KEY_LANG,this);
        if (!MStringUtils.isNullOrEmpty(lang)){
            Configuration configuration = newBase.getResources().getConfiguration();
            if (LangSPUtils.zh_CN.equals(lang)) {
                configuration.setLocale(Locale.SIMPLIFIED_CHINESE);
            } else if (LangSPUtils.zh_TW.equals(lang)) {
                configuration.setLocale(Locale.TRADITIONAL_CHINESE);
            } else {
                configuration.setLocale(Locale.US);
            }
            Context createContext = newBase.createConfigurationContext(configuration);
            super.attachBaseContext(createContext);
        }else {
            super.attachBaseContext(newBase);
        }
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

}

注:如果设置的时候不重启Activity是不生效的。 如果设置完语言不重启应用(进程),Application的上下文获取的语言还是启动时的语言。

七、资源文件命名规则

  • values目录中的默认资源文件:values/strings.xml。这是应用的默认资源文件,用于包含默认语言的字符串资源。

  • 针对不同语言和地区的资源文件:「values-<语言代码>-r<地区代码>/strings.xml」,其中 <语言代码> 是语言的ISO 639-1代码,而 <地区代码> 是地区的ISO 3166-1 alpha-2代码。例如,values-es-rES/strings.xml表示西班牙语(Spanish,ISO 639-1代码为"es")的资源文件,地区为西班牙(ISO 3166-1 alpha-2代码为"ES")。

  • 针对不同语言的资源文件:「values-<语言代码>/strings.xml」。只要是英语,一律使用该资源文件下的资源。

  • 中文(中国):values-zh-rCN

  • 中文(中国台湾):values-zh-rTW

  • 中文(中国香港):values-zh-rHK

  • 英语(美国):values-en-rUS

  • 英语(英国):values-en-rGB

  • 英文(澳大利亚):values-en-rAU

  • 英文(加拿大):values-en-rCA

  • 英文(爱尔兰):values-en-rIE

  • 英文(印度):values-en-rIN

  • 英文(新西兰):values-en-rNZ

  • 英文(新加坡):values-en-rSG

  • 英文(南非):values-en-rZA

  • 俄文:values-ru-rRU

  • 日文:values-ja-rJP

  • 韩文:values-ko-rKR

  • 阿拉伯文(埃及):values-ar-rEG

  • 阿拉伯文(以色列):values-ar-rIL

  • 保加利亚文: values-bg-rBG

  • 加泰罗尼亚文:values-ca-rES

  • 捷克文:values-cs-rCZ

  • 丹麦文:values-da-rDK

  • 德文(奥地利):values-de-rAT

  • 德文(瑞士):values-de-rCH

  • 德文(德国):values-de-rDE

  • 德文(列支敦士登):values-de-rLI

  • 希腊文:values-el-rGR

  • 西班牙文(西班牙):values-es-rES

  • 西班牙文(美国):values-es-rUS

  • 芬兰文(芬兰):values-fi-rFI

  • 法文(比利时):values-fr-rBE

  • 法文(加拿大):values-fr-rCA

  • 法文(瑞士):values-fr-rCH

  • 法文(法国):values-fr-rFR

  • 希伯来文:values-iw-rIL

  • 印地文:values-hi-rIN

  • 克罗里亚文:values-hr-rHR

  • 匈牙利文:values-hu-rHU

  • 印度尼西亚文:values-in-rID

  • 意大利文(瑞士):values-it-rCH

  • 意大利文(意大利):values-it-rIT

  • 立陶宛文:valueslt-rLT

  • 拉脱维亚文:values-lv-rLV

  • 挪威博克马尔文:values-nb-rNO

  • 荷兰文(比利时):values-nl-BE

  • 荷兰文(荷兰):values-nl-rNL

  • 波兰文:values-pl-rPL

  • 葡萄牙文(巴西):values-pt-rBR

  • 葡萄牙文(葡萄牙):values-pt-rPT

  • 罗马尼亚文:values-ro-rRO

  • 斯洛伐克文:values-sk-rSK

  • 斯洛文尼亚文:values-sl-rSI

  • 塞尔维亚文:values-sr-rRS

  • 瑞典文:values-sv-rSE

  • 泰文:values-th-rTH

  • 塔加洛语:values-tl-rPH

  • 土耳其文:values--r-rTR

  • 乌克兰文:values-uk-rUA

  • 越南文:values-vi-rVN

  • 缅甸语 : values-my

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1126156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3中使用vue3-pdf-app和使用浏览器内置的PDF插件浏览器PDF文件

文章目录 先准备一个PDF使用浏览器内置的PDF插件预览PDF在HTML中使用浏览器插件预览PDFVscode使用插件发布服务后直接通过URL地址访问PDF可使用的浏览器 在vue3项目中预览PDF文件vue3项目也是可以通过URL地址访问文件的vue3中使用浏览器内置的PDF插件预览PDF代码如下所示&#…

单窗口单IP适合炉石传说游戏么?

游戏道具制作在炉石传说中是一个很有挑战的任务&#xff0c;但与此同时&#xff0c;它也是一个充满机遇的领域。在这篇文章中&#xff0c;我们将向您展示如何在炉石传说游戏中使用动态包机、多窗口IP工具和动态IP进行游戏道具制作。 作者与主题的关系&#xff1a;作为一名热爱炉…

【分布式】大模型分布式训练入门与实践 - 04

大模型分布式训练 数据并行-Distributed Data Parallel1.1 背景1.2 PyTorch DDP1&#xff09; DDP训练流程2&#xff09;DistributedSampler3&#xff09;DataLoader: Parallelizing data loading4&#xff09;Data-parallel&#xff08;DP&#xff09;5&#xff09;DDP原理解析…

nodejs+vue 视频网站的设计与实现

该设计划分为七大模块&#xff0c;包括用户的系统管理、其他管理和视频管理三部分&#xff0c; 和管理管理员的视频、其他管理、系统管理和用户管理四部分。目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关…

【虚幻引擎UE】UE4/UE5 基于2D屏幕坐标获取场景3D坐标 射线检测(蓝图/C++)

UE4/UE5 基于2D屏幕坐标获取场景3D坐标 一、射线检测1&#xff09;定义1&#xff09;射线与3D场景中的物体交互的流程2&#xff09;射线检测蓝图函数3&#xff09;蓝图实现根据鼠标点击位置获取场景中的坐标值4&#xff09;根据相机中心点获取场景中的坐标值5&#xff09;射线检…

迅为RK3588开发板Android12双摄同时显示

要支持双摄同时显示需对源码做如下修改&#xff0c;修改文件 hardware/rockchip/camera/Camera3HALModule.cpp 注释掉下面函数中的部分代码即可。 测试 双摄同时显示需要双摄 app&#xff0c;在网盘资料下载测试 APK&#xff0c;然后使用 adb 安装测试 APK&#xff0c; 启动…

hive窗口函数记录

记录工作中和学习中的窗口函数&#xff0c;方便以后使用&#xff0c;本记持续更新和完善&#xff0c;版本&#xff1a;231019 文章目录 1.什么是窗口函数2.窗口函数的表达式3.窗口函数的类型1&#xff09; 排名函数2&#xff09; 聚合函数3&#xff09; 跨行取值函数 4.[frame…

中英文双语言海外微盘交易源码 微盘交易源码 虚拟币微盘交易系统源码 支持产品数据

Rockefeller微交易源码/双语言海外微盘完整源码/带单控 测试环境&#xff1a;宝塔、Linux、PHP7.3、MySQL5.6 根目录 public&#xff0c;伪静态 larvael5&#xff0c;默认文档&#xff1a;index.html修改为第一个&#xff0c;不然会报404 k线对接的是蜜蜂查&#xff1a;http…

平衡二叉树(AVL)【java实现+图解】

目录 一、平衡二叉树(AVL) 二、平衡二叉树的四种旋转 1.右旋转 2.左旋转 3. 左右旋转 4. 右左旋转 三、基于二叉搜索树之平衡二叉树的代码实现 1.具体方法思路 2.java代码实现 一、平衡二叉树(AVL) 一种自平衡二叉搜索树&#xff0c;它是在每个节点上增加一个平衡因子…

Day 1 Vue 页面框架

现在前端框架越来越像后端了&#xff0c;特别是TypeScript这样的语言出现后&#xff0c;开发前端的体验跟后端渐渐接近了。当然&#xff0c;作为一个后端&#xff0c;直接上手前端&#xff0c;还是有很多坑要填的。 本次开发&#xff0c;前端页面框架直接选择Vue。原因很简单&…

HTML中文本框\单选框\按钮\多选框

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <h1>登录注册</h1> <form action"第一个网页.html" method"post&quo…

字节码进阶之java反射的底层实现原理

文章目录 1. 前言1. 类加载机制2. 字节码操作 2. 反射方法源码分析反射的inflation机制 3. 为什么反射性能差4. 反射的限制与安全性考虑1. **性能开销**2. **安全限制**3. **破坏抽象**4. **版本兼容性问题** 参考文档 java 反射的底层实现原理 1. 前言 Java反射的底层实现原理…

Windows下Eclipse C/C++开发环境配置教程

1.下载安装Eclipse 官网下载eclipse-installer&#xff08;eclipse下载器&#xff09;&#xff0c;或者官方下载对应版本zip。 本文示例&#xff1a; Eclipse IDE for C/C Developers Eclipse Packages | The Eclipse Foundation - home to a global community, the Eclipse ID…

模式识别——高斯分类器

模式识别——高斯分类器 需知定义特殊情况&#xff08;方差一致&#xff09;Sigmoid 需知 所有问题定义在分类问题下&#xff0c;基于贝叶斯决策 定义 条件概率为多元高斯分布&#xff0c;此时观测为向量 X X 1 , X 2 , . . . , X n X{X_1,X_2,...,X_n} XX1​,X2​,...,Xn​…

IP地址在网络安全中的关键作用

IP地址&#xff08;Internet Protocol Address&#xff09;是互联网世界中的重要标识符&#xff0c;它在网络安全领域发挥着至关重要的作用。这些地址不仅帮助设备在网络上找到彼此&#xff0c;还在多个方面有助于维护网络的完整性、机密性和可用性。本文将探讨IP地址在网络安全…

nodejs使用es-batis

使用方法 创建连接 因为它只支持非连接池所以每次都要创建连接 let dao new MySqlDaoContext({charset: "utf8",host: "localhost",user: "root",password: "root",database: "test",});await dao.initialize();dao in…

H3C AC通过Web平台进行AC软件的升级?

软件升级的流程 1、获取软件版本 登录新华三官网&#xff08;首页>产品支持与服务>文档与软件>软件下载&#xff09;&#xff0c;将指定的软件版本下载至本地。 无线路由器-无线接入点-无线控制器-新华三集团-H3C 官网软件下载公共账号密码&#xff1a;账号&#x…

Selenium中WebDriver最新Chrome驱动安装教程

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

网络规划设计

文章目录 一、网络架构设计1.1 单核心双核心1.1.1 单核心1.1.2 双核心端口聚合 链路聚合网关冗余VRRP堆叠技术生成树STPPOE以太网供电服务器冗余&负载均衡服务器双机热备 1.2 环网架构设计1.3 层次化架构设计1.3.2 三层网络架构设计1.3.3 园区大二层网络架构1.3.4 数据中心…

【前段基础入门之】=>CSS3新增渐变颜色属性

导语&#xff1a; CSS3 新增了&#xff0c;渐变色 的解决方案&#xff0c;这使得我们可以绘制出更加生动的炫酷的的配色效果 线性渐变 多个颜色之间的渐变&#xff0c; 默认从上到下渐变 background-image: linear-gradient(red,yellow,green); /*默认从上到下渐变*/默认从上…