#!/bin/sh
#
# convert a directory or java property files into po files and back
#
# The content of (translated) po files overrides the content of
# java properties files. Thus it is recommended to use a po file
# editor (e.g. Pootle) as the single primary source of translations.
#
# Java property template files are handled (converted into pot) as well.
#
# This is just the example script used for jsymphonic.
#
# Copyright 2009 - Lars Kruse (devel@sumpfralle.de)
#
# License:
#
#    This package is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 3 of the License, or
#    (at your option) any later version.
#
#    This package is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this package; if not, write to the Free Software
#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
#

set -eu

PROP_DIR="$(dirname $0)/jsymphonic.properties.d"
PO_DIR="$(dirname $0)/jsymphonic.po.d"
POOTLE_DIR=/var/lib/pootle/jsymphonic
TEMP_DIR="$(dirname $0)/temp"
PROP_EXT=".properties"
PROP_LANG_SUFFIX_REGEX="_[a-z]{2}_[A-Z]{2}"
POT_EXT=".pot"
PO_EXT=".po"
POTOOLS_OPTS="--progress none"


get_all_prop_templates() {
	(
		cd "$PROP_DIR"
		find -type f -name "*$PROP_EXT" | grep -vE ".*$PROP_LANG_SUFFIX_REGEX$PROP_EXT$"
	)
}


get_translated_properties() {
	local prop_template="$1"
	(
		cd "$PROP_DIR"
		find -type f -name "*$PROP_EXT" | grep -E "${prop_template%$PROP_EXT}$PROP_LANG_SUFFIX_REGEX$PROP_EXT$"
	)
}


template_prop2po() {
	mkdir -p "$PO_DIR"
	prop2po $POTOOLS_OPTS -P "$PROP_DIR/$1" "$PO_DIR/${1%$PROP_EXT}$POT_EXT"
}


# input: filename of a translated properties file
# output: filename of the properties template file
get_prop_template() {
	echo -n "${1%$PROP_EXT}" | sed -r "s/$PROP_LANG_SUFFIX_REGEX$//g"
	echo "$PROP_EXT"
}


# input: filename of a translated properties file
# output: filename of the corresponding pot template file
get_pot_template() {
	echo -n "${1%$PROP_EXT}" | sed -r "s/$PROP_LANG_SUFFIX_REGEX$//g"
	echo "$POT_EXT"
}


# input: filename of a translated properties file
# output: filename of the corresponding translated po file
get_po_filename() {
	echo "${1%$PROP_EXT}$PO_EXT"
}


convert_to_po_merged() {
	local prop_file="$PROP_DIR/$1"
	local prop_template="$PROP_DIR/$(get_prop_template "$1")"
	local pot_file="$PO_DIR/$(get_pot_template "$1")"
	local po_file="$PO_DIR/$(get_po_filename "$1")"
	local temp_po_file1="$TEMP_DIR/$(get_po_filename "$1")_1.$PO_EXT"
	local temp_po_file2="$TEMP_DIR/$(get_po_filename "$1")_2.$PO_EXT"
	mkdir -p "$TEMP_DIR"
	if test -f "$po_file"; then
		# merge the prop with the po file (priority: po file)
		prop2po $POTOOLS_OPTS -t "$prop_template" -i "$prop_file" -o "$temp_po_file1"
		pomerge $POTOOLS_OPTS --mergeblanks=no -t "$po_file" -i "$temp_po_file1" -o "$temp_po_file2"
		mv "$temp_po_file2" "$po_file"
		rm "$temp_po_file1"
	 else	prop2po $POTOOLS_OPTS -t "$prop_template" -i "$prop_file" -o "$po_file"
	 fi
}


# convert a po file to a prop file
convert_po_to_prop() {
	local prop_file="$PROP_DIR/$1"
	local prop_template="$PROP_DIR/$(get_prop_template "$1")"
	local po_file="$PO_DIR/$(get_po_filename "$1")"
	po2prop $POTOOLS_OPTS -t "$prop_template" -i "$po_file" -o "$prop_file"
}


get_lang_code() {
	echo "$1" | sed -r "s/^.*($PROP_LANG_SUFFIX_REGEX).*$/\1/" | sed 's/^_//' | sed 's/_$//'
}


create_symlink_po() {
	local po_file="$PO_DIR/$(get_po_filename "$1")"
	local lang_code="$(get_lang_code "$1")"
	mkdir -p "$POOTLE_DIR/$lang_code"
	ln -sfn "$(readlink -f "$po_file")" "$POOTLE_DIR/$lang_code/"
}


create_symlink_pot() {
	local pot_file="$PO_DIR/$(get_pot_template "$1")"
	ln -sfn "$(readlink -f "$pot_file")" "$POOTLE_DIR/"
}


# *************** do the conversion ***********************
get_all_prop_templates | while read prop; do
	template_prop2po "$prop"
	create_symlink_pot "$prop"
	get_translated_properties "$prop" | while read prop_file; do
		convert_to_po_merged "$prop_file"
		convert_po_to_prop "$prop_file"
		create_symlink_po "$prop_file"
	 done
 done