B
    ObD(                 @   s   d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ edZdd	d
Zdd Zdd ZG dd deZG dd dZdd ZG dd deZe ZG dd deZe Zdd Zdd Zdd ZdS )    N)OrderedDict)cache)import_string)gettext)settings)>z.time & security refinement management platformz	card costz)don&#39;t allow deletion, can be modifiedzexpense card costzgeneral departmentzmanual supplement consumptionzpromotional rechargeZrechargeZrefundz
staff cardzwechat rechargeZconsumptionZ
correctioncountzcounting error correctionzfixed time periodzmanagement feezrecharge on alipayZsubsidyz24 hours all day trafficzannual leavezdefault areaz
home leaveznumber %d batchzprivate affair leaveZpublicz
sick leaveZ	wiegand26Z
wiegand26aZ	wiegand34Z
wiegand34aZ	wiegand36Z	wiegand37Z
wiegand37aZ	wiegand50Z	wiegand66zautomatic matchingzheadquarters restaurantZ	breakfastzchinese foodZdinnerZnightingalezmeal 05zmeal 06zmeal 07zmeal 08z	default 1z	default 2z	default 3z	default 4z	default 5z	default 6z	default 7z	default 8znumber 1 batchznumber 2 batchznumber 3 batchznumber 4 batchznumber 5 batchznumber 6 batchznumber 7 batchznumber 8 batchZzh_twZzh_cn)Zzh_hantZzh_hansc             C   sP   t jd dkr"t| ttfs0dS nt| ts0dS |  dd} t| | } | S )u    格式化语言代号
    1) 统一转为小写
    2) 统一采用 '_' 作为分隔符
    3) 对同一语言的多个别名，进行重新映射
    :param lang: 原始语言代号
    :return: 格式化后的语言代号
    r      N-_)	sysversion_info
isinstancestrZunicodelowerreplace	LANG_DICTget)lang r   ,G:\easytimepro\master/mysite/i18n_backend.pyformat_lang_codeX   s    
r   c             C   s6   dd t tjd D }t| } | |kr.dS dS dS )u    用于判断传入的 `语言代号` 是否是系统所支持的语言
    :param lang: 原始语言代号
    :return: True or False
    c             s   s   | ]}|  V  qd S )N)r   ).0_langr   r   r   	<genexpr>s   s    z"exist_lang_code.<locals>.<genexpr>r   TFN)oslistdirr   ZLOCALE_PATHSr   )r   all_langr   r   r   exist_lang_codel   s
    r   c               @   s   e Zd ZdS )InvalidMultiLangBackendErrorN)__name__
__module____qualname__r   r   r   r   r   {   s   r   c               @   sX   e Zd ZdefddZdd Zedd Zdd	d
Zdd Z	dd Z
dd Zdd ZdS )MultiLangLayerNc             C   s8   || _ | j d}|r|n|}t|s.d | _n|| _d S )Ncurrent_language)_cacher   r   r   )selfr   r$   Zcached_langr   r   r   __init__   s    zMultiLangLayer.__init__c             C   s   d S )Nr   )r%   r   r   r   trans   s    zMultiLangLayer.transc             C   s&   | rd || }ntjd |}|S )u    [工具函数] 用于获得添加了 `语言代号` 的键
        :param lang: 语言
        :param key: 原始的键
        :return: 添加了 `语言代号` 的键
        z<{}_{}>z/### No Specified valid language while get cache)formatr   stderrwrite)r   keywrapped_keyr   r   r   wrap_key   s
    zMultiLangLayer.wrap_keyQ c             C   s"   |  | j|}| j||| dS )u+   [兼容 MemCache 接口] 设置快取映射N)r-   r   r$   set)r%   r+   valuetimeoutr,   r   r   r   r/      s    zMultiLangLayer.setc             C   s   |  | j|}| j|S )uL   [兼容 MemCache 接口] 用 key 从 cache 取得对应的地区化后的值)r-   r   r$   r   )r%   r+   r,   r   r   r   r      s    zMultiLangLayer.getc             C   s.   x(t  D ]}| ||}| j| q
W dS )u=   [兼容 MemCache 接口] 删除所有可用语言对应的键N)LayerHandlerr   r-   r$   delete)r%   r+   r   r,   r   r   r   r3      s    zMultiLangLayer.deletec             C   s   |  | j|}| j| dS )uF   [兼容 MemCache 接口] 仅删除当前使用语言代码对应的键N)r-   r   r$   r3   )r%   r+   r,   r   r   r   delete_single   s    zMultiLangLayer.delete_singlec             C   s   d | jS )Nz<MultiLangLayer {}>)r(   r   )r%   r   r   r   __repr__   s    zMultiLangLayer.__repr__)r.   )r   r    r!   r   r&   r'   staticmethodr-   r/   r   r3   r4   r5   r   r   r   r   r"      s   	
r"   c          
   K   sJ   yt | }W n2 tk
r> } ztd| |f W d d }~X Y nX |f |S )NzCould not find backend '%s': %s)r   ImportErrorr   )ZbackendkwargsZbackend_clser   r   r   _create_layer   s     r:   c               @   s>   e Zd ZdZe ZdZdd Zdd Zdd Z	e
d	d
 ZdS )r2   u'  
    A Multi-Language Layer Handler to manage access to layer instances.
    这是一个多国语言层用于管理上层(业务层)对『层实例』的访问
    Ensures only one instance of each lang exists per thread.
    确保每个线程中每个语言只存在一个『层实例』
    Nc             C   s   d S )Nr   )r%   r   r   r   r&      s    zLayerHandler.__init__c          	   C   s   t |}|dkst|s"t tj}y
| j| S  ttfk
rL   t | _Y n tk
r^   Y nX t	j
| td|d}|| j|< |S )u   重写 `obj[index]` 方法Nz"mysite.i18n_backend.MultiLangLayer)r   )r   r   r   LANGUAGE_CODE_LAYERSAttributeError	TypeErrorr   KeyErrorr2   _AVAILABLE_LANGUAGESaddr:   )r%   r   Zlayerr   r   r   __getitem__   s    


zLayerHandler.__getitem__c             C   s   t | di  S )u   查看所有的语言层r<   )getattrvalues)r%   r   r   r   	all_layer   s    zLayerHandler.all_layerc             c   s   x| j D ]
}|V  qW dS )u   查看现有的所有语言N)r@   )clsr   r   r   r   r      s    zLayerHandler.all_lang)r   r    r!   __doc__r/   r@   r<   r&   rB   rE   classmethodr   r   r   r   r   r2      s   r2   c               @   sN   e Zd ZdZdZeZejZ	dd Z
dd Zdd Zed	d
 Zedd ZdS )DefaultLangProxyu   
    Proxy access to the default Lang object's attributes.
    代理： 对用户包括（程序员）透明的默认语言代理, 使用时和一般的 cache 的常见接口完全一致
    r#   c             C   s   t tt ptj |S )u   重写 `obj.field_name` 方法)rC   layersrI   get_languageDEFAULT_LANGUAGE)r%   namer   r   r   __getattr__   s    zDefaultLangProxy.__getattr__c             C   s   t tt ptj ||S )u*   重写 `obj.field_name = new_value` 方法)setattrrJ   rI   rK   rL   )r%   rM   r0   r   r   r   __setattr__   s    zDefaultLangProxy.__setattr__c             C   s   t tt ptj |S )u"   重写 `del obj.field_name` 方法)delattrrJ   rI   rK   rL   )r%   rM   r   r   r   __delattr__  s    zDefaultLangProxy.__delattr__c             C   sN   t j}t| } t j|}|d kr2t j||  n|| krJt j||  n d S )N)rI   KEYr   CACHEr   r/   )r   r+   Z	orig_langr   r   r   set_language  s    zDefaultLangProxy.set_languagec               C   s   t jt jS )N)rI   rT   r   rS   r   r   r   r   rK     s    zDefaultLangProxy.get_languageN)r   r    r!   rG   rS   r   rT   r   r;   rL   rN   rP   rR   r6   rU   rK   r   r   r   r   rI      s   rI   c             C   s    t |  drt| S | S d S )NF)BUILTIN_OPTIONr   r   r   )textr   r   r   	trans_opt  s    rX   c             C   s:   t | tr6ddlm} | }t| } d| kr6|| } | S )Nr   )
HTMLParserz&#39;)r   r   Zhtml.parserrY   rX   Zunescape)rW   rY   parserr   r   r   trans_form_field#  s    

r[   c                 s    fdd}|S )z2
    Make attributes of a class to translate.
    c          	      s   G  fddd }t  t |}xLdd D D ]:}yt||  | W q6 tk
rn   t| Y q6X q6W x4fdd|D D ]}t|t|| t|| qW  j|_|S )Nc                   s$   e Zd ZdZ fddZ  ZS )z@need_trans_properties.<locals>.class_decorator.<locals>.NewClassz"This is the overwritten classc                s6   d }|krt | |}n|| jkr*nt|}|S )N)super__getattribute____dict__rX   )r%   rM   Zret_val)	__class__rF   propsr   r   r]   6  s    
zQneed_trans_properties.<locals>.class_decorator.<locals>.NewClass.__getattribute__)r   r    r!   rG   r]   __classcell__r   )rF   r`   )r_   r   NewClass3  s   rb   c             s   s"   | ]}t |s|d kr|V  qdS ))r]   r^   N)callable)r   r+   r   r   r   r   D  s    zAneed_trans_properties.<locals>.class_decorator.<locals>.<genexpr>c             3   s"   | ]}| kr|d kr|V  qdS ))r]   Nr   )r   r+   )cls_dirr   r   r   K  s    )dirrO   r]   r=   printrC   rQ   r   )rF   rb   Znew_cls_dirZprop)r`   )rF   rd   r   class_decorator2  s    
z.need_trans_properties.<locals>.class_decoratorr   )r`   rg   r   )r`   r   need_trans_properties-  s     rh   )r   r   collectionsr   Zdjango.core.cacher   Zdjango.utils.module_loadingr   Zdjango.utils.translationr   mysiter   	frozensetrV   r   r   r   	Exceptionr   r"   r:   objectr2   rJ   rI   Z
lang_layerrX   r[   rh   r   r   r   r   <module>   s,   A4	4&
