Mercurial > babel > old > babel-test
annotate babel/core.py @ 151:f21c0725cdb4 stable-0.8.x
Merged [141:143] and [145:153] via svnmerge from [source:/trunk].
author | cmlenz |
---|---|
date | Wed, 20 Jun 2007 20:59:10 +0000 |
parents | b75ae5def3b1 |
children | e1985b8cdcd6 |
rev | line source |
---|---|
1 | 1 # -*- coding: utf-8 -*- |
2 # | |
12
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
9
diff
changeset
|
3 # Copyright (C) 2007 Edgewall Software |
1 | 4 # All rights reserved. |
5 # | |
6 # This software is licensed as described in the file COPYING, which | |
7 # you should have received as part of this distribution. The terms | |
8 # are also available at http://babel.edgewall.org/wiki/License. | |
9 # | |
10 # This software consists of voluntary contributions made by many | |
11 # individuals. For the exact contribution history, see the revision | |
12 # history and logs, available at http://babel.edgewall.org/log/. | |
13 | |
72
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
14 """Core locale representation and locale data access.""" |
1 | 15 |
39
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
16 import os |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
17 |
26
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
18 from babel import localedata |
1 | 19 |
72
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
20 __all__ = ['UnknownLocaleError', 'Locale', 'default_locale', 'negotiate_locale', |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
21 'parse_locale'] |
1 | 22 __docformat__ = 'restructuredtext en' |
23 | |
24 | |
31 | 25 class UnknownLocaleError(Exception): |
26 """Exception thrown when a locale is requested for which no locale data | |
27 is available. | |
28 """ | |
29 | |
30 def __init__(self, identifier): | |
31 """Create the exception. | |
32 | |
33 :param identifier: the identifier string of the unsupported locale | |
34 """ | |
35 Exception.__init__(self, 'unknown locale %r' % identifier) | |
36 self.identifier = identifier | |
37 | |
38 | |
1 | 39 class Locale(object): |
40 """Representation of a specific locale. | |
41 | |
42 >>> locale = Locale('en', territory='US') | |
43 >>> repr(locale) | |
44 '<Locale "en_US">' | |
45 >>> locale.display_name | |
46 u'English (United States)' | |
47 | |
48 A `Locale` object can also be instantiated from a raw locale string: | |
49 | |
50 >>> locale = Locale.parse('en-US', sep='-') | |
51 >>> repr(locale) | |
52 '<Locale "en_US">' | |
53 | |
54 `Locale` objects provide access to a collection of locale data, such as | |
55 territory and language names, number and date format patterns, and more: | |
56 | |
57 >>> locale.number_symbols['decimal'] | |
58 u'.' | |
31 | 59 |
60 If a locale is requested for which no locale data is available, an | |
61 `UnknownLocaleError` is raised: | |
62 | |
63 >>> Locale.parse('en_DE') | |
64 Traceback (most recent call last): | |
65 ... | |
66 UnknownLocaleError: unknown locale 'en_DE' | |
1 | 67 |
68 :see: `IETF RFC 3066 <http://www.ietf.org/rfc/rfc3066.txt>`_ | |
69 """ | |
70 | |
71 def __init__(self, language, territory=None, variant=None): | |
72 """Initialize the locale object from the given identifier components. | |
73 | |
74 >>> locale = Locale('en', 'US') | |
75 >>> locale.language | |
76 'en' | |
77 >>> locale.territory | |
78 'US' | |
79 | |
80 :param language: the language code | |
81 :param territory: the territory (country or region) code | |
82 :param variant: the variant code | |
31 | 83 :raise `UnknownLocaleError`: if no locale data is available for the |
84 requested locale | |
1 | 85 """ |
86 self.language = language | |
87 self.territory = territory | |
88 self.variant = variant | |
41
e967fbafcda1
Load locale data lazily to avoid penalizing usage of `Locale` objects when no locale data is actually needed.
cmlenz
parents:
39
diff
changeset
|
89 self.__data = None |
e967fbafcda1
Load locale data lazily to avoid penalizing usage of `Locale` objects when no locale data is actually needed.
cmlenz
parents:
39
diff
changeset
|
90 |
31 | 91 identifier = str(self) |
41
e967fbafcda1
Load locale data lazily to avoid penalizing usage of `Locale` objects when no locale data is actually needed.
cmlenz
parents:
39
diff
changeset
|
92 if not localedata.exists(identifier): |
31 | 93 raise UnknownLocaleError(identifier) |
1 | 94 |
39
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
95 def default(cls, category=None): |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
96 """Return the system default locale for the specified category. |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
97 |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
98 >>> for name in ['LANGUAGE', 'LC_ALL', 'LC_CTYPE']: |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
99 ... os.environ[name] = '' |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
100 >>> os.environ['LANG'] = 'fr_FR.UTF-8' |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
101 >>> Locale.default('LC_MESSAGES') |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
102 <Locale "fr_FR"> |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
103 |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
104 :param category: one of the ``LC_XXX`` environment variable names |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
105 :return: the value of the variable, or any of the fallbacks |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
106 (``LANGUAGE``, ``LC_ALL``, ``LC_CTYPE``, and ``LANG``) |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
107 :rtype: `Locale` |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
108 """ |
72
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
109 return cls(default_locale(category)) |
39
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
110 default = classmethod(default) |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
111 |
72
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
112 def negotiate(cls, preferred, available, sep='_'): |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
113 """Find the best match between available and requested locale strings. |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
114 |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
115 >>> Locale.negotiate(['de_DE', 'en_US'], ['de_DE', 'de_AT']) |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
116 <Locale "de_DE"> |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
117 >>> Locale.negotiate(['de_DE', 'en_US'], ['en', 'de']) |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
118 <Locale "de"> |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
119 >>> Locale.negotiate(['de_DE', 'de'], ['en_US']) |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
120 |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
121 :param preferred: the list of locale identifers preferred by the user |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
122 :param available: the list of locale identifiers available |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
123 :return: the `Locale` object for the best match, or `None` if no match |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
124 was found |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
125 :rtype: `Locale` |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
126 """ |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
127 identifier = negotiate_locale(preferred, available, sep=sep) |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
128 if identifier: |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
129 return Locale.parse(identifier) |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
130 negotiate = classmethod(negotiate) |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
131 |
1 | 132 def parse(cls, identifier, sep='_'): |
133 """Create a `Locale` instance for the given locale identifier. | |
134 | |
135 >>> l = Locale.parse('de-DE', sep='-') | |
136 >>> l.display_name | |
137 u'Deutsch (Deutschland)' | |
138 | |
139 If the `identifier` parameter is not a string, but actually a `Locale` | |
140 object, that object is returned: | |
141 | |
142 >>> Locale.parse(l) | |
143 <Locale "de_DE"> | |
144 | |
145 :param identifier: the locale identifier string | |
146 :param sep: optional component separator | |
147 :return: a corresponding `Locale` instance | |
148 :rtype: `Locale` | |
149 :raise `ValueError`: if the string does not appear to be a valid locale | |
150 identifier | |
31 | 151 :raise `UnknownLocaleError`: if no locale data is available for the |
152 requested locale | |
1 | 153 """ |
154 if type(identifier) is cls: | |
155 return identifier | |
72
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
156 return cls(*parse_locale(identifier, sep=sep)) |
1 | 157 parse = classmethod(parse) |
158 | |
72
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
159 def __eq__(self, other): |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
160 return str(self) == str(other) |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
161 |
1 | 162 def __repr__(self): |
163 return '<Locale "%s">' % str(self) | |
164 | |
165 def __str__(self): | |
166 return '_'.join(filter(None, [self.language, self.territory, | |
167 self.variant])) | |
168 | |
41
e967fbafcda1
Load locale data lazily to avoid penalizing usage of `Locale` objects when no locale data is actually needed.
cmlenz
parents:
39
diff
changeset
|
169 def _data(self): |
e967fbafcda1
Load locale data lazily to avoid penalizing usage of `Locale` objects when no locale data is actually needed.
cmlenz
parents:
39
diff
changeset
|
170 if self.__data is None: |
e967fbafcda1
Load locale data lazily to avoid penalizing usage of `Locale` objects when no locale data is actually needed.
cmlenz
parents:
39
diff
changeset
|
171 self.__data = localedata.load(str(self)) |
e967fbafcda1
Load locale data lazily to avoid penalizing usage of `Locale` objects when no locale data is actually needed.
cmlenz
parents:
39
diff
changeset
|
172 return self.__data |
e967fbafcda1
Load locale data lazily to avoid penalizing usage of `Locale` objects when no locale data is actually needed.
cmlenz
parents:
39
diff
changeset
|
173 _data = property(_data) |
e967fbafcda1
Load locale data lazily to avoid penalizing usage of `Locale` objects when no locale data is actually needed.
cmlenz
parents:
39
diff
changeset
|
174 |
1 | 175 def display_name(self): |
176 retval = self.languages.get(self.language) | |
177 if self.territory: | |
178 variant = '' | |
179 if self.variant: | |
180 variant = ', %s' % self.variants.get(self.variant) | |
41
e967fbafcda1
Load locale data lazily to avoid penalizing usage of `Locale` objects when no locale data is actually needed.
cmlenz
parents:
39
diff
changeset
|
181 retval += ' (%s%s)' % (self.territories.get(self.territory), |
e967fbafcda1
Load locale data lazily to avoid penalizing usage of `Locale` objects when no locale data is actually needed.
cmlenz
parents:
39
diff
changeset
|
182 variant) |
1 | 183 return retval |
184 display_name = property(display_name, doc="""\ | |
185 The localized display name of the locale. | |
186 | |
187 >>> Locale('en').display_name | |
188 u'English' | |
189 >>> Locale('en', 'US').display_name | |
190 u'English (United States)' | |
41
e967fbafcda1
Load locale data lazily to avoid penalizing usage of `Locale` objects when no locale data is actually needed.
cmlenz
parents:
39
diff
changeset
|
191 >>> Locale('sv').display_name |
e967fbafcda1
Load locale data lazily to avoid penalizing usage of `Locale` objects when no locale data is actually needed.
cmlenz
parents:
39
diff
changeset
|
192 u'svenska' |
1 | 193 |
194 :type: `unicode` | |
195 """) | |
196 | |
53 | 197 def english_name(self): |
198 en = Locale('en') | |
199 retval = en.languages.get(self.language) | |
200 if self.territory: | |
201 variant = '' | |
202 if self.variant: | |
203 variant = ', %s' % en.variants.get(self.variant) | |
204 retval += ' (%s%s)' % (en.territories.get(self.territory), | |
205 variant) | |
206 return retval | |
207 english_name = property(english_name, doc="""\ | |
208 The english display name of the locale. | |
209 | |
210 >>> Locale('de').english_name | |
211 u'German' | |
212 >>> Locale('de', 'DE').english_name | |
213 u'German (Germany)' | |
214 | |
215 :type: `unicode` | |
216 """) | |
217 | |
8
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
218 #{ General Locale Display Names |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
219 |
1 | 220 def languages(self): |
221 return self._data['languages'] | |
222 languages = property(languages, doc="""\ | |
223 Mapping of language codes to translated language names. | |
224 | |
225 >>> Locale('de', 'DE').languages['ja'] | |
226 u'Japanisch' | |
227 | |
228 :type: `dict` | |
229 :see: `ISO 639 <http://www.loc.gov/standards/iso639-2/>`_ | |
230 """) | |
231 | |
232 def scripts(self): | |
233 return self._data['scripts'] | |
234 scripts = property(scripts, doc="""\ | |
235 Mapping of script codes to translated script names. | |
236 | |
237 >>> Locale('en', 'US').scripts['Hira'] | |
238 u'Hiragana' | |
239 | |
240 :type: `dict` | |
241 :see: `ISO 15924 <http://www.evertype.com/standards/iso15924/>`_ | |
242 """) | |
243 | |
244 def territories(self): | |
245 return self._data['territories'] | |
246 territories = property(territories, doc="""\ | |
247 Mapping of script codes to translated script names. | |
248 | |
249 >>> Locale('es', 'CO').territories['DE'] | |
250 u'Alemania' | |
251 | |
252 :type: `dict` | |
253 :see: `ISO 3166 <http://www.iso.org/iso/en/prods-services/iso3166ma/>`_ | |
254 """) | |
255 | |
256 def variants(self): | |
257 return self._data['variants'] | |
258 variants = property(variants, doc="""\ | |
259 Mapping of script codes to translated script names. | |
260 | |
261 >>> Locale('de', 'DE').variants['1901'] | |
262 u'alte deutsche Rechtschreibung' | |
263 | |
264 :type: `dict` | |
265 """) | |
266 | |
8
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
267 #{ Number Formatting |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
268 |
26
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
269 def currencies(self): |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
270 return self._data['currency_names'] |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
271 currencies = property(currencies, doc="""\ |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
272 Mapping of currency codes to translated currency names. |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
273 |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
274 >>> Locale('en').currencies['COP'] |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
275 u'Colombian Peso' |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
276 >>> Locale('de', 'DE').currencies['COP'] |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
277 u'Kolumbianischer Peso' |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
278 |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
279 :type: `dict` |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
280 """) |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
281 |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
282 def currency_symbols(self): |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
283 return self._data['currency_symbols'] |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
284 currency_symbols = property(currency_symbols, doc="""\ |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
285 Mapping of currency codes to symbols. |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
286 |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
287 >>> Locale('en').currency_symbols['USD'] |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
288 u'US$' |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
289 >>> Locale('en', 'US').currency_symbols['USD'] |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
290 u'$' |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
291 |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
292 :type: `dict` |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
293 """) |
710090104678
* Reduce size of locale data pickles by only storing the data provided by each locale itself, and merging inherited data at runtime.
cmlenz
parents:
22
diff
changeset
|
294 |
1 | 295 def number_symbols(self): |
296 return self._data['number_symbols'] | |
297 number_symbols = property(number_symbols, doc="""\ | |
298 Symbols used in number formatting. | |
299 | |
300 >>> Locale('fr', 'FR').number_symbols['decimal'] | |
301 u',' | |
302 | |
303 :type: `dict` | |
304 """) | |
305 | |
12
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
9
diff
changeset
|
306 def decimal_formats(self): |
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
9
diff
changeset
|
307 return self._data['decimal_formats'] |
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
9
diff
changeset
|
308 decimal_formats = property(decimal_formats, doc="""\ |
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
9
diff
changeset
|
309 Locale patterns for decimal number formatting. |
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
9
diff
changeset
|
310 |
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
9
diff
changeset
|
311 >>> Locale('en', 'US').decimal_formats[None] |
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
9
diff
changeset
|
312 <NumberPattern u'#,##0.###'> |
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
9
diff
changeset
|
313 |
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
9
diff
changeset
|
314 :type: `dict` |
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
9
diff
changeset
|
315 """) |
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
9
diff
changeset
|
316 |
125 | 317 def currency_formats(self): |
318 return self._data['currency_formats'] | |
319 currency_formats = property(currency_formats, doc=r"""\ | |
320 Locale patterns for currency number formatting. | |
321 | |
322 >>> print Locale('en', 'US').currency_formats[None] | |
323 <NumberPattern u'\xa4#,##0.00'> | |
324 | |
325 :type: `dict` | |
326 """) | |
327 | |
22 | 328 def percent_formats(self): |
329 return self._data['percent_formats'] | |
330 percent_formats = property(percent_formats, doc="""\ | |
331 Locale patterns for percent number formatting. | |
332 | |
333 >>> Locale('en', 'US').percent_formats[None] | |
334 <NumberPattern u'#,##0%'> | |
335 | |
336 :type: `dict` | |
337 """) | |
338 | |
125 | 339 def scientific_formats(self): |
340 return self._data['scientific_formats'] | |
341 scientific_formats = property(scientific_formats, doc="""\ | |
342 Locale patterns for scientific number formatting. | |
343 | |
344 >>> Locale('en', 'US').scientific_formats[None] | |
345 <NumberPattern u'#E0'> | |
346 | |
347 :type: `dict` | |
348 """) | |
349 | |
8
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
350 #{ Calendar Information and Date Formatting |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
351 |
1 | 352 def periods(self): |
353 return self._data['periods'] | |
354 periods = property(periods, doc="""\ | |
355 Locale display names for day periods (AM/PM). | |
356 | |
357 >>> Locale('en', 'US').periods['am'] | |
358 u'AM' | |
359 | |
360 :type: `dict` | |
361 """) | |
362 | |
363 def days(self): | |
364 return self._data['days'] | |
365 days = property(days, doc="""\ | |
366 Locale display names for weekdays. | |
367 | |
15 | 368 >>> Locale('de', 'DE').days['format']['wide'][3] |
1 | 369 u'Donnerstag' |
370 | |
371 :type: `dict` | |
372 """) | |
373 | |
374 def months(self): | |
375 return self._data['months'] | |
376 months = property(months, doc="""\ | |
377 Locale display names for months. | |
378 | |
379 >>> Locale('de', 'DE').months['format']['wide'][10] | |
380 u'Oktober' | |
381 | |
382 :type: `dict` | |
383 """) | |
384 | |
385 def quarters(self): | |
386 return self._data['quarters'] | |
387 quarters = property(quarters, doc="""\ | |
388 Locale display names for quarters. | |
389 | |
390 >>> Locale('de', 'DE').quarters['format']['wide'][1] | |
391 u'1. Quartal' | |
392 | |
393 :type: `dict` | |
394 """) | |
395 | |
396 def eras(self): | |
397 return self._data['eras'] | |
398 eras = property(eras, doc="""\ | |
399 Locale display names for eras. | |
400 | |
401 >>> Locale('en', 'US').eras['wide'][1] | |
402 u'Anno Domini' | |
403 >>> Locale('en', 'US').eras['abbreviated'][0] | |
404 u'BC' | |
405 | |
406 :type: `dict` | |
407 """) | |
408 | |
28
11278622ede9
Import basic timezone info from CLDR (see #3). Still missing a couple other pieces in the puzzle.
cmlenz
parents:
26
diff
changeset
|
409 def time_zones(self): |
11278622ede9
Import basic timezone info from CLDR (see #3). Still missing a couple other pieces in the puzzle.
cmlenz
parents:
26
diff
changeset
|
410 return self._data['time_zones'] |
11278622ede9
Import basic timezone info from CLDR (see #3). Still missing a couple other pieces in the puzzle.
cmlenz
parents:
26
diff
changeset
|
411 time_zones = property(time_zones, doc="""\ |
11278622ede9
Import basic timezone info from CLDR (see #3). Still missing a couple other pieces in the puzzle.
cmlenz
parents:
26
diff
changeset
|
412 Locale display names for time zones. |
11278622ede9
Import basic timezone info from CLDR (see #3). Still missing a couple other pieces in the puzzle.
cmlenz
parents:
26
diff
changeset
|
413 |
11278622ede9
Import basic timezone info from CLDR (see #3). Still missing a couple other pieces in the puzzle.
cmlenz
parents:
26
diff
changeset
|
414 >>> Locale('en', 'US').time_zones['America/Los_Angeles']['long']['standard'] |
11278622ede9
Import basic timezone info from CLDR (see #3). Still missing a couple other pieces in the puzzle.
cmlenz
parents:
26
diff
changeset
|
415 u'Pacific Standard Time' |
11278622ede9
Import basic timezone info from CLDR (see #3). Still missing a couple other pieces in the puzzle.
cmlenz
parents:
26
diff
changeset
|
416 >>> Locale('en', 'US').time_zones['Europe/Dublin']['city'] |
11278622ede9
Import basic timezone info from CLDR (see #3). Still missing a couple other pieces in the puzzle.
cmlenz
parents:
26
diff
changeset
|
417 u'Dublin' |
11278622ede9
Import basic timezone info from CLDR (see #3). Still missing a couple other pieces in the puzzle.
cmlenz
parents:
26
diff
changeset
|
418 |
11278622ede9
Import basic timezone info from CLDR (see #3). Still missing a couple other pieces in the puzzle.
cmlenz
parents:
26
diff
changeset
|
419 :type: `dict` |
11278622ede9
Import basic timezone info from CLDR (see #3). Still missing a couple other pieces in the puzzle.
cmlenz
parents:
26
diff
changeset
|
420 """) |
11278622ede9
Import basic timezone info from CLDR (see #3). Still missing a couple other pieces in the puzzle.
cmlenz
parents:
26
diff
changeset
|
421 |
34 | 422 def zone_aliases(self): |
423 return self._data['zone_aliases'] | |
424 zone_aliases = property(zone_aliases, doc="""\ | |
425 Mapping of time zone aliases to their respective canonical identifer. | |
426 | |
427 >>> Locale('en').zone_aliases['UTC'] | |
428 'Etc/GMT' | |
429 | |
430 :type: `dict` | |
431 :note: this doesn't really belong here, as it does not change between | |
432 locales | |
433 """) | |
434 | |
8
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
435 def first_week_day(self): |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
436 return self._data['week_data']['first_day'] |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
437 first_week_day = property(first_week_day, doc="""\ |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
438 The first day of a week. |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
439 |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
440 >>> Locale('de', 'DE').first_week_day |
15 | 441 0 |
8
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
442 >>> Locale('en', 'US').first_week_day |
15 | 443 6 |
8
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
444 |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
445 :type: `int` |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
446 """) |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
447 |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
448 def weekend_start(self): |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
449 return self._data['week_data']['weekend_start'] |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
450 weekend_start = property(weekend_start, doc="""\ |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
451 The day the weekend starts. |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
452 |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
453 >>> Locale('de', 'DE').weekend_start |
15 | 454 5 |
8
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
455 |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
456 :type: `int` |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
457 """) |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
458 |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
459 def weekend_end(self): |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
460 return self._data['week_data']['weekend_end'] |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
461 weekend_end = property(weekend_end, doc="""\ |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
462 The day the weekend ends. |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
463 |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
464 >>> Locale('de', 'DE').weekend_end |
15 | 465 6 |
8
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
466 |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
467 :type: `int` |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
468 """) |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
469 |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
470 def min_week_days(self): |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
471 return self._data['week_data']['min_days'] |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
472 min_week_days = property(min_week_days, doc="""\ |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
473 The minimum number of days in a week so that the week is counted as the |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
474 first week of a year or month. |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
475 |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
476 >>> Locale('de', 'DE').min_week_days |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
477 4 |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
478 |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
479 :type: `int` |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
480 """) |
9132c9218745
Pull in some supplemental data from the CLDR, for things like the first day of the week.
cmlenz
parents:
1
diff
changeset
|
481 |
1 | 482 def date_formats(self): |
483 return self._data['date_formats'] | |
484 date_formats = property(date_formats, doc="""\ | |
485 Locale patterns for date formatting. | |
486 | |
487 >>> Locale('en', 'US').date_formats['short'] | |
12
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
9
diff
changeset
|
488 <DateTimePattern u'M/d/yy'> |
1 | 489 >>> Locale('fr', 'FR').date_formats['long'] |
12
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
9
diff
changeset
|
490 <DateTimePattern u'd MMMM yyyy'> |
1 | 491 |
492 :type: `dict` | |
493 """) | |
494 | |
495 def time_formats(self): | |
496 return self._data['time_formats'] | |
497 time_formats = property(time_formats, doc="""\ | |
498 Locale patterns for time formatting. | |
499 | |
500 >>> Locale('en', 'US').time_formats['short'] | |
12
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
9
diff
changeset
|
501 <DateTimePattern u'h:mm a'> |
1 | 502 >>> Locale('fr', 'FR').time_formats['long'] |
12
a2c54ef107c2
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
9
diff
changeset
|
503 <DateTimePattern u'HH:mm:ss z'> |
9 | 504 |
505 :type: `dict` | |
506 """) | |
507 | |
33 | 508 def datetime_formats(self): |
509 return self._data['datetime_formats'] | |
510 datetime_formats = property(datetime_formats, doc="""\ | |
511 Locale patterns for datetime formatting. | |
512 | |
513 >>> Locale('en').datetime_formats[None] | |
514 u'{1} {0}' | |
515 >>> Locale('th').datetime_formats[None] | |
516 u'{1}, {0}' | |
517 | |
518 :type: `dict` | |
519 """) | |
520 | |
1 | 521 |
72
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
522 def default_locale(category=None): |
39
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
523 """Returns the system default locale for a given category, based on |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
524 environment variables. |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
525 |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
526 >>> for name in ['LANGUAGE', 'LC_ALL', 'LC_CTYPE']: |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
527 ... os.environ[name] = '' |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
528 >>> os.environ['LANG'] = 'fr_FR.UTF-8' |
72
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
529 >>> default_locale('LC_MESSAGES') |
39
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
530 'fr_FR' |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
531 |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
532 :param category: one of the ``LC_XXX`` environment variable names |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
533 :return: the value of the variable, or any of the fallbacks (``LANGUAGE``, |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
534 ``LC_ALL``, ``LC_CTYPE``, and ``LANG``) |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
535 |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
536 :rtype: `str` |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
537 """ |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
538 varnames = (category, 'LANGUAGE', 'LC_ALL', 'LC_CTYPE', 'LANG') |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
539 for name in filter(None, varnames): |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
540 locale = os.getenv(name) |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
541 if locale: |
151
f21c0725cdb4
Merged [141:143] and [145:153] via svnmerge from [source:/trunk].
cmlenz
parents:
125
diff
changeset
|
542 if name == 'LANGUAGE' and ':' in locale: |
f21c0725cdb4
Merged [141:143] and [145:153] via svnmerge from [source:/trunk].
cmlenz
parents:
125
diff
changeset
|
543 # the LANGUAGE variable may contain a colon-separated list of |
f21c0725cdb4
Merged [141:143] and [145:153] via svnmerge from [source:/trunk].
cmlenz
parents:
125
diff
changeset
|
544 # language codes; we just pick the language on the list |
f21c0725cdb4
Merged [141:143] and [145:153] via svnmerge from [source:/trunk].
cmlenz
parents:
125
diff
changeset
|
545 locale = locale.split(':')[0] |
72
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
546 return '_'.join(filter(None, parse_locale(locale))) |
39
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
547 |
72
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
548 def negotiate_locale(preferred, available, sep='_'): |
1 | 549 """Find the best match between available and requested locale strings. |
550 | |
72
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
551 >>> negotiate_locale(['de_DE', 'en_US'], ['de_DE', 'de_AT']) |
1 | 552 'de_DE' |
72
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
553 >>> negotiate_locale(['de_DE', 'en_US'], ['en', 'de']) |
1 | 554 'de' |
555 | |
556 :param preferred: the list of locale strings preferred by the user | |
557 :param available: the list of locale strings available | |
72
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
558 :param sep: character that separates the different parts of the locale |
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
559 strings |
1 | 560 :return: the locale identifier for the best match, or `None` if no match |
561 was found | |
562 :rtype: `str` | |
563 """ | |
564 for locale in preferred: | |
565 if locale in available: | |
566 return locale | |
72
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
567 parts = locale.split(sep) |
1 | 568 if len(parts) > 1 and parts[0] in available: |
569 return parts[0] | |
570 return None | |
571 | |
72
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
572 def parse_locale(identifier, sep='_'): |
1 | 573 """Parse a locale identifier into a ``(language, territory, variant)`` |
574 tuple. | |
575 | |
72
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
576 >>> parse_locale('zh_CN') |
1 | 577 ('zh', 'CN', None) |
578 | |
579 The default component separator is "_", but a different separator can be | |
580 specified using the `sep` parameter: | |
581 | |
72
4dcdb1d367ec
More explicit module-level function names in `babel.core`. Added `Locale.negotiate` class method.
cmlenz
parents:
53
diff
changeset
|
582 >>> parse_locale('zh-CN', sep='-') |
1 | 583 ('zh', 'CN', None) |
584 | |
585 :param identifier: the locale identifier string | |
586 :param sep: character that separates the different parts of the locale | |
587 string | |
588 :return: the ``(language, territory, variant)`` tuple | |
589 :rtype: `tuple` | |
590 :raise `ValueError`: if the string does not appear to be a valid locale | |
591 identifier | |
592 | |
593 :see: `IETF RFC 3066 <http://www.ietf.org/rfc/rfc3066.txt>`_ | |
594 """ | |
39
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
595 if '.' in identifier: |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
596 # this is probably the charset/encoding, which we don't care about |
3b314a78015d
Move function for determining the system default locale to `babel.core`, and make it available as a class method on `Locale`.
cmlenz
parents:
34
diff
changeset
|
597 identifier = identifier.split('.', 1)[0] |
1 | 598 parts = identifier.split(sep) |
599 lang, territory, variant = parts[0].lower(), None, None | |
600 if not lang.isalpha(): | |
601 raise ValueError('expected only letters, got %r' % lang) | |
602 if len(parts) > 1: | |
603 territory = parts[1].upper().split('.', 1)[0] | |
604 if not territory.isalpha(): | |
605 raise ValueError('expected only letters, got %r' % territory) | |
606 if len(parts) > 2: | |
607 variant = parts[2].upper().split('.', 1)[0] | |
608 return lang, territory, variant |