I18n default locale strange behavior in Rails 3 beta 4 (bug?)

I could finally isolate the strange issue regarding I18n in my application.

For reproducing it, do the following (using rails 3 beta 4 gem):

rails new i18nproblem

Create these files:

app/models/mymodel.rb

require 'something' class Mymodel    include Something # comment this line and the issue is gone end

lib/something.rb

module Something    def self.included(base)      puts I18n.locale    end end

Change default locale to :'pt-BR' in config/application.rb

Open a console in test environment:

rails c test

> I18n.locale (yields :en) > I18n.default_locale (yields :"pt-BR")

Commenting the "include Something" line, this strange behavior disappear (both locale and default_locale returns :'pt-BR')

Is this behavior expected? Am I assuming something wrong? Is it a bug? Any hints?

Thanks in advance,

Rodrigo.

Sorry for the personal reply, but I was no list member at the time this was sent, and I can't find another way to respond.

I could finally isolate the strange issue regarding I18n in my application.

I noticed a very similar problem which I described on the rubyonrails- talk list in http://groups.google.com/group/rubyonrails-talk/msg/0c99f2d29afcf3aa In short: I set config.i18n.default_locale=:de in config/application.rb in development environment: I18n.default_locale=:de, I18n.locale=:de and in production environment: I18n.default_locale=:de, I18n.locale=:en

I use 3.0.0rc2, ruby 1.8.7 and 1.9.2. it shouldn't

app/models/mymodel.rb

require 'something' class Mymodel include Something # comment this line and the issue is gone end

lib/something.rb

module Something def self.included(base) puts I18n.locale end end

Change default locale to :'pt-BR' in config/application.rb

Open a console in test environment:

rails c test

> I18n.locale (yields :en) > I18n.default_locale (yields :"pt-BR")

Commenting the "include Something" line, this strange behavior disappear (both locale and default_locale returns :'pt-BR')

I don't have explicit requires in my models, but I use authlogic (2.1.5), which does require files in the modules that are included in model classes, and this behavior goes away if I uncomment the acts_as_authentic call in my user model.

Is this behavior expected? Am I assuming something wrong? Is it a bug? Any hints?

It would be great if these questions could be answered before a Rails 3 final release is out. There isn't necessarily a bug in the rails source code, but I can hardly believe this behavior is expected or even intended.

Thanks in advance,

Rodrigo.

Thanks as well Rainer

Hi, I've had the exact same problem, running Rails 3.0.0 + authlogic 2.1.6

For now, I just fixed it by brute-forcing it in production.rb: config.i18n.locale = :da

It does feel awkward, though, since config.i18n.default_locale is set in application.rb. I'm not really sure what the correct behaviour should be..?

FYI: Lighthouse ticket here: https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/5145-i18n-locale-may-be-reset-to-en-if-called-from-a-plugingem

Hey,

An "easier" workaround would be to write "I18n.default_locale = :whatever" instead of "config.i18n.default_locale = :whatever".

Nevertheless, the problem seems to be that the modules and classes are loaded during the eager_load process, while the I18n configuration is only set on an after_initialize hook.

I18n.locale is called before the config.i18n.default_locale is propagated to the I18n class. If we take a look at the "locale" method, we see that it will only check the default_locale once. This renders the default_locale= call useless.

According to a source code comment located in the activesupport-3.0.0/ lib/active_support/i18n_railtie.rb file, the configuration is set on an after_initialize hook "since a lot of configuration is still usually done in application initializers". To fix this problem, I think that this configuration would need to be moved to somewhere before the eager_loading, but I don't know if that is even possible, or how to do it.