Provides the same functionality as .. py:method:: ItemManager.filter_all_reachable_leaves(),
        but for more filters in the same time.

        Args:
            identifier_filters: list of identifier filters
            language (str): language used for further filtering (some objects
                for different languages share the same item

        Returns:
            list: list of list of item ids

def filter_all_reachable_leaves_many(self, identifier_filters, language, forbidden_identifiers=None):
        """
        Provides the same functionality as .. py:method:: ItemManager.filter_all_reachable_leaves(),
        but for more filters in the same time.

        Args:
            identifier_filters: list of identifier filters
            language (str): language used for further filtering (some objects
                for different languages share the same item

        Returns:
            list: list of list of item ids
        """
        for i, identifier_filter in enumerate(identifier_filters):
            if len(identifier_filter) == 1 and not isinstance(identifier_filter[0], list):
                identifier_filters[i] = [identifier_filter]
        item_identifiers = [
            identifier[1:] if identifier.startswith('-') else identifier
            for identifier_filter in identifier_filters
            for identifier in set(flatten(identifier_filter))
        ]
        if forbidden_identifiers is None:
            forbidden_identifiers = []
        for identifier in forbidden_identifiers:
            item_identifiers.append(identifier)
        translated = self.translate_identifiers(item_identifiers, language)
        forbidden_item_ids = {translated[identifier] for identifier in forbidden_identifiers}
        leaves = self.get_leaves({translated[i] for i in item_identifiers}, language=language, forbidden_item_ids=forbidden_item_ids)
        result = []
        for identifier_filter in identifier_filters:
            if len(identifier_filter) == 0:
                result.append(self.get_all_available_leaves(language=language, forbidden_item_ids=forbidden_item_ids))
                continue
            filter_result = None
            filter_neg_result = set()
            for inner_filter in identifier_filter:
                inner_result = None
                inner_neg_result = None
                if len(inner_filter) == 0:
                    raise Exception('Empty nested filters are not allowed.')
                for identifier in inner_filter:
                    if inner_neg_result is not None:
                        raise Exception('Nested filters can not contain multiple statements.')
                    if identifier.startswith('-'):
                        inner_neg_result = set(leaves[translated[identifier[1:]]])
                    else:
                        if inner_result is None:
                            inner_result = set()
                        inner_result |= set(leaves[translated[identifier]])
                if inner_result is not None:
                    if filter_result is None:
                        filter_result = inner_result
                    else:
                        filter_result &= inner_result
                if inner_neg_result is not None:
                    filter_neg_result != inner_neg_result
            result.append(sorted(list(filter_result - filter_neg_result)))
        return result