def _init_i18n(self): # type: () -> None """Load translated strings from the configured localedirs if enabled in the configuration. """ if self.config.language is None: self.translator, has_translation = locale.init([], None) else: logger.info(bold( __('loading translations [%s]... ') % self.config.language), nonl=True) # compile mo files if sphinx.po file in user locale directories are updated repo = CatalogRepository(self.srcdir, self.config.locale_dirs, self.config.language, self.config.source_encoding) for catalog in repo.catalogs: if catalog.domain == 'sphinx' and catalog.is_outdated(): catalog.write_mo(self.config.language) locale_dirs = [None, path.join(package_dir, 'locale')] + list( repo.locale_dirs) self.translator, has_translation = locale.init( locale_dirs, self.config.language) if has_translation or self.config.language == 'en': # "en" never needs to be translated logger.info(__('done')) else: logger.info(__('not available for built-in messages'))
def compile_all_catalogs(self): # type: () -> None repo = CatalogRepository(self.srcdir, self.config.locale_dirs, self.config.language, self.config.source_encoding) message = __('all of %d po files') % len(list(repo.catalogs)) self.compile_catalogs(set(repo.catalogs), message)
def find_files(self, config: Config, builder: "Builder") -> None: """Find all source files in the source dir and put them in self.found_docs. """ try: exclude_paths = (self.config.exclude_patterns + self.config.templates_path + builder.get_asset_paths()) self.project.discover(exclude_paths) # Current implementation is applying translated messages in the reading # phase.Therefore, in order to apply the updated message catalog, it is # necessary to re-process from the reading phase. Here, if dependency # is set for the doc source and the mo file, it is processed again from # the reading phase when mo is updated. In the future, we would like to # move i18n process into the writing phase, and remove these lines. if builder.use_message_catalog: # add catalog mo file dependency repo = CatalogRepository(self.srcdir, self.config.locale_dirs, self.config.language, self.config.source_encoding) for docname in self.found_docs: domain = docname_to_domain(docname, self.config.gettext_compact) for catalog in repo.catalogs: if catalog.domain == domain: self.dependencies[docname].add(catalog.mo_path) except OSError as exc: raise DocumentError( __('Failed to scan documents in %s: %r') % (self.srcdir, exc))
def compile_update_catalogs(self): # type: () -> None repo = CatalogRepository(self.srcdir, self.config.locale_dirs, self.config.language, self.config.source_encoding) catalogs = {c for c in repo.catalogs if c.is_outdated()} message = __('targets for %d po files that are out of date') % len(catalogs) self.compile_catalogs(catalogs, message)
def compile_specific_catalogs(self, specified_files: List[str]) -> None: def to_domain(fpath: str) -> Optional[str]: docname = self.env.path2doc(path.abspath(fpath)) if docname: return docname_to_domain(docname, self.config.gettext_compact) else: return None catalogs = set() domains = set(map(to_domain, specified_files)) repo = CatalogRepository(self.srcdir, self.config.locale_dirs, self.config.language, self.config.source_encoding) for catalog in repo.catalogs: if catalog.domain in domains and catalog.is_outdated(): catalogs.add(catalog) message = __('targets for %d po files that are specified') % len(catalogs) self.compile_catalogs(catalogs, message)