我们在产品中使用gettext进行翻译,但是它有很多问题:
在Solaris 9 Sparc上,如果我们将环境重置为各种英语区域设置,如果机器没有相应的区域设置,则消息仍然不会被翻译。翻译文件已经存在,但我们无法访问它。
这会在希望将消息翻译成不同语言的服务器中造成问题。从理论上讲,这可能是一个完全线程安全、可并行的操作,但是gettext意味着我们必须对转换进行全局锁定。
我这样说并不是指代码中的文本。我们在代码中使用MsgID,因此,如果当前环境定义语言不可用,我想要的是能够指定要返回的转换。但是gettext不允许这样做--我必须尝试,然后重新设置环境,然后它才会决定看不同的翻译。(使用MsgID不是我的选择-我想遵循gettext标准,使用英语作为it,但我被否决了,现在要修改它需要做很多工作)
我不是指.po文件-它们都在UTF-8中(恼人的是msgfmt不处理BOM,而是其他什么)。我指的是gettext ngettext等的输出,它是在AIX和HPUX上的UTF-8 (不管本地/终端编码)中的,但是在Solaris/Linux/FreeBSD上的本地编码,尽管这可能是由于might问题造成的?
无论如何,不用为不同的平台编写特殊的代码是件好事--如果我能让bind_textdomain_codeset(domain,codepage);帮助解决这个问题,我将不得不进行调查。
有没有人知道开源翻译库提供了更有用的界面?
发布于 2009-10-08 12:51:04
我们正在使用ICU资源束,并且对它非常满意。ICU接口不是“现代”的,但它功能强大,基本原则是健全的,资源打包(使用genrb工具)相当灵活。它的消息格式功能也很好。
关于你的具体评论:
除非系统支持语言,否则无法使用语言。
我不明白这个。这可能是因为我对gettext的唯一“体验”就是阅读了它的文档。
使用环境编写语言
ICU接口以现场作为输入,因此您有完整的控制。如果对您更方便的话,它也有一个“默认区域设置”的概念。
无法设置默认语言
ICU有一个精心设计的回退机制,包含一个“默认”包。
返回的编码在UTF-8和当前本地编码之间有所不同。
字符串ResourceBundle(其他数据类型也是可能的)总是表示为UnicodeString,这是内部编码的UTF-16。使用UnicodeString的UTF-32非常容易,因为它的接口公开了几种允许在代码点级别操作它的方法。对于其他编码,码转换是可能的。
发布于 2009-10-14 07:56:10
不对。您可以手动指定语言。使用语言环境变量
int main()
{
setlocale(LC_ALL,"");
setenv("LANGUAGE","foo");
}这是可行的,即使不存在语言环境(您见过语言foo吗?)
这有什么问题吗?这给了用户更多的控制。
错了,见上面。
错,见bind_textdomain_codeset(domain,codepage);
我的强烈建议它是最受支持和最好的工具之一。翻译人员将感谢使用正常和有用的工具。
还有一点很重要:在非基于gettext的工具中,对支持非常糟糕的复数形式有很大的支持。
gettext只有一个限制--每个进程只能使用一种以上的语言。切换语言不是线程安全的。幸运的是,大多数与人类接触的程序都使用一种语言。
这可能仅限于多线程服务。
编辑:但即使这也不是一个真正的问题。我曾经为我的项目实现过一次线程安全的gettext版本。请参阅http://art-blog.no-ip.info/cppcms/blog/post/16,基于mo文件阅读器。
发布于 2009-10-08 19:15:24
您还可以将ICU资源包转换为基于XML的XLIFF格式。
https://stackoverflow.com/questions/1537538
复制相似问题