
DxR42                 @   sJ  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 Gd d   d e  Z e d	 k rFd
 Z e d e  Z e d e j    e d e j    e e j  e e j  e e j  e e j    d S)    )print_function)absolute_importN)macros)gettext)ElementTreec               @   s   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 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 j | d |  } i  |  _ i  |  _ i  |  _ t d d  } | j d  } xs | D]k } d | j	 k r | j	 d } n | j	 d } d | j	 k r | j	 d } n | j	 d } | |  j | <qa Wt
 d	  |  j d
 <t
 d  |  j d <t d d  } | j d  } xs | D]k } d | j	 k r@| j	 d }	 n | j	 d }	 d | j	 k rl| j	 d } n | j	 d } |	 |  j | <qWt |  } }
 xs |
 D]k } | j   } | j d  s| d k rq| j d  } | d j d  } d | d |  j | d <qWWd  QRXd  S)Ndatafilez&/usr/share/xml/iso-codes/iso_639_3.xmlZ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  | Sd 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  | Sd S)z! map country code to country namer   )r   )r   r"   r'   r'   r(   countrya   s    zLocaleInfo.countryc             C   s   g  } t  j d d g d t  j d d } x} | j   d j d  D]b } | j   } | j d  d k  rn qD t j |  j	 |  } | d	 } | | k rD | j
 |  qD W| S)
zR return a list of locales available on the system
            (running locale -a) localez-astdoutZuniversal_newlinesTr   
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   s`   | |  j  k rX t j d |  j  |  } | |  j  | k rT t j d |  j  |  } | S| Sd 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   s4   | |  j  k r, t j d |  j  |  } | S| Sd 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   r8   )r   r*   country_namer'   r'   r(   translate_country   s    zLocaleInfo.translate_countryFc       
         sh  d } t  j |  j |    | d k rZ d } d t j k rI t j d }   d t j d <|  j   d  } | } t   d  d k r|  j   d  }   f d	 d
   |  j   D } | d k r t |  d k s | d k r|  j	   d  }	 |	 rd | | f } t   d  d k r8d |   d f } | d k rd| rZ| 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  |  ] } | j    d   r |  q S)r>   )r   ).0k)r6   r'   r(   
<listcomp>   s   	 z(LocaleInfo.translate.<locals>.<listcomp>F   z%s (%s)ZVARIANTz%s - %s)
r   r3   r   r   environr:   lenr<   r7   r*   )
r   r+   ZnativeZallCountriesZ	returnValZcurrent_languager9   r;   lZ	mycountryr'   )r6   r(   	translate   s.    *
zLocaleInfo.translatec             C   s   | s
 d St  j |  j |  } | d } | d } | |  j k rR |  j | } n% | | k rg | } n d | | f } | j d  p | d k s d | } | 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   r3   r   r   endswith)r   r"   r6   Zlangcoder+   Zlanglistr'   r'   r(   makeEnvString   s    

	
zLocaleInfo.makeEnvStringc             C   sz  d } d } g  } t  j j d  } t  j j |  r t  j | t  j  r t |  ? } x5 | D]- } t j d |  } | ra | j	 d  } qa WWd  QRXt
 j t  j    j } y t j   }	 |	 j d d  }
 t j |
 d d } | j |  } |	 j d |  }
 t j |
 d d } | j d	 d
  } t |  d k rb| j d	 d  } |  j |  } Wn9 t k
 r} z t j | j d  WYd  d  } ~ Xn Xt |  d k rd t  j k rt  j d } t |  d k rd t  j k rt  j d } t |  d k r)d t  j k r)t  j d } t |  d k r\t |  d k r\|  j |  } | j |  | j |  | S)Nr   z~/.pam_environmentzLANGUAGE=(.*)$rB   zorg.freedesktop.Accountsz/org/freedesktop/AccountsZ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GetrD   rH   	ExceptionwarningswarnargsrC   r4   )r   formatslanguageresultfnamer#   r$   match_languageZ	user_nameZbusobjZifaceZ	user_pathZfirstLanguagemsgr'   r'   r(   getUserDefaultLanguage   sJ    !!!$z!LocaleInfo.getUserDefaultLanguagec             C   s  d } d } d } g  } x7|  j  D],} t j j |  r" t j | t j  r" t |   } x | D] } | j d  r | j d d  } t	 j
 d |  } | r | j d  } | j d  r | j d d  } t	 j
 d |  }	 |	 r |	 j d  } | j d  r| j d d  } t	 j
 d	 |  }
 |
 re |
 j d  } qe WWd  QRXq" Wt |  d
 k rjd } t |  d
 k r|  j |  } t |  d
 k r| } | j |  | j |  | S)Nr   rI   "z
LANG=(.*)$rB   LC_TIMEzLC_TIME=(.*)$r=   zLANGUAGE=(.*)$r   zen_US.UTF-8)environmentsr   r   rK   rL   rM   r   r   replacerN   rO   rP   rD   rH   r4   )r   r!   rY   rZ   r[   r\   r#   r$   Z
match_langZmatch_formatsr]   r'   r'   r(   getSystemDefaultLanguage  sB    z#LocaleInfo.getSystemDefaultLanguagec          
   C   se   t  j |  j d t  j  s  d St |  j d  + } x! | D] } | j d  r= d Sq= WWd  QRXd S)Nr   FzLC_TIME=T)r   rL   rc   rM   r   r   )r   r#   r$   r'   r'   r(   isSetSystemFormats2  s    zLocaleInfo.isSetSystemFormatsN)__name__
__module____qualname____doc__rc   r)   r!   r*   r7   r:   r<   rF   rH   r`   re   rf   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   rN   r/   r   r   rQ   sysrT   rV   ZLanguageSelectorr   r   Zxml.etree.ElementTreer   objectr   rg   r   Zliprintre   r`   r   r   r   r7   r'   r'   r'   r(   <module>   s.    '