我正在研究如何使我的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
式解决方案来解决我提出的问题?
答案 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;