
     )MeU              
         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     rddlmZ nddlmZ d	Zd
ZdZ ej                    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d3d            Z&d4dZ'd5dZ(d5dZ)d6d#Z*efd7d%Z+d8d)Z,d9d+Z-efd:d,Z.d;d.Z/ G d/ d0          Z0 G d1 d2          Z1dS )<z^
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_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returndict[Pattern, str]c                 H    d t                                           D             S )Nc                J    i | ] \  }}t          j        d |z   dz             |!S z^/$)recompile).0patterncontexts      Clib/python3.11/site-packages/jupyterlab_server/translation_utils.py
<dictcomp>z1_get_default_schema_selectors.<locals>.<dictcomp>@   sA       GW 	
4'>C'(('      )DEFAULT_SCHEMA_SELECTORSitems r$   r"   _get_default_schema_selectorsr(   >   s/      8 > > @ @   r$   dictc                    i t                      d |                     t          i                               dg           D             S )Nc                N    i | ]"}t          j        d |z   dz             t          #S r   )r   r   _default_schema_context)r   selectors     r"   r#   z,_prepare_schema_patterns.<locals>.<dictcomp>I   s>     
 
 
 Jth,--/F
 
 
r$   	selectors)r(   get_lab_i18n_config)r   s    r"   _prepare_schema_patternsr1   F   sZ    
'
)
)
 
"JJ'7<<@@bQQ
 
 
 r$   tuple[dict[str, Any], str]c                 V   i } g }t          t                    D ]w}	 t          j                            |                                j                  | |j        <   B# t          $ r) |	                    t          j                               Y tw xY 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messages       r"   $_get_installed_language_pack_localesrH   R   s     DH#*GHHH 4 4	4%'W__[5E5E5G5G5P%Q%QD!"" 	4 	4 	4OOI02233333	4 ii!!G=   >A0BBc                 V   i } g }t          t                    D ]w}	 t          j                            |                                j                  | |j        <   B# t          $ r) |	                    t          j                               Y tw xY wd                    |          }| |fS )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.
    r4   r6   )r
   JUPYTERLAB_LOCALE_ENTRYr8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   s       r"   _get_installed_package_localesrL   h   s     DH#*ABBB 4 4	4%'W__[5E5E5G5G5P%Q%QD!"" 	4 	4 	4OOI02233333	4 ii!!G=rI   locale_strboolc                    | dk    rdS d}	 t           j                            |            d}n!# t           j        j        t
          f$ r Y nw xY w|S )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)rM   valids     r"   is_valid_localerX      sl    2 'tE7###J):6    Ls   !. AAdisplay_localec                   t          |           r| nt          } t          |          r|nt          }t          j                            |           }|                    |          }|r%|d                                         |dd         z   }|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)rX   DEFAULT_LOCALErR   rS   r   get_display_nameupper)rM   rY   locdisplay_names       r"   r]   r]      s      )11Egg~G'6~'F'FZ^^NN
,

W
%
%C''77L B#A,,..abb1AAr$   language_pack_locale_datadict[str, Any]package_locale_datac                   | }|                      di           }|                     dd          }|                     dd          }|                     di           }|                     dd          }|                     dd          }|rU|rS||k    rMt          |          }t          |          }||k    r)|                                 }|                    |           |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)	ra   rc   resultpackage_lp_metadatapackage_lp_versionpackage_lp_domainpackage_metadatapackage_versionpackage_domains	            r"   merge_locale_datars      s    $ 'F377B??,00DAA+//$??*..r266&**9d;;O%))(F;;N /o /.DU2U2U'88*+=>>///.3355FMM-...Mr$   tuple[dict, str]c                  
 t                      \  }}i }|                    d          }|s|                                D ]v\  }}i }	 t          j                            |t                    

fdt          j        
          D             }n6# t          $ r) |	                    t          j                               Y nw xY w|                                 |v rt          j                            
||                                          t          | d          }t          j                            |          rz	 t          |d          5 }	t!          j        |	          ||<   ddd           n# 1 swxY w Y   ?# t          $ r* |	                    t          j                               Y rw xY wx|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"}`
    r6   c                    i | ]T}t           j                            t           j                            |                    ?|                                |US r'   )r8   r9   isdirrB   lower)r   r_   locale_paths     r"   r#   z1get_installed_packages_locale.<locals>.<dictcomp>  sW       w}}RW\\+s%C%CDDIIKK  r$   .jsonutf-8encodingN)rL   splitr&   r8   r9   rB   
LOCALE_DIRlistdirr>   r?   r@   rA   rx   LC_MESSAGES_DIRisfileopenjsonr;   )rM   found_package_localesrG   packages_locale_datarE   package_namepackage_root_pathlocaleslocale_json_pathfhry   s             @r"   get_installed_packages_localer      s=   " &D%E%E"7}}T""H @/D/J/J/L/L 	@ 	@+L+G	8 gll+<jII   !z+66  
  8 8 8	 4 6 6777778 }}'))#%7<<GMMOO,##***	$ $  7>>"233 @@!"2WEEE OAE20>O O O O O O O O O O O O O O O$ @ @ @ 	(<(>(>?????@  8!4!444sI   
AB0CC>F E3'F 3E7	7F :E7	;F  0F43F4c                   t                      \  }}i }|                    d          }|sg }g }g }|D ]<}t          |          r|                    |           '|                    |           =| |v r| nt          } t          t          t          |           t          t          t                    di}|D ]&}t          ||           t          ||          d||<   '|r|                    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)`.
    r6   )displayName
nativeNamez#The following locales are invalid: !)rH   r~   rX   r?   r\   r]   rB   )rY   found_localesrG   r   rE   invalid_localesvalid_localesrM   s           r"   get_language_packsr     sQ   " BCCM7G}}T""H V$ 	0 	0Gw'' 0$$W----&&w////+9]+J+JP^/OO.~~NN 
 % 	 	G/HH.w@@   GG
  	VOOT/TTTUUUDIIh''''r$   tuplec                0   t                      \  }}t          |           \  }}i }|                    d          }|sCt          |           r3| |v r.||          }t	          j        |d          D ]\  }}}	|	D ]}
|
                    d          r|
                    dd          }t          j        	                    ||
          }	 t          |d          5 }t          j        |          }ddd           n# 1 swxY w Y   n6# t          $ r) |                    t          j                               Y nw xY w||v r||         }t#          ||          }|||<   |                                D ]\  }}||vr|||<   |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.
    r6   F)topdownrz   re   r{   r|   N)rH   r   r~   rX   r8   walkendswithreplacer9   rB   r   r   r;   r>   r?   r@   rA   rs   r&   )rM   r   rG   found_packages_localeslocale_datarE   r9   root__filesr=   pkg_name	json_pathr   merged_datapkg_datarD   s                    r"   get_language_packr   N  s     BCCM7&CG&L&L#GK}}T""H -w// -G}4L4LW%!wtU;;; 	8 	8OD"e 8 8==)) 8#||GR88H "T4 8 8I@!)g>>> 8"*.)B--K8 8 8 8 8 8 8 8 8 8 8 8 8 8 8$ @ @ @ 	(<(>(>?????@  #999#9(#C&7X&N&N,7K)8$ 5::<< 	- 	-NHd{**(,H%		(++++s6   DC9-D9C==D C=D0D87D8c                  b    e Zd ZdZddZddZdd
ZddZddZddZ	ddZ
ddZddZddZdS )TranslationBundlezI
    Translation bundle providing gettext translation functionality.
    rg   rN   rM   c                |    || _         || _        t          j                    | _        |                     |           dS )zInitialize the bundle.N)_domain_localegettextNullTranslations_translatorupdate_locale)selfrg   rM   s      r"   __init__zTranslationBundle.__init__  s;    "3557#####r$   r   rh   c                t   || _         d}|t          k    r{d| }	 t          j        |          }|j        J t
          j                            t
          j                            |j                  t                    }n# t          $ r Y nw xY wt          j        | j        || j         fd          | _        dS )z
        Update the locale.

        Parameters
        ----------
        locale_: str
            The language name to use.
        Njupyterlab_language_pack_T)	localedir	languagesfallback)r   r\   	importlibimport_moduler<   r8   r9   rB   r:   r   r>   r   translationr   r   )r   rM   r   language_pack_modulemods        r"   r   zTranslationBundle.update_locale  s     	n$$#Hw#H#H -.BCC|///GLL)F)F
SS		    #.LI$,SW
 
 
s   A$B   
BBmsgidc                6    | j                             |          S )z
        Translate a singular string.

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

        Returns
        -------
        str
            The translated string.
        )r   r   r   r   s     r"   r   zTranslationBundle.gettext  s     ''...r$   msgid_pluralnintc                :    | 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   s       r"   r   zTranslationBundle.ngettext  s    $ ((a@@@r$   msgctxtc                    t           r| j                            |          }n| 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   s       r"   r   zTranslationBundle.pgettext  sC    $  	D*22599KK*33GUCCKr$   c                    t           r| j                            |||          }n| 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   s         r"   r   zTranslationBundle.npgettext  sL    ,  	V*33E<KKKK*44We\STUUKr$   c                ,    |                      |          S )z
        Shorthand for gettext.

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

        Returns
        -------
        str
            The translated string.
        )r   r   s     r"   r   zTranslationBundle.__  s     ||E"""r$   c                0    |                      |||          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   s       r"   _nzTranslationBundle._n  s    $ }}UL!444r$   c                .    |                      ||          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   s      r"   _pzTranslationBundle._p&  s      }}We,,,r$   c                2    |                      ||||          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   s        r"   _npzTranslationBundle._np8  s    ( ~~gulA>>>r$   N)rg   rN   rM   rN   rM   rN   r   rh   )r   rN   r   rN   )r   rN   r   rN   r   r   r   rN   )r   rN   r   rN   r   rN   )
r   rN   r   rN   r   rN   r   r   r   rN   )__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   r   r'   r$   r"   r   r     s         $ $ $ $
 
 
 
4/ / / / A A A A(   2   <# # # # 5 5 5 5(- - - -$? ? ? ? ? ?r$   r   c                      e Zd ZU dZi Zded<   eZedd            Z	e
dd
            Ze
dd            Ze	 	 ddd            Zedd            ZdS )
translatorz
    Translations manager.
    zdict[str, TranslationBundle]_TRANSLATORSrg   rN   r   c                .    |                      dd          S )zNormalize a domain name.

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

        Returns
        -------
        str
            Normalized domain
        -_)r   )rg   s    r"   normalize_domainztranslator.normalize_domainW  s     ~~c3'''r$   rM   rh   c                    || j         k    rdS t          |          r;|| _         | j                                        D ]\  }}|                    |           dS dS )z
        Set locale for the translation bundles based on the settings.

        Parameters
        ----------
        locale_: str
            The language name to use.
        N)_LOCALErX   r   r&   r   )clsrM   r   bundles       r"   
set_localeztranslator.set_localeg  sz     ck!!F7## 	.!CK -3355 . .	6$$W----	. 	.. .r$   r   c                    t                               |          }|| j        v r| j        |         }n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   rg   norm_domaintranss       r"   r;   ztranslator.loadz  sW    " !11&99#***$[1EE%k3;??E,1C[)r$   re   Ntranslationsr   r   r)   prefixto_translatedict[Pattern, str] | Nonec           
        |t          |          }|                                D ]\  }}|dz   |z   }t          |t                    rQd}|                                D ]\  }}	|                    |          rd} n|r|                     |	|          ||<   tt          |t                    rt                              | |||           t          |t                    r_t          |          D ]O\  }
}t          |t                    st                              | ||dz   t          |
          z   dz   |           PdS )zTranslate a schema in-place.N/FT)r   r   [])r1   r&   
isinstancerN   	fullmatchr   r)   r   _translate_schema_stringslist	enumerate)r   r   r   r   keyvaluer9   matchedr    r!   ielements               r"   r   z$translator._translate_schema_strings  s    3F;;L ,,.. 	 	JCC<#%D%%% (4(:(:(<(<  $GW((.. "&  H"."7"7"G"GF3KE4(( 44 !-	 5     E4(( 	"+E"2"2  JAw%gt44 ! 88$#czCFF2S8%1	 9    -	 	r$   c                *   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
        rg   )	r   r   r\   r;   r/   r0   DEFAULT_DOMAINrj   r   )r   r   
new_schemas      r"   translate_schemaztranslator.translate_schema  sw     //M!JJ',,00>JJ
 
 [[]]
,,\:FFFr$   )rg   rN   r   rN   r   )rg   rN   r   r   )re   N)
r   r   r   r)   r   rN   r   r   r   rh   )r   r)   r   r)   )r   r   r   r   r   __annotations__
SYS_LOCALEr   staticmethodr   classmethodr   r;   r   r   r'   r$   r"   r   r   O  s           24L3333G( ( ( \( . . . [.$    [2  26	% % % % \%N    \  r$   r   )r   r   )r   r)   r   r   )r   r2   )rM   rN   r   rO   )rM   rN   rY   rN   r   rN   )ra   rb   rc   rb   r   rb   )rM   rN   r   rt   )rY   rN   r   rt   )rM   rN   r   r   )2r   
__future__r   r   r   r   r   r8   r   sysr@   	functoolsr   typingr   r   rR   packaging.versionr   ri   version_infoimportlib_metadatar
   importlib.metadatar7   rK   r\   	getlocaler   r   r   r   L10N_SCHEMA_NAMEr   r,   _default_settings_contextr0   r%   r(   r1   rH   rL   rX   r]   rs   r   r   r   r   r   r'   r$   r"   <module>r	     s    # " " " " "        				 				 



                    4 4 4 4 4 4 g///////////// !: -  V"4n

=  !$." & 5  5!:*C0I$*)B%+(1            ,   2$ $ $ $N :H     2$ $ $ $N05 05 05 05j .< .( .( .( .( .(b-, -, -, -,dL? L? L? L? L? L? L? L?^E E E E E E E E E Er$   