33from __future__import annotations
44
55import argparse
6- import os
76import subprocess
7+ from pathlib import Path
88
99import tomllib
1010
11- PROJECT_DIR = os . path . dirname ( os . path . abspath ( __file__ ))
11+ PROJECT_DIR = Path ( __file__ ). resolve (). parent
1212
13- # Global variables used by pybabel below
13+ # Global variables used by pybabel below (paths relative to PROJECT_DIR)
1414DOMAIN = "messages"
1515COPYRIGHT_HOLDER = "Python Software Foundation"
16- LOCALES_DIR = os .path .relpath (os .path .join (PROJECT_DIR ,"locales" ))
17- POT_FILE = os .path .relpath (os .path .join (LOCALES_DIR ,f"{ DOMAIN } .pot" ),PROJECT_DIR )
18- SOURCE_DIR = os .path .relpath (
19- os .path .join (PROJECT_DIR ,"python_docs_theme" ),PROJECT_DIR
20- )
21- MAPPING_FILE = os .path .relpath (os .path .join (PROJECT_DIR ,".babel.cfg" ),PROJECT_DIR )
16+ LOCALES_DIR = "locales"
17+ POT_FILE = Path (LOCALES_DIR ,f"{ DOMAIN } .pot" )
18+ SOURCE_DIR = "python_docs_theme"
19+ MAPPING_FILE = ".babel.cfg"
2220
2321
2422def get_project_info ()-> dict :
2523"""Retrieve project's info to populate the message catalog template"""
26- with open (os . path . join (PROJECT_DIR , "pyproject.toml" ),"rb" )as f :
24+ with open (Path (PROJECT_DIR / "pyproject.toml" ),"rb" )as f :
2725data = tomllib .load (f )
2826return data ["project" ]
2927
3028
3129def extract_messages ():
3230"""Extract messages from all source files into message catalog template"""
33- os . makedirs ( LOCALES_DIR ,exist_ok = True )
31+ Path ( PROJECT_DIR , LOCALES_DIR ). mkdir ( parents = True ,exist_ok = True )
3432project_data = get_project_info ()
3533subprocess .run (
3634 [
@@ -50,34 +48,35 @@ def extract_messages():
5048POT_FILE ,
5149SOURCE_DIR ,
5250 ],
51+ cwd = PROJECT_DIR ,
5352check = True ,
5453 )
5554
5655
5756def init_locale (locale :str ):
5857"""Initialize a new locale based on existing message catalog template"""
59- pofile = os . path . join ( LOCALES_DIR , locale , "LC_MESSAGES" , f"{ DOMAIN } .po" )
60- if os . path . exists (pofile ):
58+ pofile = PROJECT_DIR / LOCALES_DIR / locale / "LC_MESSAGES" / f"{ DOMAIN } .po"
59+ if pofile . exists ():
6160print (f"There is already a message catalog for locale{ locale } , skipping." )
6261return
6362cmd = ["pybabel" ,"init" ,"-i" ,POT_FILE ,"-d" ,LOCALES_DIR ,"-l" ,locale ]
64- subprocess .run (cmd ,check = True )
63+ subprocess .run (cmd ,cwd = PROJECT_DIR , check = True )
6564
6665
6766def update_catalogs (locale :str ):
6867"""Update translations from existing message catalogs"""
6968cmd = ["pybabel" ,"update" ,"-i" ,POT_FILE ,"-d" ,LOCALES_DIR ]
7069if locale != "" :
7170cmd .extend (["-l" ,locale ])
72- subprocess .run (cmd ,check = True )
71+ subprocess .run (cmd ,cwd = PROJECT_DIR , check = True )
7372
7473
7574def compile_catalogs (locale :str ):
7675"""Compile existing message catalogs"""
7776cmd = ["pybabel" ,"compile" ,"-d" ,LOCALES_DIR ]
7877if locale != "" :
7978cmd .extend (["-l" ,locale ])
80- subprocess .run (cmd ,check = True )
79+ subprocess .run (cmd ,cwd = PROJECT_DIR , check = True )
8180
8281
8382def main ():
@@ -96,8 +95,6 @@ def main():
9695args = parser .parse_args ()
9796locale = args .locale if args .locale else ""
9897
99- os .chdir (PROJECT_DIR )
100-
10198if args .command == "extract" :
10299extract_messages ()
103100elif args .command == "init" :