1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/Locale.cc
15 #include "zypp/Locale.h"
19 ///////////////////////////////////////////////////////////////////
21 { /////////////////////////////////////////////////////////////////
23 typedef std::map<std::string, std::string> OtherDefaultLanguage;
24 static OtherDefaultLanguage otherDefaultLanguage;
26 ///////////////////////////////////////////////////////////////////
28 // CLASS NAME : Locale::Impl
30 /** Locale implementation. */
36 Impl( const std::string & code_r )
39 std::string::size_type sep = code_r.find_first_of( "@." );
40 if ( sep == std::string::npos ) {
43 t = code_r.substr( 0, sep );
47 if ( sep == std::string::npos ) {
48 _language = LanguageCode( t );
50 _language = LanguageCode( t.substr( 0, sep ) );
51 _country = CountryCode( t.substr( sep+1 ) );
55 Impl( const LanguageCode & language_r,
56 const CountryCode & country_r )
57 : _language( language_r )
58 , _country( country_r )
61 const LanguageCode & language() const
64 const CountryCode & country() const
67 std::string code() const
69 std::string ret( _language.code() );
70 if ( _country.hasCode() )
71 ret += "_" + _country.code();
75 std::string name() const
77 std::string ret( _language.name() );
78 if ( _country.hasCode() )
79 ret += " (" + _country.name() + ")";
83 Locale fallback() const
85 if (otherDefaultLanguage.size() == 0) {
86 // initial inserting map
87 otherDefaultLanguage["pt_BR"] = "en";
90 if (otherDefaultLanguage.find(code()) != otherDefaultLanguage.end())
91 return LanguageCode(otherDefaultLanguage[code()]);
93 if ( _country.hasCode() )
96 if ( _language.hasCode() && _language != LanguageCode("en") )
97 return LanguageCode("en");
104 LanguageCode _language;
105 CountryCode _country;
108 /** Offer default Impl. */
109 static shared_ptr<Impl> nullimpl()
111 static shared_ptr<Impl> _nullimpl( new Impl );
115 ///////////////////////////////////////////////////////////////////
117 /** \relates Locale::Impl Stream output */
118 inline std::ostream & operator<<( std::ostream & str, const Locale::Impl & obj )
120 return str << "Locale::Impl";
123 ///////////////////////////////////////////////////////////////////
125 // CLASS NAME : Locale
127 ///////////////////////////////////////////////////////////////////
129 const Locale Locale::noCode;
131 ///////////////////////////////////////////////////////////////////
133 // METHOD NAME : Locale::Locale
134 // METHOD TYPE : Ctor
137 : _pimpl( Impl::nullimpl() )
140 ///////////////////////////////////////////////////////////////////
142 // METHOD NAME : Locale::Locale
143 // METHOD TYPE : Ctor
145 Locale::Locale( const std::string & code_r )
146 : _pimpl( new Impl( code_r ) )
149 ///////////////////////////////////////////////////////////////////
151 // METHOD NAME : Locale::Locale
152 // METHOD TYPE : Ctor
154 Locale::Locale( const LanguageCode & language_r,
155 const CountryCode & country_r )
156 : _pimpl( new Impl( language_r, country_r ) )
159 ///////////////////////////////////////////////////////////////////
161 // METHOD NAME : Locale::~Locale
162 // METHOD TYPE : Dtor
167 ///////////////////////////////////////////////////////////////////
169 // METHOD NAME : Locale::
172 const LanguageCode & Locale::language() const
173 { return _pimpl->language(); }
175 ///////////////////////////////////////////////////////////////////
177 // METHOD NAME : Locale::
180 const CountryCode & Locale::country() const
181 { return _pimpl->country(); }
183 ///////////////////////////////////////////////////////////////////
185 // METHOD NAME : Locale::
188 std::string Locale::code() const
189 { return _pimpl->code(); }
191 ///////////////////////////////////////////////////////////////////
193 // METHOD NAME : Locale::
196 std::string Locale::name() const
197 { return _pimpl->name(); }
199 ///////////////////////////////////////////////////////////////////
201 // METHOD NAME : Locale::
204 Locale Locale::fallback() const
205 { return _pimpl->fallback(); }
206 /////////////////////////////////////////////////////////////////
208 ///////////////////////////////////////////////////////////////////