code: def filter_by_codes(self, codes, sort='name_en'):
          
          lang_codes = []
          cc_codes = []
          for code in codes:
              if any(x in code for x in ('_', '-')):
                  cc_codes.append(code.replace('_', '-'))
              else:
                  lang_codes.append(code)
  
          cc_langs = CultureCode.objects.filter(code__in=cc_codes).as_languages()
  
          qs = self.get_queryset().filter(Q(iso_639_1__in=lang_codes) |
                                          Q(iso_639_2T__in=lang_codes) |
                                          Q(iso_639_2B__in=lang_codes) |
                                          Q(iso_639_3__in=lang_codes))
          langs = list(qs)
          langs.extend(cc_langs)
          langs.sort(key=lambda x: getattr(x, sort))
          return langs
docs: Retrieve a list (not queryset) of languages from a list of codes
          The language objects retrieved by culture code will be annotated with the country and
          culture code.
          :param codes: list of strings that can be either iso codes (any of the three) or culture
          codes.
          :param sort: str name_en|name_native|sort_code
          :return: a list of languages