Add script to generate translation template

Signed-off-by: Björn Bidar <bjorn.bidar@thaodan.de>
This commit is contained in:
Björn Bidar 2023-10-15 22:51:46 +03:00
parent 79b2f386c8
commit d23f342876
3 changed files with 96 additions and 2 deletions

84
misc/update_translations.py Executable file
View File

@ -0,0 +1,84 @@
#!/usr/bin/python3
"""Scan source files and to update translations"""
# pylint: disable=global-statement, exec-used
import os
import sys
import subprocess
from pathlib import Path
import setuptools
# Global variables
exclude_files = ['setup.py',
os.path.basename(sys.argv[0]),
'build']
project_root=Path(subprocess.getoutput("git rev-parse --show-toplevel"))
po_dir=project_root / "po"
metadata = {}
# Load metadata from setup.py
# First create a mock setup() function
def setup(**kwargs):
"""Retrieve metadata from setup.py
@returns: metadata as 'metadata'
"""
global metadata
metadata = kwargs
setuptools.setup = setup
# Now open setup.py and use setup to store metadata
# in the dictionary metadata
with open(project_root/"setup.py", mode='r', encoding='utf-8') as setup_fd:
setup_str = setup_fd.read()
exec(setup_str)
os.makedirs(po_dir, exist_ok=True)
# Generate po files
xgettext = ['xgettext', '--indent', '--language=Python',
'--foreign-use', '--output-dir', str(po_dir),
f'--package-name={metadata["name"]}',
f'--package-version={metadata["version"]}',
f'--default-domain={metadata["name"]}',
f'--output={metadata["name"]}.pot',
'--msgid-bugs-address=none@none']
msgmerge = [ 'msgmerge', '--update']
msginit = ['msginit',
'--no-translator', '--locale=en',
f'--output-file={str(po_dir)}/en.po',
f'--input={str(po_dir)}/{metadata["name"]}.pot']
package_path = Path(metadata["name"])
src_files = [ str(src_file.relative_to(project_root)) \
for src_file in (project_root/package_path).glob('**/*.py') \
if src_file.name not in exclude_files]
os.chdir(project_root)
try:
subprocess.run([*xgettext, *src_files], check=True)
except subprocess.CalledProcessError as e:
print(e)
# Now update existing translations if needed
for po_file in po_dir.glob('*.po'):
try:
subprocess.run([*msgmerge, po_file, str(po_dir)+f'/{metadata["name"]}.pot'],
check=True)
except subprocess.CalledProcessError as e:
print(e)
# Create or update English translation
english_translation = po_dir/'en.po'
if english_translation.exists():
english_translation.unlink()
try:
subprocess.run([*msginit],
check=True)
except subprocess.CalledProcessError as e:
print(e)

View File

@ -1,4 +1,4 @@
[build-system] [build-system]
requires = ["setuptools", "wheel"] requires = ["setuptools", "wheel", "setuptools-gettext"]
build-backend = "setuptools.build_meta" build-backend = "setuptools.build_meta"

View File

@ -3,13 +3,23 @@ import setuptools
setup_dir = Path(__file__).resolve().parent setup_dir = Path(__file__).resolve().parent
long_description = ''
try:
long_description = \
Path(setup_dir, 'README.md').open().read()
except:
# In case we don't find README.md ignore it,
# e.g. when we update translations
pass
setuptools.setup( setuptools.setup(
name='waypaper', name='waypaper',
author='Roman Anufriev', author='Roman Anufriev',
author_email='anufriev.roman@protonmail.com', author_email='anufriev.roman@protonmail.com',
url='https://github.com/anufrievroman/waypaper', url='https://github.com/anufrievroman/waypaper',
description='GUI wallpaper setter for Wayland', description='GUI wallpaper setter for Wayland',
long_description=Path(setup_dir, 'README.md').open().read(), long_description=long_description,
long_description_content_type='text/markdown', long_description_content_type='text/markdown',
license='GPL', license='GPL',
entry_points={ entry_points={