'Yield all messages from source CSV files
Messages from all languages are returned. The messages are not ordered
properly, but splitting the stream by language (and filtering results
by merge_adjacent) will produce proper streams.'

def yield_source_messages(self, language_id=None):

    if (language_id is None):
        language_id = self.source_lang_id
    for cls in sorted(toplevel_classes, key=(lambda c: c.__name__)):
        streams = []
        for translation_class in cls.translation_classes:
            streams.append(yield_source_csv_messages(translation_class, cls, self.reader_for_class(translation_class)))
            try:
                colmap = summary_map[translation_class]
            except KeyError:
                pass
            else:
                for (colname, summary_class) in colmap.items():
                    column = translation_class.__table__.c[colname]
                    streams.append(yield_source_csv_messages(summary_class, cls, self.reader_for_class(summary_class), force_column=column))
        for message in Merge(*streams):
            (yield message)
