From: Tom Hughes Date: Thu, 18 Jul 2024 17:00:19 +0000 (+0100) Subject: Fallback to english locale when looking for community index templates X-Git-Tag: live~339 X-Git-Url: https://git.openstreetmap.org./rails.git/commitdiff_plain/f9ea6aa718a5babc16bb5195098b504a1bd43e32 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. --- diff --git a/lib/osm_community_index.rb b/lib/osm_community_index.rb index a5c2fba72..9afb33a7e 100644 --- a/lib/osm_community_index.rb +++ b/lib/osm_community_index.rb @@ -2,6 +2,7 @@ module OsmCommunityIndex def self.add_to_i18n # Filter the communities here to avoid loading excessive numbers of translations 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.each do |file| @@ -14,7 +15,7 @@ module OsmCommunityIndex id = community.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 } }) end @@ -23,13 +24,14 @@ module OsmCommunityIndex 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 translated_name = community_locale_yaml.dig(community.id, "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 - 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"]) # 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 diff --git a/test/lib/osm_community_index_test.rb b/test/lib/osm_community_index_test.rb index 9abb61c37..a922d7fd9 100644 --- a/test/lib/osm_community_index_test.rb +++ b/test/lib/osm_community_index_test.rb @@ -5,8 +5,9 @@ class CountryTest < ActiveSupport::TestCase # 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_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) end @@ -14,8 +15,9 @@ class CountryTest < ActiveSupport::TestCase # 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_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) end @@ -23,8 +25,9 @@ class CountryTest < ActiveSupport::TestCase # 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_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) 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. 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_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) end end