Index: trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(revision 15154)
+++ trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(revision 15158)
@@ -11,4 +11,5 @@
 import java.util.Collections;
 import java.util.EnumMap;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
@@ -700,12 +701,33 @@
     }
 
+    private static final Map<String, String> localizedCountriesCache = new HashMap<>();
+    static {
+        localizedCountriesCache.put("", tr("Worldwide"));
+    }
+
+    /**
+     * Returns a localized name for the given country code, or "Worldwide" if empty.
+     * This function falls back on the English name, and uses the ISO code as a last-resortvalue.
+     *
+     * @param countryCode An ISO 3166 alpha-2 country code or a UN M.49 numeric-3 area code
+     * @return The name of the country appropriate to the current locale.
+     * @see Locale#getDisplayCountry
+     * @since 15158
+     */
+    public static String getLocalizedCountry(String countryCode) {
+        return localizedCountriesCache.computeIfAbsent(countryCode, code -> new Locale("en", code).getDisplayCountry());
+    }
+
     @Override
     public String toString() {
-        return "ImageryInfo{" +
-                "name='" + name + '\'' +
-                ", countryCode='" + countryCode + '\'' +
-                ", url='" + url + '\'' +
-                ", imageryType=" + imageryType +
-                '}';
+        // Used in imagery preferences filtering, so must be efficient
+        return new StringBuilder("ImageryInfo{")
+                .append("name='").append(name).append('\'')
+                .append(", countryCode='").append(countryCode).append('\'')
+                // appending the localized country in toString() allows us to filter imagery preferences table with it!
+                .append(", localizedCountry='").append(getLocalizedCountry(countryCode)).append('\'')
+                .append(", url='").append(url).append('\'')
+                .append(", imageryType=").append(imageryType)
+                .append('}').toString();
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryProvidersPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryProvidersPanel.java	(revision 15154)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryProvidersPanel.java	(revision 15158)
@@ -20,5 +20,4 @@
 import java.util.HashSet;
 import java.util.List;
-import java.util.Locale;
 import java.util.Map;
 import java.util.Optional;
@@ -189,5 +188,5 @@
     private static class ImageryCountryTableCellRenderer extends ImageryProvidersPanel.ImageryTableCellRenderer<String> {
         ImageryCountryTableCellRenderer() {
-            super(code -> code, code -> code.isEmpty() ? tr("Worldwide") : new Locale("en", code).getDisplayCountry(), null);
+            super(code -> code, ImageryInfo::getLocalizedCountry, null);
         }
     }
@@ -686,4 +685,20 @@
 
         @Override
+        public Class<?> getColumnClass(int columnIndex) {
+            switch (columnIndex) {
+            case 0:
+                return ImageryCategory.class;
+            case 1:
+                return String.class;
+            case 2:
+                return ImageryInfo.class;
+            case 3:
+                return String.class;
+            default:
+                return super.getColumnClass(columnIndex);
+            }
+        }
+
+        @Override
         public Object getValueAt(int row, int column) {
             ImageryInfo info = layerInfo.getAllDefaultLayers().get(row);
