ruby-i18n/i18n

Frozen Hashes with Psych 3.3.2+/4.0 from YAML

Opened this issue · 1 comments

Following up on #648

This change happens whenever psych 3.3.2+ (or 4.0/5.0) is loaded, either as a gem, or as part of default gems for Ruby 3.1/Rails 7.1 (or irb 1.8.0 which brought in a new psych via ruby/irb#703, though they are reverting that part ).

Previous ruby's (3.0/2.7.8/etc) had earlier versions of psych as a Default gem so folks wouldn't have run into this unless they intentionally loaded a new psych version.

The change in psych is:
ruby/psych@cb50aa8

This is because unsafe_load_files now exists so the hash is now frozen by i18n.

if YAML.respond_to?(:unsafe_load_file) # Psych 4.0 way
[YAML.unsafe_load_file(filename, symbolize_names: true, freeze: true), true]
else

There's a few scenarios this can break, but as an example, one backend this breaks is https://github.com/annkissam/i18n-recursive-lookup (which admittedly, is pretty old)

due to https://github.com/annkissam/i18n-recursive-lookup/blob/766750f845a4e0509b62fdc6d1be3137be8d1421/lib/i18n/backend/recursive_lookup.rb#L50

which tries to recursively update the backend.

so 2 questions:

  • Any recommendations on alternative backends for recursive lookups that work with modern i18n?
  • or a hook to skip freezing if needed would be great
radar commented

Related to #658.