�
ƪbu � �\ � d Z ddlmZmZ h d�ddhh d�gZd� Zd� Zd � Zd
� Z e� � Z dS )z�
babel.messages.checkers
~~~~~~~~~~~~~~~~~~~~~~~
Various routines that help with validation of translations.
:since: version 0.9
:copyright: (c) 2013-2022 by the Babel Team.
:license: BSD, see LICENSE for more details.
� )�TranslationError�
PYTHON_FORMAT> �d�i�u�x�X> �F�G�f�gc � � |j s+t |j t � � st d� � �dS | �dS |j }t |t
t f� � s|f}t |� � | j k rt d| j z � � �dS )z0Verify the number of plurals in the translation.z/Found plural forms for non-pluralizable messageNz*Wrong number of plural forms (expected %d)) �pluralizable�
isinstance�string�strr �list�tuple�len�num_plurals)�catalog�message�msgstrss �9/usr/lib/python3/dist-packages/babel/messages/checkers.pyr r s� � ��� ��'�.�#�.�.� .�"� $-� .� .�
.���
�����n�G��g��e�}�-�-� ��*��
�7�|�|�w�*�*�*��K�&�2� 3� 4� 4� 4� +�*� c � � d|j vrdS |j }t |t t f� � s|f}|j }t |t t f� � s|f}t
||� � D ]\ }}|rt ||� � �dS )z9Verify the format string placeholders in the translation.z
python-formatN)�flags�idr r r r �zip�_validate_format)r r �msgidsr �msgid�msgstrs r �
python_formatr$ , s� � ��g�m�+�+���
�Z�F��f�t�U�m�,�,� �����n�G��g��e�}�-�-� ��*���V�W�-�-� ,� ,�
��v�� ,��U�F�+�+�+��,� ,r c
� � d� }d� }d� }t || |f� � \ }}t |||f� � \ }}|r|s|st d� � �||k rt d� � �|r�t |� � t |� � k rt d� � �t t ||� � � � D ]2\ } \ \ }
}\ }
} |||� � st d| dz ||fz � � ��3dS t |� � }
|D ]L\ }}||
vrt d |z � � � |||
| � � st d
|�d|�d|
| �d
�� � ��MdS )a� Test format string `alternative` against `format`. `format` can be the
msgid of a message and `alternative` one of the `msgstr`\s. The two
arguments are not interchangeable as `alternative` may contain less
placeholders if `format` uses named placeholders.
The behavior of this function is undefined if the string does not use
string formattings.
If the string formatting of `alternative` is compatible to `format` the
function returns `None`, otherwise a `TranslationError` is raised.
Examples for compatible format strings:
>>> _validate_format('Hello %s!', 'Hallo %s!')
>>> _validate_format('Hello %i!', 'Hallo %d!')
Example for an incompatible format strings:
>>> _validate_format('Hello %(name)s!', 'Hallo %s!')
Traceback (most recent call last):
...
TranslationError: the format strings are of different kinds
This function is used by the `python_format` checker.
:param format: The original format string
:param alternative: The alternative format string that should be checked
against format
:raises TranslationError: on formatting errors
c �� � g }t j | � � D ]G}|� � � \ }}}|dk r|��#|� |t |� � f� � �H|S )N�%)r �finditer�groups�appendr )r �result�match�name�format�typechars r �_parsez _validate_format.<locals>._parse\ sj � ���"�+�F�3�3� 1� 1�E�%*�\�\�^�^�"�D�&�(��3���4�<���M�M�4��X���/�0�0�0�0��
r c �@ � | |k rdS t D ]
}| |v r||v r dS �dS )NTF)�_string_format_compatibilities)�a�b�sets r �_compatiblez%_validate_format.<locals>._compatiblee s= � ���6�6��4�1� � �C��C�x�x�A��H�H��t�t���ur c �p � d }| D ]#\ }}|�|d u }�|d u |k rt d� � ��$t |� � S )Nz5format string mixes positional and named placeholders)r �bool)�results�
positionalr- �chars r �_check_positionalz+_validate_format.<locals>._check_positionalm sl � ��
�!� E� E�J�D�$��!�!�T�\�
�
��D�L�Z�/�/�*� ,D� E� E� E� 0� �J���r zplaceholders are incompatiblez)the format strings are of different kindsz-positional format placeholders are unbalancedzDincompatible format for placeholder %d: %r and %r are not compatible� zunknown named placeholder %rz$incompatible format for placeholder z: z and z are not compatibleN)�mapr r � enumerater �dict)r. �alternativer0 r6 r< |