
    XhY              
         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j6                         d   xs e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       Z'd(dZ(d)dZ)d)dZ*d*dZ+efd+dZ,	 	 	 	 	 	 d,dZ-d-d Z.efd.d!Z/d/d"Z0 G d# d$      Z1 G d% d&      Z2y)0z^
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      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/.*/labelc                     t         j                         D  ci c]!  \  } }t        j                  d| z   dz         |# c}} S c c}} w )N^/$)DEFAULT_SCHEMA_SELECTORSitemsrecompile)patterncontexts     W/var/www/html/myenv/lib/python3.12/site-packages/jupyterlab_server/translation_utils.py_get_default_schema_selectorsr"   B   sH     !9 > > @GW 	

4'>C'('1  s   &Ac                    i t               | j                  t        i       j                  dg       D ci c]"  }t        j                  d|z   dz         t
        $ c}S c c}w )N	selectorsr   r   )r"   get_lab_i18n_configr   r   _default_schema_context)r   selectors     r!   _prepare_schema_patternsr)   J   sj    
'
) #JJ'7<@@bQ
 JJth,-/FF
 
s   'Ac                 L   i } g }t        t              D ]G  }	 t        j                  j	                  |j                         j                        | |j                  <   I dj                  |      }| |fS # t        $ r& |j                  t        j                                Y w xY w)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_localesr?   V   s     DH#*GH 4	4%'WW__[5E5E5G5P5P%QD!!"4 ii!G=	  	4OOI0023	4   AA44,B#"B#c                 L   i } g }t        t              D ]G  }	 t        j                  j	                  |j                         j                        | |j                  <   I dj                  |      }| |fS # t        $ r& |j                  t        j                                Y w xY w)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:   s       r!   _get_installed_package_localesrC   l   s     DH#*AB 4	4%'WW__[5E5E5G5P5P%QD!!"4 ii!G=	  	4OOI0023	4r@   c                    | dv ryd}	 t         j                  j                  |        d}|S # t         j                  j                  t
        f$ r Y |S w xY 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)locale_valids     r!   is_valid_localerM      sf    2    E7#
 L	 JJ)):6 L	s   !, #AAc                    t        |       r| nt        } t        |      r|nt        }	 t        j                  j	                  |       }|j                  |      }|r|d   j                         |dd z   }|S # t        j                  $ r |}Y 4w xY w)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)rM   DEFAULT_LOCALErF   rG   r   get_display_namerI   upper)rK   display_localelocdisplay_names       r!   rQ   rQ      s      )1g~G'6~'F^NN&ll  )++N; #A,,.ab1AA	 ## &%&s   0A5 5BBc                l   | }| j                  di       }|j                  dd      }|j                  dd      }|j                  di       }|j                  dd      }|j                  dd      }|rC|rA||k(  r<t        |      }t        |      }||kD  r!| j                         }|j                  |       |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_domains	            r!   merge_locale_datarg      s    $ 'F377B?,00DA+//$?*..r26&**9d;O%))(F;No.DU2U'8*+=>//.335FMM-.M    c           
        t               \  }}i }|j                  d      }|sL|j                         D ]8  \  }}i }	 t        j                  j                  |t              }t        j                  |      D 	ci c]P  }	t        j                  j                  t        j                  j                  ||	            r|	j                         |	R }}	| j                         |v st        j                  j                  || j                            t        | d      }
t        j                  j                  |
      s
	 t!        |
d      5 }t#        j$                  |      ||<   ddd       ; |dj                  |      fS c c}	w # t        $ r& |j                  t        j                                Y w xY w# 1 sw Y   VxY w# t        $ r' |j                  t        j                                Y w xY w)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-   .jsonutf-8encodingN)rC   splitr   r/   r0   r9   
LOCALE_DIRlistdirisdirlowerr5   r6   r7   r8   LC_MESSAGES_DIRisfileopenjsonr2   )rK   found_package_localesr>   packages_locale_datar<   package_namepackage_root_pathlocaleslocale_pathrT   locale_json_pathfhs               r!   get_installed_packages_localer      s   " &D%E"7}}T"H/D/J/J/L 	@+L+G	8 ggll+<jI  "zz+6ww}}RWW\\+s%CD IIK$  }}')#%77<<GMMO,##nE*	$  77>>"23@!"2WE OAE20>O-	@6  8!444-
  8	 4 4 678O O$ @ 	(<(<(>?@sN   ;F9AFF?GF:%GF,F76F7:G	?G,G65G6c                F   t               \  }}i }|j                  d      }|sg }g }g }|D ]0  }t        |      r|j                  |        |j                  |       2 | |v r| nt        }t        | t
        k7  rt        t        |      ndt        t        t              di}|D ]  }t        ||      t        ||      d||<     |rKt
        |v r,|j                  t
               d| t
        k7  rdndd|t
        <   |r|j                  d| d       |dj                  |      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-   Default)displayName
nativeNamezPseudo-languagezto translate the UIz#The following locales are invalid: !)	r?   rn   rM   r6   rP   PSEUDO_LANGUAGErQ   remover9   )	rS   found_localesr>   r{   r<   invalid_localesvalid_localesrK   display_locale_s	            r!   get_language_packsr   &  sK   " BCM7G}}T"H$ 	0Gw'$$W-&&w/		0 -;m,K.Q_ &8 %^_E".~~N	
 % 	G/I.w@ GG	 /1&&7#4 *_< ..,( "EoEVVW XYDIIh'''rh   c                   t               \  }}t        |       \  }}i }|j                  d      }|s| t        k(  st	        |       r| |v r||    }t        j                  |d      D ]  \  }}}	|	D ]  }
|
j                  d      s|
j                  dd      }t
        j                  j                  ||
      }	 t        |d      5 }t        j                  |      }ddd       ||v r||   }t%        |      }||<     |j'                         D ]  \  }}||vs|||<    |dj                  |      fS # 1 sw Y   \xY w# t        $ r& |j                  t!        j"                                Y w xY w)	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)topdownrj   rW   rk   rl   N)r?   r   rn   r   rM   r/   walkendswithreplacer0   r9   ru   rv   r2   r5   r6   r7   r8   rg   r   )rK   r   r>   found_packages_localeslocale_datar<   r0   root__filesr4   pkg_name	json_pathr~   merged_datapkg_datar;   s                    r!   get_language_packr   h  s     BCM7&CG&L#GK}}T"H'?7+C}$W%!wwtU; 	8OD"e 8==)#||GR8H "T4 8I@!)g> 8"*.))B-K8  #99#9(#C&7X&N,7K)8	8& 5::< 	-NHd{*(,H%	- 		(+++#8 8$ @ 	(<(<(>?@s*   6E D4E 4D=9E  ,E/.E/c                  `    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y)TranslationBundlezI
    Translation bundle providing gettext translation functionality.
    c                t    || _         || _        t        j                         | _        | j                  |       y)zInitialize the bundle.N)_domain_localegettextNullTranslations_translatorupdate_locale)selfrY   rK   s      r!   __init__zTranslationBundle.__init__  s/    "3357#rh   c                   || _         d}|t        k7  rtd| }	 t        j                  |      }|j                  J t
        j                  j                  t
        j                  j                  |j                        t              }t        j                  | j                  || j                   fd      | _        y# t        $ r Y ?w xY w)z
        Update the locale.

        Parameters
        ----------
        locale_: str
            The language name to use.
        Njupyterlab_language_pack_T)	localedir	languagesfallback)r   rP   	importlibimport_moduler3   r/   r0   r9   r1   ro   r5   r   translationr   r   )r   rK   r   language_pack_modulemods        r!   r   zTranslationBundle.update_locale  s     	n$%>wi#H --.BC||///GGLL)F
S	
 #..LLI$,,SW
	  s   A.B; ;	CCc                8    | j                   j                  |      S )z
        Translate a singular string.

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

        Returns
        -------
        str
            The translated string.
        )r   r   r   msgids     r!   r   zTranslationBundle.gettext  s     ''..rh   c                <    | j                   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   msgid_pluralns       r!   r   zTranslationBundle.ngettext  s    $ ((a@@rh   c                    t         r| j                  j                  |      }|S | j                  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   msgctxtr   r   s       r!   r   zTranslationBundle.pgettext  sE    $ **2259K  **33GUCKrh   c                    t         r| j                  j                  |||      }|S | j                  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  sN    , **33E<KK  **44We\STUKrh   c                $    | j                  |      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""rh   c                (    | j                  |||      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._n0  s    $ }}UL!44rh   c                &    | j                  ||      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._pD  s      }}We,,rh   c                *    | j                  ||||      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._npV  s    ( ~~gulA>>rh   N)rY   strrK   r   rK   r   returnrZ   )r   r   r   r   )r   r   r   r   r   intr   r   )r   r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   )__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   r    rh   r!   r   r     s:    $
4/ A(2<# 5(-$?rh   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y)
translatorz
    Translations manager.
    zdict[str, TranslationBundle]_TRANSLATORSc                &    | j                  dd      S )zNormalize a domain name.

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

        Returns
        -------
        str
            Normalized domain
        -_)r   )rY   s    r!   normalize_domainztranslator.normalize_domainu  s     ~~c3''rh   c                    || j                   k(  ryt        |      r;|| _         | j                  j                         D ]  \  }}|j	                  |        yy)z
        Set locale for the translation bundles based on the settings.

        Parameters
        ----------
        locale_: str
            The language name to use.
        N)_LOCALErM   r   r   r   )clsrK   r   bundles       r!   
set_localeztranslator.set_locale  sW     ckk!7#!CK --335 .	6$$W-. $rh   c                    t         j                  |      }|| 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   rY   norm_domaintranss       r!   r2   ztranslator.load  s`    " !11&9#***$$[1E
  &k3;;?E,1C[)rh   Nc           
     "   |t        |      }|j                         D ]  \  }}|dz   |z   }t        |t              rHd}|j                         D ]  \  }}	|j	                  |      sd} n |sP| j                  	|      ||<   ft        |t              rt        j                  | |||       t        |t              st        |      D ]A  \  }
}t        |t              st        j                  | ||dz   t        |
      z   dz   |       C  y)zTranslate a schema in-place.N/FT)prefixto_translate[])r)   r   
isinstancer   	fullmatchr   dictr   _translate_schema_stringslist	enumerate)translationsr   r   r   keyvaluer0   matchedr   r    ielements               r!   r   z$translator._translate_schema_strings  s#    3F;L ,,. 	JCC<#%D%%(4(:(:(< $GW((."& "."7"7"GF3KE4(44 !-	 5  E4("+E"2 JAw%gt4 88$#czCF2S8%1	 9 '	rh   c                    t         j                  t        k(  r| S t         j                  | j	                  t
        i       j	                  dt                    }| j                         }t         j                  ||       |S )zTranslate a schema.

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

        Returns
        -------
        Dict
            The translated schema
        rY   )	r   r   rP   r2   r%   r&   DEFAULT_DOMAINr\   r   )r   r   
new_schemas      r!   translate_schemaztranslator.translate_schema  sd     /M!JJ',00>J
 [[]
,,\:Frh   )rY   r   r   r   r   )rY   r   r   r   )rW   N)
r   r   r   r   r   r   r   zdict[Pattern, str] | Noner   rZ   )r   r   r   r   )r   r   r   r   r   __annotations__
SYS_LOCALEr   staticmethodr   classmethodr   r2   r   r   r   rh   r!   r   r   m  s     24L.3G( ( . .$  2  26	%%% % 0	%
 
% %N  rh   r   )r   dict[Pattern, str])r   r   r   r   )r   ztuple[dict[str, Any], str])rK   r   r   bool)rK   r   rS   r   r   r   )r^   dict[str, Any]r_   r   r   r   )rK   r   r   tuple[dict, str])rS   r   r   r   )rK   r   r   tuple)3r   
__future__r   r   r   rv   r   r/   r   sysr7   	functoolsr   typingr   r   rF   packaging.versionr   r[   version_infoimportlib_metadatar
   importlib.metadatar.   rB   rP   	getlocaler   ro   rs   r   L10N_SCHEMA_NAMEr   r   r'   _default_settings_contextr&   r   r"   r)   r?   rC   rM   rQ   rg   r   r   r   r   r   r   rh   r!   <module>r     sd  
 #     	 	 
     4 g// !: -  V"4n

=   !$. " & 5  5!:*C0I$*)B%+(1   ,2&R :H 8$-$DR$$N05j .< ?(D1,lL? L?^E Erh   