236 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			236 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
//
 | 
						|
//  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_LOCALE_GENERATOR_HPP
 | 
						|
#define BOOST_LOCALE_GENERATOR_HPP
 | 
						|
#include <boost/locale/config.hpp>
 | 
						|
#include <boost/cstdint.hpp>
 | 
						|
#ifdef BOOST_MSVC
 | 
						|
#  pragma warning(push)
 | 
						|
#  pragma warning(disable : 4275 4251 4231 4660)
 | 
						|
#endif
 | 
						|
#include <string>
 | 
						|
#include <locale>
 | 
						|
#include <memory>
 | 
						|
 | 
						|
namespace boost {
 | 
						|
 | 
						|
    template<typename Type>
 | 
						|
    class shared_ptr;
 | 
						|
 | 
						|
    ///
 | 
						|
    /// \brief This is the main namespace that encloses all localization classes 
 | 
						|
    ///
 | 
						|
    namespace locale {
 | 
						|
 | 
						|
        class localization_backend;
 | 
						|
        class localization_backend_manager;
 | 
						|
 | 
						|
        static const uint32_t nochar_facet    = 0;        ///< Unspecified character category for character independent facets
 | 
						|
        static const uint32_t char_facet      = 1 << 0;   ///< 8-bit character facets
 | 
						|
        static const uint32_t wchar_t_facet   = 1 << 1;   ///< wide character facets
 | 
						|
        static const uint32_t char16_t_facet  = 1 << 2;   ///< C++0x char16_t facets
 | 
						|
        static const uint32_t char32_t_facet  = 1 << 3;   ///< C++0x char32_t facets
 | 
						|
 | 
						|
        static const uint32_t character_first_facet = char_facet;  ///< First facet specific for character type
 | 
						|
        static const uint32_t character_last_facet = char32_t_facet; ///< Last facet specific for character type
 | 
						|
        static const uint32_t all_characters = 0xFFFF;     ///< Special mask -- generate all
 | 
						|
        
 | 
						|
        typedef uint32_t character_facet_type; ///<type that specifies the character type that locales can be generated for
 | 
						|
 | 
						|
        static const uint32_t     convert_facet   = 1 << 0;   ///< Generate conversion facets
 | 
						|
        static const uint32_t     collation_facet = 1 << 1;   ///< Generate collation facets
 | 
						|
        static const uint32_t     formatting_facet= 1 << 2;   ///< Generate numbers, currency, date-time formatting facets
 | 
						|
        static const uint32_t     parsing_facet   = 1 << 3;   ///< Generate numbers, currency, date-time formatting facets
 | 
						|
        static const uint32_t     message_facet   = 1 << 4;   ///< Generate message facets
 | 
						|
        static const uint32_t     codepage_facet  = 1 << 5;   ///< Generate character set conversion facets (derived from std::codecvt)
 | 
						|
        static const uint32_t     boundary_facet  = 1 << 6;   ///< Generate boundary analysis facet
 | 
						|
            
 | 
						|
        static const uint32_t     per_character_facet_first = convert_facet; ///< First facet specific for character
 | 
						|
        static const uint32_t     per_character_facet_last = boundary_facet; ///< Last facet specific for character
 | 
						|
 | 
						|
        static const uint32_t     calendar_facet  = 1 << 16;   ///< Generate boundary analysis facet
 | 
						|
        static const uint32_t     information_facet = 1 << 17;   ///< Generate general locale information facet
 | 
						|
 | 
						|
        static const uint32_t    non_character_facet_first = calendar_facet; ///< First character independent facet 
 | 
						|
        static const uint32_t    non_character_facet_last = information_facet;///< Last character independent facet 
 | 
						|
 | 
						|
            
 | 
						|
        static const uint32_t    all_categories  = 0xFFFFFFFFu;   ///< Generate all of them
 | 
						|
        
 | 
						|
        typedef uint32_t locale_category_type; ///< a type used for more fine grained generation of facets
 | 
						|
 | 
						|
        ///
 | 
						|
        /// \brief the major class used for locale generation
 | 
						|
        ///
 | 
						|
        /// This class is used for specification of all parameters required for locale generation and
 | 
						|
        /// caching. This class const member functions are thread safe if locale class implementation is thread safe.
 | 
						|
        ///
 | 
						|
 | 
						|
        class BOOST_LOCALE_DECL generator {
 | 
						|
        public:
 | 
						|
 | 
						|
            ///
 | 
						|
            /// Create new generator using global localization_backend_manager 
 | 
						|
            ///
 | 
						|
            generator();
 | 
						|
            ///
 | 
						|
            /// Create new generator using specific localization_backend_manager 
 | 
						|
            ///
 | 
						|
            generator(localization_backend_manager const &);
 | 
						|
 | 
						|
            ~generator();
 | 
						|
 | 
						|
            ///
 | 
						|
            /// Set types of facets that should be generated, default all
 | 
						|
            ///
 | 
						|
            void categories(locale_category_type cats);
 | 
						|
            ///
 | 
						|
            /// Get types of facets that should be generated, default all
 | 
						|
            ///
 | 
						|
            locale_category_type categories() const;
 | 
						|
            
 | 
						|
            ///
 | 
						|
            /// Set the characters type for which the facets should be generated, default all supported
 | 
						|
            ///
 | 
						|
            void characters(character_facet_type chars);
 | 
						|
            ///
 | 
						|
            /// Get the characters type for which the facets should be generated, default all supported
 | 
						|
            ///
 | 
						|
            character_facet_type characters() const;
 | 
						|
 | 
						|
            ///
 | 
						|
            /// Add a new domain of messages that would be generated. It should be set in order to enable
 | 
						|
            /// messages support.
 | 
						|
            ///
 | 
						|
            /// Messages domain has following format: "name" or "name/encoding"
 | 
						|
            /// where name is the base name of the "mo" file where the catalog is stored
 | 
						|
            /// without ".mo" extension. For example for file \c /usr/share/locale/he/LC_MESSAGES/blog.mo
 | 
						|
            /// it would be \c blog.
 | 
						|
            ///
 | 
						|
            /// You can optionally specify the encoding of the keys in the sources by adding "/encoding_name"
 | 
						|
            /// For example blog/cp1255.
 | 
						|
            ///
 | 
						|
            /// If not defined all keys are assumed to be UTF-8 encoded.
 | 
						|
            ///
 | 
						|
            /// \note When you select a domain for the program using dgettext or message API, you
 | 
						|
            /// do not specify the encoding part. So for example if the provided
 | 
						|
            /// domain name was "blog/windows-1255" then for translation
 | 
						|
            /// you should use dgettext("blog","Hello")
 | 
						|
            ///
 | 
						|
            ///
 | 
						|
            void add_messages_domain(std::string const &domain);
 | 
						|
            ///
 | 
						|
            /// Set default message domain. If this member was not called, the first added messages domain is used.
 | 
						|
            /// If the domain \a domain is not added yet it is added.
 | 
						|
            ///
 | 
						|
            void set_default_messages_domain(std::string const &domain);
 | 
						|
 | 
						|
            ///
 | 
						|
            /// Remove all added domains from the list
 | 
						|
            ///
 | 
						|
            void clear_domains();
 | 
						|
 | 
						|
            ///
 | 
						|
            /// Add a search path where dictionaries are looked in.
 | 
						|
            ///
 | 
						|
            /// \note
 | 
						|
            ///
 | 
						|
            /// - Under the Windows platform the path is treated as a path in the locale's encoding so
 | 
						|
            ///   if you create locale "en_US.windows-1251" then path would be treated as cp1255,
 | 
						|
            ///   and if it is en_US.UTF-8 it is treated as UTF-8. File name is always opened with 
 | 
						|
            ///   a wide file name as wide file names are the native file name on Windows.
 | 
						|
            ///
 | 
						|
            /// - Under POSIX platforms all paths passed as-is regardless of encoding as narrow
 | 
						|
            ///   encodings are the native encodings for POSIX platforms.
 | 
						|
            ///   
 | 
						|
            /// 
 | 
						|
            void add_messages_path(std::string const &path);
 | 
						|
 | 
						|
            ///
 | 
						|
            /// Remove all added paths
 | 
						|
            ///
 | 
						|
            void clear_paths();
 | 
						|
 | 
						|
            ///
 | 
						|
            /// Remove all cached locales
 | 
						|
            ///
 | 
						|
            void clear_cache();
 | 
						|
 | 
						|
            ///
 | 
						|
            /// Turn locale caching ON
 | 
						|
            ///
 | 
						|
            void locale_cache_enabled(bool on);
 | 
						|
 | 
						|
            ///
 | 
						|
            /// Get locale cache option
 | 
						|
            ///
 | 
						|
            bool locale_cache_enabled() const;
 | 
						|
 | 
						|
            ///
 | 
						|
            /// Check if by default ANSI encoding is selected or UTF-8 onces. The default is false.
 | 
						|
            ///
 | 
						|
            bool use_ansi_encoding() const;
 | 
						|
 | 
						|
            ///
 | 
						|
            /// Select ANSI encodings as default system encoding rather then UTF-8 by default
 | 
						|
            /// under Windows.
 | 
						|
            ///
 | 
						|
            /// The default is the most portable and most powerful encoding, UTF-8, but the user
 | 
						|
            /// can select "system" one if dealing with legacy applications
 | 
						|
            ///
 | 
						|
            void use_ansi_encoding(bool enc);
 | 
						|
 | 
						|
            ///
 | 
						|
            /// Generate a locale with id \a id
 | 
						|
            ///
 | 
						|
            std::locale generate(std::string const &id) const;
 | 
						|
            ///
 | 
						|
            /// Generate a locale with id \a id. Use \a base as a locale to which all facets are added,
 | 
						|
            /// instead of std::locale::classic().
 | 
						|
            ///
 | 
						|
            std::locale generate(std::locale const &base,std::string const &id) const;
 | 
						|
            ///
 | 
						|
            /// Shortcut to generate(id)
 | 
						|
            ///
 | 
						|
            std::locale operator()(std::string const &id) const
 | 
						|
            {
 | 
						|
                return generate(id);
 | 
						|
            }
 | 
						|
            
 | 
						|
            ///
 | 
						|
            /// Set backend specific option
 | 
						|
            ///
 | 
						|
            void set_option(std::string const &name,std::string const &value);
 | 
						|
 | 
						|
            ///
 | 
						|
            /// Clear backend specific options
 | 
						|
            ///
 | 
						|
            void clear_options();
 | 
						|
 | 
						|
        private:
 | 
						|
 | 
						|
            void set_all_options(shared_ptr<localization_backend> backend,std::string const &id) const;
 | 
						|
 | 
						|
            generator(generator const &);
 | 
						|
            void operator=(generator const &);
 | 
						|
 | 
						|
            struct data;
 | 
						|
            std::auto_ptr<data> d;
 | 
						|
        };
 | 
						|
 | 
						|
    }
 | 
						|
}
 | 
						|
#ifdef BOOST_MSVC
 | 
						|
#pragma warning(pop)
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
#endif
 | 
						|
// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 
 | 
						|
 |