summaryrefslogtreecommitdiffstats
path: root/lib/Locale/POFileManager/File.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Locale/POFileManager/File.pm')
-rw-r--r--lib/Locale/POFileManager/File.pm26
1 files changed, 24 insertions, 2 deletions
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;
}