1 // 2 // Copyright (c) 2009-2011 Artyom Beilis (Tonkikh) 3 // 4 // Distributed under the Boost Software License, Version 1.0. (See 5 // accompanying file LICENSE_1_0.txt or copy at 6 // http://www.boost.org/LICENSE_1_0.txt) 7 // 8 #ifndef BOOST_LOCALE_GENERATOR_HPP 9 #define BOOST_LOCALE_GENERATOR_HPP 10 #include <boost/locale/config.hpp> 11 #include <boost/cstdint.hpp> 12 #ifdef BOOST_MSVC 13 # pragma warning(push) 14 # pragma warning(disable : 4275 4251 4231 4660) 15 #endif 16 #include <string> 17 #include <locale> 18 #include <memory> 19 20 namespace boost { 21 22 template<typename Type> 23 class shared_ptr; 24 25 /// 26 /// \brief This is the main namespace that encloses all localization classes 27 /// 28 namespace locale { 29 30 class localization_backend; 31 class localization_backend_manager; 32 33 static const uint32_t nochar_facet = 0; ///< Unspecified character category for character independent facets 34 static const uint32_t char_facet = 1 << 0; ///< 8-bit character facets 35 static const uint32_t wchar_t_facet = 1 << 1; ///< wide character facets 36 static const uint32_t char16_t_facet = 1 << 2; ///< C++0x char16_t facets 37 static const uint32_t char32_t_facet = 1 << 3; ///< C++0x char32_t facets 38 39 static const uint32_t character_first_facet = char_facet; ///< First facet specific for character type 40 static const uint32_t character_last_facet = char32_t_facet; ///< Last facet specific for character type 41 static const uint32_t all_characters = 0xFFFF; ///< Special mask -- generate all 42 43 typedef uint32_t character_facet_type; ///<type that specifies the character type that locales can be generated for 44 45 static const uint32_t convert_facet = 1 << 0; ///< Generate conversion facets 46 static const uint32_t collation_facet = 1 << 1; ///< Generate collation facets 47 static const uint32_t formatting_facet= 1 << 2; ///< Generate numbers, currency, date-time formatting facets 48 static const uint32_t parsing_facet = 1 << 3; ///< Generate numbers, currency, date-time formatting facets 49 static const uint32_t message_facet = 1 << 4; ///< Generate message facets 50 static const uint32_t codepage_facet = 1 << 5; ///< Generate character set conversion facets (derived from std::codecvt) 51 static const uint32_t boundary_facet = 1 << 6; ///< Generate boundary analysis facet 52 53 static const uint32_t per_character_facet_first = convert_facet; ///< First facet specific for character 54 static const uint32_t per_character_facet_last = boundary_facet; ///< Last facet specific for character 55 56 static const uint32_t calendar_facet = 1 << 16; ///< Generate boundary analysis facet 57 static const uint32_t information_facet = 1 << 17; ///< Generate general locale information facet 58 59 static const uint32_t non_character_facet_first = calendar_facet; ///< First character independent facet 60 static const uint32_t non_character_facet_last = information_facet;///< Last character independent facet 61 62 63 static const uint32_t all_categories = 0xFFFFFFFFu; ///< Generate all of them 64 65 typedef uint32_t locale_category_type; ///< a type used for more fine grained generation of facets 66 67 /// 68 /// \brief the major class used for locale generation 69 /// 70 /// This class is used for specification of all parameters required for locale generation and 71 /// caching. This class const member functions are thread safe if locale class implementation is thread safe. 72 /// 73 74 class BOOST_LOCALE_DECL generator { 75 public: 76 77 /// 78 /// Create new generator using global localization_backend_manager 79 /// 80 generator(); 81 /// 82 /// Create new generator using specific localization_backend_manager 83 /// 84 generator(localization_backend_manager const &); 85 86 ~generator(); 87 88 /// 89 /// Set types of facets that should be generated, default all 90 /// 91 void categories(locale_category_type cats); 92 /// 93 /// Get types of facets that should be generated, default all 94 /// 95 locale_category_type categories() const; 96 97 /// 98 /// Set the characters type for which the facets should be generated, default all supported 99 /// 100 void characters(character_facet_type chars); 101 /// 102 /// Get the characters type for which the facets should be generated, default all supported 103 /// 104 character_facet_type characters() const; 105 106 /// 107 /// Add a new domain of messages that would be generated. It should be set in order to enable 108 /// messages support. 109 /// 110 /// Messages domain has following format: "name" or "name/encoding" 111 /// where name is the base name of the "mo" file where the catalog is stored 112 /// without ".mo" extension. For example for file \c /usr/share/locale/he/LC_MESSAGES/blog.mo 113 /// it would be \c blog. 114 /// 115 /// You can optionally specify the encoding of the keys in the sources by adding "/encoding_name" 116 /// For example blog/cp1255. 117 /// 118 /// If not defined all keys are assumed to be UTF-8 encoded. 119 /// 120 /// \note When you select a domain for the program using dgettext or message API, you 121 /// do not specify the encoding part. So for example if the provided 122 /// domain name was "blog/windows-1255" then for translation 123 /// you should use dgettext("blog","Hello") 124 /// 125 /// 126 void add_messages_domain(std::string const &domain); 127 /// 128 /// Set default message domain. If this member was not called, the first added messages domain is used. 129 /// If the domain \a domain is not added yet it is added. 130 /// 131 void set_default_messages_domain(std::string const &domain); 132 133 /// 134 /// Remove all added domains from the list 135 /// 136 void clear_domains(); 137 138 /// 139 /// Add a search path where dictionaries are looked in. 140 /// 141 /// \note 142 /// 143 /// - Under the Windows platform the path is treated as a path in the locale's encoding so 144 /// if you create locale "en_US.windows-1251" then path would be treated as cp1255, 145 /// and if it is en_US.UTF-8 it is treated as UTF-8. File name is always opened with 146 /// a wide file name as wide file names are the native file name on Windows. 147 /// 148 /// - Under POSIX platforms all paths passed as-is regardless of encoding as narrow 149 /// encodings are the native encodings for POSIX platforms. 150 /// 151 /// 152 void add_messages_path(std::string const &path); 153 154 /// 155 /// Remove all added paths 156 /// 157 void clear_paths(); 158 159 /// 160 /// Remove all cached locales 161 /// 162 void clear_cache(); 163 164 /// 165 /// Turn locale caching ON 166 /// 167 void locale_cache_enabled(bool on); 168 169 /// 170 /// Get locale cache option 171 /// 172 bool locale_cache_enabled() const; 173 174 /// 175 /// Check if by default ANSI encoding is selected or UTF-8 onces. The default is false. 176 /// 177 bool use_ansi_encoding() const; 178 179 /// 180 /// Select ANSI encodings as default system encoding rather then UTF-8 by default 181 /// under Windows. 182 /// 183 /// The default is the most portable and most powerful encoding, UTF-8, but the user 184 /// can select "system" one if dealing with legacy applications 185 /// 186 void use_ansi_encoding(bool enc); 187 188 /// 189 /// Generate a locale with id \a id 190 /// 191 std::locale generate(std::string const &id) const; 192 /// 193 /// Generate a locale with id \a id. Use \a base as a locale to which all facets are added, 194 /// instead of std::locale::classic(). 195 /// 196 std::locale generate(std::locale const &base,std::string const &id) const; 197 /// 198 /// Shortcut to generate(id) 199 /// operator ()(std::string const & id) const200 std::locale operator()(std::string const &id) const 201 { 202 return generate(id); 203 } 204 205 /// 206 /// Set backend specific option 207 /// 208 void set_option(std::string const &name,std::string const &value); 209 210 /// 211 /// Clear backend specific options 212 /// 213 void clear_options(); 214 215 private: 216 217 void set_all_options(shared_ptr<localization_backend> backend,std::string const &id) const; 218 219 generator(generator const &); 220 void operator=(generator const &); 221 222 struct data; 223 std::auto_ptr<data> d; 224 }; 225 226 } 227 } 228 #ifdef BOOST_MSVC 229 #pragma warning(pop) 230 #endif 231 232 233 #endif 234 // vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 235 236