Bug 8044: new module for translating strings in Perl source files
You have to use the new module Koha::I18N Code example: use Koha::I18N; use CGI; my $input = new CGI; my $lh = Koha::I18N->get_handle_from_context($input, 'intranet'); print $lh->maketext("Localized string!"); PO files are in misc/translator/po/LANG-messages.po. Creation of PO files are integrated to existing workflow, so to create PO file for a language, just run in misc/translator: ./translate create LANG To update: ./translate update LANG You can then translate the PO with your favorite editor. Strings will be localized at runtime. Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl> Works as advertised. Some details needing further attention noted on bug report. Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Signed-off-by: Galen Charlton <gmc@esilibrary.com>
This commit is contained in:
parent
cf7d0c3a99
commit
114f3dd499
2 changed files with 100 additions and 0 deletions
34
Koha/I18N.pm
Normal file
34
Koha/I18N.pm
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
package Koha::I18N;
|
||||||
|
|
||||||
|
use base qw(Locale::Maketext);
|
||||||
|
|
||||||
|
use C4::Templates;
|
||||||
|
use C4::Context;
|
||||||
|
|
||||||
|
use Locale::Maketext::Lexicon {
|
||||||
|
'en' => ['Auto'],
|
||||||
|
'*' => [
|
||||||
|
Gettext =>
|
||||||
|
C4::Context->config('intranetdir')
|
||||||
|
. '/misc/translator/po/*-messages.po'
|
||||||
|
],
|
||||||
|
'_AUTO' => 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
sub get_handle_from_context {
|
||||||
|
my ($class, $cgi, $interface) = @_;
|
||||||
|
|
||||||
|
my $lh;
|
||||||
|
my $lang = C4::Templates::getlanguage($cgi, $interface);
|
||||||
|
if ($lang) {
|
||||||
|
$lh = $class->get_handle($lang)
|
||||||
|
or die "No language handle for '$lang'";
|
||||||
|
} else {
|
||||||
|
$lh = $class->get_handle()
|
||||||
|
or die "Can't get a language handle";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $lh;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
|
@ -66,6 +66,13 @@ sub new {
|
||||||
$self->{process} = "$Bin/tmpl_process3.pl " . ($verbose ? '' : '-q');
|
$self->{process} = "$Bin/tmpl_process3.pl " . ($verbose ? '' : '-q');
|
||||||
$self->{path_po} = "$Bin/po";
|
$self->{path_po} = "$Bin/po";
|
||||||
$self->{po} = { '' => $default_pref_po_header };
|
$self->{po} = { '' => $default_pref_po_header };
|
||||||
|
$self->{domain} = 'messages';
|
||||||
|
$self->{cp} = `which cp`;
|
||||||
|
$self->{msgmerge} = `which msgmerge`;
|
||||||
|
$self->{xgettext} = `which xgettext`;
|
||||||
|
chomp $self->{cp};
|
||||||
|
chomp $self->{msgmerge};
|
||||||
|
chomp $self->{xgettext};
|
||||||
|
|
||||||
# Get all .pref file names
|
# Get all .pref file names
|
||||||
opendir my $fh, $self->{path_pref_en};
|
opendir my $fh, $self->{path_pref_en};
|
||||||
|
@ -423,6 +430,59 @@ sub create_tmpl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub create_messages {
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
system
|
||||||
|
"$self->{cp} $self->{domain}.pot " .
|
||||||
|
"$self->{path_po}/$self->{lang}-$self->{domain}.po";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub update_messages {
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
system
|
||||||
|
"$self->{msgmerge} -U " .
|
||||||
|
"$self->{path_po}/$self->{lang}-$self->{domain}.po " .
|
||||||
|
"$self->{domain}.pot";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub extract_messages {
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
my $intranetdir = $self->{context}->config('intranetdir');
|
||||||
|
my @files_to_scan;
|
||||||
|
my @directories_to_scan = ('.');
|
||||||
|
my @blacklist = qw(blib koha-tmpl skel tmp t);
|
||||||
|
while (@directories_to_scan) {
|
||||||
|
my $dir = shift @directories_to_scan;
|
||||||
|
opendir DIR, "$intranetdir/$dir" or die "Unable to open $dir: $!";
|
||||||
|
foreach my $entry (readdir DIR) {
|
||||||
|
next if $entry =~ /^\./;
|
||||||
|
my $relentry = "$dir/$entry";
|
||||||
|
$relentry =~ s|^\./||;
|
||||||
|
if (-d "$intranetdir/$relentry" and not grep /^$relentry$/, @blacklist) {
|
||||||
|
push @directories_to_scan, "$relentry";
|
||||||
|
} elsif (-f "$intranetdir/$relentry" and $relentry =~ /(pl|pm)$/) {
|
||||||
|
push @files_to_scan, "$relentry";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my $xgettext_cmd = "$self->{xgettext} -L Perl --from-code=UTF-8 " .
|
||||||
|
"-kmaketext -o $Bin/$self->{domain}.pot -D $intranetdir";
|
||||||
|
$xgettext_cmd .= " $_" foreach (@files_to_scan);
|
||||||
|
|
||||||
|
if (system($xgettext_cmd) != 0) {
|
||||||
|
die "system call failed: $xgettext_cmd";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub remove_pot {
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
unlink "$Bin/$self->{domain}.pot";
|
||||||
|
}
|
||||||
|
|
||||||
sub install {
|
sub install {
|
||||||
my ($self, $files) = @_;
|
my ($self, $files) = @_;
|
||||||
|
@ -444,11 +504,14 @@ sub get_all_langs {
|
||||||
sub update {
|
sub update {
|
||||||
my ($self, $files) = @_;
|
my ($self, $files) = @_;
|
||||||
my @langs = $self->{lang} ? ($self->{lang}) : $self->get_all_langs();
|
my @langs = $self->{lang} ? ($self->{lang}) : $self->get_all_langs();
|
||||||
|
$self->extract_messages();
|
||||||
for my $lang ( @langs ) {
|
for my $lang ( @langs ) {
|
||||||
$self->set_lang( $lang );
|
$self->set_lang( $lang );
|
||||||
$self->update_tmpl($files) unless $self->{pref_only};
|
$self->update_tmpl($files) unless $self->{pref_only};
|
||||||
$self->update_prefs();
|
$self->update_prefs();
|
||||||
|
$self->update_messages();
|
||||||
}
|
}
|
||||||
|
$self->remove_pot();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -457,6 +520,9 @@ sub create {
|
||||||
return unless $self->{lang};
|
return unless $self->{lang};
|
||||||
$self->create_tmpl($files) unless $self->{pref_only};
|
$self->create_tmpl($files) unless $self->{pref_only};
|
||||||
$self->create_prefs();
|
$self->create_prefs();
|
||||||
|
$self->extract_messages();
|
||||||
|
$self->create_messages();
|
||||||
|
$self->remove_pot();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue