lua 多国语言文本解决方案

lua 多国语言文本解决方案

以前用c++做游戏,文本处理往往是从excel导出各语言文本的自定义二进制格式文件,游戏根据相应的语言读取相应的文件。同时导出工具还会生成一个索引文件,用来从文本数据中索引文本。这个索引一般是整形的,这样文本可以直接用数组保存,效率很高,并且比较节约内存。
现在我们使用Lua开发游戏,可以利用lua语言的特点,直接生成包含文本数据的lua代码,并作为模块引用。这种用法比使用c++载入文件的方式要简单一些。
下面介绍一下我的做法:

首先,使用工具从excel文件中自动生成文本索引的lua文件和文本内容的lua文件:

(使用lua的好处是,在写这个工具之前,我可以先直接手写lua文件验证这个方案,而c++必须先把工具实现了才能接着做)

1)索引文件 textindex.lua
string_hello = 1
string_world = 2

这儿索引是以全局变量形式存在,可以方便的被其他lua脚本require,并直接使用。

2)各语言的文本内容的lua文件,以中英文为例
英文的 en.lua
require('textindex')  --引入索引
local texts = {}
texts[string_hello] = 'Hello'
texts[string_world] = 'World'
return texts

中文的 ch.lua
require('textindex')  --引入索引
local texts = {}
texts[string_hello] = '你好'
texts[string_world] = '世界'
return texts

然后, 我们写一个简单的文本管理模块 text.lua :

module(..., package.seeall)

local textPack

local currentLanguageType = CCApplication:sharedApplication():getCurrentLanguage() --使用cocos2d-x相关方法获取当前语言

if currentLanguageType == kLanguageEnglish then
    textPack = require('en')
elseif currentLanguageType == kLanguageChinese then
    textPack = require('zh')
else
    textPack = require('en') --找不到对应语言的文件,使用英文的。ps: cocos2d-x居然不区分简体中文和繁体中文
end

function get(index)
    return textPack[index] or '?' --注意这儿要防止文本不存在,返回一个'?'方便测试查出问题同时又避免lua错误退出
end

这个模块载入的时候会根据当前系统的语言选择载入一个文本内容的Lua文件(当然如果你希望动态切语言可以增加相应的方法,不过要注意释放老语言包),同时该模块提供了一个get方法用于根据索引获取文本。

最后,看看我们如何使用:

例如 mainmenu.lua:

local text = require('text').get  --这样可以很方便的使用 text(id)来获取文本

--某个需要使用文本的地方
local testStr = text(string_hello) --得到了当前语言的文本

ps:我使用的是Lua5.1


你可能感兴趣的:(lua游戏开发)