13
13
#define ZYPP_LOCALE_H
17
#include "zypp/base/PtrTypes.h"
18
#include "zypp/base/Tr1hash.h"
20
#include "zypp/IdString.h"
18
#include "zypp/base/Hash.h"
20
#include "zypp/IdStringType.h"
21
21
#include "zypp/LanguageCode.h"
22
22
#include "zypp/CountryCode.h"
24
24
///////////////////////////////////////////////////////////////////
26
{ /////////////////////////////////////////////////////////////////
29
typedef std::tr1::unordered_set<Locale> LocaleSet;
28
typedef std::unordered_set<Locale> LocaleSet;
31
30
///////////////////////////////////////////////////////////////////
33
// CLASS NAME : Locale
36
* \todo migrate to IdString
32
/// \brief 'Language[_Country]' codes.
34
/// In fact the class will not prevent to use a non iso code.
35
/// Just a warning will appear in the log. Construction from string
36
/// consider everything up to the first \c '.' or \c '@'.
38
/// Locale l( "de_DE.UTF-8" );
40
/// l.code() == "de_DE";
41
/// l.language() == "de";
42
/// l.country() == "DE";
44
/// l.fallback() == "de";
45
/// l.fallback().fallback() == Locale::enCode == "en";
46
/// l.fallback().fallback().fallback() == Locale::noCode == "";
48
///////////////////////////////////////////////////////////////////
49
class Locale : public IdStringType<Locale>
40
friend std::ostream & operator<<( std::ostream & str, const Locale & obj );
52
/** Default Ctor: \ref noCode */
50
/** Ctor taking a string. */
52
Locale( IdString code_r );
55
Locale( const std::string & code_r );
58
Locale( const char * code_r );
55
/** Ctor from string. */
56
explicit Locale( IdString str_r );
58
/** Ctor from string. */
59
explicit Locale( const std::string & str_r );
61
/** Ctor from string. */
62
explicit Locale( const char * str_r );
60
64
/** Ctor taking LanguageCode and optional CountryCode. */
61
Locale( const LanguageCode & language_r,
62
const CountryCode & country_r = CountryCode() );
65
Locale( LanguageCode language_r, CountryCode country_r = CountryCode() );
68
71
/** \name Locale constants. */
70
/** No or empty code. */
71
74
static const Locale noCode;
76
/** Last resort "en". */
77
static const Locale enCode;
76
const LanguageCode & language() const;
78
const CountryCode & country() const;
80
/** Return the locale code. */
81
std::string code() const;
83
/** Return the name made of language and country name. */
81
/** The language part. */
82
LanguageCode language() const;
84
/** The county part.*/
85
CountryCode country() const;
87
/** Return the locale code asString. */
88
std::string code() const
89
{ return std::string(_str); }
91
/** Return the translated locale name. */
84
92
std::string name() const;
86
/** Return a fallback locale for this locale, when giving up, returns empty Locale() */
95
/** Return the fallback locale for this locale, if no fallback exists the empty Locale::noCode.
96
* The usual fallback sequence is "language_COUNTRY" -> "language" -> Locale::enCode ("en")
97
* ->Locale::noCode (""). Some exceptions like "pt_BR"->"en"->"" do exist.
87
99
Locale fallback() const;
91
/** Return the best match for \ref Locale \c requested_r within the available \c avLocales_r.
93
* If \c requested_r is nor specified or equals \ref Locale::noCode,
94
* \ref ZConfig::textLocale is assumed.
96
* If neither \c requested_r nor any of it's \ref fallback locales
97
* are available, \ref Locale::noCode is returned.
99
static Locale bestMatch( const LocaleSet & avLocales_r, const Locale & requested_r = Locale() );
101
/** Return the best match for \ref Locale \a requested_r within the available \a avLocales_r.
103
* If \a requested_r is not specified \ref ZConfig::textLocale is assumed.
105
* If neither \c requested_r nor any of it's \ref fallback locales are available
106
* in \a avLocales_r, \ref Locale::noCode is returned.
108
static Locale bestMatch( const LocaleSet & avLocales_r, Locale requested_r = Locale() );
102
/** Pointer to implementation */
103
RW_pointer<Impl> _pimpl;
111
friend class IdStringType<Locale>;
105
///////////////////////////////////////////////////////////////////
107
/** \relates Locale Stream output */
108
inline std::ostream & operator<<( std::ostream & str, const Locale & obj )
109
{ return str << obj.code(); }
111
/** Comparison based on string value. */
113
/** \relates Locale */
114
inline bool operator==( const Locale & lhs, const Locale & rhs ) {
115
return( lhs.code() == rhs.code() );
117
/** \relates Locale */
118
inline bool operator==( const std::string & lhs, const Locale & rhs ) {
119
return( lhs == rhs.code() );
121
/** \relates Locale */
122
inline bool operator==( const Locale & lhs, const std::string & rhs ) {
123
return( lhs.code() == rhs );
126
/** \relates Locale */
127
inline bool operator!=( const Locale & lhs, const Locale & rhs ) {
128
return( ! operator==( lhs, rhs ) );
130
/** \relates Locale */
131
inline bool operator!=( const std::string & lhs, const Locale & rhs ) {
132
return( ! operator==( lhs, rhs ) );
134
/** \relates Locale */
135
inline bool operator!=( const Locale & lhs, const std::string & rhs ) {
136
return( ! operator==( lhs, rhs ) );
140
/////////////////////////////////////////////////////////////////
141
114
} // namespace zypp
142
115
///////////////////////////////////////////////////////////////////
144
namespace std { namespace tr1 {
145
/** \relates ::zypp::Locale hash function */
146
template<> struct hash< ::zypp::Locale>
148
size_t operator()( const ::zypp::Locale & __s ) const
149
{ return hash<std::string>()(__s.code()); }
117
ZYPP_DEFINE_ID_HASHABLE( ::zypp::Locale );
153
///////////////////////////////////////////////////////////////////
155
{ /////////////////////////////////////////////////////////////////
156
/** \relates zypp::Locale Default order for std::container based on code string value.*/
158
inline bool less<zypp::Locale>::operator()( const zypp::Locale & lhs, const zypp::Locale & rhs ) const
159
{ return lhs.code() < rhs.code(); }
160
/////////////////////////////////////////////////////////////////
162
///////////////////////////////////////////////////////////////////
163
119
#endif // ZYPP_LOCALE_H