o
    iUU                  
   @   s  d 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mZmZmZmZ ddlZddlmZ ejdk rLddlmZ nddlmZ dZd	Zd
Ze d p_eZdZdZdZ dZ!ejdd dkZ"dZ#dZ$dZ%e$e$e$e$e#e#e$ddd	Z&e
 deee'f fddZ(de)deee'f fddZ*dd Z+dd Z,d e'de-fd!d"Z.efd e'd#e'de'fd$d%Z/d&d' Z0d e'dee)e'f fd(d)Z1efd#e'dee)e'f fd*d+Z2d e'de3fd,d-Z4G d.d/ d/Z5G d0d1 d1Z6dS )2z^
Localization utilities to find available language packs and packages with
localization data.
    N)	lru_cache)AnyDictOptionalPatternTuple)parse)   
   )entry_pointszjupyterlab.languagepackzjupyterlab.localeenlocaleLC_MESSAGES
jupyterlabz(@jupyterlab/translation-extension:plugin   )r	      schemasettingsz jupyter.lab.internationalizationmenutoolbar)	zproperties/.*/titlezproperties/.*/descriptionz"definitions/.*/properties/.*/titlez(definitions/.*/properties/.*/descriptiontitledescriptionz jupyter\.lab\.setting-icon-labelzjupyter\.lab\.menus/.*/labelzjupyter\.lab\.toolbars/.*/labelreturnc                   C   s   dd t  D S )Nc                 S   s$   i | ]\}}t d | d |qS z^/$)recompile).0patterncontext r    ^/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/jupyterlab_server/translation_utils.py
<dictcomp>?   s    z1_get_default_schema_selectors.<locals>.<dictcomp>)DEFAULT_SCHEMA_SELECTORSitemsr    r    r    r!   _get_default_schema_selectors=   s   r%   c                 C   s(   i t  dd | ti dg D S )Nc                 S   s    i | ]}t d | d tqS r   )r   r   _default_schema_context)r   selectorr    r    r!   r"   H   s    z,_prepare_schema_patterns.<locals>.<dictcomp>	selectors)r%   get_lab_i18n_config)r   r    r    r!   _prepare_schema_patternsE   s   r+   c               	   C   f   i } g }t tdD ] }ztj| j| |j< W q	 ty)   |	t
  Y q	w d|}| |fS )z
    Get available installed language pack locales.

    Returns
    -------
    tuple
        A tuple, where the first item is the result and the second item any
        error messages.
    group
)r   JUPYTERLAB_LANGUAGEPACK_ENTRYospathdirnameload__file__name	Exceptionappend	traceback
format_excjoindatamessagesentry_pointmessager    r    r!   $_get_installed_language_pack_localesQ   s   

rA   c               	   C   r,   )a  
    Get available installed packages containing locale information.

    Returns
    -------
    tuple
        A tuple, where the first item is the result and the second item any
        error messages. The value for the key points to the root location
        the package.
    r-   r/   )r   JUPYTERLAB_LOCALE_ENTRYr1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r    r    r!   _get_installed_package_localesg   s   
rC   locale_c              	   C   sD   | dkrdS d}zt j|  d}W |S  t jjtfy!   Y |S w )a	  
    Check if a `locale_` value is valid.

    Parameters
    ----------
    locale_: str
        Language locale code.

    Notes
    -----
    A valid locale is in the form language (See ISO-639 standard) and an
    optional territory (See ISO-3166 standard).

    Examples of valid locales:
    - English: DEFAULT_LOCALE
    - Australian English: "en_AU"
    - Portuguese: "pt"
    - Brazilian Portuguese: "pt_BR"

    Examples of invalid locales:
    - Australian Spanish: "es_AU"
    - Brazilian German: "de_BR"
    no_NOTF)babelLocaler   coreUnknownLocaleError
ValueError)rD   validr    r    r!   is_valid_locale   s   rL   display_localec                 C   sV   t | r| nt} t |r|nt}tj| }||}|r)|d  |dd  }|S )a  
    Return the language name to use with a `display_locale` for a given language locale.

    Parameters
    ----------
    locale_: str
        The language name to use.
    display_locale: str, optional
        The language to display the `locale_`.

    Returns
    -------
    str
        Localized `locale_` and capitalized language name using `display_locale` as language.
    r      N)rL   DEFAULT_LOCALErF   rG   r   get_display_nameupper)rD   rM   locdisplay_namer    r    r!   rP      s   
rP   c           	      C   s   | }|  di }| dd}| dd}| di }| dd}| dd}|rC|rC||krCt|}t|}||krC|  }|| |S )aO  
    Merge language pack data with locale data bundled in packages.

    Parameters
    ----------
    language_pack_locale_data: dict
        The dictionary with language pack locale data.
    package_locale_data: dict
        The dictionary with package locale data.

    Returns
    -------
    dict
        Merged locale data.
     versionNdomainNone)r)   parse_versioncopyupdate)	language_pack_locale_datapackage_locale_dataresultpackage_lp_metadatapackage_lp_versionpackage_lp_domainpackage_metadatapackage_versionpackage_domainr    r    r!   merge_locale_data   s   
rd   c           
   	      s$  t  \}}i }|d}|s| D ]x\}}i }ztj|t  fddt D }W n ty=   |	t
  Y nw |  |v rtj ||   t| d}tj|rzt|dd}	t|	||< W d   n1 ssw   Y  W q ty   |	t
  Y qw q|d|fS )a  
    Get all jupyterlab extensions installed that contain locale data.

    Returns
    -------
    tuple
        A tuple in the form `(locale_data_dict, message)`,
        where the `locale_data_dict` is an ordered list
        of available language packs:
            >>> {"package-name": locale_data, ...}

    Examples
    --------
    - `entry_points={"jupyterlab.locale": "package-name = package_module"}`
    - `entry_points={"jupyterlab.locale": "jupyterlab-git = jupyterlab_git"}`
    r/   c                    s,   i | ]}t jt j |r| |qS r    )r1   r2   isdirr;   lower)r   rR   locale_pathr    r!   r"      s    z1get_installed_packages_locale.<locals>.<dictcomp>.jsonutf-8encodingN)rC   splitr$   r1   r2   r;   
LOCALE_DIRlistdirr7   r8   r9   r:   rf   LC_MESSAGES_DIRisfileopenjsonr4   )
rD   found_package_localesr@   packages_locale_datar>   package_namepackage_root_pathlocaleslocale_json_pathfhr    rg   r!   get_installed_packages_locale   s@   




r{   c                 C   s   t  \}}i }|d}|sZg }g }g }|D ]}t|r"|| q|| q| |v r.| nt} ttt| tttdi}|D ]}t|| t||d||< q?|rZ|d| d |d|fS )ab  
    Return the available language packs installed in the system.

    The returned information contains the languages displayed in the current
    locale.

    Parameters
    ----------
    display_locale: str, optional
        Default is DEFAULT_LOCALE.

    Returns
    -------
    tuple
        A tuple in the form `(locale_data_dict, message)`.
    r/   )displayName
nativeNamez#The following locales are invalid: !)rA   rm   rL   r8   rO   rP   r;   )rM   found_localesr@   rx   r>   invalid_localesvalid_localesrD   r    r    r!   get_language_packs  s0   

r   c              
   C   s6  t  \}}t| \}}i }|d}|st| r| |v r||  }tj|ddD ][\}}}	|	D ]S}
|
dr|
dd}tj	||
}zt
|dd}t|}W d   n1 sYw   Y  W n tyo   |t  Y nw ||v r}|| }t||}|||< q.q'| D ]\}}||vr|||< q|d	|fS )	a  
    Get a language pack for a given `locale_` and update with any installed
    package locales.

    Returns
    -------
    tuple
        A tuple in the form `(locale_data_dict, message)`.

    Notes
    -----
    We call `_get_installed_language_pack_locales` via a subprocess to
    guarantee the results represent the most up-to-date entry point
    information, which seems to be defined on interpreter startup.
    r/   F)topdownri   rT   rj   rk   N)rA   r{   rm   rL   r1   walkendswithreplacer2   r;   rr   rs   r4   r7   r8   r9   r:   rd   r$   )rD   r   r@   found_packages_localeslocale_datar>   r2   root__filesr6   pkg_name	json_pathrz   merged_datapkg_datar=   r    r    r!   get_language_packK  s<   



r   c                
   @   s   e Zd ZdZdedefddZdeddfdd	Zd
edefddZd
edededefddZ	ded
edefddZ
ded
edededef
ddZd
edefddZd
edededefddZded
edefddZded
edededef
ddZdS )TranslationBundlezI
    Translation bundle providing gettext translation functionality.
    rV   rD   c                 C   s$   || _ || _t | _| | dS )zInitialize the bundle.N)_domain_localegettextNullTranslations_translatorupdate_locale)selfrV   rD   r    r    r!   __init__  s   
zTranslationBundle.__init__r   Nc                 C   s   || _ d}|tkr2d| }zt|}|jdusJ tjtj|jt	}W n	 t
y1   Y nw tj| j|| j fdd| _dS )z
        Update the locale.

        Parameters
        ----------
        locale_: str
            The language name to use.
        Njupyterlab_language_pack_T)	localedir	languagesfallback)r   rO   	importlibimport_moduler5   r1   r2   r;   r3   rn   r7   r   translationr   r   )r   rD   r   language_pack_modulemodr    r    r!   r     s   


zTranslationBundle.update_localemsgidc                 C   s   | j |S )z
        Translate a singular string.

        Parameters
        ----------
        msgid: str
            The singular string to translate.

        Returns
        -------
        str
            The translated string.
        )r   r   r   r   r    r    r!   r        zTranslationBundle.gettextmsgid_pluralnc                 C   s   | j |||S )ax  
        Translate a singular string with pluralization.

        Parameters
        ----------
        msgid: str
            The singular string to translate.
        msgid_plural: str
            The plural string to translate.
        n: int
            The number for pluralization.

        Returns
        -------
        str
            The translated string.
        )r   ngettextr   r   r   r   r    r    r!   r     s   zTranslationBundle.ngettextmsgctxtc                 C   s&   t r
| j|}|S | j||}|S )a)  
        Translate a singular string with context.

        Parameters
        ----------
        msgctxt: str
            The message context.
        msgid: str
            The singular string to translate.

        Returns
        -------
        str
            The translated string.
        )PY37_OR_LOWERr   r   pgettext)r   r   r   r   r    r    r!   r     s
   zTranslationBundle.pgettextc                 C   s.   t r| j|||}|S | j||||}|S )a  
        Translate a singular string with context and pluralization.

        Parameters
        ----------
        msgctxt: str
            The message context.
        msgid: str
            The singular string to translate.
        msgid_plural: str
            The plural string to translate.
        n: int
            The number for pluralization.

        Returns
        -------
        str
            The translated string.
        )r   r   r   	npgettext)r   r   r   r   r   r   r    r    r!   r     s
   zTranslationBundle.npgettextc                 C   s
   |  |S )z
        Shorthand for gettext.

        Parameters
        ----------
        msgid: str
            The singular string to translate.

        Returns
        -------
        str
            The translated string.
        )r   r   r    r    r!   r     s   
zTranslationBundle.__c                 C   s   |  |||S )a`  
        Shorthand for ngettext.

        Parameters
        ----------
        msgid: str
            The singular string to translate.
        msgid_plural: str
            The plural string to translate.
        n: int
            The number for pluralization.

        Returns
        -------
        str
            The translated string.
        )r   r   r    r    r!   _n  s   zTranslationBundle._nc                 C   s   |  ||S )a  
        Shorthand for pgettext.

        Parameters
        ----------
        msgctxt: str
            The message context.
        msgid: str
            The singular string to translate.

        Returns
        -------
        str
            The translated string.
        )r   )r   r   r   r    r    r!   _p#  s   zTranslationBundle._pc                 C   s   |  ||||S )a  
        Shorthand for npgettext.

        Parameters
        ----------
        msgctxt: str
            The message context.
        msgid: str
            The singular string to translate.
        msgid_plural: str
            The plural string to translate.
        n: int
            The number for pluralization.

        Returns
        -------
        str
            The translated string.
        )r   )r   r   r   r   r   r    r    r!   _np5  s   zTranslationBundle._np)__name__
__module____qualname____doc__strr   r   r   intr   r   r   r   r   r   r   r    r    r    r!   r   }  s    "r   c                   @   s   e Zd ZU dZi Zeeef ed< e	Z
ededefddZededdfd	d
ZededefddZe		ddedededeeeef  ddf
ddZededefddZdS )
translatorz
    Translations manager.
    _TRANSLATORSrV   r   c                 C   s   |  ddS )zNormalize a domain name.

        Parameters
        ----------
        domain: str
            Domain to normalize

        Returns
        -------
        str
            Normalized domain
        -_)r   )rV   r    r    r!   normalize_domainT  r   ztranslator.normalize_domainrD   Nc                 C   sB   || j krdS t|r|| _ | j D ]\}}|| qdS dS )z
        Set locale for the translation bundles based on the settings.

        Parameters
        ----------
        locale_: str
            The language name to use.
        N)_LOCALErL   r   r$   r   )clsrD   r   bundler    r    r!   
set_localed  s   

ztranslator.set_localec                 C   s<   t |}|| jv r| j| }|S t|| j}|| j|< |S )aY  
        Load translation domain.

        The domain is usually the normalized ``package_name``.

        Parameters
        ----------
        domain: str
            The translations domain. The normalized python package name.

        Returns
        -------
        Translator
            A translator instance bound to the domain.
        )r   r   r   r   r   )r   rV   norm_domaintransr    r    r!   r4   w  s   



ztranslator.loadrT   translationsr   prefixto_translatec                 C   s   |du rt |}| D ]b\}}|d | }t|tr:d}| D ]\}}	||r.d} nq!|r9| |	|||< qt|trItj| |||d qt|t	rnt
|D ]\}
}t|ts\qRtj| ||d t|
 d |d qRqdS )zTranslate a schema in-place.N/FT)r   r   [])r+   r$   
isinstancer   	fullmatchr   dictr   _translate_schema_stringslist	enumerate)r   r   r   r   keyvaluer2   matchedr   r   ielementr    r    r!   r     sB   




z$translator._translate_schema_stringsc                 C   s@   t jtkr| S t | ti dt}|  }t || |S )zTranslate a schema.

        Parameters
        ----------
        schema: dict
            The schema to be translated

        Returns
        -------
        Dict
            The translated schema
        rV   )	r   r   rO   r4   r)   r*   DEFAULT_DOMAINrY   r   )r   r   
new_schemar    r    r!   translate_schema  s   
ztranslator.translate_schema)rT   N)r   r   r   r   r   r   r   r   __annotations__
SYS_LOCALEr   staticmethodr   classmethodr   r4   r   r   r   r   r   r   r    r    r    r!   r   L  s4   
 'r   )7r   r   r   rs   r   r1   r   sysr9   	functoolsr   typingr   r   r   r   r   rF   packaging.versionr   rX   version_infoimportlib_metadatar   importlib.metadatar0   rB   rO   	getlocaler   rn   rp   r   L10N_SCHEMA_NAMEr   r&   _default_settings_contextr*   r#   r   r%   r   r+   rA   rC   boolrL   rP   rd   r{   r   tupler   r   r   r    r    r    r!   <module>   sh   
'%512 P