From 6c4f3be929f1f427d6767050848f2fbee8c1f05f Mon Sep 17 00:00:00 2001 From: fatkodima Date: Wed, 27 Dec 2017 02:51:42 +0200 Subject: [PATCH] Unify raise_on_missing_translations for views and controllers --- .../dummy/config/environments/development.rb | 2 +- .../test/dummy/config/environments/test.rb | 2 +- actionpack/CHANGELOG.md | 8 ++++++++ .../lib/abstract_controller/translation.rb | 6 +++++- actionpack/test/abstract/translation_test.rb | 16 ++++++++++++++++ .../dummy/config/environments/development.rb | 2 +- .../test/dummy/config/environments/test.rb | 2 +- actionview/CHANGELOG.md | 8 ++++++++ actionview/lib/action_view/railtie.rb | 6 ++++++ .../dummy/config/environments/development.rb | 2 +- .../test/dummy/config/environments/test.rb | 2 +- activesupport/lib/active_support/i18n_railtie.rb | 12 ++++++++++++ guides/source/configuring.md | 6 +++--- .../config/environments/development.rb.tt | 2 +- .../app/templates/config/environments/test.rb.tt | 2 +- 15 files changed, 66 insertions(+), 12 deletions(-) diff --git a/actionmailbox/test/dummy/config/environments/development.rb b/actionmailbox/test/dummy/config/environments/development.rb index 9bb8731d7a..6ecb772203 100644 --- a/actionmailbox/test/dummy/config/environments/development.rb +++ b/actionmailbox/test/dummy/config/environments/development.rb @@ -55,7 +55,7 @@ Rails.application.configure do config.assets.quiet = true # Raises error for missing translations - # config.action_view.raise_on_missing_translations = true + # config.i18n.raise_on_missing_translations = true # Annotate rendered view with file names # config.action_view.annotate_rendered_view_with_filenames = true diff --git a/actionmailbox/test/dummy/config/environments/test.rb b/actionmailbox/test/dummy/config/environments/test.rb index 8c4c78505f..d46aad6b48 100644 --- a/actionmailbox/test/dummy/config/environments/test.rb +++ b/actionmailbox/test/dummy/config/environments/test.rb @@ -42,7 +42,7 @@ Rails.application.configure do config.active_support.deprecation = :stderr # Raises error for missing translations - # config.action_view.raise_on_missing_translations = true + # config.i18n.raise_on_missing_translations = true # Annotate rendered view with file names # config.action_view.annotate_rendered_view_with_filenames = true diff --git a/actionpack/CHANGELOG.md b/actionpack/CHANGELOG.md index 5b4cb30a0b..73d93627f9 100644 --- a/actionpack/CHANGELOG.md +++ b/actionpack/CHANGELOG.md @@ -1,3 +1,11 @@ +* Add raise_on_missing_translations support for controllers. + + This configuration determines whether an error should be raised for missing translations. + It can be enabled through `config.i18n.raise_on_missing_translations`. Note that described + configuration also affects raising error for missing translations in views. + + *fatkodima* + * Added `compact` and `compact!` to `ActionController::Parameters`. *Eugene Kenny* diff --git a/actionpack/lib/abstract_controller/translation.rb b/actionpack/lib/abstract_controller/translation.rb index f109801780..354e557711 100644 --- a/actionpack/lib/abstract_controller/translation.rb +++ b/actionpack/lib/abstract_controller/translation.rb @@ -4,6 +4,8 @@ require "active_support/core_ext/symbol/starts_ends_with" module AbstractController module Translation + mattr_accessor :raise_on_missing_translations, default: false + # Delegates to I18n.translate. Also aliased as t. # # When the given key starts with a period, it will be scoped by the current @@ -20,7 +22,9 @@ module AbstractController options[:default] = defaults.flatten key = "#{path}.#{action_name}#{key}" end - I18n.translate(key, **options) + + i18n_raise = options.fetch(:raise, self.raise_on_missing_translations) + I18n.translate(key, **options, raise: i18n_raise) end alias :t :translate diff --git a/actionpack/test/abstract/translation_test.rb b/actionpack/test/abstract/translation_test.rb index 7138044c03..2fea7988bd 100644 --- a/actionpack/test/abstract/translation_test.rb +++ b/actionpack/test/abstract/translation_test.rb @@ -43,6 +43,22 @@ module AbstractController assert_respond_to @controller, :l end + def test_raises_missing_translation_message_with_raise_config_option + AbstractController::Translation.raise_on_missing_translations = true + + assert_raise(I18n::MissingTranslationData) do + @controller.t("translations.missing") + end + ensure + AbstractController::Translation.raise_on_missing_translations = false + end + + def test_raises_missing_translation_message_with_raise_option + assert_raise(I18n::MissingTranslationData) do + @controller.t(:"translations.missing", raise: true) + end + end + def test_lazy_lookup @controller.stub :action_name, :index do assert_equal "bar", @controller.t(".foo") diff --git a/actiontext/test/dummy/config/environments/development.rb b/actiontext/test/dummy/config/environments/development.rb index 9bb8731d7a..6ecb772203 100644 --- a/actiontext/test/dummy/config/environments/development.rb +++ b/actiontext/test/dummy/config/environments/development.rb @@ -55,7 +55,7 @@ Rails.application.configure do config.assets.quiet = true # Raises error for missing translations - # config.action_view.raise_on_missing_translations = true + # config.i18n.raise_on_missing_translations = true # Annotate rendered view with file names # config.action_view.annotate_rendered_view_with_filenames = true diff --git a/actiontext/test/dummy/config/environments/test.rb b/actiontext/test/dummy/config/environments/test.rb index 8c4c78505f..d46aad6b48 100644 --- a/actiontext/test/dummy/config/environments/test.rb +++ b/actiontext/test/dummy/config/environments/test.rb @@ -42,7 +42,7 @@ Rails.application.configure do config.active_support.deprecation = :stderr # Raises error for missing translations - # config.action_view.raise_on_missing_translations = true + # config.i18n.raise_on_missing_translations = true # Annotate rendered view with file names # config.action_view.annotate_rendered_view_with_filenames = true diff --git a/actionview/CHANGELOG.md b/actionview/CHANGELOG.md index 14382a33bd..4197c4c021 100644 --- a/actionview/CHANGELOG.md +++ b/actionview/CHANGELOG.md @@ -1,3 +1,11 @@ +* Deprecate `config.action_view.raise_on_missing_translations` in favor of + `config.i18n.raise_on_missing_translations`. + + New generalized configuration option now determines whether an error should be raised + for missing translations in controllers and views. + + *fatkodima* + * Instrument layout rendering in `TemplateRenderer#render_with_layout` as `render_layout.action_view`, and include (when necessary) the layout's virtual path in notification payloads for collection and partial renders. *Zach Kemp* diff --git a/actionview/lib/action_view/railtie.rb b/actionview/lib/action_view/railtie.rb index 5744b57a83..70491c27d9 100644 --- a/actionview/lib/action_view/railtie.rb +++ b/actionview/lib/action_view/railtie.rb @@ -43,6 +43,12 @@ module ActionView config.after_initialize do |app| ActiveSupport.on_load(:action_view) do app.config.action_view.each do |k, v| + if k == :raise_on_missing_translations + ActiveSupport::Deprecation.warn \ + "action_view.raise_on_missing_translations is deprecated and will be removed in Rails 6.2. " \ + "Set i18n.raise_on_missing_translations instead. " \ + "Note that this new setting also affects how missing translations are handled in controllers." + end send "#{k}=", v end end diff --git a/activestorage/test/dummy/config/environments/development.rb b/activestorage/test/dummy/config/environments/development.rb index d114429300..71a0ff6d2b 100644 --- a/activestorage/test/dummy/config/environments/development.rb +++ b/activestorage/test/dummy/config/environments/development.rb @@ -44,7 +44,7 @@ Rails.application.configure do config.assets.quiet = true # Raises error for missing translations - # config.action_view.raise_on_missing_translations = true + # config.i18n.raise_on_missing_translations = true # Annotate rendered view with file names # config.action_view.annotate_rendered_view_with_filenames = true diff --git a/activestorage/test/dummy/config/environments/test.rb b/activestorage/test/dummy/config/environments/test.rb index fa8f2dcb59..ad60d927e1 100644 --- a/activestorage/test/dummy/config/environments/test.rb +++ b/activestorage/test/dummy/config/environments/test.rb @@ -34,7 +34,7 @@ Rails.application.configure do config.action_controller.allow_forgery_protection = false # Raises error for missing translations - # config.action_view.raise_on_missing_translations = true + # config.i18n.raise_on_missing_translations = true # Annotate rendered view with file names # config.action_view.annotate_rendered_view_with_filenames diff --git a/activesupport/lib/active_support/i18n_railtie.rb b/activesupport/lib/active_support/i18n_railtie.rb index 2eb4dee947..394b67a6eb 100644 --- a/activesupport/lib/active_support/i18n_railtie.rb +++ b/activesupport/lib/active_support/i18n_railtie.rb @@ -48,6 +48,8 @@ module I18n app.config.i18n.load_path.unshift(*value.flat_map(&:existent)) when :load_path I18n.load_path += value + when :raise_on_missing_translations + forward_raise_on_missing_translations_config(app) else I18n.send("#{setting}=", value) end @@ -73,6 +75,16 @@ module I18n @i18n_inited = true end + def self.forward_raise_on_missing_translations_config(app) + ActiveSupport.on_load(:action_view) do + self.raise_on_missing_translations = app.config.i18n.raise_on_missing_translations + end + + ActiveSupport.on_load(:action_controller) do + AbstractController::Translation.raise_on_missing_translations = app.config.i18n.raise_on_missing_translations + end + end + def self.include_fallbacks_module I18n.backend.class.include(I18n::Backend::Fallbacks) end diff --git a/guides/source/configuring.md b/guides/source/configuring.md index 34ccf28f21..7dfc40c144 100644 --- a/guides/source/configuring.md +++ b/guides/source/configuring.md @@ -348,6 +348,9 @@ All these configuration options are delegated to the `I18n` library. * `config.i18n.load_path` sets the path Rails uses to look for locale files. Defaults to `config/locales/*.{yml,rb}`. +* `config.i18n.raise_on_missing_translations` determines whether an error should be raised for missing translations +in controllers and views. This defaults to `false`. + * `config.i18n.fallbacks` sets fallback behavior for missing translations. Here are 3 usage examples for this option: * You can set the option to `true` for using default locale as fallback, like so: @@ -654,9 +657,6 @@ Defaults to `'signed cookie'`. The default setting is `true`, which uses the partial at `/admin/articles/_article.erb`. Setting the value to `false` would render `/articles/_article.erb`, which is the same behavior as rendering from a non-namespaced controller such as `ArticlesController`. -* `config.action_view.raise_on_missing_translations` determines whether an - error should be raised for missing translations. This defaults to `false`. - * `config.action_view.automatically_disable_submit_tag` determines whether `submit_tag` should automatically disable on click, this defaults to `true`. diff --git a/railties/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt b/railties/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt index ec6246f0e2..555c975cbf 100644 --- a/railties/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +++ b/railties/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt @@ -72,7 +72,7 @@ Rails.application.configure do <%- end -%> # Raises error for missing translations. - # config.action_view.raise_on_missing_translations = true + # config.i18n.raise_on_missing_translations = true # Annotate rendered view with file names # config.action_view.annotate_rendered_view_with_filenames = true diff --git a/railties/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt b/railties/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt index 68ecdc83a2..43aff9c405 100644 --- a/railties/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +++ b/railties/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt @@ -62,7 +62,7 @@ Rails.application.configure do config.active_support.disallowed_deprecation_warnings = [] # Raises error for missing translations. - # config.action_view.raise_on_missing_translations = true + # config.i18n.raise_on_missing_translations = true # Annotate rendered view with file names # config.action_view.annotate_rendered_view_with_filenames = true