Android 默认的多语言支持

在 Android 工程的 res 目录下,通过定义对应的语言文件夹名称就可以实现多语言支持

// 手动切换语言

Resources resources = getResources();

Configuration config = resources.getConfiguration();

DisplayMetrics dm = resources.getDisplayMetrics();

config.locale = Locale.ENGLISH;

resources.updateConfiguration(config, dm);

支持应用内的语言自动切换(可以不依赖系统语言手动切换应用的语言包)

1.extends Resources

// Application 重写 getResources 方法

@Override

public Resources getResources() {

return MyResources.getInstance(super.getResources());

}

// 重写 getString, getStringArray, getValue, getText 等方法

public class MyResources extends Resources {

@Override

public String getString(int id) {

// 从对应语言的 sparseArray 中取出文案

String value = MyLang.getString(id);

if(value == null) {

value = super.getString(id);

}

return value;

}

}

2.使用 json 管理语言文案,通过脚本将 json 转换为 java 文件, 其中java 文件用 sparseArray 保存文案信息。

// 转换代码

/*

* 优化 SparseArray 的使用性能:

* 1.让 SparseArray 长度固定。

* 2.SparseArray 是基于二分查找,让其保持顺序可以优化查找性能。

*/

var fs = require("fs");

var translate = function (json, javaName) {

var start = '/* AUTO-GENERATED FILE. DO NOT MODIFY.*/\n\

package com.xxx.lang;\n\n\

import android.util.SparseArray;\n\

import com.xxx.R;\

\n\

\n\

class ' + javaName + ' {\n\

public static SparseArray getStringMap() {\n';

var keys = Object.keys(json);

var sortedKeys = keys.sort(function (a, b) {

return a.localeCompare(b);

});

var value = "";

var len = 0;

var mapString = "";

var mapArrayString = "";

var mapObjectString = "";

sortedKeys.forEach(function (key) {

len++;

value = json[key];

var type = objType(value);

if (type == "string") {

mapString += ' map.put(R.string.' + key + ', "' + stringify(value) + '");\r\n';

} else if (type == "array") {

mapArrayString += ' map.put(R.array.' + key + ', new String[]{' + arrayToString(value) + '});\r\n';

} else if (type == "object") {

mapObjectString += ' map.put(R.plurals.' + key + ', new String[]{' + objToString(value) + '});\r\n';

} else {

len--;

}

});

var end = ' return map;\n\

}\n\

}';

return start + " SparseArray map = new SparseArray<>(" + len + ");\n" + mapString + mapArrayString + mapObjectString + end;

};

var stringify = function (ori) {

return ori.replace(/\\/g, '\\\\')

.replace(/"/g, '\\"')

.replace(/\\"/g, '\\"')

.replace(/\n/g, '\\n')

.replace(/\t/g, '\\t')

;

};

var arrayToString = function (arr) {

var ret = "";

var len = arr.length;

for (var i = 0; i < len; i++) {

ret += '"' + stringify(arr[i]) + '"';

if (i != len - 1) {

ret += ', ';

}

}

return ret;

};

var objToString = function (obj) {

var arr = [];

for (var key in obj) {

if (obj.hasOwnProperty(key)) {

arr[key | 0] = obj[key];

}

}

return arrayToString(arr);

};

var objType = function (obj) {

return obj == null/*||isNaN(obj)*/ ?

String(obj) :

(Object.prototype.toString.call(obj).match(/^\[object\s(.*)\]$/)[1] || "").toLowerCase();

};

var trans = function (path, javaName) {

var source = "", ret = "";

try {

source = require(path);

ret = translate(source, javaName);

} catch (e) {

console.error(e);

return;

}

return ret;

};

module.exports = trans;

3.让 gradle 支持 nodejs

// 创建一个 gradle 文件

buildscript {

repositories {

jcenter()

}

dependencies {

classpath "com.moowork.gradle:gradle-node-plugin:0.14"

}

}

apply plugin: "com.moowork.node"

task genLang(type: NodeTask) {

script = file("scripts/gen.js")

execOverrides {

it.ignoreExitValue = true

it.workingDir = "scripts/"

}

}

node {

version = "7.2.0"

distBaseUrl = "https://nodejs.org/dist"

// distBaseUrl = "http://npm.taobao.org/mirrors/node"

// If true, it will download node using above parameters.

// If false, it will try to use globally installed node.

download = true

workDir = file("${project.buildDir}/nodejs")

npmWorkDir = file("${project.buildDir}/npm")

nodeModulesDir = file("${project.projectDir}")

}

nodejs html多语言切换,利用 nodejs 自动生成 Android 语言包实现应用内切换多语言的方案...相关推荐

  1. 利用Flex自动生成C语言词法分析器

    利用Flex自动生成C语言词法分析器 Flex介绍 C语言词法规则 具体实现 源代码 测试代码 实验结果 Flex介绍   1975年Mike Lesk和实习生Eric Schmidt设计并实现了一个 ...

  2. 利用ApacheCXF自动生成webservice的客户端代码

    利用ApacheCXF自动生成webservice的客户端代码 一.环境准备 1.JDK环境 2.下载apache-cxf发布包,举例版本为3.2.14,解压发布包,设置CXF_HOME,并添加%CX ...

  3. php开发工程师名片,PHP编程:利用PHP自动生成印有用户信息的名片

    <PHP编程:利用PHP自动生成印有用户信息的名片>要点: 本文介绍了PHP编程:利用PHP自动生成印有用户信息的名片,希望对您有用.如果有疑问,可以联系我们. 前言 PHP教程无论是自己 ...

  4. 【机器学习PAI实战】—— 玩转人工智能之利用GAN自动生成二次元头像

    前言 深度学习作为人工智能的重要手段,迎来了爆发,在NLP.CV.物联网.无人机等多个领域都发挥了非常重要的作用.最近几年,各种深度学习算法层出不穷, Generative Adverarial Ne ...

  5. 【机器学习PAI实战】—— 玩转人工智能之利用GAN自动生成二次元头像...

    模型训练与在线预测服务.推荐算法四部曲.机器学习PAI实战.更多精彩,尽在 开发者分会场 [机器学习PAI实战]-- 玩转人工智能之综述 [机器学习PAI实战]-- 玩转人工智能之商品价格预测 [机器 ...

  6. java编程猜数字大小 (要求利用随机数自动生成一个0--100内的随机数字)

    java编程猜数字(要求利用随机数自动生成一个0–100内的随机数字) public static void main(String[] args) {int num=(int)(Math.rando ...

  7. 自动生成Android界面,面向Android的Web Service界面自动生成技术研究

    摘要: 据统计,开发人员在开发应用程序的过程中,接近一半的代码用于用户界面部分,大约一半的运行时间用于执行这一部分.所以,减少用户界面部分的开发代码和运行时间,能有效提高程序的运行效率.智能家居中,由 ...

  8. android 默认dimens_Android开发——自动生成Android屏幕适配的dimens.xml文件

    使用dimens.xml解决屏幕适配问题是Android官方解决方案,本文主要讲述了如何自动生成Android屏幕适配的dimens.xml,减少了工作量,在维护dimens.xml文件时更加省时省力 ...

  9. idea做一个日志自动生成的jar包,并用flume做生产者,采集日志数据,用kafka做消费者来消费日志数据

    前提:先将四台机器的zookeeper和kafka服务开启. 小任务:先准备好日志自动生成的jar包.并将其放入虚拟机master01中. 1.新建一个maven项目,命名为logmaker. pom ...

  10. python乘法符号手写_利用Python自动生成小学生加减乘除口算考试题卷,不再为手写算术题烦恼!...

    还在为给孩子抄各种各样的口算题而烦恼?孩子上小学一年级之后,加减乘除的口算就要开始练习了,老师肯定会让家长出题.所以我们当家长的,要提前准备一下,就利用Python开发了一套自动生成小学生口算题的小应 ...

最新文章

  1. HTTP Referer 防外链
  2. firefox和chrome中 JQuery的ajax组件执行差异
  3. 牛客多校2 - Just Shuffle(置换群的幂)
  4. LeetCode Number Complement
  5. php 设置统一处理错误,统一的PHP错误处理理论
  6. 小样本点云深度学习库_合成鲁棒的对抗样本来欺骗深度学习分类器
  7. sicily 1156 ——虽然Wrong error(原因尚未查明),但温习了一下基础知识
  8. MySQL在Docker环境下运行基础
  9. Java和JavaScript中使用Json方法大全
  10. Python零基础爬虫速成②:批量爬取微信公众号图片(基于beautifulsoup爬取吉他谱)
  11. windows远程控制服务器
  12. 跳楼机[DP+spfa]
  13. Android各厂商自启动管理界面
  14. 服务器受美国保护网站,该网站服务器受美国保护
  15. 修复黯淡的夜拍照片!
  16. 说一说刚拿下BIRTV推荐的中国8K摄像机新品
  17. OPPO A59m刷机包|OPPO A59m官方线刷包救砖
  18. 2020计算机二级题库第14word,2020年新版全国计算机等级考试二级MSoffice选择题题库.docx...
  19. mysql越权漏洞_Fortify漏洞之Access Control: Database(数据越权)(示例代码)
  20. 京东智能供应链平台应急场景实践

热门文章

  1. VBA自动获取二级文件夹目录
  2. VLC Web插件踩坑记录
  3. 苹果8plus优点和不足_2020年双十一有哪些苹果手机值得购买?
  4. pycharm使用anaconda
  5. 单片机控制电机正反转
  6. CAD日照分析教程:CAD软件中地理位置命令怎么用?
  7. 浙江大学计算机学院最权威的老师,浙江大学计算机科学与技术专业导师介绍:郑能干...
  8. html打印A4长宽设置
  9. PPT转成html视频无法播放,绝对实用 将PPT文档转换成Flash/HTML
  10. 安装包制作软件 Inno Setup 5.5.4 汉化版(简体中文定制版)