/usr/lib/python2.6/site-packages/babel
NameSizeModeActions
locale-data/-0755rm
localedata/-0755rm
localtime/-0755rm
messages/-0755rm
core.py311190644editdlrm
core.pyc325670644editdlrm
dates.py431110644editdlrm
dates.pyc424820644editdlrm
global.dat1096970644editdlrm
languages.py27480644editdlrm
languages.pyc32960644editdlrm
lists.py12710644editdlrm
lists.pyc14660644editdlrm
localedata.py62470644editdlrm
localedata.pyc75630644editdlrm
numbers.py232250644editdlrm
numbers.pyc223750644editdlrm
plural.py160210644editdlrm
plural.pyc201890644editdlrm
support.py218120644editdlrm
support.pyc255100644editdlrm
units.py110880644editdlrm
units.pyc92160644editdlrm
util.py81670644editdlrm
util.pyc108020644editdlrm
_compat.py11050644editdlrm
_compat.pyc24620644editdlrm
__init__.py7100644editdlrm
__init__.pyc9350644editdlrm
Edit: /usr/lib/python2.6/site-packages/babel/core.pyc (32567B)
zDVc @sdZddkZddklZddklZlZddklZdddd d gZ e a ehZ d Z d Zh'd d6dd6dd6dd6dd6dd6dd6dd6dd6dd 6d!d"6d#d$6d%d&6d'd(6d)d*6d+d,6d-d.6d/d06d1d26d3d46d5d66d7d86d9d:6d;d<6d=d>6d?d@6dAdB6dCdD6dEdF6dGdH6dIdJ6dKdL6dMdN6dOdP6dQdR6dSdT6dUdV6dWdX6dYdZ6Zdefd[YZdefd\YZe ed]Zd^ed_Zd^d`Zd^daZdS(bs babel.core ~~~~~~~~~~ Core locale representation and locale data access. :copyright: (c) 2013 by the Babel Team. :license: BSD, see LICENSE for more details. iN(t localedata(tpicklet string_types(t PluralRuletUnknownLocaleErrortLocaletdefault_localetnegotiate_localet parse_localecCstddS(NsThe babel data files are not available. This usually happens because you are using a source checkout from Babel and you did not build the data files. Just make sure to run "python setup.py import_cldr" before installing the library.(t RuntimeError(((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyt_raise_no_data_errorscCstdjotiitiit}tii|d}tii|p tnt |d}zt i |aWd|i Xnti |hS(suReturn the dictionary for the given key in the global data. The global data is stored in the ``babel/global.dat`` file and contains information independent of individual locales. >>> get_global('zone_aliases')['UTC'] u'Etc/GMT' >>> get_global('zone_territories')['Europe/Berlin'] u'DE' .. versionadded:: 0.9 :param key: the data key s global.dattrbN(t _global_datatNonetostpathtjointdirnamet__file__tisfileR topenRtloadtclosetget(tkeyRtfilenametfileobj((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyt get_global#s  tar_SYtartbg_BGtbgtbs_BAtbstca_EStcatcs_CZtcstda_DKtdatde_DEtdetel_GRtelten_UStentes_EStestet_EEtettfa_IRtfatfi_FItfitfr_FRtfrtgl_EStglthe_ILthethu_HUthutid_IDtidtis_IStistit_ITtittja_JPtjatkm_KHtkmtko_KRtkotlt_LTtlttlv_LVtlvtmk_MKtmktnl_NLtnltnn_NOtnntnb_NOtnotpl_PLtpltpt_PTtpttro_ROtrotru_RUtrutsk_SKtsktsl_SItsltsv_SEtsvtth_THtthttr_TRttrtuk_UAtukcBseZdZdZRS(s[Exception thrown when a locale is requested for which no locale data is available. cCs!ti|d|||_dS(sjCreate the exception. :param identifier: the identifier string of the unsupported locale sunknown locale %rN(t Exceptiont__init__t identifier(tselfRl((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRkQs(t__name__t __module__t__doc__Rk(((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRLscBseZdZd0d0d0dZed0edZededZede dZ dZ dZ dZ d Zed Zd0d Zeed d Zd0dZeed dZd0dZeed dZd0dZeed dZedZedZedZedZedZedZedZedZ edZ!edZ"edZ#edZ$ed Z%ed!Z&ed"Z'ed#Z(ed$Z)ed%Z*ed&Z+ed'Z,ed(Z-ed)Z.ed*Z/ed+Z0ed,Z1ed-Z2ed.Z3ed/Z4RS(1sYRepresentation of a specific locale. >>> locale = Locale('en', 'US') >>> repr(locale) "Locale('en', territory='US')" >>> locale.display_name u'English (United States)' A `Locale` object can also be instantiated from a raw locale string: >>> locale = Locale.parse('en-US', sep='-') >>> repr(locale) "Locale('en', territory='US')" `Locale` objects provide access to a collection of locale data, such as territory and language names, number and date format patterns, and more: >>> locale.number_symbols['decimal'] u'.' If a locale is requested for which no locale data is available, an `UnknownLocaleError` is raised: >>> Locale.parse('en_DE') Traceback (most recent call last): ... UnknownLocaleError: unknown locale 'en_DE' For more information see :rfc:`3066`. cCs]||_||_||_||_d|_t|}ti|pt |ndS(sInitialize the locale object from the given identifier components. >>> locale = Locale('en', 'US') >>> locale.language 'en' >>> locale.territory 'US' :param language: the language code :param territory: the territory (country or region) code :param script: the script code :param variant: the variant code :raise `UnknownLocaleError`: if no locale data is available for the requested locale N( tlanguaget territorytscripttvariantR t _Locale__datatstrRtexistsR(RmRqRrRsRtRl((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRk|s      cCst|d|}|i|S(sfReturn the system default locale for the specified category. >>> for name in ['LANGUAGE', 'LC_ALL', 'LC_CTYPE', 'LC_MESSAGES']: ... os.environ[name] = '' >>> os.environ['LANG'] = 'fr_FR.UTF-8' >>> Locale.default('LC_MESSAGES') Locale('fr', territory='FR') The following fallbacks to the variable are always considered: - ``LANGUAGE`` - ``LC_ALL`` - ``LC_CTYPE`` - ``LANG`` :param category: one of the ``LC_XXX`` environment variable names :param aliases: a dictionary of aliases for locale identifiers taliases(Rtparse(tclstcategoryRxt locale_string((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pytdefaultst_cCs:t||d|d|}|oti|d|SdS(s\Find the best match between available and requested locale strings. >>> Locale.negotiate(['de_DE', 'en_US'], ['de_DE', 'de_AT']) Locale('de', territory='DE') >>> Locale.negotiate(['de_DE', 'en_US'], ['en', 'de']) Locale('de') >>> Locale.negotiate(['de_DE', 'de'], ['en_US']) You can specify the character used in the locale identifiers to separate the differnet components. This separator is applied to both lists. Also, case is ignored in the comparison: >>> Locale.negotiate(['de-DE', 'de'], ['en-us', 'de-de'], sep='-') Locale('de', territory='DE') :param preferred: the list of locale identifers preferred by the user :param available: the list of locale identifiers available :param aliases: a dictionary of aliases for locale identifiers tsepRxN(RRRy(Rzt preferredt availableRRxRl((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyt negotiates csF|d jod St|to|St|tptd|fnt|d|}t|}fdfd}|}|d j o|S|pt|n|\}} } } tdi ||}tdi | | fd} tdi | | } td i | | } | d jo d } n| d jo d } n|| | | f}t|} td i | } | d j o(|t| }|d j o|Sntd i |} | d j oFt| \}}}}||| ||f}|d j o|Snt|d S(s6Create a `Locale` instance for the given locale identifier. >>> l = Locale.parse('de-DE', sep='-') >>> l.display_name u'Deutsch (Deutschland)' If the `identifier` parameter is not a string, but actually a `Locale` object, that object is returned: >>> Locale.parse(l) Locale('de', territory='DE') This also can perform resolving of likely subtags which it does by default. This is for instance useful to figure out the most likely locale for a territory you can use ``'und'`` as the language tag: >>> Locale.parse('und_AT') Locale('de', territory='AT') :param identifier: the locale identifier string :param sep: optional component separator :param resolve_likely_subtags: if this is specified then a locale will have its likely subtag resolved if the locale otherwise does not exist. For instance ``zh_TW`` by itself is not a locale that exists but Babel can automatically expand it to the full form of ``zh_hant_TW``. Note that this expansion is only taking place if no locale exists otherwise. For instance there is a locale ``en`` that can exist by itself. :raise `ValueError`: if the string does not appear to be a valid locale identifier :raise `UnknownLocaleError`: if no locale data is available for the requested locale s"Unxpected value for identifier: %rRcs)y|SWntj odSXdS(N(RR (tparts(Rz(s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyt _try_loadscsD|}|dj o|S|d }|dj o|SdS(Ni(R (Rtlocale(R(s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyt_try_load_reducings    tlanguage_aliasestterritory_aliasesitscript_aliasestvariant_aliasestZZtZzzztlikely_subtagsN( R t isinstanceRRt TypeErrorRtget_locale_identifierRRR(RzRlRtresolve_likely_subtagsRtinput_idRRRqRrRsRttnew_idt likely_subtagt language2R~tscript2tvariant2((RRzs)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRysL(                cCsox#dD]}t||ptSqW|i|ijo6|i|ijo#|i|ijo|i|ijS(NRqRrRsRt(slanguages territorysscriptsvariant(thasattrtFalseRqRrRsRt(RmtotherR((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyt__eq__=s cCs|i| S(N(R(RmR((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyt__ne__FscCssdg}xEd D]=}t||}|dj o|id||fqqWd|idi|}d|S( NtRrRsRts%s=%rs%rs, s Locale(%s)(s territorysscriptsvariant(tgetattrR tappendRqR(Rmt parametersRtvaluetparameter_string((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyt__repr__Is  cCs"t|i|i|i|ifS(N(RRqRrRsRt(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyt__str__RscCs<|idjo%titit||_n|iS(N(RuR RtLocaleDataDictRRv(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyt_dataVs%cCs|djo |}nti|}|ii|i}|ip|ip |iog}|io |i |i i|in|io |i |i i|in|io |i |i i|int d|}|o|ddi|7}qn|S(sRReturn the display name of the locale using the given locale. The display name will include the language, territory, script, and variant, if those are specified. >>> Locale('zh', 'CN', script='Hans').get_display_name('en') u'Chinese (Simplified, China)' :param locale: the locale to use s (%s)u, N(R RRyt languagesRRqRrRsRtRtscriptst territoriestvariantstfilterR(RmRtretvaltdetails((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pytget_display_name\s        tdocs The localized display name of the locale. >>> Locale('en').display_name u'English' >>> Locale('en', 'US').display_name u'English (United States)' >>> Locale('sv').display_name u'svenska' :type: `unicode` cCs9|djo |}nti|}|ii|iS(sReturn the language of this locale in the given locale. >>> Locale('zh', 'CN', script='Hans').get_language_name('de') u'Chinesisch' .. versionadded:: 1.0 :param locale: the locale to use N(R RRyRRRq(RmR((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pytget_language_names  sx The localized language name of the locale. >>> Locale('en', 'US').language_name u'English' cCs9|djo |}nti|}|ii|iS(s.Return the territory name in the given locale.N(R RRyRRRr(RmR((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pytget_territory_names  s The localized territory name of the locale if available. >>> Locale('de', 'DE').territory_name u'Deutschland' cCs9|djo |}nti|}|ii|iS(s+Return the script name in the given locale.N(R RRyRRRs(RmR((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pytget_script_names  s The localized script name of the locale if available. >>> Locale('ms', 'SG', script='Latn').script_name u'Latin' cCs|itdS(sThe english display name of the locale. >>> Locale('de').english_name u'German' >>> Locale('de', 'DE').english_name u'German (Germany)' :type: `unicode`R-(RR(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyt english_names cCs |idS(sMapping of language codes to translated language names. >>> Locale('de', 'DE').languages['ja'] u'Japanisch' See `ISO 639 `_ for more information. R(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRs cCs |idS(sMapping of script codes to translated script names. >>> Locale('en', 'US').scripts['Hira'] u'Hiragana' See `ISO 15924 `_ for more information. R(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRs cCs |idS(sMapping of script codes to translated script names. >>> Locale('es', 'CO').territories['DE'] u'Alemania' See `ISO 3166 `_ for more information. R(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRs cCs |idS(sMapping of script codes to translated script names. >>> Locale('de', 'DE').variants['1901'] u'Alte deutsche Rechtschreibung' R(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRscCs |idS(sMapping of currency codes to translated currency names. This only returns the generic form of the currency name, not the count specific one. If an actual number is requested use the :func:`babel.numbers.get_currency_name` function. >>> Locale('en').currencies['COP'] u'Colombian Peso' >>> Locale('de', 'DE').currencies['COP'] u'Kolumbianischer Peso' tcurrency_names(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyt currenciess cCs |idS(sMapping of currency codes to symbols. >>> Locale('en', 'US').currency_symbols['USD'] u'$' >>> Locale('es', 'CO').currency_symbols['USD'] u'US$' tcurrency_symbols(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRs cCs |idS(srSymbols used in number formatting. >>> Locale('fr', 'FR').number_symbols['decimal'] u',' tnumber_symbols(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyR scCs |idS(sLocale patterns for decimal number formatting. >>> Locale('en', 'US').decimal_formats[None] tdecimal_formats(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRscCs |idS(sLocale patterns for currency number formatting. >>> print Locale('en', 'US').currency_formats[None] tcurrency_formats(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRscCs |idS(sLocale patterns for percent number formatting. >>> Locale('en', 'US').percent_formats[None] tpercent_formats(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyR(scCs |idS(sLocale patterns for scientific number formatting. >>> Locale('en', 'US').scientific_formats[None] tscientific_formats(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyR1scCs |idS(srLocale display names for day periods (AM/PM). >>> Locale('en', 'US').periods['am'] u'AM' tperiods(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyR<scCs |idS(s{Locale display names for weekdays. >>> Locale('de', 'DE').days['format']['wide'][3] u'Donnerstag' tdays(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyREscCs |idS(syLocale display names for months. >>> Locale('de', 'DE').months['format']['wide'][10] u'Oktober' tmonths(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRNscCs |idS(sLocale display names for quarters. >>> Locale('de', 'DE').quarters['format']['wide'][1] u'1. Quartal' tquarters(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRWscCs |idS(sLocale display names for eras. >>> Locale('en', 'US').eras['wide'][1] u'Anno Domini' >>> Locale('en', 'US').eras['abbreviated'][0] u'BC' teras(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyR`s cCs |idS(sLocale display names for time zones. >>> Locale('en', 'US').time_zones['Europe/London']['long']['daylight'] u'British Summer Time' >>> Locale('en', 'US').time_zones['America/St_Johns']['city'] u'St. John\u2019s' t time_zones(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRks cCs |idS(sWLocale display names for meta time zones. Meta time zones are basically groups of different Olson time zones that have the same GMT offset and daylight savings time. >>> Locale('en', 'US').meta_zones['Europe_Central']['long']['daylight'] u'Central European Summer Time' .. versionadded:: 0.9 t meta_zones(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRvs cCs |idS(sPatterns related to the formatting of time zones. >>> Locale('en', 'US').zone_formats['fallback'] u'%(1)s (%(0)s)' >>> Locale('pt', 'BR').zone_formats['region'] u'Hor\xe1rio %s' .. versionadded:: 0.9 t zone_formats(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRs cCs|iddS(sThe first day of a week, with 0 being Monday. >>> Locale('de', 'DE').first_week_day 0 >>> Locale('en', 'US').first_week_day 6 t week_datat first_day(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pytfirst_week_days cCs|iddS(sqThe day the weekend starts, with 0 being Monday. >>> Locale('de', 'DE').weekend_start 5 Rt weekend_start(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRscCs|iddS(smThe day the weekend ends, with 0 being Monday. >>> Locale('de', 'DE').weekend_end 6 Rt weekend_end(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRscCs|iddS(sThe minimum number of days in a week so that the week is counted as the first week of a year or month. >>> Locale('de', 'DE').min_week_days 4 Rtmin_days(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyt min_week_daysscCs |idS(sLocale patterns for date formatting. >>> Locale('en', 'US').date_formats['short'] >>> Locale('fr', 'FR').date_formats['long'] t date_formats(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRs cCs |idS(sLocale patterns for time formatting. >>> Locale('en', 'US').time_formats['short'] >>> Locale('fr', 'FR').time_formats['long'] t time_formats(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRs cCs |idS(sLocale patterns for datetime formatting. >>> Locale('en').datetime_formats['full'] u"{1} 'at' {0}" >>> Locale('th').datetime_formats['medium'] u'{1}, {0}' tdatetime_formats(R(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRs cCs|iidtS(sPlural rules for the locale. >>> Locale('en').plural_form(1) 'one' >>> Locale('en').plural_form(0) 'other' >>> Locale('fr').plural_form(0) 'one' >>> Locale('ru').plural_form(100) 'many' t plural_form(RRt_default_plural_rule(Rm((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRs N(5RnRoRpR Rkt classmethodtLOCALE_ALIASESR}RtTrueRyRRRRtpropertyRRt display_nameRt language_nameRtterritory_nameRt script_nameRRRRRRRRRRRRRRRRRRRRRRRRRRRR(((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyR\sjo                                     cCs|ddddf}xtd |D]}ti|}|o|djo$d|jo|idd}n|iddd jo d }n#|o||jo||}nytt|SWqtj oqXq%q%Wd S( sReturns the system default locale for a given category, based on environment variables. >>> for name in ['LANGUAGE', 'LC_ALL', 'LC_CTYPE']: ... os.environ[name] = '' >>> os.environ['LANG'] = 'fr_FR.UTF-8' >>> default_locale('LC_MESSAGES') 'fr_FR' The "C" or "POSIX" pseudo-locales are treated as aliases for the "en_US_POSIX" locale: >>> os.environ['LC_MESSAGES'] = 'POSIX' >>> default_locale('LC_MESSAGES') 'en_US_POSIX' The following fallbacks to the variable are always considered: - ``LANGUAGE`` - ``LC_ALL`` - ``LC_CTYPE`` - ``LANG`` :param category: one of the ``LC_XXX`` environment variable names :param aliases: a dictionary of aliases for locale identifiers tLANGUAGEtLC_ALLtLC_CTYPEtLANGt:it.tCtPOSIXt en_US_POSIXN(RR(RR RtgetenvtsplitRRt ValueError(R{RxtvarnamestnameR((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRs R~c Csg}|D]}|o||iq q ~}x|D]}|i}||jo|S|oH|i|}|o.|id|}|i|jo|Sqn|i|} t| djo | di|jo | dSq9WdS(slFind the best match between available and requested locale strings. >>> negotiate_locale(['de_DE', 'en_US'], ['de_DE', 'de_AT']) 'de_DE' >>> negotiate_locale(['de_DE', 'en_US'], ['en', 'de']) 'de' Case is ignored by the algorithm, the result uses the case of the preferred locale identifier: >>> negotiate_locale(['de_DE', 'en_US'], ['de_de', 'de_at']) 'de_DE' >>> negotiate_locale(['de_DE', 'en_US'], ['de_de', 'de_at']) 'de_DE' By default, some web browsers unfortunately do not include the territory in the locale identifier for many locales, and some don't even allow the user to easily add the territory. So while you may prefer using qualified locale identifiers in your web-application, they would not normally match the language-only locale sent by such browsers. To workaround that, this function uses a default mapping of commonly used langauge-only locale identifiers to identifiers including the territory: >>> negotiate_locale(['ja', 'en_US'], ['ja_JP', 'en_US']) 'ja_JP' Some browsers even use an incorrect or outdated language code, such as "no" for Norwegian, where the correct locale identifier would actually be "nb_NO" (Bokmål) or "nn_NO" (Nynorsk). The aliases are intended to take care of such cases, too: >>> negotiate_locale(['no', 'sv'], ['nb_NO', 'sv_SE']) 'nb_NO' You can override this default mapping by passing a different `aliases` dictionary to this function, or you can bypass the behavior althogher by setting the `aliases` parameter to `None`. :param preferred: the list of locale strings preferred by the user :param available: the list of locale strings available :param sep: character that separates the different parts of the locale strings :param aliases: a dictionary of aliases for locale identifiers R~iiN(tlowerRtreplaceRtlenR ( RRRRxt_[1]taRtlltaliasR((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRs .2   * cCsd|jo|iddd}nd|jo|iddd}n|i|}|idi}|iptd|nd }}}|oEt|ddjo*|dio|idi}qn|ot|ddjo*|dio|idi}qtt|ddjo$|di o|id}qtn|olt|ddjo|ddi p,t|dd jo%|ddio|i}qn|otd |n||||fS( sParse a locale identifier into a tuple of the form ``(language, territory, script, variant)``. >>> parse_locale('zh_CN') ('zh', 'CN', None, None) >>> parse_locale('zh_Hans_CN') ('zh', 'CN', 'Hans', None) The default component separator is "_", but a different separator can be specified using the `sep` parameter: >>> parse_locale('zh-CN', sep='-') ('zh', 'CN', None, None) If the identifier cannot be parsed into a locale, a `ValueError` exception is raised: >>> parse_locale('not_a_LOCALE_String') Traceback (most recent call last): ... ValueError: 'not_a_LOCALE_String' is not a valid locale identifier Encoding information and locale modifiers are removed from the identifier: >>> parse_locale('it_IT@euro') ('it', 'IT', None, None) >>> parse_locale('en_US.UTF-8') ('en', 'US', None, None) >>> parse_locale('de_DE.iso885915@euro') ('de', 'DE', None, None) See :rfc:`4646` for more information. :param identifier: the locale identifier string :param sep: character that separates the different components of the locale identifier :raise `ValueError`: if the string does not appear to be a valid locale identifier Riit@sexpected only letters, got %riiiis#%r is not a valid locale identifierN( RtpopRtisalphaRR Rttitletuppertisdigit(RlRRtlangRsRrRt((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRUs0(   (((,,cCsVt|d }|ddt|\}}}}|itd||||fS(sThe reverse of :func:`parse_locale`. It creates a locale identifier out of a ``(language, territory, script, variant)`` tuple. Items can be set to ``None`` and trailing ``None``\s can also be left out of the tuple. >>> get_locale_identifier(('de', 'DE', None, '1999')) 'de_DE_1999' .. versionadded:: 1.0 :param tup: the tuple as returned by :func:`parse_locale`. :param sep: the separator for the identifier. iN(N(ttupleR RRR(ttupRRRrRsRt((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyRs $(RpRtbabelRt babel._compatRRt babel.pluralRt__all__R R RR RRRjRtobjectRRRRR(((s)/tmp/pip-build-lt8jXN/Babel/babel/core.pyt s6     #######-? K