240 lines
No EOL
8.5 KiB
Bash
Executable file
240 lines
No EOL
8.5 KiB
Bash
Executable file
#!/bin/bash
|
|
# Version: 22
|
|
|
|
# https://techbase.kde.org/Development/Tutorials/Localization/i18n_Build_Systems
|
|
# https://techbase.kde.org/Development/Tutorials/Localization/i18n_Build_Systems/Outside_KDE_repositories
|
|
# https://invent.kde.org/sysadmin/l10n-scripty/-/blob/master/extract-messages.sh
|
|
|
|
DIR=`cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd`
|
|
plasmoidName=`kreadconfig5 --file="$DIR/../metadata.desktop" --group="Desktop Entry" --key="X-KDE-PluginInfo-Name"`
|
|
widgetName="${plasmoidName##*.}" # Strip namespace
|
|
website=`kreadconfig5 --file="$DIR/../metadata.desktop" --group="Desktop Entry" --key="X-KDE-PluginInfo-Website"`
|
|
bugAddress="$website"
|
|
packageRoot=".." # Root of translatable sources
|
|
projectName="plasma_applet_${plasmoidName}" # project name
|
|
|
|
#---
|
|
if [ -z "$plasmoidName" ]; then
|
|
echo "[merge] Error: Couldn't read plasmoidName."
|
|
exit
|
|
fi
|
|
|
|
if [ -z "$(which xgettext)" ]; then
|
|
echo "[merge] Error: xgettext command not found. Need to install gettext"
|
|
echo "[merge] Running 'sudo apt install gettext'"
|
|
sudo apt install gettext
|
|
echo "[merge] gettext installation should be finished. Going back to merging translations."
|
|
fi
|
|
|
|
#---
|
|
echo "[merge] Extracting messages"
|
|
potArgs="--from-code=UTF-8 --width=200 --add-location=file"
|
|
|
|
# Note: xgettext v0.20.1 (Kubuntu 20.04) and below will attempt to translate Icon,
|
|
# so we need to specify Name, GenericName, Comment, and Keywords.
|
|
# https://github.com/Zren/plasma-applet-lib/issues/1
|
|
# https://savannah.gnu.org/support/?108887
|
|
find "${packageRoot}" -name '*.desktop' | sort > "${DIR}/infiles.list"
|
|
xgettext \
|
|
${potArgs} \
|
|
--files-from="${DIR}/infiles.list" \
|
|
--language=Desktop \
|
|
-k -kName -kGenericName -kComment -kKeywords \
|
|
-D "${packageRoot}" \
|
|
-D "${DIR}" \
|
|
-o "template.pot.new" \
|
|
|| \
|
|
{ echo "[merge] error while calling xgettext. aborting."; exit 1; }
|
|
|
|
sed -i 's/"Content-Type: text\/plain; charset=CHARSET\\n"/"Content-Type: text\/plain; charset=UTF-8\\n"/' "template.pot.new"
|
|
|
|
# See Ki18n's extract-messages.sh for a full example:
|
|
# https://invent.kde.org/sysadmin/l10n-scripty/-/blob/master/extract-messages.sh#L25
|
|
# The -kN_ and -kaliasLocale keywords are mentioned in the Outside_KDE_repositories wiki.
|
|
# We don't need -kN_ since we don't use intltool-extract but might as well keep it.
|
|
# I have no idea what -kaliasLocale is used for. Googling aliasLocale found only listed kde1 code.
|
|
# We don't need to parse -ki18nd since that'll extract messages from other domains.
|
|
find "${packageRoot}" -name '*.cpp' -o -name '*.h' -o -name '*.c' -o -name '*.qml' -o -name '*.js' | sort > "${DIR}/infiles.list"
|
|
xgettext \
|
|
${potArgs} \
|
|
--files-from="${DIR}/infiles.list" \
|
|
-C --kde \
|
|
-k \
|
|
-ci18n \
|
|
-ki18n:1 -ki18nc:1c,2 -ki18np:1,2 -ki18ncp:1c,2,3 \
|
|
-kki18n:1 -kki18nc:1c,2 -kki18np:1,2 -kki18ncp:1c,2,3 \
|
|
-kxi18n:1 -kxi18nc:1c,2 -kxi18np:1,2 -kxi18ncp:1c,2,3 \
|
|
-kkxi18n:1 -kkxi18nc:1c,2 -kkxi18np:1,2 -kkxi18ncp:1c,2,3 \
|
|
-kI18N_NOOP:1 -kI18NC_NOOP:1c,2 \
|
|
-kI18N_NOOP2:1c,2 -kI18N_NOOP2_NOSTRIP:1c,2 \
|
|
-ktr2i18n:1 -ktr2xi18n:1 \
|
|
-kN_:1 \
|
|
-kaliasLocale \
|
|
--package-name="${widgetName}" \
|
|
--msgid-bugs-address="${bugAddress}" \
|
|
-D "${packageRoot}" \
|
|
-D "${DIR}" \
|
|
--join-existing \
|
|
-o "template.pot.new" \
|
|
|| \
|
|
{ echo "[merge] error while calling xgettext. aborting."; exit 1; }
|
|
|
|
sed -i 's/# SOME DESCRIPTIVE TITLE./'"# Translation of ${widgetName} in LANGUAGE"'/' "template.pot.new"
|
|
sed -i 's/# Copyright (C) YEAR THE PACKAGE'"'"'S COPYRIGHT HOLDER/'"# Copyright (C) $(date +%Y)"'/' "template.pot.new"
|
|
|
|
if [ -f "template.pot" ]; then
|
|
newPotDate=`grep "POT-Creation-Date:" template.pot.new | sed 's/.\{3\}$//'`
|
|
oldPotDate=`grep "POT-Creation-Date:" template.pot | sed 's/.\{3\}$//'`
|
|
sed -i 's/'"${newPotDate}"'/'"${oldPotDate}"'/' "template.pot.new"
|
|
changes=`diff "template.pot" "template.pot.new"`
|
|
if [ ! -z "$changes" ]; then
|
|
# There's been changes
|
|
sed -i 's/'"${oldPotDate}"'/'"${newPotDate}"'/' "template.pot.new"
|
|
mv "template.pot.new" "template.pot"
|
|
|
|
addedKeys=`echo "$changes" | grep "> msgid" | cut -c 9- | sort`
|
|
removedKeys=`echo "$changes" | grep "< msgid" | cut -c 9- | sort`
|
|
echo ""
|
|
echo "Added Keys:"
|
|
echo "$addedKeys"
|
|
echo ""
|
|
echo "Removed Keys:"
|
|
echo "$removedKeys"
|
|
echo ""
|
|
|
|
else
|
|
# No changes
|
|
rm "template.pot.new"
|
|
fi
|
|
else
|
|
# template.pot didn't already exist
|
|
mv "template.pot.new" "template.pot"
|
|
fi
|
|
|
|
potMessageCount=`expr $(grep -Pzo 'msgstr ""\n(\n|$)' "template.pot" | grep -c 'msgstr ""')`
|
|
echo "| Locale | Lines | % Done|" > "./Status.md"
|
|
echo "|----------|---------|-------|" >> "./Status.md"
|
|
entryFormat="| %-8s | %7s | %5s |"
|
|
templateLine=`perl -e "printf(\"$entryFormat\", \"Template\", \"${potMessageCount}\", \"\")"`
|
|
echo "$templateLine" >> "./Status.md"
|
|
|
|
rm "${DIR}/infiles.list"
|
|
echo "[merge] Done extracting messages"
|
|
|
|
#---
|
|
echo "[merge] Merging messages"
|
|
catalogs=`find . -name '*.po' | sort`
|
|
for cat in $catalogs; do
|
|
echo "[merge] $cat"
|
|
catLocale=`basename ${cat%.*}`
|
|
|
|
widthArg=""
|
|
catUsesGenerator=`grep "X-Generator:" "$cat"`
|
|
if [ -z "$catUsesGenerator" ]; then
|
|
widthArg="--width=400"
|
|
fi
|
|
|
|
compendiumArg=""
|
|
if [ ! -z "$COMPENDIUM_DIR" ]; then
|
|
langCode=`basename "${cat%.*}"`
|
|
compendiumPath=`realpath "$COMPENDIUM_DIR/compendium-${langCode}.po"`
|
|
if [ -f "$compendiumPath" ]; then
|
|
echo "compendiumPath=$compendiumPath"
|
|
compendiumArg="--compendium=$compendiumPath"
|
|
fi
|
|
fi
|
|
|
|
cp "$cat" "$cat.new"
|
|
sed -i 's/"Content-Type: text\/plain; charset=CHARSET\\n"/"Content-Type: text\/plain; charset=UTF-8\\n"/' "$cat.new"
|
|
|
|
msgmerge \
|
|
${widthArg} \
|
|
--add-location=file \
|
|
--no-fuzzy-matching \
|
|
${compendiumArg} \
|
|
-o "$cat.new" \
|
|
"$cat.new" "${DIR}/template.pot"
|
|
|
|
sed -i 's/# SOME DESCRIPTIVE TITLE./'"# Translation of ${widgetName} in ${catLocale}"'/' "$cat.new"
|
|
sed -i 's/# Translation of '"${widgetName}"' in LANGUAGE/'"# Translation of ${widgetName} in ${catLocale}"'/' "$cat.new"
|
|
sed -i 's/# Copyright (C) YEAR THE PACKAGE'"'"'S COPYRIGHT HOLDER/'"# Copyright (C) $(date +%Y)"'/' "$cat.new"
|
|
|
|
poEmptyMessageCount=`expr $(grep -Pzo 'msgstr ""\n(\n|$)' "$cat.new" | grep -c 'msgstr ""')`
|
|
poMessagesDoneCount=`expr $potMessageCount - $poEmptyMessageCount`
|
|
poCompletion=`perl -e "printf(\"%d\", $poMessagesDoneCount * 100 / $potMessageCount)"`
|
|
poLine=`perl -e "printf(\"$entryFormat\", \"$catLocale\", \"${poMessagesDoneCount}/${potMessageCount}\", \"${poCompletion}%\")"`
|
|
echo "$poLine" >> "./Status.md"
|
|
|
|
# mv "$cat" "$cat.old"
|
|
mv "$cat.new" "$cat"
|
|
done
|
|
echo "[merge] Done merging messages"
|
|
|
|
#---
|
|
echo "[merge] Updating .desktop file"
|
|
|
|
# Generate LINGUAS for msgfmt
|
|
if [ -f "$DIR/LINGUAS" ]; then
|
|
rm "$DIR/LINGUAS"
|
|
fi
|
|
touch "$DIR/LINGUAS"
|
|
for cat in $catalogs; do
|
|
catLocale=`basename ${cat%.*}`
|
|
echo "${catLocale}" >> "$DIR/LINGUAS"
|
|
done
|
|
|
|
cp -f "$DIR/../metadata.desktop" "$DIR/template.desktop"
|
|
sed -i '/^Name\[/ d; /^GenericName\[/ d; /^Comment\[/ d; /^Keywords\[/ d' "$DIR/template.desktop"
|
|
|
|
msgfmt \
|
|
--desktop \
|
|
--template="$DIR/template.desktop" \
|
|
-d "$DIR/" \
|
|
-o "$DIR/new.desktop"
|
|
|
|
# Delete empty msgid messages that used the po header
|
|
if [ ! -z "$(grep '^Name=$' "$DIR/new.desktop")" ]; then
|
|
echo "[merge] Name in metadata.desktop is empty!"
|
|
sed -i '/^Name\[/ d' "$DIR/new.desktop"
|
|
fi
|
|
if [ ! -z "$(grep '^GenericName=$' "$DIR/new.desktop")" ]; then
|
|
echo "[merge] GenericName in metadata.desktop is empty!"
|
|
sed -i '/^GenericName\[/ d' "$DIR/new.desktop"
|
|
fi
|
|
if [ ! -z "$(grep '^Comment=$' "$DIR/new.desktop")" ]; then
|
|
echo "[merge] Comment in metadata.desktop is empty!"
|
|
sed -i '/^Comment\[/ d' "$DIR/new.desktop"
|
|
fi
|
|
if [ ! -z "$(grep '^Keywords=$' "$DIR/new.desktop")" ]; then
|
|
echo "[merge] Keywords in metadata.desktop is empty!"
|
|
sed -i '/^Keywords\[/ d' "$DIR/new.desktop"
|
|
fi
|
|
|
|
# Place translations at the bottom of the desktop file.
|
|
translatedLines=`cat "$DIR/new.desktop" | grep "]="`
|
|
if [ ! -z "${translatedLines}" ]; then
|
|
sed -i '/^Name\[/ d; /^GenericName\[/ d; /^Comment\[/ d; /^Keywords\[/ d' "$DIR/new.desktop"
|
|
if [ "$(tail -c 2 "$DIR/new.desktop" | wc -l)" != "2" ]; then
|
|
# Does not end with 2 empty lines, so add an empty line.
|
|
echo "" >> "$DIR/new.desktop"
|
|
fi
|
|
echo "${translatedLines}" >> "$DIR/new.desktop"
|
|
fi
|
|
|
|
# Cleanup
|
|
mv "$DIR/new.desktop" "$DIR/../metadata.desktop"
|
|
rm "$DIR/template.desktop"
|
|
rm "$DIR/LINGUAS"
|
|
|
|
#---
|
|
# Populate ReadMe.md
|
|
echo "[merge] Updating translate/ReadMe.md"
|
|
sed -i -E 's`share\/plasma\/plasmoids\/(.+)\/translate`share/plasma/plasmoids/'"${plasmoidName}"'/translate`' ./ReadMe.md
|
|
if [[ "$website" == *"github.com"* ]]; then
|
|
sed -i -E 's`\[new issue\]\(https:\/\/github\.com\/(.+)\/(.+)\/issues\/new\)`[new issue]('"${website}"'/issues/new)`' ./ReadMe.md
|
|
fi
|
|
sed -i '/^|/ d' ./ReadMe.md # Remove status table from ReadMe
|
|
cat ./Status.md >> ./ReadMe.md
|
|
rm ./Status.md
|
|
|
|
echo "[merge] Done" |