Ticket #7266: formats.patch

File formats.patch, 6.7 KB (added by 166291@…, 10 years ago)

Patch v2

  • boost/locale/gnu_gettext.hpp

    diff --git a/boost/locale/gnu_gettext.hpp b/boost/locale/gnu_gettext.hpp
    index cc8844f..d0c6b33 100644
    a b namespace gnu_gettext {  
    126126
    127127    };
    128128
    129     ///
    130     /// Create a message_format facet using GNU Gettext catalogs. It uses \a info structure to get
    131     /// information about where to read them from and uses it for character set conversion (if needed)
    132     ///
     129    /// \cond INTERNAL
    133130
     131    struct facetData
     132    {
     133        facetData(messages_info const& newInfo, std::vector<std::string> const& newFormats)
     134        : info(newInfo), formats(newFormats)
     135        {
     136        }
     137       
     138        messages_info const& info;
     139        std::vector<std::string> const& formats;
     140    };
     141   
    134142    template<typename CharType>
    135     message_format<CharType> *create_messages_facet(messages_info const &info);
    136 
    137     /// \cond INTERNAL
     143    message_format<CharType> *create_messages_facet(facetData const& data);
    138144   
    139145    template<>
    140     BOOST_LOCALE_DECL message_format<char> *create_messages_facet(messages_info const &info);
     146    BOOST_LOCALE_DECL message_format<char> *create_messages_facet(facetData const& data);
    141147   
    142148    template<>
    143     BOOST_LOCALE_DECL message_format<wchar_t> *create_messages_facet(messages_info const &info);
    144 
     149    BOOST_LOCALE_DECL message_format<wchar_t> *create_messages_facet(facetData const& data);
     150   
    145151    #ifdef BOOST_HAS_CHAR16_T
    146152    template<>
    147     BOOST_LOCALE_DECL message_format<char16_t> *create_messages_facet(messages_info const &info);
     153    BOOST_LOCALE_DECL message_format<char16_t> *create_messages_facet(facetData const& data);
    148154    #endif
    149155   
    150156    #ifdef BOOST_HAS_CHAR32_T
    151157    template<>
    152     BOOST_LOCALE_DECL message_format<char32_t> *create_messages_facet(messages_info const &info);
     158    BOOST_LOCALE_DECL message_format<char32_t> *create_messages_facet(facetData const& data);
    153159    #endif
    154160
    155161    /// \endcond
    156162
     163    ///
     164    /// Create a message_format facet using GNU Gettext catalogs. It uses \a info structure to get
     165    /// information about where to read them from and uses it for character set conversion (if needed)
     166    ///
     167
     168    template<typename CharType>
     169    message_format<CharType> *create_messages_facet(messages_info const &info)
     170    {
     171        // Default argument for formats is to use the Gettext hierarchy.
     172        std::vector<std::string> formats;
     173        formats.push_back("{1}/{2}/{3}/{4}.mo");
     174       
     175        return create_messages_facet<CharType>(facetData(info, formats));
     176    }
     177
     178    ///
     179    /// Creates a messages facet with special path formats
     180    ///
     181    /// Formats are the same syntax as the Boost format functions, but
     182    /// use the following variables:
     183    ///
     184    /// \li {1} A path to search for catalogs in.
     185    /// \li {2} The locale's name.
     186    /// \li {3} The locale's category.
     187    /// \li {4} The Gettext domain.
     188    ///
     189    /// For example, \c {1}/{2}/{3}/{4}.mo is the standard Gettext layout.
     190    /// Using something like \c {1}/{2}.mo would compact the folder hierarchy.
     191    ///
     192
     193    template<typename CharType>
     194    message_format<CharType> *create_messages_facet(messages_info const &info,
     195        std::vector<std::string> const &path_formats)
     196    {
     197        return create_messages_facet<CharType>(facetData(info, path_formats));
     198    }
     199
    157200} // gnu_gettext
    158201
    159202/// @}
  • libs/locale/src/shared/message.cpp

    diff --git a/libs/locale/src/shared/message.cpp b/libs/locale/src/shared/message.cpp
    index 56a4fdc..ce4b97c 100644
    a b  
    99#include <boost/config.hpp>
    1010#include <boost/locale/message.hpp>
    1111#include <boost/locale/gnu_gettext.hpp>
     12#include <boost/locale/format.hpp>
    1213#include <boost/shared_ptr.hpp>
    1314#include <boost/locale/encoding.hpp>
    1415#ifdef BOOST_MSVC
    namespace boost {  
    533534                    return p->second;
    534535                }
    535536
    536                 mo_message(messages_info const &inf)
     537                mo_message(facetData const& data)
    537538                {
     539                    messages_info inf = data.info;
     540                    std::vector<std::string> const& formats = data.formats;
     541                   
    538542                    std::string language = inf.language;
    539543                    std::string variant = inf.variant;
    540544                    std::string country = inf.country;
    namespace boost {  
    574578                        bool found=false;
    575579                        for(unsigned j=0;!found && j<paths.size();j++) {
    576580                            for(unsigned i=0;!found && i<search_paths.size();i++) {
    577                                 std::string full_path = search_paths[i]+"/"+paths[j]+"/" + lc_cat + "/"+domain+".mo";
    578                                 found = load_file(full_path,encoding,key_encoding,id,inf.callback);
     581                                for(unsigned k=0;!found && k<formats.size();k++) {
     582                                    std::string full_path = (format(formats[k]) % search_paths[i] % paths[j] % lc_cat % domain).str(std::locale::classic());
     583                                    found = load_file(full_path,encoding,key_encoding,id,inf.callback);
     584                                }
    579585                            }
    580586                        }
    581587                    }
    namespace boost {  
    744750            };
    745751
    746752            template<>
    747             message_format<char> *create_messages_facet(messages_info const &info)
     753            message_format<char> *create_messages_facet(facetData const& data)
    748754            {
    749                 return new mo_message<char>(info);
     755                return new mo_message<char>(data);
    750756            }
    751757
    752758            template<>
    753             message_format<wchar_t> *create_messages_facet(messages_info const &info)
     759            message_format<wchar_t> *create_messages_facet(facetData const& data)
    754760            {
    755                 return new mo_message<wchar_t>(info);
     761                return new mo_message<wchar_t>(data);
    756762            }
    757763           
    758764            #ifdef BOOST_HAS_CHAR16_T
    759765
    760766            template<>
    761             message_format<char16_t> *create_messages_facet(messages_info const &info)
     767            message_format<char16_t> *create_messages_facet(facetData const& data)
    762768            {
    763                 return new mo_message<char16_t>(info);
     769                return new mo_message<char16_t>(data);
    764770            }
    765771            #endif
    766772           
    767773            #ifdef BOOST_HAS_CHAR32_T
    768774
    769775            template<>
    770             message_format<char32_t> *create_messages_facet(messages_info const &info)
     776            message_format<char32_t> *create_messages_facet(facetData const& data)
    771777            {
    772                 return new mo_message<char32_t>(info);
     778                return new mo_message<char32_t>(data);
    773779            }
    774780            #endif
    775 
    776 
    777781        } /// gnu_gettext
    778782
    779783    } // locale