1*946379e7Schristos#!/bin/sh 2*946379e7Schristos 3*946379e7Schristos# Test of Perl support. 4*946379e7Schristos 5*946379e7Schristostmpfiles="" 6*946379e7Schristostrap 'rm -fr $tmpfiles' 1 2 3 15 7*946379e7Schristos 8*946379e7Schristostmpfiles="$tmpfiles xg-pl-1.pl" 9*946379e7Schristoscat <<\EOF > xg-pl-1.pl 10*946379e7Schristosuse Locale::Messages qw (textdomain bindtextdomain gettext ngettext dngettext); 11*946379e7Schristos 12*946379e7Schristostextdomain "prog"; 13*946379e7Schristosbindtextdomain "prog", "./"; 14*946379e7Schristos 15*946379e7Schristoss/foo/ 16*946379e7Schristos # stress test for string extraction /xe; 17*946379e7Schristos 18*946379e7Schristosprint _"'Your command, please?', asked the waiter."; 19*946379e7Schristos 20*946379e7Schristosprintf ngettext ("a piece of cake", "%d pieces of cake", $n), $n; 21*946379e7Schristos 22*946379e7Schristosprintf _"%s is replaced by %s.", "FF", "EUR"; 23*946379e7Schristos 24*946379e7Schristos# Should be found. 25*946379e7Schristosprintf dngettext prog => ("one file deleted", "%d files deleted"), $n, $n; 26*946379e7Schristos 27*946379e7Schristos# Should not be found. 28*946379e7Schristosprintf dngettext ("prog"), ("one file created", "%d files created"), $n, $n; 29*946379e7Schristos 30*946379e7Schristosprintf dngettext "prog", <<PERL, <<PERL; 31*946379e7SchristosSingular 32*946379e7SchristosPERL 33*946379e7SchristosPlural 34*946379e7SchristosPERL 35*946379e7Schristos 36*946379e7Schristosprint <<PERL 37*946379e7Schristostied hash $__{ Bareword 38*946379e7Schristos} 39*946379e7Schristostied hash $__->{"quoted string"} 40*946379e7Schristostied hash $__->{ "weird 41*946379e7Schristosformatting"} 42*946379e7SchristosPERL 43*946379e7Schristos 44*946379e7Schristosprint $__ # Welcome 45*946379e7Schristos -> # to the 46*946379e7Schristos { # Republic of 47*946379e7Schristos 'Welcome to the Republic of Perl!' # 48*946379e7Schristos# Perl! 49*946379e7Schristos}; 50*946379e7Schristos 51*946379e7Schristos$! ? ?$__{"pattern match"}? : s # This is no delimiter. 52*946379e7Schristos{$__{substitution}}<$__-\>{"find me"}>; 53*946379e7Schristos 54*946379e7Schristos# No interpolation! 55*946379e7Schristosm'$__{secret}'; 56*946379e7Schristos 57*946379e7Schristos# Multiple here documents invoked from the same line. 58*946379e7Schristosprint gettext <<PERL; print gettext <<PERL; 59*946379e7SchristosFirst here document. 60*946379e7SchristosPERL 61*946379e7SchristosSecond here document. 62*946379e7SchristosPERL 63*946379e7Schristos 64*946379e7Schristos# These are not invalid interpolations, because the dollar is backslashed. 65*946379e7Schristosprintf "%s\n", gettext "abc\$def"; 66*946379e7Schristosprintf "%s\n", gettext "abc\\\$def"; 67*946379e7Schristos 68*946379e7Schristos# These are not interpolations. 69*946379e7Schristosprintf "%s\n", gettext 'abc$defg'; 70*946379e7Schristosprintf "%s\n", gettext 'abc\$defg'; 71*946379e7Schristosprintf "%s\n", gettext 'abc\\$defg'; 72*946379e7Schristosprintf "%s\n", gettext 'abc\\\$defg'; 73*946379e7Schristos 74*946379e7Schristos# Two consecutive backslashes count as one inside single-quote strings. 75*946379e7Schristosprintf "%s\n", gettext 'ecs\tasy'; 76*946379e7Schristosprintf "%s\n", gettext 'ecs\\tasy'; 77*946379e7Schristosprintf "%s\n", gettext 'ecs\\\tasy'; 78*946379e7Schristosprintf "%s\n", gettext 'ecs\\\\tasy'; 79*946379e7Schristosprintf "%s\n", gettext 'ecs\\\\\tasy'; 80*946379e7Schristosprintf "%s\n", gettext q(ecs\tasy); 81*946379e7Schristosprintf "%s\n", gettext q(ecs\\tasy); 82*946379e7Schristosprintf "%s\n", gettext q(ecs\\\tasy); 83*946379e7Schristosprintf "%s\n", gettext q(ecs\\\\tasy); 84*946379e7Schristosprintf "%s\n", gettext q(ecs\\\\\tasy); 85*946379e7Schristos 86*946379e7Schristos# Similarly, inside double-quote strings, two consecutive backslashes count 87*946379e7Schristos# as one, but the last backslash of a sequence is combined with the following 88*946379e7Schristos# character if possible. 89*946379e7Schristosprintf "%s\n", gettext "ecs\tasy"; 90*946379e7Schristosprintf "%s\n", gettext "ecs\\tasy"; 91*946379e7Schristosprintf "%s\n", gettext "ecs\\\tasy"; 92*946379e7Schristosprintf "%s\n", gettext "ecs\\\\tasy"; 93*946379e7Schristosprintf "%s\n", gettext "ecs\\\\\tasy"; 94*946379e7Schristosprintf "%s\n", gettext qq(ecs\tasy); 95*946379e7Schristosprintf "%s\n", gettext qq(ecs\\tasy); 96*946379e7Schristosprintf "%s\n", gettext qq(ecs\\\tasy); 97*946379e7Schristosprintf "%s\n", gettext qq(ecs\\\\tasy); 98*946379e7Schristosprintf "%s\n", gettext qq(ecs\\\\\tasy); 99*946379e7Schristosprintf "%s\n", gettext "mari\huana"; 100*946379e7Schristosprintf "%s\n", gettext "mari\\huana"; 101*946379e7Schristosprintf "%s\n", gettext "mari\\\huana"; 102*946379e7Schristosprintf "%s\n", gettext "mari\\\\huana"; 103*946379e7Schristosprintf "%s\n", gettext "mari\\\\\huana"; 104*946379e7Schristosprintf "%s\n", gettext qq(mari\huana); 105*946379e7Schristosprintf "%s\n", gettext qq(mari\\huana); 106*946379e7Schristosprintf "%s\n", gettext qq(mari\\\huana); 107*946379e7Schristosprintf "%s\n", gettext qq(mari\\\\huana); 108*946379e7Schristosprintf "%s\n", gettext qq(mari\\\\\huana); 109*946379e7Schristos 110*946379e7Schristos# Recognition of format strings. 111*946379e7Schristosgettext "This is {only} a brace formatstring."; 112*946379e7Schristosgettext "This is %s {mixed}."; 113*946379e7Schristosgettext "This is only %c."; 114*946379e7Schristosgettext "This is nothing at all."; 115*946379e7Schristosgettext "And this is %l also no format at all."; 116*946379e7Schristos 117*946379e7Schristos# xgettext: no-perl-format, perl-brace-format 118*946379e7Schristosgettext "The function '{func}' expects '%c' here."; 119*946379e7Schristos 120*946379e7Schristos# This is a contradictory case: The same string three times, 121*946379e7Schristos# with different xgettext comments. 122*946379e7Schristos# xgettext: perl-brace-format, no-perl-format 123*946379e7Schristosgettext "Left as an %exercise to {maintainer}."; 124*946379e7Schristos# xgettext: no-perl-brace-format, perl-format 125*946379e7Schristosgettext "Left as an %exercise to {maintainer}."; 126*946379e7Schristos# No xgettext comment this time. 127*946379e7Schristosgettext "Left as an %exercise to {maintainer}."; 128*946379e7Schristos 129*946379e7Schristos# Dollars inside sub argument lists have no effect. 130*946379e7Schristossub testFunc($) { } 131*946379e7Schristos=item TestBug1 132*946379e7SchristosIf you have gettext()'d foo bar test1'... 133*946379e7Schristos=cut 134*946379e7Schristos 135*946379e7Schristos# Dollars inside sub argument lists have no effect. 136*946379e7SchristostestFunc = sub ($) { } 137*946379e7Schristos=item TestBug2 138*946379e7SchristosIf you have gettext()'d foo bar test2'... 139*946379e7Schristos=cut 140*946379e7Schristos 141*946379e7Schristos# Dollars inside sub argument lists have no effect. 142*946379e7Schristossub testFunc($\$;*@) { } 143*946379e7Schristos=item TestBug3 144*946379e7SchristosIf you have gettext()'d foo bar test3'... 145*946379e7Schristos=cut 146*946379e7Schristos 147*946379e7Schristos__END__ 148*946379e7Schristosgettext "Discarded!"; 149*946379e7SchristosEOF 150*946379e7Schristos 151*946379e7Schristostmpfiles="$tmpfiles xg-pl-1.po" 152*946379e7Schristos: ${XGETTEXT=xgettext} 153*946379e7Schristos${XGETTEXT} --omit-header -n \ 154*946379e7Schristos -k_ --flag=_:1:pass-perl-format --flag=_:1:pass-perl-brace-format \ 155*946379e7Schristos -k%__ --flag=%__:1:pass-perl-format --flag=%__:1:pass-perl-brace-format \ 156*946379e7Schristos -k\$__ --flag=\$__:1:pass-perl-format --flag=\$__:1:pass-perl-brace-format \ 157*946379e7Schristos -d xg-pl-1 xg-pl-1.pl 158*946379e7Schristostest $? = 0 || { rm -fr $tmpfiles; exit 1; } 159*946379e7Schristos 160*946379e7Schristostmpfiles="$tmpfiles xg-pl-1.ok" 161*946379e7Schristoscat <<\EOF > xg-pl-1.ok 162*946379e7Schristos#: xg-pl-1.pl:9 163*946379e7Schristosmsgid "'Your command, please?', asked the waiter." 164*946379e7Schristosmsgstr "" 165*946379e7Schristos 166*946379e7Schristos#: xg-pl-1.pl:11 167*946379e7Schristos#, perl-format 168*946379e7Schristosmsgid "a piece of cake" 169*946379e7Schristosmsgid_plural "%d pieces of cake" 170*946379e7Schristosmsgstr[0] "" 171*946379e7Schristosmsgstr[1] "" 172*946379e7Schristos 173*946379e7Schristos#: xg-pl-1.pl:13 174*946379e7Schristos#, perl-format 175*946379e7Schristosmsgid "%s is replaced by %s." 176*946379e7Schristosmsgstr "" 177*946379e7Schristos 178*946379e7Schristos#: xg-pl-1.pl:16 179*946379e7Schristos#, perl-format 180*946379e7Schristosmsgid "one file deleted" 181*946379e7Schristosmsgid_plural "%d files deleted" 182*946379e7Schristosmsgstr[0] "" 183*946379e7Schristosmsgstr[1] "" 184*946379e7Schristos 185*946379e7Schristos#: xg-pl-1.pl:22 186*946379e7Schristos#, perl-format 187*946379e7Schristosmsgid "Singular\n" 188*946379e7Schristosmsgid_plural "Plural\n" 189*946379e7Schristosmsgstr[0] "" 190*946379e7Schristosmsgstr[1] "" 191*946379e7Schristos 192*946379e7Schristos#: xg-pl-1.pl:28 193*946379e7Schristosmsgid "Bareword" 194*946379e7Schristosmsgstr "" 195*946379e7Schristos 196*946379e7Schristos#: xg-pl-1.pl:30 197*946379e7Schristosmsgid "quoted string" 198*946379e7Schristosmsgstr "" 199*946379e7Schristos 200*946379e7Schristos#: xg-pl-1.pl:31 201*946379e7Schristosmsgid "" 202*946379e7Schristos"weird\n" 203*946379e7Schristos"formatting" 204*946379e7Schristosmsgstr "" 205*946379e7Schristos 206*946379e7Schristos#: xg-pl-1.pl:38 207*946379e7Schristosmsgid "Welcome to the Republic of Perl!" 208*946379e7Schristosmsgstr "" 209*946379e7Schristos 210*946379e7Schristos#: xg-pl-1.pl:42 211*946379e7Schristosmsgid "pattern match" 212*946379e7Schristosmsgstr "" 213*946379e7Schristos 214*946379e7Schristos#: xg-pl-1.pl:43 215*946379e7Schristosmsgid "substitution" 216*946379e7Schristosmsgstr "" 217*946379e7Schristos 218*946379e7Schristos#: xg-pl-1.pl:43 219*946379e7Schristosmsgid "find me" 220*946379e7Schristosmsgstr "" 221*946379e7Schristos 222*946379e7Schristos#: xg-pl-1.pl:50 223*946379e7Schristosmsgid "First here document.\n" 224*946379e7Schristosmsgstr "" 225*946379e7Schristos 226*946379e7Schristos#: xg-pl-1.pl:52 227*946379e7Schristosmsgid "Second here document.\n" 228*946379e7Schristosmsgstr "" 229*946379e7Schristos 230*946379e7Schristos#: xg-pl-1.pl:56 231*946379e7Schristosmsgid "abc$def" 232*946379e7Schristosmsgstr "" 233*946379e7Schristos 234*946379e7Schristos#: xg-pl-1.pl:57 235*946379e7Schristosmsgid "abc\\$def" 236*946379e7Schristosmsgstr "" 237*946379e7Schristos 238*946379e7Schristos#: xg-pl-1.pl:60 239*946379e7Schristosmsgid "abc$defg" 240*946379e7Schristosmsgstr "" 241*946379e7Schristos 242*946379e7Schristos#: xg-pl-1.pl:61 xg-pl-1.pl:62 243*946379e7Schristosmsgid "abc\\$defg" 244*946379e7Schristosmsgstr "" 245*946379e7Schristos 246*946379e7Schristos#: xg-pl-1.pl:63 247*946379e7Schristosmsgid "abc\\\\$defg" 248*946379e7Schristosmsgstr "" 249*946379e7Schristos 250*946379e7Schristos#: xg-pl-1.pl:66 xg-pl-1.pl:67 xg-pl-1.pl:71 xg-pl-1.pl:72 xg-pl-1.pl:81 251*946379e7Schristos#: xg-pl-1.pl:86 252*946379e7Schristosmsgid "ecs\\tasy" 253*946379e7Schristosmsgstr "" 254*946379e7Schristos 255*946379e7Schristos#: xg-pl-1.pl:68 xg-pl-1.pl:69 xg-pl-1.pl:73 xg-pl-1.pl:74 xg-pl-1.pl:83 256*946379e7Schristos#: xg-pl-1.pl:88 257*946379e7Schristosmsgid "ecs\\\\tasy" 258*946379e7Schristosmsgstr "" 259*946379e7Schristos 260*946379e7Schristos#: xg-pl-1.pl:70 xg-pl-1.pl:75 261*946379e7Schristosmsgid "ecs\\\\\\tasy" 262*946379e7Schristosmsgstr "" 263*946379e7Schristos 264*946379e7Schristos#: xg-pl-1.pl:80 xg-pl-1.pl:85 265*946379e7Schristosmsgid "ecs\tasy" 266*946379e7Schristosmsgstr "" 267*946379e7Schristos 268*946379e7Schristos#: xg-pl-1.pl:82 xg-pl-1.pl:87 269*946379e7Schristosmsgid "ecs\\\tasy" 270*946379e7Schristosmsgstr "" 271*946379e7Schristos 272*946379e7Schristos#: xg-pl-1.pl:84 xg-pl-1.pl:89 273*946379e7Schristosmsgid "ecs\\\\\tasy" 274*946379e7Schristosmsgstr "" 275*946379e7Schristos 276*946379e7Schristos#: xg-pl-1.pl:90 xg-pl-1.pl:95 277*946379e7Schristosmsgid "marihuana" 278*946379e7Schristosmsgstr "" 279*946379e7Schristos 280*946379e7Schristos#: xg-pl-1.pl:91 xg-pl-1.pl:92 xg-pl-1.pl:96 xg-pl-1.pl:97 281*946379e7Schristosmsgid "mari\\huana" 282*946379e7Schristosmsgstr "" 283*946379e7Schristos 284*946379e7Schristos#: xg-pl-1.pl:93 xg-pl-1.pl:94 xg-pl-1.pl:98 xg-pl-1.pl:99 285*946379e7Schristosmsgid "mari\\\\huana" 286*946379e7Schristosmsgstr "" 287*946379e7Schristos 288*946379e7Schristos#: xg-pl-1.pl:102 289*946379e7Schristos#, perl-brace-format 290*946379e7Schristosmsgid "This is {only} a brace formatstring." 291*946379e7Schristosmsgstr "" 292*946379e7Schristos 293*946379e7Schristos#: xg-pl-1.pl:103 294*946379e7Schristos#, perl-format, perl-brace-format 295*946379e7Schristosmsgid "This is %s {mixed}." 296*946379e7Schristosmsgstr "" 297*946379e7Schristos 298*946379e7Schristos#: xg-pl-1.pl:104 299*946379e7Schristos#, perl-format 300*946379e7Schristosmsgid "This is only %c." 301*946379e7Schristosmsgstr "" 302*946379e7Schristos 303*946379e7Schristos#: xg-pl-1.pl:105 304*946379e7Schristosmsgid "This is nothing at all." 305*946379e7Schristosmsgstr "" 306*946379e7Schristos 307*946379e7Schristos#: xg-pl-1.pl:106 308*946379e7Schristosmsgid "And this is %l also no format at all." 309*946379e7Schristosmsgstr "" 310*946379e7Schristos 311*946379e7Schristos#: xg-pl-1.pl:109 312*946379e7Schristos#, no-perl-format, perl-brace-format 313*946379e7Schristosmsgid "The function '{func}' expects '%c' here." 314*946379e7Schristosmsgstr "" 315*946379e7Schristos 316*946379e7Schristos#: xg-pl-1.pl:114 xg-pl-1.pl:116 xg-pl-1.pl:118 317*946379e7Schristos#, perl-format, no-perl-brace-format 318*946379e7Schristosmsgid "Left as an %exercise to {maintainer}." 319*946379e7Schristosmsgstr "" 320*946379e7SchristosEOF 321*946379e7Schristos 322*946379e7Schristos: ${DIFF=diff} 323*946379e7Schristos${DIFF} xg-pl-1.ok xg-pl-1.po 324*946379e7Schristosresult=$? 325*946379e7Schristos 326*946379e7Schristosrm -fr $tmpfiles 327*946379e7Schristos 328*946379e7Schristosexit $result 329