mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Update Custom Exception Handler section of Internationalization guide
The previous example with just_raise_that_exception method stopped working because MissingTranslation is not an instance of Exception class any more, but has a +to_exception+ method. Also the cleaner way is to re-raise only the desired exception, passing everything else to the default ExceptionHandler. Additionally this re-raising conflicts with Pluralization backend thus we have to add a check that certain missing translation keys should be ignored allowing the backend to fall back to the default pluralization rule.
This commit is contained in:
parent
b11113f924
commit
74fa0d3db0
1 changed files with 21 additions and 5 deletions
|
@ -866,19 +866,35 @@ The I18n API will catch all of these exceptions when they are thrown in the back
|
|||
|
||||
The reason for this is that during development you'd usually want your views to still render even though a translation is missing.
|
||||
|
||||
In other contexts you might want to change this behaviour, though. E.g. the default exception handling does not allow to catch missing translations during automated tests easily. For this purpose a different exception handler can be specified. The specified exception handler must be a method on the I18n module:
|
||||
In other contexts you might want to change this behaviour, though. E.g. the default exception handling does not allow to catch missing translations during automated tests easily. For this purpose a different exception handler can be specified. The specified exception handler must be a method on the I18n module or a class with +#call+ method:
|
||||
|
||||
<ruby>
|
||||
module I18n
|
||||
def self.just_raise_that_exception(*args)
|
||||
raise args.first
|
||||
class JustRaiseHandler < ExceptionHandler
|
||||
def call(exception, locale, key, options)
|
||||
if exception.is_a?(MissingTranslation)
|
||||
raise exception.to_exception
|
||||
else
|
||||
super
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
I18n.exception_handler = :just_raise_that_exception
|
||||
I18n.exception_handler = I18n::JustRaiseHandler.new
|
||||
</ruby>
|
||||
|
||||
This would re-raise all caught exceptions including +MissingTranslationData+.
|
||||
This would re-raise only the +MissingTranslationData+ exception, passing all other input to the default exception handler.
|
||||
|
||||
However, if you are using +I18n::Backend::Pluralization+ this handler will also raise +I18n::MissingTranslationData: translation missing: en.i18n.plural.rule+ exception that should normally be ignored to fall back to the default pluralization rule for English locale. To avoid this you may use additional check for translation key:
|
||||
|
||||
<ruby>
|
||||
if exception.is_a?(MissingTranslation) && key.to_s != 'i18n.plural.rule'
|
||||
raise exception.to_exception
|
||||
else
|
||||
super
|
||||
end
|
||||
</ruby>
|
||||
|
||||
Another example where the default behaviour is less desirable is the Rails TranslationHelper which provides the method +#t+ (as well as +#translate+). When a +MissingTranslationData+ exception occurs in this context, the helper wraps the message into a span with the CSS class +translation_missing+.
|
||||
|
||||
|
|
Loading…
Reference in a new issue