
    Pi                        U d Z ddlmZ ddlZddlZddlmZ ddlmZm	Z	 erddl
mZmZ dZded	<   d
Zded<   ddZdddZdS )z
babel.messages.mofile
~~~~~~~~~~~~~~~~~~~~~

Writing of files in the ``gettext`` MO (machine object) format.

:copyright: (c) 2013-2026 by the Babel Team.
:license: BSD, see LICENSE for more details.
    )annotationsN)TYPE_CHECKING)CatalogMessage)SupportsReadSupportsWritel   * intLE_MAGICl   $< BE_MAGICfileobjSupportsRead[bytes]returnr   c                   t                      i }t          | dd          }|                                 }t          |          }t          j        } |d|dd                   d         }|t          k    r |d|dd                   \  }}}	}
d	}n8|t          k    r |d
|dd                   \  }}}	}
d}nt          dd|          t          |          D ]} ||||	|	dz                      \  }}||z   } ||||
|
dz                      \  }}||z   }||k     r||k     r|||         }|||         }nt          dd|          |dk    rdx}}|
                                D ]}|                                }|sd|v rY|                    dd          \  }}|                                                                x}}|                                ||<   v|r||xx         d|z   z  cc<   d|v r|                    d          \  }}nd}d|v rG|                    d          }|                    d          }fd|D             }fd|D             }n4|                    j                  }|                    j                  }t!          |||          |<   |	dz  }	|
dz  }
|                                _        S )aa  Read a binary MO file from the given file-like object and return a
    corresponding `Catalog` object.

    :param fileobj: the file-like object to read the MO file from

    :note: The implementation of this function is heavily based on the
           ``GNUTranslations._parse`` method of the ``gettext`` module in the
           standard library.
    name z<IN   r   z<4I   z<IIz>4Iz>IIzBad magic number   zFile is corrupt   :      
       c                D    g | ]}|                     j                  S  decodecharset.0xcatalogs     i/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/babel/messages/mofile.py
<listcomp>zread_mo.<locals>.<listcomp>]   s'    :::188GO,,:::    c                D    g | ]}|                     j                  S r   r   r   s     r#   r$   zread_mo.<locals>.<listcomp>^   s'    <<<!AHHW_--<<<r%   )context)r   getattrreadlenstructunpackr
   r   OSErrorrange
splitlinesstripsplitlowerr   r   r   itemsmime_headers)r   headersfilenamebufbuflenr,   magicversionmsgcountorigidxtransidxii_imlenmoffmendtlentofftendmsgtmsglastkeykeyitemvaluectxtr"   s                             @r#   read_morM      s:    iiGGw++H
,,..CXXF]F F4RaR!!!$E/5veS2Y/G/G,7H	(		/5veS2Y/G/G,7Ha+X666 Hoo + +VBGgk$9 :;;
dd{VBHx!|$; <==
dd{&==TF]]d4i.CtDy>DD!.999 199  Gc)) 	5 	5zz|| 4<<!%D!!4!4JC$'IIKK$5$5$7$77Gc#(;;==GCLL 5G$$$4$$$c>>		'**ID##Dc>>))G$$C::g&&D::::c:::C<<<<t<<<DD**W_--C;;w//DsD$777 	1A"==??GNr%   FSupportsWrite[bytes]r"   	use_fuzzyboolNonec                   t                    }fd|dd         D             |dd<   |                                 dx}}g }|D ]}|j        rd                    fd|j        D                       }g }	t          |j                  D ]X\  }
}|s<|	                    |j        t          t          |
          d                              C|	                    |           Yd                    fd|	D                       }n>|j        
                    j                  }|j        
                    j                  }|j        r4d                    |j        
                    j                  |g          }|                    t          |          t          |          t          |          t          |          f           ||dz   z  }||dz   z  }d	d
t          |          z  z   }|t          |          z   }g }g }|D ]\  }}}}||||z   gz  }||||z   gz  }||z   }t          j        dt           dt          |          d	d	t          |          dz  z   dd          }|                     |t$          j                            t%          j        d|                    z   |z   |z              dS )a  Write a catalog to the specified file-like object using the GNU MO file
    format.

    >>> import sys
    >>> from babel.messages import Catalog
    >>> from gettext import GNUTranslations
    >>> from io import BytesIO

    >>> catalog = Catalog(locale='en_US')
    >>> catalog.add('foo', 'Voh')
    <Message ...>
    >>> catalog.add(('bar', 'baz'), ('Bahr', 'Batz'))
    <Message ...>
    >>> catalog.add('fuz', 'Futz', flags=['fuzzy'])
    <Message ...>
    >>> catalog.add('Fizz', '')
    <Message ...>
    >>> catalog.add(('Fuzz', 'Fuzzes'), ('', ''))
    <Message ...>
    >>> buf = BytesIO()

    >>> write_mo(buf, catalog)
    >>> x = buf.seek(0)
    >>> translations = GNUTranslations(fp=buf)
    >>> if sys.version_info[0] >= 3:
    ...     translations.ugettext = translations.gettext
    ...     translations.ungettext = translations.ngettext
    >>> translations.ugettext('foo')
    'Voh'
    >>> translations.ungettext('bar', 'baz', 1)
    'Bahr'
    >>> translations.ungettext('bar', 'baz', 2)
    'Batz'
    >>> translations.ugettext('fuz')
    'fuz'
    >>> translations.ugettext('Fizz')
    'Fizz'
    >>> translations.ugettext('Fuzz')
    'Fuzz'
    >>> translations.ugettext('Fuzzes')
    'Fuzzes'

    :param fileobj: the file-like object to write to
    :param catalog: the `Catalog` instance
    :param use_fuzzy: whether translations marked as "fuzzy" should be included
                      in the output
    c                4    g | ]}|j         	s|j        |S r   )stringfuzzy)r    mrO   s     r#   r$   zwrite_mo.<locals>.<listcomp>   s,    WWW!qxWYWagWAWWWr%   r   Nr%   r   c              3  L   K   | ]}|                     j                  V  d S Nencoder   )r    msgidr"   s     r#   	<genexpr>zwrite_mo.<locals>.<genexpr>   s1       W W5go!>!> W W W W W Wr%   c              3  L   K   | ]}|                     j                  V  d S rX   rY   )r    msgstrr"   s     r#   r\   zwrite_mo.<locals>.<genexpr>   s1      !W!WV&--"@"@!W!W!W!W!W!Wr%   r         Iiiiiiir   r   i)listsortpluralizablejoinid	enumeraterT   appendminr	   rZ   r   r'   r*   r+   packr
   writearraytobytes)r   r"   rO   messagesidsstrsoffsetsmessager[   msgstrsidxrT   r^   keystart
valuestartkoffsetsvoffsetso1l1o2l2headers    ``                   r#   write_mor   l   s   ` G}}HWWWWx|WWWHQRRLMMOOOC$G ! !  	<LL W W W WGJ W W WWWEG(88 + +V +NN7:c#c((A.>.>#?@@@@NN6****\\!W!W!W!Ww!W!W!WWWFFJ%%go66E^**7?;;F? 	SLL'/"8"8"I"I5!QRREC#e**c$iiVEFFFuw   rCMM))HCHH$J HH! * *BBRh''Rj))!G[	HH!!			 	F MM&5;..u{3/H/HIIICORVVWWWWWr%   )r   r   r   r   )F)r   rN   r"   r   rO   rP   r   rQ   )__doc__
__future__r   rm   r+   typingr   babel.messages.catalogr   r   	_typeshedr   r   r
   __annotations__r   rM   r   r   r%   r#   <module>r      s      # " " " " "               3 3 3 3 3 3 3 3 655555555        O O O OdeX eX eX eX eX eX eXr%   