From 52d9d8dd5823f4c11f8761e16591dd8644590095 Mon Sep 17 00:00:00 2001 From: "David E. Wheeler" Date: Fri, 29 Dec 2023 19:00:22 -0500 Subject: [PATCH] Use locale pragma instead of POSIX::setlocale() The Pragma is more likely to do the right thing, as confirmed by new tests, which fail when using `setlocale` and now succeed with `use locale`. The tests, in `xt/locale`, include compiled locale dictionaries (`*.mo` files) with a single message for the tested languages. This is in contrast to the released locale dictionaries, which are generated at release time but not stored in the repository. Update the `Language-Team` header in the project localization packages in `po` directory to `Sqitch Hackers `. Update the `os.yml` and `perl.yml` workflows, which run all tests including the new locale tests, to install the required locales on Linux and to set the full `runs-on:` image name in the matrix (in response to shogo82148/actions-setup-perl#1699). Also remove the installation of an older version of Locale::TextDomain from those workflows, since gflohr/libintl-perl#7 has been fixed and released. While at it, upgrade to `actions/checkout@v4` in all workflows and use `runner.os` instead of `matrix.os` in conditionals. --- .github/workflows/cockroach.yml | 2 +- .github/workflows/coverage.yml | 2 +- .github/workflows/exasol.yml | 2 +- .github/workflows/firebird.yml | 2 +- .github/workflows/mysql.yml | 2 +- .github/workflows/oracle.yml | 2 +- .github/workflows/os.yml | 18 +++--- .github/workflows/perl.yml | 10 +-- .github/workflows/pg.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/snowflake.yml | 2 +- .github/workflows/sqlite.yml | 2 +- .github/workflows/vertica.yml | 2 +- .github/workflows/yugabyte.yml | 2 +- .gitignore | 3 +- Changes | 4 ++ bin/sqitch | 11 +--- dist.ini | 2 +- inc/Module/Build/Sqitch.pm | 1 - lib/App/Sqitch/DateTime.pm | 10 +-- po/de_DE.po | 2 +- po/fr_FR.po | 2 +- po/it_IT.po | 2 +- t/lib/LC.pm | 10 +-- t/sqitch | 10 +-- .../de_DE/LC_MESSAGES/App-Sqitch.mo | Bin 0 -> 462 bytes .../fr_FR/LC_MESSAGES/App-Sqitch.mo | Bin 0 -> 465 bytes .../it_IT/LC_MESSAGES/App-Sqitch.mo | Bin 0 -> 460 bytes xt/locale/README.md | 43 +++++++++++++ xt/locale/po/de_DE.po | 12 ++++ xt/locale/po/fr_FR.po | 12 ++++ xt/locale/po/it_IT.po | 12 ++++ xt/locale/test-cli.t | 57 ++++++++++++++++++ 33 files changed, 182 insertions(+), 63 deletions(-) create mode 100644 xt/locale/LocaleData/de_DE/LC_MESSAGES/App-Sqitch.mo create mode 100644 xt/locale/LocaleData/fr_FR/LC_MESSAGES/App-Sqitch.mo create mode 100644 xt/locale/LocaleData/it_IT/LC_MESSAGES/App-Sqitch.mo create mode 100644 xt/locale/README.md create mode 100644 xt/locale/po/de_DE.po create mode 100644 xt/locale/po/fr_FR.po create mode 100644 xt/locale/po/it_IT.po create mode 100644 xt/locale/test-cli.t diff --git a/.github/workflows/cockroach.yml b/.github/workflows/cockroach.yml index a6087cac3..6466785b3 100644 --- a/.github/workflows/cockroach.yml +++ b/.github/workflows/cockroach.yml @@ -18,7 +18,7 @@ jobs: steps: - name: Start CockroachDB run: docker run -d -p 26257:26257 cockroachdb/cockroach:latest-v${{ matrix.version }} start-single-node --insecure - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Perl id: perl uses: shogo82148/actions-setup-perl@v1 diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index b433912a1..500bc8eb4 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -49,7 +49,7 @@ jobs: run: rm -rf /opt/hostedtoolcache - name: Start CockroachDB run: docker run -d -p 26257:26257 cockroachdb/cockroach:latest start-single-node --insecure - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Perl id: perl uses: shogo82148/actions-setup-perl@v1 diff --git a/.github/workflows/exasol.yml b/.github/workflows/exasol.yml index d10db9d22..1f33fd39a 100644 --- a/.github/workflows/exasol.yml +++ b/.github/workflows/exasol.yml @@ -20,7 +20,7 @@ jobs: ports: [ 8563 ] options: --privileged steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Clients run: .github/ubuntu/exasol.sh - name: Setup Perl diff --git a/.github/workflows/firebird.yml b/.github/workflows/firebird.yml index 36a5541a4..de7c120ed 100644 --- a/.github/workflows/firebird.yml +++ b/.github/workflows/firebird.yml @@ -29,7 +29,7 @@ jobs: ISC_PASSWORD: nix FIREBIRD_DATABASE: sqitchtest.db steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Clients run: .github/ubuntu/firebird.sh - name: Setup Perl diff --git a/.github/workflows/mysql.yml b/.github/workflows/mysql.yml index 14cb78ac6..03a7beecf 100644 --- a/.github/workflows/mysql.yml +++ b/.github/workflows/mysql.yml @@ -39,7 +39,7 @@ jobs: ports: [ 3306 ] options: --health-cmd="healthcheck.sh --innodb_initialized || mysqladmin ping --protocol=tcp" --health-interval=5s --health-timeout=2s --health-retries=3 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Clients run: .github/ubuntu/mysql.sh - name: Setup Perl diff --git a/.github/workflows/oracle.yml b/.github/workflows/oracle.yml index 186501eb3..ea8487ace 100644 --- a/.github/workflows/oracle.yml +++ b/.github/workflows/oracle.yml @@ -40,7 +40,7 @@ jobs: --health-timeout 10s --health-retries 10 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Clients run: .github/ubuntu/oracle.sh - name: Setup Perl diff --git a/.github/workflows/os.yml b/.github/workflows/os.yml index 6293bb68e..1da541940 100644 --- a/.github/workflows/os.yml +++ b/.github/workflows/os.yml @@ -12,27 +12,29 @@ jobs: strategy: matrix: include: - - { icon: 🐧, os: ubuntu, name: Linux } - - { icon: 🍎, os: macos, name: macOS } - - { icon: 🪟, os: windows, name: Windows } + - { icon: 🐧, on: ubuntu, name: Linux } + - { icon: 🍎, on: macos, name: macOS } + - { icon: 🪟, on: windows, name: Windows } name: ${{ matrix.icon }} ${{ matrix.name }} - runs-on: ${{ matrix.os }}-latest + runs-on: ${{ matrix.on }}-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Perl id: perl uses: shogo82148/actions-setup-perl@v1 with: { perl-version: latest } - run: perl -V + - if: runner.os == 'Linux' + name: Install Apt Packages + run: sudo apt-get install -qq aspell-en language-pack-fr language-pack-en language-pack-de language-pack-it - name: Cache CPAN Modules uses: actions/cache@v3 with: path: local key: perl-${{ steps.perl.outputs.perl-hash }} - run: cpm install --verbose --show-build-log-on-failure --no-test --with-recommends ExtUtils::MakeMaker List::MoreUtils::XS - # Remove Locale::TextDomain if https://github.com/gflohr/libintl-perl/issues/7 fixed and released. - - if: ${{ matrix.os == 'windows' }} - run: cpm install --verbose --show-build-log-on-failure --no-test --with-recommends Encode Win32::Console::ANSI Win32API::Net Win32::Locale Win32::ShellQuote DateTime::TimeZone::Local::Win32 Locale::TextDomain@1.31 + - if: runner.os == 'Windows' + run: cpm install --verbose --show-build-log-on-failure --no-test --with-recommends Encode Win32::Console::ANSI Win32API::Net Win32::ShellQuote DateTime::TimeZone::Local::Win32 - run: cpm install --verbose --show-build-log-on-failure --no-test --with-recommends --cpanfile dist/cpanfile - run: cpm install --verbose --show-build-log-on-failure --no-test --with-recommends Test::Spelling Test::Pod Test::Pod::Coverage - name: prove diff --git a/.github/workflows/perl.yml b/.github/workflows/perl.yml index 22ddac38e..c43a00493 100644 --- a/.github/workflows/perl.yml +++ b/.github/workflows/perl.yml @@ -19,20 +19,22 @@ jobs: name: 🧅 Perl ${{ matrix.perl }} on ${{ matrix.os[0] }} ${{ matrix.os[1] }} runs-on: ${{ matrix.os[1] }}-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Perl id: perl uses: shogo82148/actions-setup-perl@v1 with: { perl-version: "${{ matrix.perl }}" } - run: perl -V + - if: runner.os == 'Linux' + name: Install Apt Packages + run: sudo apt-get install -qq language-pack-fr language-pack-en language-pack-de language-pack-it - name: Cache CPAN Modules uses: actions/cache@v3 with: path: local key: perl-${{ steps.perl.outputs.perl-hash }} - # Remove Locale::TextDomain if https://github.com/gflohr/libintl-perl/issues/7 fixed and released. - - if: ${{ matrix.os[1] == 'windows' }} - run: cpm install --verbose --show-build-log-on-failure --no-test --with-recommends Encode Win32::Console::ANSI Win32API::Net Win32::Locale Win32::ShellQuote DateTime::TimeZone::Local::Win32 Locale::TextDomain@1.31 + - if: runner.os == 'Windows' + run: cpm install --verbose --show-build-log-on-failure --no-test --with-recommends Encode Win32::Console::ANSI Win32API::Net Win32::ShellQuote DateTime::TimeZone::Local::Win32 - run: cpm install --verbose --show-build-log-on-failure --no-test --with-recommends --cpanfile dist/cpanfile - run: cpm install --verbose --show-build-log-on-failure --no-test --with-recommends Test::Spelling Test::Pod Test::Pod::Coverage - name: prove diff --git a/.github/workflows/pg.yml b/.github/workflows/pg.yml index c97c11ba7..39a81739f 100644 --- a/.github/workflows/pg.yml +++ b/.github/workflows/pg.yml @@ -15,7 +15,7 @@ jobs: name: 🐘 Postgres ${{ matrix.pg }} runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Perl id: perl uses: shogo82148/actions-setup-perl@v1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9f5a1c1a0..f27f3336c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,7 +10,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - name: Check out the repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Perl id: perl uses: shogo82148/actions-setup-perl@v1 diff --git a/.github/workflows/snowflake.yml b/.github/workflows/snowflake.yml index 7dc089c56..45ddd26cc 100644 --- a/.github/workflows/snowflake.yml +++ b/.github/workflows/snowflake.yml @@ -11,7 +11,7 @@ jobs: name: ❄️ Snowflake runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Clients run: .github/ubuntu/snowflake.sh - name: Setup Perl diff --git a/.github/workflows/sqlite.yml b/.github/workflows/sqlite.yml index 4c0b758d1..12e1f4c16 100644 --- a/.github/workflows/sqlite.yml +++ b/.github/workflows/sqlite.yml @@ -16,7 +16,7 @@ jobs: name: 💡 SQLite ${{ matrix.sqlite }} runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Perl id: perl uses: shogo82148/actions-setup-perl@v1 diff --git a/.github/workflows/vertica.yml b/.github/workflows/vertica.yml index b524bbd3c..5b734dfbd 100644 --- a/.github/workflows/vertica.yml +++ b/.github/workflows/vertica.yml @@ -27,7 +27,7 @@ jobs: image: ${{ matrix.image }}:${{ matrix.version }} ports: [ 5433 ] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Clients run: .github/ubuntu/vertica.sh - name: Setup Perl diff --git a/.github/workflows/yugabyte.yml b/.github/workflows/yugabyte.yml index 9524be9c2..34c886e38 100644 --- a/.github/workflows/yugabyte.yml +++ b/.github/workflows/yugabyte.yml @@ -34,7 +34,7 @@ jobs: uses: jameshartig/yugabyte-db-action@master with: yb_image_tag: "${{ matrix.tag }}" - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Perl id: perl uses: shogo82148/actions-setup-perl@v1 diff --git a/.gitignore b/.gitignore index 8033e00ee..a3efe757b 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,8 @@ /_rpmbuild /target .build/ -*.mo .al /latest_changes.md /local/ +/LocaleData/ +/lib/LocaleData/ diff --git a/Changes b/Changes index a3fa86e31..cbbc4b3e0 100644 --- a/Changes +++ b/Changes @@ -22,6 +22,10 @@ Revision history for Perl extension App::Sqitch (#795)! - Fixed Oracle and Firebird test failures due to incorrect use of `chmod`. Thanks to Slaven Rezić for the report and the fix (#807)! + - Updated the locale configuration to fix issues in more recent versions + of Perl, and added tests to ensure that the sqitch CLI executes and + properly emits localized messages (except on Windows, where the language + codes are incompatible). Eliminated use of Win32::Locale. 1.4.0 2023-08-01T23:37:30Z - Fixed Snowflake warehouse and role setup to properly quote identifiers diff --git a/bin/sqitch b/bin/sqitch index e14a01115..89c77f22d 100755 --- a/bin/sqitch +++ b/bin/sqitch @@ -1,15 +1,6 @@ #!perl -w -CAS # VERSION -use POSIX qw(setlocale); -BEGIN { - if ($^O eq 'MSWin32') { - require Win32::Locale; - setlocale POSIX::LC_ALL, Win32::Locale::get_locale(); - } else { - setlocale POSIX::LC_ALL, ''; - } -} +use locale; use App::Sqitch; - exit App::Sqitch->go; diff --git a/dist.ini b/dist.ini index 262efdd65..890ef97c2 100644 --- a/dist.ini +++ b/dist.ini @@ -2,7 +2,7 @@ name = App-Sqitch license = MIT copyright_holder = "iovation Inc., David E. Wheeler" copyright_year = 2012-2023 -version = v1.4.1-dev +version = v1.4.1 [GatherDir] exclude_filename = dist/cpanfile diff --git a/inc/Module/Build/Sqitch.pm b/inc/Module/Build/Sqitch.pm index 47fc1e8e5..cd5729a95 100644 --- a/inc/Module/Build/Sqitch.pm +++ b/inc/Module/Build/Sqitch.pm @@ -30,7 +30,6 @@ sub new { Win32::Console::ANSI Win32API::Net ); - $p{requires}{'Win32::Locale'} = 0; $p{requires}{'Win32::ShellQuote'} = 0; $p{requires}{'DateTime::TimeZone::Local::Win32'} = 0; } diff --git a/lib/App/Sqitch/DateTime.pm b/lib/App/Sqitch/DateTime.pm index 39ce7c09e..a2a5b5362 100644 --- a/lib/App/Sqitch/DateTime.pm +++ b/lib/App/Sqitch/DateTime.pm @@ -7,6 +7,8 @@ use utf8; use parent 'DateTime'; use DateTime 1.04; use Locale::TextDomain qw(App-Sqitch); +use POSIX (); + use App::Sqitch::X qw(hurl); use List::Util qw(first); use constant ISWIN => $^O eq 'MSWin32'; @@ -57,13 +59,7 @@ sub as_string { s/\+0000$/-0000/; return $rv; } else { - if (ISWIN) { - require Win32::Locale; - $dt->set_locale( Win32::Locale::get_locale() ); - } else { - require POSIX; - $dt->set_locale( POSIX::setlocale( POSIX::LC_TIME() ) ); - } + $dt->set_locale( POSIX::setlocale( POSIX::LC_TIME() ) ); return $dt->format_cldr($format) if $format =~ s/^cldr://; return $dt->strftime($format) if $format =~ s/^strftime://; my $meth = $dt->locale->can("datetime_format_$format") or hurl( diff --git a/po/de_DE.po b/po/de_DE.po index 6eceb8bc5..b561564c6 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -10,7 +10,7 @@ msgstr "" "POT-Creation-Date: 2023-07-30 20:02-0400\n" "PO-Revision-Date: 2012-08-31 17:15-0700\n" "Last-Translator: Thomas Iguchi \n" -"Language-Team: German \n" +"Language-Team: Sqitch Hackers \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/po/fr_FR.po b/po/fr_FR.po index dc2502eac..283ceb1b9 100644 --- a/po/fr_FR.po +++ b/po/fr_FR.po @@ -10,7 +10,7 @@ msgstr "" "POT-Creation-Date: 2023-07-30 20:02-0400\n" "PO-Revision-Date: 2012-10-12 11:28-0700\n" "Last-Translator: Arnaud Assad \n" -"Language-Team: French \n" +"Language-Team: Sqitch Hackers \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/po/it_IT.po b/po/it_IT.po index 6b716b1c4..14a586a3f 100644 --- a/po/it_IT.po +++ b/po/it_IT.po @@ -10,7 +10,7 @@ msgstr "" "POT-Creation-Date: 2023-07-30 20:02-0400\n" "PO-Revision-Date: 2017-10-12 10:30+0200\n" "Last-Translator: Luca Ferrari \n" -"Language-Team: Italian \n" +"Language-Team: Sqitch Hackers \n" "Language: it_IT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/t/lib/LC.pm b/t/lib/LC.pm index ed95ae760..c978e0237 100644 --- a/t/lib/LC.pm +++ b/t/lib/LC.pm @@ -1,13 +1,9 @@ package LC; +use POSIX; our $TIME = do { - if ($^O eq 'MSWin32') { - require Win32::Locale; - Win32::Locale::get_locale(); - } else { - require POSIX; - POSIX::setlocale( POSIX::LC_TIME() ); - } + require POSIX; + POSIX::setlocale( POSIX::LC_TIME ); }; # https://github.com/sqitchers/sqitch/issues/230#issuecomment-103946451 diff --git a/t/sqitch b/t/sqitch index 350e7fc0a..cf9171dca 100755 --- a/t/sqitch +++ b/t/sqitch @@ -1,14 +1,6 @@ #!/usr/bin/env perl -CAS -use POSIX qw(setlocale); -BEGIN { - if ($^O eq 'MSWin32') { - require Win32::Locale; - setlocale POSIX::LC_ALL, Win32::Locale::get_locale(); - } else { - setlocale POSIX::LC_ALL, ''; - } -} +use locale; use FindBin; use lib "$FindBin::Bin/../lib"; use App::Sqitch; diff --git a/xt/locale/LocaleData/de_DE/LC_MESSAGES/App-Sqitch.mo b/xt/locale/LocaleData/de_DE/LC_MESSAGES/App-Sqitch.mo new file mode 100644 index 0000000000000000000000000000000000000000..3c1b7c0eb2c74ccde6f18676d270304ac5eb2d2f GIT binary patch literal 462 zcmbV|u};G<5QYPSB_lJ#sRI)ZNmNx;Cgr7msmqtyc!VF3bhtA$%L84cRYjj>)lfmVKrlNu*YDP&o zJQEi<)ANZqmc*(wjnk%x6A`!aG|7@Ui(5BgUwRU`lg8JQtowC2mBl?9L&tx+ifVB_ zP}Zs%m9x`{k2u;sJ1laE9Od{Q`ay5dT|Od-;_%2CLc_71CY+n_k#;7v)MgioN;;3U uca@)r_VV65{s^7un!=Xas0`Y-n!@1kuM(g(Fg5Dqy(X>D!6A;Ys)H|tKZk?> literal 0 HcmV?d00001 diff --git a/xt/locale/LocaleData/fr_FR/LC_MESSAGES/App-Sqitch.mo b/xt/locale/LocaleData/fr_FR/LC_MESSAGES/App-Sqitch.mo new file mode 100644 index 0000000000000000000000000000000000000000..5ff3b87c6a093affb019d1b881f29cd0293fda92 GIT binary patch literal 465 zcmbV|!AiqG5Qd}ZB}dO5mRv+|V-iX!v5KG-3oTZS9=wgoG+9k|zLn47 zv{mcbVLxVlhzRfz9`HvnBup~O^-tv|Bn0dtc5Lf)cv%IH*FKPk#95r?fX_D2`; z3TJ9wk*7dBl_XKpl2I(9c9z6x9HmkF&L4mynOV@T1~T?nv9IZCuFKj#y#oOJ)d@f6Nd2!`|u>aTxh0MiXkb_0q6!!e`oVYEb$>vE$bR-&ZVyf|Hskq!RdS4;Ghq?d& literal 0 HcmV?d00001 diff --git a/xt/locale/LocaleData/it_IT/LC_MESSAGES/App-Sqitch.mo b/xt/locale/LocaleData/it_IT/LC_MESSAGES/App-Sqitch.mo new file mode 100644 index 0000000000000000000000000000000000000000..bbb9aa0994ba0b9c77304efa120c87be950c44b8 GIT binary patch literal 460 zcmbV|K~BRk5JdxmO_r=#SQSeglBlYxP!JLnwNfhz1QzUu#3Y7vrr2%;LL7rLz&*GJ zXJOJH%9@d%#+E%_-~VfCwQwVdO&s@6+J z(`BfP}_Q1lTXP2t7Y|cjo zQBkSF(0pbCwsy!0jW3xhnEqpaJRJ8|pNN9cKPGev+1B%neLMB!_GT4m+!t91#wvGk qm7dD(>RoOBP8r$9jB<@dBD%L6lJ_@NBov\n" +"Language-Team: Sqitch Hackers \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +msgid "\"{command}\" is not a valid command" +msgstr "\"{command}\" ist ein ungültiger Befehl" diff --git a/xt/locale/po/fr_FR.po b/xt/locale/po/fr_FR.po new file mode 100644 index 000000000..17df56188 --- /dev/null +++ b/xt/locale/po/fr_FR.po @@ -0,0 +1,12 @@ +msgid "" +msgstr "" +"Language: fr\n" +"Project-Id-Version: Sqitch 1.4.1\n" +"PO-Revision-Date: 22024-01-06T21:10:06Z\n" +"Last-Translator: Sqitch Hackers \n" +"Language-Team: Sqitch Hackers \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +msgid "\"{command}\" is not a valid command" +msgstr "\"{command}\" n'est pas une commande valide" diff --git a/xt/locale/po/it_IT.po b/xt/locale/po/it_IT.po new file mode 100644 index 000000000..0edd5753c --- /dev/null +++ b/xt/locale/po/it_IT.po @@ -0,0 +1,12 @@ +msgid "" +msgstr "" +"Language: it\n" +"Project-Id-Version: Sqitch 1.4.1\n" +"PO-Revision-Date: 22024-01-06T21:10:06Z\n" +"Last-Translator: Sqitch Hackers \n" +"Language-Team: Sqitch Hackers \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +msgid "\"{command}\" is not a valid command" +msgstr "\"{command}\" non è un comando valido" diff --git a/xt/locale/test-cli.t b/xt/locale/test-cli.t new file mode 100644 index 000000000..318c47959 --- /dev/null +++ b/xt/locale/test-cli.t @@ -0,0 +1,57 @@ +#!/usr/bin/perl -w + +use strict; +use warnings; +use Test::More tests => 4; +use File::Spec; +use Capture::Tiny qw(:all); + +# Requires xt/locale/LocaleData; see xt/lcoale/README.md for details. +my @cli = (qw(-Ilib -CAS -Ixt/locale), File::Spec->catfile(qw(bin sqitch))); + +# Windows has its own locale names for some reason. +# https://stackoverflow.com/q/77771097/79202 +my %lang_for = ( + "en_US" => 'English_United States.1252', + "fr_FR" => 'French_France.1252', + "de_DE" => 'German_Germany.1252', + "it_IT" => 'Italian_Italy.1252', +); + +# Other supported OSes just use the code name. +if ($^O ne 'MSWin32') { + $lang_for{$_} = "$_.UTF-8" for keys %lang_for; +} + +# Each locale must be installed on the local system. Adding a new lang? Also add +# the relevant language-pack-XX package to os.yml and perl.yml. +for my $tc ( + { lang => 'en_US', err => q{"nonesuch" is not a valid command} }, + { lang => 'fr_FR', err => q{"nonesuch" n'est pas une commande valide} }, + { lang => 'de_DE', err => q{"nonesuch" ist ein ungültiger Befehl} }, + { lang => 'it_IT', err => q{"nonesuch" non è un comando valido} }, +) { + subtest $tc->{lang} || 'default' => sub { + local $ENV{LC_ALL} = $lang_for{$tc->{lang}}; + + # Test successful run. + my ($stdout, $stderr, $exit) = capture { system $^X, @cli, 'help' }; + is $exit >> 8, 0, 'Should have exited normally'; + like $stdout, qr/\AUsage\b/, 'Should have usage statement in STDOUT'; + is $stderr, '', 'Should have no STDERR'; + + # Test localized error. + ($stdout, $stderr, $exit) = capture { system $^X, @cli, 'nonesuch' }; + is $exit >> 8, 2, 'Should have exit val 2'; + is $stdout, '', 'Should have no STDOUT'; + TODO: { + # The Windows locales don't translate into the language codes + # recognized by Locale::TextDomain/gettext. Not at all sure how to + # fix this. Some relevant notes in the FAQ: + # https://metacpan.org/dist/libintl-perl/view/lib/Locale/libintlFAQ.pod#How-do-I-switch-languages-or-force-a-certain-language-independently-from-user-settings-read-from-the-environment? + local $TODO = $^O eq 'MSWin32' ? 'localization fails on Windows' : ''; + like $stderr, qr/\A\Q$tc->{err}/, + 'Should have localized error message in STDERR'; + } + }; +}