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)fileiso_639_3_entrycommon_namename
part1_codeidzChinese (simplified)zzh-hanszChinese (traditional)zzh-hantz%/usr/share/xml/iso-codes/iso_3166.xmliso_3166_entryalpha_2_codealpha_3_code# ;   :z%sr   )_datadirospathjoin_lang_country_languagelistr   iterattrib_openstrip
startswithsplit)selflanguagelist_filedatadirLANGUAGELISTetitelmlangcodedescrflinetmpw	localeenv r4   =/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-   r4   r4   r5   r,   [      

zLocaleInfo.langc                 C   r7   )z! map country code to country namer   )r   r8   r4   r4   r5   countrya   r9   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)stdoutuniversal_newlinesr   
z.utf8LOCALE)
subprocessPopenPIPEcommunicater$   r"   findr   LangpackMacrosr   append)r%   localespr0   r1   macrr;   r4   r4   r5   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 languageiso_639	iso_639_3)r   r   dgettext)r%   r,   	lang_namer4   r4   r5   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
        iso_3166)r   r   rM   )r%   r:   country_namer4   r4   r5   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LANGUAGEr?   LCODECCODEr   c                    s   g | ]}|  d  r|qS )rT   )r#   ).0krI   r4   r5   
<listcomp>   s    z(LocaleInfo.translate.<locals>.<listcomp>F   z%s (%s)VARIANTz%s - %s)
r   rE   r   r   environrO   lenrR   rJ   r:   )
r%   r;   nativeallCountries	returnValcurrent_languagerN   rQ   l	mycountryr4   rX   r5   	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   rT   r?   z%s:%sz:enenz%s:en)r   rE   r   r   endswith)r%   r-   rI   langcoder;   langlistr4   r4   r5   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)dbus_interfacezorg.freedesktop.DBus.Propertieszorg.freedesktop.Accounts.UserFormatsLocaler   LanguagerS   LC_NAMELANG)r   r   
expanduserexistsaccessR_OKr!   rematchgrouppwdgetpwuidgeteuidpw_namedbus	SystemBus
get_object	InterfaceFindUserByNameGetr]   ri   	Exceptionwarningswarnargsr\   rF   )r%   formatslanguageresultfnamer/   r0   match_language	user_namebusobjiface	user_pathfirstLanguagemsgr4   r4   r5   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   ro   "z
LANG=(.*)$rZ   LC_TIMEzLC_TIME=(.*)$rS   zLANGUAGE=(.*)$r   zen_US.UTF-8)environmentsr   r   rq   rr   rs   r!   r#   replacert   ru   rv   r]   ri   rF   )r%   r,   r   r   r   r   r/   r0   
match_langmatch_formatsr   r4   r4   r5   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   rr   r   rs   r!   r#   )r%   r/   r0   r4   r4   r5   isSetSystemFormats2  s   

zLocaleInfo.isSetSystemFormatsN)FF)__name__
__module____qualname____doc__r   r6   r,   r:   rJ   rO   rR   rd   ri   r   r   r   r4   r4   r4   r5   r      s    A

/)&r   __main__z/usr/share/language-selector/languagelistz)default system locale and languages: '%s'z'default user locale and languages: '%s')
__future__r   r   rt   r@   r   r   rw   sysr{   r   LanguageSelectorr   r    xml.etree.ElementTreer   objectr   r   r'   liprintr   r   r   r   r   rJ   r4   r4   r4   r5   <module>   s4     (



