From 8d09a801541287ac0c3fc20ed7a16eef765f0759 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Fri, 19 Feb 2010 11:41:45 -0600 Subject: allow setting defaults for the generated stub msgstrs --- dist.ini | 1 + lib/Locale/POFileManager.pm | 40 ++++++++++++++++++++++++++++++++++++++-- lib/Locale/POFileManager/File.pm | 26 ++++++++++++++++++++++++-- 3 files changed, 63 insertions(+), 4 deletions(-) diff --git a/dist.ini b/dist.ini index 6465afd..9e39c9f 100644 --- a/dist.ini +++ b/dist.ini @@ -12,3 +12,4 @@ List::MoreUtils = 0 Locale::PO = 0 Moose = 0.90 MooseX::Types::Path::Class = 0 +Scalar::Util = 0 diff --git a/lib/Locale/POFileManager.pm b/lib/Locale/POFileManager.pm index 67a63d9..ea906c1 100644 --- a/lib/Locale/POFileManager.pm +++ b/lib/Locale/POFileManager.pm @@ -1,6 +1,7 @@ package Locale::POFileManager; use Moose; use MooseX::Types::Path::Class qw(Dir); +use Scalar::Util qw(reftype weaken); =head1 NAME @@ -44,7 +45,11 @@ sub _build_files { for my $file ($dir->children) { next if $file->is_dir; next unless $file->stringify =~ /\.po$/; - push @files, Locale::POFileManager::File->new(file => $file); + my $msgstr = $self->stub_msgstr; + push @files, Locale::POFileManager::File->new( + file => $file, + defined($msgstr) ? (stub_msgstr => $msgstr) : (), + ); } return \@files; @@ -56,6 +61,12 @@ has canonical_language => ( required => 1, # TODO: make this not required at some point? ); +has _stub_msgstr => ( + is => 'ro', + isa => 'Str|CodeRef', + init_arg => 'stub_msgstr', +); + sub BUILD { my $self = shift; @@ -63,6 +74,27 @@ sub BUILD { unless $self->has_language($self->canonical_language); } +sub stub_msgstr { + my $self = shift; + my $msgstr = $self->_stub_msgstr; + return unless defined($msgstr); + return $msgstr if !reftype($msgstr); + my $weakself = $self; + weaken($weakself); + return sub { + my %args = @_; + my $canonical_msgstr; + $canonical_msgstr = + $weakself->canonical_language_file->entry_for($args{msgid})->msgstr + if $weakself; + $canonical_msgstr =~ s/^"|"$//g if defined($canonical_msgstr); + return $msgstr->( + %args, + defined($canonical_msgstr) ? (canonical_msgstr => $canonical_msgstr) : (), + ); + } +} + sub has_language { my $self = shift; my ($lang) = @_; @@ -84,7 +116,11 @@ sub add_language { confess("Can't overwrite existing language file for $lang") if -e $file->stringify; - my $pofile = Locale::POFileManager::File->new(file => $file); + my $msgstr = $self->stub_msgstr; + my $pofile = Locale::POFileManager::File->new( + file => $file, + defined($msgstr) ? (stub_msgstr => $msgstr) : (), + ); $pofile->save; $self->_add_file($pofile); diff --git a/lib/Locale/POFileManager/File.pm b/lib/Locale/POFileManager/File.pm index 9f736bc..acdd0aa 100644 --- a/lib/Locale/POFileManager/File.pm +++ b/lib/Locale/POFileManager/File.pm @@ -4,6 +4,7 @@ use Moose; use MooseX::Types::Path::Class qw(File); use List::MoreUtils qw(any); use Locale::PO; +use Scalar::Util qw(reftype); has file => ( is => 'ro', @@ -12,6 +13,11 @@ has file => ( required => 1, ); +has stub_msgstr => ( + is => 'ro', + isa => 'Str|CodeRef', +); + has entries => ( traits => [qw(Array)], isa => 'ArrayRef[Locale::PO]', @@ -32,6 +38,12 @@ sub _build_entries { return (-r $filename) ? Locale::PO->load_file_asarray($filename) : []; } +sub entry_for { + my $self = shift; + my ($msgid) = @_; + return grep { $_->msgid eq $msgid } $self->entries; +} + sub save { my $self = shift; @@ -63,8 +75,18 @@ sub add_stubs_from { my $self = shift; my ($other) = @_; - $self->add_entry($_) for map { Locale::PO->new(-msgid => $_) } - $self->find_missing_from($other); + for my $missing ($self->find_missing_from($other)) { + my $msgstr = $self->stub_msgstr; + if (reftype($msgstr) && reftype($msgstr) eq 'CODE') { + $msgstr = $msgstr->(lang => $self->language, msgid => $missing); + } + my $entry = Locale::PO->new( + -msgid => $missing, + defined($msgstr) ? (-msgstr => $msgstr) : (), + ); + $self->add_entry($entry); + } + $self->save; } -- cgit v1.2.3-54-g00ecf