U
    ڀR]A2                     @   s   d dl mZ d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlmZ d dlmZ d dlmZ G dd deZed	krd
ZedeZede   ede   eej eej eej ee  dS )    )print_function)absolute_importN)macros)gettext)ElementTreec                   @   sp   e Zd ZdZdgZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dddZdd Zdd Zdd Zdd ZdS )
LocaleInfoz< class with handy functions to parse the locale information z/etc/default/localec              	   C   s  || _ tj|d|}i | _i | _i | _tdd}|d}|D ]N}d|j	krZ|j	d }n
|j	d }d|j	krz|j	d }n
|j	d }|| j|< q@t
d	| jd
< t
d| jd< tdd}|d}|D ]N}d|j	kr|j	d }	n
|j	d }	d|j	kr|j	d }n
|j	d }|	| j|< qt|b}
|
D ]V}| }|ds"|dkrHq"|d}|d d}d|d  | j|d < q"W 5 Q R X d S )Ndataz&/usr/share/xml/iso-codes/iso_639_3.xml)fileZiso_639_3_entryZcommon_namenameZ
part1_codeidzChinese (simplified)zzh-hanszChinese (traditional)zzh-hantz%/usr/share/xml/iso-codes/iso_3166.xmlZiso_3166_entryZalpha_2_codeZalpha_3_code# ;   :z%sr   )_datadirospathjoin_lang_country_languagelistr   iterZattrib_openstrip
startswithsplit)selfZlanguagelist_filedatadirZLANGUAGELISTZetitZelmlangcodeZdescrflinetmpwZ	localeenv r'   =/usr/lib/python3/dist-packages/LanguageSelector/LocaleInfo.py__init__   sF    













zLocaleInfo.__init__c                 C   s   || j kr| j | S dS )z$ map language code to language name r   )r   r   r"   r'   r'   r(   r!   [   s    

zLocaleInfo.langc                 C   s   || j kr| j | S dS )z! map country code to country namer   )r   r*   r'   r'   r(   countrya   s    

zLocaleInfo.countryc                 C   sv   g }t jddgt jdd}| d dD ]D}| }|ddk rHq,t| j	|}|d }||kr,|
| q,|S )	zR return a list of locales available on the system
            (running locale -a) localez-aT)stdoutZuniversal_newlinesr   
z.utf8LOCALE)
subprocessPopenPIPEZcommunicater   r   findr   LangpackMacrosr   append)r   Zlocalespr$   r%   macrr,   r'   r'   r(   generated_localesg   s    zLocaleInfo.generated_localesc                 C   sH   || j kr@td| j | }|| j | kr<td| j | }|S |S dS )zreturn translated languageZiso_639Z	iso_639_3N)r   r   dgettext)r   r!   	lang_namer'   r'   r(   translate_languagey   s    
zLocaleInfo.translate_languagec                 C   s(   || j kr td| j | }|S |S dS )z
        return translated language and country of the given
        locale into the given locale, e.g. 
        (Deutsch, Deutschland) for de_DE
        Ziso_3166N)r   r   r9   )r   r+   country_namer'   r'   r(   translate_country   s    
zLocaleInfo.translate_countryFc           
         s  d}t | j| |dkr@d}dtjkr2tjd } d tjd< |  d }|}t d dkr|  d } fd	d
|  D }|dkrt|dks|dkr| 	 d }	|	rd||f }t d dkrd| d f }|dkr|r|tjd< ntjd= |S )z4 get a locale code and output a human readable name r   TNLANGUAGEr/   LCODEZCCODEr   c                    s   g | ]}|  d  r|qS )r?   )r   ).0kr7   r'   r(   
<listcomp>   s      z(LocaleInfo.translate.<locals>.<listcomp>F   z%s (%s)ZVARIANTz%s - %s)
r   r4   r   r   environr;   lenr=   r8   r+   )
r   r,   ZnativeZallCountriesZ	returnValZcurrent_languager:   r<   lZ	mycountryr'   rB   r(   	translate   s.    


zLocaleInfo.translatec                 C   st   |sdS t | j|}|d }|d }|| jkr<| j| }n||krJ|}nd||f }|dsp|dkspd| }|S )z input is a language code, output a string that can be put in
            the LANGUAGE enviroment variable.
            E.g: en_DK -> en_DK:en
        r   r?   r/   z%s:%sz:enZenz%s:en)r   r4   r   r   endswith)r   r"   r7   Zlangcoder,   Zlanglistr'   r'   r(   makeEnvString   s    
zLocaleInfo.makeEnvStringc              
   C   s  d}d}g }t jd}t j|rjt |t jrjt|*}|D ]}td|}|r@|	d}q@W 5 Q R X t
t  j}zxt }	|	dd}
tj|
dd}||}|	d|}
tj|
dd}|d	d
}t|dkr|d	d}| |}W n4 tk
r& } zt|jd  W 5 d }~X Y nX t|dkrLdt jkrLt jd }t|dkrpdt jkrpt jd }t|dkrdt jkrt jd }t|dkrt|dkr| |}|| || |S )Nr   z~/.pam_environmentzLANGUAGE(\s+DEFAULT)?=(.*)$   zorg.freedesktop.Accountsz/org/freedesktop/Accounts)Zdbus_interfacezorg.freedesktop.DBus.Propertieszorg.freedesktop.Accounts.UserZFormatsLocaler   ZLanguager>   ZLC_NAMELANG)r   r   
expanduserexistsaccessR_OKr   rematchgrouppwdgetpwuidgeteuidZpw_namedbusZ	SystemBusZ
get_objectZ	InterfaceZFindUserByNameZGetrF   rJ   	ExceptionwarningswarnargsrE   r5   )r   formatslanguageresultfnamer#   r$   match_languageZ	user_nameZbusobjZifaceZ	user_pathZfirstLanguagemsgr'   r'   r(   getUserDefaultLanguage   sL    







z!LocaleInfo.getUserDefaultLanguagec              
   C   s6  d}d}d}g }| j D ]}tj|rt|tjrt|}|D ]}|dr\|dd}t	
d|}|rv|d}|dr|dd}t	
d|}	|	r|	d}|dr|dd}t	
d	|}
|
rB|
d}qBW 5 Q R X qt|d
krd}t|d
kr| |}t|d
kr|}|| || |S )Nr   rL   "z
LANG=(.*)$rD   LC_TIMEzLC_TIME=(.*)$r>   zLANGUAGE=(.*)$r   zen_US.UTF-8)environmentsr   r   rN   rO   rP   r   r   replacerQ   rR   rS   rF   rJ   r5   )r   r!   r\   r]   r^   r_   r#   r$   Z
match_langZmatch_formatsr`   r'   r'   r(   getSystemDefaultLanguage  sD    









z#LocaleInfo.getSystemDefaultLanguagec              	   C   sZ   t | jd t jsdS t| jd *}|D ]}|dr, W 5 Q R  dS q,W 5 Q R X dS )Nr   FzLC_TIME=T)r   rO   rf   rP   r   r   )r   r#   r$   r'   r'   r(   isSetSystemFormats2  s    
zLocaleInfo.isSetSystemFormatsN)FF)__name__
__module____qualname____doc__rf   r)   r!   r+   r8   r;   r=   rH   rJ   rc   rh   ri   r'   r'   r'   r(   r      s   A

/)&r   __main__z/usr/share/language-selector/Zlanguagelistz)default system locale and languages: '%s'z'default user locale and languages: '%s')Z
__future__r   r   rQ   r0   r   r   rT   sysrW   rY   ZLanguageSelectorr   r   Zxml.etree.ElementTreer   objectr   rj   r   Zliprintrh   rc   r   r   r   r8   r'   r'   r'   r(   <module>   s0     (



