就我个人而言,我会选择这个答案,但是当文本被写入流时,可能会使用一些 streambuf 魔法来做到这一点。如果您真的对此感兴趣,请查看 Langer 和 Kreft 的Standard C++ IOStreams and Locales,它是 iostreams 的圣经。
以下假设要翻译写入缓冲区的所有内容,并且可以完全翻译每一行:
std::string xgettext (std::string const & s)
{
return s;
}
下面的 transbuf 类覆盖“溢出”函数,并在每次看到换行符时转换缓冲区。
class transbuf : public std::streambuf {
public:
transbuf (std::streambuf * realsb) : std::streambuf (), m_realsb (realsb)
, m_buf () {}
~transbuf () {
// ... flush m_buf if necessary
}
virtual std::streambuf::int_type overflow (std::streambuf::int_type c) {
m_buf.push_back (c);
if (c == '\n') {
// We have a complete line, translate it and write it to our stream:
std::string transtext = xgettext (m_buf);
for (std::string::const_iterator i = transtext.begin ()
; i != transtext.end ()
; ++i) {
m_realsb->sputc (*i);
// ... check that overflow returned the correct value...
}
m_buf = "";
}
return c;
}
std::streambuf * get () { return m_realsb; }
// data
private:
std::streambuf * m_realsb;
std::string m_buf;
};
这是一个如何使用它的示例:
int main ()
{
transbuf * buf = new transbuf (std::cout.rdbuf ());
std::ostream trans (buf);
trans << "Hello"; // Added to m_buf
trans << " World"; // Added to m_buf
trans << "\n"; // Causes m_buf to be written
trans << "Added to buffer\neach new line causes\n"
"the string to be translated\nand written" << std::endl;
delete buf;
}