Display language name or language key

There where two issues with the current implementation:

- There was a possible duplication between looking up the language name in key "locale" and in key "i18n.language.name"

- The "default" option was not being picked up, as the fallback always returned the default locale's translation, "English"

With this implementation there is only a single place to put the language name: i18n.language.name. I think this place is easier to find and understand for Crowdin translators than a "locale" key hidden in general.yml

If the translation is not found we display the language key, instead of English, which makes more sense to me too 😌

Solution based on recent comments[1] on a related I18n issue

[1] https://github.com/svenfuchs/i18n/issues/365#issuecomment-419263847
This commit is contained in:
voodoorai2000
2018-10-04 14:25:17 +02:00
parent c7a21e546d
commit 0a0261900c
3 changed files with 59 additions and 4 deletions

View File

@@ -1,10 +1,7 @@
module LocalesHelper
def name_for_locale(locale)
default = I18n.t("locale", locale: locale)
I18n.backend.translate(locale, "i18n.language.name", default: default)
rescue
nil
I18n.t("i18n.language.name", locale: locale, fallback: false, default: locale.to_s)
end
end

View File

@@ -48,4 +48,30 @@ feature 'Localization' do
expect(page).not_to have_content('Language')
expect(page).not_to have_css('div.locale')
end
context "Missing language names" do
let!(:default_enforce) { I18n.enforce_available_locales }
let!(:default_locales) { I18n.available_locales }
before do
I18n.enforce_available_locales = false
I18n.available_locales << :wl
I18n.locale = :wl
end
after do
I18n.enforce_available_locales = default_enforce
I18n.available_locales = default_locales
end
scenario 'Available locales without language translation display locale key' do
visit '/'
within('.locale-form .js-location-changer') do
expect(page).to have_content 'wl'
end
end
end
end

View File

@@ -0,0 +1,32 @@
require 'rails_helper'
describe LocalesHelper do
context "Language names" do
let!(:default_enforce) { I18n.enforce_available_locales }
before do
I18n.enforce_available_locales = false
end
after do
I18n.backend.reload!
I18n.enforce_available_locales = default_enforce
end
it "returns the language name in i18n.language.name translation" do
keys = { language: {
name: "World Language" }}
I18n.backend.store_translations(:wl, { i18n: keys })
expect(name_for_locale(:wl)).to eq("World Language")
end
it "retuns the locale key if i18n.language.name translation is not found" do
expect(name_for_locale(:wl)).to eq("wl")
end
end
end