Эх сурвалжийг харах

HUE-3287 [core] Django 1.11 upgrade
- Upgrading Babel-2.5.1 from Babel-0.9.6

(cherry picked from commit dc96d5992ab7be352b43d3598bcc47a439aec750)

Prakash Ranade 8 жил өмнө
parent
commit
9d1ac7ef07
100 өөрчлөгдсөн 0 нэмэгдсэн , 2074 устгасан
  1. 0 181
      desktop/core/ext-py/Babel-0.9.6/ChangeLog
  2. 0 39
      desktop/core/ext-py/Babel-0.9.6/INSTALL.txt
  3. 0 4
      desktop/core/ext-py/Babel-0.9.6/MANIFEST.in
  4. 0 18
      desktop/core/ext-py/Babel-0.9.6/PKG-INFO
  5. 0 12
      desktop/core/ext-py/Babel-0.9.6/README.txt
  6. 0 39
      desktop/core/ext-py/Babel-0.9.6/babel/__init__.py
  7. 0 790
      desktop/core/ext-py/Babel-0.9.6/babel/core.py
  8. 0 991
      desktop/core/ext-py/Babel-0.9.6/babel/dates.py
  9. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/global.dat
  10. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/aa.dat
  11. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/aa_DJ.dat
  12. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/aa_ER.dat
  13. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/aa_ER_SAAHO.dat
  14. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/aa_ET.dat
  15. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/af.dat
  16. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/af_NA.dat
  17. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/af_ZA.dat
  18. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ak.dat
  19. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ak_GH.dat
  20. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/am.dat
  21. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/am_ET.dat
  22. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar.dat
  23. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_AE.dat
  24. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_BH.dat
  25. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_DZ.dat
  26. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_EG.dat
  27. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_IQ.dat
  28. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_JO.dat
  29. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_KW.dat
  30. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_LB.dat
  31. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_LY.dat
  32. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_MA.dat
  33. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_OM.dat
  34. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_QA.dat
  35. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_SA.dat
  36. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_SD.dat
  37. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_SY.dat
  38. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_TN.dat
  39. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_YE.dat
  40. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/as.dat
  41. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/as_IN.dat
  42. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/az.dat
  43. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/az_AZ.dat
  44. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/az_Cyrl.dat
  45. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/az_Cyrl_AZ.dat
  46. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/az_Latn.dat
  47. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/az_Latn_AZ.dat
  48. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/be.dat
  49. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/be_BY.dat
  50. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/bg.dat
  51. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/bg_BG.dat
  52. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/bn.dat
  53. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/bn_BD.dat
  54. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/bn_IN.dat
  55. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/bs.dat
  56. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/bs_BA.dat
  57. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/byn.dat
  58. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/byn_ER.dat
  59. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ca.dat
  60. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ca_ES.dat
  61. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/cch.dat
  62. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/cch_NG.dat
  63. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/cop.dat
  64. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/cs.dat
  65. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/cs_CZ.dat
  66. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/cy.dat
  67. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/cy_GB.dat
  68. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/da.dat
  69. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/da_DK.dat
  70. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/de.dat
  71. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/de_AT.dat
  72. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/de_BE.dat
  73. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/de_CH.dat
  74. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/de_DE.dat
  75. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/de_LI.dat
  76. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/de_LU.dat
  77. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/dv.dat
  78. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/dv_MV.dat
  79. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/dz.dat
  80. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/dz_BT.dat
  81. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ee.dat
  82. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ee_GH.dat
  83. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/ee_TG.dat
  84. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/el.dat
  85. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/el_CY.dat
  86. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/el_GR.dat
  87. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/el_POLYTON.dat
  88. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/en.dat
  89. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_AS.dat
  90. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_AU.dat
  91. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_BE.dat
  92. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_BW.dat
  93. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_BZ.dat
  94. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_CA.dat
  95. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_Dsrt.dat
  96. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_Dsrt_US.dat
  97. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_GB.dat
  98. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_GU.dat
  99. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_HK.dat
  100. BIN
      desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_IE.dat

+ 0 - 181
desktop/core/ext-py/Babel-0.9.6/ChangeLog

@@ -1,181 +0,0 @@
-Version 0.9.6
-http://svn.edgewall.org/repos/babel/tags/0.9.6/
-(Mar 17 2011, from branches/stable/0.9.x)
-
- * Backport r493-494: documentation typo fixes.
- * Make the CLDR import script work with Python 2.7.
- * Fix various typos.
- * Fixed Python 2.3 compatibility (ticket #146, #233).
- * Sort output of list-locales.
- * Make the POT-Creation-Date of the catalog being updated equal to
-   POT-Creation-Date of the template used to update (ticket #148).
- * Use a more explicit error message if no option or argument (command) is
-   passed to pybabel (ticket #81).
- * Keep the PO-Revision-Date if it is not the default value (ticket #148).
- * Make --no-wrap work by reworking --width's default and mimic xgettext's
-   behaviour of always wrapping comments (ticket #145).
- * Fixed negative offset handling of Catalog._set_mime_headers (ticket #165).
- * Add --project and --version options for commandline (ticket #173).
- * Add a __ne__() method to the Local class.
- * Explicitly sort instead of using sorted() and don't assume ordering
-   (Python 2.3 and Jython compatibility).
- * Removed ValueError raising for string formatting message checkers if the
-   string does not contain any string formattings (ticket #150).
- * Fix Serbian plural forms (ticket #213).
- * Small speed improvement in format_date() (ticket #216).
- * Fix number formatting for locales where CLDR specifies alt or draft 
-   items (ticket #217)
- * Fix bad check in format_time (ticket #257, reported with patch and tests by 
-   jomae)
- * Fix so frontend.CommandLineInterface.run does not accumulate logging 
-   handlers (#227, reported with initial patch by dfraser)
- * Fix exception if environment contains an invalid locale setting (#200)
-
-
-Version 0.9.5
-http://svn.edgewall.org/repos/babel/tags/0.9.5/
-(Apr 6 2010, from branches/stable/0.9.x)
-
- * Fixed the case where messages containing square brackets would break with
-   an unpack error.
- * Backport of r467: Fuzzy matching regarding plurals should *NOT* be checked
-   against len(message.id)  because this is always 2, instead, it's should be
-   checked against catalog.num_plurals (ticket #212).
-
-
-Version 0.9.4
-http://svn.edgewall.org/repos/babel/tags/0.9.4/
-(Aug 25 2008, from branches/stable/0.9.x)
-
- * Currency symbol definitions that is defined with choice patterns in the
-   CLDR data are no longer imported, so the symbol code will be used instead.
- * Fixed quarter support in date formatting.
- * Fixed a serious memory leak that was introduces by the support for CLDR
-   aliases in 0.9.3 (ticket #128).
- * Locale modifiers such as "@euro" are now stripped from locale identifiers
-   when parsing (ticket #136).
- * The system locales "C" and "POSIX" are now treated as aliases for
-   "en_US_POSIX", for which the CLDR provides the appropriate data. Thanks to
-   Manlio Perillo for the suggestion.
- * Fixed JavaScript extraction for regular expression literals (ticket #138)
-   and concatenated strings.
- * The `Translation` class in `babel.support` can now manage catalogs with
-   different message domains, and exposes the family of `d*gettext` functions
-   (ticket #137).
-
-
-Version 0.9.3
-http://svn.edgewall.org/repos/babel/tags/0.9.3/
-(Jul 9 2008, from branches/stable/0.9.x)
-
- * Fixed invalid message extraction methods causing an UnboundLocalError.
- * Extraction method specification can now use a dot instead of the colon to
-   separate module and function name (ticket #105).
- * Fixed message catalog compilation for locales with more than two plural
-   forms (ticket #95).
- * Fixed compilation of message catalogs for locales with more than two plural
-   forms where the translations were empty (ticket #97).
- * The stripping of the comment tags in comments is optional now and
-   is done for each line in a comment.
- * Added a JavaScript message extractor.
- * Updated to CLDR 1.6.
- * Fixed timezone calculations when formatting datetime and time values.
- * Added a `get_plural` function into the plurals module that returns the
-   correct plural forms for a locale as tuple.
- * Added support for alias definitions in the CLDR data files, meaning that
-   the chance for items missing in certain locales should be greatly reduced
-   (ticket #68).
-
-
-Version 0.9.2
-http://svn.edgewall.org/repos/babel/tags/0.9.2/
-(Feb 4 2008, from branches/stable/0.9.x)
-
- * Fixed catalogs' charset values not being recognized (ticket #66).
- * Numerous improvements to the default plural forms.
- * Fixed fuzzy matching when updating message catalogs (ticket #82).
- * Fixed bug in catalog updating, that in some cases pulled in translations
-   from different catalogs based on the same template.
- * Location lines in PO files do no longer get wrapped at hyphens in file
-   names (ticket #79).
- * Fixed division by zero error in catalog compilation on empty catalogs
-   (ticket #60).
-
-
-Version 0.9.1
-http://svn.edgewall.org/repos/babel/tags/0.9.1/
-(Sep 7 2007, from branches/stable/0.9.x)
-
- * Fixed catalog updating when a message is merged that was previously simple
-   but now has a plural form, for example by moving from `gettext` to
-   `ngettext`, or vice versa.
- * Fixed time formatting for 12 am and 12 pm.
- * Fixed output encoding of the `pybabel --list-locales` command.
- * MO files are now written in binary mode on windows (ticket #61).
-
-
-Version 0.9
-http://svn.edgewall.org/repos/babel/tags/0.9.0/
-(Aug 20 2007, from branches/stable/0.9.x)
-
- * The `new_catalog` distutils command has been renamed to `init_catalog` for
-   consistency with the command-line frontend.
- * Added compilation of message catalogs to MO files (ticket #21).
- * Added updating of message catalogs from POT files (ticket #22).
- * Support for significant digits in number formatting.
- * Apply proper "banker's rounding" in number formatting in a cross-platform
-   manner.
- * The number formatting functions now also work with numbers represented by
-   Python `Decimal` objects (ticket #53).
- * Added extensible infrastructure for validating translation catalogs.
- * Fixed the extractor not filtering out messages that didn't validate against
-   the keyword's specification (ticket #39).
- * Fixed the extractor raising an exception when encountering an empty string
-   msgid. It now emits a warning to stderr.
- * Numerous Python message extractor fixes: it now handles nested function
-   calls within a gettext function call correctly, uses the correct line number
-   for multi-line function calls, and other small fixes (tickets #38 and #39).
- * Improved support for detecting Python string formatting fields in message
-   strings (ticket #57).
- * CLDR upgraded to the 1.5 release.
- * Improved timezone formatting.
- * Implemented scientific number formatting.
- * Added mechanism to lookup locales by alias, for cases where browsers insist
-   on including only the language code in the `Accept-Language` header, and
-   sometimes even the incorrect language code.
-
-
-Version 0.8.1
-http://svn.edgewall.org/repos/babel/tags/0.8.1/
-(Jul 2 2007, from branches/stable/0.8.x)
-
- * `default_locale()` would fail when the value of the `LANGUAGE` environment
-   variable contained multiple language codes separated by colon, as is
-   explicitly allowed by the GNU gettext tools. As the `default_locale()`
-   function is called at the module level in some modules, this bug would
-   completely break importing these modules on systems where `LANGUAGE` is set
-   that way.
- * The character set specified in PO template files is now respected when
-   creating new catalog files based on that template. This allows the use of
-   characters outside the ASCII range in POT files (ticket #17).
- * The default ordering of messages in generated POT files, which is based on
-   the order those messages are found when walking the source tree, is no
-   longer subject to differences between platforms; directory and file names
-   are now always sorted alphabetically.
- * The Python message extractor now respects the special encoding comment to be
-   able to handle files containing non-ASCII characters (ticket #23).
- * Added 'N_' (gettext noop) to the extractor's default keywords.
- * Made locale string parsing more robust, and also take the script part into
-   account (ticket #27).
- * Added a function to list all locales for which locale data is available.
- * Added a command-line option to the `pybabel` command which prints out all
-   available locales (ticket #24).
- * The name of the command-line script has been changed from just `babel` to
-   `pybabel` to avoid a conflict with the OpenBabel project (ticket #34).
-
-
-Version 0.8
-http://svn.edgewall.org/repos/babel/tags/0.8.0/
-(Jun 20 2007, from branches/stable/0.8.x)
-
- * First public release

+ 0 - 39
desktop/core/ext-py/Babel-0.9.6/INSTALL.txt

@@ -1,39 +0,0 @@
-Installing Babel
-================
-
-Prerequisites
--------------
-
- * Python 2.3 or later (2.4 or later is recommended)
- * Optional: setuptools 0.6b1 or later
- * Optional: pytz (strongly recommended for real time-zone support, mandatory 
-   to run the automated test suite)
-
-
-Installation
-------------
-
-Once you've downloaded and unpacked a Babel source release, enter the
-directory where the archive was unpacked, and run:
-
-  $ python setup.py install
-
-Note that you may need administrator/root privileges for this step, as
-this command will by default attempt to install Babel to the Python
-site-packages directory on your system.
-
-For advanced options, please refer to the easy_install and/or the distutils
-documentation:
-
-  http://peak.telecommunity.com/DevCenter/EasyInstall
-  http://docs.python.org/inst/inst.html
-
-
-Support
--------
-
-If you encounter any problems with Babel, please don't hesitate to ask
-questions on the Babel mailing list or IRC channel:
-
-  http://babel.edgewall.org/wiki/MailingList
-  http://babel.edgewall.org/wiki/IrcChannel

+ 0 - 4
desktop/core/ext-py/Babel-0.9.6/MANIFEST.in

@@ -1,4 +0,0 @@
-include babel/global.dat
-include babel/localedata/*.dat
-include doc/api/*.*
-include doc/*.html

+ 0 - 18
desktop/core/ext-py/Babel-0.9.6/PKG-INFO

@@ -1,18 +0,0 @@
-Metadata-Version: 1.0
-Name: Babel
-Version: 0.9.6
-Summary: Internationalization utilities
-Home-page: http://babel.edgewall.org/
-Author: Edgewall Software
-Author-email: info@edgewall.org
-License: BSD
-Download-URL: http://babel.edgewall.org/wiki/Download
-Description: A collection of tools for internationalizing Python applications.
-Platform: UNKNOWN
-Classifier: Development Status :: 4 - Beta
-Classifier: Environment :: Web Environment
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: BSD License
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
-Classifier: Topic :: Software Development :: Libraries :: Python Modules

+ 0 - 12
desktop/core/ext-py/Babel-0.9.6/README.txt

@@ -1,12 +0,0 @@
-About Babel
-===========
-
-Babel is a Python library that provides an integrated collection of
-utilities that assist with internationalizing and localizing Python
-applications (in particular web-based applications.)
-
-Details can be found in the HTML files in the `doc` folder.
-
-For more information please visit the Babel web site:
-
-  <http://babel.edgewall.org/>

+ 0 - 39
desktop/core/ext-py/Babel-0.9.6/babel/__init__.py

@@ -1,39 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2007-2008 Edgewall Software
-# All rights reserved.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at http://babel.edgewall.org/wiki/License.
-#
-# This software consists of voluntary contributions made by many
-# individuals. For the exact contribution history, see the revision
-# history and logs, available at http://babel.edgewall.org/log/.
-
-"""Integrated collection of utilities that assist in internationalizing and
-localizing applications.
-
-This package is basically composed of two major parts:
-
- * tools to build and work with ``gettext`` message catalogs
- * a Python interface to the CLDR (Common Locale Data Repository), providing
-   access to various locale display names, localized number and date
-   formatting, etc.
-
-:see: http://www.gnu.org/software/gettext/
-:see: http://docs.python.org/lib/module-gettext.html
-:see: http://www.unicode.org/cldr/
-"""
-
-from babel.core import *
-
-__docformat__ = 'restructuredtext en'
-try:
-    from pkg_resources import get_distribution, ResolutionError
-    try:
-        __version__ = get_distribution('Babel').version
-    except ResolutionError:
-        __version__ = None # unknown
-except ImportError:
-    __version__ = None # unknown

+ 0 - 790
desktop/core/ext-py/Babel-0.9.6/babel/core.py

@@ -1,790 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2007 Edgewall Software
-# All rights reserved.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at http://babel.edgewall.org/wiki/License.
-#
-# This software consists of voluntary contributions made by many
-# individuals. For the exact contribution history, see the revision
-# history and logs, available at http://babel.edgewall.org/log/.
-
-"""Core locale representation and locale data access."""
-
-import os
-import pickle
-
-from babel import localedata
-
-__all__ = ['UnknownLocaleError', 'Locale', 'default_locale', 'negotiate_locale',
-           'parse_locale']
-__docformat__ = 'restructuredtext en'
-
-_global_data = None
-
-def get_global(key):
-    """Return the dictionary for the given key in the global data.
-    
-    The global data is stored in the ``babel/global.dat`` file and contains
-    information independent of individual locales.
-    
-    >>> get_global('zone_aliases')['UTC']
-    'Etc/GMT'
-    >>> get_global('zone_territories')['Europe/Berlin']
-    'DE'
-    
-    :param key: the data key
-    :return: the dictionary found in the global data under the given key
-    :rtype: `dict`
-    :since: version 0.9
-    """
-    global _global_data
-    if _global_data is None:
-        dirname = os.path.join(os.path.dirname(__file__))
-        filename = os.path.join(dirname, 'global.dat')
-        fileobj = open(filename, 'rb')
-        try:
-            _global_data = pickle.load(fileobj)
-        finally:
-            fileobj.close()
-    return _global_data.get(key, {})
-
-
-LOCALE_ALIASES = {
-    'ar': 'ar_SY', 'bg': 'bg_BG', 'bs': 'bs_BA', 'ca': 'ca_ES', 'cs': 'cs_CZ', 
-    'da': 'da_DK', 'de': 'de_DE', 'el': 'el_GR', 'en': 'en_US', 'es': 'es_ES', 
-    'et': 'et_EE', 'fa': 'fa_IR', 'fi': 'fi_FI', 'fr': 'fr_FR', 'gl': 'gl_ES', 
-    'he': 'he_IL', 'hu': 'hu_HU', 'id': 'id_ID', 'is': 'is_IS', 'it': 'it_IT', 
-    'ja': 'ja_JP', 'km': 'km_KH', 'ko': 'ko_KR', 'lt': 'lt_LT', 'lv': 'lv_LV', 
-    'mk': 'mk_MK', 'nl': 'nl_NL', 'nn': 'nn_NO', 'no': 'nb_NO', 'pl': 'pl_PL', 
-    'pt': 'pt_PT', 'ro': 'ro_RO', 'ru': 'ru_RU', 'sk': 'sk_SK', 'sl': 'sl_SI', 
-    'sv': 'sv_SE', 'th': 'th_TH', 'tr': 'tr_TR', 'uk': 'uk_UA'
-}
-
-
-class UnknownLocaleError(Exception):
-    """Exception thrown when a locale is requested for which no locale data
-    is available.
-    """
-
-    def __init__(self, identifier):
-        """Create the exception.
-        
-        :param identifier: the identifier string of the unsupported locale
-        """
-        Exception.__init__(self, 'unknown locale %r' % identifier)
-        self.identifier = identifier
-
-
-class Locale(object):
-    """Representation of a specific locale.
-    
-    >>> locale = Locale('en', 'US')
-    >>> repr(locale)
-    '<Locale "en_US">'
-    >>> locale.display_name
-    u'English (United States)'
-    
-    A `Locale` object can also be instantiated from a raw locale string:
-    
-    >>> locale = Locale.parse('en-US', sep='-')
-    >>> repr(locale)
-    '<Locale "en_US">'
-    
-    `Locale` objects provide access to a collection of locale data, such as
-    territory and language names, number and date format patterns, and more:
-    
-    >>> locale.number_symbols['decimal']
-    u'.'
-    
-    If a locale is requested for which no locale data is available, an
-    `UnknownLocaleError` is raised:
-    
-    >>> Locale.parse('en_DE')
-    Traceback (most recent call last):
-        ...
-    UnknownLocaleError: unknown locale 'en_DE'
-    
-    :see: `IETF RFC 3066 <http://www.ietf.org/rfc/rfc3066.txt>`_
-    """
-
-    def __init__(self, language, territory=None, script=None, variant=None):
-        """Initialize the locale object from the given identifier components.
-        
-        >>> locale = Locale('en', 'US')
-        >>> locale.language
-        'en'
-        >>> locale.territory
-        'US'
-        
-        :param language: the language code
-        :param territory: the territory (country or region) code
-        :param script: the script code
-        :param variant: the variant code
-        :raise `UnknownLocaleError`: if no locale data is available for the
-                                     requested locale
-        """
-        self.language = language
-        self.territory = territory
-        self.script = script
-        self.variant = variant
-        self.__data = None
-
-        identifier = str(self)
-        if not localedata.exists(identifier):
-            raise UnknownLocaleError(identifier)
-
-    def default(cls, category=None, aliases=LOCALE_ALIASES):
-        """Return the system default locale for the specified category.
-        
-        >>> for name in ['LANGUAGE', 'LC_ALL', 'LC_CTYPE']:
-        ...     os.environ[name] = ''
-        >>> os.environ['LANG'] = 'fr_FR.UTF-8'
-        >>> Locale.default('LC_MESSAGES')
-        <Locale "fr_FR">
-
-        :param category: one of the ``LC_XXX`` environment variable names
-        :param aliases: a dictionary of aliases for locale identifiers
-        :return: the value of the variable, or any of the fallbacks
-                 (``LANGUAGE``, ``LC_ALL``, ``LC_CTYPE``, and ``LANG``)
-        :rtype: `Locale`
-        :see: `default_locale`
-        """
-        return cls(default_locale(category, aliases=aliases))
-    default = classmethod(default)
-
-    def negotiate(cls, preferred, available, sep='_', aliases=LOCALE_ALIASES):
-        """Find the best match between available and requested locale strings.
-        
-        >>> Locale.negotiate(['de_DE', 'en_US'], ['de_DE', 'de_AT'])
-        <Locale "de_DE">
-        >>> Locale.negotiate(['de_DE', 'en_US'], ['en', 'de'])
-        <Locale "de">
-        >>> Locale.negotiate(['de_DE', 'de'], ['en_US'])
-        
-        You can specify the character used in the locale identifiers to separate
-        the differnet components. This separator is applied to both lists. Also,
-        case is ignored in the comparison:
-        
-        >>> Locale.negotiate(['de-DE', 'de'], ['en-us', 'de-de'], sep='-')
-        <Locale "de_DE">
-        
-        :param preferred: the list of locale identifers preferred by the user
-        :param available: the list of locale identifiers available
-        :param aliases: a dictionary of aliases for locale identifiers
-        :return: the `Locale` object for the best match, or `None` if no match
-                 was found
-        :rtype: `Locale`
-        :see: `negotiate_locale`
-        """
-        identifier = negotiate_locale(preferred, available, sep=sep,
-                                      aliases=aliases)
-        if identifier:
-            return Locale.parse(identifier, sep=sep)
-    negotiate = classmethod(negotiate)
-
-    def parse(cls, identifier, sep='_'):
-        """Create a `Locale` instance for the given locale identifier.
-        
-        >>> l = Locale.parse('de-DE', sep='-')
-        >>> l.display_name
-        u'Deutsch (Deutschland)'
-        
-        If the `identifier` parameter is not a string, but actually a `Locale`
-        object, that object is returned:
-        
-        >>> Locale.parse(l)
-        <Locale "de_DE">
-        
-        :param identifier: the locale identifier string
-        :param sep: optional component separator
-        :return: a corresponding `Locale` instance
-        :rtype: `Locale`
-        :raise `ValueError`: if the string does not appear to be a valid locale
-                             identifier
-        :raise `UnknownLocaleError`: if no locale data is available for the
-                                     requested locale
-        :see: `parse_locale`
-        """
-        if isinstance(identifier, basestring):
-            return cls(*parse_locale(identifier, sep=sep))
-        return identifier
-    parse = classmethod(parse)
-
-    def __eq__(self, other):
-        return str(self) == str(other)
-
-    def __ne__(self, other):
-        return not self.__eq__(other)
-
-    def __repr__(self):
-        return '<Locale "%s">' % str(self)
-
-    def __str__(self):
-        return '_'.join(filter(None, [self.language, self.script,
-                                      self.territory, self.variant]))
-
-    def _data(self):
-        if self.__data is None:
-            self.__data = localedata.LocaleDataDict(localedata.load(str(self)))
-        return self.__data
-    _data = property(_data)
-
-    def get_display_name(self, locale=None):
-        """Return the display name of the locale using the given locale.
-        
-        The display name will include the language, territory, script, and
-        variant, if those are specified.
-        
-        >>> Locale('zh', 'CN', script='Hans').get_display_name('en')
-        u'Chinese (Simplified Han, China)'
-        
-        :param locale: the locale to use
-        :return: the display name
-        """
-        if locale is None:
-            locale = self
-        locale = Locale.parse(locale)
-        retval = locale.languages.get(self.language)
-        if self.territory or self.script or self.variant:
-            details = []
-            if self.script:
-                details.append(locale.scripts.get(self.script))
-            if self.territory:
-                details.append(locale.territories.get(self.territory))
-            if self.variant:
-                details.append(locale.variants.get(self.variant))
-            details = filter(None, details)
-            if details:
-                retval += ' (%s)' % u', '.join(details)
-        return retval
-
-    display_name = property(get_display_name, doc="""\
-        The localized display name of the locale.
-        
-        >>> Locale('en').display_name
-        u'English'
-        >>> Locale('en', 'US').display_name
-        u'English (United States)'
-        >>> Locale('sv').display_name
-        u'svenska'
-        
-        :type: `unicode`
-        """)
-
-    def english_name(self):
-        return self.get_display_name(Locale('en'))
-    english_name = property(english_name, doc="""\
-        The english display name of the locale.
-        
-        >>> Locale('de').english_name
-        u'German'
-        >>> Locale('de', 'DE').english_name
-        u'German (Germany)'
-        
-        :type: `unicode`
-        """)
-
-    #{ General Locale Display Names
-
-    def languages(self):
-        return self._data['languages']
-    languages = property(languages, doc="""\
-        Mapping of language codes to translated language names.
-        
-        >>> Locale('de', 'DE').languages['ja']
-        u'Japanisch'
-        
-        :type: `dict`
-        :see: `ISO 639 <http://www.loc.gov/standards/iso639-2/>`_
-        """)
-
-    def scripts(self):
-        return self._data['scripts']
-    scripts = property(scripts, doc="""\
-        Mapping of script codes to translated script names.
-        
-        >>> Locale('en', 'US').scripts['Hira']
-        u'Hiragana'
-        
-        :type: `dict`
-        :see: `ISO 15924 <http://www.evertype.com/standards/iso15924/>`_
-        """)
-
-    def territories(self):
-        return self._data['territories']
-    territories = property(territories, doc="""\
-        Mapping of script codes to translated script names.
-        
-        >>> Locale('es', 'CO').territories['DE']
-        u'Alemania'
-        
-        :type: `dict`
-        :see: `ISO 3166 <http://www.iso.org/iso/en/prods-services/iso3166ma/>`_
-        """)
-
-    def variants(self):
-        return self._data['variants']
-    variants = property(variants, doc="""\
-        Mapping of script codes to translated script names.
-        
-        >>> Locale('de', 'DE').variants['1901']
-        u'Alte deutsche Rechtschreibung'
-        
-        :type: `dict`
-        """)
-
-    #{ Number Formatting
-
-    def currencies(self):
-        return self._data['currency_names']
-    currencies = property(currencies, doc="""\
-        Mapping of currency codes to translated currency names.
-        
-        >>> Locale('en').currencies['COP']
-        u'Colombian Peso'
-        >>> Locale('de', 'DE').currencies['COP']
-        u'Kolumbianischer Peso'
-        
-        :type: `dict`
-        """)
-
-    def currency_symbols(self):
-        return self._data['currency_symbols']
-    currency_symbols = property(currency_symbols, doc="""\
-        Mapping of currency codes to symbols.
-        
-        >>> Locale('en', 'US').currency_symbols['USD']
-        u'$'
-        >>> Locale('es', 'CO').currency_symbols['USD']
-        u'US$'
-        
-        :type: `dict`
-        """)
-
-    def number_symbols(self):
-        return self._data['number_symbols']
-    number_symbols = property(number_symbols, doc="""\
-        Symbols used in number formatting.
-        
-        >>> Locale('fr', 'FR').number_symbols['decimal']
-        u','
-        
-        :type: `dict`
-        """)
-
-    def decimal_formats(self):
-        return self._data['decimal_formats']
-    decimal_formats = property(decimal_formats, doc="""\
-        Locale patterns for decimal number formatting.
-        
-        >>> Locale('en', 'US').decimal_formats[None]
-        <NumberPattern u'#,##0.###'>
-        
-        :type: `dict`
-        """)
-
-    def currency_formats(self):
-        return self._data['currency_formats']
-    currency_formats = property(currency_formats, doc=r"""\
-        Locale patterns for currency number formatting.
-        
-        >>> print Locale('en', 'US').currency_formats[None]
-        <NumberPattern u'\xa4#,##0.00'>
-        
-        :type: `dict`
-        """)
-
-    def percent_formats(self):
-        return self._data['percent_formats']
-    percent_formats = property(percent_formats, doc="""\
-        Locale patterns for percent number formatting.
-        
-        >>> Locale('en', 'US').percent_formats[None]
-        <NumberPattern u'#,##0%'>
-        
-        :type: `dict`
-        """)
-
-    def scientific_formats(self):
-        return self._data['scientific_formats']
-    scientific_formats = property(scientific_formats, doc="""\
-        Locale patterns for scientific number formatting.
-        
-        >>> Locale('en', 'US').scientific_formats[None]
-        <NumberPattern u'#E0'>
-        
-        :type: `dict`
-        """)
-
-    #{ Calendar Information and Date Formatting
-
-    def periods(self):
-        return self._data['periods']
-    periods = property(periods, doc="""\
-        Locale display names for day periods (AM/PM).
-        
-        >>> Locale('en', 'US').periods['am']
-        u'AM'
-        
-        :type: `dict`
-        """)
-
-    def days(self):
-        return self._data['days']
-    days = property(days, doc="""\
-        Locale display names for weekdays.
-        
-        >>> Locale('de', 'DE').days['format']['wide'][3]
-        u'Donnerstag'
-        
-        :type: `dict`
-        """)
-
-    def months(self):
-        return self._data['months']
-    months = property(months, doc="""\
-        Locale display names for months.
-        
-        >>> Locale('de', 'DE').months['format']['wide'][10]
-        u'Oktober'
-        
-        :type: `dict`
-        """)
-
-    def quarters(self):
-        return self._data['quarters']
-    quarters = property(quarters, doc="""\
-        Locale display names for quarters.
-        
-        >>> Locale('de', 'DE').quarters['format']['wide'][1]
-        u'1. Quartal'
-        
-        :type: `dict`
-        """)
-
-    def eras(self):
-        return self._data['eras']
-    eras = property(eras, doc="""\
-        Locale display names for eras.
-        
-        >>> Locale('en', 'US').eras['wide'][1]
-        u'Anno Domini'
-        >>> Locale('en', 'US').eras['abbreviated'][0]
-        u'BC'
-        
-        :type: `dict`
-        """)
-
-    def time_zones(self):
-        return self._data['time_zones']
-    time_zones = property(time_zones, doc="""\
-        Locale display names for time zones.
-        
-        >>> Locale('en', 'US').time_zones['Europe/London']['long']['daylight']
-        u'British Summer Time'
-        >>> Locale('en', 'US').time_zones['America/St_Johns']['city']
-        u"St. John's"
-        
-        :type: `dict`
-        """)
-
-    def meta_zones(self):
-        return self._data['meta_zones']
-    meta_zones = property(meta_zones, doc="""\
-        Locale display names for meta time zones.
-        
-        Meta time zones are basically groups of different Olson time zones that
-        have the same GMT offset and daylight savings time.
-        
-        >>> Locale('en', 'US').meta_zones['Europe_Central']['long']['daylight']
-        u'Central European Summer Time'
-        
-        :type: `dict`
-        :since: version 0.9
-        """)
-
-    def zone_formats(self):
-        return self._data['zone_formats']
-    zone_formats = property(zone_formats, doc=r"""\
-        Patterns related to the formatting of time zones.
-        
-        >>> Locale('en', 'US').zone_formats['fallback']
-        u'%(1)s (%(0)s)'
-        >>> Locale('pt', 'BR').zone_formats['region']
-        u'Hor\xe1rio %s'
-        
-        :type: `dict`
-        :since: version 0.9
-        """)
-
-    def first_week_day(self):
-        return self._data['week_data']['first_day']
-    first_week_day = property(first_week_day, doc="""\
-        The first day of a week, with 0 being Monday.
-        
-        >>> Locale('de', 'DE').first_week_day
-        0
-        >>> Locale('en', 'US').first_week_day
-        6
-        
-        :type: `int`
-        """)
-
-    def weekend_start(self):
-        return self._data['week_data']['weekend_start']
-    weekend_start = property(weekend_start, doc="""\
-        The day the weekend starts, with 0 being Monday.
-        
-        >>> Locale('de', 'DE').weekend_start
-        5
-        
-        :type: `int`
-        """)
-
-    def weekend_end(self):
-        return self._data['week_data']['weekend_end']
-    weekend_end = property(weekend_end, doc="""\
-        The day the weekend ends, with 0 being Monday.
-        
-        >>> Locale('de', 'DE').weekend_end
-        6
-        
-        :type: `int`
-        """)
-
-    def min_week_days(self):
-        return self._data['week_data']['min_days']
-    min_week_days = property(min_week_days, doc="""\
-        The minimum number of days in a week so that the week is counted as the
-        first week of a year or month.
-        
-        >>> Locale('de', 'DE').min_week_days
-        4
-        
-        :type: `int`
-        """)
-
-    def date_formats(self):
-        return self._data['date_formats']
-    date_formats = property(date_formats, doc="""\
-        Locale patterns for date formatting.
-        
-        >>> Locale('en', 'US').date_formats['short']
-        <DateTimePattern u'M/d/yy'>
-        >>> Locale('fr', 'FR').date_formats['long']
-        <DateTimePattern u'd MMMM yyyy'>
-        
-        :type: `dict`
-        """)
-
-    def time_formats(self):
-        return self._data['time_formats']
-    time_formats = property(time_formats, doc="""\
-        Locale patterns for time formatting.
-        
-        >>> Locale('en', 'US').time_formats['short']
-        <DateTimePattern u'h:mm a'>
-        >>> Locale('fr', 'FR').time_formats['long']
-        <DateTimePattern u'HH:mm:ss z'>
-        
-        :type: `dict`
-        """)
-
-    def datetime_formats(self):
-        return self._data['datetime_formats']
-    datetime_formats = property(datetime_formats, doc="""\
-        Locale patterns for datetime formatting.
-        
-        >>> Locale('en').datetime_formats[None]
-        u'{1} {0}'
-        >>> Locale('th').datetime_formats[None]
-        u'{1}, {0}'
-        
-        :type: `dict`
-        """)
-
-
-def default_locale(category=None, aliases=LOCALE_ALIASES):
-    """Returns the system default locale for a given category, based on
-    environment variables.
-    
-    >>> for name in ['LANGUAGE', 'LC_ALL', 'LC_CTYPE']:
-    ...     os.environ[name] = ''
-    >>> os.environ['LANG'] = 'fr_FR.UTF-8'
-    >>> default_locale('LC_MESSAGES')
-    'fr_FR'
-
-    The "C" or "POSIX" pseudo-locales are treated as aliases for the
-    "en_US_POSIX" locale:
-
-    >>> os.environ['LC_MESSAGES'] = 'POSIX'
-    >>> default_locale('LC_MESSAGES')
-    'en_US_POSIX'
-
-    :param category: one of the ``LC_XXX`` environment variable names
-    :param aliases: a dictionary of aliases for locale identifiers
-    :return: the value of the variable, or any of the fallbacks (``LANGUAGE``,
-             ``LC_ALL``, ``LC_CTYPE``, and ``LANG``)
-    :rtype: `str`
-    """
-    varnames = (category, 'LANGUAGE', 'LC_ALL', 'LC_CTYPE', 'LANG')
-    for name in filter(None, varnames):
-        locale = os.getenv(name)
-        if locale:
-            if name == 'LANGUAGE' and ':' in locale:
-                # the LANGUAGE variable may contain a colon-separated list of
-                # language codes; we just pick the language on the list
-                locale = locale.split(':')[0]
-            if locale in ('C', 'POSIX'):
-                locale = 'en_US_POSIX'
-            elif aliases and locale in aliases:
-                locale = aliases[locale]
-            try:
-                return '_'.join(filter(None, parse_locale(locale)))
-            except ValueError:
-                pass
-
-def negotiate_locale(preferred, available, sep='_', aliases=LOCALE_ALIASES):
-    """Find the best match between available and requested locale strings.
-    
-    >>> negotiate_locale(['de_DE', 'en_US'], ['de_DE', 'de_AT'])
-    'de_DE'
-    >>> negotiate_locale(['de_DE', 'en_US'], ['en', 'de'])
-    'de'
-    
-    Case is ignored by the algorithm, the result uses the case of the preferred
-    locale identifier:
-    
-    >>> negotiate_locale(['de_DE', 'en_US'], ['de_de', 'de_at'])
-    'de_DE'
-    
-    >>> negotiate_locale(['de_DE', 'en_US'], ['de_de', 'de_at'])
-    'de_DE'
-    
-    By default, some web browsers unfortunately do not include the territory
-    in the locale identifier for many locales, and some don't even allow the
-    user to easily add the territory. So while you may prefer using qualified
-    locale identifiers in your web-application, they would not normally match
-    the language-only locale sent by such browsers. To workaround that, this
-    function uses a default mapping of commonly used langauge-only locale
-    identifiers to identifiers including the territory:
-    
-    >>> negotiate_locale(['ja', 'en_US'], ['ja_JP', 'en_US'])
-    'ja_JP'
-    
-    Some browsers even use an incorrect or outdated language code, such as "no"
-    for Norwegian, where the correct locale identifier would actually be "nb_NO"
-    (Bokmål) or "nn_NO" (Nynorsk). The aliases are intended to take care of
-    such cases, too:
-    
-    >>> negotiate_locale(['no', 'sv'], ['nb_NO', 'sv_SE'])
-    'nb_NO'
-    
-    You can override this default mapping by passing a different `aliases`
-    dictionary to this function, or you can bypass the behavior althogher by
-    setting the `aliases` parameter to `None`.
-    
-    :param preferred: the list of locale strings preferred by the user
-    :param available: the list of locale strings available
-    :param sep: character that separates the different parts of the locale
-                strings
-    :param aliases: a dictionary of aliases for locale identifiers
-    :return: the locale identifier for the best match, or `None` if no match
-             was found
-    :rtype: `str`
-    """
-    available = [a.lower() for a in available if a]
-    for locale in preferred:
-        ll = locale.lower()
-        if ll in available:
-            return locale
-        if aliases:
-            alias = aliases.get(ll)
-            if alias:
-                alias = alias.replace('_', sep)
-                if alias.lower() in available:
-                    return alias
-        parts = locale.split(sep)
-        if len(parts) > 1 and parts[0].lower() in available:
-            return parts[0]
-    return None
-
-def parse_locale(identifier, sep='_'):
-    """Parse a locale identifier into a tuple of the form::
-    
-      ``(language, territory, script, variant)``
-    
-    >>> parse_locale('zh_CN')
-    ('zh', 'CN', None, None)
-    >>> parse_locale('zh_Hans_CN')
-    ('zh', 'CN', 'Hans', None)
-    
-    The default component separator is "_", but a different separator can be
-    specified using the `sep` parameter:
-    
-    >>> parse_locale('zh-CN', sep='-')
-    ('zh', 'CN', None, None)
-    
-    If the identifier cannot be parsed into a locale, a `ValueError` exception
-    is raised:
-    
-    >>> parse_locale('not_a_LOCALE_String')
-    Traceback (most recent call last):
-      ...
-    ValueError: 'not_a_LOCALE_String' is not a valid locale identifier
-    
-    Encoding information and locale modifiers are removed from the identifier:
-    
-    >>> parse_locale('it_IT@euro')
-    ('it', 'IT', None, None)
-    >>> parse_locale('en_US.UTF-8')
-    ('en', 'US', None, None)
-    >>> parse_locale('de_DE.iso885915@euro')
-    ('de', 'DE', None, None)
-    
-    :param identifier: the locale identifier string
-    :param sep: character that separates the different components of the locale
-                identifier
-    :return: the ``(language, territory, script, variant)`` tuple
-    :rtype: `tuple`
-    :raise `ValueError`: if the string does not appear to be a valid locale
-                         identifier
-    
-    :see: `IETF RFC 4646 <http://www.ietf.org/rfc/rfc4646.txt>`_
-    """
-    if '.' in identifier:
-        # this is probably the charset/encoding, which we don't care about
-        identifier = identifier.split('.', 1)[0]
-    if '@' in identifier:
-        # this is a locale modifier such as @euro, which we don't care about
-        # either
-        identifier = identifier.split('@', 1)[0]
-
-    parts = identifier.split(sep)
-    lang = parts.pop(0).lower()
-    if not lang.isalpha():
-        raise ValueError('expected only letters, got %r' % lang)
-
-    script = territory = variant = None
-    if parts:
-        if len(parts[0]) == 4 and parts[0].isalpha():
-            script = parts.pop(0).title()
-
-    if parts:
-        if len(parts[0]) == 2 and parts[0].isalpha():
-            territory = parts.pop(0).upper()
-        elif len(parts[0]) == 3 and parts[0].isdigit():
-            territory = parts.pop(0)
-
-    if parts:
-        if len(parts[0]) == 4 and parts[0][0].isdigit() or \
-                len(parts[0]) >= 5 and parts[0][0].isalpha():
-            variant = parts.pop()
-
-    if parts:
-        raise ValueError('%r is not a valid locale identifier' % identifier)
-
-    return lang, territory, script, variant

+ 0 - 991
desktop/core/ext-py/Babel-0.9.6/babel/dates.py

@@ -1,991 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2007 Edgewall Software
-# All rights reserved.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at http://babel.edgewall.org/wiki/License.
-#
-# This software consists of voluntary contributions made by many
-# individuals. For the exact contribution history, see the revision
-# history and logs, available at http://babel.edgewall.org/log/.
-
-"""Locale dependent formatting and parsing of dates and times.
-
-The default locale for the functions in this module is determined by the
-following environment variables, in that order:
-
- * ``LC_TIME``,
- * ``LC_ALL``, and
- * ``LANG``
-"""
-
-from datetime import date, datetime, time, timedelta, tzinfo
-import re
-
-from babel.core import default_locale, get_global, Locale
-from babel.util import UTC
-
-__all__ = ['format_date', 'format_datetime', 'format_time',
-           'get_timezone_name', 'parse_date', 'parse_datetime', 'parse_time']
-__docformat__ = 'restructuredtext en'
-
-LC_TIME = default_locale('LC_TIME')
-
-# Aliases for use in scopes where the modules are shadowed by local variables
-date_ = date
-datetime_ = datetime
-time_ = time
-
-def get_period_names(locale=LC_TIME):
-    """Return the names for day periods (AM/PM) used by the locale.
-    
-    >>> get_period_names(locale='en_US')['am']
-    u'AM'
-    
-    :param locale: the `Locale` object, or a locale string
-    :return: the dictionary of period names
-    :rtype: `dict`
-    """
-    return Locale.parse(locale).periods
-
-def get_day_names(width='wide', context='format', locale=LC_TIME):
-    """Return the day names used by the locale for the specified format.
-    
-    >>> get_day_names('wide', locale='en_US')[1]
-    u'Tuesday'
-    >>> get_day_names('abbreviated', locale='es')[1]
-    u'mar'
-    >>> get_day_names('narrow', context='stand-alone', locale='de_DE')[1]
-    u'D'
-    
-    :param width: the width to use, one of "wide", "abbreviated", or "narrow"
-    :param context: the context, either "format" or "stand-alone"
-    :param locale: the `Locale` object, or a locale string
-    :return: the dictionary of day names
-    :rtype: `dict`
-    """
-    return Locale.parse(locale).days[context][width]
-
-def get_month_names(width='wide', context='format', locale=LC_TIME):
-    """Return the month names used by the locale for the specified format.
-    
-    >>> get_month_names('wide', locale='en_US')[1]
-    u'January'
-    >>> get_month_names('abbreviated', locale='es')[1]
-    u'ene'
-    >>> get_month_names('narrow', context='stand-alone', locale='de_DE')[1]
-    u'J'
-    
-    :param width: the width to use, one of "wide", "abbreviated", or "narrow"
-    :param context: the context, either "format" or "stand-alone"
-    :param locale: the `Locale` object, or a locale string
-    :return: the dictionary of month names
-    :rtype: `dict`
-    """
-    return Locale.parse(locale).months[context][width]
-
-def get_quarter_names(width='wide', context='format', locale=LC_TIME):
-    """Return the quarter names used by the locale for the specified format.
-    
-    >>> get_quarter_names('wide', locale='en_US')[1]
-    u'1st quarter'
-    >>> get_quarter_names('abbreviated', locale='de_DE')[1]
-    u'Q1'
-    
-    :param width: the width to use, one of "wide", "abbreviated", or "narrow"
-    :param context: the context, either "format" or "stand-alone"
-    :param locale: the `Locale` object, or a locale string
-    :return: the dictionary of quarter names
-    :rtype: `dict`
-    """
-    return Locale.parse(locale).quarters[context][width]
-
-def get_era_names(width='wide', locale=LC_TIME):
-    """Return the era names used by the locale for the specified format.
-    
-    >>> get_era_names('wide', locale='en_US')[1]
-    u'Anno Domini'
-    >>> get_era_names('abbreviated', locale='de_DE')[1]
-    u'n. Chr.'
-    
-    :param width: the width to use, either "wide", "abbreviated", or "narrow"
-    :param locale: the `Locale` object, or a locale string
-    :return: the dictionary of era names
-    :rtype: `dict`
-    """
-    return Locale.parse(locale).eras[width]
-
-def get_date_format(format='medium', locale=LC_TIME):
-    """Return the date formatting patterns used by the locale for the specified
-    format.
-    
-    >>> get_date_format(locale='en_US')
-    <DateTimePattern u'MMM d, yyyy'>
-    >>> get_date_format('full', locale='de_DE')
-    <DateTimePattern u'EEEE, d. MMMM yyyy'>
-    
-    :param format: the format to use, one of "full", "long", "medium", or
-                   "short"
-    :param locale: the `Locale` object, or a locale string
-    :return: the date format pattern
-    :rtype: `DateTimePattern`
-    """
-    return Locale.parse(locale).date_formats[format]
-
-def get_datetime_format(format='medium', locale=LC_TIME):
-    """Return the datetime formatting patterns used by the locale for the
-    specified format.
-    
-    >>> get_datetime_format(locale='en_US')
-    u'{1} {0}'
-    
-    :param format: the format to use, one of "full", "long", "medium", or
-                   "short"
-    :param locale: the `Locale` object, or a locale string
-    :return: the datetime format pattern
-    :rtype: `unicode`
-    """
-    patterns = Locale.parse(locale).datetime_formats
-    if format not in patterns:
-        format = None
-    return patterns[format]
-
-def get_time_format(format='medium', locale=LC_TIME):
-    """Return the time formatting patterns used by the locale for the specified
-    format.
-    
-    >>> get_time_format(locale='en_US')
-    <DateTimePattern u'h:mm:ss a'>
-    >>> get_time_format('full', locale='de_DE')
-    <DateTimePattern u'HH:mm:ss v'>
-    
-    :param format: the format to use, one of "full", "long", "medium", or
-                   "short"
-    :param locale: the `Locale` object, or a locale string
-    :return: the time format pattern
-    :rtype: `DateTimePattern`
-    """
-    return Locale.parse(locale).time_formats[format]
-
-def get_timezone_gmt(datetime=None, width='long', locale=LC_TIME):
-    """Return the timezone associated with the given `datetime` object formatted
-    as string indicating the offset from GMT.
-    
-    >>> dt = datetime(2007, 4, 1, 15, 30)
-    >>> get_timezone_gmt(dt, locale='en')
-    u'GMT+00:00'
-    
-    >>> from pytz import timezone
-    >>> tz = timezone('America/Los_Angeles')
-    >>> dt = datetime(2007, 4, 1, 15, 30, tzinfo=tz)
-    >>> get_timezone_gmt(dt, locale='en')
-    u'GMT-08:00'
-    >>> get_timezone_gmt(dt, 'short', locale='en')
-    u'-0800'
-    
-    The long format depends on the locale, for example in France the acronym
-    UTC string is used instead of GMT:
-    
-    >>> get_timezone_gmt(dt, 'long', locale='fr_FR')
-    u'UTC-08:00'
-    
-    :param datetime: the ``datetime`` object; if `None`, the current date and
-                     time in UTC is used
-    :param width: either "long" or "short"
-    :param locale: the `Locale` object, or a locale string
-    :return: the GMT offset representation of the timezone
-    :rtype: `unicode`
-    :since: version 0.9
-    """
-    if datetime is None:
-        datetime = datetime_.utcnow()
-    elif isinstance(datetime, (int, long)):
-        datetime = datetime_.utcfromtimestamp(datetime).time()
-    if datetime.tzinfo is None:
-        datetime = datetime.replace(tzinfo=UTC)
-    locale = Locale.parse(locale)
-
-    offset = datetime.tzinfo.utcoffset(datetime)
-    seconds = offset.days * 24 * 60 * 60 + offset.seconds
-    hours, seconds = divmod(seconds, 3600)
-    if width == 'short':
-        pattern = u'%+03d%02d'
-    else:
-        pattern = locale.zone_formats['gmt'] % '%+03d:%02d'
-    return pattern % (hours, seconds // 60)
-
-def get_timezone_location(dt_or_tzinfo=None, locale=LC_TIME):
-    """Return a representation of the given timezone using "location format".
-    
-    The result depends on both the local display name of the country and the
-    city associated with the time zone:
-    
-    >>> from pytz import timezone
-    >>> tz = timezone('America/St_Johns')
-    >>> get_timezone_location(tz, locale='de_DE')
-    u"Kanada (St. John's)"
-    >>> tz = timezone('America/Mexico_City')
-    >>> get_timezone_location(tz, locale='de_DE')
-    u'Mexiko (Mexiko-Stadt)'
-    
-    If the timezone is associated with a country that uses only a single
-    timezone, just the localized country name is returned:
-    
-    >>> tz = timezone('Europe/Berlin')
-    >>> get_timezone_name(tz, locale='de_DE')
-    u'Deutschland'
-    
-    :param dt_or_tzinfo: the ``datetime`` or ``tzinfo`` object that determines
-                         the timezone; if `None`, the current date and time in
-                         UTC is assumed
-    :param locale: the `Locale` object, or a locale string
-    :return: the localized timezone name using location format
-    :rtype: `unicode`
-    :since: version 0.9
-    """
-    if dt_or_tzinfo is None or isinstance(dt_or_tzinfo, (int, long)):
-        dt = None
-        tzinfo = UTC
-    elif isinstance(dt_or_tzinfo, (datetime, time)):
-        dt = dt_or_tzinfo
-        if dt.tzinfo is not None:
-            tzinfo = dt.tzinfo
-        else:
-            tzinfo = UTC
-    else:
-        dt = None
-        tzinfo = dt_or_tzinfo
-    locale = Locale.parse(locale)
-
-    if hasattr(tzinfo, 'zone'):
-        zone = tzinfo.zone
-    else:
-        zone = tzinfo.tzname(dt or datetime.utcnow())
-
-    # Get the canonical time-zone code
-    zone = get_global('zone_aliases').get(zone, zone)
-
-    info = locale.time_zones.get(zone, {})
-
-    # Otherwise, if there is only one timezone for the country, return the
-    # localized country name
-    region_format = locale.zone_formats['region']
-    territory = get_global('zone_territories').get(zone)
-    if territory not in locale.territories:
-        territory = 'ZZ' # invalid/unknown
-    territory_name = locale.territories[territory]
-    if territory and len(get_global('territory_zones').get(territory, [])) == 1:
-        return region_format % (territory_name)
-
-    # Otherwise, include the city in the output
-    fallback_format = locale.zone_formats['fallback']
-    if 'city' in info:
-        city_name = info['city']
-    else:
-        metazone = get_global('meta_zones').get(zone)
-        metazone_info = locale.meta_zones.get(metazone, {})
-        if 'city' in metazone_info:
-            city_name = metainfo['city']
-        elif '/' in zone:
-            city_name = zone.split('/', 1)[1].replace('_', ' ')
-        else:
-            city_name = zone.replace('_', ' ')
-
-    return region_format % (fallback_format % {
-        '0': city_name,
-        '1': territory_name
-    })
-
-def get_timezone_name(dt_or_tzinfo=None, width='long', uncommon=False,
-                      locale=LC_TIME):
-    r"""Return the localized display name for the given timezone. The timezone
-    may be specified using a ``datetime`` or `tzinfo` object.
-    
-    >>> from pytz import timezone
-    >>> dt = time(15, 30, tzinfo=timezone('America/Los_Angeles'))
-    >>> get_timezone_name(dt, locale='en_US')
-    u'Pacific Standard Time'
-    >>> get_timezone_name(dt, width='short', locale='en_US')
-    u'PST'
-    
-    If this function gets passed only a `tzinfo` object and no concrete
-    `datetime`,  the returned display name is indenpendent of daylight savings
-    time. This can be used for example for selecting timezones, or to set the
-    time of events that recur across DST changes:
-    
-    >>> tz = timezone('America/Los_Angeles')
-    >>> get_timezone_name(tz, locale='en_US')
-    u'Pacific Time'
-    >>> get_timezone_name(tz, 'short', locale='en_US')
-    u'PT'
-    
-    If no localized display name for the timezone is available, and the timezone
-    is associated with a country that uses only a single timezone, the name of
-    that country is returned, formatted according to the locale:
-    
-    >>> tz = timezone('Europe/Berlin')
-    >>> get_timezone_name(tz, locale='de_DE')
-    u'Deutschland'
-    >>> get_timezone_name(tz, locale='pt_BR')
-    u'Hor\xe1rio Alemanha'
-    
-    On the other hand, if the country uses multiple timezones, the city is also
-    included in the representation:
-    
-    >>> tz = timezone('America/St_Johns')
-    >>> get_timezone_name(tz, locale='de_DE')
-    u"Kanada (St. John's)"
-    
-    The `uncommon` parameter can be set to `True` to enable the use of timezone
-    representations that are not commonly used by the requested locale. For
-    example, while in French the central European timezone is usually
-    abbreviated as "HEC", in Canadian French, this abbreviation is not in
-    common use, so a generic name would be chosen by default:
-    
-    >>> tz = timezone('Europe/Paris')
-    >>> get_timezone_name(tz, 'short', locale='fr_CA')
-    u'France'
-    >>> get_timezone_name(tz, 'short', uncommon=True, locale='fr_CA')
-    u'HEC'
-    
-    :param dt_or_tzinfo: the ``datetime`` or ``tzinfo`` object that determines
-                         the timezone; if a ``tzinfo`` object is used, the
-                         resulting display name will be generic, i.e.
-                         independent of daylight savings time; if `None`, the
-                         current date in UTC is assumed
-    :param width: either "long" or "short"
-    :param uncommon: whether even uncommon timezone abbreviations should be used
-    :param locale: the `Locale` object, or a locale string
-    :return: the timezone display name
-    :rtype: `unicode`
-    :since: version 0.9
-    :see:  `LDML Appendix J: Time Zone Display Names
-            <http://www.unicode.org/reports/tr35/#Time_Zone_Fallback>`_
-    """
-    if dt_or_tzinfo is None or isinstance(dt_or_tzinfo, (int, long)):
-        dt = None
-        tzinfo = UTC
-    elif isinstance(dt_or_tzinfo, (datetime, time)):
-        dt = dt_or_tzinfo
-        if dt.tzinfo is not None:
-            tzinfo = dt.tzinfo
-        else:
-            tzinfo = UTC
-    else:
-        dt = None
-        tzinfo = dt_or_tzinfo
-    locale = Locale.parse(locale)
-
-    if hasattr(tzinfo, 'zone'):
-        zone = tzinfo.zone
-    else:
-        zone = tzinfo.tzname(dt)
-
-    # Get the canonical time-zone code
-    zone = get_global('zone_aliases').get(zone, zone)
-
-    info = locale.time_zones.get(zone, {})
-    # Try explicitly translated zone names first
-    if width in info:
-        if dt is None:
-            field = 'generic'
-        else:
-            dst = tzinfo.dst(dt)
-            if dst is None:
-                field = 'generic'
-            elif dst == 0:
-                field = 'standard'
-            else:
-                field = 'daylight'
-        if field in info[width]:
-            return info[width][field]
-
-    metazone = get_global('meta_zones').get(zone)
-    if metazone:
-        metazone_info = locale.meta_zones.get(metazone, {})
-        if width in metazone_info and (uncommon or metazone_info.get('common')):
-            if dt is None:
-                field = 'generic'
-            else:
-                field = tzinfo.dst(dt) and 'daylight' or 'standard'
-            if field in metazone_info[width]:
-                return metazone_info[width][field]
-
-    # If we have a concrete datetime, we assume that the result can't be
-    # independent of daylight savings time, so we return the GMT offset
-    if dt is not None:
-        return get_timezone_gmt(dt, width=width, locale=locale)
-
-    return get_timezone_location(dt_or_tzinfo, locale=locale)
-
-def format_date(date=None, format='medium', locale=LC_TIME):
-    """Return a date formatted according to the given pattern.
-    
-    >>> d = date(2007, 04, 01)
-    >>> format_date(d, locale='en_US')
-    u'Apr 1, 2007'
-    >>> format_date(d, format='full', locale='de_DE')
-    u'Sonntag, 1. April 2007'
-    
-    If you don't want to use the locale default formats, you can specify a
-    custom date pattern:
-    
-    >>> format_date(d, "EEE, MMM d, ''yy", locale='en')
-    u"Sun, Apr 1, '07"
-    
-    :param date: the ``date`` or ``datetime`` object; if `None`, the current
-                 date is used
-    :param format: one of "full", "long", "medium", or "short", or a custom
-                   date/time pattern
-    :param locale: a `Locale` object or a locale identifier
-    :rtype: `unicode`
-    
-    :note: If the pattern contains time fields, an `AttributeError` will be
-           raised when trying to apply the formatting. This is also true if
-           the value of ``date`` parameter is actually a ``datetime`` object,
-           as this function automatically converts that to a ``date``.
-    """
-    if date is None:
-        date = date_.today()
-    elif isinstance(date, datetime):
-        date = date.date()
-
-    locale = Locale.parse(locale)
-    if format in ('full', 'long', 'medium', 'short'):
-        format = get_date_format(format, locale=locale)
-    pattern = parse_pattern(format)
-    return pattern.apply(date, locale)
-
-def format_datetime(datetime=None, format='medium', tzinfo=None,
-                    locale=LC_TIME):
-    """Return a date formatted according to the given pattern.
-    
-    >>> dt = datetime(2007, 04, 01, 15, 30)
-    >>> format_datetime(dt, locale='en_US')
-    u'Apr 1, 2007 3:30:00 PM'
-    
-    For any pattern requiring the display of the time-zone, the third-party
-    ``pytz`` package is needed to explicitly specify the time-zone:
-    
-    >>> from pytz import timezone
-    >>> format_datetime(dt, 'full', tzinfo=timezone('Europe/Paris'),
-    ...                 locale='fr_FR')
-    u'dimanche 1 avril 2007 17:30:00 HEC'
-    >>> format_datetime(dt, "yyyy.MM.dd G 'at' HH:mm:ss zzz",
-    ...                 tzinfo=timezone('US/Eastern'), locale='en')
-    u'2007.04.01 AD at 11:30:00 EDT'
-    
-    :param datetime: the `datetime` object; if `None`, the current date and
-                     time is used
-    :param format: one of "full", "long", "medium", or "short", or a custom
-                   date/time pattern
-    :param tzinfo: the timezone to apply to the time for display
-    :param locale: a `Locale` object or a locale identifier
-    :rtype: `unicode`
-    """
-    if datetime is None:
-        datetime = datetime_.utcnow()
-    elif isinstance(datetime, (int, long)):
-        datetime = datetime_.utcfromtimestamp(datetime)
-    elif isinstance(datetime, time):
-        datetime = datetime_.combine(date.today(), datetime)
-    if datetime.tzinfo is None:
-        datetime = datetime.replace(tzinfo=UTC)
-    if tzinfo is not None:
-        datetime = datetime.astimezone(tzinfo)
-        if hasattr(tzinfo, 'normalize'): # pytz
-            datetime = tzinfo.normalize(datetime)
-
-    locale = Locale.parse(locale)
-    if format in ('full', 'long', 'medium', 'short'):
-        return get_datetime_format(format, locale=locale) \
-            .replace('{0}', format_time(datetime, format, tzinfo=None,
-                                        locale=locale)) \
-            .replace('{1}', format_date(datetime, format, locale=locale))
-    else:
-        return parse_pattern(format).apply(datetime, locale)
-
-def format_time(time=None, format='medium', tzinfo=None, locale=LC_TIME):
-    """Return a time formatted according to the given pattern.
-    
-    >>> t = time(15, 30)
-    >>> format_time(t, locale='en_US')
-    u'3:30:00 PM'
-    >>> format_time(t, format='short', locale='de_DE')
-    u'15:30'
-    
-    If you don't want to use the locale default formats, you can specify a
-    custom time pattern:
-    
-    >>> format_time(t, "hh 'o''clock' a", locale='en')
-    u"03 o'clock PM"
-    
-    For any pattern requiring the display of the time-zone, the third-party
-    ``pytz`` package is needed to explicitly specify the time-zone:
-    
-    >>> from pytz import timezone
-    >>> t = datetime(2007, 4, 1, 15, 30)
-    >>> tzinfo = timezone('Europe/Paris')
-    >>> t = tzinfo.localize(t)
-    >>> format_time(t, format='full', tzinfo=tzinfo, locale='fr_FR')
-    u'15:30:00 HEC'
-    >>> format_time(t, "hh 'o''clock' a, zzzz", tzinfo=timezone('US/Eastern'),
-    ...             locale='en')
-    u"09 o'clock AM, Eastern Daylight Time"
-    
-    As that example shows, when this function gets passed a
-    ``datetime.datetime`` value, the actual time in the formatted string is
-    adjusted to the timezone specified by the `tzinfo` parameter. If the
-    ``datetime`` is "naive" (i.e. it has no associated timezone information),
-    it is assumed to be in UTC.
-    
-    These timezone calculations are **not** performed if the value is of type
-    ``datetime.time``, as without date information there's no way to determine
-    what a given time would translate to in a different timezone without
-    information about whether daylight savings time is in effect or not. This
-    means that time values are left as-is, and the value of the `tzinfo`
-    parameter is only used to display the timezone name if needed:
-    
-    >>> t = time(15, 30)
-    >>> format_time(t, format='full', tzinfo=timezone('Europe/Paris'),
-    ...             locale='fr_FR')
-    u'15:30:00 HEC'
-    >>> format_time(t, format='full', tzinfo=timezone('US/Eastern'),
-    ...             locale='en_US')
-    u'3:30:00 PM ET'
-    
-    :param time: the ``time`` or ``datetime`` object; if `None`, the current
-                 time in UTC is used
-    :param format: one of "full", "long", "medium", or "short", or a custom
-                   date/time pattern
-    :param tzinfo: the time-zone to apply to the time for display
-    :param locale: a `Locale` object or a locale identifier
-    :rtype: `unicode`
-    
-    :note: If the pattern contains date fields, an `AttributeError` will be
-           raised when trying to apply the formatting. This is also true if
-           the value of ``time`` parameter is actually a ``datetime`` object,
-           as this function automatically converts that to a ``time``.
-    """
-    if time is None:
-        time = datetime.utcnow()
-    elif isinstance(time, (int, long)):
-        time = datetime.utcfromtimestamp(time)
-    if time.tzinfo is None:
-        time = time.replace(tzinfo=UTC)
-    if isinstance(time, datetime):
-        if tzinfo is not None:
-            time = time.astimezone(tzinfo)
-            if hasattr(tzinfo, 'normalize'): # pytz
-                time = tzinfo.normalize(time)
-        time = time.timetz()
-    elif tzinfo is not None:
-        time = time.replace(tzinfo=tzinfo)
-
-    locale = Locale.parse(locale)
-    if format in ('full', 'long', 'medium', 'short'):
-        format = get_time_format(format, locale=locale)
-    return parse_pattern(format).apply(time, locale)
-
-def parse_date(string, locale=LC_TIME):
-    """Parse a date from a string.
-    
-    This function uses the date format for the locale as a hint to determine
-    the order in which the date fields appear in the string.
-    
-    >>> parse_date('4/1/04', locale='en_US')
-    datetime.date(2004, 4, 1)
-    >>> parse_date('01.04.2004', locale='de_DE')
-    datetime.date(2004, 4, 1)
-    
-    :param string: the string containing the date
-    :param locale: a `Locale` object or a locale identifier
-    :return: the parsed date
-    :rtype: `date`
-    """
-    # TODO: try ISO format first?
-    format = get_date_format(locale=locale).pattern.lower()
-    year_idx = format.index('y')
-    month_idx = format.index('m')
-    if month_idx < 0:
-        month_idx = format.index('l')
-    day_idx = format.index('d')
-
-    indexes = [(year_idx, 'Y'), (month_idx, 'M'), (day_idx, 'D')]
-    indexes.sort()
-    indexes = dict([(item[1], idx) for idx, item in enumerate(indexes)])
-
-    # FIXME: this currently only supports numbers, but should also support month
-    #        names, both in the requested locale, and english
-
-    numbers = re.findall('(\d+)', string)
-    year = numbers[indexes['Y']]
-    if len(year) == 2:
-        year = 2000 + int(year)
-    else:
-        year = int(year)
-    month = int(numbers[indexes['M']])
-    day = int(numbers[indexes['D']])
-    if month > 12:
-        month, day = day, month
-    return date(year, month, day)
-
-def parse_datetime(string, locale=LC_TIME):
-    """Parse a date and time from a string.
-    
-    This function uses the date and time formats for the locale as a hint to
-    determine the order in which the time fields appear in the string.
-    
-    :param string: the string containing the date and time
-    :param locale: a `Locale` object or a locale identifier
-    :return: the parsed date/time
-    :rtype: `datetime`
-    """
-    raise NotImplementedError
-
-def parse_time(string, locale=LC_TIME):
-    """Parse a time from a string.
-    
-    This function uses the time format for the locale as a hint to determine
-    the order in which the time fields appear in the string.
-    
-    >>> parse_time('15:30:00', locale='en_US')
-    datetime.time(15, 30)
-    
-    :param string: the string containing the time
-    :param locale: a `Locale` object or a locale identifier
-    :return: the parsed time
-    :rtype: `time`
-    """
-    # TODO: try ISO format first?
-    format = get_time_format(locale=locale).pattern.lower()
-    hour_idx = format.index('h')
-    if hour_idx < 0:
-        hour_idx = format.index('k')
-    min_idx = format.index('m')
-    sec_idx = format.index('s')
-
-    indexes = [(hour_idx, 'H'), (min_idx, 'M'), (sec_idx, 'S')]
-    indexes.sort()
-    indexes = dict([(item[1], idx) for idx, item in enumerate(indexes)])
-
-    # FIXME: support 12 hour clock, and 0-based hour specification
-    #        and seconds should be optional, maybe minutes too
-    #        oh, and time-zones, of course
-
-    numbers = re.findall('(\d+)', string)
-    hour = int(numbers[indexes['H']])
-    minute = int(numbers[indexes['M']])
-    second = int(numbers[indexes['S']])
-    return time(hour, minute, second)
-
-
-class DateTimePattern(object):
-
-    def __init__(self, pattern, format):
-        self.pattern = pattern
-        self.format = format
-
-    def __repr__(self):
-        return '<%s %r>' % (type(self).__name__, self.pattern)
-
-    def __unicode__(self):
-        return self.pattern
-
-    def __mod__(self, other):
-        assert type(other) is DateTimeFormat
-        return self.format % other
-
-    def apply(self, datetime, locale):
-        return self % DateTimeFormat(datetime, locale)
-
-
-class DateTimeFormat(object):
-
-    def __init__(self, value, locale):
-        assert isinstance(value, (date, datetime, time))
-        if isinstance(value, (datetime, time)) and value.tzinfo is None:
-            value = value.replace(tzinfo=UTC)
-        self.value = value
-        self.locale = Locale.parse(locale)
-
-    def __getitem__(self, name):
-        char = name[0]
-        num = len(name)
-        if char == 'G':
-            return self.format_era(char, num)
-        elif char in ('y', 'Y', 'u'):
-            return self.format_year(char, num)
-        elif char in ('Q', 'q'):
-            return self.format_quarter(char, num)
-        elif char in ('M', 'L'):
-            return self.format_month(char, num)
-        elif char in ('w', 'W'):
-            return self.format_week(char, num)
-        elif char == 'd':
-            return self.format(self.value.day, num)
-        elif char == 'D':
-            return self.format_day_of_year(num)
-        elif char == 'F':
-            return self.format_day_of_week_in_month()
-        elif char in ('E', 'e', 'c'):
-            return self.format_weekday(char, num)
-        elif char == 'a':
-            return self.format_period(char)
-        elif char == 'h':
-            if self.value.hour % 12 == 0:
-                return self.format(12, num)
-            else:
-                return self.format(self.value.hour % 12, num)
-        elif char == 'H':
-            return self.format(self.value.hour, num)
-        elif char == 'K':
-            return self.format(self.value.hour % 12, num)
-        elif char == 'k':
-            if self.value.hour == 0:
-                return self.format(24, num)
-            else:
-                return self.format(self.value.hour, num)
-        elif char == 'm':
-            return self.format(self.value.minute, num)
-        elif char == 's':
-            return self.format(self.value.second, num)
-        elif char == 'S':
-            return self.format_frac_seconds(num)
-        elif char == 'A':
-            return self.format_milliseconds_in_day(num)
-        elif char in ('z', 'Z', 'v', 'V'):
-            return self.format_timezone(char, num)
-        else:
-            raise KeyError('Unsupported date/time field %r' % char)
-
-    def format_era(self, char, num):
-        width = {3: 'abbreviated', 4: 'wide', 5: 'narrow'}[max(3, num)]
-        era = int(self.value.year >= 0)
-        return get_era_names(width, self.locale)[era]
-
-    def format_year(self, char, num):
-        value = self.value.year
-        if char.isupper():
-            week = self.get_week_number(self.get_day_of_year())
-            if week == 0:
-                value -= 1
-        year = self.format(value, num)
-        if num == 2:
-            year = year[-2:]
-        return year
-
-    def format_quarter(self, char, num):
-        quarter = (self.value.month - 1) // 3 + 1
-        if num <= 2:
-            return ('%%0%dd' % num) % quarter
-        width = {3: 'abbreviated', 4: 'wide', 5: 'narrow'}[num]
-        context = {'Q': 'format', 'q': 'stand-alone'}[char]
-        return get_quarter_names(width, context, self.locale)[quarter]
-
-    def format_month(self, char, num):
-        if num <= 2:
-            return ('%%0%dd' % num) % self.value.month
-        width = {3: 'abbreviated', 4: 'wide', 5: 'narrow'}[num]
-        context = {'M': 'format', 'L': 'stand-alone'}[char]
-        return get_month_names(width, context, self.locale)[self.value.month]
-
-    def format_week(self, char, num):
-        if char.islower(): # week of year
-            day_of_year = self.get_day_of_year()
-            week = self.get_week_number(day_of_year)
-            if week == 0:
-                date = self.value - timedelta(days=day_of_year)
-                week = self.get_week_number(self.get_day_of_year(date),
-                                            date.weekday())
-            return self.format(week, num)
-        else: # week of month
-            week = self.get_week_number(self.value.day)
-            if week == 0:
-                date = self.value - timedelta(days=self.value.day)
-                week = self.get_week_number(date.day, date.weekday())
-                pass
-            return '%d' % week
-
-    def format_weekday(self, char, num):
-        if num < 3:
-            if char.islower():
-                value = 7 - self.locale.first_week_day + self.value.weekday()
-                return self.format(value % 7 + 1, num)
-            num = 3
-        weekday = self.value.weekday()
-        width = {3: 'abbreviated', 4: 'wide', 5: 'narrow'}[num]
-        context = {3: 'format', 4: 'format', 5: 'stand-alone'}[num]
-        return get_day_names(width, context, self.locale)[weekday]
-
-    def format_day_of_year(self, num):
-        return self.format(self.get_day_of_year(), num)
-
-    def format_day_of_week_in_month(self):
-        return '%d' % ((self.value.day - 1) / 7 + 1)
-
-    def format_period(self, char):
-        period = {0: 'am', 1: 'pm'}[int(self.value.hour >= 12)]
-        return get_period_names(locale=self.locale)[period]
-
-    def format_frac_seconds(self, num):
-        value = str(self.value.microsecond)
-        return self.format(round(float('.%s' % value), num) * 10**num, num)
-
-    def format_milliseconds_in_day(self, num):
-        msecs = self.value.microsecond // 1000 + self.value.second * 1000 + \
-                self.value.minute * 60000 + self.value.hour * 3600000
-        return self.format(msecs, num)
-
-    def format_timezone(self, char, num):
-        width = {3: 'short', 4: 'long'}[max(3, num)]
-        if char == 'z':
-            return get_timezone_name(self.value, width, locale=self.locale)
-        elif char == 'Z':
-            return get_timezone_gmt(self.value, width, locale=self.locale)
-        elif char == 'v':
-            return get_timezone_name(self.value.tzinfo, width,
-                                     locale=self.locale)
-        elif char == 'V':
-            if num == 1:
-                return get_timezone_name(self.value.tzinfo, width,
-                                         uncommon=True, locale=self.locale)
-            return get_timezone_location(self.value.tzinfo, locale=self.locale)
-
-    def format(self, value, length):
-        return ('%%0%dd' % length) % value
-
-    def get_day_of_year(self, date=None):
-        if date is None:
-            date = self.value
-        return (date - date_(date.year, 1, 1)).days + 1
-
-    def get_week_number(self, day_of_period, day_of_week=None):
-        """Return the number of the week of a day within a period. This may be
-        the week number in a year or the week number in a month.
-        
-        Usually this will return a value equal to or greater than 1, but if the
-        first week of the period is so short that it actually counts as the last
-        week of the previous period, this function will return 0.
-        
-        >>> format = DateTimeFormat(date(2006, 1, 8), Locale.parse('de_DE'))
-        >>> format.get_week_number(6)
-        1
-        
-        >>> format = DateTimeFormat(date(2006, 1, 8), Locale.parse('en_US'))
-        >>> format.get_week_number(6)
-        2
-        
-        :param day_of_period: the number of the day in the period (usually
-                              either the day of month or the day of year)
-        :param day_of_week: the week day; if ommitted, the week day of the
-                            current date is assumed
-        """
-        if day_of_week is None:
-            day_of_week = self.value.weekday()
-        first_day = (day_of_week - self.locale.first_week_day -
-                     day_of_period + 1) % 7
-        if first_day < 0:
-            first_day += 7
-        week_number = (day_of_period + first_day - 1) / 7
-        if 7 - first_day >= self.locale.min_week_days:
-            week_number += 1
-        return week_number
-
-
-PATTERN_CHARS = {
-    'G': [1, 2, 3, 4, 5],                                           # era
-    'y': None, 'Y': None, 'u': None,                                # year
-    'Q': [1, 2, 3, 4], 'q': [1, 2, 3, 4],                           # quarter
-    'M': [1, 2, 3, 4, 5], 'L': [1, 2, 3, 4, 5],                     # month
-    'w': [1, 2], 'W': [1],                                          # week
-    'd': [1, 2], 'D': [1, 2, 3], 'F': [1], 'g': None,               # day
-    'E': [1, 2, 3, 4, 5], 'e': [1, 2, 3, 4, 5], 'c': [1, 3, 4, 5],  # week day
-    'a': [1],                                                       # period
-    'h': [1, 2], 'H': [1, 2], 'K': [1, 2], 'k': [1, 2],             # hour
-    'm': [1, 2],                                                    # minute
-    's': [1, 2], 'S': None, 'A': None,                              # second
-    'z': [1, 2, 3, 4], 'Z': [1, 2, 3, 4], 'v': [1, 4], 'V': [1, 4]  # zone
-}
-
-def parse_pattern(pattern):
-    """Parse date, time, and datetime format patterns.
-    
-    >>> parse_pattern("MMMMd").format
-    u'%(MMMM)s%(d)s'
-    >>> parse_pattern("MMM d, yyyy").format
-    u'%(MMM)s %(d)s, %(yyyy)s'
-    
-    Pattern can contain literal strings in single quotes:
-    
-    >>> parse_pattern("H:mm' Uhr 'z").format
-    u'%(H)s:%(mm)s Uhr %(z)s'
-    
-    An actual single quote can be used by using two adjacent single quote
-    characters:
-    
-    >>> parse_pattern("hh' o''clock'").format
-    u"%(hh)s o'clock"
-    
-    :param pattern: the formatting pattern to parse
-    """
-    if type(pattern) is DateTimePattern:
-        return pattern
-
-    result = []
-    quotebuf = None
-    charbuf = []
-    fieldchar = ['']
-    fieldnum = [0]
-
-    def append_chars():
-        result.append(''.join(charbuf).replace('%', '%%'))
-        del charbuf[:]
-
-    def append_field():
-        limit = PATTERN_CHARS[fieldchar[0]]
-        if limit and fieldnum[0] not in limit:
-            raise ValueError('Invalid length for field: %r'
-                             % (fieldchar[0] * fieldnum[0]))
-        result.append('%%(%s)s' % (fieldchar[0] * fieldnum[0]))
-        fieldchar[0] = ''
-        fieldnum[0] = 0
-
-    for idx, char in enumerate(pattern.replace("''", '\0')):
-        if quotebuf is None:
-            if char == "'": # quote started
-                if fieldchar[0]:
-                    append_field()
-                elif charbuf:
-                    append_chars()
-                quotebuf = []
-            elif char in PATTERN_CHARS:
-                if charbuf:
-                    append_chars()
-                if char == fieldchar[0]:
-                    fieldnum[0] += 1
-                else:
-                    if fieldchar[0]:
-                        append_field()
-                    fieldchar[0] = char
-                    fieldnum[0] = 1
-            else:
-                if fieldchar[0]:
-                    append_field()
-                charbuf.append(char)
-
-        elif quotebuf is not None:
-            if char == "'": # end of quote
-                charbuf.extend(quotebuf)
-                quotebuf = None
-            else: # inside quote
-                quotebuf.append(char)
-
-    if fieldchar[0]:
-        append_field()
-    elif charbuf:
-        append_chars()
-
-    return DateTimePattern(pattern, u''.join(result).replace('\0', "'"))

BIN
desktop/core/ext-py/Babel-0.9.6/babel/global.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/aa.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/aa_DJ.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/aa_ER.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/aa_ER_SAAHO.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/aa_ET.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/af.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/af_NA.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/af_ZA.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ak.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ak_GH.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/am.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/am_ET.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_AE.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_BH.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_DZ.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_EG.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_IQ.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_JO.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_KW.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_LB.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_LY.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_MA.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_OM.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_QA.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_SA.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_SD.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_SY.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_TN.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ar_YE.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/as.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/as_IN.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/az.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/az_AZ.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/az_Cyrl.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/az_Cyrl_AZ.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/az_Latn.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/az_Latn_AZ.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/be.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/be_BY.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/bg.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/bg_BG.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/bn.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/bn_BD.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/bn_IN.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/bs.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/bs_BA.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/byn.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/byn_ER.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ca.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ca_ES.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/cch.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/cch_NG.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/cop.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/cs.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/cs_CZ.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/cy.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/cy_GB.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/da.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/da_DK.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/de.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/de_AT.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/de_BE.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/de_CH.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/de_DE.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/de_LI.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/de_LU.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/dv.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/dv_MV.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/dz.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/dz_BT.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ee.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ee_GH.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/ee_TG.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/el.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/el_CY.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/el_GR.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/el_POLYTON.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/en.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_AS.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_AU.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_BE.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_BW.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_BZ.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_CA.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_Dsrt.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_Dsrt_US.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_GB.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_GU.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_HK.dat


BIN
desktop/core/ext-py/Babel-0.9.6/babel/localedata/en_IE.dat


Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно