annotate 0.8.x/babel/localedata.py @ 142:4a7af44e6695 stable

Create branch for 0.8.x releases.
author cmlenz
date Wed, 20 Jun 2007 10:09:07 +0000
parents
children a47aa7995d62
rev   line source
142
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
2 #
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
3 # Copyright (C) 2007 Edgewall Software
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
4 # All rights reserved.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
5 #
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
6 # This software is licensed as described in the file COPYING, which
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
7 # you should have received as part of this distribution. The terms
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
8 # are also available at http://babel.edgewall.org/wiki/License.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
9 #
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
10 # This software consists of voluntary contributions made by many
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
11 # individuals. For the exact contribution history, see the revision
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
12 # history and logs, available at http://babel.edgewall.org/log/.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
13
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
14 """Low-level locale data access.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
15
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
16 :note: The `Locale` class, which uses this module under the hood, provides a
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
17 more convenient interface for accessing the locale data.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
18 """
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
19
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
20 import os
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
21 import pickle
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
22 try:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
23 import threading
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
24 except ImportError:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
25 import dummy_threading as threading
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
26
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
27 __all__ = ['exists', 'load']
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
28 __docformat__ = 'restructuredtext en'
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
29
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
30 _cache = {}
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
31 _cache_lock = threading.RLock()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
32 _dirname = os.path.join(os.path.dirname(__file__), 'localedata')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
33
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
34 def exists(name):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
35 """Check whether locale data is available for the given locale.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
36
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
37 :param name: the locale identifier string
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
38 :return: `True` if the locale data exists, `False` otherwise
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
39 :rtype: `bool`
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
40 """
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
41 if name in _cache:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
42 return True
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
43 return os.path.exists(os.path.join(_dirname, '%s.dat' % name))
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
44
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
45 def load(name):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
46 """Load the locale data for the given locale.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
47
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
48 The locale data is a dictionary that contains much of the data defined by
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
49 the Common Locale Data Repository (CLDR). This data is stored as a
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
50 collection of pickle files inside the ``babel`` package.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
51
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
52 >>> d = load('en_US')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
53 >>> d['languages']['sv']
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
54 u'Swedish'
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
55
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
56 Note that the results are cached, and subsequent requests for the same
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
57 locale return the same dictionary:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
58
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
59 >>> d1 = load('en_US')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
60 >>> d2 = load('en_US')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
61 >>> d1 is d2
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
62 True
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
63
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
64 :param name: the locale identifier string (or "root")
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
65 :return: the locale data
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
66 :rtype: `dict`
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
67 :raise `IOError`: if no locale data file is found for the given locale
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
68 identifer, or one of the locales it inherits from
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
69 """
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
70 _cache_lock.acquire()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
71 try:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
72 data = _cache.get(name)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
73 if not data:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
74 # Load inherited data
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
75 if name == 'root':
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
76 data = {}
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
77 else:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
78 parts = name.split('_')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
79 if len(parts) == 1:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
80 parent = 'root'
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
81 else:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
82 parent = '_'.join(parts[:-1])
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
83 data = load(parent).copy()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
84 filename = os.path.join(_dirname, '%s.dat' % name)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
85 fileobj = open(filename, 'rb')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
86 try:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
87 if name != 'root':
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
88 merge(data, pickle.load(fileobj))
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
89 else:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
90 data = pickle.load(fileobj)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
91 _cache[name] = data
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
92 finally:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
93 fileobj.close()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
94 return data
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
95 finally:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
96 _cache_lock.release()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
97
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
98 def merge(dict1, dict2):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
99 """Merge the data from `dict2` into the `dict1` dictionary, making copies
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
100 of nested dictionaries.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
101
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
102 :param dict1: the dictionary to merge into
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
103 :param dict2: the dictionary containing the data that should be merged
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
104 """
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
105 for key, value in dict2.items():
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
106 if value:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
107 if type(value) is dict:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
108 dict1[key] = dict1.get(key, {}).copy()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
109 merge(dict1[key], value)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
110 else:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
111 dict1[key] = value
Copyright (C) 2012-2017 Edgewall Software