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

(-)a/C4/Installer/PerlDependencies.pm (-7 / +2 lines)
Lines 722-736 our $PERL_DEPS = { Link Here
722
        required   => 1,
722
        required   => 1,
723
        min_ver    => '2.125',
723
        min_ver    => '2.125',
724
    },
724
    },
725
    'Locale::Maketext' => {
725
    'Locale::Messages' => {
726
        'usage'    => 'Core',
726
        'usage'    => 'Core',
727
        'required' => '1',
727
        'required' => '1',
728
        'min_ver'  => '1.19',
728
        'min_ver'  => '1.20',
729
    },
730
    'Locale::Maketext::Lexicon' => {
731
        'usage'    => 'Core',
732
        'required' => '1',
733
        'min_ver'  => '0.91',
734
    },
729
    },
735
    'LWP::Protocol::https' => {
730
    'LWP::Protocol::https' => {
736
        'usage'    => 'OverDrive integration',
731
        '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 471-489 sub create_tmpl { Link Here
471
sub create_messages {
474
sub create_messages {
472
    my $self = shift;
475
    my $self = shift;
473
476
474
    print "Create messages ($self->{lang})\n" if $self->{verbose};
477
    my ($language, $country) = split /-/, $self->{lang};
478
    my $locale = $language;
479
    if ($country) {
480
        $locale .= '_' . $country;
481
    }
482
    my $podir = "$self->{path_po}/$locale/LC_MESSAGES";
483
484
    make_path($podir);
485
    say "Create messages ($locale)" if $self->{verbose};
475
    system
486
    system
476
        "$self->{cp} $self->{domain}.pot " .
487
        "$self->{cp} $self->{domain}.pot " .
477
        "$self->{path_po}/$self->{lang}-$self->{domain}.po";
488
        "$podir/$self->{domain}.po";
478
}
489
}
479
490
480
sub update_messages {
491
sub update_messages {
481
    my $self = shift;
492
    my $self = shift;
482
493
483
    my $pofile = "$self->{path_po}/$self->{lang}-$self->{domain}.po";
494
    my ($language, $country) = split /-/, $self->{lang};
484
    print "Update messages ($self->{lang})\n" if $self->{verbose};
495
    my $locale = $language;
496
    if ($country) {
497
        $locale .= '_' . $country;
498
    }
499
    my $podir = "$self->{path_po}/$locale/LC_MESSAGES";
500
    my $pofile = "$podir/$self->{domain}.po";
501
502
    say "Update messages ($locale)" if $self->{verbose};
485
    if ( not -f $pofile ) {
503
    if ( not -f $pofile ) {
486
        print "File $pofile does not exist\n" if $self->{verbose};
504
        say "File $pofile does not exist" if $self->{verbose};
487
        $self->create_messages();
505
        $self->create_messages();
488
    }
506
    }
489
    system "$self->{msgmerge} -U $pofile $self->{domain}.pot";
507
    system "$self->{msgmerge} -U $pofile $self->{domain}.pot";
Lines 511-518 sub extract_messages { Link Here
511
        }
529
        }
512
    }
530
    }
513
531
514
    my $xgettext_cmd = "$self->{xgettext} -L Perl --from-code=UTF-8 " .
532
    my $xgettext_cmd = "$self->{xgettext} -L Perl --from-code=UTF-8 "
515
        "-o $Bin/$self->{domain}.pot -D $intranetdir";
533
        . "-k -k__ -k__x -k__n:1,2 -k__nx:1,2 -k__xn:1,2 -k__p:1c,2 "
534
        . "-k__px:1c,2 -k__np:1c,2,3 -k__npx:1c,2,3 -kN__ -kN__n:1,2 "
535
        . "-kN__p:1c,2 -kN__np:1c,2,3 "
536
        . "-o $Bin/$self->{domain}.pot -D $intranetdir";
516
    $xgettext_cmd .= " $_" foreach (@files_to_scan);
537
    $xgettext_cmd .= " $_" foreach (@files_to_scan);
517
538
518
    if (system($xgettext_cmd) != 0) {
539
    if (system($xgettext_cmd) != 0) {
Lines 527-538 sub extract_messages { Link Here
527
            die "system call failed: $replace_charset_cmd";
548
            die "system call failed: $replace_charset_cmd";
528
        }
549
        }
529
    } else {
550
    } else {
530
        print "No messages found\n" if $self->{verbose};
551
        say "No messages found" if $self->{verbose};
531
        return;
552
        return;
532
    }
553
    }
533
    return 1;
554
    return 1;
534
}
555
}
535
556
557
sub install_messages {
558
    my ($self) = @_;
559
560
    my ($language, $country) = split /-/, $self->{lang};
561
    my $locale = $language;
562
    if ($country) {
563
        $locale .= '_' . $country;
564
    }
565
    my $podir = "$self->{path_po}/$locale/LC_MESSAGES";
566
    my $pofile = "$podir/$self->{domain}.po";
567
    my $mofile = "$podir/$self->{domain}.mo";
568
569
    say "Install messages ($locale)" if $self->{verbose};
570
    if ( not -f $pofile ) {
571
        say "File $pofile does not exist" if $self->{verbose};
572
        $self->create_messages();
573
    }
574
    system "$self->{msgfmt} -o $mofile $pofile";
575
}
576
536
sub remove_pot {
577
sub remove_pot {
537
    my $self = shift;
578
    my $self = shift;
538
579
Lines 544-549 sub install { Link Here
544
    return unless $self->{lang};
585
    return unless $self->{lang};
545
    $self->install_tmpl($files) unless $self->{pref_only};
586
    $self->install_tmpl($files) unless $self->{pref_only};
546
    $self->install_prefs();
587
    $self->install_prefs();
588
    $self->install_messages();
547
}
589
}
548
590
549
591
550
- 

Return to bug 15395