o
    ^iY                  
   @  s  d 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 ddlZddlmZ e	jdk rPdd	lmZ ndd	lmZ d
ZdZdZe d pceZdZdZdZdZ e	jdd dkZ!dZ"dZ#dZ$dZ%e$e$e$e$e#e#e$ddd	Z&ed?ddZ'd@dd Z(dAd"d#Z)dAd$d%Z*dBd)d*Z+efdCd,d-Z,dDd1d2Z-dEd4d5Z.efdFd6d7Z/dGd9d:Z0G d;d< d<Z1G d=d> d>Z2dS )Hz^
Localization utilities to find available language packs and packages with
localization data.
    )annotationsN)	lru_cache)Pattern)Any)parse)   
   )entry_pointszjupyterlab.languagepackzjupyterlab.localeenlocaleLC_MESSAGES
jupyterlabz(@jupyterlab/translation-extension:plugin   )r      ach_UG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returndict[Pattern, str]c                   C  s   dd t  D S )Nc                 S  s$   i | ]\}}t d | d |qS z^/$)recompile).0patterncontext r    ^/home/ubuntu/hpml_nyu/venv/lib/python3.10/site-packages/jupyterlab_server/translation_utils.py
<dictcomp>E   s    z1_get_default_schema_selectors.<locals>.<dictcomp>)DEFAULT_SCHEMA_SELECTORSitemsr    r    r    r!   _get_default_schema_selectorsC   s   r%   dictc                 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"   N   s    z,_prepare_schema_patterns.<locals>.<dictcomp>	selectors)r%   get_lab_i18n_config)r   r    r    r!   _prepare_schema_patternsK   s   r,   tuple[dict[str, Any], str]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_localesW   s   

rC   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/   r1   )r	   JUPYTERLAB_LOCALE_ENTRYr3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r    r    r!   _get_installed_package_localesm   s   
rE   locale_strboolc              	   C  sD   | dv 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)rF   validr    r    r!   is_valid_locale   s   rP   display_localec                 C  st   t | r| nt} t |r|nt}ztj| }||}W n tjy)   |}Y nw |r8|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)rP   DEFAULT_LOCALErJ   rK   r   get_display_namerM   upper)rF   rQ   locdisplay_namer    r    r!   rT      s   rT   language_pack_locale_datadict[str, Any]package_locale_datac           	      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)	rX   rZ   resultpackage_lp_metadatapackage_lp_versionpackage_lp_domainpackage_metadatapackage_versionpackage_domainr    r    r!   merge_locale_data   s   
ri   tuple[dict, str]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"}`
    r1   c                   s,   i | ]}t jt j |r| |qS r    )r3   r4   isdirr=   lower)r   rV   locale_pathr    r!   r"     s    z1get_installed_packages_locale.<locals>.<dictcomp>.jsonutf-8encodingN)rE   splitr$   r3   r4   r=   
LOCALE_DIRlistdirr9   r:   r;   r<   rl   LC_MESSAGES_DIRisfileopenjsonr6   )
rF   found_package_localesrB   packages_locale_datar@   package_namepackage_root_pathlocaleslocale_json_pathfhr    rm   r!   get_installed_packages_locale   s@   




r   c           	      C  s   t  \}}i }|d}|sxg }g }g }|D ]}t|r"|| q|| q| |v r.| nt}t| tkr:tt|ndtttdi}|D ]}t||t||d||< qE|rxt|v rm|t d| tkrgdndd|t< |rx|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)`.
    r1   Default)displayName
nativeNamezPseudo-languagezto translate the UIz#The following locales are invalid: !)	rC   rs   rP   r:   rS   PSEUDO_LANGUAGErT   remover=   )	rQ   found_localesrB   r~   r@   invalid_localesvalid_localesrF   display_locale_r    r    r!   get_language_packs'  sD   






r   tuplec              
   C  s>  t  \}}t| \}}i }|d}|s| tkst| 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 s]w   Y  W n tys   |t  Y nw ||v r|| }t||}|||< q2q+| 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.
    r1   F)topdownro   r[   rp   rq   N)rC   r   rs   r   rP   r3   walkendswithreplacer4   r=   rx   ry   r6   r9   r:   r;   r<   ri   r$   )rF   r   rB   found_packages_localeslocale_datar@   r4   root__filesr8   pkg_name	json_pathr   merged_datapkg_datar?   r    r    r!   get_language_packi  sB   



r   c                   @  st   e Zd ZdZd!ddZd"d	d
Zd#ddZd$ddZd%ddZd&ddZ	d#ddZ
d$ddZd%ddZd&ddZd S )'TranslationBundlezI
    Translation bundle providing gettext translation functionality.
    r]   rG   rF   c                 C  s$   || _ || _t | _| | dS )zInitialize the bundle.N)_domain_localegettextNullTranslations_translatorupdate_locale)selfr]   rF   r    r    r!   __init__  s   
zTranslationBundle.__init__r   r^   c                 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   rS   	importlibimport_moduler7   r3   r4   r=   r5   rt   r9   r   translationr   r   )r   rF   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nintc                 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!   _n1  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!   _pE  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!   _npW  s   zTranslationBundle._npN)r]   rG   rF   rG   rF   rG   r   r^   )r   rG   r   rG   )r   rG   r   rG   r   r   r   rG   )r   rG   r   rG   r   rG   )
r   rG   r   rG   r   rG   r   r   r   rG   )__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   r   r    r    r    r!   r     s    








r   c                   @  sn   e Zd ZU dZi Zded< eZedddZ	e
dddZe
dddZe		d d!ddZed"ddZdS )#
translatorz
    Translations manager.
    zdict[str, TranslationBundle]_TRANSLATORSr]   rG   r   c                 C  s   |  ddS )zNormalize a domain name.

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

        Returns
        -------
        str
            Normalized domain
        -_)r   )r]   r    r    r!   normalize_domainv  r   ztranslator.normalize_domainrF   r^   c                 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)_LOCALErP   r   r$   r   )clsrF   r   bundler    r    r!   
set_locale  s   

ztranslator.set_localer   c                 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   r]   norm_domaintransr    r    r!   r6     s   



ztranslator.loadr[   Ntranslationsr   r   r&   prefixto_translatedict[Pattern, str] | Nonec                 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$   
isinstancerG   	fullmatchr   r&   r   _translate_schema_stringslist	enumerate)r   r   r   r   keyvaluer4   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
        r]   )	r   r   rS   r6   r*   r+   DEFAULT_DOMAINr`   r   )r   r   
new_schemar    r    r!   translate_schema  s   
ztranslator.translate_schema)r]   rG   r   rG   r   )r]   rG   r   r   )r[   N)
r   r   r   r&   r   rG   r   r   r   r^   )r   r&   r   r&   )r   r   r   r   r   __annotations__
SYS_LOCALEr   staticmethodr   classmethodr   r6   r   r   r    r    r    r!   r   n  s    
 'r   )r   r   )r   r&   r   r   )r   r-   )rF   rG   r   rH   )rF   rG   rQ   rG   r   rG   )rX   rY   rZ   rY   r   rY   )rF   rG   r   rj   )rQ   rG   r   rj   )rF   rG   r   r   )3r   
__future__r   r   r   ry   r   r3   r   sysr;   	functoolsr   r   typingr   rJ   packaging.versionr   r_   version_infoimportlib_metadatar	   importlib.metadatar2   rD   rS   	getlocaler   rt   rv   r   L10N_SCHEMA_NAMEr   r   r'   _default_settings_contextr+   r#   r%   r,   rC   rE   rP   rT   ri   r   r   r   r   r   r    r    r    r!   <module>   sn   




)

'5
B6 P