Tcl Source Code

View Ticket
Login
Ticket UUID: 2c0f49e26c27847ace39b90258beedea3e79eead
Title: Tcl 9 clock format -locale does not look up locale children if parent locale used first
Type: Bug Version: 8.7+
Submitter: apnadkarni Created on: 2025-03-04 08:07:15
Subsystem: 16. Commands A-H Assigned To: nobody
Priority: 5 Medium Severity: Important
Status: Closed Last Modified: 2025-03-04 15:57:30
Resolution: Fixed Closed By: sebres
    Closed on: 2025-03-04 15:57:30
Description:

Running the following script in Tcl 8.6 and Tcl 9 gives different results, Tcl 8.6 seems correct behavior.

package require msgcat
namespace eval ::tcl::clock {
    ::msgcat::mcset fr_xx DATE_FORMAT "%e|%B|%Y"
}
puts [package require Tcl]
puts [clock format 0 -format %x -locale fr]
puts [clock format 0 -format %x -locale fr_xx]

Output from Tcl 8.6:

8.6.16
 1 janvier 1970
 1|janvier|1970 <- Note pipe separator

Output from 9.0.1:

9.0.1
 1 janvier 1970
 1 janvier 1970 <- fr_xx format seemingly ignored

If the line for the fr locale is commented, Tcl 9 correctly prints the fr_xx format.

User Comments: sebres added on 2025-03-04 15:57:30:

Fixed in [dc5c5857c146c665] and merged to all derived branches.


sebres added on 2025-03-04 15:04:38:

Good catch, Ashok!

The reason for that is that new clock-engine caching the msgcat dictionary internally in merged catalog (from parent to child locale), but more important here is that "%x" is so called "localized" format (since it expanding in ::tcl::clock::LocalizeFormat) and its result becomes also cached in merged catalog with keys FMT_* (here by FMT_%x), but (because it is not overwritten), the value remains as the value from parent catalog (after merge in ::tcl::clock::mcMerge).

The fix is simple, so I'll fix it now (and cover by a test).