write by 九天雁翎(JTianLing) -- blog.jtianling.com
新浪微博--讨论新闻组--代码库--豆瓣
在不需要跨平台开发iPhone的应用时,自然使用iOS提供的多国语言支持解决方案
但是,不能用Qt,也不是开发纯iOS应用的时候呢?那就只能自己想个办法解决这个问题了。
根据实际情况,该解决方案需要符合下面的条件:
1.代码中使用时,不应该有太多额外的负担,不降低代码的可读性
2.不用单独的工具也能使用
第一条很好解释,假如为了多国语言而浪费太多的精力实在不值得,所以这里放弃更加高效的int编码索引字符串的方式,那种方式的确更加高效,但是代码中需要使用宏/常量来索引字符串。
第二条就完全处于开发简单的考虑,不要神马分析,生成等乱七八糟的东西,所以也不会如很多解决方案一样使用啥excel,然后通过工具解析成二进制的格式,然后程序中去解析二进制数据,那不是自虐吗?
那么方案其实就慢慢出来了,以文本配置来存储多国语言的文字,一种语言一个文件。在文本配置的格式选择上,使用json。用字符串Key来索引字符串,索引失败时,就直接显示Key字符串。
首先,json的格式就是最简单的以key为索引的字符串组合,比如,我现在建立一个en.json表示英文,一个cn.json表示中文。
然后实现如下StringManager,该类为Singleton:(用jsoncpp为json的解析库)
头文件:
class StringManager : public Singleton<StringManager>
{
public:
bool Init(const char* filename);
std::string GetLocalizedString(const char* key);
private:
Json::Value string_map_;
};
部分实现:
bool StringManager::Init( const char* filename ) {
if ( !ReadJsonFromFile(filename, string_map_) ) {
return false;
}
return true;
}
std::string StringManager::GetLocalizedString( const char* key ) {
if (string_map_.isMember(key)) {
return string_map_[key].asString();
}
else {
return std::string(key); // 当查找不到key时,直接显示key
}
}
一般情况下,直接通过StringManager的GetLocalizedString函数来获取字符串即可,为了更加简单,定义如下的宏:
#define LS(key) StringManager::Instance()->GetLocalizedString(key)
使用时,先需要以字符串的配置文件名初始化StringManager,读取字符串信息。以后,使用起来就和Qt中很类似了。即以LS()方式包含你需要显示的文字。
比如下面这样,为了减少其他无关信息,就没有添加显示部分的代码了:
在以上的例子中,我是使用utf8来保存多国语言,假如你是使用UTF16的话,请将相应的字符串表示改为宽字节即可。
小结:
因为没有额外的工具支持,这样的方式也许没有qt,iOS里面那么便捷,但是实现简单,容易理解,同时使用起来也足够的方便,最最重要的是,除了C++编译器,这套方案不依赖于平台或者其他神马东西,你随时随地都可以使用。(本例中用jsoncpp解析json,jsoncpp也仅依赖C++编译器存在)
相关推荐
vc多国语言动态切换的一种实现Stringtable加载实现。
程序实现多国语言的动态切换解决方案 实现思想:传统的做法是把所有的资源都放到动态库中,一种语言一个动态库,程序运行的时候通过加载不同的动态库来实现多语言功能。这样做的缺点是不能动态切换语言,如果更换...
解决方案1: length := len(str) array := make([]string , length) for i , v := range str{ array[i] = string(v) } for i := 0 ; i < length/2 ; i++ { array[i], array[length -i - 1] = array[le
创建多国语言中英文界面类,支持MFC各种资源字符串,不同语言配置不同的本地ini文件即可
多国语言字库Windows模拟器使用文档,可以支持全部字模显示,也可以支持字符串的的特效显示,所显示的效果和在嵌入式系统中使用效果完全一样。
把所有用到的字符串都放到文件中,一种语言一个文件,根据选择的语言到对应的文件中去加载字符串。这样不但可以动态切换语言,而且用户可以根据需要自己添加新的语言。 动态切换对话框上的文字并不需要单独去设置...
VC 为程序窗口添加多国... 本源码所演示的方法是把所有用到的字符串都放到文件中,一种语言一个文件,根据选择的语言到对应的文件中去加载字符串。这样不但可以动态切换语言,而且用户可以根据需要自己添加新的语言。
多国语言点阵生成软件FontMaker 1、支持所有 windows 字符集 2、支持 BIN(*.bin), TXT(*.txt), BMP(*.bmp) 文件输出 3、支持unicode字库输出 4、支持单个字符编辑 5、支持字库文件和输出路径记忆功能 6、支持从bdf...
汇编语言开发,实现两个字符串的输入,然后进行字符串的比较,是否在第二个字符串中还有第一个字符串
可以在语言描述文件中使用带参数的字符串,方便的组合出字符串,(用法类似于Format函数)。 所有窗口,与使用了多国语言基类的其它类,都可以在应用程序改变当前语言时,立刻更新为新的语言。 方便的从已有程序...
易语言字符串操作源码,字符串操作,字符串_取长度,字符串_取中间,字符串_取左边,字符串_取右边,字符串_替换,到宽字符,到多字节,取文本数据地址,取字节集数据地址,MultiByteToWideChar,WideCharToMultiByte
用VC纯资源DLL解决国际化问题_多国语言版.zip
字符串处理通用程序 功能说明: ①:查找 ②:删除 ③:替换 ④:插入 寄存器说明: SI:①:主串下标 ②:替换串下标 DX:保存主串下标SI AL:保存主串字符 BX:子串下标 AH:保存子串字符 DI:存储下标 标记...
纯C语言实现字符串拆分操作,把字符串拆分成字符串数组,然后再输出。 使用sstream方法,作为底层驱动操作实现非常方便。
J2ME中的字符串管理和多语言支持近期学习j2me开发,也谈谈我对字符串管理的一个方案。 字符串管理的目的是字符串的资源化管理。 1。这个系统应该可以通过静态方法访问; 2。字符串保存在资源当中; 3。可以方便的...
字符串0GC补充方案 , 整体思想是用1点多MB的内存空间换取0GC。详细报告可以查看网址:https://coh5.cn/p/1ace6338.html
字符串时间转换时间格式问题带配图完整解决方案--kettle版.doc
php根据字符串判断语言,判断字符串是哪一个国家的,但是东亚语系的不能识别,这是一个缺点
C++ 语言中关于字符串编程。字符串中查找字符串。。。。
用汇编语言实现,输入一个字符串,然后检索数字,并去掉 用汇编语言实现,输入一个字符串,然后检索数字,并去掉 用汇编语言实现,输入一个字符串,然后检索数字,并去掉 用汇编语言实现,输入一个字符串,然后检索...