summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2010-02-19 11:41:45 -0600
committerJesse Luehrs <doy@tozt.net>2010-02-19 16:09:40 -0600
commit8d09a801541287ac0c3fc20ed7a16eef765f0759 (patch)
tree0941f9fa29b71b01b8fce51c76193918f0e71667
parentde5936a4d6e04b8824328f325a7efeeb81a04d94 (diff)
downloadlocale-pofilemanager-8d09a801541287ac0c3fc20ed7a16eef765f0759.tar.gz
locale-pofilemanager-8d09a801541287ac0c3fc20ed7a16eef765f0759.zip
allow setting defaults for the generated stub msgstrs
-rw-r--r--dist.ini1
-rw-r--r--lib/Locale/POFileManager.pm40
-rw-r--r--lib/Locale/POFileManager/File.pm26
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;
}