Libgdx的使用(17)——多语言和国际化
来源:互联网 发布:鲁班软件 上市 编辑:程序博客网 时间:2024/06/06 16:36
Android自身提供了多语言解决方案,但是使用Libgdx开发游戏的时候应该尽量避免使用平台特殊的代码。
如果使用Android提供的方案那么在桌面的调试就有困难,使用Libgdx自身提供的是最方便的。
Libgdx目前已经Locale来解决这个问题。
简介
从技术上将多语言国际化是指在开发设计上能够实现增加对语言的支持而不需要大规模修改代码。国际化主要解决游戏和应用在不同语言区域的适应性问题。
Libgdx提供了一套解决方案,以I18NBundle类为中心。
宏观来看它的操作和Android原生解决方案类似,也是后缀语言代码来处理的。
结构
语言文件时一个个独立的配置文件,其名称是由基本名称加上语言代码组成。比如游戏superjump它的语言文件如下:
superjump
superjump_de
superjump_en_GB
superjump_fr_CA_VAR1
一定确保拥有一个默认配置,即superjump.properties,而其他的语言文件根据自身的需要增加吧。
语言文件的格式很随意,使用键值方式组合,比如:
而中文化的语言文件可以写做:
创建国际化模块
粗略的看,I18NBundle的使用很简单
从细节来看这里有几个需要注意的问题
不指定语言代码就会使用默认代码
加载策略是从小至大的,比如制定的new Locale("fr", "CA", "VAR1");就会依次查找
1.superjump_fr_CA_VAR1
2.superjump_fr_CA
3.superjump_fr
4.superjump_en_US
5.superjump_en
6.superjump
获得对应语言值
要获得国际化以后的语言值,只需要
如果需要替换值的话需要使用format方法
在其中也可以使用比较简单的判断,比如
跨平台的局限性
Libgdx是跨平台的,但是目前国际化方案在GWT上还有缺陷。特别是在替换上MessageFormat的支持不完整,仅能通过序号来替换,其他情况会抛出IllegalArgumentException错误。
在程序一开始启用I18NBundle.setSimpleFormat(true)来保证GWT上的正常工作。
如果使用Android提供的方案那么在桌面的调试就有困难,使用Libgdx自身提供的是最方便的。
Libgdx目前已经Locale来解决这个问题。
简介
从技术上将多语言国际化是指在开发设计上能够实现增加对语言的支持而不需要大规模修改代码。国际化主要解决游戏和应用在不同语言区域的适应性问题。
Libgdx提供了一套解决方案,以I18NBundle类为中心。
宏观来看它的操作和Android原生解决方案类似,也是后缀语言代码来处理的。
结构
语言文件时一个个独立的配置文件,其名称是由基本名称加上语言代码组成。比如游戏superjump它的语言文件如下:
superjump
superjump_de
superjump_en_GB
superjump_fr_CA_VAR1
一定确保拥有一个默认配置,即superjump.properties,而其他的语言文件根据自身的需要增加吧。
语言文件的格式很随意,使用键值方式组合,比如:
gameName=SuperJumpnewMission={0}, you have a new mission. Reach level {1}.highScoreTime=High score achieved on {0,date} at {0,time}语言文件本身支持按序号赋值和按名称赋值。
而中文化的语言文件可以写做:
gameName=超级跳跳人newMission={0},,你有一个新任务,完成管卡 {1}。highScoreTime=最高分为{0,time},获得时间 {0,date} 。替换规则使用的是java.text.MessageFormat,更多的格式可以参考它的API。
创建国际化模块
粗略的看,I18NBundle的使用很简单
FileHandle baseFileHandle = Gdx.files.internal("i18n/superjump");Locale locale = new Locale("fr", "CA", "VAR1");I18NBundle bundle = I18NBundle.createBundle(baseFileHandle, locale);
从细节来看这里有几个需要注意的问题
不指定语言代码就会使用默认代码
默认的文件编码是utf-8,如果有需要可以修改它们。
private static final String DEFAULT_ENCODING = "UTF-8";public static I18NBundle createBundle (FileHandle baseFileHandle, Locale locale, String encoding) { return createBundleImpl(baseFileHandle, locale, encoding); }
加载策略是从小至大的,比如制定的new Locale("fr", "CA", "VAR1");就会依次查找
1.superjump_fr_CA_VAR1
2.superjump_fr_CA
3.superjump_fr
4.superjump_en_US
5.superjump_en
6.superjump
相关的实现代码为
private static List<Locale> getCandidateLocales (Locale locale) { String language = locale.getLanguage(); String country = locale.getCountry(); String variant = locale.getVariant(); List<Locale> locales = new ArrayList<Locale>(4); if (variant.length() > 0) { locales.add(locale); } if (country.length() > 0) { locales.add((locales.size() == 0) ? locale : new Locale(language, country)); } if (language.length() > 0) { locales.add((locales.size() == 0) ? locale : new Locale(language)); } locales.add(Locale.ROOT); return locales; }
获得对应语言值
要获得国际化以后的语言值,只需要
String value = bundle.get(key);
如果需要替换值的话需要使用format方法
String mission = myBundle.format("newMission", player.getName(), nextLevel.getName());
在其中也可以使用比较简单的判断,比如
collectedCoins=You collected {0,choice,0#no coins|1#one coin|1<{0,number,integer} coins|100<hundreds of coins} along the path.这样,传入值为0的时候就会使用no coins,而大于100显示hundreds of coins。
跨平台的局限性
Libgdx是跨平台的,但是目前国际化方案在GWT上还有缺陷。特别是在替换上MessageFormat的支持不完整,仅能通过序号来替换,其他情况会抛出IllegalArgumentException错误。
在程序一开始启用I18NBundle.setSimpleFormat(true)来保证GWT上的正常工作。
参考资料
Internationalizetion and Localization
I18NBundle
0 0
- Libgdx的使用(17)——多语言和国际化
- libgdx游戏引擎——libgdx粒子系统的使用
- Libgdx的使用(13)——杂谈Libgdx
- Libgdx的使用(4)——舞台和演员
- Libgdx的使用(6)——演员和演出
- Libgdx的使用(8)——相机和观察点
- libGDX——舞台类的使用
- libgdx——常见UI的使用
- ios8+swift app多语言——国际化和本土化
- Libgdx的使用(11)——Skin和UI配置文件的使用
- android游戏开发框架libgdx的使用(十一)—Skin和UI配置文件的使用
- android游戏开发框架libgdx的使用(十一)—Skin和UI配置文件的使用
- android游戏开发框架libgdx的使用(九)—在libgdx中使用Box2d
- android游戏开发框架libgdx的使用(九)—在libgdx中使用Box2d
- Libgdx的使用(9)——Box2d的使用
- Libgdx的使用(16)——内存管理和对象池
- android游戏开发框架libgdx的使用(十三)—TiledMap中的角色和角色移动
- android游戏开发框架libgdx的使用(十三)—TiledMap中的角色和角色移动
- 并查集
- 1408202044-hd-How many prime numbers.cpp
- 存储过程与函数的区别
- android:sms
- TreeMap类的entrySet()方法的应用
- Libgdx的使用(17)——多语言和国际化
- ADF工具类:TaskFlowUtils.java 源代码
- AspectJ学习笔记1-报Invalid aspectj.home.的处理方法
- 组件自动绑定到Managed Bean功能
- 杭电1059 Dividing(多重背包解法)
- Jquery超简单遮罩层实现代码
- 【二分+半平面交】 HDOJ 3761 Jungle Outpost
- 用python实现wireshark的follow tcp stream功能
- 404页面是怎样对网站优化产生影响的?