Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/locale/gnu_gettext.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/locale/gnu_gettext.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,167 @@ +// +// Copyright (c) 2009-2011 Artyom Beilis (Tonkikh) +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +#ifndef BOOST_LOCLAE_GNU_GETTEXT_HPP +#define BOOST_LOCLAE_GNU_GETTEXT_HPP + +#include <boost/locale/message.hpp> +#include <boost/function.hpp> +#include <stdexcept> + +namespace boost { +namespace locale { +/// \addtogroup message +/// @{ + + +/// +/// \brief This namespace holds classes that provide GNU Gettext message catalogs support. +/// +namespace gnu_gettext { + + /// + /// \brief This structure holds all information required for creating gnu-gettext message catalogs, + /// + /// The user is expected to set its parameters to load these catalogs correctly. This structure + /// also allows providing functions for charset conversion. Note, you need to provide them, + /// so this structure is not useful for wide characters without subclassing and it will also + /// ignore gettext catalogs that use a charset different from \a encoding. + /// + struct messages_info { + messages_info() : + language("C"), + locale_category("LC_MESSAGES") + { + } + + std::string language; ///< The language we load the catalog for, like "ru", "en", "de" + std::string country; ///< The country we load the catalog for, like "US", "IL" + std::string variant; ///< Language variant, like "euro" so it would look for catalog like de_DE\@euro + std::string encoding; ///< Required target charset encoding. Ignored for wide characters. + ///< For narrow, should specify the correct encoding required for this catalog + std::string locale_category; ///< Locale category, is set by default to LC_MESSAGES, but may be changed + /// + /// \brief This type represents GNU Gettext domain name for the messages. + /// + /// It consists of two parameters: + /// + /// - name - the name of the domain - used for opening the file name + /// - encoding - the encoding of the keys in the sources, default - UTF-8 + /// + struct domain { + + std::string name; ///< The name of the domain + std::string encoding; ///< The character encoding for the domain + domain() {} + /// + /// Create a domain object from the name that can hold an encoding after symbol "/" + /// such that if n is "hello/cp1255" then the name would be "hello" and "encoding" would + /// be "cp1255" and if n is "hello" then the name would be the same but encoding would be + /// "UTF-8" + /// + domain(std::string const &n) + { + size_t pos = n.find("/"); + if(pos==std::string::npos) { + name = n; + encoding = "UTF-8"; + } + else { + name = n.substr(0,pos); + encoding = n.substr(pos+1); + } + + } + + /// + /// Check whether two objects are equivalent, only names are compared, encoding is ignored + /// + bool operator==(domain const &other) const + { + return name==other.name; + } + /// + /// Check whether two objects are distinct, only names are compared, encoding is ignored + /// + bool operator!=(domain const &other) const + { + return !(*this==other); + } + + }; + + typedef std::vector<domain> domains_type; ///< Type that defines a list of domains that are loaded + ///< The first one is the default one + domains_type domains; ///< Message domains - application name, like my_app. So files named my_app.mo + ///< would be loaded + std::vector<std::string> paths; ///< Paths to search files in. Under MS Windows it uses encoding + ///< parameter to convert them to wide OS specific paths. + + /// + /// The callback for custom file system support. This callback should read the file named \a file_name + /// encoded in \a encoding character set into std::vector<char> and return it. + /// + /// - If the file does not exist, it should return an empty vector. + /// - If a error occurs during file read it should throw a error. + /// + /// \note The user should support only the encodings the locales are created for. So if the user + /// uses only one encoding or the file system is encoding agnostic, he may ignore the \a encoding parameter. + /// + typedef function< + std::vector<char>( + std::string const &file_name, + std::string const &encoding + ) + > callback_type; + + /// + /// The callback for handling custom file systems, if it is empty, the real OS file-system + /// is being used. + /// + callback_type callback; + + }; + + /// + /// 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<typename CharType> + message_format<CharType> *create_messages_facet(messages_info const &info); + + /// \cond INTERNAL + + template<> + BOOST_LOCALE_DECL message_format<char> *create_messages_facet(messages_info const &info); + + template<> + BOOST_LOCALE_DECL message_format<wchar_t> *create_messages_facet(messages_info const &info); + + #ifdef BOOST_HAS_CHAR16_T + template<> + BOOST_LOCALE_DECL message_format<char16_t> *create_messages_facet(messages_info const &info); + #endif + + #ifdef BOOST_HAS_CHAR32_T + template<> + BOOST_LOCALE_DECL message_format<char32_t> *create_messages_facet(messages_info const &info); + #endif + + /// \endcond + +} // gnu_gettext + +/// @} + +} // locale +} // boost + +#endif + +// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 +