docs: def setup(self, app):
          """Setup the plugin's commands."""
          super(Plugin, self).setup(app)
          if isinstance(self.cfg['locales_dirs'], str):
              self.cfg['locales_dirs'] = [self.cfg['locales_dirs']]
  
          @app.manage.command(init=False)
          def extract_messages(   # noqa
                  *dirnames, project=app.name, version=app.cfg.get('VERSION', ''), locations=True,
                  charset='utf-8', domain=self.cfg.domain, locale=self.cfg.default_locale):
              """Extract messages from source code.
  
              :param charset: charset to use in the output
              :param domain:  set domain name for locales
              :param project: set project name in output
              :param version: set project version in output
              :param locations: add message locations
              """
              Locale.parse(locale)
  
              dirnames = [d for d in dirnames if os.path.isdir(d)]
  
              catalog = Catalog(locale=locale, project=project, version=version, charset=charset)
              for dname in dirnames:
                  for filename, lineno, message, comments, context in extract_from_dir(
                          dname, method_map=self.cfg.sources_map, options_map=self.cfg.options_map):
  
                      lines = []
                      if locations:
                          filepath = os.path.normpath(os.path.join(dname, filename))
                          lines = [(filepath, lineno)]
  
                      catalog.add(message, None, lines, auto_comments=comments, context=context)
  
              locales_dir = self.cfg.locales_dirs[0]
              output = os.path.join(locales_dir, locale, 'LC_MESSAGES', '%s.po' % domain)
  
              if os.path.exists(output):
                  with open(output, 'rb') as f:
                      template = read_po(f, locale=locale, charset=charset)
                      template.update(catalog)
                      catalog = template
  
              if not os.path.exists(os.path.dirname(output)):
                  os.makedirs(os.path.dirname(output))
  
              logger.info('writing PO template file to %s', output)
              outfile = open(output, 'wb')
  
              try:
                  write_po(outfile, catalog, include_previous=True,
                           sort_output=not locations, sort_by_file=locations)
              finally:
                  outfile.close()
  
          @app.manage.command(init=False)
          def compile_messages(use_fuzzy=False, statistics=False, domain=self.cfg.domain): # noqa
              """Compile messages for locales.
  
              :param domain:  set domain name for locales
              """
              for locales_dir in self.cfg.locales_dirs:
                  for locale in os.listdir(locales_dir):
                      po_file = os.path.join(locales_dir, locale, 'LC_MESSAGES', domain + '.po')
  
                      if not os.path.exists(po_file):
                          continue
  
                      with open(po_file, 'r') as po:
                          catalog = read_po(po, locale)
  
                      mo_file = os.path.join(locales_dir, locale, 'LC_MESSAGES', domain + '.mo')
  
                      with open(mo_file, 'wb') as mo:
                          logger.info('writing MO template file to %s', mo_file)
                          write_mo(mo, catalog, use_fuzzy=use_fuzzy)