diff --git a/boost/locale/gnu_gettext.hpp b/boost/locale/gnu_gettext.hpp index cc8844f..d0c6b33 100644 --- a/boost/locale/gnu_gettext.hpp +++ b/boost/locale/gnu_gettext.hpp @@ -126,34 +126,77 @@ namespace gnu_gettext { }; - /// - /// Create a message_format facet using GNU Gettext catalogs. It uses \a info structure to get - /// information about where to read them from and uses it for character set conversion (if needed) - /// + /// \cond INTERNAL + struct facetData + { + facetData(messages_info const& newInfo, std::vector const& newFormats) + : info(newInfo), formats(newFormats) + { + } + + messages_info const& info; + std::vector const& formats; + }; + template - message_format *create_messages_facet(messages_info const &info); - - /// \cond INTERNAL + message_format *create_messages_facet(facetData const& data); template<> - BOOST_LOCALE_DECL message_format *create_messages_facet(messages_info const &info); + BOOST_LOCALE_DECL message_format *create_messages_facet(facetData const& data); template<> - BOOST_LOCALE_DECL message_format *create_messages_facet(messages_info const &info); - + BOOST_LOCALE_DECL message_format *create_messages_facet(facetData const& data); + #ifdef BOOST_HAS_CHAR16_T template<> - BOOST_LOCALE_DECL message_format *create_messages_facet(messages_info const &info); + BOOST_LOCALE_DECL message_format *create_messages_facet(facetData const& data); #endif #ifdef BOOST_HAS_CHAR32_T template<> - BOOST_LOCALE_DECL message_format *create_messages_facet(messages_info const &info); + BOOST_LOCALE_DECL message_format *create_messages_facet(facetData const& data); #endif /// \endcond + /// + /// Create a message_format facet using GNU Gettext catalogs. It uses \a info structure to get + /// information about where to read them from and uses it for character set conversion (if needed) + /// + + template + message_format *create_messages_facet(messages_info const &info) + { + // Default argument for formats is to use the Gettext hierarchy. + std::vector formats; + formats.push_back("{1}/{2}/{3}/{4}.mo"); + + return create_messages_facet(facetData(info, formats)); + } + + /// + /// Creates a messages facet with special path formats + /// + /// Formats are the same syntax as the Boost format functions, but + /// use the following variables: + /// + /// \li {1} A path to search for catalogs in. + /// \li {2} The locale's name. + /// \li {3} The locale's category. + /// \li {4} The Gettext domain. + /// + /// For example, \c {1}/{2}/{3}/{4}.mo is the standard Gettext layout. + /// Using something like \c {1}/{2}.mo would compact the folder hierarchy. + /// + + template + message_format *create_messages_facet(messages_info const &info, + std::vector const &path_formats) + { + return create_messages_facet(facetData(info, path_formats)); + } + } // gnu_gettext /// @} diff --git a/libs/locale/src/shared/message.cpp b/libs/locale/src/shared/message.cpp index 56a4fdc..ce4b97c 100644 --- a/libs/locale/src/shared/message.cpp +++ b/libs/locale/src/shared/message.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #ifdef BOOST_MSVC @@ -533,8 +534,11 @@ namespace boost { return p->second; } - mo_message(messages_info const &inf) + mo_message(facetData const& data) { + messages_info inf = data.info; + std::vector const& formats = data.formats; + std::string language = inf.language; std::string variant = inf.variant; std::string country = inf.country; @@ -574,8 +578,10 @@ namespace boost { bool found=false; for(unsigned j=0;!found && j - message_format *create_messages_facet(messages_info const &info) + message_format *create_messages_facet(facetData const& data) { - return new mo_message(info); + return new mo_message(data); } template<> - message_format *create_messages_facet(messages_info const &info) + message_format *create_messages_facet(facetData const& data) { - return new mo_message(info); + return new mo_message(data); } #ifdef BOOST_HAS_CHAR16_T template<> - message_format *create_messages_facet(messages_info const &info) + message_format *create_messages_facet(facetData const& data) { - return new mo_message(info); + return new mo_message(data); } #endif #ifdef BOOST_HAS_CHAR32_T template<> - message_format *create_messages_facet(messages_info const &info) + message_format *create_messages_facet(facetData const& data) { - return new mo_message(info); + return new mo_message(data); } #endif - - } /// gnu_gettext } // locale