Locale::Maketext - Import dev changes from CPAN
authorTodd Rinaldo <toddr@cpan.org>
Tue, 28 Sep 2010 17:28:50 +0000 (12:28 -0500)
committerFather Chrysostomos <sprout@cpan.org>
Tue, 28 Sep 2010 18:24:14 +0000 (11:24 -0700)
This patch imports the changes which are on CPAN but not already
pulled into blead for Locale::Maketext.

1. New test file t/70_fail_auto.t - Test for CPAN RT #25877
2. Fix for RT25877 (Logic fix tested in 70_fail_auto.t)
3. Convert t/30_local.t to Test::More (the other files were already
   done in blead. This one was missed.
4. Add a cookbook pod file.
5. Changelog entries which were on CPAN but not in blead.

dist/Locale-Maketext/ChangeLog
dist/Locale-Maketext/lib/Locale/Maketext.pm
dist/Locale-Maketext/lib/Locale/Maketext/Cookbook.pod [new file with mode: 0644]
dist/Locale-Maketext/t/30_local.t
dist/Locale-Maketext/t/70_fail_auto.t [new file with mode: 0644]

index 2398704..16891a1 100644 (file)
@@ -20,6 +20,25 @@ Revision history for Perl suite Locale::Maketext
 
     Convert the odd Locale::Maketext test out from Test to Test::More.
 
+2009-06-23  Adriano Ferreira
+    * Development release 1.13_82
+
+    One more recipe: on [numf,...] with decimal precision
+
+2009-06-23  Adriano Ferreira
+    * Development release 1.13_81
+
+    Change a few straggling 'DEBUG and print' to 'DEBUG and warn' (thanks Dan Muey)
+
+    A start of a cookbook.
+
+2009-06-23  Adriano Ferreira
+    * Development release 1.13_80
+
+    Fixes CPAN RT #25877 (thanks imacat)
+
+    Add a test for failure_handler_auto()
+
 2008-05-28  Adriano Ferreira
     * Release 1.13
 
index 4436be1..5479a60 100644 (file)
@@ -148,8 +148,7 @@ sub failure_handler_auto {
     $handle->{'failure_lex'} ||= {};
     my $lex = $handle->{'failure_lex'};
 
-    my $value;
-    $lex->{$phrase} ||= ($value = $handle->_compile($phrase));
+    my $value ||= ($lex->{$phrase} ||= $handle->_compile($phrase));
 
     # Dumbly copied from sub maketext:
     return ${$value} if ref($value) eq 'SCALAR';
diff --git a/dist/Locale-Maketext/lib/Locale/Maketext/Cookbook.pod b/dist/Locale-Maketext/lib/Locale/Maketext/Cookbook.pod
new file mode 100644 (file)
index 0000000..6063b0f
--- /dev/null
@@ -0,0 +1,150 @@
+# This document contains text in Perl "POD" format.
+# Use a POD viewer like perldoc or perlman to render it.
+
+=encoding utf-8
+
+=head1 NAME
+
+Locale::Maketext::Cookbook - recipes for using Locale::Maketext
+
+=head1 INTRODUCTION
+
+This is a work in progress. Not much progress by now :-)
+
+=head1 ONESIDED LEXICONS
+
+I<Adapted from a suggestion by Dan Muey>
+
+It may be common (for example at your main lexicon) that
+the hash keys and values coincide. Like that
+
+    q{Hello, tell me your name} 
+      => q{Hello, tell me your name}
+
+It would be nice to just write:
+
+    q{Hello, tell me your name} => ''
+
+and have this magically inflated to the first form.
+Among the advantages of such representation, that would
+lead to  
+smaller files, less prone to mistyping or mispasting, 
+and handy to someone translating it which can simply 
+copy the main lexicon and enter the translation 
+instead of having to remove the value first.
+
+That can be achieved by overriding C<init>
+in your class and working on the main lexicon
+with code like that:
+
+    package My::I18N;
+    ...
+
+    sub init {
+        my $lh = shift; # a newborn handle
+        $lh->SUPER::init();
+        inflate_lexicon(\%My::I18N::en::Lexicon);
+        return;
+    }
+
+    sub inflate_lexicon {
+        my $lex = shift;
+        while (my ($k, $v) = each %$lex) {
+            $v = $k if !defined $v || $v eq '';
+        }
+    }
+
+Here we are assuming C<My::I18N::en> to own the
+main lexicon.
+
+There are some downsides here: the size economy
+will not stand at runtime after this C<init()>
+runs. But it should not be that critical, since
+if you don't have space for that, you won't have
+space for any other language besides the main one
+as well. You could do that too with ties,
+expanding the value at lookup time which
+should be more time expensive as an option.
+
+=head1 DECIMAL PLACES IN NUMBER FORMATTING
+
+I<After CPAN RT #36136 (https://rt.cpan.org/Ticket/Display.html?id=36136)>
+
+The documentation of L<Locale::Maketext> advises that 
+the standard bracket method C<numf> is limited and that
+you must override that for better results. It even
+suggests the use of L<Number::Format>.
+
+One such defect of standard C<numf> is to not be
+able to use a certain decimal precision.
+For example, 
+
+    $lh->maketext('pi is [numf,_1]', 355/113);
+
+outputs
+
+    pi is 3.14159292035398 
+
+Since pi ≈ 355/116 is only accurate 
+to 6 decimal places, you would want to say:
+
+    $lh->maketext('pi is [numf,_1,6]', 355/113); 
+
+and get "pi is 3.141592".
+
+One solution for that could use C<Number::Format>
+like that:
+
+    package Wuu;
+
+    use base qw(Locale::Maketext);
+
+    use Number::Format;
+
+    # can be overriden according to language conventions
+    sub _numf_params {
+        return (
+            -thousands_sep  => '.',
+            -decimal_point  => ',',
+            -decimal_digits => 2,
+        );
+    }
+
+    # builds a Number::Format
+    sub _numf_formatter {
+        my ($lh, $scale) = @_;
+        my @params = $lh->_numf_params;
+        if ($scale) { # use explicit scale rather than default
+            push @params, (-decimal_digits => $scale);
+        }
+        return Number::Format->new(@params);
+    }
+
+    sub numf {
+        my ($lh, $n, $scale) = @_;
+        # get the (cached) formatter
+        my $nf = $lh->{__nf}{$scale} ||= $lh->_numf_formatter($scale);
+        # format the number itself
+        return $nf->format_number($n);
+    }
+
+    package Wuu::pt;
+
+    use base qw(Wuu);
+
+and then 
+
+    my $lh = Wuu->get_handle('pt');
+    $lh->maketext('A [numf,_1,3] km de distância', 1550.2222);
+
+would return "A 1.550,222 km de distância".
+
+Notice that the standard utility methods of 
+C<Locale::Maketext> are irremediably limited
+because they could not aim to do everything
+that could be expected from them in different languages,
+cultures and applications. So extending C<numf>,
+C<quant>, and C<sprintf> is natural as soon
+as your needs exceed what the standard ones do.
+
+
index 8b89777..23fa2ac 100644 (file)
@@ -2,12 +2,8 @@
 
 use strict;
 
-use Test::More tests => 4;
+use Test::More tests => 3;
 use Locale::Maketext;
-print "# Hi there...\n";
-pass();
-
-print "# --- Making sure that Perl globals are localized ---\n";
 
 # declare a class...
 {
@@ -20,11 +16,8 @@ print "# --- Making sure that Perl globals are localized ---\n";
 }
 
 my $lh = Woozle->new();
-ok(ref $lh, 'Basic sanity');
+isa_ok($lh, 'Woozle');
 
 $@ = 'foo';
-is($lh->maketext('Eval error: [_1]', $@), 'Eval error: foo',
-  'Make sure $@ is localized');
-
-print "# Byebye!\n";
-pass();
+is($lh->maketext('Eval error: [_1]', $@), 'Eval error: foo', "Make sure \$@ is localized when passed to maketext");
+is($@, 'foo', "\$@ wasn't modified during call");
diff --git a/dist/Locale-Maketext/t/70_fail_auto.t b/dist/Locale-Maketext/t/70_fail_auto.t
new file mode 100644 (file)
index 0000000..44fe54d
--- /dev/null
@@ -0,0 +1,32 @@
+#!/usr/bin/perl -Tw
+
+use strict;
+use Test::More tests => 5;
+
+BEGIN {
+    use_ok( 'Locale::Maketext' );
+}
+
+{
+    package Whunk::L10N;
+    use vars qw(@ISA);
+    @ISA =  'Locale::Maketext';
+}
+
+{
+    package Whunk::L10N::en;
+    use vars qw(@ISA);
+    @ISA = 'Whunk::L10N';
+}
+
+my $lh = Whunk::L10N->get_handle('en');
+$lh->fail_with('failure_handler_auto');
+
+is($lh->maketext('abcd'), 'abcd', "simple missing keys are handled"); 
+is($lh->maketext('abcd'), 'abcd', "even in repeated calls"); 
+# CPAN RT #25877 - $value Not Set After Second Call to failure_handler_auto()
+
+is($lh->maketext('Hey, [_1]', 'you'), 'Hey, you', "keys with bracket notation ok");
+
+is($lh->maketext('_key'), '_key', "keys which start with _ ok");
+