Lirama::Loc3
[perl/loc/.git] / Lirama / Loc3.pm
similarity index 63%
rename from Lirama/Loc2.pm
rename to Lirama/Loc3.pm
index 0ea0410796560e38b13c5e45eb866c4ba572209c..2a89689b099dc9711d7c01f5364626faa7177193 100644 (file)
@@ -1,22 +1,9 @@
-package Lirama::Loc2;
+package Lirama::Loc3;
 
 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];
-}
+our $VERSION = '3.00';
 
 sub loc($) {
        my $this = shift;
@@ -24,35 +11,54 @@ sub loc($) {
        # 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;
-}
+       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;
-                       # custom expand: get preferred language from given hash
-               #       return $this->loc($_[0]) if ref $_[0] eq "HASH";  # deprecated in favor of loc()
+       # 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->{$_};
-#      $_ = 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
+       #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]} }
@@ -64,21 +70,20 @@ __END__
 
 =head1 NAME
 
-Lirama::Loc - Localize strings
+Lirama::Loc3 - Localize strings
 
 =head1 SYNOPSIS
 
-       use Lirama::Loc;
-
-       langpref(qw/nl en eo/);  # prefer I<nl> (dutch) texts
+       use Lirama::Loc3;
 
-       tie my %loc, "Lirama::Loc", {
-               test => {
+       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
@@ -99,14 +104,14 @@ may yet be a very bad idea (does it work correctly in modperl?)
 
 =item C<exists>
 
-True if identifier is localized; non-existing strings still return
-themselves, so in standard meaning everything would exist.
+True if identifier is localized;
+even though non-existing strings still return themselves.
 
 =back
 
 =head1 SEE ALSO
 
-L<Lirama::Loc::Auto|Lirama::Loc::Auto>
+L<Lirama::Loc3::Auto|Lirama::Loc3::Auto>
 
 L<Locale::Maketext|Locale::Maketext>