gettext的替换

Dou*_*der 5 c++ unix linux internationalization

我们在产品中使用gettext进行翻译,但是它遇到了很多问题:

  • 除非系统支持,否则无法使用语言.

在Solaris 9 Sparc上,如果我们将环境重置为各种英语语言环境,则如果计算机没有相应的语言环境,则仍不会翻译该消息.转换文件存在,但我们无法访问它.

  • 使用环境来制定语言

这会导致想要将消息转换为不同语言的服务器出现问题.从理论上讲,这可能是一个完全线程安全,可并行化的操作 - 但gettext意味着我们必须全面锁定翻译.

  • 无法设置默认语言

通过这个我不是指代码中的文本.我们在代码中使用MsgID,所以我想要的是能够指定一个后备转换,如果当前环境定义语言不可用.但gettext不允许这样做 - 我必须尝试,然后重新设置环境才能查看不同的翻译.(使用MsgIDs不是我的选择 - 我想遵循gettext标准并使用英语作为ID,但我被推翻了,现在改变它将是很多工作)

  • 返回的编码在UTF-8和当前本地编码之间变化.

我不是指.po文件 - 它们都是UTF-8(烦人的是,msgfmt不处理BOM,但无论如何).我的意思是gettext ngettext等的输出,它们在AIX和HPUX上是UTF-8(无论本地/终端编码),但在Solaris/Linux/FreeBSD上是本地编码,尽管这可能是由于iconv问题引起的?

在任何情况下,不必为不同的平台拥有特殊代码是很好的 - 我将不得不调查我是否可以bind_textdomain_codeset(domain,codepage);帮助解决这个问题.


有谁知道开源翻译库提供更有用的界面?

Éri*_*ant 5

我们正在使用ICU资源包,并对它非常满意.ICU界面不是"现代",但功能强大,基本原则合理,资源打包(使用genrb工具)非常灵活.它的消息格式化功能也很好.

关于您的具体意见:

除非系统支持,否则无法使用语言.

我不明白这个.这可能是因为我使用gettext的唯一"经验"是阅读其文档.

使用环境来制定语言

ICU接口将Locale作为输入,因此您可以完全控制.如果它对您更方便,它还有"默认语言环境"的概念.

无法设置默认语言

ICU有一个精心设计的回退机制,涉及一个"默认"捆绑

返回的编码在UTF-8和当前本地编码之间变化.

String ResourceBundle(其他数据类型也可以)总是表示为UnicodeString,它在内部以UTF-16编码.带有UnicodeString的UTF-32非常简单,因为它的接口公开了几种允许在代码点级别操作它的方法.对于其他编码,可以进行代码转换.