class_docstr: Catalog of translatable messages.
class_docstr_tok: ["Catalog","of","translatable","messages","."]
code: def add(self, msg: str, origin: Element | MsgOrigin) -> None:
      if not hasattr(origin, "uid"):
          # Nodes that are replicated like todo don't have a uid,
          # however i18n is also unnecessary.
          return
      if msg not in self.metadata:  # faster lookup in hash
          self.messages.append(msg)
          self.metadata[msg] = []
      line = origin.line
      if line is None:
          line = -1
      self.metadata[msg].append((origin.source, line, origin.uid))
  
imports: from __future__ import annotations
  import time
  from codecs import open
  from collections import defaultdict
  from os import getenv, path, walk
  from typing import TYPE_CHECKING, Any
  from uuid import uuid4
  from docutils import nodes
  from sphinx import addnodes, package_dir
  from sphinx.builders import Builder
  from sphinx.errors import ThemeError
  from sphinx.locale import __
  from sphinx.util import logging
  from sphinx.util.console import bold
  from sphinx.util.display import status_iterator
  from sphinx.util.i18n import CatalogInfo, docname_to_domain
  from sphinx.util.index_entries import split_index_msg
  from sphinx.util.nodes import extract_messages, traverse_translatable_index
  from sphinx.util.osutil import canon_path, ensuredir, relpath
  from sphinx.util.tags import Tags
  from sphinx.util.template import SphinxRenderer
label_desc: Use image node_id 2 for calling the Catalog obj's underlying member method code with example usage: obj.add(msg, origin) without return types