o
    ڀ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rxd
ZedeZede   ede   eej eej eej ee  dS 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 ]'}d|j	v r-|j	d }n|j	d }d|j	v r=|j	d }n|j	d }|| j|< q t
d	| jd
< t
d| jd< tdd}|d}|D ]'}d|j	v ro|j	d }	n|j	d }	d|j	v r|j	d }n|j	d }|	| j|< qbt|3}
|
D ]'}| }|ds|dkrq|d}|d d}d|d  | j|d < qW d    d S 1 sw   Y  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LANGUAGELISTetitZelmlangcodeZdescrflinetmpwZ	localeenv r(   =/usr/lib/python3/dist-packages/LanguageSelector/LocaleInfo.py__init__   sJ   













"zLocaleInfo.__init__c                 C      || j v r
| j | S dS )z$ map language code to language name r   )r   r   r#   r(   r(   r)   r"   [      

zLocaleInfo.langc                 C   r+   )z! map country code to country namer   )r   r,   r(   r(   r)   countrya   r-   zLocaleInfo.countryc                 C   sv   g }t jddgt jdd}| d dD ]"}| }|ddk r$qt| j	|}|d }||vr8|
| 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   sD   || j v r td| j | }|| j | krtd| j | }|S |S )zreturn translated languageZiso_639Z	iso_639_3)r   r   dgettext)r   r"   	lang_namer(   r(   r)   translate_languagey   s   
zLocaleInfo.translate_languagec                 C   s$   || j v rtd| j | }|S |S )z
        return translated language and country of the given
        locale into the given locale, e.g. 
        (Deutsch, Deutschland) for de_DE
        Ziso_3166)r   r   r<   )r   r.   country_namer(   r(   r)   translate_country   s   
zLocaleInfo.translate_countryFc           
         s  d}t | j| |dkr d}dtjv rtjd } d tjd< |  d }|}t d dkr`|  d } fd	d
|  D }|dkrMt|dksQ|dkr`| 	 d }	|	r`d||f }t d dkrpd| d f }|dkr|r}|tjd< |S tjd= |S )z4 get a locale code and output a human readable name r   TNLANGUAGEr2   LCODEZCCODEr   c                    s   g | ]}|  d  r|qS )rB   )r   ).0kr:   r(   r)   
<listcomp>   s    z(LocaleInfo.translate.<locals>.<listcomp>F   z%s (%s)ZVARIANTz%s - %s)
r   r7   r   r   environr>   lenr@   r;   r.   )
r   r/   ZnativeZallCountriesZ	returnValZcurrent_languager=   r?   lZ	mycountryr(   rE   r)   	translate   s0   


zLocaleInfo.translatec                 C   st   |sdS t | j|}|d }|d }|| jv r| j| }n||kr%|}nd||f }|ds8|dks8d| }|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   rB   r2   z%s:%sz:enenz%s:en)r   r7   r   r   endswith)r   r#   r:   Zlangcoder/   Zlanglistr(   r(   r)   makeEnvString   s   
zLocaleInfo.makeEnvStringc              
   C   s  d}d}g }t jd}t j|r?t |t jr?t|}|D ]}td|}|r/|	d}q W d    n1 s:w   Y  t
t  j}z<t }	|	dd}
tj|
dd}||}|	d|}
tj|
dd}|d	d
}t|dkr|d	d}| |}W n ty } zt|jd  W Y d }~nd }~ww t|dkrdt jv rt jd }t|dkrdt jv rt jd }t|dkrdt jv 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LanguagerA   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GetrI   rN   	ExceptionwarningswarnargsrH   r8   )r   formatslanguageresultfnamer$   r%   match_languageZ	user_nameZbusobjZifaceZ	user_pathZfirstLanguagemsgr(   r(   r)   getUserDefaultLanguage   sX   









z!LocaleInfo.getUserDefaultLanguagec              	   C   sF  d}d}d}g }| j D ]p}tj|r{t|tjr{t|U}|D ]J}|dr.|dd}t	
d|}|r;|d}|drF|dd}t	
d|}	|	rS|	d}|dr^|dd}t	
d	|}
|
rk|
d}q!W d    n1 svw   Y  qt|d
krd}t|d
kr| |}t|d
kr|}|| || |S )Nr   rP   "z
LANG=(.*)$rG   LC_TIMEzLC_TIME=(.*)$rA   zLANGUAGE=(.*)$r   zen_US.UTF-8)environmentsr   r   rR   rS   rT   r   r   replacerU   rV   rW   rI   rN   r8   )r   r"   r`   ra   rb   rc   r$   r%   Z
match_langZmatch_formatsrd   r(   r(   r)   getSystemDefaultLanguage  sL   










z#LocaleInfo.getSystemDefaultLanguagec                 C   sr   t | jd t jsdS t| jd }|D ]}|dr& W d    dS qW d    dS 1 s2w   Y  dS )Nr   FzLC_TIME=T)r   rS   rj   rT   r   r   )r   r$   r%   r(   r(   r)   isSetSystemFormats2  s   

zLocaleInfo.isSetSystemFormatsN)FF)__name__
__module____qualname____doc__rj   r*   r"   r.   r;   r>   r@   rK   rN   rg   rl   rm   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   rU   r3   r   r   rX   sysr[   r]   ZLanguageSelectorr   r   Zxml.etree.ElementTreer   objectr   rn   r   Zliprintrl   rg   r   r   r   r;   r(   r(   r(   r)   <module>   s4     (



