RawTherapee/tools/generateTranslationDiffs

130 lines
3.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# This script iterates through interface translation files,
# moves comments to the front, puts translated strings next,
# and finally looks for untranslated/missing strings by matching
# against "default" which it then adds to the translation, each
# line prepended by "!".
#
# Developers should run it from the project root after receiving
# a translation file from a translator:
# cp /tmp/new_japanese_translation rtdata/languages/Japanese
# ./tools/generateTranslationDiffs "Japanese"
#
# Running the script without an argument iterates through all files.
#
# Locale files are generated automatically:
# - English (UK)
tmp=temp_file
if [[ -w $tmp ]]; then
rm -v "$tmp"
fi
abort () {
printf "%s\n" "" "Aborting"
rm -v "$tmp"
exit 1
}
trap 'abort' HUP INT QUIT ABRT TERM
cd "rtdata/languages" || { printf "%s\n" "You must run this script from the root of the project."; exit 1; }
# Build array of all interface translation files, or use user-specified ones only
unset langFiles
if [[ $# = 0 ]]; then
while read -r; do
langFiles+=("$REPLY")
done < <(find . -not -iname "default" \
-not -iname "LICENSE" \
-not -iname "README" \
-not -iname "*.sh" \
-not -iname ".*" \
-not -iname "$tmp" \
-not -iname "English (UK)" \
| sort)
else
langFiles=("$@")
for langFile in "${langFiles[@]}"; do
if [[ ! -w $langFile ]]; then
printf "%s\n" "File \"$langFile\" not found or not writable." ""
exit 1
fi
done
fi
getComments () {
grep -E "^#.+" "$1" | sort -Vu
}
getChanged () {
grep -Ev '^(!|#|$)' "$1" | sort -Vu -t ';' --key=1,1
}
getUnchanged () {
grep -E "^\!.+" "$1" | sort -Vu -t ';' --key=1,1
}
# First thing, fix default, so move comments to front, then strip the rest of any "!" and duplicates.
dos2unix default 2>/dev/null
getComments default > "$tmp"
getChanged default >> "$tmp"
mv "$tmp" "default"
i=1
printf "%s\n" "Digging through ${#langFiles[@]} file(s). This may take a while."
ttot1="$(date +%s)"
for file in "${langFiles[@]}"; do
t1="$(date +%s)"
printf "%02d - ${file#.*/}" "$i"
dos2unix "$file" 2>/dev/null
unset newLines
# KEY;String
# Match "default" keys with those in current translation file. If no match, add !KEY;String
while read -r 'defLine'; do
defKey="${defLine%%;*}"
if ! grep -q "^${defKey}\;" "$file"; then
newLines+=("!${defLine}")
fi
done < <(getChanged default)
# Form final translation file
# Start with comments
if [[ -n "$(getComments "$file")" ]]; then
printf "%s\n" "$(getComments "$file")" "" >> "$tmp"
fi
# Add already-translated lines
getChanged "$file" >> "$tmp"
printf '%s\n' "" >> "$tmp"
# End with new, untranslated lines
if [[ -n "${newLines[@]}" ]]; then
printf "%s\n" "!!!!!!!!!!!!!!!!!!!!!!!!!" "! Untranslated keys follow; remove the ! prefix after an entry is translated." "!!!!!!!!!!!!!!!!!!!!!!!!!" "" "${newLines[@]}" >> "$tmp"
fi
mv "$tmp" "$file"
t2="$(date +%s)"
tt=$((t2-t1))
printf "%s\n" " - took $tt seconds"
((i++))
done
case "${langFiles[@]}" in
*"./English (US)"*) printf "%s\n" "Creating English (UK) file"
getComments "English (US)" > "English (UK)"
grep -Ei ".+;.*(color|behavior|center).*" default | \
sed -e '/^#/d' -e 'h;s/^[^;]*;//; s/olor/olour/g; x;s/;.*//;G;s/\n/;/' \
-e 'h;s/^[^;]*;//; s/ehavior/ehaviour/g; x;s/;.*//;G;s/\n/;/' \
-e 'h;s/^[^;]*;//; s/center/centre/g; x;s/;.*//;G;s/\n/;/' \
-e 'h;s/^[^;]*;//; s/Center/Centre/g; x;s/;.*//;G;s/\n/;/' >> English\ \(UK\)
grep -Evi ".+;.*(color|behavior|center).*" "English (US)" | grep -Ev "^#" >> "English (UK)"
;;&
esac
ttot2="$(date +%s)"
ttot=$((ttot2-ttot1))
tsec=$((ttot%60))
tmin=$((ttot/60))
printf "%s\n" "Finished updating ${#langFiles[@]} files." "Total time: ${tmin}m ${tsec}s"