热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

为Android添加一门新语言的解决办法

本篇文章是对为Android添加一门新语言的解决方法进行了详细的分析介绍,需要的朋友参考下
虽然Android从2.3开始已经支持50种以上的语言,但是不是每种语言都有字体可以显示。遇到一个新需求,有客户要求对hindi语言的支持。于是上网找了一些资料,发现网上介绍的大部分是如何替换默认字体,就是替换./frameworks/base/data/fonts/DroidSansFallback.ttf,但是替换完之后,中文就无法正常显示。
其实只要有下面几个步骤,就可以实现新曾加一种语言的显示支持:
1. 需要有可以显示hindi语言的字体,我在网上下载了一个:DroidHindi.ttf
2. 需要修改的地方主要有
1) 将下载的字体文件拷贝到:./frameworks/base/data/fonts/
2) 修改./frameworks/base/data/fonts/Android.mk,将DroidHindi.ttf添加到copy_from:
代码如下:

    copy_from := \
        DroidSans.ttf \
        DroidSans-Bold.ttf \
        DroidSansArabic.ttf \
        DroidSansHebrew.ttf \
        DroidSansThai.ttf \
        DroidHindi.ttf \
        DroidSerif-Regular.ttf \
        DroidSerif-Bold.ttf \
        DroidSerif-Italic.ttf \
        DroidSerif-BoldItalic.ttf \
        DroidSansMono.ttf \
        Clockopia.ttf

3) Hindi的语言代码是hi_IN,修改./device/qcom/common/common.mk,将hindi的语言代码加进去,这样在你的设置->语言和键盘->选择语言里面就可以看见hindi语言了:
代码如下:

PRODUCT_LOCALES := en_US en_GB es_ES es_US fr_FR zh_CN zh_TW hi_IN it_IT pt_PT ru_RU

4) 修改./external/skia/src/ports/SkFontHost_android.cpp,将DroidHindi.ttf加进去。网上介绍的很多方法都没有提到这一步,如果没有这一步的话,添加的语言是不生效的,显示的是乱码,因为android无法找到hindi语言可以显示的字体,还是会选择默认字体去显示。修改的地方为:
代码如下:

/*  Fonts must be grouped by family, with the first font in a family having the
    list of names (even if that list is empty), and the following members having
    null for the list. The names list must be NULL-terminated
*/
static const FontInitRec gSystemFonts[] = {
    { "DroidSans.ttf",              gSansNames  },
    { "DroidSans-Bold.ttf",         NULL        },
    { "DroidSerif-Regular.ttf",     gSerifNames },
    { "DroidSerif-Bold.ttf",        NULL        },
    { "DroidSerif-Italic.ttf",      NULL        },
    { "DroidSerif-BoldItalic.ttf",  NULL        },
    { "DroidSansMono.ttf",          gMonoNames  },
    /*  These are optional, and can be ignored if not found in the file system.
        These are appended to gFallbackFonts[] as they are seen, so we list
        them in the order we want them to be accessed by NextLogicalFont().
     */
    { "DroidSansArabic.ttf",        gFBNames    },
    { "DroidSansHebrew.ttf",        gFBNames    },
    { "DroidSansThai.ttf",          gFBNames    },
    { "DroidHindi.ttf",             gFBNames    }, // 新添加的语言
    { "MTLmr3m.ttf",                gFBNames    }, // Motoya Japanese Font
    { "MTLc3m.ttf",                 gFBNames    }, // Motoya Japanese Font
    { "DroidSansJapanese.ttf",      gFBNames    },
    { "DroidSansFallback.ttf",      gFBNames    }
};

5) 去./build/target/product/full.mk看看系统选择的是哪个语言列表,我的是:
    $(call inherit-product, build/target/product/languages_small.mk)
  那我就去修改./build/target/product/languages_small.mk,若这里显示的是languages_full.mk,那么就修改./build/target/product/languages_full.mk文件,修改如下:
  PRODUCT_LOCALES := en_US en_GB fr_FR hi_IN it_IT de_DE es_ES

3. 剩下的就是重新编译一下,然后flash到手机或模拟器上就可以了。
设置页面:

 

打开一个Hindi的网页,hindi语言可以正常显示了:

 


推荐阅读
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • 本文旨在为开发者提供详细的指导,如何在Android应用中顺利集成支付宝支付功能及豆瓣API,以满足业务需求。通过本文的步骤,读者可以了解从准备环境到成功调用API的整个流程,避免常见的错误和陷阱。 ... [详细]
  • 本文概述了在GNU/Linux系统中,动态库在链接和运行阶段的搜索路径及其指定方法,包括通过编译时参数、环境变量及系统配置文件等方式来控制动态库的查找路径。 ... [详细]
  • 本文详细介绍了如何使用Rufus工具制作一个兼容UEFI启动模式的Windows Server 2008 R2安装U盘,包括必要的软件和步骤。 ... [详细]
  • 本文介绍如何使用 Python 计算两个时间戳之间的时间差,并将其转换为毫秒。示例代码展示了如何通过 `time` 和 `datetime` 模块实现这一功能。 ... [详细]
  • 本文介绍了如何通过 ADB 命令行工具启动和停止 Android 应用。通过简单的命令,您可以轻松地控制设备上的应用运行状态。 ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • 使用REM和媒体查询实现响应式布局
    本文介绍如何利用REM单位和媒体查询(Media Queries)来创建适应不同屏幕尺寸的网页布局。通过具体示例,展示在不同屏幕宽度下如何调整页面元素的样式。 ... [详细]
  • SPFA算法详解与应用
    当图中包含负权边时,传统的最短路径算法如Dijkstra不再适用,而Bellman-Ford算法虽然能解决问题,但其时间复杂度过高。SPFA算法作为一种改进的Bellman-Ford算法,能够在多数情况下提供更高效的解决方案。本文将详细介绍SPFA算法的原理、实现步骤及其应用场景。 ... [详细]
  • 本文详细对比了HashMap和HashTable在多线程环境下的安全性、对null值的支持、性能表现以及方法同步等方面的特点,帮助开发者根据具体需求选择合适的数据结构。 ... [详细]
  • 本文介绍了一种在 Android 开发中动态修改 strings.xml 文件中字符串值的有效方法。通过使用占位符,开发者可以在运行时根据需要填充具体的值,从而提高应用的灵活性和可维护性。 ... [详细]
  • 神策数据分析基础
    本文介绍了基于用户行为的数据分析方法,包括业务问题的提出与定义、具体行为的识别及统计分析流程。同时,详细阐述了如何利用事件模型(Event Model)来描述用户行为,以及在实际应用中的案例分析。 ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • Docker基础入门与环境配置指南
    本文介绍了Docker——一款用Go语言编写的开源应用程序容器引擎。通过Docker,用户能够将应用及其依赖打包进容器内,实现高效、轻量级的虚拟化。容器之间采用沙箱机制,确保彼此隔离且资源消耗低。 ... [详细]
  • 本文列举了构建和运行 Struts2 应用程序所需的核心 JAR 文件,包括文件上传、日志记录、模板引擎等关键组件。 ... [详细]
author-avatar
请叫我姚灬小贱_______
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有