@@ -280,6 +280,14 @@ class Language:
280280def tag (self )-> str :
281281return self .iso639_tag .replace ("_" ,"-" ).lower ()
282282
283+ @property
284+ def is_translation (self )-> bool :
285+ return self .tag != "en"
286+
287+ @property
288+ def locale_repo_url (self )-> str :
289+ return f"https://github.com/python/python-docs-{ self .tag } .git"
290+
283291@property
284292def switcher_label (self )-> str :
285293if self .translated_name :
@@ -549,7 +557,7 @@ def run(self, http: urllib3.PoolManager, force_build: bool) -> bool | None:
549557logging .info ("Skipping non-HTML build (language is HTML-only)." )
550558return None # skipped
551559self .cpython_repo .switch (self .version .branch_or_tag )
552- if self .language .tag != "en" :
560+ if self .language .is_translation :
553561self .clone_translation ()
554562if trigger_reason := self .should_rebuild (force_build ):
555563self .build_venv ()
@@ -569,6 +577,10 @@ def run(self, http: urllib3.PoolManager, force_build: bool) -> bool | None:
569577return False
570578return True
571579
580+ @property
581+ def locale_dir (self )-> Path :
582+ return self .build_root / self .version .name / "locale"
583+
572584@property
573585def checkout (self )-> Path :
574586"""Path to CPython git clone."""
@@ -582,15 +594,8 @@ def clone_translation(self) -> None:
582594def translation_repo (self )-> Repository :
583595"""See PEP 545 for translations repository naming convention."""
584596
585- locale_repo = f"https://github.com/python/python-docs-{ self .language .tag } .git"
586- locale_clone_dir = (
587- self .build_root
588- / self .version .name
589- / "locale"
590- / self .language .iso639_tag
591- / "LC_MESSAGES"
592- )
593- return Repository (locale_repo ,locale_clone_dir )
597+ locale_clone_dir = self .locale_dir / self .language .iso639_tag / "LC_MESSAGES"
598+ return Repository (self .language .locale_repo_url ,locale_clone_dir )
594599
595600@property
596601def translation_branch (self )-> str :
@@ -611,10 +616,9 @@ def build(self) -> None:
611616logging .info ("Build start." )
612617start_time = perf_counter ()
613618sphinxopts = list (self .language .sphinxopts )
614- if self .language .tag != "en" :
615- locale_dirs = self .build_root / self .version .name / "locale"
619+ if self .language .is_translation :
616620sphinxopts .extend ((
617- f"-D locale_dirs={ locale_dirs } " ,
621+ f"-D locale_dirs={ self . locale_dir } " ,
618622f"-D language={ self .language .iso639_tag } " ,
619623"-D gettext_compact=0" ,
620624"-D translation_progress_classes=1" ,
@@ -636,7 +640,7 @@ def build(self) -> None:
636640
637641if self .includes_html :
638642site_url = self .version .url
639- if self .language .tag != "en" :
643+ if self .language .is_translation :
640644site_url += f"{ self .language .tag } /"
641645# Define a tag to enable opengraph socialcards previews
642646# (used in Doc/conf.py and requires matplotlib)
@@ -718,7 +722,7 @@ def copy_build_to_webroot(self, http: urllib3.PoolManager) -> None:
718722logging .info ("Publishing start." )
719723start_time = perf_counter ()
720724self .www_root .mkdir (parents = True ,exist_ok = True )
721- if self .language .tag == "en" :
725+ if not self .language .is_translation :
722726target = self .www_root / self .version .name
723727else :
724728language_dir = self .www_root / self .language .tag
@@ -786,7 +790,7 @@ def should_rebuild(self, force: bool) -> str | Literal[False]:
786790logging .info ("Should rebuild: no previous state found." )
787791return "no previous state"
788792cpython_sha = self .cpython_repo .run ("rev-parse" ,"HEAD" ).stdout .strip ()
789- if self .language .tag != "en" :
793+ if self .language .is_translation :
790794translation_sha = self .translation_repo .run (
791795"rev-parse" ,"HEAD"
792796 ).stdout .strip ()
@@ -849,7 +853,7 @@ def save_state(
849853"triggered_by" :trigger ,
850854"cpython_sha" :self .cpython_repo .run ("rev-parse" ,"HEAD" ).stdout .strip (),
851855 }
852- if self .language .tag != "en" :
856+ if self .language .is_translation :
853857state ["translation_sha" ]= self .translation_repo .run (
854858"rev-parse" ,"HEAD"
855859 ).stdout .strip ()