rawTherapee/tools/generateTranslationDiffs
Hombre 8b2eac9a3d Pipette and "On Preview Widgets" branch. See issue 227
The pipette part is already working quite nice but need to be finished. The widgets part needs more work...
2014-01-21 23:37:36 +01:00

124 lines
4.1 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)
# - Polish (Latin Characters)
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)" -not -iname "Polish (Latin Characters)" | 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
}
getUnchanged () {
grep -E "^\!.+" "$1" | sort -Vu
}
# 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 trLines newLines
# Fill trLines with translated text
trLines+=("$(getChanged "$file")")
# KEY;String
# Match "default" keys with those in current translation file. If no match, add !KEY;String
while read -r 'defLine'; do
if [[ ! "${trLines[@]}" =~ "${defLine%%;*}" ]]; then
newLines+=("!${defLine}")
fi
done < <(getChanged default)
# Form final translation file
if [[ -n "$(getComments "$file")" ]]; then
printf "%s\n" "$(getComments "$file")" "" >> "$tmp"
fi
if [[ -n "${trLines[@]}" ]]; then
printf "%s\n" "${trLines[@]}" "" >> "$tmp"
fi
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)"
;;&
*"./Polish"*) printf "%s\n" "Creating Polish (Latin Characters) file"
sed 'y/ĄĆĘŁŃÓŚŹŻąćęłńóśźż/ACELNOSZZacelnoszz/' < Polish > "Polish (Latin Characters)"
;;&
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"