When we were visiting a page showing the content of a record which uses globalize and our locale was the default one and there was no translation for the default locale, the application was crashing in some places because there are no fallbacks for the default locale. For example, when visiting a legislation process, the line with `CGI.escape(title)` was crashing because `title` was `nil` for the default locale. We've decided to solve this issue by using any available translations as globalize fallbacks instead of showing a 404 error or a translation missing error because these solutions would (we thinkg) either require modifying many places in the application or making the translatable logic even more complex. Initially we tried to add this solution to an initializer, but it must be called after initializing the application so I18n.fallbacks[locale] gets the value defined in config.i18n.fallbacks. Also note the line: fallbacks[locale] = I18n.fallbacks[locale] + I18n.available_locales Doesn't mention `I18n.default_locale` because the method `I18n.fallbacks[locale]` automatically adds the default locale.
57 lines
1.6 KiB
Ruby
57 lines
1.6 KiB
Ruby
require "spec_helper"
|
|
|
|
shared_examples_for "globalizable" do |factory_name|
|
|
let(:record) { create(factory_name) }
|
|
let(:field) { record.translated_attribute_names.first }
|
|
|
|
describe "Fallbacks" do
|
|
before do
|
|
allow(I18n).to receive(:available_locales).and_return(%i[ar de en es fr])
|
|
|
|
record.update_attribute(field, "In English")
|
|
|
|
{ es: "En español", de: "Deutsch" }.each do |locale, text|
|
|
Globalize.with_locale(locale) do
|
|
record.translated_attribute_names.each do |attribute|
|
|
record.update_attribute(attribute, record.send(attribute))
|
|
end
|
|
|
|
record.update_attribute(field, text)
|
|
end
|
|
end
|
|
end
|
|
|
|
after do
|
|
allow(I18n).to receive(:available_locales).and_call_original
|
|
allow(I18n.fallbacks).to receive(:[]).and_call_original
|
|
Globalize.set_fallbacks_to_all_available_locales
|
|
end
|
|
|
|
context "With a defined fallback" do
|
|
before do
|
|
allow(I18n.fallbacks).to receive(:[]).and_return([:fr, :es])
|
|
Globalize.set_fallbacks_to_all_available_locales
|
|
end
|
|
|
|
it "Falls back to the defined fallback" do
|
|
Globalize.with_locale(:fr) do
|
|
expect(record.send(field)).to eq "En español"
|
|
end
|
|
end
|
|
end
|
|
|
|
context "Without a defined fallback" do
|
|
before do
|
|
allow(I18n.fallbacks).to receive(:[]).and_return([:fr])
|
|
Globalize.set_fallbacks_to_all_available_locales
|
|
end
|
|
|
|
it "Falls back to the first available locale" do
|
|
Globalize.with_locale(:fr) do
|
|
expect(record.send(field)).to eq "Deutsch"
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|