Bundle the l18n library to prevent installation issues

https://bitbucket.org/tkhyn/l18n/issues/4/setuppy-raises-unicodedecodeerror-trying prevents the l18n library from being installed on certain setups with non-Unicode locales:
https://groups.google.com/d/msg/wagtail/X5d8CL3DxUs/httaLso4DAAJ

As a temporary measure until a fixed version of l18n is released, bundle the library into wagtail.utils.l18n.
pull/4727/head
Matt Westcott 2018-08-06 11:28:02 +01:00 zatwierdzone przez Matt Westcott
rodzic 78442e0a00
commit 6793f76890
18 zmienionych plików z 1624 dodań i 3 usunięć

Wyświetl plik

@ -33,7 +33,6 @@ install_requires = [
"Unidecode>=0.04.14,<2.0",
"Willow>=1.1,<1.2",
"requests>=2.11.1,<3.0",
"l18n",
]
# Testing dependencies

Wyświetl plik

@ -1,4 +1,3 @@
import l18n
from django.contrib.auth.views import redirect_to_login as auth_redirect_to_login
from django.core.exceptions import PermissionDenied
from django.urls import reverse
@ -7,6 +6,7 @@ from django.utils.translation import activate as activate_lang
from django.utils.translation import ugettext as _
from wagtail.admin import messages
from wagtail.utils import l18n
def reject_request(request):

Wyświetl plik

@ -2,7 +2,6 @@ import warnings
from itertools import groupby
from operator import itemgetter
import l18n
from django import forms
from django.conf import settings
from django.contrib.auth import get_user_model
@ -22,6 +21,7 @@ from wagtail.core.models import (
PAGE_PERMISSION_TYPE_CHOICES, PAGE_PERMISSION_TYPES, GroupPagePermission, Page,
UserPagePermissionsProxy)
from wagtail.users.models import UserProfile
from wagtail.utils import l18n
User = get_user_model()

Wyświetl plik

@ -0,0 +1,76 @@
l18n - changes
==============
v2016.6.4 (07-09-2016)
----------------------
- Chinese (zh) translation overrides by Charlotte Blanc
- copy/deepcopy support for l18n lazy strings and dictionaries
- fix charset bug on python 2
v2016.6.3 (30-08-2016)
----------------------
- items are now sorted in maps iterators
- subsets support
v2016.6.2 (23-08-2016)
----------------------
- fix requirement 'six'
v2016.6.1 (19-08-2016)
----------------------
- pytz 2016.6.1
- fix encoding issues
v2016.6.0 (18-07-2016)
----------------------
- pytz 2016.6
- remove strict pin against pytz version (#2)
v2016.4.0 (05-05-2016)
----------------------
- pytz 2016.4
- Czech translation overrides by Jan Čermák
v2015.7.0 (26-11-2015)
----------------------
- pytz 2015.7
- drops support for python 2.6
v2015.6.0 (15-10-2015)
----------------------
- pytz 2015.6
- German translations by Philipp Steinhardt
- Fixes locale files that were not included in some distribution targets (#1)
- Translates all pytz.all_timezones rather than only pytz.common_timezones
v2015.2.0 (22-04-2015)
----------------------
- updates pytz version to 2015.2 (no changes in translations)
v2014.10.1 (17-03-2015)
-----------------------
- Birth
- Exposes ``tz_cities``, ``tz_fullnames`` and ``territories``
dictionary-like objects
- Compatible with python 2.6+ and 3.3+
- English and French translations

Wyświetl plik

@ -0,0 +1,18 @@
l18n contributors list
======================
Code
----
Thomas Khyn, thomas@ksytek.com
Languages
---------
en: Thomas Khyn, thomas[at]ksytek.com
fr: Thomas Khyn, thomas[at]ksytek.com
de: Philipp Steinhardt, steinhardt[at]myvision.de
cs: Jan Čermák, sairon[at]sairon.cz
zh: Charlotte Blanc, charblanc17[at]gmail.com

Wyświetl plik

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2014-2016 Thomas Khyn and contributors (see CONTRIBUTORS.rst)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

Wyświetl plik

@ -0,0 +1,210 @@
l18n
====
|copyright| 2014-2016 Thomas Khyn
Locale internationalization package. Translations for places, timezones ...
Tested with the latest minor versions of Python 2 and 3.
Supported languages: English, French, German, Czech, Chinese
(`want to add yours?`_)
What is l18n?
-------------
As you may have noticed, ``l18n`` is a contraction of ``i18n`` and ``l10n``,
namely 'internationalisation' and 'localization'. It basically provides
lazy translations for names used for localization purposes (e.g. places and
timezones).
I started writing ``l18n`` when I was looking for translations for the pytz_
library. Indeed, on a multi-lingual site where users can select the timezone
they are in, it's much better if they can select in their language, as in some
cases, the differences with the english name can be significant, hence the
place to look for it when it's sorted in alphabetical order.
And as I am lazy, I thought of a way to - almost - automatically fetch the
translations from the CLDR_ (Unicode's Common Locale Data Repository) database.
Integrating function to link timezone to country codes, there was no reason not
to try and provide translations also for the latter. In the near future, I -
or contributors - may also add currencies or measurement units fetched from
the CLDR database ...
How does it work?
-----------------
To use ``l18n``, you first need to install it. It works well with ``pip``::
pip install l18n
Then, in your code::
>>> import l18n
``l18n`` exposes several read-only dictionary-like objects:
l18n.tz_cities
is a mapping between all the timezones listed in ``pytz.all_timezones``
and human-friendly **lazy** versions of the translated name of the city
in the current language (see `Selecting the language`_ below). For example,
if the language is English::
>>> l18n.tz_cities['Pacific/Easter']
L18NLazyString <Easter Island>
>>> str(l18n.tz_cities['Pacific/Easter'])
'Easter Island'
In French, it would give::
>>> str(l18n.tz_cities['Pacific/Easter'])
'Île de Pâques'
l18n.tz_fullnames
is a mapping between all the timezones listed in ``pytz.all_timezones``
and **lazy** versions of the timezones' full names in the current language.
For example::
>>> str(l18n.tz_fullnames['Pacific/Easter'])
'Pacific/Easter Island' # or 'Pacifique/Île de Pâques' in French
It is interesting to note that for 3-components timezone names where the
local state or territory appears in the city name, ``l18n`` cleverly strips
this information so that it is not repeated::
>>> str(l18n.tz_fullnames['America/North_Dakota/New_Salem'])
'America/North Dakota/New Salem'
indeed::
>>> str(l18n.tz_cities['America/North_Dakota/New_salem'])
'New Salem, North Dakota'
l18n.territories
is a mapping between the territory codes as defined in the CLDR_ and their
localized names, lazily defined. For example::
>>> str(l18n.territories['CZ'])
'Czech Republic' # or 'République Tchèque' in French
.. note::
The values are translated each time they are evaluated, there is no caching.
This means that the same L18NLazyString / L18NLazyStringsList instance can
be used and produce 2 different outputs if you change the language between
the evaluations.
.. note::
The values in the above mentionned dictionaries can be overriden by your
own translations. The dictionaries are not read-only and values can be
added or removed at your convenience.
Lazy mappings special features (v.2016.6.3 onwards)
---------------------------------------------------
The fore-mentioned ``tz_cities``, ``tz_fullnames`` and ``territories`` are not
simple dictionaries and provide additional features.
Sorting
.......
When iterating over an ``L18NMap``, the items, keys or values are *yielded* in
alphabetical order **in the currently selected language**. For performance, the
results are cached by language, so the sort is only performed once per language.
Note that the values are still lazy objects that are evaluated only when
rendered into a string.
Subsets
.......
It is possible to generate a new ``L18NMap`` from an existing one by using the
``subset`` method and passing an iterable of ``keys`` that need to be kept in
the new mapping. Any cached sort is also used to generate the new cache, so
that there is nothing to re-calculate in the new subset.
For example, one can generate a map of translations for
``pytz.common_timezones``::
>>> common_cities = l18n.tz_cities.subset(pytz.common_timezones.keys())
Selecting the language
----------------------
By default, when importing ``l18n``, the current default locale is used (via
``locale.getdefaultlocale()``). If it is not the one you want or if you need to
change it, it is rather easy::
>>> l18n.set_language('en')
>>> str(l18n.tz_cities['Pacific/Easter'])
'Easter Island'
>>> l18n.set_language('fr')
>>> str(l18n.tz_cities['Pacific/Easter'])
'Île de Pâques'
And in case you want to disable translation and use raw default strings::
>>> l18n.set_language(None)
Utilities
---------
``l18n`` also exposes a few functions that may be helpful in some cases:
``l18n.utils.get_country_tzs(country_code)``
returns a list of locations for the given country code, sorted in
alphabetical order in the currently selected language
``l18n.utils.get_country_code_from_tz(timezone)``
returns the country code from a given (untranslated) timezone
Versionning
-----------
``l18n``'s main version number matches ``pytz``'s version number. ``l18n``
2014.10.X will be fully compatible with ``pytz`` 2014.10 whatever the value of
X. Indeed, the primary aim is to keep ``l18n``'s translation files consistent
with ``pytz``'s timezone names.
Before ``l18n`` 2016.6, the ``pytz`` version was pinned against the ``l18n``
version. Now, ``l18n`` YEAR.MONTH can now be used with any subsequent ``pytz``
version. However, note that there may be missing translations if the 2 versions
are too different from each other. In that case, open an issue_ to request a
new version of ``l18n`` to be published.
.. _`want to add yours?`:
Want to add a language?
-----------------------
Great idea !! Have a look at CONTRIBUTE.rst_.
Roadmap
-------
- Add supported languages
- Add currencies and other stuff
.. |copyright| unicode:: 0xA9
.. _pytz: https://pypi.python.org/pypi/pytz/
.. _CLDR: http://cldr.unicode.org/
.. _CONTRIBUTE.rst: https://bitbucket.org/tkhyn/l18n/src/tip/CONTRIBUTE.rst
.. _issue: https://bitbucket.org/tkhyn/l18n/issues/new

Wyświetl plik

@ -0,0 +1,4 @@
from .version import __version__, __version_info__
from .maps import tz_cities, tz_fullnames, territories
from .translation import set_language

Wyświetl plik

@ -0,0 +1,920 @@
# -*- coding: utf-8 -*-
# AUTOMATICALLY GENERATED FILE, DO NOT EDIT
tz_locations = {
'Brazil': u'Brazil',
'Canada': u'Canada',
'Asia': u'Asia',
'America/Indiana/Tell_City': u'Tell City',
'America/North_Dakota/New_Salem': u'New Salem',
'US': u'United States',
'Indiana': u'Indiana',
'Argentina': u'Argentina',
'Europe': u'Europe',
'Australia': u'Australia',
'America/Indiana/Vevay': u'Vevay',
'Arctic': u'Arctic',
'America/Indiana/Marengo': u'Marengo',
'Atlantic': u'Atlantic',
'Chile': u'Chile',
'America/Indiana/Vincennes': u'Vincennes',
'America': u'America',
'America/North_Dakota/Center': u'Center',
'Kentucky': u'Kentucky',
'Etc': u'Etc',
'North_Dakota': u'North Dakota',
'America/Indiana/Knox': u'Knox',
'America/Kentucky/Monticello': u'Monticello',
'America/North_Dakota/Beulah': u'Beulah',
'America/Indiana/Petersburg': u'Petersburg',
'Mexico': u'Mexico',
'Africa': u'Africa',
'Pacific': u'Pacific',
'Antarctica': u'Antarctica',
'Indian': u'Indian',
'America/Indiana/Winamac': u'Winamac',
}
tz_cities = {
'Atlantic/Canary': u'Canary',
'Australia/Melbourne': u'Melbourne',
'Etc/GMT+9': u'GMT+9',
'Etc/GMT+8': u'GMT+8',
'Europe/Lisbon': u'Lisbon',
'Etc/GMT+3': u'GMT+3',
'Etc/GMT+2': u'GMT+2',
'Etc/GMT+1': u'GMT+1',
'Etc/GMT+0': u'GMT+0',
'America/Nipigon': u'Nipigon',
'Etc/GMT+6': u'GMT+6',
'Etc/GMT+5': u'GMT+5',
'America/Miquelon': u'Miquelon',
'Pacific/Wallis': u'Wallis',
'America/Fort_Nelson': u'Fort Nelson',
'Antarctica/Davis': u'Davis',
'America/Coral_Harbour': u'Atikokan',
'Asia/Dhaka': u'Dhaka',
'America/St_Lucia': u'St. Lucia',
'Canada/Newfoundland': u'Newfoundland',
'Asia/Kashgar': u'Kashgar',
'America/Phoenix': u'Phoenix',
'Europe/Kaliningrad': u'Kaliningrad',
'Etc/GMT+7': u'GMT+7',
'America/Mazatlan': u'Mazatlan',
'Arctic/Longyearbyen': u'Longyearbyen',
'Europe/Guernsey': u'Guernsey',
'GB': u'GB',
'Europe/Paris': u'Paris',
'Europe/Stockholm': u'Stockholm',
'Pacific/Fiji': u'Fiji',
'Pacific/Apia': u'Apia',
'Etc/GMT+4': u'GMT+4',
'Pacific/Pago_Pago': u'Pago Pago',
'Asia/Rangoon': u'Rangoon',
'America/Mexico_City': u'Mexico City',
'America/Ensenada': u'Ensenada',
'America/Puerto_Rico': u'Puerto Rico',
'Indian/Mauritius': u'Mauritius',
'Europe/Berlin': u'Berlin',
'Europe/Zurich': u'Zurich',
'Africa/Casablanca': u'Casablanca',
'Antarctica/Macquarie': u'Macquarie Island',
'Asia/Krasnoyarsk': u'Krasnoyarsk',
'Australia/Canberra': u'Canberra',
'Atlantic/Bermuda': u'Bermuda',
'Asia/Ujung_Pandang': u'Ujung Pandang',
'America/Araguaina': u'Araguaina',
'Asia/Tehran': u'Tehran',
'Asia/Saigon': u'Ho Chi Minh',
'Asia/Baku': u'Baku',
'America/St_Barthelemy': u'St. Barthelemy',
'America/Porto_Acre': u'Porto Acre',
'America/Santarem': u'Santarem',
'America/Argentina/Cordoba': u'Cordoba',
'Libya': u'Libya',
'America/Danmarkshavn': u'Danmarkshavn',
'America/Scoresbysund': u'Ittoqqortoormiit',
'America/Eirunepe': u'Eirunepe',
'America/Caracas': u'Caracas',
'Asia/Baghdad': u'Baghdad',
'Africa/Monrovia': u'Monrovia',
'Atlantic/Stanley': u'Stanley',
'America/St_Vincent': u'St. Vincent',
'Portugal': u'Portugal',
'Europe/Tiraspol': u'Tiraspol',
'America/Vancouver': u'Vancouver',
'Asia/Ho_Chi_Minh': u'Ho Chi Minh',
'Europe/Busingen': u'Busingen',
'Etc/GMT0': u'GMT0',
'Asia/Thimphu': u'Thimphu',
'Africa/Ouagadougou': u'Ouagadougou',
'America/Belize': u'Belize',
'America/Port_of_Spain': u'Port of Spain',
'Greenwich': u'Greenwich',
'Asia/Tashkent': u'Tashkent',
'Asia/Tokyo': u'Tokyo',
'Pacific/Kiritimati': u'Kiritimati',
'Australia/Sydney': u'Sydney',
'Europe/Riga': u'Riga',
'Asia/Dili': u'Dili',
'Africa/Mbabane': u'Mbabane',
'Asia/Oral': u'Oral',
'Asia/Aden': u'Aden',
'Europe/Isle_of_Man': u'Isle of Man',
'Europe/Istanbul': u'Istanbul',
'Asia/Magadan': u'Magadan',
'Australia/Lindeman': u'Lindeman',
'US/Michigan': u'Michigan',
'Pacific/Galapagos': u'Galapagos',
'America/Bogota': u'Bogota',
'Africa/Asmara': u'Asmara',
'America/Chicago': u'Chicago',
'Pacific/Kwajalein': u'Kwajalein',
'Australia/Broken_Hill': u'Broken Hill',
'America/Cuiaba': u'Cuiaba',
'Indian/Christmas': u'Christmas',
'Asia/Jayapura': u'Jayapura',
'Europe/Brussels': u'Brussels',
'Asia/Chongqing': u'Chongqing',
'Australia/NSW': u'NSW',
'Canada/Pacific': u'Pacific',
'America/Noronha': u'Noronha',
'Europe/Podgorica': u'Podgorica',
'Africa/Algiers': u'Algiers',
'Africa/Harare': u'Harare',
'Africa/Ndjamena': u'Ndjamena',
'America/Costa_Rica': u'Costa Rica',
'Europe/Ljubljana': u'Ljubljana',
'Indian/Mayotte': u'Mayotte',
'Asia/Phnom_Penh': u'Phnom Penh',
'America/Managua': u'Managua',
'America/Pangnirtung': u'Pangnirtung',
'Etc/GMT+12': u'GMT+12',
'America/Tijuana': u'Tijuana',
'Pacific/Fakaofo': u'Fakaofo',
'America/Adak': u'Adak',
'America/Antigua': u'Antigua',
'America/Indiana/Indianapolis': u'Indianapolis',
'America/Argentina/La_Rioja': u'La Rioja',
'Pacific/Tahiti': u'Tahiti',
'Asia/Brunei': u'Brunei',
'Europe/Zagreb': u'Zagreb',
'America/Asuncion': u'Asuncion',
'Europe/Vienna': u'Vienna',
'Mexico/General': u'General',
'Australia/Hobart': u'Hobart',
'America/Juneau': u'Juneau',
'America/Inuvik': u'Inuvik',
'America/Ojinaga': u'Ojinaga',
'Europe/Astrakhan': u'Astrakhan',
'America/Montreal': u'Montreal',
'Asia/Seoul': u'Seoul',
'Brazil/East': u'East',
'Indian/Comoro': u'Comoro',
'Antarctica/Rothera': u'Rothera',
'Hongkong': u'Hongkong',
'Europe/Tallinn': u'Tallinn',
'Indian/Mahe': u'Mahe',
'Asia/Calcutta': u'Kolkata',
'Australia/South': u'South',
'America/Argentina/Jujuy': u'Jujuy',
'Asia/Bishkek': u'Bishkek',
'America/Creston': u'Creston',
'America/Martinique': u'Martinique',
'Asia/Singapore': u'Singapore',
'PRC': u'PRC',
'Africa/Nairobi': u'Nairobi',
'Asia/Thimbu': u'Thimbu',
'America/Maceio': u'Maceio',
'Africa/Cairo': u'Cairo',
'Europe/Moscow': u'Moscow',
'Antarctica/Palmer': u'Palmer',
'Asia/Ulaanbaatar': u'Ulaanbaatar',
'America/Rainy_River': u'Rainy River',
'Africa/Kampala': u'Kampala',
'Asia/Colombo': u'Colombo',
'Australia/Adelaide': u'Adelaide',
'America/Cambridge_Bay': u'Cambridge Bay',
'Africa/Luanda': u'Luanda',
'Pacific/Chatham': u'Chatham',
'America/Indiana/Winamac': u'Winamac, Indiana',
'Asia/Dacca': u'Dacca',
'America/Cordoba': u'Cordoba',
'Asia/Tbilisi': u'Tbilisi',
'Europe/Gibraltar': u'Gibraltar',
'Asia/Karachi': u'Karachi',
'Asia/Harbin': u'Harbin',
'Australia/Lord_Howe': u'Lord Howe',
'Etc/GMT-9': u'GMT-9',
'Etc/GMT-8': u'GMT-8',
'America/Bahia_Banderas': u'Bahia Banderas',
'Etc/GMT-1': u'GMT-1',
'Etc/GMT-0': u'GMT-0',
'Etc/GMT-3': u'GMT-3',
'Etc/GMT-2': u'GMT-2',
'Etc/GMT-5': u'GMT-5',
'Etc/GMT-4': u'GMT-4',
'Etc/GMT-7': u'GMT-7',
'Europe/Nicosia': u'Nicosia',
'America/Boa_Vista': u'Boa Vista',
'Eire': u'Eire',
'America/Lima': u'Lima',
'Indian/Reunion': u'Reunion',
'Canada/Mountain': u'Mountain',
'Asia/Srednekolymsk': u'Srednekolymsk',
'CET': u'CET',
'Europe/Belfast': u'Belfast',
'America/Blanc-Sablon': u'Blanc-Sablon',
'Australia/West': u'West',
'Antarctica/Syowa': u'Syowa',
'America/Jamaica': u'Jamaica',
'Europe/Kiev': u'Kiev',
'Europe/Budapest': u'Budapest',
'Canada/Eastern': u'Eastern',
'Pacific/Midway': u'Midway',
'America/Goose_Bay': u'Goose Bay',
'Australia/Victoria': u'Victoria',
'Asia/Amman': u'Amman',
'Asia/Sakhalin': u'Sakhalin',
'Africa/Windhoek': u'Windhoek',
'US/Pacific': u'Pacific',
'America/Sitka': u'Sitka',
'Asia/Katmandu': u'Kathmandu',
'America/Guyana': u'Guyana',
'Pacific/Pohnpei': u'Pohnpei',
'America/Sao_Paulo': u'Sao Paulo',
'Turkey': u'Turkey',
'Australia/Yancowinna': u'Yancowinna',
'America/Lower_Princes': u'Lower Princes Quarter',
'Australia/Perth': u'Perth',
'Africa/Djibouti': u'Djibouti',
'Asia/Jakarta': u'Jakarta',
'Asia/Pyongyang': u'Pyongyang',
'EST5EDT': u'EST5EDT',
'Africa/Johannesburg': u'Johannesburg',
'Canada/East-Saskatchewan': u'East-Saskatchewan',
'Asia/Tel_Aviv': u'Tel Aviv',
'Antarctica/Troll': u'Troll',
'Asia/Istanbul': u'Istanbul',
'Asia/Irkutsk': u'Irkutsk',
'Iran': u'Iran',
'Australia/ACT': u'ACT',
'Africa/Niamey': u'Niamey',
'Australia/North': u'North',
'America/Belem': u'Belem',
'America/Indiana/Marengo': u'Marengo, Indiana',
'Africa/Nouakchott': u'Nouakchott',
'Asia/Ashkhabad': u'Ashkhabad',
'Europe/Vilnius': u'Vilnius',
'America/Cayenne': u'Cayenne',
'Africa/Mogadishu': u'Mogadishu',
'America/Kentucky/Monticello': u'Monticello, Kentucky',
'America/Rio_Branco': u'Rio Branco',
'America/Cancun': u'Cancun',
'America/Havana': u'Havana',
'Chile/EasterIsland': u'EasterIsland',
'Pacific/Guam': u'Guam',
'Pacific/Kosrae': u'Kosrae',
'Universal': u'Universal',
'US/Arizona': u'Arizona',
'Atlantic/Azores': u'Azores',
'Australia/Eucla': u'Eucla',
'Asia/Shanghai': u'Shanghai',
'US/Alaska': u'Alaska',
'America/Godthab': u'Nuuk',
'Asia/Beirut': u'Beirut',
'Africa/Maputo': u'Maputo',
'HST': u'HST',
'Asia/Bahrain': u'Bahrain',
'Asia/Ashgabat': u'Ashgabat',
'Asia/Riyadh': u'Riyadh',
'Atlantic/Faeroe': u'Faroe',
'America/Montevideo': u'Montevideo',
'America/Anguilla': u'Anguilla',
'Asia/Damascus': u'Damascus',
'America/North_Dakota/Center': u'Center, North Dakota',
'UCT': u'UCT',
'America/Indiana/Vevay': u'Vevay, Indiana',
'Atlantic/St_Helena': u'St. Helena',
'Iceland': u'Iceland',
'Europe/Vatican': u'Vatican',
'America/Indiana/Vincennes': u'Vincennes, Indiana',
'Asia/Almaty': u'Almaty',
'Australia/Queensland': u'Queensland',
'America/Santo_Domingo': u'Santo Domingo',
'Africa/Brazzaville': u'Brazzaville',
'America/Nome': u'Nome',
'Asia/Taipei': u'Taipei',
'America/Yakutat': u'Yakutat',
'W-SU': u'W-SU',
'America/Argentina/Mendoza': u'Mendoza',
'Zulu': u'Zulu',
'Egypt': u'Egypt',
'America/Tortola': u'Tortola',
'Etc/UTC': u'UTC',
'Brazil/Acre': u'Acre',
'Africa/Asmera': u'Asmara',
'Antarctica/Mawson': u'Mawson',
'America/Buenos_Aires': u'Buenos Aires',
'Asia/Kolkata': u'Kolkata',
'Africa/Maseru': u'Maseru',
'America/Atikokan': u'Atikokan',
'America/Louisville': u'Louisville',
'Pacific/Yap': u'Yap',
'America/Santa_Isabel': u'Santa Isabel',
'Asia/Kuching': u'Kuching',
'Africa/Libreville': u'Libreville',
'Africa/Freetown': u'Freetown',
'Africa/Bissau': u'Bissau',
'Europe/Samara': u'Samara',
'Europe/Amsterdam': u'Amsterdam',
'Europe/Tirane': u'Tirane',
'Pacific/Saipan': u'Saipan',
'Africa/Abidjan': u'Abidjan',
'Europe/Zaporozhye': u'Zaporozhye',
'America/Atka': u'Atka',
'America/El_Salvador': u'El Salvador',
'Europe/Madrid': u'Madrid',
'Africa/Juba': u'Juba',
'America/Santiago': u'Santiago',
'America/Argentina/Buenos_Aires': u'Buenos Aires',
'America/Argentina/San_Luis': u'San Luis',
'Europe/Skopje': u'Skopje',
'WET': u'WET',
'America/Aruba': u'Aruba',
'Navajo': u'Navajo',
'America/Indianapolis': u'Indianapolis',
'America/Regina': u'Regina',
'Pacific/Truk': u'Chuuk',
'Pacific/Chuuk': u'Chuuk',
'Asia/Khandyga': u'Khandyga',
'Pacific/Funafuti': u'Funafuti',
'Canada/Atlantic': u'Atlantic',
'America/Merida': u'Merida',
'America/Guatemala': u'Guatemala',
'Africa/Sao_Tome': u'Sao Tome',
'Asia/Tomsk': u'Tomsk',
'Asia/Makassar': u'Makassar',
'Africa/Bujumbura': u'Bujumbura',
'Europe/Chisinau': u'Chisinau',
'Europe/Warsaw': u'Warsaw',
'Asia/Yekaterinburg': u'Yekaterinburg',
'US/Hawaii': u'Hawaii',
'MET': u'MET',
'Antarctica/Casey': u'Casey',
'Pacific/Enderbury': u'Enderbury',
'America/Thule': u'Thule',
'America/St_Johns': u'St. Johns',
'America/Moncton': u'Moncton',
'Europe/Helsinki': u'Helsinki',
'Atlantic/Cape_Verde': u'Cape Verde',
'America/Tegucigalpa': u'Tegucigalpa',
'Indian/Cocos': u'Cocos',
'America/Boise': u'Boise',
'America/Guadeloupe': u'Guadeloupe',
'America/Nassau': u'Nassau',
'Europe/Prague': u'Prague',
'America/Halifax': u'Halifax',
'Asia/Hovd': u'Hovd',
'Canada/Saskatchewan': u'Saskatchewan',
'America/Manaus': u'Manaus',
'America/Rankin_Inlet': u'Rankin Inlet',
'Etc/UCT': u'UCT',
'GB-Eire': u'GB-Eire',
'Etc/Greenwich': u'Greenwich',
'Atlantic/Jan_Mayen': u'Jan Mayen',
'America/North_Dakota/Beulah': u'Beulah, North Dakota',
'America/Chihuahua': u'Chihuahua',
'America/Iqaluit': u'Iqaluit',
'America/Argentina/Rio_Gallegos': u'Rio Gallegos',
'Pacific/Gambier': u'Gambier',
'Europe/Volgograd': u'Volgograd',
'Africa/Bamako': u'Bamako',
'Asia/Novokuznetsk': u'Novokuznetsk',
'Europe/Uzhgorod': u'Uzhgorod',
'Africa/Banjul': u'Banjul',
'Asia/Aqtau': u'Aqtau',
'Pacific/Palau': u'Palau',
'Africa/Malabo': u'Malabo',
'Europe/Minsk': u'Minsk',
'PST8PDT': u'PST8PDT',
'America/Argentina/ComodRivadavia': u'ComodRivadavia',
'Atlantic/Madeira': u'Madeira',
'Pacific/Noumea': u'Noumea',
'GMT0': u'GMT0',
'Africa/Kinshasa': u'Kinshasa',
'Europe/Malta': u'Malta',
'US/Samoa': u'Samoa',
'America/Argentina/Ushuaia': u'Ushuaia',
'Asia/Chungking': u'Chungking',
'Asia/Bangkok': u'Bangkok',
'Pacific/Niue': u'Niue',
'America/Catamarca': u'Catamarca',
'America/Recife': u'Recife',
'MST': u'MST',
'Asia/Yerevan': u'Yerevan',
'America/La_Paz': u'La Paz',
'Poland': u'Poland',
'Asia/Urumqi': u'Urumqi',
'Africa/Lusaka': u'Lusaka',
'US/Indiana-Starke': u'Indiana-Starke',
'Pacific/Guadalcanal': u'Guadalcanal',
'America/Yellowknife': u'Yellowknife',
'Australia/LHI': u'LHI',
'Asia/Vientiane': u'Vientiane',
'Asia/Kuwait': u'Kuwait',
'Africa/Conakry': u'Conakry',
'Asia/Dubai': u'Dubai',
'America/Argentina/Tucuman': u'Tucuman',
'Asia/Chita': u'Chita',
'Europe/Oslo': u'Oslo',
'Australia/Currie': u'Currie',
'America/St_Kitts': u'St. Kitts',
'America/Panama': u'Panama',
'America/Hermosillo': u'Hermosillo',
'Asia/Hebron': u'Hebron',
'America/Guayaquil': u'Guayaquil',
'Asia/Kuala_Lumpur': u'Kuala Lumpur',
'Europe/London': u'London',
'America/Menominee': u'Menominee',
'Asia/Kamchatka': u'Kamchatka',
'Europe/Ulyanovsk': u'Ulyanovsk',
'Asia/Vladivostok': u'Vladivostok',
'America/Matamoros': u'Matamoros',
'Brazil/DeNoronha': u'DeNoronha',
'Asia/Qatar': u'Qatar',
'Israel': u'Israel',
'NZ-CHAT': u'NZ-CHAT',
'Asia/Dushanbe': u'Dushanbe',
'Asia/Yakutsk': u'Yakutsk',
'Asia/Omsk': u'Omsk',
'Africa/Bangui': u'Bangui',
'UTC': u'UTC',
'America/Paramaribo': u'Paramaribo',
'Etc/GMT-11': u'GMT-11',
'Etc/GMT-10': u'GMT-10',
'Etc/GMT-13': u'GMT-13',
'Etc/GMT-12': u'GMT-12',
'Etc/GMT-14': u'GMT-14',
'Pacific/Marquesas': u'Marquesas',
'US/Central': u'Central',
'Europe/Bratislava': u'Bratislava',
'Asia/Anadyr': u'Anadyr',
'America/New_York': u'New York',
'Pacific/Norfolk': u'Norfolk',
'CST6CDT': u'CST6CDT',
'Pacific/Rarotonga': u'Rarotonga',
'America/Dominica': u'Dominica',
'Africa/Porto-Novo': u'Porto-Novo',
'Asia/Samarkand': u'Samarkand',
'America/Kentucky/Louisville': u'Louisville',
'America/Toronto': u'Toronto',
'America/Bahia': u'Bahia',
'Indian/Maldives': u'Maldives',
'Africa/Accra': u'Accra',
'Antarctica/South_Pole': u'South Pole',
'Asia/Muscat': u'Muscat',
'America/Virgin': u'Virgin',
'America/Edmonton': u'Edmonton',
'Pacific/Wake': u'Wake',
'America/Indiana/Tell_City': u'Tell City, Indiana',
'Australia/Darwin': u'Darwin',
'America/Whitehorse': u'Whitehorse',
'America/Swift_Current': u'Swift Current',
'Europe/Copenhagen': u'Copenhagen',
'America/Fort_Wayne': u'Fort Wayne',
'America/Montserrat': u'Montserrat',
'America/Mendoza': u'Mendoza',
'US/Mountain': u'Mountain',
'Europe/Simferopol': u'Simferopol',
'Africa/Blantyre': u'Blantyre',
'America/Detroit': u'Detroit',
'America/Shiprock': u'Shiprock',
'America/Grenada': u'Grenada',
'Atlantic/Faroe': u'Faroe',
'America/Indiana/Petersburg': u'Petersburg, Indiana',
'Asia/Kathmandu': u'Kathmandu',
'Asia/Pontianak': u'Pontianak',
'Jamaica': u'Jamaica',
'Europe/Athens': u'Athens',
'America/Port-au-Prince': u'Port-au-Prince',
'America/Cayman': u'Cayman',
'Etc/Universal': u'Universal',
'Africa/Dar_es_Salaam': u'Dar es Salaam',
'America/Curacao': u'Curacao',
'Indian/Kerguelen': u'Kerguelen',
'Africa/Khartoum': u'Khartoum',
'Asia/Manila': u'Manila',
'Africa/Lome': u'Lome',
'America/Jujuy': u'Jujuy',
'Africa/Douala': u'Douala',
'EET': u'EET',
'America/Argentina/San_Juan': u'San Juan',
'America/North_Dakota/New_Salem': u'New Salem, North Dakota',
'America/Kralendijk': u'Kralendijk',
'Pacific/Port_Moresby': u'Port Moresby',
'Europe/Jersey': u'Jersey',
'Asia/Macao': u'Macao',
'Europe/Andorra': u'Andorra',
'ROK': u'ROK',
'Cuba': u'Cuba',
'Europe/Luxembourg': u'Luxembourg',
'Pacific/Honolulu': u'Honolulu',
'ROC': u'ROC',
'America/St_Thomas': u'St. Thomas',
'Pacific/Majuro': u'Majuro',
'Asia/Hong_Kong': u'Hong Kong',
'Asia/Macau': u'Macau',
'MST7MDT': u'MST7MDT',
'Europe/Belgrade': u'Belgrade',
'Asia/Choibalsan': u'Choibalsan',
'US/Eastern': u'Eastern',
'Europe/Mariehamn': u'Mariehamn',
'Antarctica/McMurdo': u'McMurdo',
'America/Thunder_Bay': u'Thunder Bay',
'America/Los_Angeles': u'Los Angeles',
'Asia/Kabul': u'Kabul',
'Indian/Antananarivo': u'Antananarivo',
'Europe/Sarajevo': u'Sarajevo',
'Atlantic/Reykjavik': u'Reykjavik',
'Asia/Nicosia': u'Nicosia',
'Etc/GMT+11': u'GMT+11',
'Etc/GMT+10': u'GMT+10',
'Pacific/Ponape': u'Pohnpei',
'Japan': u'Japan',
'Asia/Ulan_Bator': u'Ulan Bator',
'Asia/Barnaul': u'Barnaul',
'Kwajalein': u'Kwajalein',
'Pacific/Tongatapu': u'Tongatapu',
'America/Marigot': u'Marigot',
'Pacific/Pitcairn': u'Pitcairn',
'Pacific/Easter': u'Easter Island',
'US/East-Indiana': u'East-Indiana',
'Atlantic/South_Georgia': u'South Georgia',
'Africa/El_Aaiun': u'El Aaiun',
'US/Pacific-New': u'Pacific-New',
'Chile/Continental': u'Continental',
'Europe/Kirov': u'Kirov',
'America/Campo_Grande': u'Campo Grande',
'America/Dawson_Creek': u'Dawson Creek',
'America/Rosario': u'Rosario',
'Antarctica/Vostok': u'Vostok',
'US/Aleutian': u'Aleutian',
'Europe/Bucharest': u'Bucharest',
'America/Porto_Velho': u'Porto Velho',
'Europe/Monaco': u'Monaco',
'NZ': u'NZ',
'Africa/Ceuta': u'Ceuta',
'Europe/Rome': u'Rome',
'America/Winnipeg': u'Winnipeg',
'America/Knox_IN': u'Knox IN',
'Asia/Aqtobe': u'Aqtobe',
'Africa/Dakar': u'Dakar',
'America/Fortaleza': u'Fortaleza',
'Pacific/Samoa': u'Samoa',
'Pacific/Tarawa': u'Tarawa',
'America/Dawson': u'Dawson',
'Africa/Addis_Ababa': u'Addis Ababa',
'Pacific/Efate': u'Efate',
'Pacific/Johnston': u'Johnston',
'GMT': u'GMT',
'Australia/Brisbane': u'Brisbane',
'Canada/Yukon': u'Yukon',
'Asia/Qyzylorda': u'Qyzylorda',
'Europe/San_Marino': u'San Marino',
'Asia/Jerusalem': u'Jerusalem',
'America/Barbados': u'Barbados',
'Pacific/Auckland': u'Auckland',
'America/Metlakatla': u'Metlakatla',
'Etc/Zulu': u'Zulu',
'America/Denver': u'Denver',
'Indian/Chagos': u'Chagos',
'America/Glace_Bay': u'Glace Bay',
'Pacific/Bougainville': u'Bougainville Island',
'Africa/Gaborone': u'Gaborone',
'Africa/Tunis': u'Tunis',
'Australia/Tasmania': u'Tasmania',
'Asia/Ust-Nera': u'Ust-Nera',
'Europe/Vaduz': u'Vaduz',
'Africa/Lubumbashi': u'Lubumbashi',
'America/Resolute': u'Resolute',
'Etc/GMT': u'GMT',
'Asia/Gaza': u'Gaza',
'Europe/Dublin': u'Dublin',
'GMT+0': u'GMT+0',
'Antarctica/DumontDUrville': u'Dumont dUrville',
'America/Argentina/Catamarca': u'Catamarca',
'America/Indiana/Knox': u'Knox, Indiana',
'Etc/GMT-6': u'GMT-6',
'Africa/Timbuktu': u'Timbuktu',
'Asia/Novosibirsk': u'Novosibirsk',
'EST': u'EST',
'Mexico/BajaNorte': u'BajaNorte',
'Africa/Kigali': u'Kigali',
'Brazil/West': u'West',
'America/Grand_Turk': u'Grand Turk',
'Mexico/BajaSur': u'BajaSur',
'America/Argentina/Salta': u'Salta',
'Canada/Central': u'Central',
'Africa/Lagos': u'Lagos',
'GMT-0': u'GMT-0',
'Europe/Sofia': u'Sofia',
'Singapore': u'Singapore',
'Africa/Tripoli': u'Tripoli',
'America/Anchorage': u'Anchorage',
'America/Monterrey': u'Monterrey',
'Pacific/Nauru': u'Nauru',
}
territories = {
'BD': u'Bangladesh',
'BE': u'Belgium',
'BF': u'Burkina Faso',
'BG': u'Bulgaria',
'VE': u'Venezuela',
'BA': u'Bosnia & Herzegovina',
'BB': u'Barbados',
'WF': u'Wallis & Futuna',
'BL': u'St. Barthélemy',
'BM': u'Bermuda',
'BN': u'Brunei',
'BO': u'Bolivia',
'BH': u'Bahrain',
'BI': u'Burundi',
'BJ': u'Benin',
'BT': u'Bhutan',
'011': u'Western Africa',
'BV': u'Bouvet Island',
'BW': u'Botswana',
'014': u'Eastern Africa',
'015': u'Northern Africa',
'BR': u'Brazil',
'017': u'Middle Africa',
'018': u'Southern Africa',
'019': u'Americas',
'BY': u'Belarus',
'BZ': u'Belize',
'LV': u'Latvia',
'RW': u'Rwanda',
'RS': u'Serbia',
'TL': u'Timor-Leste',
'RE': u'Réunion',
'TM': u'Turkmenistan',
'OM': u'Oman',
'TJ': u'Tajikistan',
'RO': u'Romania',
'TK': u'Tokelau',
'GW': u'Guinea-Bissau',
'GU': u'Guam',
'GT': u'Guatemala',
'GS': u'South Georgia & South Sandwich Islands',
'GR': u'Greece',
'GQ': u'Equatorial Guinea',
'GP': u'Guadeloupe',
'JP': u'Japan',
'KI': u'Kiribati',
'GY': u'Guyana',
'GG': u'Guernsey',
'GF': u'French Guiana',
'GE': u'Georgia',
'GD': u'Grenada',
'021': u'Northern America',
'GB': u'United Kingdom',
'GA': u'Gabon',
'SV': u'El Salvador',
'GN': u'Guinea',
'GM': u'Gambia',
'GL': u'Greenland',
'029': u'Caribbean',
'GI': u'Gibraltar',
'GH': u'Ghana',
'JE': u'Jersey',
'TN': u'Tunisia',
'JM': u'Jamaica',
'013': u'Central America',
'WS': u'Samoa',
'TA': u'Tristan da Cunha',
'419': u'Latin America',
'BQ': u'Caribbean Netherlands',
'HR': u'Croatia',
'BS': u'Bahamas',
'HT': u'Haiti',
'HU': u'Hungary',
'HK': u'Hong Kong SAR China',
'039': u'Southern Europe',
'HN': u'Honduras',
'FI': u'Finland',
'142': u'Asia',
'030': u'Eastern Asia',
'034': u'Southern Asia',
'035': u'Southeast Asia',
'PR': u'Puerto Rico',
'PS': u'Palestinian Territories',
'FK': u'Falkland Islands',
'IO': u'British Indian Ocean Territory',
'PW': u'Palau',
'PT': u'Portugal',
'SJ': u'Svalbard & Jan Mayen',
'MD': u'Moldova',
'IQ': u'Iraq',
'PA': u'Panama',
'PF': u'French Polynesia',
'PG': u'Papua New Guinea',
'PE': u'Peru',
'PK': u'Pakistan',
'PH': u'Philippines',
'FO': u'Faroe Islands',
'PN': u'Pitcairn Islands',
'PL': u'Poland',
'PM': u'St. Pierre & Miquelon',
'ZM': u'Zambia',
'EH': u'Western Sahara',
'RU': u'Russia',
'EE': u'Estonia',
'EG': u'Egypt',
'EA': u'Ceuta & Melilla',
'ZA': u'South Africa',
'EC': u'Ecuador',
'IT': u'Italy',
'VN': u'Vietnam',
'ZZ': u'Unknown Region',
'SB': u'Solomon Islands',
'EU': u'European Union',
'ET': u'Ethiopia',
'SO': u'Somalia',
'ZW': u'Zimbabwe',
'SA': u'Saudi Arabia',
'ES': u'Spain',
'ER': u'Eritrea',
'ME': u'Montenegro',
'AQ': u'Antarctica',
'MG': u'Madagascar',
'MF': u'St. Martin',
'MA': u'Morocco',
'MC': u'Monaco',
'UZ': u'Uzbekistan',
'MM': u'Myanmar (Burma)',
'ML': u'Mali',
'MO': u'Macau SAR China',
'MN': u'Mongolia',
'HM': u'Heard & McDonald Islands',
'AS': u'American Samoa',
'MK': u'Macedonia',
'MU': u'Mauritius',
'MT': u'Malta',
'MW': u'Malawi',
'MV': u'Maldives',
'MQ': u'Martinique',
'MP': u'Northern Mariana Islands',
'MS': u'Montserrat',
'MR': u'Mauritania',
'IM': u'Isle of Man',
'UG': u'Uganda',
'TZ': u'Tanzania',
'MY': u'Malaysia',
'MX': u'Mexico',
'IL': u'Israel',
'IC': u'Canary Islands',
'FR': u'France',
'AW': u'Aruba',
'DO': u'Dominican Republic',
'SH': u'St. Helena',
'VC': u'St. Vincent & Grenadines',
'054': u'Melanesia',
'DJ': u'Djibouti',
'FJ': u'Fiji',
'057': u'Micronesian Region',
'FM': u'Micronesia',
'053': u'Australasia',
'NI': u'Nicaragua',
'NL': u'Netherlands',
'NO': u'Norway',
'NA': u'Namibia',
'VU': u'Vanuatu',
'NC': u'New Caledonia',
'NE': u'Niger',
'NF': u'Norfolk Island',
'NG': u'Nigeria',
'NZ': u'New Zealand',
'NP': u'Nepal',
'NR': u'Nauru',
'NU': u'Niue',
'061': u'Polynesia',
'XK': u'Kosovo',
'CI': u'Côte dIvoire',
'CH': u'Switzerland',
'CO': u'Colombia',
'CN': u'China',
'CM': u'Cameroon',
'CL': u'Chile',
'CC': u'Cocos (Keeling) Islands',
'CA': u'Canada',
'CG': u'Congo - Brazzaville',
'CF': u'Central African Republic',
'CD': u'Congo - Kinshasa',
'CZ': u'Czech Republic',
'CY': u'Cyprus',
'CX': u'Christmas Island',
'CR': u'Costa Rica',
'PY': u'Paraguay',
'CP': u'Clipperton Island',
'CW': u'Curaçao',
'CV': u'Cape Verde',
'CU': u'Cuba',
'SZ': u'Swaziland',
'SY': u'Syria',
'SX': u'Sint Maarten',
'KG': u'Kyrgyzstan',
'KE': u'Kenya',
'SS': u'South Sudan',
'SR': u'Suriname',
'143': u'Central Asia',
'KH': u'Cambodia',
'KN': u'St. Kitts & Nevis',
'KM': u'Comoros',
'ST': u'São Tomé & Príncipe',
'SK': u'Slovakia',
'KR': u'South Korea',
'SI': u'Slovenia',
'KP': u'North Korea',
'KW': u'Kuwait',
'SN': u'Senegal',
'SM': u'San Marino',
'SL': u'Sierra Leone',
'SC': u'Seychelles',
'KZ': u'Kazakhstan',
'KY': u'Cayman Islands',
'SG': u'Singapore',
'SE': u'Sweden',
'SD': u'Sudan',
'151': u'Eastern Europe',
'150': u'Europe',
'DM': u'Dominica',
'155': u'Western Europe',
'154': u'Northern Europe',
'VG': u'British Virgin Islands',
'DG': u'Diego Garcia',
'DE': u'Germany',
'YE': u'Yemen',
'MH': u'Marshall Islands',
'DZ': u'Algeria',
'US': u'United States',
'UY': u'Uruguay',
'YT': u'Mayotte',
'UM': u'U.S. Outlying Islands',
'LB': u'Lebanon',
'LC': u'St. Lucia',
'LA': u'Laos',
'TV': u'Tuvalu',
'TW': u'Taiwan',
'TT': u'Trinidad & Tobago',
'TR': u'Turkey',
'LK': u'Sri Lanka',
'LI': u'Liechtenstein',
'CK': u'Cook Islands',
'TO': u'Tonga',
'LT': u'Lithuania',
'LU': u'Luxembourg',
'LR': u'Liberia',
'LS': u'Lesotho',
'TH': u'Thailand',
'TF': u'French Southern Territories',
'TG': u'Togo',
'TD': u'Chad',
'TC': u'Turks & Caicos Islands',
'LY': u'Libya',
'VA': u'Vatican City',
'AC': u'Ascension Island',
'145': u'Western Asia',
'AE': u'United Arab Emirates',
'AD': u'Andorra',
'AG': u'Antigua & Barbuda',
'AF': u'Afghanistan',
'AI': u'Anguilla',
'VI': u'U.S. Virgin Islands',
'IS': u'Iceland',
'IR': u'Iran',
'AM': u'Armenia',
'AL': u'Albania',
'AO': u'Angola',
'003': u'North America',
'002': u'Africa',
'001': u'World',
'AR': u'Argentina',
'AU': u'Australia',
'AT': u'Austria',
'005': u'South America',
'IN': u'India',
'AX': u'Åland Islands',
'009': u'Oceania',
'AZ': u'Azerbaijan',
'IE': u'Ireland',
'ID': u'Indonesia',
'JO': u'Jordan',
'UA': u'Ukraine',
'QA': u'Qatar',
'DK': u'Denmark',
'MZ': u'Mozambique',
'QO': u'Outlying Oceania',
}

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -0,0 +1,26 @@
import six
from .translation import L18NMap, L18NListMap
try:
from . import __maps
tz_cities = L18NMap(__maps.tz_cities)
territories = L18NMap(__maps.territories)
# tz_fullnames requires a main dictionary and an auxiliary translations
# dictionary (for components)
_main_dict = dict(__maps.tz_cities)
_aux_dict = {}
for k, v in six.iteritems(__maps.tz_locations):
if k in _main_dict:
_main_dict[k] = v
else:
_aux_dict[k] = v
tz_fullnames = L18NListMap('/', _aux_dict, _main_dict)
except ImportError:
tz_cities = {}
tz_fullnames = {}
territories = {}

Wyświetl plik

@ -0,0 +1,275 @@
import os
import gettext
import bisect
from locale import getdefaultlocale
from collections import MutableMapping
from copy import copy, deepcopy
import six
class Trans(object):
def __init__(self):
self.registry = {}
self.current = None
self.set(getdefaultlocale()[0])
def __getitem__(self, language):
if language:
try:
return self.registry[language]
except KeyError:
self.registry[language] = gettext.translation(
'l18n',
os.path.join(os.path.dirname(__file__), 'locale'),
languages=[language],
fallback=True
)
return self.registry[language]
else:
return None
def set(self, language):
self.current = self[language]
def gettext(self, s):
try:
return self.current.gettext(s)
except AttributeError:
return s
if six.PY2:
def ugettext(self, s):
try:
return self.current.ugettext(s)
except AttributeError:
return s
_trans = Trans()
def set_language(language=None):
_trans.set(language)
if six.PY2:
def translate(s, utf8=True, trans=_trans):
if trans:
if utf8:
return trans.ugettext(s)
return trans.gettext(s)
else:
return s
else:
def translate(s, utf8=True, trans=_trans):
if trans:
t = trans.gettext(s)
if utf8:
return t
return t.encode()
else:
return s
class L18NLazyObject(object):
def _value(self, utf8=True):
raise NotImplementedError
def __str__(self):
return self._value(utf8=six.PY3)
def __bytes__(self):
return self._value(utf8=False)
def __unicode__(self):
return self._value(utf8=True)
class L18NLazyString(L18NLazyObject):
def __init__(self, s):
self._str = s
def __copy__(self):
return self.__class__(self._str)
def __deepcopy__(self, memo):
result = self.__copy__()
memo[id(self)] = result
return result
def _value(self, utf8=True):
return translate(self._str, utf8)
def __repr__(self):
return 'L18NLazyString <%s>' % repr(self._str)
def __getattr__(self, name):
# fallback to call the value's attribute in case it's not found in
# L18NLazyString
return getattr(self._value(), name)
class L18NLazyStringsList(L18NLazyObject):
def __init__(self, sep='/', *s):
# we assume that the separator and the strings have the same encoding
# (text_type)
self._sep = sep
self._strings = s
def __copy__(self):
return self.__class__(self._sep, *self._strings)
def __deepcopy__(self, memo):
result = self.__copy__()
memo[id(self)] = result
return result
def _value(self, utf8=True):
sep = self._sep
if utf8 and isinstance(sep, six.binary_type):
sep = sep.decode(encoding='utf-8')
elif not utf8 and isinstance(sep, six.text_type):
sep = sep.encode(encoding='utf-8')
return sep.join([translate(s, utf8)
for s in self._strings])
def __repr__(self):
return 'L18NLazyStringsList <%s>' % self._sep.join([
repr(s) for s in self._strings
])
def __getattr__(self, name):
# fallback to call the value's attribute in case it's not found in
# L18NLazyStringsList
return getattr(self._value(), name)
class L18NBaseMap(MutableMapping):
"""
Generic dictionary that returns lazy string or lazy string lists
"""
def __init__(self, *args, **kwargs):
self.store = dict(*args, **kwargs)
self.sorted = {}
def __copy__(self):
result = self.__class__()
result.store = self.store
result.sorted = self.sorted
return result
def __deepcopy__(self, memo):
result = self.__class__()
memo[id(self)] = result
result.store = deepcopy(self.store, memo)
result.sorted = deepcopy(self.sorted, memo)
return result
def __getitem__(self, key):
raise NotImplementedError
def __setitem__(self, key, value):
self.store[key] = value
for locale, (keys, values) in six.iteritems(self.sorted):
tr = translate(value, trans=_trans[locale])
i = bisect.bisect_left(values, tr)
keys.insert(i, key)
values.insert(i, tr)
def __delitem__(self, key):
del self.store[key]
for keys, values in self.sorted.values():
i = keys.index(key)
del keys[i]
del values[i]
def __iter__(self):
loc = _trans.current._info['language'] if _trans.current else None
try:
return iter(self.sorted[loc][0])
except KeyError:
keys = []
values = []
# we can't use iteritems here, as we need to call __getitem__
# via self[key]
for key in iter(self.store):
value = six.text_type(self[key])
i = bisect.bisect_left(values, value)
keys.insert(i, key)
values.insert(i, value)
self.sorted[loc] = (keys, values)
return iter(keys)
def __len__(self):
return len(self.store)
def subset(self, keys):
"""
Generates a subset of the current map (e.g. to retrieve only tzs in
common_timezones from the tz_cities or tz_fullnames maps)
"""
sub = self.__class__()
self_keys = set(self.store.keys())
subset_keys = self_keys.intersection(keys)
removed_keys = self_keys.difference(subset_keys)
sub.store = {k: self.store[k] for k in subset_keys}
for loc, sorted_items in six.iteritems(self.sorted):
loc_keys = copy(self.sorted[loc][0])
loc_values = copy(self.sorted[loc][1])
for k in removed_keys:
i = loc_keys.index(k)
del loc_keys[i]
del loc_values[i]
sub.sorted[loc] = (loc_keys, loc_values)
return sub
class L18NMap(L18NBaseMap):
def __getitem__(self, key):
return L18NLazyString(self.store[key])
class L18NListMap(L18NBaseMap):
def __init__(self, sep='/', aux=None, *args, **kwargs):
self._sep = sep
self._aux = aux
super(L18NListMap, self).__init__(*args, **kwargs)
def __copy__(self):
result = super(L18NListMap, self).__copy__()
result._sep = self._sep
result._aux = self._aux
return result
def __deepcopy__(self, memo):
result = super(L18NListMap, self).__deepcopy__(memo)
result._sep = self._sep
result._aux = None if self._aux is None else deepcopy(self._aux, memo)
return result
def __getitem__(self, key):
strs = key.split(self._sep)
strs[-1] = key
lst = []
for s in strs:
try:
lst.append(self.store[s])
except KeyError:
lst.append(self._aux[s])
return L18NLazyStringsList(self._sep, *lst)
def subset(self, keys):
sub = super(L18NListMap, self).subset(keys)
sub._sep = self._sep
sub._aux = deepcopy(self._aux)
return sub

Wyświetl plik

@ -0,0 +1,32 @@
import locale
from pytz import country_timezones
import six
from .maps import tz_cities
def get_country_timezones(country_code):
"""
Retrieves the timezones for a given country, sorted in alphabetical order
"""
tz_list = []
if country_code in country_timezones:
tzs = country_timezones[country_code]
tz_list = [(t, tz_cities[t]) for t in tzs]
tz_list.sort(lambda x, y: locale.strcoll(x[1], y[1]))
return tz_list
def get_country_code_from_tz(tz):
"""
Retrieves the country matching a given timezone
"""
for c, t in six.iteritems(country_timezones):
if tz in t:
return c
return None

Wyświetl plik

@ -0,0 +1,40 @@
__version_info__ = (2016, 6, 4, 'final', 0)
def get_version(version=__version_info__):
dev_st = {'alpha': 'a', 'beta': 'b', 'rc': 'c', 'final': ''}
assert len(version) == 5
assert version[3] in dev_st.keys()
n = 2 + (version[2] != 0)
version_str = '.'.join([str(v) for v in version[:n]])
if version[3] == 'final':
return version_str
if version[3:] == ('alpha', 0):
return '%s.dev%s' % (version_str, get_hg_chgset())
else:
return ''.join((version_str, dev_st[version[3]], str(version[4])))
def get_hg_chgset():
import subprocess
try:
# python 3
DEVNULL = subprocess.DEVNULL
except AttributeError:
import os
DEVNULL = open(os.devnull, 'wb')
try:
return subprocess.check_output(['hg', 'id', '-i'],
stderr=DEVNULL).strip()
except:
return '?'
__version__ = get_version()