|
@ -5,22 +5,142 @@ |
|
|
# then pass the .pot in poedit to merge duplication and add the Zanata header |
|
|
# then pass the .pot in poedit to merge duplication and add the Zanata header |
|
|
|
|
|
|
|
|
if [[ "$#" -ne 2 ]]; then |
|
|
if [[ "$#" -ne 2 ]]; then |
|
|
echo "Please passe exactly 2 parameters: the .xml and the corresponding .po" |
|
|
|
|
|
|
|
|
echo "Please pass exactly 2 parameters: the .po and the language" |
|
|
exit 1 |
|
|
exit 1 |
|
|
|
|
|
|
|
|
fi |
|
|
fi |
|
|
|
|
|
|
|
|
LANGUAGE=${2} |
|
|
|
|
|
|
|
|
LANGUAGE="${2}" |
|
|
WORKDIR="/tmp/thea2/${LANGUAGE}" |
|
|
WORKDIR="/tmp/thea2/${LANGUAGE}" |
|
|
PO=${1} |
|
|
|
|
|
TXT="${PO%%.po}.txt" |
|
|
|
|
|
FINALDIR="$(pwd)/${LANGUAGE}" |
|
|
|
|
|
|
|
|
PO="${1}" |
|
|
|
|
|
FINALDIR="$(pwd)/Translation/${LANGUAGE}/game_files/Modules/" |
|
|
|
|
|
TXT=$(basename "${PO%%.po}.txt") |
|
|
|
|
|
TXT="${FINALDIR}/${TXT}" |
|
|
|
|
|
|
|
|
mkdir -p ${WORKDIR} |
|
|
|
|
|
mkdir -p ${FINALDIR} |
|
|
|
|
|
|
|
|
|
|
|
readarray -t file < ${PO} |
|
|
|
|
|
|
|
|
# Initialization |
|
|
|
|
|
mkdir -p "${WORKDIR}" |
|
|
|
|
|
mkdir -p "${FINALDIR}" |
|
|
|
|
|
truncate -s 0 "${TXT}" |
|
|
|
|
|
readarray -t FILE < ${PO} |
|
|
|
|
|
declare -A eventArray=() |
|
|
|
|
|
declare -A translationArray=() |
|
|
|
|
|
|
|
|
for line in "${file[@]}"; do |
|
|
|
|
|
echo $line |
|
|
|
|
|
done |
|
|
|
|
|
|
|
|
# First thing first, let's anonymize the po and delete all email references |
|
|
|
|
|
sed -i 's/[A-Za-z0-9._%+-]\+@[A-Za-z0-9.-]\+\.[A-Za-z]\{2,6\}//' "${PO}" |
|
|
|
|
|
|
|
|
|
|
|
function extract_translation { |
|
|
|
|
|
key="${line}" |
|
|
|
|
|
# We need to escape special char for regex: [ + and ( |
|
|
|
|
|
key="${key//[/\\\\[}" |
|
|
|
|
|
key="${key//+/\\\\\+}" |
|
|
|
|
|
key="${key//(/\\\\\(}" |
|
|
|
|
|
# We search for the exact key in the po file until we get a blank line, to get the full msgstr and the msgid |
|
|
|
|
|
tempPO=$(awk -v key="${key}" '{pat="#. "key""} !NF{s=0}s;$0 ~ pat{ print $0; s=1 }' ${PO}) |
|
|
|
|
|
# Extract msgstr and merge all lines into one |
|
|
|
|
|
tempMsgstr=$(awk '!NF{s=0}s;/msgstr/{ print $0; s=1 }' <<< "${tempPO}" | sed -e 's/^"//' -e 's/"$//' -e 's/^msgstr "//') |
|
|
|
|
|
msgstr=$(awk 'NR{printf "%s",$0;next;}1' <<< ${tempMsgstr}) |
|
|
|
|
|
|
|
|
|
|
|
# Extract msgid and merge all lines into one |
|
|
|
|
|
tempMsgid="$(awk '/msgid/{ s=1 }s;/msgstr/{ s=0 }' <<< \"${tempPO}\" |grep -v "msgstr" | sed -e 's/^"//' -e 's/"$//' -e 's/^msgid "//')" |
|
|
|
|
|
msgid="$(awk 'NR{printf "%s",$0;next;}1' <<< ${tempMsgid})" |
|
|
|
|
|
|
|
|
|
|
|
# Escape special char causing problem in with sed and xml |
|
|
|
|
|
msgstr=${msgstr//'\n'/'\\n'} |
|
|
|
|
|
msgstr=${msgstr//'\"'/"""} |
|
|
|
|
|
msgstr=${msgstr//'&'/'\&'} |
|
|
|
|
|
msgid=${msgid//'\n'/'\\n'} |
|
|
|
|
|
msgid=${msgid//'\"'/"""} |
|
|
|
|
|
msgid=${msgid//'&'/'\&'} |
|
|
|
|
|
|
|
|
|
|
|
if [[ "${msgstr}" == "" ]]; then |
|
|
|
|
|
# if the msgstr is empty, then it's not translated yet, we use original string |
|
|
|
|
|
translation=${msgid} |
|
|
|
|
|
else |
|
|
|
|
|
translation=${msgstr} |
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
echo ${translation} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function rebuild_txt { |
|
|
|
|
|
## We need to recurse on all event, then getting all node and their content for each event ## |
|
|
|
|
|
|
|
|
|
|
|
# In order to recurse properly, we need to sort the translationArray |
|
|
|
|
|
# To sort we use a new sorted array which contains all keys sorted following "Version style" order |
|
|
|
|
|
# eg: 0.2.story is before 0.2.1 and 0.2.1 is before 0.11.1 |
|
|
|
|
|
sorted=() |
|
|
|
|
|
while IFS= read -rd '' key; do |
|
|
|
|
|
sorted+=( "$key" ) |
|
|
|
|
|
done < <(printf '%s\0' "${!translationArray[@]}" | sort -zV) |
|
|
|
|
|
|
|
|
|
|
|
currentEvent=0 |
|
|
|
|
|
currentNode="" |
|
|
|
|
|
for index in "${!eventArray[@]}"; do |
|
|
|
|
|
# If currentEvent is different than our index, then we just changed event and need to close the precedent |
|
|
|
|
|
# We also closed the next event in line |
|
|
|
|
|
if [[ ${currentEvent} != ${index} ]]; then |
|
|
|
|
|
echo "[/NODE]" >> ${TXT} |
|
|
|
|
|
echo >> ${TXT} |
|
|
|
|
|
echo "[/EVENT]" >> ${TXT} |
|
|
|
|
|
echo >> ${TXT} |
|
|
|
|
|
fi |
|
|
|
|
|
echo "${eventArray[${index}]}" >> ${TXT} |
|
|
|
|
|
for key in "${sorted[@]}"; do |
|
|
|
|
|
# We work only on key related to our current event |
|
|
|
|
|
if [[ "${key}" == "${index}"* ]]; then |
|
|
|
|
|
eventID="${index}" |
|
|
|
|
|
nodeID="$(awk -F'.' '{print $2}' <<< ${key})" |
|
|
|
|
|
type="$(awk -F'.' '{print $3}' <<< ${key})" |
|
|
|
|
|
# If nodeID is different than currentNodeID, then we just changed the node and need to close the node |
|
|
|
|
|
# We do this only when we are in the same event and not for the first iteration |
|
|
|
|
|
if [[ "${currentNodeID}" != "${nodeID}" && ${currentEvent} == ${index} && "${currentNodeID}" != "" ]]; then |
|
|
|
|
|
echo "[/NODE]" >> ${TXT} |
|
|
|
|
|
echo >> ${TXT} |
|
|
|
|
|
fi |
|
|
|
|
|
# Here type is a story or an out |
|
|
|
|
|
if [[ "${type}" == "story" ]]; then |
|
|
|
|
|
echo "+[NODE]${nodeID}" >> ${TXT} |
|
|
|
|
|
echo "[STORY]" >> ${TXT} |
|
|
|
|
|
echo "${translationArray[${key}]}" >> ${TXT} |
|
|
|
|
|
echo "[/STORY]" >> ${TXT} |
|
|
|
|
|
currentNodeID=${nodeID} |
|
|
|
|
|
currentEvent=${index} |
|
|
|
|
|
else |
|
|
|
|
|
echo "[OUT]${translationArray[${key}]}" >> ${TXT} |
|
|
|
|
|
fi |
|
|
|
|
|
fi |
|
|
|
|
|
done |
|
|
|
|
|
done |
|
|
|
|
|
# At the last of last event, we go outside the loop so we need to close remaining node and event |
|
|
|
|
|
echo "[/NODE]" >> ${TXT} |
|
|
|
|
|
echo >> ${TXT} |
|
|
|
|
|
echo "[/EVENT]" >> ${TXT} |
|
|
|
|
|
echo >> ${TXT} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for index in "${!FILE[@]}"; do |
|
|
|
|
|
line="${FILE[${index}]}" |
|
|
|
|
|
line=${line##\#. } |
|
|
|
|
|
# If the line contains an event, we need to init variables for following compute |
|
|
|
|
|
if [[ ${line} == *"[EVENT]"* ]]; then |
|
|
|
|
|
event="$(awk -F'@@' '{print $1}' <<< ${line})" |
|
|
|
|
|
eventID="$(awk -F'(' '{print $2}' <<< ${event})" |
|
|
|
|
|
eventID="${eventID%%\)}" |
|
|
|
|
|
node="$(awk -F'@@' '{print $2}' <<< ${line})" |
|
|
|
|
|
nodeID="$(awk -F']' '{print $2}' <<< ${node})" |
|
|
|
|
|
eventArray[${eventID}]="${event}" |
|
|
|
|
|
fi |
|
|
|
|
|
if [[ ${line} == *"[STORY]"* ]]; then |
|
|
|
|
|
translation=$(extract_translation "${line}") |
|
|
|
|
|
translationArray["${eventID}.${nodeID}.story"]="${translation}" |
|
|
|
|
|
elif [[ ${line} == *"[OUT]"* ]]; then |
|
|
|
|
|
out="$(awk -F'@@' '{print $3}' <<< ${line})" |
|
|
|
|
|
outID=$(awk -F']' '{print $2}' <<< ${out}) |
|
|
|
|
|
translation=$(extract_translation "${line}") |
|
|
|
|
|
translationArray["${eventID}.${nodeID}.${outID}"]="${translation}" |
|
|
|
|
|
fi |
|
|
|
|
|
done |
|
|
|
|
|
|
|
|
|
|
|
# Now we have 2 arrays: one with all event name, and one with all translation. We can rebuild the original file |
|
|
|
|
|
rebuild_txt |