View | Details | Raw Unified | Return to bug 15395
Collapse All | Expand All

(-)a/C4/Installer/PerlDependencies.pm (-7 / +2 lines)
Lines 697-711 our $PERL_DEPS = { Link Here
697
        required   => 1,
697
        required   => 1,
698
        min_ver    => '2.125',
698
        min_ver    => '2.125',
699
    },
699
    },
700
    'Locale::Maketext' => {
700
    'Locale::Messages' => {
701
        'usage'    => 'Core',
701
        'usage'    => 'Core',
702
        'required' => '1',
702
        'required' => '1',
703
        'min_ver'  => '1.19',
703
        'min_ver'  => '1.20',
704
    },
705
    'Locale::Maketext::Lexicon' => {
706
        'usage'    => 'Core',
707
        'required' => '1',
708
        'min_ver'  => '0.91',
709
    },
704
    },
710
    'LWP::Protocol::https' => {
705
    'LWP::Protocol::https' => {
711
        'usage'    => 'OverDrive integration',
706
        'usage'    => 'OverDrive integration',
(-)a/Koha/I18N.pm (-23 / +118 lines)
Lines 18-58 package Koha::I18N; Link Here
18
# along with Koha; if not, see <http://www.gnu.org/licenses>.
18
# along with Koha; if not, see <http://www.gnu.org/licenses>.
19
19
20
use Modern::Perl;
20
use Modern::Perl;
21
use base qw(Locale::Maketext Exporter);
22
21
23
use CGI;
22
use CGI;
24
use C4::Languages;
23
use C4::Languages;
24
use C4::Context;
25
25
26
use Locale::Maketext::Lexicon {
26
use Encode;
27
    'en' => ['Auto'],
27
use Locale::Util qw(set_locale);
28
    '*' => [
28
use Locale::Messages qw(:locale_h :libintl_h nl_putenv);
29
        Gettext =>
30
            C4::Context->config('intranetdir')
31
            . '/misc/translator/po/*-messages.po'
32
    ],
33
    '_AUTO' => 1,
34
    '_style' => 'gettext',
35
};
36
29
37
our @EXPORT = qw( gettext );
30
use parent 'Exporter';
31
our @EXPORT = qw(
32
    __
33
    __x
34
    __n
35
    __nx
36
    __xn
37
    __p
38
    __px
39
    __np
40
    __npx
41
    N__
42
    N__n
43
    N__p
44
    N__np
45
);
38
46
39
my %language_handles;
47
my $textdomain;
40
48
41
sub get_language_handle {
49
BEGIN {
42
    my $cgi = new CGI;
50
    $textdomain = 'Koha';
43
    my $language = C4::Languages::getlanguage;
44
51
45
    if (not exists $language_handles{$language}) {
52
    my $langtag = C4::Languages::getlanguage;
46
        $language_handles{$language} = __PACKAGE__->get_handle($language)
53
    my @subtags = split /-/, $langtag;
47
            or die "No language handle for '$language'";
54
    my ($language, $region) = @subtags;
55
    if ($region && length $region == 4) {
56
        $region = $subtags[2];
48
    }
57
    }
58
    my $locale = set_locale(LC_ALL, $language, $region, 'utf-8');
59
    unless ($locale) {
60
        set_locale(LC_MESSAGES, 'C');
61
        Locale::Messages->select_package('gettext_pp');
62
        $locale = $language;
63
        if ($region) {
64
            $locale .= '_' . $region;
65
        }
66
        nl_putenv("LANGUAGE=$locale");
67
        nl_putenv("LANG=$locale");
68
        nl_putenv('OUTPUT_CHARSET=utf-8');
69
    }
70
71
    my $directory = C4::Context->config('intranetdir') . '/misc/translator/po';
72
    textdomain($textdomain);
73
    bindtextdomain($textdomain, $directory);
74
}
75
76
sub __ {
77
    my ($msgid) = @_;
78
    my $text = dgettext($textdomain, $msgid);
79
    return __decode($text);
80
}
81
82
sub __x {
83
    my ($msgid, %vars) = @_;
84
    return __expand(__($msgid), %vars);
85
}
86
87
sub __n {
88
    my ($msgid, $msgid_plural, $count) = @_;
89
    my $text = dngettext($textdomain, $msgid, $msgid_plural, $count);
90
    return __decode($text);
91
}
92
93
sub __nx {
94
    my ($msgid, $msgid_plural, $count, %vars) = @_;
95
    return __expand(__n($msgid, $msgid_plural, $count), %vars);
96
}
97
98
sub __xn {
99
    return __nx(@_);
100
}
101
102
sub __p {
103
    my ($msgctxt, $msgid) = @_;
104
    my $text = dpgettext($textdomain, $msgctxt, $msgid);
105
    return __decode($text);
106
}
107
108
sub __px {
109
    my ($msgctxt, $msgid, %vars) = @_;
110
    return __expand(__p($msgctxt, $msgid), %vars);
111
}
112
113
sub __np {
114
    my ($msgctxt, $msgid, $msgid_plural, $count) = @_;
115
    my $text = dnpgettext($textdomain, $msgctxt, $msgid, $msgid_plural, $count);
116
    return __decode($text);
117
}
118
119
sub __npx {
120
    my ($msgctxt, $msgid, $msgid_plural, $count, %vars) = @_;
121
    return __expand(__np($msgctxt, $msgid, $msgid_plural, $count), %vars);
122
}
123
124
sub N__ {
125
    return @_;
126
}
127
128
sub N__n {
129
    return @_;
130
}
131
132
sub N__p {
133
    return @_;
134
}
135
136
sub N__np {
137
    return @_;
138
}
139
140
sub __expand {
141
    my ($text, %vars) = @_;
142
143
    my $re = join '|', map { quotemeta $_ } keys %vars;
144
    $text =~ s/\{($re)\}/defined $vars{$1} ? $vars{$1} : "{$1}"/ge;
49
145
50
    return $language_handles{$language};
146
    return $text;
51
}
147
}
52
148
53
sub gettext {
149
sub __decode {
54
    my $lh = get_language_handle;
150
    return Encode::decode_utf8(shift);
55
    $lh->maketext(@_);
56
}
151
}
57
152
58
1;
153
1;
(-)a/misc/translator/LangInstaller.pm (-10 / +51 lines)
Lines 25-30 use C4::Context; Link Here
25
use YAML::Syck qw( Dump LoadFile );
25
use YAML::Syck qw( Dump LoadFile );
26
use Locale::PO;
26
use Locale::PO;
27
use FindBin qw( $Bin );
27
use FindBin qw( $Bin );
28
use File::Path qw( make_path );
28
29
29
$YAML::Syck::ImplicitTyping = 1;
30
$YAML::Syck::ImplicitTyping = 1;
30
31
Lines 66-78 sub new { Link Here
66
    $self->{process}         = "$Bin/tmpl_process3.pl " . ($verbose ? '' : '-q');
67
    $self->{process}         = "$Bin/tmpl_process3.pl " . ($verbose ? '' : '-q');
67
    $self->{path_po}         = "$Bin/po";
68
    $self->{path_po}         = "$Bin/po";
68
    $self->{po}              = { '' => $default_pref_po_header };
69
    $self->{po}              = { '' => $default_pref_po_header };
69
    $self->{domain}          = 'messages';
70
    $self->{domain}          = 'Koha';
70
    $self->{cp}              = `which cp`;
71
    $self->{cp}              = `which cp`;
71
    $self->{msgmerge}        = `which msgmerge`;
72
    $self->{msgmerge}        = `which msgmerge`;
73
    $self->{msgfmt}          = `which msgfmt`;
72
    $self->{xgettext}        = `which xgettext`;
74
    $self->{xgettext}        = `which xgettext`;
73
    $self->{sed}             = `which sed`;
75
    $self->{sed}             = `which sed`;
74
    chomp $self->{cp};
76
    chomp $self->{cp};
75
    chomp $self->{msgmerge};
77
    chomp $self->{msgmerge};
78
    chomp $self->{msgfmt};
76
    chomp $self->{xgettext};
79
    chomp $self->{xgettext};
77
    chomp $self->{sed};
80
    chomp $self->{sed};
78
81
Lines 462-480 sub create_tmpl { Link Here
462
sub create_messages {
465
sub create_messages {
463
    my $self = shift;
466
    my $self = shift;
464
467
465
    print "Create messages ($self->{lang})\n" if $self->{verbose};
468
    my ($language, $country) = split /-/, $self->{lang};
469
    my $locale = $language;
470
    if ($country) {
471
        $locale .= '_' . $country;
472
    }
473
    my $podir = "$self->{path_po}/$locale/LC_MESSAGES";
474
475
    make_path($podir);
476
    say "Create messages ($locale)" if $self->{verbose};
466
    system
477
    system
467
        "$self->{cp} $self->{domain}.pot " .
478
        "$self->{cp} $self->{domain}.pot " .
468
        "$self->{path_po}/$self->{lang}-$self->{domain}.po";
479
        "$podir/$self->{domain}.po";
469
}
480
}
470
481
471
sub update_messages {
482
sub update_messages {
472
    my $self = shift;
483
    my $self = shift;
473
484
474
    my $pofile = "$self->{path_po}/$self->{lang}-$self->{domain}.po";
485
    my ($language, $country) = split /-/, $self->{lang};
475
    print "Update messages ($self->{lang})\n" if $self->{verbose};
486
    my $locale = $language;
487
    if ($country) {
488
        $locale .= '_' . $country;
489
    }
490
    my $podir = "$self->{path_po}/$locale/LC_MESSAGES";
491
    my $pofile = "$podir/$self->{domain}.po";
492
493
    say "Update messages ($locale)" if $self->{verbose};
476
    if ( not -f $pofile ) {
494
    if ( not -f $pofile ) {
477
        print "File $pofile does not exist\n" if $self->{verbose};
495
        say "File $pofile does not exist" if $self->{verbose};
478
        $self->create_messages();
496
        $self->create_messages();
479
    }
497
    }
480
    system "$self->{msgmerge} -U $pofile $self->{domain}.pot";
498
    system "$self->{msgmerge} -U $pofile $self->{domain}.pot";
Lines 502-509 sub extract_messages { Link Here
502
        }
520
        }
503
    }
521
    }
504
522
505
    my $xgettext_cmd = "$self->{xgettext} -L Perl --from-code=UTF-8 " .
523
    my $xgettext_cmd = "$self->{xgettext} -L Perl --from-code=UTF-8 "
506
        "-o $Bin/$self->{domain}.pot -D $intranetdir";
524
        . "-k -k__ -k__x -k__n:1,2 -k__nx:1,2 -k__xn:1,2 -k__p:1c,2 "
525
        . "-k__px:1c,2 -k__np:1c,2,3 -k__npx:1c,2,3 -kN__ -kN__n:1,2 "
526
        . "-kN__p:1c,2 -kN__np:1c,2,3 "
527
        . "-o $Bin/$self->{domain}.pot -D $intranetdir";
507
    $xgettext_cmd .= " $_" foreach (@files_to_scan);
528
    $xgettext_cmd .= " $_" foreach (@files_to_scan);
508
529
509
    if (system($xgettext_cmd) != 0) {
530
    if (system($xgettext_cmd) != 0) {
Lines 518-529 sub extract_messages { Link Here
518
            die "system call failed: $replace_charset_cmd";
539
            die "system call failed: $replace_charset_cmd";
519
        }
540
        }
520
    } else {
541
    } else {
521
        print "No messages found\n" if $self->{verbose};
542
        say "No messages found" if $self->{verbose};
522
        return;
543
        return;
523
    }
544
    }
524
    return 1;
545
    return 1;
525
}
546
}
526
547
548
sub install_messages {
549
    my ($self) = @_;
550
551
    my ($language, $country) = split /-/, $self->{lang};
552
    my $locale = $language;
553
    if ($country) {
554
        $locale .= '_' . $country;
555
    }
556
    my $podir = "$self->{path_po}/$locale/LC_MESSAGES";
557
    my $pofile = "$podir/$self->{domain}.po";
558
    my $mofile = "$podir/$self->{domain}.mo";
559
560
    say "Install messages ($locale)" if $self->{verbose};
561
    if ( not -f $pofile ) {
562
        say "File $pofile does not exist" if $self->{verbose};
563
        $self->create_messages();
564
    }
565
    system "$self->{msgfmt} -o $mofile $pofile";
566
}
567
527
sub remove_pot {
568
sub remove_pot {
528
    my $self = shift;
569
    my $self = shift;
529
570
Lines 535-540 sub install { Link Here
535
    return unless $self->{lang};
576
    return unless $self->{lang};
536
    $self->install_tmpl($files) unless $self->{pref_only};
577
    $self->install_tmpl($files) unless $self->{pref_only};
537
    $self->install_prefs();
578
    $self->install_prefs();
579
    $self->install_messages();
538
}
580
}
539
581
540
582
541
- 

Return to bug 15395