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