File Coverage

File:Dpkg/Gettext.pm
Coverage:59.5%

linestmtbrancondsubpodtimecode
1# Copied from /usr/share/perl5/Debconf/Gettext.pm
2#
3# Copyright © 2000 Joey Hess <joeyh@debian.org>
4# Copyright © 2007-2022 Guillem Jover <guillem@debian.org>
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9# 1. Redistributions of source code must retain the above copyright
10#    notice, this list of conditions and the following disclaimer.
11# 2. Redistributions in binary form must reproduce the above copyright
12#    notice, this list of conditions and the following disclaimer in the
13#    documentation and/or other materials provided with the distribution.
14#
15# THIS SOFTWARE IS PROVIDED BY AUTHORS AND CONTRIBUTORS ``AS IS'' AND
16# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
19# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25# SUCH DAMAGE.
26
27package Dpkg::Gettext;
28
29
642
642
642
1276
611
6976
use strict;
30
642
642
642
707
576
9250
use warnings;
31
642
642
642
1223
89
25825
use feature qw(state);
32
33our $VERSION = '2.01';
34our @EXPORT = qw(
35    textdomain
36    gettext
37    ngettext
38    g_
39    P_
40    N_
41);
42
43
642
642
642
1263
107
16592
use Exporter qw(import);
44
45=encoding utf8
46
47 - 84
=head1 NAME

Dpkg::Gettext - convenience wrapper around Locale::gettext

=head1 DESCRIPTION

The Dpkg::Gettext module is a convenience wrapper over the Locale::gettext
module, to guarantee we always have working gettext functions, and to add
some commonly used aliases.

=head1 ENVIRONMENT

=over 4

=item DPKG_NLS

When set to 0, this environment variable will disable the National Language
Support in all Dpkg modules.

=back

=head1 VARIABLES

=over 4

=item $Dpkg::Gettext::DEFAULT_TEXT_DOMAIN

Specifies the default text domain name to be used with the short function
aliases. This is intended to be used by the Dpkg modules, so that they
can produce localized messages even when the calling program has set the
current domain with textdomain(). If you would like to use the aliases
for your own modules, you might want to set this variable to undef, or
to another domain, but then the Dpkg modules will not produce localized
messages.

=back

=cut
85
86our $DEFAULT_TEXT_DOMAIN = 'dpkg-dev';
87
88 - 127
=head1 FUNCTIONS

=over 4

=item $domain = textdomain($new_domain)

Compatibility textdomain() fallback when Locale::gettext is not available.

If $new_domain is not undef, it will set the current domain to $new_domain.
Returns the current domain, after possibly changing it.

=item $trans = gettext($msgid)

Compatibility gettext() fallback when Locale::gettext is not available.

Returns $msgid.

=item $trans = ngettext($msgid, $msgid_plural, $n)

Compatibility ngettext() fallback when Locale::gettext is not available.

Returns $msgid if $n is 1 or $msgid_plural otherwise.

=item $trans = g_($msgid)

Calls dgettext() on the $msgid and returns its translation for the current
locale. If dgettext() is not available, simply returns $msgid.

=item $trans = C_($msgctxt, $msgid)

Calls dgettext() on the $msgid and returns its translation for the specific
$msgctxt supplied. If dgettext() is not available, simply returns $msgid.

=item $trans = P_($msgid, $msgid_plural, $n)

Calls dngettext(), returning the correct translation for the plural form
dependent on $n. If dngettext() is not available, returns $msgid if $n is 1
or $msgid_plural otherwise.

=cut
128
129
642
642
642
739
629
123210
use constant GETTEXT_CONTEXT_GLUE => "\004";
130
131BEGIN {
132
642
3142
    my $use_gettext = $ENV{DPKG_NLS} // 1;
133
642
671
    if ($use_gettext) {
134
642
642
642
642
24352
79313
13328622
24975
        eval q{
135            pop @INC if $INC[-1] eq '.';
136            use Locale::gettext;
137        };
138
642
1258
        $use_gettext = not $@;
139    }
140
642
1724
    if (not $use_gettext) {
141        *g_ = sub {
142
0
0
            return shift;
143
0
0
        };
144        *textdomain = sub {
145
0
0
            my $new_domain = shift;
146
0
0
            state $domain = $DEFAULT_TEXT_DOMAIN;
147
148
0
0
            $domain = $new_domain if defined $new_domain;
149
150
0
0
            return $domain;
151
0
0
        };
152        *gettext = sub {
153
0
0
            my $msgid = shift;
154
0
0
            return $msgid;
155
0
0
        };
156        *ngettext = sub {
157
0
0
            my ($msgid, $msgid_plural, $n) = @_;
158
0
0
            if ($n == 1) {
159
0
0
                return $msgid;
160            } else {
161
0
0
                return $msgid_plural;
162            }
163
0
0
        };
164        *C_ = sub {
165
0
0
            my ($msgctxt, $msgid) = @_;
166
0
0
            return $msgid;
167
0
0
        };
168        *P_ = sub {
169
0
0
            return ngettext(@_);
170
0
0
        };
171    } else {
172        *g_ = sub {
173
8697
29134
            return dgettext($DEFAULT_TEXT_DOMAIN, shift);
174
642
1815
        };
175        *C_ = sub {
176
0
0
            my ($msgctxt, $msgid) = @_;
177
0
0
            return dgettext($DEFAULT_TEXT_DOMAIN,
178                            $msgctxt . GETTEXT_CONTEXT_GLUE . $msgid);
179
642
1266
        };
180        *P_ = sub {
181
1
32
            return dngettext($DEFAULT_TEXT_DOMAIN, @_);
182
642
25034
        };
183    }
184}
185
186 - 194
=item $msgid = N_($msgid)

A pseudo function that servers as a marker for automated extraction of
messages, but does not call gettext(). The run-time translation is done
at a different place in the code.

=back

=cut
195
196sub N_
197{
198
572
1
229
    my $msgid = shift;
199
572
569
    return $msgid;
200}
201
202 - 233
=head1 CHANGES

=head2 Version 2.01 (dpkg 1.21.10)

New function: gettext().

=head2 Version 2.00 (dpkg 1.20.0)

Remove function: _g().

=head2 Version 1.03 (dpkg 1.19.0)

New envvar: Add support for new B<DPKG_NLS> environment variable.

=head2 Version 1.02 (dpkg 1.18.3)

New function: N_().

=head2 Version 1.01 (dpkg 1.18.0)

Now the short aliases (g_ and P_) will call domain aware functions with
$DEFAULT_TEXT_DOMAIN.

New functions: g_(), C_().

Deprecated function: _g().

=head2 Version 1.00 (dpkg 1.15.6)

Mark the module as public.

=cut
234
2351;