Files
nairobi/spec/models/concerns/globalizable.rb
Javi Martín 2e6644d513 Fix crash with no translation for default locale
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.
2018-10-22 16:36:18 +02:00

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