gettext的替换

时间:2009-10-08 12:36:48

标签: c++ linux unix 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);来帮助解决这个问题。


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

5 个答案:

答案 0 :(得分:5)

我们正在使用ICU resource bundles并对此非常满意。 ICU界面不是“现代”,但功能强大,基本原则合理,资源打包(使用genrb工具)非常灵活。它的message formatting能力也很好。

关于您的具体意见:

  

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

我不明白这个。这可能是由于我对gettext的唯一“体验”是阅读了它的文档。

  

使用环境来计算语言

ICU界面以Locale为输入,因此您可以完全控制。如果它对你来说更方便,它还有一个“默认语言环境”的概念。

  

无法设置默认语言

ICU有一个精心设计的fallback mechanism,涉及“默认”捆绑

  

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

字符串ResourceBundle s(其他数据类型也是可能的)始终表示为UnicodeString,它在内部以UTF-16编码。带有UnicodeString的UTF-32非常简单,因为它的接口公开了几种允许在代码点级别操作它的方法。对于其他编码,code conversion是可能的。

答案 1 :(得分:3)

  

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

错误。您可以手动指定语言。使用LANGUAGE环境变量

int main()
{
      setlocale(LC_ALL,"");
      setenv("LANGUAGE","foo");
}

即使语言环境不存在(你见过语言foo吗?)

,这也行
  

2。使用环境来制定语言

有什么问题?这为用户提供了更多控制。

  

3。无法设置默认语言

错了,见上文。

  

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

错了,请参阅bind_textdomain_codeset(domain,codepage);

我的强烈推荐 - 坚持使用gettext。它是最受支持和最好的工具之一。译员会很感激使用普通而有用的工具。

还有一点很重要:对基于非基于gettext的工具提供非常糟糕支持的复数形式的大力支持。


gettext只有一个限制 - 每个进程不能使用多于一种语言。切换语言不是线程安全的。幸运的是,大多数与人类有关的节目都用一种语言说话。

这可能仅限于多线程服务。

编辑:但即使这不是真正的问题。我为我的项目实现了一次线程安全的gettext版本。请参阅http://art-blog.no-ip.info/cppcms/blog/post/16,基于mo文件阅读器。

答案 2 :(得分:1)

您还可以将ICU资源包转换为基于XML的XLIFF格式,以便进行翻译。

答案 3 :(得分:0)

Google Chrome浏览器上的语言切换非常巧妙。程序运行时可以在语言之间切换。我不知道他们使用什么系统,但它可能值得研究,因为它是一个开源浏览器。

答案 4 :(得分:0)

  

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

这与GNU gettext无关 - 因为它只处理翻译部分。但是,如果系统无法显示任何中文字符,那么中国就会遇到问题。

  

使用环境来计算语言

这是一个不错的选择,但您可以自己设置语言,覆盖环境。这样,您可以根据您的选择使用任何语言。

  

无法设置默认语言

这是不正确的 - 默认语言总是内置语言,如果你想要另一种语言,只需切换到它。它简直不能比一行代码简单。

  

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

如果您能够选择国际化工具,那么您也可以选择要用于文本的字符编码。有些项目使用utf-8表示所有语言(我的偏好),有些项目使用语言环境编码。

  

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

不,抱歉 - 我没有看到GNU gettext有任何问题: - )