ó ÓðQc@sŸdZddlmZmZddlmZmZedddgƒeddgƒed d d d gƒgZd „Z d„Z d„Z d„Z e ƒZ dS(sñ babel.messages.checkers ~~~~~~~~~~~~~~~~~~~~~~~ Various routines that help with validation of translations. :since: version 0.9 :copyright: (c) 2013 by the Babel Team. :license: BSD, see LICENSE for more details. iÿÿÿÿ(tTranslationErrort PYTHON_FORMAT(t string_typestiziptitdtutxtXtftFtgtGcCs—|js.t|jtƒs*tdƒ‚ndS|dkr>dS|j}t|ttfƒsh|f}nt|ƒ|j kr“td|j ƒ‚ndS(s0Verify the number of plurals in the translation.s/Found plural forms for non-pluralizable messageNs*Wrong number of plural forms (expected %d)( t pluralizablet isinstancetstringRRtNonetlistttupletlent num_plurals(tcatalogtmessagetmsgstrs((sA/usr/local/lib/python2.7/site-packages/babel/messages/checkers.pyRs    cCs¡d|jkrdS|j}t|ttfƒs=|f}n|j}t|ttfƒsg|f}nx3t||ƒD]"\}}|rwt||ƒqwqwWdS(s9Verify the format string placeholders in the translation.s python-formatN(tflagstidRRRRRt_validate_format(RRtmsgidsRtmsgidtmsgstr((sA/usr/local/lib/python2.7/site-packages/babel/messages/checkers.pyt python_format.s    cCsŸd„}d„}d„}t|||fƒ\}}t|||fƒ\}}|rt| rt| rttdƒ‚n||krtdƒ‚n|r&t|ƒt|ƒkr¼tdƒ‚nxÜtt||ƒƒD]M\} \\} } \} } || | ƒsÒtd| d| | fƒ‚qÒqÒWnut|ƒ} xf|D]^\}}|| krdtd |ƒ‚q9||| |ƒs9td ||| |fƒ‚q9q9Wd S( s‹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 cSspg}xctj|ƒD]R}|jƒ\}}}|dkrO|dkrOqn|j|t|ƒfƒqW|S(Nt%(RtfinditertgroupsRtappendtstr(Rtresulttmatchtnametformatttypechar((sA/usr/local/lib/python2.7/site-packages/babel/messages/checkers.pyt_parse^scSsA||krtSx*tD]"}||kr||krtSqWtS(N(tTruet_string_format_compatibilitiestFalse(tatbtset((sA/usr/local/lib/python2.7/site-packages/babel/messages/checkers.pyt _compatiblegs   cSscd}xP|D]H\}}|dkr4|dk}q |dk|kr tdƒ‚q q Wt|ƒS(Ns5format string mixes positional and named placeholders(RRtbool(tresultst positionalR&tchar((sA/usr/local/lib/python2.7/site-packages/babel/messages/checkers.pyt_check_positionalos splaceholders are incompatibles)the format strings are of different kindss-positional format placeholders are unbalancedsDincompatible format for placeholder %d: %r and %r are not compatibleisunknown named placeholder %rsDincompatible format for placeholder %r: %r and %r are not compatibleN(tmapRRt enumerateRtdict(R't alternativeR)R0R5R-R.t a_positionalt b_positionaltidxt_tfirsttsecondttype_mapR&R(((sA/usr/local/lib/python2.7/site-packages/babel/messages/checkers.pyR>s.   4!  cCs{g}yddlm}Wntk r-n.Xx*|jdƒD]}|j|jƒƒq>Wt|ƒdkrwttgS|S(Niÿÿÿÿ(t working_setsbabel.checkersi( t pkg_resourcesRAt ImportErrortiter_entry_pointsR"tloadRRR(tcheckersRAt entry_point((sA/usr/local/lib/python2.7/site-packages/babel/messages/checkers.pyt_find_checkerss  N(t__doc__tbabel.messages.catalogRRt babel._compatRRR/R+RRRRHRF(((sA/usr/local/lib/python2.7/site-packages/babel/messages/checkers.pyt s   _