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/localization_backend.hpp>
10 #include <boost/locale/gnu_gettext.hpp>
11 #include <boost/locale/util.hpp>
12 #include "all_generator.hpp"
14 #include "icu_backend.hpp"
15 #include "../util/locale_data.hpp"
19 #include <unicode/ucnv.h>
24 class icu_localization_backend
: public localization_backend
{
26 icu_localization_backend() :
28 use_ansi_encoding_(false)
31 icu_localization_backend(icu_localization_backend
const &other
) :
32 localization_backend(),
34 domains_(other
.domains_
),
35 locale_id_(other
.locale_id_
),
37 use_ansi_encoding_(other
.use_ansi_encoding_
)
40 virtual icu_localization_backend
*clone() const
42 return new icu_localization_backend(*this);
45 void set_option(std::string
const &name
,std::string
const &value
)
50 else if(name
=="message_path")
51 paths_
.push_back(value
);
52 else if(name
=="message_application")
53 domains_
.push_back(value
);
54 else if(name
=="use_ansi_encoding")
55 use_ansi_encoding_
= value
== "true";
61 use_ansi_encoding_
= false;
72 real_id_
= locale_id_
;
73 if(real_id_
.empty()) {
74 bool utf8
= ! use_ansi_encoding_
;
75 real_id_
= util::get_system_locale(utf8
);
81 data_
.locale
= icu::Locale::createCanonical(real_id_
.c_str());
82 data_
.encoding
= d
.encoding
;
84 language_
= d
.language
;
89 virtual std::locale
install(std::locale
const &base
,
90 locale_category_type category
,
91 character_facet_type type
= nochar_facet
)
97 return create_convert(base
,data_
,type
);
99 return create_collate(base
,data_
,type
);
100 case formatting_facet
:
101 return create_formatting(base
,data_
,type
);
103 return create_parsing(base
,data_
,type
);
105 return create_codecvt(base
,data_
.encoding
,type
);
108 gnu_gettext::messages_info minf
;
109 minf
.language
= language_
;
110 minf
.country
= country_
;
111 minf
.variant
= variant_
;
112 minf
.encoding
= data_
.encoding
;
113 std::copy(domains_
.begin(),domains_
.end(),std::back_inserter
<gnu_gettext::messages_info::domains_type
>(minf
.domains
));
117 return std::locale(base
,gnu_gettext::create_messages_facet
<char>(minf
));
119 return std::locale(base
,gnu_gettext::create_messages_facet
<wchar_t>(minf
));
120 #ifdef BOOST_LOCALE_ENABLE_CHAR16_T
122 return std::locale(base
,gnu_gettext::create_messages_facet
<char16_t
>(minf
));
124 #ifdef BOOST_LOCALE_ENABLE_CHAR32_T
126 return std::locale(base
,gnu_gettext::create_messages_facet
<char32_t
>(minf
));
133 return create_boundary(base
,data_
,type
);
135 return create_calendar(base
,data_
);
136 case information_facet
:
137 return util::create_info(base
,real_id_
);
145 std::vector
<std::string
> paths_
;
146 std::vector
<std::string
> domains_
;
147 std::string locale_id_
;
150 std::string language_
;
151 std::string country_
;
152 std::string variant_
;
153 std::string real_id_
;
155 bool use_ansi_encoding_
;
158 localization_backend
*create_localization_backend()
160 return new icu_localization_backend();
166 // vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4