Internationalize application’s text
When the UserSharesAMessageTest internationalizes the test step to
click on an <a> element that contains the text Share a Note with
I18n.translate("notes.index.new"), the following
error is raised:
Error:
UserSharesAMessageTest#test_visiting_the_index:
Capybara::ElementNotFound: Unable to find link or button "translation missing: en.notes.index.new"
test/system/user_shares_a_message_test.rb:8:in `block in <class:UserSharesAMessageTest>'
The key, notes.index.new was selected intentionally. The notes
portion corresponds to the notes controller’s internationalization
namespace. The index portion corresponds to the NotesController‘s
index action. The new portion is arbitrary, but represents the text
that will be rendered into an <a> element linking to the notes#new
route.
Capybara raises this error stating that the text "translation missing:
en.notes.index.new" is not present on the server-generated page. The
en portion prefixing the rest of the internationalization key is
derived from the request’s current locale (i.e. English). This error is
not particularly helpful in driving our next code change: rendering
"translation missing: en.notes.index.new" on the page is not a desired
behavior.
The text "translation missing: en.notes.index.new" comes from Rails’
flexible, forgiving default translation behavior while in
development and test environments.
This commit changes that default behavior.
First, it replaces the test’s call to I18n.translate with calls to
ActionView::Helpers::TranslationHelper#translate.
Next, by un-commenting the lines in config/environments/test.rb (and
config/environments/development.rb for test/development parity) and
ensuring that our test suite internationalizes text with the same
translate that ActionView uses, a newer and
more helpful error message is raised:
Error:
UserSharesAMessageTest#test_visiting_the_index:
I18n::MissingTranslationData: translation missing: en.notes.index.new
test/system/user_shares_a_message_test.rb:8:in `block in <class:UserSharesAMessageTest>'
When that key is declared within the config/locales/en.yml file, the
test passes.
Finally, this commit replaces the Share a Note text that is hard-coded
in the notes/index.html.erb template with a call to translate.
By rendering <%= translate(".new") %> in the notes#index view
template, Rails will resolve the .new internationalization key
relative the current “context”, which is a request to notes#index.
The context is translated into an internationalization scope:
notes.index. This internationalization scope is prepended to the
relative .new key, which is then prepended with the current locale of
en.
This process generates a fully-qualified internationalization key of
en.notes.index.new, which corresponds to the translation we declared
in our test.