Lirama::Loc3
[perl/loc/.git] / Lirama / Loc3.pm
diff --git a/Lirama/Loc3.pm b/Lirama/Loc3.pm
new file mode 100644 (file)
index 0000000..2a89689
--- /dev/null
@@ -0,0 +1,124 @@
+package Lirama::Loc3;
+
+use strict;
+use warnings;
+
+our $VERSION = '3.00';
+
+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 @{$this->{-langpref}};
+} # loc
+
+sub TIEHASH {
+       #todo: set -path
+       return bless $_[1], $_[0];  # bless the l10n hash
+}
+
+sub FETCH {
+       my $this = shift;
+       # get setting (denoted by leading dash)
+       return wantarray ? @{$this->{$_[0]}} : $this->{$_[0]}->[0]
+               if $_[0] eq "-langpref";
+       return $this->{$_[0]}
+               if $_[0] eq "-path";
+       # array ref used for passing arguments
+       @_ = @{$_[0]} if ref $_[0] eq "ARRAY";
+       # get localized string by identifier
+       local $_ = shift;
+       # add default path unless specified
+       $_ = $this->{-path} . '_' . $_ unless /_/;
+                       #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->{$_};
+       #todo: else remove path
+       # adaptive string (code)
+       $_ = $_->(@_) if ref $_ eq "CODE";
+       # static output if no arguments given
+       return $_ unless @_;  # unnecessary but faster for common case
+       # dynamic output
+       return sprintf $_, @_;
+} # FETCH
+
+sub STORE {
+       my ($this, $option, $val) = @_;
+       if ($option eq "-langpref") {
+               # set order of languages (prefered language first)
+               $this->{$option} = $val;
+       } # -langpref
+       else {
+               $this->{$option} = $val;
+#              $_[0]->{$_[1]} = $_[2];
+       }
+} # STORE
+
+# Same as found in Tie::StdHash
+
+#todo: make path-aware
+sub EXISTS   { exists $_[0]->{$_[1]} }
+sub FIRSTKEY { my $a = scalar keys %{$_[0]}; each %{$_[0]} }
+sub NEXTKEY  { each %{$_[0]} }
+
+1;
+
+__END__
+
+
+=head1 NAME
+
+Lirama::Loc3 - Localize strings
+
+=head1 SYNOPSIS
+
+       use Lirama::Loc3;
+
+       tie my %loc, "Lirama::Loc3", {
+               _test => {
+                       en => "this is a test",
+                       eo => "cxi tio estas testo",
+               },
+       };
+
+       $loc{-langpref} = [qw/nl en eo/];  # prefer I<nl> (dutch) texts
+       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;
+even though non-existing strings still return themselves.
+
+=back
+
+=head1 SEE ALSO
+
+L<Lirama::Loc3::Auto|Lirama::Loc3::Auto>
+
+L<Locale::Maketext|Locale::Maketext>
+
+=head1 AUTHOR
+
+Mischa POSLAWSKY <shiar@shiar.org>
+
+Copyright 2005 Mischa POSLAWSKY. All rights reserved.
+
+=cut