o 3a,@sddlZddlZddlZddlZddlmZddlmZddlm Z m Z m Z ddl m Z mZddlmZddlmZddlmZdd lmZmZmZdd lmZdd lmZd Zd dZddZdZ GdddeZ!Gddde!Z"dS)N)apps)settings) HttpResponseHttpResponseRedirect JsonResponse)ContextEngine) translate_url get_format)url_has_allowed_host_and_scheme)LANGUAGE_SESSION_KEYcheck_for_language get_language)DjangoTranslation)Viewlanguagec Cs|jd|jd}|s|dr2t||h|ds2|jd}t||h|ds2d}|r8t|nt dd}|j dkr{|jt }|r{t |r{|r]t ||}||kr]t|}t|d rg||jt<|jtj|tjtjtjtjtjtjd |S) a Redirect to a given URL while setting the chosen language in the session (if enabled) and in a cookie. The URL and the language code need to be specified in the request parameters. Since this view changes how the user will see the rest of the site, it must only be accessed as a POST request. If called as a GET request, it will redirect to the page in the request (the 'next' parameter) without changing any state. nextz text/html)url allowed_hosts require_https HTTP_REFERER/)statusPOSTsession)max_agepathdomainsecurehttponlysamesite)rgetGETacceptsr get_host is_secureMETArrmethodLANGUAGE_QUERY_PARAMETERrr hasattrrr set_cookierLANGUAGE_COOKIE_NAMELANGUAGE_COOKIE_AGELANGUAGE_COOKIE_PATHLANGUAGE_COOKIE_DOMAINLANGUAGE_COOKIE_SECURELANGUAGE_COOKIE_HTTPONLYLANGUAGE_COOKIE_SAMESITE)requestnext_urlresponse lang_code next_transr93/usr/lib/python3/dist-packages/django/views/i18n.py set_languagesL         r;cCsd}dd|DS)z5Return all formats strings required for i18n to work.) DATE_FORMATDATETIME_FORMAT TIME_FORMATYEAR_MONTH_FORMATMONTH_DAY_FORMATSHORT_DATE_FORMATSHORT_DATETIME_FORMATFIRST_DAY_OF_WEEKDECIMAL_SEPARATORTHOUSAND_SEPARATORNUMBER_GROUPINGDATE_INPUT_FORMATSTIME_INPUT_FORMATSDATETIME_INPUT_FORMATScSsi|]}|t|qSr9r ).0attrr9r9r: Rszget_formats..r9)FORMAT_SETTINGSr9r9r: get_formatsIsrNa {% autoescape off %} 'use strict'; { const globals = this; const django = globals.django || (globals.django = {}); {% if plural %} django.pluralidx = function(n) { const v = {{ plural }}; if (typeof v === 'boolean') { return v ? 1 : 0; } else { return v; } }; {% else %} django.pluralidx = function(count) { return (count == 1) ? 0 : 1; }; {% endif %} /* gettext library */ django.catalog = django.catalog || {}; {% if catalog_str %} const newcatalog = {{ catalog_str }}; for (const key in newcatalog) { django.catalog[key] = newcatalog[key]; } {% endif %} if (!django.jsi18n_initialized) { django.gettext = function(msgid) { const value = django.catalog[msgid]; if (typeof value === 'undefined') { return msgid; } else { return (typeof value === 'string') ? value : value[0]; } }; django.ngettext = function(singular, plural, count) { const value = django.catalog[singular]; if (typeof value === 'undefined') { return (count == 1) ? singular : plural; } else { return value.constructor === Array ? value[django.pluralidx(count)] : value; } }; django.gettext_noop = function(msgid) { return msgid; }; django.pgettext = function(context, msgid) { let value = django.gettext(context + '\x04' + msgid); if (value.includes('\x04')) { value = msgid; } return value; }; django.npgettext = function(context, singular, plural, count) { let value = django.ngettext(context + '\x04' + singular, context + '\x04' + plural, count); if (value.includes('\x04')) { value = django.ngettext(singular, plural, count); } return value; }; django.interpolate = function(fmt, obj, named) { if (named) { return fmt.replace(/%\(\w+\)s/g, function(match){return String(obj[match.slice(2,-2)])}); } else { return fmt.replace(/%s/g, function(match){return String(obj.shift())}); } }; /* formatting library */ django.formats = {{ formats_str }}; django.get_format = function(format_type) { const value = django.formats[format_type]; if (typeof value === 'undefined') { return format_type; } else { return value; } }; /* add to global namespace */ globals.pluralidx = django.pluralidx; globals.gettext = django.gettext; globals.ngettext = django.ngettext; globals.gettext_noop = django.gettext_noop; globals.pgettext = django.pgettext; globals.npgettext = django.npgettext; globals.interpolate = django.interpolate; globals.get_format = django.get_format; django.jsi18n_initialized = true; } }; {% endautoescape %} c@s`eZdZdZdZdZddZddZedd Z ed d Z d d Z ddZ ddZ ddZdS)JavaScriptCataloga Return the selected language catalog as a JavaScript library. Receive the list of packages to check for translations in the `packages` kwarg either from the extra dictionary passed to the path() function or as a plus-sign delimited string from the request. Default is 'django.conf'. You can override the gettext domain for this view, but usually you don't want to do that as JavaScript messages go to the djangojs domain. This might be needed if you deliver your JavaScript source from Django templates. djangojsNc Ospt}|d|j}|dd}|r|dn|j}|r!||nd}t|||d|_|jdi|}| |S)Nrpackages+)r localedirsr9) rr#rsplitrQ get_pathsr translationget_context_datarender_to_response) selfr4argskwargslocalerrQpathscontextr9r9r:r#s  zJavaScriptCatalog.getcsfddtDfdd|D}t|t|kr,fdd|D}tdd|dd|DS) NcSsi|]}|j|qSr9)name)rJ app_configr9r9r:rLsz/JavaScriptCatalog.get_paths..csg|] }|vr|qSr9r9rJpallowable_packagesr9r: z/JavaScriptCatalog.get_paths..csg|]}|vr|qSr9r9rbrdr9r:rfz4Invalid package(s) provided to JavaScriptCatalog: %s,cSsg|] }tj|jdqS)r])osrjoin)rJappr9r9r:rfrg)rget_app_configslen ValueErrorrk)rZrQ app_configsexcludedr9rdr:rVs zJavaScriptCatalog.get_pathscCs&td|jpd}|rt|dSdS)zx Return the number of plurals for this catalog language, or 2 if no plural string is available. znplurals=\s*(\d+)rR)research_plural_stringint)rZmatchr9r9r: _num_pluralss zJavaScriptCatalog._num_pluralscCsJd|jjvr#|jjddD]}|dr"|dddSqdS)z Return the plural string (including nplurals) for this catalog language, or None if no plural string is available. rR z Plural-Forms::rrN)rW_catalogrU startswithstrip)rZliner9r9r:rvs  z JavaScriptCatalog._plural_stringcCs6|j}|durdd|dDdddd}|S)NcSs"g|] }|dr|qS)zplural=)r~r})rJelr9r9r:rfs"z0JavaScriptCatalog.get_plural..;r=rr)rvrU)rZpluralr9r9r: get_plurals$zJavaScriptCatalog.get_pluralc si}|j}i}|jj}|jjr|jjjni}t}t||D]2\}}|dks/||vr0q#t|t r:|||<nt|t rL|\} } || | i| <nt || |q#|D]\} fddt|D|| <qZ|S)NrRcsg|]}|dqS)rR)r#)rJivr9r:rfrhz1JavaScriptCatalog.get_catalog..)ryrWr| _fallbackset itertoolschainitems isinstancestrtuple setdefault TypeErroraddrange) rZpdict num_pluralscatalog trans_cattrans_fallback_cat seen_keyskeyvaluemsgidcntkr9rr: get_catalogs&    zJavaScriptCatalog.get_catalogcKs|t|dS)N)rformatsr)rrNr)rZr\r9r9r:rXsz"JavaScriptCatalog.get_context_datacKsldd}tt}|dr|tj|ddddnd|d<|tj|dddd|d <t|t|d S) NcSs |ddS)Nrzz )replace)sr9r9r:indent#s z4JavaScriptCatalog.render_to_response..indentrTrs) sort_keysr catalog_strr formats_strz text/javascript; charset="utf-8")r from_stringjs_catalog_templatejsondumpsrrenderr)rZr_response_kwargsrtemplater9r9r:rY"s z$JavaScriptCatalog.render_to_response)__name__ __module__ __qualname____doc__rrQr#rVpropertyryrvrrrXrYr9r9r9r:rOs       rOc@seZdZdZddZdS) JSONCataloga Return the selected language catalog as a JSON object. Receive the same parameters as JavaScriptCatalog and return a response with a JSON object of the following format: { "catalog": { # Translations catalog }, "formats": { # Language formats for date, time, etc. }, "plural": '...' # Expression for plural forms, or null. } cKst|S)N)r)rZr_rr9r9r:rY@szJSONCatalog.render_to_responseN)rrrrrYr9r9r9r:r/s r)#rrrjrt django.appsr django.confr django.httprrrdjango.templaterr django.urlsr django.utils.formatsr django.utils.httpr django.utils.translationr rr#django.utils.translation.trans_realrdjango.views.genericrr*r;rNrrOrr9r9r9r:s(       3 jp