Forum: Rails I18n Restful authentication by_password not translated

56cca67a2c0a19b1981e725baf93e745?d=identicon&s=25 James Gaston (Guest)
on 2011-02-12 15:14
(Received via mailing list)
I'm running rails 2.3.8 and restful_authentication and I find the
error messages generated in the by_password.rb are not appearing,
instead I get the user-hostile {{attribute}} {{message}} messages.
I've tried and tried to figure a fix and, aside from discarding
restful_authentication (which I may do, at a later date) I can't solve
the problem. Any suggestions?

thanks
- James
4a551074ddba4460f95d011c47190d0e?d=identicon&s=25 Henrik --- (malesca)
on 2011-02-12 15:16
(Received via mailing list)
Replace {{}} with %{}

Sent from my iPhone
56cca67a2c0a19b1981e725baf93e745?d=identicon&s=25 James Gaston (Guest)
on 2011-02-12 21:03
(Received via mailing list)
Thanks, but I've gone down this route already. The key thing to note:
all
model errors in my app are printed correctly except one: the
restful_authentication signup step. For example, here is my en.yml:

en:
  use_only_lets:
    use only letters, numbers
  passwordpresent:
    password required
  confirmation:
    password doesn't match confirmation
  passwordlength:
    password must be 6-40 characters long
  activerecord:
    errors:
      template:
        body: There were problems with the following fields
        header:
          one: 1 error prohibited this %{model} from being saved
          other: "%{count} errors prohibited this %{model} from being
saved"
        messages:
          inclusion: "is not included in the list"
          exclusion: "is reserved"
          invalid: "is invalid"
          confirmation: "doesn't match confirmation"
          accepted: "must be accepted"
          empty: "can't be empty"
          blank: "can't be blank"
          too_long: "is too long (maximum is %{count} characters)"
          too_short: "is too short (minimum is %{count} characters)"
          wrong_length: "is the wrong length (should be %{count}
characters)"
          taken: "has already been taken"
          not_a_number: "is not a number"
          greater_than: "must be greater than %{count}"
          greater_than_or_equal_to: "must be greater than or equal to
%{count}"
          equal_to: "must be equal to %{count}"
          less_than: "must be less than %{count}"
          less_than_or_equal_to: "must be less than or equal to
%{count}"
          odd: "must be odd"
          even: "must be even"
          bad_email: "Email should look like an email address"
          bad_login: "Use only letters and numbers for your user name"
          bad_name: "Use only legal characters in your name"
4a551074ddba4460f95d011c47190d0e?d=identicon&s=25 Henrik --- (malesca)
on 2011-02-12 22:14
(Received via mailing list)
Could you give more detail on exactly what the problem is, what you've
tried and what you expect?

I looked at by_password.rb at
https://github.com/technoweenie/restful-authentica...
and it does things like

    validates_presence_of :password, :if => :password_required?

Do you get the wrong message from those? What message do you get and
what message did you expect instead?

What's the deal with your custom keys like "en.passwordpresent"? Are
you attempting to have Rails use those? If so, how?
56cca67a2c0a19b1981e725baf93e745?d=identicon&s=25 James Gaston (Guest)
on 2011-02-13 01:01
(Received via mailing list)
To summarize: In my rails 2.3.8 app, which uses restful_authentication,
all
model error messages (and there are a lot) work exactly as desired
except
for the scenario where a new user is signing up for the first time.
Unfortunately this leaves potential new users with a really bad
impression.

For example, if the new user fails to enter a matching password -
password
confirmation, or makes any other entry error (no password, no login,
etc),
the message is like the following:
1 error prohibited this user from being saved

There were problems with the following fields

   - {{attribute}} {{message}}


The {{attribute}}{{message}} isn't translated. And yes I know to use %{}
and
not {{}} in en.yml.  Clearly there is something I am doing wrong but
I've
exhausted my ideas. Last I tried was as follows, which is an excerpt
from
by_password.rb:

module Authentication
  module ByPassword
    # Stuff directives into including module
    def self.included(recipient)
      recipient.extend(ModelClassMethods)
      recipient.class_eval do
        include ModelInstanceMethods

        # Virtual attribute for the unencrypted password
        attr_accessor :password
        validates_presence_of     :password,
:message=>I18n.t(:passwordpresent), :if => :password_required?
        validates_presence_of     :password_confirmation,
:message=>I18n.t(:confirmation), :if => :password_required?
        validates_confirmation_of :password,
 :message=>I18n.t(:confirmation), :if => :password_required?
        validates_length_of       :password, :within => 6..40,
:message=>I18n.t(:passwordlength), :if => :password_required?
        before_save :encrypt_password
      end
    end # #included directives

# Note the addition of i18n.t() calls.

thanks
- James
4a551074ddba4460f95d011c47190d0e?d=identicon&s=25 Henrik --- (malesca)
on 2011-02-13 09:43
(Received via mailing list)
> For example, if the new user fails to enter a matching password - password
> confirmation, or makes any other entry error (no password, no login, etc),
> the message is like the following:
>
> 1 error prohibited this user from being saved
>
> There were problems with the following fields
>
> {{attribute}} {{message}}

Aha. Probably a Rails gem version issue - try this:
http://www.taylorbrooks.org/error-messages-in-rail...

> The {{attribute}}{{message}} isn't translated. And yes I know to use %{} and
> not {{}} in en.yml. Clearly there is something I am doing wrong but I've
> exhausted my ideas.Last I tried was as follows, which is an excerpt from
> by_password.rb:
>    validates_presence_of   :password,
> :message=>I18n.t(:passwordpresent), :if => :password_required?

Not relevant anymore, but for good measure: if you use I18n.t in a
class context like that, IIRC it will always use the default locale in
production (since the class isn't reloaded for every request).
Instead, you just specify the symbol (:message => :passwordpresent)
and make sure to put the translation key in the expected place
(somewhere under activerecord.errors I believe).
This topic is locked and can not be replied to.