2 // Copyright (c) 2009-2011 Artyom Beilis (Tonkikh)
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)
8 #define BOOST_LOCALE_SOURCE
9 #include <boost/locale/generator.hpp>
10 #include <boost/locale/encoding.hpp>
11 #include <boost/locale/localization_backend.hpp>
15 #include <boost/shared_ptr.hpp>
16 #include <boost/thread/locks.hpp>
17 #include <boost/thread/mutex.hpp>
21 struct generator::data
{
22 data(localization_backend_manager
const &mgr
) :
24 chars(all_characters
),
25 caching_enabled(false),
26 use_ansi_encoding(false),
31 typedef std::map
<std::string
,std::locale
> cached_type
;
32 mutable cached_type cached
;
33 mutable boost::mutex cached_lock
;
35 locale_category_type cats
;
36 character_facet_type chars
;
39 bool use_ansi_encoding
;
41 std::vector
<std::string
> paths
;
42 std::vector
<std::string
> domains
;
44 std::map
<std::string
,std::vector
<std::string
> > options
;
46 localization_backend_manager backend_manager
;
50 generator::generator(localization_backend_manager
const &mgr
) :
51 d(new generator::data(mgr
))
54 generator::generator() :
55 d(new generator::data(localization_backend_manager::global()))
58 generator::~generator()
62 locale_category_type
generator::categories() const
66 void generator::categories(locale_category_type t
)
71 void generator::characters(character_facet_type t
)
76 character_facet_type
generator::characters() const
81 void generator::add_messages_domain(std::string
const &domain
)
83 if(std::find(d
->domains
.begin(),d
->domains
.end(),domain
) == d
->domains
.end())
84 d
->domains
.push_back(domain
);
87 void generator::set_default_messages_domain(std::string
const &domain
)
89 std::vector
<std::string
>::iterator p
;
90 if((p
=std::find(d
->domains
.begin(),d
->domains
.end(),domain
)) != d
->domains
.end()) {
93 d
->domains
.insert(d
->domains
.begin(),domain
);
96 void generator::clear_domains()
100 void generator::add_messages_path(std::string
const &path
)
102 d
->paths
.push_back(path
);
104 void generator::clear_paths()
108 void generator::clear_cache()
113 std::locale
generator::generate(std::string
const &id
) const
115 std::locale base
=std::locale::classic();
117 return generate(base
,id
);
120 std::locale
generator::generate(std::locale
const &base
,std::string
const &id
) const
122 if(d
->caching_enabled
) {
123 boost::unique_lock
<boost::mutex
> guard(d
->cached_lock
);
124 data::cached_type::const_iterator p
= d
->cached
.find(id
);
125 if(p
!=d
->cached
.end()) {
129 shared_ptr
<localization_backend
> backend(d
->backend_manager
.create());
130 set_all_options(backend
,id
);
132 std::locale result
= base
;
133 locale_category_type facets
= d
->cats
;
134 character_facet_type chars
= d
->chars
;
136 for(locale_category_type facet
= per_character_facet_first
; facet
<= per_character_facet_last
&& facet
!=0; facet
<<=1) {
137 if(!(facets
& facet
))
139 for(character_facet_type ch
= character_first_facet
; ch
<=character_last_facet
;ch
<<=1) {
142 result
= backend
->install(result
,facet
,ch
);
145 for(locale_category_type facet
= non_character_facet_first
; facet
<= non_character_facet_last
&& facet
!=0; facet
<<=1) {
146 if(!(facets
& facet
))
148 result
= backend
->install(result
,facet
);
150 if(d
->caching_enabled
) {
151 boost::unique_lock
<boost::mutex
> guard(d
->cached_lock
);
152 data::cached_type::const_iterator p
= d
->cached
.find(id
);
153 if(p
==d
->cached
.end()) {
154 d
->cached
[id
] = result
;
160 bool generator::use_ansi_encoding() const
162 return d
->use_ansi_encoding
;
165 void generator::use_ansi_encoding(bool v
)
167 d
->use_ansi_encoding
= v
;
170 bool generator::locale_cache_enabled() const
172 return d
->caching_enabled
;
174 void generator::locale_cache_enabled(bool enabled
)
176 d
->caching_enabled
= enabled
;
179 void generator::set_all_options(shared_ptr
<localization_backend
> backend
,std::string
const &id
) const
181 backend
->set_option("locale",id
);
182 if(d
->use_ansi_encoding
)
183 backend
->set_option("use_ansi_encoding","true");
184 for(size_t i
=0;i
<d
->domains
.size();i
++)
185 backend
->set_option("message_application",d
->domains
[i
]);
186 for(size_t i
=0;i
<d
->paths
.size();i
++)
187 backend
->set_option("message_path",d
->paths
[i
]);
192 // vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4