Mini Shell

Direktori : /lib/python3.6/site-packages/langtable/__pycache__/
Upload File :
Current File : //lib/python3.6/site-packages/langtable/__pycache__/langtable.cpython-36.opt-1.pyc

3

s�^k�@s�ddlZddlZddlZddlZddlZddlZddlmZej	ddddddg�Z
d	giZd
Zej
d��Zddddd�ZiZiZiZiZiZGdd�d�ZGdd�d�ZGdd�d�ZGdd�d�ZGdd �d �ZGd!d"�d"ee�ZGd#d$�d$e�ZGd%d&�d&e�ZGd'd(�d(e�ZGd)d*�d*e�ZGd+d,�d,e�Z d-d.�Z!d/d0�Z"d1d2�Z#d3d4�Z$d5d6�Z%d7d8�Z&d9d:�Z'd;d<�Z(d�d>d?�Z)d@dA�Z*d�dCdD�Z+dEdF�Z,d�dHdI�Z-d�dJdK�Z.d�dLdM�Z/d�dNdO�Z0d�dPdQ�Z1d�dRdS�Z2d�dTdU�Z3d�dVdW�Z4dXZ5d�dZd[�Z6d�d\d]�Z7d�d^d_�Z8d�d`da�Z9d�dbdc�Z:d�ddde�Z;d�dfdg�Z<dhdi�Z=djdk�Z>dldm�Z?d�dndo�Z@d�dqdr�ZAGdsdt�dt�ZBeB�ZCeDduk�r�ddlEZEeA�eEjF�dS)��N)�ContentHandler�Locale�language�script�	territory�variant�encoding�data_files_readz/usr/share/langtablez^(?P<language>[a-z]{2,3}z(?=$|@z,|_[A-Z][a-z]{3}(?=$|@|_[A-Z0-9]{2,3}(?=$|@))z|_[A-Z0-9]{2,3}(?=$|@)z))z(?:_(?P<script>[A-Z][a-z]{3})z)){0,1}z (?:_(?P<territory>[A-Z0-9]{2,3})ZLatnZCyrlZDeva)�latinZiqtelif�cyrillicZ
devanagaric@seZdZddd�ZdS)�territory_db_itemNc		Cs4||_||_||_||_||_||_||_||_dS)N)�names�scripts�locales�	languages�	keyboards�inputmethods�consolefonts�	timezones)	�selfr
rrrrrrr�r�/usr/lib/python3.6/langtable.py�__init__�szterritory_db_item.__init__)NNNNNNNN)�__name__�
__module__�__qualname__rrrrrr�src@seZdZddd�ZdS)�language_db_itemNcCsF||_||_||_||_||_||_||_||_|	|_|
|_	||_
dS)N)�iso639_1�
iso639_2_t�
iso639_2_br
rr�territoriesrrrr)rrrrr
rrr rrrrrrrr�szlanguage_db_item.__init__)NNNNNNNNNNN)rrrrrrrrr�src@seZdZddd�ZdS)�keyboard_db_itemNTcCs"||_||_||_||_||_dS)N)�description�ascii�commentrr )rr"r#rr r$rrrr�s
zkeyboard_db_item.__init__)NTNNN)rrrrrrrrr!�sr!c@seZdZddd�ZdS)�timezone_db_itemNcCs
||_dS)N)r
)rr
rrrr�sztimezone_db_item.__init__)N)rrrrrrrrr%�sr%c@seZdZddd�ZdS)�timezoneIdPart_db_itemNcCs
||_dS)N)r
)rr
rrrr�sztimezoneIdPart_db_item.__init__)N)rrrrrrrrr&�sr&c@s eZdZdZdd�Zdd�ZdS)�LangtableContentHandlerz�
    A base class inherited from the xml.sax.handler.ContentHandler class
    providing handling for SAX events produced when parsing the langtable data
    files.

    cCs
d|_dS)N)�_save_to)rrrrr�sz LangtableContentHandler.__init__cCs>|jdkrdSt||j�}|r(||}n|}t||j|�dS)z Handler for the text data event.N)r(�getattr�setattr)rZcontentZ	old_valueZ	new_valuerrr�
characters�s

z"LangtableContentHandler.charactersN)rrr�__doc__rr+rrrrr'�sr'cs8eZdZdZ�fdd�Zdd�Zdd�Zdd	�Z�ZS)
�TerritoriesContentHandlerzFHandler for SAX events produced when parsing the territories.xml file.csZtt|�j�d|_d|_d|_d|_d|_d|_d|_	d|_
d|_d|_d|_
d|_dS)N)�superr-r�_territoryId�_item_id�
_item_rank�
_item_name�_names�_scripts�_locales�
_languages�
_keyboards�
_inputmethods�
_consolefonts�
_timezones)r)�	__class__rrr�sz"TerritoriesContentHandler.__init__cCs�|dkrJt�|_t�|_t�|_t�|_t�|_t�|_t�|_t�|_n>|dkrZd|_	n.|dkrjd|_	n|dkrzd
|_	n|dkr�d|_	dS)Nr�territoryIdr/�
languageId�scriptId�localeId�
keyboardId�
inputmethodId�
consolefontId�
timezoneIdr0�trNamer2�rankr1)r=r>r?r@rArBrC)
�dictr3r4r5r6r7r8r9r:r()r�name�attrsrrr�startElement�s$
z&TerritoriesContentHandler.startElementc
Cs�d|_|dkrzt|j|j|j|j|j|j|j|j	d�t
t|j�<d|_d|_d|_d|_d|_d|_d|_d|_d|_	�nF|dkr�|j
|jt|j�<|j��n |dkr�t|j�|jt|j�<|j�n�|dkr�t|j�|jt|j�<|j�n�|dk�rt|j�|jt|j�<|j�n�|dk�rDt|j�|jt|j�<|j�n||dk�rnt|j�|jt|j�<|j�nR|d	k�r�t|j�|jt|j�<|j�n(|d
k�r�t|j�|j	t|j�<|j�dS)Nr)r
rrrrrrrrGr�localer�keyboard�inputmethod�consolefont�timezone)r(rr3r4r5r6r7r8r9r:�_territories_db�strr/r2r0�_clear_item�intr1)rrGrrr�
endElementsX











z$TerritoriesContentHandler.endElementcCsd|_d|_d|_dS)N)r0r2r1)rrrrrQEsz%TerritoriesContentHandler._clear_item)	rrrr,rrIrSrQ�
__classcell__rr)r;rr-�s
5r-cs8eZdZdZ�fdd�Zdd�Zdd�Zdd	�Z�ZS)
�KeyboardsContentHandlerzDHandler for SAX events produced when parsing the keyboards.xml file.csBtt|�j�d|_d|_d|_d|_d|_d|_d|_	d|_
dS)N)r.rUr�_keyboardId�_description�_ascii�_commentr0r1r6�_territories)r)r;rrrMsz KeyboardsContentHandler.__init__cCs||dkrt�|_t�|_n^|dkr*d|_nN|dkr:d|_n>|dkrJd|_n.|dkrZd	|_n|dkrjd|_n|d
krxd|_dS)NrKr@rVr"rWr#rXr$rYr=r<r0rEr1)r=r<)rFr6rZr()rrGrHrrrrI^s
z$KeyboardsContentHandler.startElementcCs�d|_|dkr^t|j|jdk|j|j|jd�tt|j	�<d|_	d|_d|_d|_d|_d|_nN|dkr�t
|j�|jt|j�<|j
�n&|dkr�t
|j�|jt|j�<|j
�dS)NrK�True)r"r#r$rr rr)r(r!rWrXrYr6rZ�
_keyboards_dbrPrVrRr1r0rQ)rrGrrrrSss(
z"KeyboardsContentHandler.endElementcCsd|_d|_dS)N)r0r1)rrrrrQ�sz#KeyboardsContentHandler._clear_item)	rrrr,rrIrSrQrTrr)r;rrUJs
rUcs8eZdZdZ�fdd�Zdd�Zdd�Zdd	�Z�ZS)
�LanguagesContentHandlerzDHandler for SAX events produced when parsing the languages.xml file.csrtt|�j�d|_d|_d|_d|_d|_d|_d|_	d|_
d|_d|_d|_
d|_d|_d|_d|_d|_dS)NF)r.r]r�_languageId�	_iso639_1�_iso639_2_t�_iso639_2_br0r1r2�	_in_namesr3r4r5rZr7r8r9r:)r)r;rrr�s"z LanguagesContentHandler.__init__cCs�|dkrJt�|_t�|_t�|_t�|_t�|_t�|_t�|_t�|_n�|dkrb|j	rbd|_
n�|dkrrd|_
nt|dkr�d|_
nd|dkr�d	|_
nT|d
kr�d|_	nD|dkr�d|_
n4|dkr�|j	r�d|_
n|dkr�d|_
n|dkr�d|_
dS)Nrr=r^ziso639-1r_z
iso639-2-tr`z
iso639-2-brar
Tr>r?r<r@rArBrCr0rDr2rEr1)r>r?r<r@rArBrC)rFr3r4r5rZr7r8r9r:rbr()rrGrHrrrrI�s8
z$LanguagesContentHandler.startElementc
Cs�d|_|dkr�t|j|j|j|j|j|j|j|j	|j
|j|jd�t
t|j�<d|_d|_d|_d|_d|_d|_d|_d|_d|_	d|_
d|_d|_�nZ|dkr�d|_�nH|dkr�|j|jt|j�<|j��n"|dkr�t|j�|jt|j�<|j�n�|dk�r"t|j�|jt|j�<|j�n�|dk�rLt|j�|jt|j�<|j�n�|d	k�rvt|j�|j	t|j�<|j�n||d
k�r�t|j�|j
t|j�<|j�nR|dk�r�t|j�|jt|j�<|j�n(|dk�r�t|j�|jt|j�<|j�dS)
Nr)rrrr
rrr rrrrr
FrGrrJrrKrLrMrN)r(rr_r`rar3r4r5rZr7r8r9r:�
_languages_dbrPr^rbr2r0rQrRr1)rrGrrrrS�sh













z"LanguagesContentHandler.endElementcCsd|_d|_d|_dS)N)r0r2r1)rrrrrQsz#LanguagesContentHandler._clear_item)	rrrr,rrIrSrQrTrr)r;rr]�s
$?r]cs8eZdZdZ�fdd�Zdd�Zdd�Zdd	�Z�ZS)
�TimezonesContentHandlerzDHandler for SAX events produced when parsing the timezones.xml file.cs*tt|�j�d|_d|_d|_d|_dS)N)r.rdr�_timezoneIdr0r2r3)r)r;rrrs
z TimezonesContentHandler.__init__cCsD|dkrt�|_n.|dkr"d|_n|dkr2d|_n|dkr@d|_dS)NrNrCrer=r0rDr2)rFr3r()rrGrHrrrrI)s
z$TimezonesContentHandler.startElementcCsXd|_|dkr2t|jd�tt|j�<d|_d|_n"|dkrT|j|jt|j�<|j�dS)NrN)r
rG)	r(r%r3�
_timezones_dbrPrer2r0rQ)rrGrrrrS9sz"TimezonesContentHandler.endElementcCsd|_d|_dS)N)r0r2)rrrrrQKsz#TimezonesContentHandler._clear_item)	rrrr,rrIrSrQrTrr)r;rrds
rdcs8eZdZdZ�fdd�Zdd�Zdd�Zdd	�Z�ZS)
�TimezoneIdPartsContentHandlerzJHandler for SAX events produced when parsing the timezoneidparts.xml file.cs*tt|�j�d|_d|_d|_d|_dS)N)r.rgr�_timezoneIdPartIdr0r2r3)r)r;rrrRs
z&TimezoneIdPartsContentHandler.__init__cCsD|dkrt�|_n.|dkr"d|_n|dkr2d|_n|dkr@d|_dS)N�timezoneIdPart�timezoneIdPartIdrhr=r0rDr2)rFr3r()rrGrHrrrrI^s
z*TimezoneIdPartsContentHandler.startElementcCsXd|_|dkr2t|jd�tt|j�<d|_d|_n"|dkrT|j|jt|j�<|j�dS)Nri)r
rG)	r(r&r3�_timezoneIdParts_dbrPrhr2r0rQ)rrGrrrrSnsz(TimezoneIdPartsContentHandler.endElementcCsd|_d|_dS)N)r0r2)rrrrrQ�sz)TimezoneIdPartsContentHandler._clear_item)	rrrr,rrIrSrQrTrr)r;rrgOs
rgcCs�|jd�|jd��xltt�D�]^}|jd�|jd|d�t|j}|jd�x>t|�D]2}|jdF|d	d
||jdd�d
d�q`W|jd�t|j}|jd�xFt|j�dd�d�D].\}}|jdG|ddt|�dd�q�W|jd�t|j}|jd�xHt|j�dd�d�D]0\}}|jdH|ddt|�dd ��q0W|jd!�t|j	}	|jd"�xHt|	j�d#d�d�D]0\}
}|jdI|
d	dt|�dd%��q�W|jd&�t|j
}|jd'�xHt|j�d(d�d�D]0\}}|jdJ|d+dt|�dd,��qW|jd-�t|j}
|jd.�xHt|
j�d/d�d�D]0\}}|jdK|d2dt|�dd3��qhW|jd4�t|j}|jd5�xHt|j�d6d�d�D]0\}}|jdL|d9dt|�dd:��q�W|jd;�t|j
}|jd<�xHt|j�d=d�d�D]0\}}|jdM|d@dt|�ddA��q8W|jdB�|jdC�q W|jdD�dES)Nz
    Only for internal use
    z'<?xml version="1.0" encoding="UTF-8"?>
z<territories>
z  <territory>
z    <territoryId>z</territoryId>
z    <names>
z      <name>z<languageId>z
</languageId>z<trName>�&z&amp;z	</trName>z</name>
z
    </names>
z    <scripts>
cSsd|d|dfS)N�r���r)�xrrr�<lambda>�sz)_write_territories_file.<locals>.<lambda>)�keyz      <script>z
<scriptId>z</scriptId>z<rank>z</rank>z
</script>
z    </scripts>
z    <locales>
cSsd|d|dfS)Nrmrrnr)rorrrrp�sz      <locale>z
<localeId>z</localeId>z
</locale>
z    </locales>
z    <languages>
cSsd|d|dfS)Nrmrrnr)rorrrrp�sz      <language>z</language>
z    </languages>
z    <keyboards>
cSsd|d|dfS)Nrmrrnr)rorrrrp�sz      <keyboard>z<keyboardId>z
</keyboardId>z</keyboard>
z    </keyboards>
z    <inputmethods>
cSsd|d|dfS)Nrmrrnr)rorrrrp�sz      <inputmethod>z<inputmethodId>z</inputmethodId>z</inputmethod>
z    </inputmethods>
z    <consolefonts>
cSsd|d|dfS)Nrmrrnr)rorrrrp�sz      <consolefont>z<consolefontId>z</consolefontId>z</consolefont>
z    </consolefonts>
z    <timezones>
cSsd|d|dfS)Nrmrrnr)rorrrrp�sz      <timezone>z<timezoneId>z
</timezoneId>z</timezone>
z    </timezones>
z  </territory>
z</territories>
Nz      <name><languageId>z      <script><scriptId>z      <locale><localeId>z      <language><languageId>z      <keyboard><keyboardId>z"      <inputmethod><inputmethodId>z"      <consolefont><consolefontId>z      <timezone><timezoneId>)�write�sortedrOr
�replacer�itemsrPrrrrrr)�filer<r
rGrr>rErr?rr=rr@rrArrBrrCrrr�_write_territories_file�sp




.


&


(


(


(


(


(


(

rwcCs�|jd�|jd��x�tt�D�]�}|jd�|jd|d�|jdtt|j�d�|jdtt|j�d	�|jd
tt|j�d�t|j}|jd�x6t|�D]*}|jdL|dd||dd�q�W|jd�t|j}|jd�xHt|j	�dd�d�D]0\}}|jdM|ddt|�dd��qW|jd�t|j
}|jd�xHt|j	�d d�d�D]0\}}|jdN|d#dt|�dd$��q~W|jd%�t|j}	|jd&�xHt|	j	�d'd�d�D]0\}
}|jdO|
d*dt|�dd+��q�W|jd,�t|j}|jd-�xHt|j	�d.d�d�D]0\}}|jdP|d1dt|�dd2��qNW|jd3�t|j
}
|jd4�xHt|
j	�d5d�d�D]0\}}|jdQ|d8dt|�dd9��q�W|jd:�t|j}|jd;�xHt|j	�d<d�d�D]0\}}|jdR|d?dt|�dd@��qW|jdA�t|j}|jdB�xHt|j	�dCd�d�D]0\}}|jdS|dFdt|�ddG��q�W|jdH�|jdI�q W|jdJ�dKS)Tz
    Only for internal use
    z'<?xml version="1.0" encoding="UTF-8"?>
z<languages>
z
  <language>
z    <languageId>z</languageId>
z    <iso639-1>z</iso639-1>
z    <iso639-2-t>z</iso639-2-t>
z    <iso639-2-b>z</iso639-2-b>
z    <names>
z      <name>z<languageId>z
</languageId>z<trName>z	</trName>z</name>
z
    </names>
z    <scripts>
cSsd|d|dfS)Nrmrrnr)rorrrrp�sz'_write_languages_file.<locals>.<lambda>)rqz      <script>z
<scriptId>z</scriptId>z<rank>z</rank>z
</script>
z    </scripts>
z    <locales>
cSsd|d|dfS)Nrmrrnr)rorrrrp�sz      <locale>z
<localeId>z</localeId>z
</locale>
z    </locales>
z    <territories>
cSsd|d|dfS)Nrmrrnr)rorrrrpsz      <territory>z
<territoryId>z</territoryId>z
</territory>
z    </territories>
z    <keyboards>
cSsd|d|dfS)Nrmrrnr)rorrrrpsz      <keyboard>z<keyboardId>z
</keyboardId>z</keyboard>
z    </keyboards>
z    <inputmethods>
cSsd|d|dfS)Nrmrrnr)rorrrrpsz      <inputmethod>z<inputmethodId>z</inputmethodId>z</inputmethod>
z    </inputmethods>
z    <consolefonts>
cSsd|d|dfS)Nrmrrnr)rorrrrpsz      <consolefont>z<consolefontId>z</consolefontId>z</consolefont>
z    </consolefonts>
z    <timezones>
cSsd|d|dfS)Nrmrrnr)rorrrrp&sz      <timezone>z<timezoneId>z
</timezoneId>z</timezone>
z    </timezones>
z  </language>
z
</languages>
Nz      <name><languageId>z      <script><scriptId>z      <locale><localeId>z      <territory><territoryId>z      <keyboard><keyboardId>z"      <inputmethod><inputmethodId>z"      <consolefont><consolefontId>z      <timezone><timezoneId>)rrrsrcrPrrrr
rrurr rrrr)rvr=r
rGrr>rErr?r r<rr@rrArrBrrCrrr�_write_languages_file�sv




&


(


(


(


(


(


(


(

rxcCs�|jd�|jd��x`tt�D�]R}|jd�|jd|d�|jdt|jd�|jdtt|j�d	�t|jd
kr�|jdt|jd�t|j}|jd
�xFt|j�dd�d�D].\}}|jd!|ddt|�dd�q�W|jd�t|j	}|jd�xHt|j�dd�d�D]0\}}|jd"|ddt|�dd��q,W|jd�|jd�q W|jd �d
S)#z
    Only for internal use
    z'<?xml version="1.0" encoding="UTF-8"?>
z<keyboards>
z
  <keyboard>
z    <keyboardId>z</keyboardId>
z    <description>z</description>
z    <ascii>z	</ascii>
Nz
    <comment>z</comment>
z    <languages>
cSsd|d|dfS)Nrmrrnr)rorrrrp@sz'_write_keyboards_file.<locals>.<lambda>)rqz      <language>z<languageId>z
</languageId>z<rank>z</rank>z</language>
z    </languages>
z    <territories>
cSsd|d|dfS)Nrmrrnr)rorrrrpIsz      <territory>z
<territoryId>z</territoryId>z
</territory>
z    </territories>
z  </keyboard>
z
</keyboards>
z      <language><languageId>z      <territory><territoryId>)
rrrsr\r"rPr#r$rrur )rvr@rr=rEr r<rrr�_write_keyboards_file1s0




&


(

rycCs�|jd�|jd�x�tt�D]�}|jd�|jd|d�t|j}|jd�x6t|�D]*}|jd|d	d
||dd�q\W|jd
�|jd�qW|jd�dS)z
    Only for internal use
    z'<?xml version="1.0" encoding="UTF-8"?>
z<timezones>
z
  <timezone>
z    <timezoneId>z</timezoneId>
z    <names>
z      <name>z<languageId>z
</languageId>z<trName>z	</trName>z</name>
z
    </names>
z  </timezone>
z
</timezones>
Nz      <name><languageId>)rrrsrfr
)rvrCr
rGrrr�_write_timezones_fileTs




&

rzcCs�|jd�|jd�x�tt�D]�}|jd�|jd|d�t|j}|jd�x6t|�D]*}|jd|d	d
||dd�q\W|jd
�|jd�qW|jd�dS)z
    Only for internal use
    z'<?xml version="1.0" encoding="UTF-8"?>
z<timezoneIdParts>
z  <timezoneIdPart>
z    <timezoneIdPartId>z</timezoneIdPartId>
z    <names>
z      <name>z<languageId>z
</languageId>z<trName>z	</trName>z</name>
z
    </names>
z  </timezoneIdPart>
z</timezoneIdParts>
Nz      <name><languageId>)rrrsrkr
)rvrjr
rGrrr�_write_timezoneIdParts_filejs




&

r{cCs2tjjj�}|j|_|j|_|j|_	|j
|�dS)zo
    Only for internal use. Parses a given file object with a given SAX handler
    using an expat parser.
    N)�xmlZparsersZexpatZParserCreaterIZStartElementHandlerrSZEndElementHandlerr+ZCharacterDataHandlerZ	ParseFile)rv�sax_handler�parserrrr�_expat_parse�s
rcCsx�tjjtjjtjjt��d�tjjtd�fD]�}tjj||�}tjj|�r�t|dd��,}t	j
d|�t||�tdj
|�WdQRXdStjj||d�}tjj|�r.tj|dd��,}t	j
d|�t||�tdj
|�WdQRXdSq.Wt	j
d�dS)	z
    Only for internal use
    �data�rb)�modezreading file=%sr	Nz.gzzno readable file found.)�os�path�join�dirname�realpath�__file__�_DATADIR�isfile�open�logging�infor�_INFO�append�gzip)�filenamer}�dirr�rvrrr�
_read_file�s$

r�c
-Cst|d��}tjd|�t|�WdQRXt|d��}tjd|�t|�WdQRXt|d��}tjd|�t|�WdQRXt|d��}tjd|�t|�WdQRXt|d��}tjd|�t|�WdQRXt|d��}	tjd|	�t|	�WdQRXdS)z
    Only for internal use
    �wzwriting territories file=%sNzwriting languages file=%szwriting keyboards file=%szwriting timezones file=%szwriting timezoneidparts file=%s)r�r�r�rwrxryrzr{)
ZterritoriesfilenameZlanguagesfilenameZkeyboardsfilenameZtimezonesfilenameZtimezoneidpartsfilenameZterritoriesfileZ
languagesfileZ
keyboardsfileZ
timezonesfileZtimezoneidpartsfilerrr�_write_files�s&r�TcsFg}x<t��fdd�|d�D]"}�|dkr|j|�|g�qW|S)Ncs�j|�|fS)N)�get)ro)rFrrrp�sz,_dictionary_to_ranked_list.<locals>.<lambda>)rq�reverser)rsr�)rFr�Zsorted_list�itemr)rFr�_dictionary_to_ranked_list�s
r�cCsttdd�|��S)NcSs|dS)Nrr)rorrrrp�sz&_ranked_list_to_list.<locals>.<lambda>)�list�map)�ranked_listrrr�_ranked_list_to_list�sr���cCsbt|�dks|SxLtdt|�d�D]6}||d||dd|kr$|d|d�}Pq$W|S)Nrmr)�len�range)r�Zcut_off_factor�irrr�_make_ranked_list_concise�s r�cCs�d}d}d}d}d}|r�|jd�}|jd�}|dkrf||krf||d|�}|d|�||d�}n$|dkr�||dd�}|d|�}|r�|j�jd�}|dkr�|j�jd�}|dkr�d	}|d|�}|r�|dkr�d
}d}d}d}|�r8xJtD]B}	|j|	t|	�}|jdt|	�r�t|	}|jdt|	d�}q�W|�rr|jd�}|dk�rr||dd�j�}|d|�}|�r�tj|�}
|
�r�|
jd�}|
jd��r�|
jd�}|
jd��r�|
jd�}nt	j
d|�t|||||d�S)u�
    Parses a locale name in glibc or CLDR format and returns
    language, script, territory, variant, and encoding

    :param localeId: The name of the locale
    :type localeId: string
    :return: The parts of the locale: language, script, territory, variant, encoding
    :rtype: A namedtuple of strings
            Locale(language=string,
                   script=string,
                   territory=string,
                   variant=string,
                   encoding=string)

    It replaces glibc names for scripts like “latin”
    with the iso-15924 script names like “Latn”.
    I.e. these inputs all give the same result:

        “sr_latin_RS”
        “sr_Latn_RS”
        “sr_RS@latin”
        “sr_RS@Latn”

    Examples:

    >>> parse_locale('de_DE')
    Locale(language='de', script='', territory='DE', variant='', encoding='')

    >>> parse_locale('de_DE.UTF-8')
    Locale(language='de', script='', territory='DE', variant='', encoding='UTF-8')

    >>> parse_locale('de_DE.utf8')
    Locale(language='de', script='', territory='DE', variant='', encoding='utf8')

    >>> parse_locale('de_DE@euro')
    Locale(language='de', script='', territory='DE', variant='EURO', encoding='')

    >>> parse_locale('de_DE.ISO-8859-15')
    Locale(language='de', script='', territory='DE', variant='', encoding='ISO-8859-15')

    >>> parse_locale('de_DE.ISO-8859-15@euro')
    Locale(language='de', script='', territory='DE', variant='EURO', encoding='ISO-8859-15')

    >>> parse_locale('de_DE.iso885915@euro')
    Locale(language='de', script='', territory='DE', variant='EURO', encoding='iso885915')

    >>> parse_locale('gez_ER.UTF-8@abegede')
    Locale(language='gez', script='', territory='ER', variant='ABEGEDE', encoding='UTF-8')

    >>> parse_locale('ar_ER.UTF-8@saaho')
    Locale(language='ar', script='', territory='ER', variant='SAAHO', encoding='UTF-8')

    >>> parse_locale('zh_Hant_TW')
    Locale(language='zh', script='Hant', territory='TW', variant='', encoding='')

    >>> parse_locale('zh_TW')
    Locale(language='zh', script='', territory='TW', variant='', encoding='')

    >>> parse_locale('es_419')
    Locale(language='es', script='', territory='419', variant='', encoding='')

    >>> parse_locale('sr_latin_RS')
    Locale(language='sr', script='Latn', territory='RS', variant='', encoding='')

    >>> parse_locale('sr_Latn_RS')
    Locale(language='sr', script='Latn', territory='RS', variant='', encoding='')

    >>> parse_locale('sr_RS@latin')
    Locale(language='sr', script='Latn', territory='RS', variant='', encoding='')

    >>> parse_locale('sr_RS@Latn')
    Locale(language='sr', script='Latn', territory='RS', variant='', encoding='')

    >>> parse_locale('sr_RS.UTF-8@latin')
    Locale(language='sr', script='Latn', territory='RS', variant='', encoding='UTF-8')

    >>> parse_locale('ca_ES')
    Locale(language='ca', script='', territory='ES', variant='', encoding='')

    >>> parse_locale('ca_ES.UTF-8')
    Locale(language='ca', script='', territory='ES', variant='', encoding='UTF-8')

    >>> parse_locale('ca_ES_VALENCIA')
    Locale(language='ca', script='', territory='ES', variant='VALENCIA', encoding='')

    >>> parse_locale('ca_Latn_ES_VALENCIA')
    Locale(language='ca', script='Latn', territory='ES', variant='VALENCIA', encoding='')

    >>> parse_locale('ca_ES.UTF-8@valencia')
    Locale(language='ca', script='', territory='ES', variant='VALENCIA', encoding='UTF-8')

    >>> parse_locale('ca_ES@valencia')
    Locale(language='ca', script='', territory='ES', variant='VALENCIA', encoding='')

    >>> parse_locale('en_US_POSIX')
    Locale(language='en', script='', territory='US', variant='POSIX', encoding='')

    >>> parse_locale('POSIX')
    Locale(language='en', script='', territory='US', variant='POSIX', encoding='')

    >>> parse_locale('C')
    Locale(language='en', script='', territory='US', variant='POSIX', encoding='')

    >>> parse_locale('C.UTF-8')
    Locale(language='en', script='', territory='US', variant='POSIX', encoding='UTF-8')
    ��.�@rrmNz	@valenciaZ	_VALENCIA�VALENCIA�C�POSIX�en_US_POSIX�enZUSrrrz&localeId contains invalid locale id=%s)rrrrr)r�r�r�)�find�lower�upper�_glibc_script_idsrt�endswith�_cldr_locale_pattern�match�groupr�r�r)r?rrrrrZ	dot_indexZat_indexZvalencia_indexrqr�rrr�parse_locale�shk







r�r�cCst|�}|jdkr,t|j|j|jd|jd�}|jdkrPtd|j|j|j|jd�}|jr�|r�|tkrlt|}t|j||j|j|jd�}|jr�|r�t|j|j||j|jd�}|jdko�|jo�|j�r|jdkr�t|jd
|j|j|jd�}n&|jdk�rt|jd|j|j|jd�}|S)u�
    Parses languageId and if it contains a valid ICU locale id,
    returns the values for language, script, and territory found
    in languageId instead of the original values given.

    Before parsing, it replaces glibc names for scripts like “latin”
    with the iso-15924 script names like “Latn”, both in the
    languageId and the scriptId parameter. I.e.  language id like
    “sr_latin_RS” is accepted as well and treated the same as
    “sr_Latn_RS”.

    Examples:

    >>> _parse_and_split_languageId(languageId='de_DE')
    Locale(language='de', script='', territory='DE', variant='', encoding='')

    >>> _parse_and_split_languageId(languageId='de_DE.UTF-8')
    Locale(language='de', script='', territory='DE', variant='', encoding='UTF-8')

    >>> _parse_and_split_languageId(languageId='de_DE.utf8')
    Locale(language='de', script='', territory='DE', variant='', encoding='utf8')

    >>> _parse_and_split_languageId(languageId='de_DE@euro')
    Locale(language='de', script='', territory='DE', variant='EURO', encoding='')

    >>> _parse_and_split_languageId(languageId='de_DE.ISO-8859-15')
    Locale(language='de', script='', territory='DE', variant='', encoding='ISO-8859-15')

    >>> _parse_and_split_languageId(languageId='de_DE.ISO-8859-15@euro')
    Locale(language='de', script='', territory='DE', variant='EURO', encoding='ISO-8859-15')

    >>> _parse_and_split_languageId(languageId='de_DE.iso885915@euro')
    Locale(language='de', script='', territory='DE', variant='EURO', encoding='iso885915')

    >>> _parse_and_split_languageId(languageId='gez_ER.UTF-8@abegede')
    Locale(language='gez', script='', territory='ER', variant='ABEGEDE', encoding='UTF-8')

    >>> _parse_and_split_languageId(languageId='ar_ER.UTF-8@saaho')
    Locale(language='ar', script='', territory='ER', variant='SAAHO', encoding='UTF-8')

    >>> _parse_and_split_languageId(languageId='zh_Hant_TW')
    Locale(language='zh', script='Hant', territory='TW', variant='', encoding='')

    >>> _parse_and_split_languageId(languageId='zh_TW')
    Locale(language='zh', script='Hant', territory='TW', variant='', encoding='')

    >>> _parse_and_split_languageId(languageId='zh_Hans_CN')
    Locale(language='zh', script='Hans', territory='CN', variant='', encoding='')

    >>> _parse_and_split_languageId(languageId='zh_CN')
    Locale(language='zh', script='Hans', territory='CN', variant='', encoding='')

    >>> _parse_and_split_languageId(languageId='es_419')
    Locale(language='es', script='', territory='419', variant='', encoding='')

    >>> _parse_and_split_languageId(languageId='sr_latin_RS')
    Locale(language='sr', script='Latn', territory='RS', variant='', encoding='')

    >>> _parse_and_split_languageId(languageId='sr_Latn_RS')
    Locale(language='sr', script='Latn', territory='RS', variant='', encoding='')

    >>> _parse_and_split_languageId(languageId='ca_ES')
    Locale(language='ca', script='', territory='ES', variant='', encoding='')

    >>> _parse_and_split_languageId(languageId='ca_ES.UTF-8')
    Locale(language='ca', script='', territory='ES', variant='', encoding='UTF-8')

    >>> _parse_and_split_languageId(languageId='ca_ES_VALENCIA')
    Locale(language='ca_ES_VALENCIA', script='', territory='ES', variant='VALENCIA', encoding='')

    >>> _parse_and_split_languageId(languageId='ca_Latn_ES_VALENCIA')
    Locale(language='ca_ES_VALENCIA', script='Latn', territory='ES', variant='VALENCIA', encoding='')

    >>> _parse_and_split_languageId(languageId='ca_Latn_ES_valencia')
    Locale(language='ca_ES_VALENCIA', script='Latn', territory='ES', variant='VALENCIA', encoding='')

    >>> _parse_and_split_languageId(languageId='ca_ES.UTF-8@valencia')
    Locale(language='ca_ES_VALENCIA', script='', territory='ES', variant='VALENCIA', encoding='UTF-8')

    >>> _parse_and_split_languageId(languageId='ca_ES@valencia')
    Locale(language='ca_ES_VALENCIA', script='', territory='ES', variant='VALENCIA', encoding='')

    >>> _parse_and_split_languageId(languageId='ca_Latn_ES@valencia')
    Locale(language='ca_ES_VALENCIA', script='Latn', territory='ES', variant='VALENCIA', encoding='')

    >>> _parse_and_split_languageId(languageId='ca_Latn_ES@VALENCIA')
    Locale(language='ca_ES_VALENCIA', script='Latn', territory='ES', variant='VALENCIA', encoding='')
    r�r�)rrrrrr�Zca_ES_VALENCIA�zh�cmn�CN�SGZHans�HK�MO�TWZHant)r�r�)r�r�)r�r�r�)r�rrrrrrr�)r=r>r<rJrrr�_parse_and_split_languageIdssRY







r�cCst|||d�}|j}|j}|j}|tk�r|rf|rf|rf|d|d|}|t|jkrft|j|S|r�|r�|d|}|t|jkr�t|j|S|r�|r�|d|}|t|jkr�t|j|S|r�|}|t|jkr�t|j|S|o�dt|jk�rt|jdSdS)u*Query translations of territory names

    :param territoryId: identifier for the territory
    :type territoryId: string
    :param languageIdQuery: identifier for the language used in the result
    :type languageIdQuery: string
    :param scriptIdQuery: identifier for the script used in the result
    :type scriptIdQuery: string
    :param territoryIdQuery: identifier for the territory used in the result
    :type territoryIdQuery: string
    :param fallback: Whether a fallback to English should be returned if the
                     name cannot be found in the requested language.
    :type fallback: Boolean
    :rtype: string

    **Examples:**

    Switzerland is called “Schweiz” in German:

    >>> print(territory_name(territoryId="CH", languageIdQuery="de"))
    Schweiz

    And it is called “Svizzera” in Italian:

    >>> print(territory_name(territoryId="CH", languageIdQuery="it"))
    Svizzera

    And it is called “スイス” in Japanese:

    >>> print(territory_name(territoryId="CH", languageIdQuery="ja"))
    スイス
    )r=r>r<�_r�r�)r�rrrrOr
)r<�languageIdQuery�
scriptIdQuery�territoryIdQuery�fallbackrJ�icuLocaleIdQueryrrr�territory_name�s4!
r�c
Cs"|sdSd}t|||d�}|j}|j}|j}t|||d�}	|	j}|	j}|	j}|s\|}|}|}|of|of|�rP|d|d|}|tk�rP|r�|r�|r�|d|d|}
|
t|jkr�t|j|
S|r�|r�|d|}
|
t|jkr�t|j|
S|o�|�r(|d|}
|
t|jk�r(t|j|
S|�rP|}
|
t|jk�rPt|j|
S|�r�|�r�|d|}|tk�r�t||||d�}|�r�|�r�|�r�|d|d|}
|
t|jk�r�t|j|
}|�r�|d|dS|S|�r0|�r0|d|}
|
t|jk�r0t|j|
}|�r,|d|dS|S|�r�|�r�|d|}
|
t|jk�r�t|j|
}|�r||d|dS|S|�r�|}
|
t|jk�r�t|j|
}|�r�|d|dS|S|�r|�r|d|}|tk�r�|�r(|�r(|�r(|d|d|}
|
t|jk�r(t|j|
S|�r^|�r^|d|}
|
t|jk�r^t|j|
S|�r�|�r�|d|}
|
t|jk�r�t|j|
S|�r�|}
|
t|jk�r�t|j|
S|jd
k�rt||||d�}t||||d�}|�r|�r|d|dS|}|tk�r�|�rV|�rV|�rV|d|d|}
|
t|jk�rVt|j|
S|�r�|�r�|d|}
|
t|jk�r�t|j|
S|�r�|�r�|d|}
|
t|jk�r�t|j|
S|�r�|}
|
t|jk�r�t|j|
S|�r|�r|tk�rd	t|jk�rt|jd	SdS)u�	Query translations of language names

    :param languageId: identifier for the language
    :type languageId: string
    :param scriptId: identifier for the script
    :type scriptId: string
    :param territoryId: identifier for the territory
    :type territoryId: string
    :param languageIdQuery: identifier for the language used in the result
    :type languageIdQuery: string
    :param scriptIdQuery: identifier for the script used in the result
    :type scriptIdQuery: string
    :param territoryIdQuery: identifier for the territory used in the result
    :type territoryIdQuery: string
    :param fallback: Whether a fallback to English should be returned if the
                     name cannot be found in the requested language.
    :type fallback: Boolean
    :rtype: string

    **Examples:**

    >>> print(language_name(languageId="sr"))
    српски

    I.e. the endonym for “Serbian” in the default Cyrillic script is
    “српски”.

    If the script “Cyrl” is supplied as well, the name of the
    script is added for clarity:

    >>> print(language_name(languageId="sr", scriptId="Cyrl"))
    српски (Ћирилица)

    And in Latin script the endonym is:

    >>> print(language_name(languageId="sr", scriptId="Latn"))
    srpski (Latinica)

    And “Serbian” translated to English is:

    >>> print(language_name(languageId="sr", languageIdQuery="en"))
    Serbian

    And with adding the script information:

    >>> print(language_name(languageId="sr", scriptId="Cyrl", languageIdQuery="en"))
    Serbian (Cyrillic)

    >>> print(language_name(languageId="sr", scriptId="Latn", languageIdQuery="en"))
    Serbian (Latin)

    >>> print(language_name(languageId="de_DE", languageIdQuery="en"))
    German (Germany)

    >>> print(language_name(languageId="es_419", languageIdQuery="en"))
    Spanish (Latin America)

    >>> print(language_name(languageId="ca_ES"))
    català (Espanya)

    >>> print(language_name(languageId="ca_ES.UTF-8"))
    català (Espanya)

    >>> print(language_name(languageId="ca_ES@valencia"))
    valencià (Espanya)

    >>> print(language_name(languageId="ca_ES.utf8@valencia"))
    valencià (Espanya)

    >>> print(language_name(languageId="ca_ES.utf8@valencia"))
    valencià (Espanya)

    >>> print(language_name(languageId="ca_ES.utf8@valencia", languageIdQuery='de'))
    Valencianisch (Spanien)

    >>> print(language_name(languageId="ca_ES.utf8@valencia", languageIdQuery='en'))
    Valencian (Spain)
    r�)r=r>r<r�)r<r�r�r�z (�)r�)r=r�r�r�r�)r�)	r�rrrrcr
r�r�
language_name)
r=r>r<r�r�r�r��icuLocaleIdrJZlocaleQueryr�ZcnameZlnamerrrr�4s�O





r�cCs�|o|sdS|jd�}g}xj|D]b}|tkr8|j|�q |t|jkrdt|j|}|r�|j|�q |dkr |jdd�}|j|�q Wt|�t|�kr�dj|�SdS)z�Query translation of timezone IDs by querying translations
    for each part of the ID seperately and putting the results together
    r��/r�r�� )�splitrkr�r
rtr�r�)rCr�ZtimezoneId_partsZ
part_namesZtimezoneId_partrGrrr�_timezone_name_from_id_partss$



r�cCsH|o|sdS|tkr0|t|jkr0t|j|St||d�}|rD|SdS)z<
    Internal helper function to translate timezone IDs
    r�)rCr�)rfr
r�)rCr�Zname_from_partsrrr�_timezone_names
r�cCs�t|||d�}|j}|j}|j}|rP|rP|rPt||d|d|d�}|rP|S|rt|rtt||d|d�}|rt|S|r�|r�t||d|d�}|r�|S|r�t||d�}|r�|S|S)uQuery translations of timezone IDs

    :param timezoneId: identifier for the time zone
    :type timezoneId: string
    :param languageIdQuery: identifier for the language used in the result
    :type languageIdQuery: string
    :param scriptIdQuery: identifier for the script used in the result
    :type scriptIdQuery: string
    :param territoryIdQuery: identifier for the territory used in the result
    :type territoryId: string
    :rtype: string

    **Examples:**

    >>> print(timezone_name(timezoneId='US/Pacific', languageIdQuery='ja'))
    アメリカ合衆国/太平洋時間

    If no translation can be found, the timezone ID is returned
    unchanged:

    >>> print(timezone_name(timezoneId='Pacific/Pago_Pago', languageIdQuery='xxx'))
    Pacific/Pago_Pago
    )r=r>r<r�)rCr�)r�rrrr�)rCr�r�r�rJrGrrr�
timezone_name,s>r�cCs^|sdSt|�td�kr"|jd�}x6tD].}x(t|jD]}|t|j|kr8|Sq8Wq(WdS)u�Query the territoryId from a translated name of a territory.

    :param territoryName: the translated name of a language
    :type territoryName: string
    :rtype: string

    The translated name given should be a Python Unicode string or an
    UTF-8 encoded string.

    The translated name can be in any language. But there will be only
    a result if the translation matches exactly.

    **Examples:**

    >>> territoryId("India")
    'IN'

    >>> territoryId("भारत")
    'IN'

    >>> territoryId("インド")
    'IN'

    >>> territoryId("Latin America")
    '419'

    >>> territoryId("Latinoamérica")
    '419'

    r�zUTF-8)�type�decoderOr
)Z
territoryNamer<r�rrrr<ds

r<c	Cs"|sdSt|�td�kr"|jd�}x>tD]6}x0t|jD]"}|j�t|j|j�kr8|Sq8Wq(WtjdtjtjB�}|j	|�}|�r|j
d�}|j
d�}x�tD]z}xtt|jD]f}|j�t|j|j�kr�xFtD]>}x8t|jD]*}|j�t|j|j�kr�|d|Sq�Wq�Wq�Wq�WdS)u)Query the languageId from a translated name of a language.

    :param languageName: the translated name of a language
    :type languageName: string
    :rtype: string

    The translated name given should be a Python Unicode string or an
    UTF-8 encoded string.

    The translated name can be in any language. But there will be only
    a result if the translation matches exactly.

    **Examples:**

    >>> languageId("Marathi")
    'mr'

    >>> languageId("मराठी")
    'mr'

    >>> languageId("マラーティー語")
    'mr'

    r�zUTF-8z?^(?P<language_name>[^()]+)[\s]+[(](?P<territory_name>[^()]+)[)]r�r�r�)r�r�rcr
r��re�compile�	MULTILINE�UNICODE�searchr�rO)	ZlanguageNamer=r�Zlanguage_territory_patternr�r�r�r<ZicuLocaleId_territoryrrrr=�s.






r=i@BFcCsi}d}t|||d�}|j}|j}|j}|rf|rf|rf|d|d|tkrf|d|d|}d}nN|r�|r�|d|tkr�|d|}n(|r�|r�|d|tkr�|d|}d}d}|tk�r@x|t|jD]n}t|j|dkr�||k�rt|j|||<n*||t|j|9<||t9<|||9<q�Wd}	|tk�r�|�r�x�t|jD]r}t|j|dk�rb||k�r�t|j|||<n*||t|j|9<||t9<|||	9<�qbWt|�}
|�r�t	|
�}
|�r�|
St
|
�SdS)	u�List suitable glibc locales

    :param concise: if True, return only to highly ranked results
    :type concise: boolean
    :param show_weights: Also return the weights used in the ranking
    :type show_weights: boolean
    :param languageId: identifier for the language
    :type languageId: string
    :param scriptId: identifier for the script
    :type scriptId: string
    :param territoryId: identifier for the territory
    :type territoryId: string
    :rtype: a list of strings

    **Examples:**

    List the suitable locales for the language “German”:

    >>> list_locales(languageId="de")
    ['de_DE.UTF-8', 'de_AT.UTF-8', 'de_CH.UTF-8', 'de_IT.UTF-8', 'de_LI.UTF-8', 'de_BE.UTF-8', 'de_LU.UTF-8']

    So this returns a list of locales for German. These lists are
    sorted in order of decreasing likelyhood, i.e. the most common
    value comes first.

    One can also list the possible locales for the territory “Switzerland”:

    >>> list_locales(territoryId="CH")
    ['de_CH.UTF-8', 'fr_CH.UTF-8', 'it_CH.UTF-8', 'wae_CH.UTF-8']


    If one knows both, the language “German” and the territory
    “Switzerland”, the result is unique:

    >>> list_locales(languageId="de", territoryId="CH")
    ['de_CH.UTF-8']

    F)r=r>r<r�T�drrmN)r�rrrrcr�extra_bonusrOr�r�r�)�concise�show_weightsr=r>r<Zranked_locales�
skipTerritoryrJ�language_bonus�territory_bonusr�rrr�list_locales�sP'$


r�cCs�i}d}t|||d�}|j}|j}|j}|r2|gS|rZ|rZ|d|tkrZ|d|}d}d}|tkr�xzt|jD]l}	t|j|	dkrr|	|kr�t|j|	||	<n*||	t|j|	9<||	t9<||	|9<qrWd}
|tko�|�rxx�t|jD]r}	t|j|	dk�r|	|k�r8t|j|	||	<n*||	t|j|	9<||	t9<||	|
9<�qWt|�}|�r�t	|�}|�r�|St
|�SdS)	u_List scripts used for a language and/or in a territory

    :param concise: if True, return only to highly ranked results
    :type concise: boolean
    :param show_weights: Also return the weights used in the ranking
    :type show_weights: boolean
    :param languageId: identifier for the language
    :type languageId: string
    :param scriptId: identifier for the script
    :type scriptId: string
    :param territoryId: identifier for the territory
    :type territoryId: string
    :rtype: a list of strings

    Returns a list of ISO-15924 script ids:

    https://en.wikipedia.org/wiki/ISO_15924

    **Examples:**

    List the suitable scripts for the language “Serbian”:

    >>> list_scripts(languageId="sr")
    ['Cyrl', 'Latn']

    So this returns a list of scripts which are in use for
    Serbian. These lists are sorted in order of decreasing likelyhood,
    i.e. the most common value comes first.

    List the suitable scripts for the language “Punjabi”:

    >>> list_scripts(languageId="pa")
    ['Guru', 'Arab']

    One can also list the possible scripts for a territory like
    “Pakistan”:

    >>> list_scripts(territoryId="PK")
    ['Arab']

    If one knows both, the language “Punjabi” and the territory
    “Pakistan” or “India”, one can find out which script is the
    preferred one:

    >>> list_scripts(languageId="pa", territoryId="PK")
    ['Arab']

    So the preferred script for Punjabi in Pakistan is “Arab”

    >>> list_scripts(languageId="pa", territoryId="IN")
    ['Guru', 'Arab']

    and the preferred script for Punjabi in India is “Guru”.

    F)r=r>r<r�Tr�rrmN)r�rrrrcrr�rOr�r�r�)r�r�r=r>r<Zranked_scriptsr�rJr�rr�r�rrr�list_scriptssJ8
r�cCsi}d}t|||d�}|j}|j}|j}|rf|rf|rf|d|d|tkrf|d|d|}d}nR|r�|r�|d|tkr�|d|}d}n(|r�|r�|d|tkr�|d|}d}d}|tk�rDx|t|jD]n}	t|j|	dkr�|	|k�rt|j|	||	<n*||	t|j|	9<||	t9<||	|9<q�Wd}
|tk�r�|�r�x�t|jD]r}	t|j|	dk�rf|	|k�r�t|j|	||	<n*||	t|j|	9<||	t9<||	|
9<�qfWt|�}|�r�t	|�}|�r�|St
|�SdS)	u�List suitable input methods

    :param concise: if True, return only to highly ranked results
    :type concise: boolean
    :param show_weights: Also return the weights used in the ranking
    :type show_weights: boolean
    :param languageId: identifier for the language
    :type languageId: string
    :param scriptId: identifier for the script
    :type scriptId: string
    :param territoryId: identifier for the territory
    :type territoryId: string
    :rtype: a list of strings

    **Examples:**

    List the suitable input methods for the language “Japanese”:

    >>> list_inputmethods(languageId="ja")
    ['ibus/kkc', 'ibus/anthy']

    So this returns a list of input methods for Japanese. These lists are
    sorted in order of decreasing likelyhood, i.e. the most common
    value comes first.

    One can also list the possible input methods for the territory “Japan”:

    >>> list_inputmethods(territoryId="JP")
    ['ibus/kkc', 'ibus/anthy']
    F)r=r>r<r�Tr�rrmN)r�rrrrcrr�rOr�r�r�)r�r�r=r>r<Zranked_inputmethodsr�rJr�rLr�r�rrr�list_inputmethodsvsR$


r�cCs�i}d}t|||d�}|j}|j}|j}|rf|rf|rf|d|d|tkrf|d|d|}d}nN|r�|r�|d|tkr�|d|}n(|r�|r�|d|tkr�|d|}d}d}|tk�r@x|t|jD]n}	t|j|	dkr�|	|k�rt|j|	||	<n*||	t|j|	9<||	t9<||	|9<q�Wd}
|tk�r�x�t|jD]r}	t|j|	dk�rZ|	|k�r�t|j|	||	<n*||	t|j|	9<||	t9<||	|
9<�qZWt|�}|�r�t	|�}|�r�|St
|�SdS)u�List likely X11 keyboard layouts

    :param concise: if True, return only to highly ranked results
    :type concise: boolean
    :param show_weights: Also return the weights used in the ranking
    :type show_weights: boolean
    :param languageId: identifier for the language
    :type languageId: string
    :param scriptId: identifier for the script
    :type scriptId: string
    :param territoryId: identifier for the territory
    :type territoryId: string
    :rtype: a list of strings

    **Examples:**

    Listing likely X11 keyboard layouts for “German”:

    >>> list_keyboards(languageId="de")
    ['de(nodeadkeys)', 'de(deadacute)', 'at(nodeadkeys)', 'ch', 'be(oss)']

    Listing likely X11 keyboard layouts for “Switzerland”:

    >>> list_keyboards(territoryId="CH")
    ['ch', 'ch(fr)', 'it']

    When specifying both “German” *and* “Switzerland”, the
    returned X11 keyboard layout is unique:

    >>> list_keyboards(languageId="de", territoryId="CH")
    ['ch']
    F)r=r>r<r�TrmrN)r�rrrrcrr�rOr�r�r�)r�r�r=r>r<Zranked_keyboardsr�rJr�rKr�r�rrr�list_keyboards�sP!$



r�cCs�i}d}t|||d�}|j}|j}|j}|rf|rf|rf|d|d|tkrf|d|d|}d}nN|r�|r�|d|tkr�|d|}n(|r�|r�|d|tkr�|d|}d}d}|tk�r@x|t|jD]n}	t|j|	dkr�|	|k�rt|j|	||	<n*||	t|j|	9<||	t9<||	|9<q�Wd}
|tk�r�x�t|jD]r}	t|j|	dk�rZ|	|k�r�t|j|	||	<n*||	t|j|	9<||	t9<||	|
9<�qZWt|�}|�r�t	|�}|�r�|St
|�SdS)	a;List likely Linux Console fonts

    :param concise: if True, return only to highly ranked results
    :type concise: boolean
    :param show_weights: Also return the weights used in the ranking
    :type show_weights: boolean
    :param languageId: identifier for the language
    :type languageId: string
    :param scriptId: identifier for the script
    :type scriptId: string
    :param territoryId: identifier for the territory
    :type territoryId: string
    :rtype: a list of strings

    **Examples:**

    Listing likely console fonts  for English:

    >>> list_consolefonts(languageId="en")
    ['eurlatgr']

    Listing likely console fonts for Greek:

    >>> list_consolefonts(languageId="el")
    ['eurlatgr', 'iso07u-16', 'LatGrkCyr-8x16']

    Listing likely console fonts for Greece:

    >>> list_consolefonts(territoryId="GR")
    ['eurlatgr', 'iso07u-16', 'LatGrkCyr-8x16']

    Listing likely console fonts for Greek in Greece:

    list_consolefonts(languageId="el", territoryId="GR")
    ['eurlatgr']

    Listing likely console fonts for Greek in a non-Greek country like
    the UK (the language has higher weight):

    >>> list_consolefonts(languageId="el", territoryId="GB")
    ['eurlatgr']

    Listing likely console fonts for Russian in Russia:

    >>> list_consolefonts(languageId="ru", territoryId="RU")
    ['latarcyrheb-sun16']

    Listing likely console fonts for Russian in a non-Russian country like
    the UK (the language has higher weight):

    >>> list_consolefonts(languageId="ru", territoryId="GB")
    ['latarcyrheb-sun16', 'eurlatgr']

    F)r=r>r<r�Tr�rrmN)r�rrrrcrr�rOr�r�r�)r�r�r=r>r<Zranked_consolefontsr�rJr�rMr�r�rrr�list_consolefontssP7$



r�cCs�i}d}t|||d�}|j}|j}|j}|rf|rf|rf|d|d|tkrf|d|d|}d}nN|r�|r�|d|tkr�|d|}n(|r�|r�|d|tkr�|d|}d}d}|tk�r@x|t|jD]n}	t|j|	dkr�|	|k�rt|j|	||	<n*||	t|j|	9<||	t9<||	|9<q�Wd}
|tk�r�x�t|jD]r}	t|j|	dk�rZ|	|k�r�t|j|	||	<n*||	t|j|	9<||	t9<||	|
9<�qZWt|�}|�r�t	|�}|�r�|St
|�SdS)	avList likely timezones

    :param concise: if True, return only to highly ranked results
    :type concise: boolean
    :param show_weights: Also return the weights used in the ranking
    :type show_weights: boolean
    :param languageId: identifier for the language
    :type languageId: string
    :param scriptId: identifier for the script
    :type scriptId: string
    :param territoryId: identifier for the territory
    :type territoryId: string
    :rtype: a list of strings

    **Examples:**

    >>> list_timezones(territoryId="DE")
    ['Europe/Berlin']

    >>> list_timezones(languageId="de")
    ['Europe/Berlin', 'Europe/Vienna', 'Europe/Zurich', 'Europe/Brussels', 'Europe/Luxembourg']

    >>> list_timezones(territoryId="CH")
    ['Europe/Zurich']

    >>> list_timezones(languageId="fr", territoryId="CH")
    ['Europe/Zurich']

    >>> list_timezones(languageId="fr")
    ['Europe/Paris', 'America/Montreal', 'Europe/Brussels', 'Europe/Zurich', 'Europe/Luxembourg']

    The territory gets more weight than the language:

    >>> list_timezones(languageId="ja", territoryId="CH")
    ['Europe/Zurich', 'Asia/Tokyo']
    F)r=r>r<r�Trmrr�N)r�rrrrcrr�rOr�r�r�)r�r�r=r>r<Zranked_timezonesr�rJr�rNr�r�rrr�list_timezonesrsP%$



r�cCs|tkrt|jSdS)a�Check whether a keyboard layout supports ASCII

    :param keyboardId: identifier for the keyboard
    :type keyboardId: string
    :rtype: string

    Returns True if the keyboard layout with that id can be used to
    type ASCII, returns false if the keyboard layout can not be used
    to type ASCII or if typing ASCII with that keyboard layout is
    difficult.

    **Examples:**

    >>> supports_ascii("jp")
    True
    >>> supports_ascii("ru")
    False
    T)r\r#)r@rrr�supports_ascii�s
r�cCsddl}|jd�djS)z%
    Return version of langtable
    rN�	langtable)�
pkg_resources�require�version)r�rrrr��sr�cCs�ddl}|jd�dj}|jd�dj}|jd�dj}td|�td|�td|�tdtjjt	��tdt
d	�dS)
z)
    Print some info about langtable
    rNr�zProject name: = %sz
Version: = %szModule path: = %szLoaded from: %szData files read: %sr	)r�r��project_namer��module_path�printr�r�r�r�r�)r�r�r�r�rrrr��sr�cCs>tj|�}|r6d|jd�fd|jd�fd|jd�fgSgSdS)z2
    Internal test function, do not use this.
    rrrN)r�r�r�)r?r�rrr�_test_cldr_locale_pattern�s
(r�c	Cs�tt|�dtt||d��dt|�dtt||d��ddtt||||d��dt|�dtt||d��dt|�dtt||d��ddtt||||d���dS)z2
    Internal test function, do not use this.
    z: )r�r=�
)r�r<z +: )r�r=r>r<N)r�rP�reprr�r�)r�r=r>r<rrr�_test_language_territory�s�r��	/dev/nullcCsbtj}|rtj}tj|dd|d�tdt��tdt��tdt��tdt��tdt	��dS)	Nr�z%(levelname)s: %(message)s)r��filemode�format�levelzterritories.xmlz
languages.xmlz
keyboards.xmlz
timezones.xmlztimezoneidparts.xml)
r��INFO�DEBUGZbasicConfigr�r-r]rUrdrg)�debugZlogfilenameZ	log_levelrrr�_init	sr�c@seZdZdd�Zdd�ZdS)�__ModuleInitializercCs
t�dS)N)r�)rrrrr"	sz__ModuleInitializer.__init__cCsdS)Nr)rrrr�__del__&	sz__ModuleInitializer.__del__N)rrrrr�rrrrr�!	sr��__main__z^(?P<language>[a-z]{2,3}(?=$|@zJ^(?P<language>[a-z]{2,3}(?=$|@|_[A-Z][a-z]{3}(?=$|@|_[A-Z0-9]{2,3}(?=$|@))z`^(?P<language>[a-z]{2,3}(?=$|@|_[A-Z][a-z]{3}(?=$|@|_[A-Z0-9]{2,3}(?=$|@))|_[A-Z0-9]{2,3}(?=$|@)zb^(?P<language>[a-z]{2,3}(?=$|@|_[A-Z][a-z]{3}(?=$|@|_[A-Z0-9]{2,3}(?=$|@))|_[A-Z0-9]{2,3}(?=$|@)))z^(?P<language>[a-z]{2,3}(?=$|@|_[A-Z][a-z]{3}(?=$|@|_[A-Z0-9]{2,3}(?=$|@))|_[A-Z0-9]{2,3}(?=$|@)))(?:_(?P<script>[A-Z][a-z]{3})z�^(?P<language>[a-z]{2,3}(?=$|@|_[A-Z][a-z]{3}(?=$|@|_[A-Z0-9]{2,3}(?=$|@))|_[A-Z0-9]{2,3}(?=$|@)))(?:_(?P<script>[A-Z][a-z]{3})(?=$|@z�^(?P<language>[a-z]{2,3}(?=$|@|_[A-Z][a-z]{3}(?=$|@|_[A-Z0-9]{2,3}(?=$|@))|_[A-Z0-9]{2,3}(?=$|@)))(?:_(?P<script>[A-Z][a-z]{3})(?=$|@|_[A-Z0-9]{2,3}(?=$|@)z�^(?P<language>[a-z]{2,3}(?=$|@|_[A-Z][a-z]{3}(?=$|@|_[A-Z0-9]{2,3}(?=$|@))|_[A-Z0-9]{2,3}(?=$|@)))(?:_(?P<script>[A-Z][a-z]{3})(?=$|@|_[A-Z0-9]{2,3}(?=$|@))){0,1}z�^(?P<language>[a-z]{2,3}(?=$|@|_[A-Z][a-z]{3}(?=$|@|_[A-Z0-9]{2,3}(?=$|@))|_[A-Z0-9]{2,3}(?=$|@)))(?:_(?P<script>[A-Z][a-z]{3})(?=$|@|_[A-Z0-9]{2,3}(?=$|@))){0,1}(?:_(?P<territory>[A-Z0-9]{2,3})z�^(?P<language>[a-z]{2,3}(?=$|@|_[A-Z][a-z]{3}(?=$|@|_[A-Z0-9]{2,3}(?=$|@))|_[A-Z0-9]{2,3}(?=$|@)))(?:_(?P<script>[A-Z][a-z]{3})(?=$|@|_[A-Z0-9]{2,3}(?=$|@))){0,1}(?:_(?P<territory>[A-Z0-9]{2,3})(?=$|@z�^(?P<language>[a-z]{2,3}(?=$|@|_[A-Z][a-z]{3}(?=$|@|_[A-Z0-9]{2,3}(?=$|@))|_[A-Z0-9]{2,3}(?=$|@)))(?:_(?P<script>[A-Z][a-z]{3})(?=$|@|_[A-Z0-9]{2,3}(?=$|@))){0,1}(?:_(?P<territory>[A-Z0-9]{2,3})(?=$|@)){0,1})T)r�)r�r�r�)NNNNT)NNNNNNT)NN)NN)NNNN)r�)r�)TFNNN)TFNNN)TFNNN)TFNNN)TFNNN)TFNNN)N)FNNN)Fr�)Gr�r�r�r��collectionsZxml.parsers.expatr|Zxml.sax.handlerr�
namedtuplerr�r�r�r�r�rOrcr\rfrkrrr!r%r&�objectr'r-rUr]rdrgrwrxryrzr{rr�r�r�r�r�r�r�r�r�r�r�r�r<r=r�r�r�r�r�r�r�r�r�r�r�r�r�r�Z
__module_initrZdoctestZtestmodrrrr�<module>as�jJ55UX#

	&

<
S


8
)
2
S
b
L
M
c
Q