package Lirama::Loc2;

use strict;
use warnings;
use utf8; #todo: does it even matter?

our $VERSION = '2.00';

require Exporter;
our @ISA       = qw(Exporter);
our @EXPORT    = qw(langpref);
our @EXPORT_OK = qw(loc);

our @langpref;# = qw(en eo nl sv el hu de fr ru kr);

sub langpref {
	@langpref = @_ if @_;  # set order of languages (prefered language first)
	return wantarray ? @langpref : $langpref[0];
}

sub loc($) {
	my $this = shift;
	# get one value from a hash of multiple options
	# if it isn't, we're done already:
	ref $_[0] eq "HASH" or return $_[0];
	# localize to most preferred language
	defined $_[0]{$_} and return $_[0]{$_} for @langpref;
}

sub TIEHASH {
	return bless $_[1], $_[0];  # bless the l10n hash
}

sub FETCH {
	my $this = shift;
			# custom expand: get preferred language from given hash
		#	return $this->loc($_[0]) if ref $_[0] eq "HASH";  # deprecated in favor of loc()
	# array ref used for passing arguments
	@_ = @{$_[0]} if ref $_[0] eq "ARRAY";
	# get localized string by identifier
	local $_ = shift;
			#todo: shouldn't occur - find out where this is done, then fix and remove this check
		#	defined $_ or return '';
	$_ = $this->loc($this->{$_}) if exists $this->{$_};
#	$_ = ref $this->{$_} eq "HASH" ? $this->loc($this->{$_}) : $this->{$_} if exists $this->{$_};
	# static output if no arguments given
	return $_ unless @_;  # unnecessary but faster for common case
	# adaptive string (code)
	$_ = $_->(@_) if ref $_ eq "CODE";
	# dynamic output
	return sprintf $_, @_;
}

# Same as found in Tie::StdHash

sub EXISTS   { exists $_[0]->{$_[1]} }
sub FIRSTKEY { my $a = scalar keys %{$_[0]}; each %{$_[0]} }
sub NEXTKEY  { each %{$_[0]} }

1;

__END__


=head1 NAME

Lirama::Loc - Localize strings

=head1 SYNOPSIS

	use Lirama::Loc;

	langpref(qw/nl en eo/);  # prefer I<nl> (dutch) texts

	tie my %loc, "Lirama::Loc", {
		test => {
			en => "this is a test",
			eo => "cxi tio estas testo",
		},
	};

	print $loc{test};  # "this is a test", since dutch is unavailable

=head1 DESCRIPTION

Returns a text in the most preferred language available.
Mainly intended for translation of different strings on a website.

=over 4

=item C<langpref>

Shared so we only have to set one var to change all translations;
may yet be a very bad idea (does it work correctly in modperl?)

=item C<tie>

=item C<loc>

=item C<exists>

True if identifier is localized; non-existing strings still return
themselves, so in standard meaning everything would exist.

=back

=head1 SEE ALSO

L<Lirama::Loc::Auto|Lirama::Loc::Auto>

L<Locale::Maketext|Locale::Maketext>

=head1 AUTHOR

Mischa POSLAWSKY <shiar@shiar.org>

Copyright 2005 Mischa POSLAWSKY. All rights reserved.

=cut
