diff options
| author | Martin Whitaker <mageia@martin-whitaker.me.uk> | 2025-11-02 12:50:05 +0000 |
|---|---|---|
| committer | Martin Whitaker <mageia@martin-whitaker.me.uk> | 2025-11-02 18:20:25 +0000 |
| commit | b518f9f16b0fc09802d238eef91de41ed54de282 (patch) | |
| tree | 767b002668bf26c851b8bfee986bef75eee0ad62 /perl-install | |
| parent | 46d9cd2601cdf11081c4f83fa0be21b3dbc060f2 (diff) | |
| download | drakx-master.tar drakx-master.tar.gz drakx-master.tar.bz2 drakx-master.tar.xz drakx-master.zip | |
Since Perl 5.28, Perl has used the thread-safe uselocale() functions
from the C standard library when setting the locale. Once a thread-safe
locale setting has been made, the Locale::gettext functions will use
those settings, not the global locale settings. So calling the drakx
c::setlocale() and c::init_setlocale() functions, which still use the
underlying setlocale() function from the C standard library normally
has no effect. However, prior to Perl 5.38, there was a bug in Perl
that could cause the main thread to revert to using the global locale
settings, and it it would seem this bug was being triggered by the
stage2 installer, meaning it still properly translated the UI after
the language selection step. Now we have a newer version of Perl, this
is no longer so, and the UI contiues to be in English after the user
has selected a different language (mga#34656).
The POSIX::setlocale() function affects the thread-safe locale, so can
be used to fix this bug.
This patch removes the c::setlocale() function to prevent reintroduction
of this bug, and moves the c::init_locale() function to the common module.
Diffstat (limited to 'perl-install')
| -rw-r--r-- | perl-install/NEWS | 2 | ||||
| -rw-r--r-- | perl-install/any.pm | 2 | ||||
| -rwxr-xr-x | perl-install/c/stuff.xs.pl | 11 | ||||
| -rw-r--r-- | perl-install/common.pm | 21 | ||||
| -rw-r--r-- | perl-install/install/NEWS | 2 | ||||
| -rw-r--r-- | perl-install/install/gtk.pm | 2 | ||||
| -rw-r--r-- | perl-install/install/steps_gtk.pm | 2 | ||||
| -rw-r--r-- | perl-install/lang.pm | 2 | ||||
| -rw-r--r-- | perl-install/standalone.pm | 2 |
9 files changed, 27 insertions, 19 deletions
diff --git a/perl-install/NEWS b/perl-install/NEWS index 22339bd87..08ebc99d0 100644 --- a/perl-install/NEWS +++ b/perl-install/NEWS @@ -1,3 +1,5 @@ +- use POSIX::setlocale() instead of c::setlocale() to ensure Locale::gettext + uses any locale changes we make (mga#34656) - use task-plasma-minimal instead of task-plasma5-minimal - fix bugs in any::sessions() (mga#33738) diff --git a/perl-install/any.pm b/perl-install/any.pm index ab93036dc..dc0d112e1 100644 --- a/perl-install/any.pm +++ b/perl-install/any.pm @@ -1450,7 +1450,7 @@ sub selectLanguage_standalone { ]); $locale->{utf8} = !$non_utf8; lang::set($locale); - c::init_setlocale() if $in->isa('interactive::gtk'); + common::init_setlocale() if $in->isa('interactive::gtk'); lang::lang_changed($locale) if $old_lang ne $locale->{lang}; } diff --git a/perl-install/c/stuff.xs.pl b/perl-install/c/stuff.xs.pl index 1a148b497..8c780bb2a 100755 --- a/perl-install/c/stuff.xs.pl +++ b/perl-install/c/stuff.xs.pl @@ -189,17 +189,6 @@ is_secure_file(filename) OUTPUT: RETVAL -void -init_setlocale() - CODE: - setlocale(LC_ALL, ""); - setlocale(LC_NUMERIC, "C"); /* otherwise eval "1.5" returns 1 in fr_FR for example */ - -char * -setlocale(category, locale = NULL) - int category - char * locale - int lseek_sector(fd, sector, offset) int fd diff --git a/perl-install/common.pm b/perl-install/common.pm index 508e6b31f..23ae4ea6f 100644 --- a/perl-install/common.pm +++ b/perl-install/common.pm @@ -7,10 +7,11 @@ BEGIN { eval { require Locale::gettext } } #- allow common.pm to be used in drak use log; use run_program; +use POSIX qw(locale_h); use Exporter; our @ISA = qw(Exporter); -our @EXPORT = qw($SECTORSIZE N P N_ check_for_xserver files_exist formatTime MB formatXiB get_libdir get_parent_uid is_running is_uefi kernel_uefi_type makedev mageia_release mageia_release_info mount_efivars removeXiBSuffix require_root_capability setVirtual set_alternative set_l10n_sort set_permissions to_utf8 translate uefi_type unmakedev); +our @EXPORT = qw($SECTORSIZE N P N_ check_for_xserver files_exist formatTime MB formatXiB get_libdir get_parent_uid init_setlocale is_running is_uefi kernel_uefi_type makedev mageia_release mageia_release_info mount_efivars removeXiBSuffix require_root_capability setVirtual set_alternative set_l10n_sort set_permissions to_utf8 translate uefi_type unmakedev); # perl_checker: RE-EXPORT-ALL push @EXPORT, @MDK::Common::EXPORT; @@ -34,6 +35,20 @@ our $SECTORSIZE = 512; =over +=item init_setlocale() + +Initialise all locale categories. Set LC_NUMERIC to 'C' (otherwise eval "1.5" returns 1 +in fr_FR for example). Set all other categories according to the current value of the +LC_ALL environment variable, or if that is undefined, the LANG environment variable, or +if that is undefined, the system default. + +=cut + +sub init_setlocale() { + setlocale(LC_ALL, ''); + setlocale(LC_NUMERIC, 'C'); +} + =item N($format, ...) translate a message by calling gettext(). eg: @@ -171,8 +186,8 @@ only LC_COLLATE will have no effect. sub set_l10n_sort() { my $collation_locale = $ENV{LC_ALL}; if (!$collation_locale) { - $collation_locale = c::setlocale(c::LC_COLLATE()); - $collation_locale =~ /UTF-8/ or c::setlocale(c::LC_COLLATE(), "$collation_locale.UTF-8"); + $collation_locale = setlocale(LC_COLLATE); + $collation_locale =~ /UTF-8/ or setlocale(LC_COLLATE, "$collation_locale.UTF-8"); } } diff --git a/perl-install/install/NEWS b/perl-install/install/NEWS index 9a6552f2a..912b1cd1b 100644 --- a/perl-install/install/NEWS +++ b/perl-install/install/NEWS @@ -1,3 +1,5 @@ +- use POSIX::setlocale() instead of c::setlocale() to ensure Locale::gettext + uses any locale changes we make (mga#34656) - use task-plasma-minimal instead of task-plasma5-minimal - use mutter with X11 backend - Create /etc while creating installer system diff --git a/perl-install/install/gtk.pm b/perl-install/install/gtk.pm index f878e42d9..a6aad8516 100644 --- a/perl-install/install/gtk.pm +++ b/perl-install/install/gtk.pm @@ -212,7 +212,7 @@ q(<fontconfig> } Gtk3->init; - c::init_setlocale(); + common::init_setlocale(); } #------------------------------------------------------------------------------ diff --git a/perl-install/install/steps_gtk.pm b/perl-install/install/steps_gtk.pm index fa34c947c..a9ef359be 100644 --- a/perl-install/install/steps_gtk.pm +++ b/perl-install/install/steps_gtk.pm @@ -186,7 +186,7 @@ sub leavingStep { sub charsetChanged { my ($o) = @_; - c::init_setlocale(); + common::init_setlocale(); install::gtk::load_font($o); install::gtk::create_steps_window($o); } diff --git a/perl-install/lang.pm b/perl-install/lang.pm index a3c8aa7ea..5301bd1f3 100644 --- a/perl-install/lang.pm +++ b/perl-install/lang.pm @@ -1612,7 +1612,7 @@ sub bindtextdomain() { #- NB: not using $::isInstall to make it work more easily at install and standalone my $localedir = "$ENV{SHARE_PATH}/locale" . ($::prefix ? "_special" : ''); - c::init_setlocale(); + common::init_setlocale(); foreach (@::textdomains, 'libDrakX') { Locale::gettext::bind_textdomain_codeset($_, 'UTF-8'); Locale::gettext::bindtextdomain($_, $localedir); diff --git a/perl-install/standalone.pm b/perl-install/standalone.pm index 806ebf7cd..4b14255d0 100644 --- a/perl-install/standalone.pm +++ b/perl-install/standalone.pm @@ -20,7 +20,7 @@ $::isStandalone = 1; $ENV{SHARE_PATH} ||= "/usr/share"; eval { #- allow standalone.pm to be used in drakxtools-backend without perl-Locale-gettext - c::init_setlocale(); + common::init_setlocale(); Locale::gettext::bindtextdomain('libDrakX', "/usr/share/locale"); }; |
