Files
godot-docs-l10n/update.sh
Rémi Verschelde 9683c7b514 Fully remove POT-Creation-Date in Sphinx POT/PO, Sphinx fails parsing if it's invalid
Add it back for the Weblate POT in case Weblate makes use of it.
2024-07-26 11:29:17 +02:00

169 lines
5.3 KiB
Bash
Executable File

#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
# Defines
SOURCE_DIR="docs"
SPHINX_TEMPLATES_DIR="sphinx/templates"
# This variant comes ordered alphabetically instead of following the TOC, not nice for translators
#SPHINX_TEMPLATES=$(find $SPHINX_TEMPLATES_DIR -type f -name "*.pot")
# This one is manually maintained, see --templates-list switch
SPHINX_TEMPLATES=$(sed -e 's@^@'$SPHINX_TEMPLATES_DIR'/@' templates_list.txt)
SPHINX_PO_DIR="sphinx/po"
SPHINX_BUILD_LANGS=$(cat build_langs.txt)
WEBLATE_DIR="weblate"
WEBLATE_TEMPLATE="$WEBLATE_DIR/docs.pot"
WEBLATE_POFILES=$(find $WEBLATE_DIR -type f -name "*.po" | sort)
# Used only for --add-langs - languages will mostly be added via Weblate directly
LANGS="es fr zh_CN"
# Options
make_templates_list=false
update_sphinx_pot=false
update_sphinx_po=false
update_weblate_pot=false
update_weblate_po=false
add_langs=false
# Command line arguments
while [ $# -gt 0 ]; do
case "$1" in
--templates-list|-tl)
make_templates_list=true
;;
--sphinx-pot|-st)
update_sphinx_pot=true
;;
--sphinx-po|-so)
update_sphinx_po=true
;;
--sphinx|-s)
update_sphinx_pot=true
update_sphinx_po=true
;;
--weblate-pot|-wt)
update_weblate_pot=true
;;
--weblate-po|-wo)
update_weblate_po=true
;;
--weblate|-w)
update_weblate_pot=true
update_weblate_po=true
;;
--all|-a)
update_sphinx_pot=true
update_sphinx_po=true
update_weblate_pot=true
update_weblate_po=true
;;
--add-langs|-l)
add_langs=true
;;
*)
echo "Invalid argument."
esac
shift
done
# Make ordered list of Sphinx templates based on table of contents in index.html
# This requires having run `make html` in the docs repo and copied the main
# `index.html` over next to this script.
if [ "$make_templates_list" = true ]; then
echo "=== Making ordered list of Sphinx templates based on table of contents ==="
if [ ! -f "index.html" ]; then
echo "Main 'index.html' file is missing, build it with 'make html' and copy it here."
exit 1
fi
# The strings we are interested in are of the form:
# <li class="toctree-l1"><a class="reference internal" href="about/index.html">About</a><ul>
toc=$(grep "<li class=\"toctree-.*href=\".*.html\">.*" index.html)
templates=$(echo "$toc" | sed -e 's@^.*href="\(.*\)\.html".*@\1.pot@' | awk '!x[$0]++')
echo -e "index.pot\n$templates" > templates_list.txt
fi
# Generate/Update Sphinx template from rst files
if [ "$update_sphinx_pot" = true ]; then
echo "=== Updating Sphinx templates from source rst files ==="
rm -rf $SPHINX_TEMPLATES_DIR
make -C $SOURCE_DIR gettext
# We don't translate the class reference this way.
rm -rf $SPHINX_TEMPLATES_DIR/classes
SPHINX_TEMPLATES=$(find $SPHINX_TEMPLATES_DIR -type f -name "*.pot")
echo $SPHINX_TEMPLATES
# Remove POT Creation Date, it generates diff noise.
sed -i $SPHINX_TEMPLATES -e '/"POT-Creation-Date: .*\\n"/d'
fi
# Generate/Update Weblate monolithic template from Sphinx template
if [ "$update_weblate_pot" = true ]; then
echo "=== Updating Weblate monolithic template from Sphinx templates ==="
if [ ! -d "$SPHINX_TEMPLATES_DIR" ]; then
echo "Sphinx templates are missing, please run with --sphinx-pot."
exit 1
fi
if [ ! -d "$WEBLATE_DIR" ]; then
mkdir $WEBLATE_DIR
fi
msgcat -o $WEBLATE_TEMPLATE $SPHINX_TEMPLATES
# Set bug report info, and re-add POT Creation Date removed from Sphinx POT for Git's sake.
date=$(date +"%Y-%m-%d %H:%M%z")
sed -i 's@^"Report-Msgid-Bugs-To: .*\"$@"Report-Msgid-Bugs-To: https://github.com/godotengine/godot-docs-l10n\\n"\n"POT-Creation-Date: '${date}'\\n"@' $WEBLATE_TEMPLATE
fi
# Merge Weblate PO files with Weblate template
if [ "$update_weblate_po" = true ]; then
echo "=== Merging Weblate PO files with Weblate template ==="
for po in $WEBLATE_POFILES; do
echo "Merging $po..."
msgmerge -w 79 "$po" $WEBLATE_TEMPLATE > "$po".new
mv -f "$po".new "$po"
msgattrib --output-file=$po --no-obsolete $po
done
fi
# Manual method to generate new Weblate PO files to bootstrap a lang
if [ "$add_langs" = true ]; then
for lang in $LANGS; do
if [ ! -f "$WEBLATE_DIR/$lang.po" ]; then
msginit --no-translator -i $WEBLATE_TEMPLATE -o "$WEBLATE_DIR/$lang.po";
fi
done
WEBLATE_POFILES=$(find $WEBLATE_DIR -type f -name "*.po")
fi
# Generate/Merge Sphinx PO files from Weblate PO file
merge_sphinx_po() {
po=$WEBLATE_DIR"/$1.po"
echo "Merging $po..."
langdir="$SPHINX_PO_DIR/$lang/LC_MESSAGES"
mkdir -p "$langdir"
for template in $SPHINX_TEMPLATES; do
page=$(basename "$template" .pot)
dirpath=$(dirname "$template" | sed -e 's@'$SPHINX_TEMPLATES_DIR'@'"$langdir"'@')
mkdir -p "$dirpath"
output="$dirpath/$page.po"
msgmerge --lang="$lang" --for-msgfmt -C "$po" "$template" "$template" -o "$output"
done
}
if [ "$update_sphinx_po" = true ]; then
echo "=== Merging Sphinx PO files with their template and Weblate PO file ==="
# First clean previous folder to take into account potentially removed files
rm -rf $SPHINX_PO_DIR
mkdir $SPHINX_PO_DIR
i=0
for lang in $SPHINX_BUILD_LANGS; do
merge_sphinx_po $lang &
pids[$i]=$!
i+=1
done
for pid in ${pids[*]}; do
wait $pid
done
echo "All Sphinx PO files have been merged."
fi