]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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 | /// | |
200 | 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 |