--- /dev/null
+use Modern::Perl;
+
+use FindBin '$Bin';
+use lib "$Bin/../misc/translator";
+
+use Test::More tests => 39;
+use File::Temp qw(tempdir);
+use File::Slurp;
+use Locale::PO;
+
+use t::lib::Mocks;
+
+use_ok('LangInstaller');
+
+my $installer = LangInstaller->new();
+
+my $tempdir = tempdir(CLEANUP => 0);
+t::lib::Mocks::mock_config('intranetdir', "$Bin/LangInstaller/templates");
+my @files = ('simple.tt');
+$installer->extract_messages_from_templates($tempdir, @files);
+
+ok(-e "$tempdir/simple.tt", 'it has created a temporary file simple.tt');
+SKIP: {
+ skip "simple.tt does not exist", 37 unless -e "$tempdir/simple.tt";
+
+ my $output = read_file("$tempdir/simple.tt");
+ my $expected_output = <<'EOF';
+__('hello');
+__x('hello {name}');
+__n('item', 'items');
+__nx('{count} item', '{count} items');
+__p('context', 'hello');
+__px('context', 'hello {name}');
+__np('context', 'item', 'items');
+__npx('context', '{count} item', '{count} items');
+__npx('context', '{count} item', '{count} items');
+__x('status is {status}');
+__('active');
+__('inactive');
+__('Inside block');
+EOF
+
+ is($output, $expected_output, "Output of extract_messages_from_templates is as expected");
+
+ my $xgettext_cmd = "xgettext -L Perl --from-code=UTF-8 "
+ . "--package-name=Koha --package-version='' "
+ . "-k -k__ -k__x -k__n:1,2 -k__nx:1,2 -k__xn:1,2 -k__p:1c,2 "
+ . "-k__px:1c,2 -k__np:1c,2,3 -k__npx:1c,2,3 "
+ . "-o $tempdir/Koha.pot -D $tempdir simple.tt";
+
+ system($xgettext_cmd);
+ my $pot = Locale::PO->load_file_asarray("$tempdir/Koha.pot");
+
+ my @expected = (
+ {
+ msgid => '"hello"',
+ },
+ {
+ msgid => '"hello {name}"',
+ },
+ {
+ msgid => '"item"',
+ msgid_plural => '"items"',
+ },
+ {
+ msgid => '"{count} item"',
+ msgid_plural => '"{count} items"',
+ },
+ {
+ msgid => '"hello"',
+ msgctxt => '"context"',
+ },
+ {
+ msgid => '"hello {name}"',
+ msgctxt => '"context"',
+ },
+ {
+ msgid => '"item"',
+ msgid_plural => '"items"',
+ msgctxt => '"context"',
+ },
+ {
+ msgid => '"{count} item"',
+ msgid_plural => '"{count} items"',
+ msgctxt => '"context"',
+ },
+ {
+ msgid => '"status is {status}"',
+ },
+ {
+ msgid => '"active"',
+ },
+ {
+ msgid => '"inactive"',
+ },
+ {
+ msgid => '"Inside block"',
+ },
+ );
+
+ for (my $i = 0; $i < @expected; $i++) {
+ for my $key (qw(msgid msgid_plural msgctxt)) {
+ my $expected = $expected[$i]->{$key};
+ my $expected_str = defined $expected ? $expected : 'not defined';
+ is($pot->[$i + 1]->$key, $expected, "$i: $key is $expected_str");
+ }
+ }
+}
--- /dev/null
+[% t('hello') %]
+[% tx('hello {name}', { name = 'Bob' }) %]
+[% tn('item', 'items', count) %]
+[% tnx('{count} item', '{count} items', count, { count = count }) %]
+[% tp('context', 'hello') %]
+[% tpx('context', 'hello {name}', { name = 'Bob' }) %]
+[% tnp('context', 'item', 'items', count) %]
+[% tnpx('context', '{count} item', '{count} items', count, { count = count }) %]
+
+[% # it also works on multiple lines
+ tnpx (
+ 'context',
+ '{count} item',
+ '{count} items',
+ count,
+ {
+ count = count,
+ }
+ )
+%]
+
+[% # and t* calls can be nested
+ tx('status is {status}', {
+ status = active ? t('active') : t('inactive')
+ })
+%]
+
+[%# but a TT comment won't get picked
+ t('not translatable')
+%]
+
+[% BLOCK %]
+ [% t('Inside block') %]
+[% END %]