tools/update_lua_locale_files.sh
author Wuzzy <Wuzzy2@mail.ru>
Fri, 09 Mar 2018 19:05:59 +0100
changeset 13145 5083fb0a2992
parent 13090 3f3ad415d849
child 13511 b62b14aa88d4
permissions -rwxr-xr-x
A Classic Fairytale: Harden all missions against missing campaign variables in team file and assume default values This assumes the worst case in which the team file is missing all campaign variables except Progress. This has been successfully tested with all 10 missions and still generates a logical storyline. By default, the game assumes: - The cyborg's offer in mission 2 was refused - The traitor in mission 5 was killed As a consequence, missions 8 and 10 use the princessScene cut scene.

#!/bin/sh -
# Script to update all Lua locale files.
# It's Clunky and slow!
# Note this script may sooner or later be phased out when we move to Gettext.

# HOW TO USE:
# - Run this script in the tools/ directory.
# - All .lua files in share/hedgewars/Data/Locale will be updated.
# - Change LOCALEFILES below to limit the number of locale files to update

# Space-separated list of locale files to update, or *.lua for all.
# (Note: always include stub.lua)
LOCALEFILES="*.lua"

# List of all Lua files to scan:
# * Missions
# * Campaign missions
# * Lua libraries
# * Styles (aka multiplayer scripts)
# * Mission maps
# IMPORTANT: Don't forget to update this list when new places for Lua
#            directories have been added!
LUAFILES="../Missions/Challenge/*.lua\
 ../Missions/Scenario/*.lua\
 ../Missions/Training/*.lua\
 ../Missions/Campaign/*/*.lua\
 ../Scripts/*.lua\
 ../Scripts/Multiplayer/*.lua\
 ../Maps/*/map.lua"

cd ../share/hedgewars/Data/Locale;

# Temporary files
TEMP_LOC=$(mktemp);
TEMP_HEAD=$(mktemp);
TEMP_TAIL=$(mktemp);
TEMP_LUA=$(mktemp);

# Collect strings
echo "Step 1: Collect strings";
echo -n "" > $TEMP_LOC;
for F in loc loc_noop;
	do
	grep -F "$F(\"" $LUAFILES | sed 's/")/")\n/g' | sed "s/.*$F(\"/loc(\"/;s/\").*/\")/" | grep loc | sort | uniq >> $TEMP_LOC;
done

# Update locale files
# This step is clunky and inefficient. Improve performance (if you are bored)!
echo "Step 2: Update locale files (this may take a while)";
for i in $LOCALEFILES;
do
	echo $i;
	cat $TEMP_LOC | while read f
		do
		STR=$(echo "$f" | sed 's/loc("//;s/")\s*$//;s/"/\\"/g');
		MAPS=$(grep -F -l -- "loc(\"${STR}\")" $LUAFILES | sed 's/.*\/\([^\/]*\)\/map.lua/\1/;s/.*Campaign\/\([^\/]*\)\//\1:/;s/.*\///;s/.lua//;s/ /_/g' | xargs | sed 's/ /, /g');
		C=$(echo $MAPS | sed 's/,/\n/' | wc -l)
		grep -Fq -- "[\"${STR}\"]" $i;
		if (($?));
		then
			if ((C>0));
			then
				echo "--      [\"${STR}\"] = \"\", -- $MAPS" >> $i;
			else
				echo "--      [\"${STR}\"] = \"\"," >> $i;
			fi;
		fi;
	done;
done

# Sort
echo "Step 3: Sort strings";
for i in $LOCALEFILES;
do
	echo $i;
	rm -f $TEMP_HEAD $TEMP_TAIL $TEMP_LUA;
	cat $i | grep -Ev "}|{" | grep -Ev "^[[:space:]]*$" | sort | uniq > $TEMP_LUA;
	echo "locale = {" > $TEMP_HEAD;
	echo "}" > $TEMP_TAIL;
	cat $TEMP_HEAD $TEMP_LUA $TEMP_TAIL > $i;
done

# Drop unused
echo "Step 4: Delete unused strings";
cat stub.lua | grep '"] =' | while read f;
do
	PHRASE=$(echo "$f" | sed 's/[^[]*\["//;s/"] =.*//;s/"/\\"/g');
	CNT=$(grep -Frc "loc(\"$PHRASE\")" $TEMP_LOC);
	if (($CNT==0));
	then
		echo "|$PHRASE|";
		PHRASE=$(echo "$PHRASE" | sed 's/\\/\\\\/g;s/\[/\\[/g;s/\]/\\]/g;s/\//\\\//g');
		sed -i "/.*\[\"$PHRASE\"\].*/d" $LOCALEFILES;
	fi;
done

# Delete temporary files
rm $TEMP_HEAD $TEMP_TAIL $TEMP_LUA $TEMP_LOC;

echo "Done."