1#! /usr/bin/env perl 2 3use strict; 4 5use File::Spec; 6 7my $xgettext; 8 9my $code; 10 11BEGIN { 12 my @spec = File::Spec->splitpath(__FILE__); 13 $spec[2] = 'JavaXGettext.java'; 14 my $java_filename = File::Spec->catpath(@spec); 15 open HANDLE, "<$java_filename" 16 or die "Cannot open '$java_filename': $!\n"; 17 $code = join '', <HANDLE>; 18} 19 20use Inline Java => $code; 21 22Locale::XGettext::Language::Java->newFromArgv(\@ARGV)->run->output; 23 24package Locale::XGettext::Language::Java; 25 26use strict; 27 28use base 'Locale::XGettext'; 29 30sub newFromArgv { 31 my ($class, @args) = @_; 32 33 my $self = $xgettext = {}; 34 bless $self, $class; 35 36 $self->{__helper} = JavaXGettext->new; 37 38 $self->SUPER::newFromArgv(@args); 39 40 return $self; 41} 42 43sub readFile { 44 my ($self, $filename) = @_; 45 46 $self->{__helper}->readFile($filename); 47} 48 49# See the comments in JavaXGettext.java for more information about the 50# following optional methods. 51sub extractFromNonFiles { 52 my ($self) = @_; 53 54 return $self->SUPER::extractFromNonFiles() 55 if !$self->can('extractFromNonFiles'); 56 57 return $self->{__helper}->extractFromNonFiles; 58} 59 60# We have to translate that from Java. 61sub defaultKeywords { 62 my ($self) = @_; 63 64 return $self->SUPER::defaultKeywords() 65 if !$self->{__helper}->can('defaultKeywords'); 66 67 return $self->{__helper}->defaultKeywords; 68 69 # Turn the array of arrays returned by the Java class method into a Perl 70 # Hash. The array returned from Java is an Inline::Java::Array which 71 # does not support splice(). We therefore have to copy it into a 72 # plain array. 73 my %keywords = map { 74 my @keyword = @{$_}; 75 $keyword[0] => [splice @keyword, 1] 76 } @{$self->{__helper}->defaultKeywords}; 77 78 return \%keywords; 79} 80 81sub languageSpecificOptions { 82 my ($self) = @_; 83 84 return $self->SUPER::extractFromNonFiles() 85 if !$self->{__helper}->can('languageSpecificOptions'); 86 87 return $self->{__helper}->languageSpecificOptions; 88} 89 90sub fileInformation { 91 my ($self) = @_; 92 93 return $self->SUPER::fileInformation() 94 if !$self->{__helper}->can('fileInformation'); 95 96 return $self->{__helper}->fileInformation; 97} 98 99sub canExtractAll { 100 my ($self) = @_; 101 102 return $self->SUPER::canExtractAll() 103 if !$self->{__helper}->can('canExtractAll'); 104 105 return $self->{__helper}->canExtractAll; 106} 107 108sub canKeywords { 109 my ($self) = @_; 110 111 return $self->SUPER::canKeywords() 112 if !$self->{__helper}->can('canKeywords'); 113 114 return $self->{__helper}->canKeywords; 115} 116 117sub canFlags { 118 my ($self) = @_; 119 120 return $self->SUPER::canFlags() 121 if !$self->{__helper}->can('canFlags'); 122 123 return $self->{__helper}->canFlags; 124} 125 126# This will not win a prize for clean software design. You cannot invoke 127# methods of Perl object from Java. We therefore keep the most "current" 128# instance of the extractor class in a variable $xgettext and call 129# the methods on this instance. This works without problems inside of a 130# script which is sufficient for our needs. 131 132package Locale::XGettext::Callbacks; 133 134use strict; 135 136use Scalar::Util qw(reftype); 137 138sub __unbless($); 139 140sub addEntry { 141 my ($class, %entry) = @_; 142 143 $xgettext->addEntry(\%entry); 144 145 return 1; 146} 147 148sub option { 149 my ($class, $name) = @_; 150 151 return $xgettext->option($name); 152} 153 154sub keywords { 155 my ($class) = @_; 156 157 my $keywords = JavaXGettextKeywords->new; 158 my $value = $xgettext->keywords; 159 160 foreach my $key (keys %$value) { 161 my $perldef = $value->{$key}; 162 my $javadef = JavaXGettextKeyword->new( 163 $perldef->function, 164 $perldef->singular, $perldef->plural, 165 $perldef->context, $perldef->comment 166 ); 167 168 $keywords->put($key, $javadef); 169 } 170 171 return $keywords; 172}