                      locale_t.update(catalog._catalog)
              if locale_t:
                  t = locale_t
      plural = None
      if '' in t:
          for l in t[''].split('\n'):
              if l.startswith('Plural-Forms:'):
                  plural = l.split(':', 1)[1].strip()
      if plural is not None:
          # this should actually be a compiled function of a typical plural-form:
          # Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 :
          #               n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;
          plural = [el.strip() for el in plural.split(';') if el.strip().startswith('plural=')][0].split('=', 1)[1]
 
</s> remove     # add the filesystem paths listed in the LOCALE_PATHS setting
    paths.extend(reversed(settings.LOCALE_PATHS))
    # first load all english languages files for defaults
    for path in paths:
        try:
            catalog = gettext_module.translation(domain, path, ['en'])
            t.update(catalog._catalog)
        except IOError:
            pass
        else:
            # 'en' is the selected language and at least one of the packages
            # listed in `packages` has an 'en' catalog
            if en_selected:
                en_catalog_missing = False
    # next load the settings.LANGUAGE_CODE translations if it isn't english
    if default_locale != 'en':
        for path in paths:
            try:
                catalog = gettext_module.translation(domain, path, [default_locale])
            except IOError:
                catalog = None
            if catalog is not None:
                t.update(catalog._catalog)
    # last load the currently selected language, if it isn't identical to the default.
    if locale != default_locale:
        # If the currently selected language is English but it doesn't have a
        # translation catalog (presumably due to being the language translated
        # from) then a wrong language catalog might have been loaded in the
        # previous step. It needs to be discarded.
        if en_selected and en_catalog_missing:
            t = {}
        else:
            locale_t = {}
            for path in paths:
                try:
                    catalog = gettext_module.translation(domain, path, [locale])
                except IOError:
                    catalog = None
                if catalog is not None:
                    locale_t.update(catalog._catalog)
            if locale_t:
                t = locale_t
 </s> add     trans = DjangoTranslation(locale, domain=domain, localedirs=paths)
    trans_cat = trans._catalog
 </s> remove         self._init_translation_catalog()
        self._add_installed_apps_translations()
 </s> add         if self.domain == 'django':
            if localedirs is not None:
                # A module-level cache is used for caching 'django' translations
                warnings.warn("localedirs is ignored when domain is 'django'.", RuntimeWarning)
                localedirs = None
            self._init_translation_catalog()

        if localedirs:
            for localedir in localedirs:
                translation = self._new_gnu_trans(localedir)
                self.merge(translation)
        else:
            self._add_installed_apps_translations()
 </s> remove             raise TypeError(k)
 </s> add             raise TypeError(key) </s> remove     for k, v in t.items():
        if k == '':
 </s> add     trans_fallback_cat = trans._fallback._catalog if trans._fallback else {}
    for key, value in itertools.chain(six.iteritems(trans_cat), six.iteritems(trans_fallback_cat)):
        if key == '' or key in catalog: </s> remove     t = {}
 </s> add 
    if '' in trans_cat:
        for line in trans_cat[''].split('\n'):
            if line.startswith('Plural-Forms:'):
                plural = line.split(':', 1)[1].strip()
                      locale_t.update(catalog._catalog)
              if locale_t:
                  t = locale_t
      plural = None
    if '' in trans_cat:
        for line in trans_cat[''].split('\n'):
            if line.startswith('Plural-Forms:'):
                plural = line.split(':', 1)[1].strip()
    if '' in trans_cat:
        for line in trans_cat[''].split('\n'):
            if line.startswith('Plural-Forms:'):
                plural = line.split(':', 1)[1].strip()
    if '' in trans_cat:
        for line in trans_cat[''].split('\n'):
            if line.startswith('Plural-Forms:'):
                plural = line.split(':', 1)[1].strip()
    if '' in trans_cat:
        for line in trans_cat[''].split('\n'):
            if line.startswith('Plural-Forms:'):
                plural = line.split(':', 1)[1].strip()
      if plural is not None:
          # this should actually be a compiled function of a typical plural-form:
          # Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 :
          #               n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;
          plural = [el.strip() for el in plural.split(';') if el.strip().startswith('plural=')][0].split('=', 1)[1]
keep keep keep keep replace replace replace replace keep keep keep keep keep
 Reused the DjangoTranslation class for the javascript_catalog view

Thanks Tim Graham and Cristiano Coelho for the reviews.
Refs #26328, #26319. 
django/views/i18n.py