有没有国际化c++流的系统?

Is there a system for internationalizing C++ streams?

本文关键字:系统 国际化 c++ 有没有      更新时间:2023-10-16

我正在研究如何国际化我的c++项目,并没有花很长时间想知道如何处理夹杂着非字符串值的流文本的翻译。到目前为止,我发现的唯一一个提到这个问题的页面是这个c++ FQA页面,但不幸的是,这个页面对提供任何解决方案都不太感兴趣。还有这个2000年的Boost邮件列表线程,似乎没有去任何地方。

作为一个例子,对于这个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风格的解决方案,我提出的问题?

格式可以提供帮助:

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

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