+ }
+
+ ~Pimpl() {}
+
+ string const get(string const & m) const
+ {
+ if (m.empty())
+ return m;
+
+ char * old = strdup(setlocale(LC_ALL, 0));
+ char * n = setlocale(LC_ALL, lang_.c_str());
+ bindtextdomain(PACKAGE, lyx_localedir().c_str());
+ textdomain(PACKAGE);
+ const char* msg = gettext(m.c_str());
+ // Some english words have different translations, depending
+ // on context. In these cases the original string is
+ // augmented by context information (e.g.
+ // "To:[[as in 'From page x to page y']]" and
+ // "To:[[as in 'From format x to format y']]".
+ // This means that we need to filter out everything in
+ // double square brackets at the end of the string,
+ // otherwise the user sees bogus messages.
+ // If we are unable to honour the request we just
+ // return what we got in.
+ string translated(n ? msg : m);
+ static boost::regex const reg("^([^\\[]*)\\[\\[[^\\]]*\\]\\]$");
+ boost::smatch sub;
+ if (regex_match(translated, sub, reg))
+ translated = sub.str(1);
+ setlocale(LC_ALL, old);
+ free(old);
+ return translated;
+ }
+private:
+ ///
+ string lang_;
+};
+#endif
+
+#else // ENABLE_NLS
+// This is the dummy variant.
+class Messages::Pimpl {
+public:
+ Pimpl(string const &) {}
+
+ ~Pimpl() {}
+
+ string const get(string const & m) const
+ {
+ return m;
+ }
+};
+#endif
+
+
+Messages::Messages()
+ : pimpl_(new Pimpl(""))
+{}
+
+
+Messages::Messages(string const & l)
+ : pimpl_(new Pimpl(l))
+{}
+
+
+// We need this for the sake of scoped_ptr