diff options
Diffstat (limited to 'manage_translations.py')
| -rw-r--r-- | manage_translations.py | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/manage_translations.py b/manage_translations.py new file mode 100644 index 0000000..6d0c843 --- /dev/null +++ b/manage_translations.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python3 +""" +Translation management script for yt-local + +Usage: + python manage_translations.py extract # Extract strings to messages.pot + python manage_translations.py init es # Initialize Spanish translation + python manage_translations.py update # Update all translations + python manage_translations.py compile # Compile translations to .mo files +""" +import sys +import os +import subprocess + +# Ensure we use the Python from the virtual environment if available +if hasattr(sys, 'real_prefix') or (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix): + # Already in venv + pass +else: + # Try to activate venv + venv_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'venv') + if os.path.exists(venv_path): + venv_bin = os.path.join(venv_path, 'bin') + if os.path.exists(venv_bin): + os.environ['PATH'] = venv_bin + os.pathsep + os.environ['PATH'] + + +def run_command(cmd): + """Run a shell command and print output""" + print(f"Running: {' '.join(cmd)}") + # Use the pybabel from the same directory as our Python executable + if cmd[0] == 'pybabel': + import os + pybabel_path = os.path.join(os.path.dirname(sys.executable), 'pybabel') + if os.path.exists(pybabel_path): + cmd = [pybabel_path] + cmd[1:] + result = subprocess.run(cmd, capture_output=True, text=True) + if result.stdout: + print(result.stdout) + if result.stderr: + print(result.stderr, file=sys.stderr) + return result.returncode + + +def extract(): + """Extract translatable strings from source code""" + print("Extracting translatable strings...") + return run_command([ + 'pybabel', 'extract', + '-F', 'babel.cfg', + '-k', 'lazy_gettext', + '-k', '_l', + '-o', 'translations/messages.pot', + '.' + ]) + + +def init(language): + """Initialize a new language translation""" + print(f"Initializing {language} translation...") + return run_command([ + 'pybabel', 'init', + '-i', 'translations/messages.pot', + '-d', 'translations', + '-l', language + ]) + + +def update(): + """Update existing translations with new strings""" + print("Updating translations...") + return run_command([ + 'pybabel', 'update', + '-i', 'translations/messages.pot', + '-d', 'translations' + ]) + + +def compile_translations(): + """Compile .po files to .mo files""" + print("Compiling translations...") + return run_command([ + 'pybabel', 'compile', + '-d', 'translations' + ]) + + +def main(): + if len(sys.argv) < 2: + print(__doc__) + sys.exit(1) + + command = sys.argv[1] + + if command == 'extract': + sys.exit(extract()) + elif command == 'init': + if len(sys.argv) < 3: + print("Error: Please specify a language code (e.g., es, fr, de)") + sys.exit(1) + sys.exit(init(sys.argv[2])) + elif command == 'update': + sys.exit(update()) + elif command == 'compile': + sys.exit(compile_translations()) + else: + print(f"Unknown command: {command}") + print(__doc__) + sys.exit(1) + + +if __name__ == '__main__': + main() |
