是否有一个国际化C ++流的系统?

时间:2014-06-19 03:16:17

标签: c++ string internationalization

我正在研究如何使我的C ++项目国际化,并且我不知道如何处理流式文本的翻译,这些文本中插入了非字符串值。到目前为止,我发现的唯一一个页面甚至提到这将是this C++ FQA page,但不幸的是,该页面对提供任何解决方案都不太感兴趣。还有this Boost mailing list thread from 2000似乎无处可去。

例如,对于这种C风格的printf语句:

printf("There are %d lines in '%s'.", numlines, filename);

将整个消息包装在某种翻译函数中是很简单的,例如gettext的各种函数,并允许文本及其非文字组件根据需要移动。如果您可以访问POSIX版本的printf(或其他一些提供printf格式改进的库),您甚至可以根据需要以不同的顺序排列值。

但是,对于等效的基于C ++流的语句:

 std::cout << "There are " << numlines
           << "lines in '" << filename << "'.";

我还没有找到一种方法来标记整个邮件以进行翻译。您可以在适当的函数中包装每个字符串,但这需要翻译人员知道这三个字符串都是一条消息的一部分,以及它们之间出现的内容。此外,至少需要告知一些i18n解决方案,对于其中该文字内容根据上下文而变化的语言,相同字符串文字的其他出现是不同的。并且忘记了你必须重新排列非字符串文字值的情况。

所以我的问题是,是否存在支持使用流媒体操作的国际化解决方案,还是只有printf式解决方案来解决我提出的问题?

1 个答案:

答案 0 :(得分:1)

Boost.Format可以提供帮助:

cout << boost::format("There are %d lines in '%s'.") % numlines % filename;

cout << boost::format("There are %1% lines in '%2%'.") % numlines % filename;