Create locale helper for global translations
There are some translation strings we should use across multiple views. Instead of duplicating the translations, we can use a different locale helper method, `#tt`, to get a hash of all available translations. Then, in a partial view like `pagination.mustache`, we can render translations regardless of what the current view class is. This commit adds the necessary helper, tests, and uses the new method to render translations on the `pagination.mustache` template, which is used by many other view classes (latest changes, history, and search).
This commit is contained in:
@@ -1,4 +1,11 @@
|
|||||||
en:
|
en:
|
||||||
|
pagination:
|
||||||
|
aria:
|
||||||
|
label: Pagination
|
||||||
|
next_page: Next page
|
||||||
|
previous_page: Previous page
|
||||||
|
next: Next
|
||||||
|
previous: Previous
|
||||||
precious/views/compare:
|
precious/views/compare:
|
||||||
back_to_page_history: Back to Page History
|
back_to_page_history: Back to Page History
|
||||||
back_to_top: Back to Top
|
back_to_top: Back to Top
|
||||||
@@ -12,13 +19,6 @@ en:
|
|||||||
browse_in_history_description: Browse the page at this point in the history
|
browse_in_history_description: Browse the page at this point in the history
|
||||||
compare_revisions: Compare Revisions
|
compare_revisions: Compare Revisions
|
||||||
history_for: History for
|
history_for: History for
|
||||||
pagination:
|
|
||||||
aria:
|
|
||||||
label: Pagination
|
|
||||||
next_page: Next page
|
|
||||||
previous_page: Previous page
|
|
||||||
next: Next
|
|
||||||
previous: Previous
|
|
||||||
precious/views/latest_changes:
|
precious/views/latest_changes:
|
||||||
title: Latest Changes (Globally)
|
title: Latest Changes (Globally)
|
||||||
precious/views/layout:
|
precious/views/layout:
|
||||||
@@ -34,12 +34,5 @@ en:
|
|||||||
show_all: "Show all %{count} hits in this page"
|
show_all: "Show all %{count} hits in this page"
|
||||||
back_to_top: Back to Top
|
back_to_top: Back to Top
|
||||||
no_results: There are no results for your search
|
no_results: There are no results for your search
|
||||||
pagination:
|
|
||||||
aria:
|
|
||||||
label: Pagination
|
|
||||||
next_page: Next page
|
|
||||||
previous_page: Previous page
|
|
||||||
next: Next
|
|
||||||
previous: Previous
|
|
||||||
search_results_for: Search results for
|
search_results_for: Search results for
|
||||||
title: "Search results for %{query}"
|
title: "Search results for %{query}"
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
<nav class="paginate-container" aria-label="{{t.pagination.aria.label}}">
|
<nav class="paginate-container" aria-label="{{tt.pagination.aria.label}}">
|
||||||
<div class="pagination" id="pagination">
|
<div class="pagination" id="pagination">
|
||||||
<a
|
<a
|
||||||
aria-label="{{t.pagination.aria.previous_page}}"
|
aria-label="{{td.pagination.aria.previous_page}}"
|
||||||
class="previous_page {{^previous_page}}disabled{{/previous_page}}"
|
class="previous_page {{^previous_page}}disabled{{/previous_page}}"
|
||||||
href="?page_num={{previous_page}}{{query_string}}"
|
href="?page_num={{previous_page}}{{query_string}}"
|
||||||
id="prev"
|
id="prev"
|
||||||
rel="prev"
|
rel="prev"
|
||||||
>
|
>
|
||||||
{{t.pagination.previous}}
|
{{tt.pagination.previous}}
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a
|
<a
|
||||||
aria-label="{{t.pagination.aria.next_page}}"
|
aria-label="{{td.pagination.aria.next_page}}"
|
||||||
class="next_page {{^next_page}}disabled{{/next_page}}"
|
class="next_page {{^next_page}}disabled{{/next_page}}"
|
||||||
href="?page_num={{next_page}}{{query_string}}"
|
href="?page_num={{next_page}}{{query_string}}"
|
||||||
id="next"
|
id="next"
|
||||||
rel="next"
|
rel="next"
|
||||||
>
|
>
|
||||||
{{t.pagination.next}}
|
{{tt.pagination.next}}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|||||||
@@ -21,6 +21,13 @@ module Precious
|
|||||||
autofill I18n.t(locale_klass_name)
|
autofill I18n.t(locale_klass_name)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Returns all I18n translation strings from the root of an I18n YAML file.
|
||||||
|
# Otherwise, it works exactly like the `#t` method that's also defined in
|
||||||
|
# this file.
|
||||||
|
def tt
|
||||||
|
autofill I18n.t('.')
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
# Recursively looks up I18n translation values and autofills any YAML
|
# Recursively looks up I18n translation values and autofills any YAML
|
||||||
|
|||||||
@@ -132,4 +132,99 @@ describe Precious::Views::LocaleHelpers do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "#tt" do
|
||||||
|
describe "mustache usage" do
|
||||||
|
let(:subject) { dummy_instance.render(mustache_template) }
|
||||||
|
|
||||||
|
let(:mustache_template) { "{{ tt.test_class.hello_world }}" }
|
||||||
|
|
||||||
|
describe "in the default locale" do
|
||||||
|
it "returns the translation string" do
|
||||||
|
_(subject).must_equal "Hello world"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "in the configured locale" do
|
||||||
|
it "returns the translation string" do
|
||||||
|
I18n.locale = :de
|
||||||
|
|
||||||
|
_(subject).must_equal "Hallo Welt"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "translations with YAML arguments" do
|
||||||
|
let(:mustache_template) { "{{ tt.test_class.author_info.full }}" }
|
||||||
|
|
||||||
|
describe "in the default locale" do
|
||||||
|
it "autofills YAML arguments" do
|
||||||
|
_(subject).must_equal "Author J.R.R. is from Bloemfontein"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "in the configured locale" do
|
||||||
|
it "autofills YAML arguments" do
|
||||||
|
I18n.locale = :de
|
||||||
|
|
||||||
|
_(subject).must_equal "Autor J.R.R. ist vom Bloemfontein"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "translations with invalid arguments" do
|
||||||
|
let(:mustache_template) { "{{ tt.test_class.has_invalid_argument }}" }
|
||||||
|
|
||||||
|
it "fails gracefully with embedded error message" do
|
||||||
|
expected_string = "Welcome to " \
|
||||||
|
"[#{TestClass::NO_METHOD_MESSAGE}: no_matching_method]"
|
||||||
|
|
||||||
|
_(subject).must_equal expected_string
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "missing translations" do
|
||||||
|
let(:mustache_template) {
|
||||||
|
"{{ tt.test_class.nested.nonexistent_key }}"
|
||||||
|
}
|
||||||
|
|
||||||
|
it "outputs an empty string" do
|
||||||
|
_(subject).must_be_empty
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "usage" do
|
||||||
|
let(:subject) { dummy_instance.tt }
|
||||||
|
|
||||||
|
it "returns a hash" do
|
||||||
|
_(subject).must_be_kind_of Hash
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns all present translation keys" do
|
||||||
|
i18n_keys = I18n.t(".").keys
|
||||||
|
|
||||||
|
_(subject.keys).must_equal i18n_keys
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns nested keys" do
|
||||||
|
nested_keys = subject[:test_class][:author_info].keys
|
||||||
|
|
||||||
|
_(nested_keys).must_equal [:full]
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "auto-filled YAML arguments" do
|
||||||
|
let(:subject) { dummy_instance.tt[:test_class][:author_info][:full] }
|
||||||
|
|
||||||
|
it "auto-fills in the default locale" do
|
||||||
|
_(subject).must_equal "Author J.R.R. is from Bloemfontein"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "auto-fills in a configured locale" do
|
||||||
|
I18n.locale = :de
|
||||||
|
|
||||||
|
_(subject).must_equal "Autor J.R.R. ist vom Bloemfontein"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user