This project is archived and is in readonly mode.
Customize I18n::MissingTranslationData
Reported by Jérémie Horhant (Titinux) | October 11th, 2010 @ 12:13 PM | in 3.1
In my project I need to customize the output of translate/t
method
when there is no translation found. I've follow the rails guide
about
I18n API section 6.2 (http://edgeguides.rubyonrails.org/i18n.html#using-different-excepti...)
and made a custom exception handler in an initializer file.
module I18n
def custom_handler(exception, key, locale, options)
case exception
when I18n::MissingTranslationData
I18n.normalize_keys(locale, key, options[:scope]).join('.')
else
raise exception
end
end
end
I18n.exception_handler = :custom_handler
But this has no effect. I think I've found the code responsible
for
this in
actionpack-3.0.0/lib/action_view/helpers/translation_helper.rb
line 27. The option raise is forced to true and the translate
methods
keeps the exception for itself with no possibility to replace
the
exception handler nor customize the output.
In my opinion rails should not force raise option to true and
make a
default exception handler. Thus it would be possible to declare
a
custom handler to make whatever we wants in response to
exceptions.
But may be I'm missing something...
Thanks in advance.
Titinux.
Comments and changes to this ticket
-
James Conroy-Finn October 13th, 2010 @ 01:43 PM
A custom exception handler needs to be defined on
I18n
itself. The code in the guide is wrong.module I18n def self.custom_handler(exception, key, locale, options) # custom error handling logic end end I18n.exception_handler = :custom_handler
…should do the trick.
-
James Conroy-Finn October 13th, 2010 @ 02:38 PM
By the way, if you use the
translate
ort
helper in any of your views your custom error handling will be bypassed because Rails specifies:raise => true
as an option when callingI18n.translate
.The result of this option is that an exception is raised before your custom error handling method is called. Hopefully this is something that will change in Rails soon.
-
James Conroy-Finn October 13th, 2010 @ 02:39 PM
Really wish I could edit updates! I didn't read the last couple of paragraphs in you OP. Apologies.
-
Aditya Sanghi October 13th, 2010 @ 06:08 PM
- Assigned user set to José Valim
- Importance changed from to Low
@james, yes there are a few limitations on Lighthouse but apparently ENTP are working on a major update.
I know what you mean, with rails hardcoding a :raise => true preventing user handling of lookup errors.
Assigning to Jose for his input on this.
Ideally you could submit a patch with tests which could help speed up the process.
-
José Valim October 13th, 2010 @ 06:27 PM
James, do you think you can provide a patch to solve this issue?
-
Jérémie Horhant (Titinux) October 13th, 2010 @ 10:48 PM
I continued my investigation and I found a puzzling behavior of the translate/t methods.
- If you are in a controller calling translate/t will use "http://github.com/rails/rails/blob/master/actionpack/lib/abstract_c..." definition.
- If you are in a view calling translate/t will use "http://github.com/rails/rails/blob/master/actionpack/lib/action_vie..." definition.
- And if you call I18n.translate instead of translate it will use this one : "http://github.com/mattetti/i18n/blob/master/lib/i18n.rb"
These three implementations have different behaviors this is puzzling. The first one is just calling the third one but the second is doing a lot of work. The second is not perfect (not customizable and restrictive, cf the beginning of this ticket) but it doing some cool things (translation naming convention ending with _html or .html is really a good idea).
I know that I am just complaining but I'm new to rails and I'm afraid of not being able to produce a clean patch with tests. Eventually I could fix the documentation when changes have been made.
-
José Valim December 4th, 2010 @ 05:48 PM
- State changed from new to resolved
- Milestone set to 3.1
This has been changed and fixed in Rails master using the new I18n 0.5.0 API.
Create your profile
Help contribute to this project by taking a few moments to create your personal profile. Create your profile »
<h2 style="font-size: 14px">Tickets have moved to Github</h2>
The new ticket tracker is available at <a href="https://github.com/rails/rails/issues">https://github.com/rails/rails/issues</a>