mirror of
https://github.com/godotengine/godot-docs-l10n.git
synced 2025-12-31 09:49:22 +03:00
169 lines
5.3 KiB
Bash
Executable File
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
|