# This file is part of the Indico plugins. # Copyright (C) 2002 - 2024 CERN # # The Indico plugins are free software; you can redistribute # them and/or modify them under the terms of the MIT License; # see the LICENSE file for more details. import json import os import subprocess from contextlib import contextmanager from pathlib import Path from hatchling.builders.hooks.plugin.interface import BuildHookInterface class CustomBuildHook(BuildHookInterface): def initialize(self, version, build_data): if os.environ.get('READTHEDOCS') == 'True' or version == 'editable': return if translations_dir := next(Path().glob('indico_*/translations/'), None): _compile_languages(translations_dir) _compile_languages_react(translations_dir) def _compile_languages(translations_dir: Path): from babel.messages.frontend import CompileCatalog if not any(translations_dir.glob('**/*.po')): return cmd = CompileCatalog() cmd.directory = translations_dir cmd.finalize_options() cmd.use_fuzzy = True cmd.run() def _compile_languages_react(translations_dir: Path): # we assume a ..../indico/{src,plugins/whatever}/ structure for indico and plugin repos indico_root = Path('../../../src/').absolute().resolve() for subdir in translations_dir.absolute().iterdir(): po_file = subdir / 'LC_MESSAGES' / 'messages-react.po' json_file = subdir / 'LC_MESSAGES' / 'messages-react.json' if not po_file.exists(): continue with _chdir(indico_root): output = subprocess.check_output(['npx', 'react-jsx-i18n', 'compile', po_file], stderr=subprocess.DEVNULL) json.loads(output) # just to be sure the JSON is valid json_file.write_bytes(output) @contextmanager def _chdir(path: Path): old_path = Path.cwd() os.chdir(path) try: yield finally: os.chdir(old_path)