o
    »¼tfÕU  ã                
   @  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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=dd„ƒZ&d>dd„Z'd?d d!„Z(d?d"d#„Z)d@d'd(„Z*efdAd*d+„Z+dBd/d0„Z,dCd2d3„Z-efdDd4d5„Z.dEd7d8„Z/G d9d:„ d:ƒZ0G d;d<„ d<ƒZ1dS )Fz^
Localization utilities to find available language packs and packages with
localization data.
é    )ÚannotationsN)Ú	lru_cache)ÚAnyÚPattern)Úparse)é   é
   )Úentry_pointszjupyterlab.languagepackzjupyterlab.localeÚenÚlocaleÚLC_MESSAGESZ
jupyterlabz(@jupyterlab/translation-extension:pluginé   )r   é   ÚschemaÚsettingsz jupyter.lab.internationalizationZmenuZ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   úl/var/www/html/software/conda/envs/catlas/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!   Ú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   I   s    ÿÿz,_prepare_schema_patterns.<locals>.<dictcomp>Ú	selectors)r!   ÚgetÚ_lab_i18n_config)r   r   r   r   Ú_prepare_schema_patternsF   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_localesR   s   
ÿ
r?   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_ENTRYr/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r   r   r   Ú_get_installed_package_localesh   s   ÿ
rA   Úlocale_ÚstrÚboolc              	   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"
    Zno_NOTF)ÚbabelÚLocaler   ÚcoreZUnknownLocaleErrorÚ
ValueError)rB   Úvalidr   r   r   Úis_valid_locale   s   üürJ   Ú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)rJ   ÚDEFAULT_LOCALErE   rF   r   Úget_display_nameÚupper)rB   rK   ÚlocZdisplay_namer   r   r   rN   ¨   s   
rN   Ú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)	rQ   rS   ÚresultZpackage_lp_metadataZpackage_lp_versionZpackage_lp_domainZpackage_metadataZpackage_versionZpackage_domainr   r   r   Úmerge_locale_dataÁ   s   
r\   ú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 rŠtj ˆ ||  ¡  t|› d¡}tj |¡rŠz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   )r/   r0   Úisdirr9   Úlower)r   rP   ©Zlocale_pathr   r   r     s    ýÿz1get_installed_packages_locale.<locals>.<dictcomp>ú.jsonúutf-8©ÚencodingN)rA   Úsplitr    r/   r0   r9   Ú
LOCALE_DIRÚlistdirr5   r6   r7   r8   r_   ÚLC_MESSAGES_DIRÚisfileÚopenÚjsonr2   )
rB   Zfound_package_localesr>   Zpackages_locale_datar<   Úpackage_nameZpackage_root_pathÚlocalesZlocale_json_pathÚfhr   r`   r   Úget_installed_packages_localeè   s@   



þÿ
üÿ€ÿ€ro   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-   )ZdisplayNameZ
nativeNamez#The following locales are invalid: ú!)r?   re   rJ   r6   rM   rN   r9   )rK   Úfound_localesr>   rm   r<   Zinvalid_localesZvalid_localesrB   r   r   r   Úget_language_packs  s0   

þÿþrr   Útuplec              
   C  s6  t ƒ \}}t| ƒ\}}i }| d¡}|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 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)Útopdownra   rT   rb   rc   N)r?   ro   re   rJ   r/   ÚwalkÚendswithÚreplacer0   r9   rj   rk   r2   r5   r6   r7   r8   r\   r    )rB   rq   r>   Zfound_packages_localesZlocale_datar<   r0   ÚrootÚ__Úfilesr4   Úpkg_nameZ	json_pathrn   Zmerged_dataZpkg_datar;   r   r   r   Úget_language_packN  s<   


ÿ€ÿ
€ñ€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.
    rV   rC   rB   c                 C  s$   || _ || _t ¡ | _|  |¡ dS )zInitialize the bundle.N)Ú_domainÚ_localeÚgettextÚNullTranslationsÚ_translatorÚupdate_locale)ÚselfrV   rB   r   r   r   Ú__init__…  s   
zTranslationBundle.__init__r   rW   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.
        NZjupyterlab_language_pack_T)Ú	localedirÚ	languagesÚfallback)r   rM   Ú	importlibÚimport_moduler3   r/   r0   r9   r1   rf   r5   r€   Útranslationr~   r‚   )r„   rB   r†   Z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   ry     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   Ú_np8  s   zTranslationBundle._npN)rV   rC   rB   rC   ©rB   rC   r   rW   )r   rC   r   rC   )r   rC   r   rC   r‘   r’   r   rC   )r•   rC   r   rC   r   rC   )
r•   rC   r   rC   r   rC   r‘   r’   r   rC   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r…   rƒ   r€   r“   r—   r˜   ry   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]Ú_TRANSLATORSrV   rC   r   c                 C  s   |   dd¡S )zÇNormalize a domain name.

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

        Returns
        -------
        str
            Normalized domain
        ú-Ú_)rw   )rV   r   r   r   Únormalize_domainW  r   ztranslator.normalize_domainrB   rW   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)Ú_LOCALErJ   r¢   r    rƒ   )ÚclsrB   r¤   Zbundler   r   r   Ú
set_localeg  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§   rV   Znorm_domainZtransr   r   r   r2   z  s   


ý
ztranslator.loadrT   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    Ú
isinstancerC   Ú	fullmatchr—   r"   r¡   Ú_translate_schema_stringsÚlistÚ	enumerate)r©   r   rª   r«   ÚkeyÚvaluer0   Z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 )zÐTranslate a schema.

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

        Returns
        -------
        Dict
            The translated schema
        rV   )	r¡   r¦   rM   r2   r&   r'   ÚDEFAULT_DOMAINrY   r²   )r   r©   Z
new_schemar   r   r   Útranslate_schema¼  s   
ÿztranslator.translate_schema)rV   rC   r   rC   rœ   )rV   rC   r   r}   )rT   N)
r©   r   r   r"   rª   rC   r«   r¬   r   rW   )r   r"   r   r"   )r   rž   rŸ   r    r¢   Ú__annotations__Ú
SYS_LOCALEr¦   Ústaticmethodr¥   Úclassmethodr¨   r2   r²   rº   r   r   r   r   r¡   O  s    
 ü'r¡   )r   r   )r   r"   r   r   )r   r)   )rB   rC   r   rD   )rB   rC   rK   rC   r   rC   )rQ   rR   rS   rR   r   rR   )rB   rC   r   r]   )rK   rC   r   r]   )rB   rC   r   rs   )2r    Ú
__future__r   r€   r‰   rk   r   r/   r   Úsysr7   Ú	functoolsr   Útypingr   r   rE   Zpackaging.versionr   rX   Úversion_infoÚimportlib_metadatar	   Úimportlib.metadatar.   r@   rM   Ú	getlocaler¼   rf   rh   r¹   ZL10N_SCHEMA_NAMEr–   r#   Z_default_settings_contextr'   r   r!   r(   r?   rA   rJ   rN   r\   ro   rr   r|   r}   r¡   r   r   r   r   Ú<module>   sj   
ö



'

'5
12 P