package Onis::Language;

use strict;
use warnings;

use Exporter;

use Onis::Config (qw(get_config));

=head1 NAME

Onis::Language - Translate strings to a user-defined language.

=cut

@Onis::Language::EXPORT_OK = qw/translate/;
@Onis::Language::ISA = ('Exporter');

our %Translations = ();

my $VERSION = '$Id: Language.pm 75 2005-04-16 08:14:23Z octo $';
print STDERR $/, __FILE__, ": $VERSION" if ($::DEBUG);

read_language_file ();

return (1);

=head1 CONFIGURATION OPTIONS

=over 4

=item B<language_file>: I<german.lang>;

Tries to open and read the language-definitions from this file. If it fails
(file does not exist, is not readable, uses an unknown syntax and the like) the
default-language, english, will be used.

=back

=cut

sub read_language_file
{
	my $line;
	my $fh;
	my $file = get_config ('language_file');
	
	if (!$file)
	{
		return (1);
	}

	unless (open ($fh, "< $file"))
	{
		print STDERR $/, __FILE__, ": Unable to open language file ``$file''. Will use default-language english.", $/;
		return (0);
	}

	while ($line = <$fh>)
	{
		my @strings = ();

		chomp ($line);

		if ($line =~ m/^((?:"(?:[^\\"]|\\.)*"|[^#])*)#/)
		{
			$line = $1;
		}

		while ($line =~ m/"((?:[^\\"]|\\.)+)"/g)
		{
			push (@strings, $1);
		}

		if (scalar (@strings) < 2)
		{
			next;
		}

		my $key = shift (@strings);
		$Translations{$key} = \@strings;
	}

	close ($fh);
	return (1);
}

=head1 EXPORTED FUNCTIONS

=over 4

=item B<translate> (I<$string>)

Translates the given string using the language file loaded. If no translation
is found returns the original string.

=cut

sub translate
{
	my $string = shift;
	my $retval;

	if (defined ($Translations{$string}))
	{
		my $array = $Translations{$string};

		if (scalar (@$array) == 1)
		{
			$retval = $array->[0];
		}
		else
		{
			my $num = scalar (@$array);
			my $pick = int (rand ($num));

			$retval = $array->[$pick];
		}
	}
	else
	{
		if ($::DEBUG & 0x10)
		{
			$retval = '<span style="color: red; background-color: yellow;">'
			.	$string . '</span>';
		}
		else
		{
			$retval = $string;
		}
	}

	return ($retval);
}

=back

=head1 AUTHOR

Florian octo Forster E<lt>octo at verplant.orgE<gt>

=cut


syntax highlighted by Code2HTML, v. 0.9.1