Fallback to english locale when looking for community index templates

Starting with the v5.8.0 release osm-community-index has removed
strings from translations which are identical to the engish version
which mostly causes no problem except for some of the template values
that don't involve any localised text.
This commit is contained in:
Tom Hughes 2024-07-18 18:00:19 +01:00
parent 2f66877696
commit f9ea6aa718
2 changed files with 13 additions and 7 deletions

View file

@ -2,6 +2,7 @@ module OsmCommunityIndex
def self.add_to_i18n def self.add_to_i18n
# Filter the communities here to avoid loading excessive numbers of translations # Filter the communities here to avoid loading excessive numbers of translations
communities = Community.where(:type => "osm-lc").where.not(:id => "OSMF") communities = Community.where(:type => "osm-lc").where.not(:id => "OSMF")
community_en_yaml = YAML.safe_load_file("node_modules/osm-community-index/i18n/en.yaml")["en"]
files = Rails.root.glob("node_modules/osm-community-index/i18n/*.yaml") files = Rails.root.glob("node_modules/osm-community-index/i18n/*.yaml")
files.each do |file| files.each do |file|
@ -14,7 +15,7 @@ module OsmCommunityIndex
id = community.id id = community.id
strings = community_locale_yaml[id] || {} strings = community_locale_yaml[id] || {}
strings["name"] = resolve_name(community, community_locale_yaml) strings["name"] = resolve_name(community, community_locale_yaml, community_en_yaml)
obj.deep_merge!("osm_community_index" => { "communities" => { id => strings } }) obj.deep_merge!("osm_community_index" => { "communities" => { id => strings } })
end end
@ -23,13 +24,14 @@ module OsmCommunityIndex
end end
end end
def self.resolve_name(community, community_locale_yaml) def self.resolve_name(community, community_locale_yaml, community_en_yaml)
# If theres an explicitly translated name then use that # If theres an explicitly translated name then use that
translated_name = community_locale_yaml.dig(community.id, "name") translated_name = community_locale_yaml.dig(community.id, "name")
return translated_name if translated_name return translated_name if translated_name
# If not, then look up the default translated name for this type of community, and interpolate the template # If not, then look up the default translated name for this type of community, and interpolate the template
template = community_locale_yaml.dig("_defaults", community.type, "name") template = community_locale_yaml.dig("_defaults", community.type, "name") ||
community_en_yaml.dig("_defaults", community.type, "name")
community_name = community_locale_yaml.dig("_communities", community.strings["communityID"]) community_name = community_locale_yaml.dig("_communities", community.strings["communityID"])
# Change the `{community}` placeholder to `%{community}` and use Ruby's Kernel.format to fill it in. # Change the `{community}` placeholder to `%{community}` and use Ruby's Kernel.format to fill it in.
translated_name = format(template.gsub("{", "%{"), { :community => community_name }) if template && community_name translated_name = format(template.gsub("{", "%{"), { :community => community_name }) if template && community_name

View file

@ -5,8 +5,9 @@ class CountryTest < ActiveSupport::TestCase
# If there is no translations and no name for the chapter, use the community name # If there is no translations and no name for the chapter, use the community name
community = Community.new({ "id" => "foo-chapter", "type" => "osm-lc", "strings" => { "community" => "Community Name" } }) community = Community.new({ "id" => "foo-chapter", "type" => "osm-lc", "strings" => { "community" => "Community Name" } })
community_locale_yaml = {} community_locale_yaml = {}
community_en_yaml = {}
name = OsmCommunityIndex.resolve_name(community, community_locale_yaml) name = OsmCommunityIndex.resolve_name(community, community_locale_yaml, community_en_yaml)
assert_equal("Community Name", name) assert_equal("Community Name", name)
end end
@ -14,8 +15,9 @@ class CountryTest < ActiveSupport::TestCase
# If there is a name for the chapter, prefer that to the community name # If there is a name for the chapter, prefer that to the community name
community = Community.new({ "id" => "foo-chapter", "type" => "osm-lc", "strings" => { "community" => "Community Name", "name" => "Chapter Name" } }) community = Community.new({ "id" => "foo-chapter", "type" => "osm-lc", "strings" => { "community" => "Community Name", "name" => "Chapter Name" } })
community_locale_yaml = {} community_locale_yaml = {}
community_en_yaml = {}
name = OsmCommunityIndex.resolve_name(community, community_locale_yaml) name = OsmCommunityIndex.resolve_name(community, community_locale_yaml, community_en_yaml)
assert_equal("Chapter Name", name) assert_equal("Chapter Name", name)
end end
@ -23,8 +25,9 @@ class CountryTest < ActiveSupport::TestCase
# If there is an explicitly translated name for the chapter, use that # If there is an explicitly translated name for the chapter, use that
community = Community.new({ "id" => "foo-chapter", "type" => "osm-lc", "strings" => { "community" => "Community Name", "name" => "Chapter Name" } }) community = Community.new({ "id" => "foo-chapter", "type" => "osm-lc", "strings" => { "community" => "Community Name", "name" => "Chapter Name" } })
community_locale_yaml = { "foo-chapter" => { "name" => "Translated Chapter Name" } } community_locale_yaml = { "foo-chapter" => { "name" => "Translated Chapter Name" } }
community_en_yaml = {}
name = OsmCommunityIndex.resolve_name(community, community_locale_yaml) name = OsmCommunityIndex.resolve_name(community, community_locale_yaml, community_en_yaml)
assert_equal("Translated Chapter Name", name) assert_equal("Translated Chapter Name", name)
end end
@ -32,8 +35,9 @@ class CountryTest < ActiveSupport::TestCase
# If there's no explicitly translated name for the chapter, use the default name and interpolate the community name if required. # If there's no explicitly translated name for the chapter, use the default name and interpolate the community name if required.
community = Community.new({ "id" => "foo-chapter", "type" => "osm-lc", "strings" => { "community" => "Community Name", "communityID" => "communityname" } }) community = Community.new({ "id" => "foo-chapter", "type" => "osm-lc", "strings" => { "community" => "Community Name", "communityID" => "communityname" } })
community_locale_yaml = { "_communities" => { "communityname" => "Translated Community" }, "_defaults" => { "osm-lc" => { "name" => "{community} Chapter" } } } community_locale_yaml = { "_communities" => { "communityname" => "Translated Community" }, "_defaults" => { "osm-lc" => { "name" => "{community} Chapter" } } }
community_en_yaml = {}
name = OsmCommunityIndex.resolve_name(community, community_locale_yaml) name = OsmCommunityIndex.resolve_name(community, community_locale_yaml, community_en_yaml)
assert_equal("Translated Community Chapter", name) assert_equal("Translated Community Chapter", name)
end end
end end