Index: /trunk/src/org/openstreetmap/josm/command/AddCommand.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/command/AddCommand.java	(revision 1988)
+++ /trunk/src/org/openstreetmap/josm/command/AddCommand.java	(revision 1989)
@@ -2,4 +2,5 @@
 package org.openstreetmap.josm.command;
 
+import static org.openstreetmap.josm.tools.I18n.marktr;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
@@ -61,8 +62,15 @@
 
     @Override public MutableTreeNode description() {
+        String msg;
+        switch(OsmPrimitiveType.from(osm)) {
+        case NODE: msg = marktr("Add node {0}"); break;
+        case WAY: msg = marktr("Add way {0}"); break;
+        case RELATION: msg = marktr("Add relation {0}"); break;
+        default: /* should not happen */msg = ""; break;
+        }
+
         return new DefaultMutableTreeNode(
                 new JLabel(
-                        tr("Add {0} {1}",
-                                OsmPrimitiveType.from(osm).getLocalizedDisplayNameSingular(),
+                        tr(msg,
                                 new PrimitiveNameFormatter().getName(osm)
                         ),
Index: /trunk/src/org/openstreetmap/josm/command/ChangeCommand.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/command/ChangeCommand.java	(revision 1988)
+++ /trunk/src/org/openstreetmap/josm/command/ChangeCommand.java	(revision 1989)
@@ -2,4 +2,5 @@
 package org.openstreetmap.josm.command;
 
+import static org.openstreetmap.josm.tools.I18n.marktr;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
@@ -44,7 +45,12 @@
 
     @Override public MutableTreeNode description() {
+        String msg = "";
+        switch(OsmPrimitiveType.from(osm)) {
+        case NODE: msg = marktr("Change node {0}"); break;
+        case WAY: msg = marktr("Change way {0}"); break;
+        case RELATION: msg = marktr("Change relation {0}"); break;
+        }
         return new DefaultMutableTreeNode(
-                new JLabel(tr("Change {0} {1}",
-                        OsmPrimitiveType.from(osm).getLocalizedDisplayNameSingular(),
+                new JLabel(tr(msg,
                         new PrimitiveNameFormatter().getName(osm)),
                         ImageProvider.get(OsmPrimitiveType.from(osm)),
Index: /trunk/src/org/openstreetmap/josm/command/ChangePropertyCommand.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/command/ChangePropertyCommand.java	(revision 1988)
+++ /trunk/src/org/openstreetmap/josm/command/ChangePropertyCommand.java	(revision 1989)
@@ -3,4 +3,5 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.marktr;
 import static org.openstreetmap.josm.tools.I18n.trn;
 
@@ -98,14 +99,20 @@
             OsmPrimitive primitive = objects.iterator().next();
             String name = formatter.getName(primitive);
-            text = value == null
-            ? tr("Remove \"{0}\" for {1} ''{2}''", key,
-                    OsmPrimitiveType.from(primitive).getLocalizedDisplayNameSingular(),
-                    name)
-                    : tr("Set {0}={1} for {2} ''{3}''",
-                            key,
-                            value,
-                            OsmPrimitiveType.from(primitive).getLocalizedDisplayNameSingular(),
-                            name
-                    );
+            String msg = "";
+            if (value == null) {
+                switch(OsmPrimitiveType.from(primitive)) {
+                case NODE: msg = marktr("Remove \"{0}\" for node ''{1}''"); break;
+                case WAY: msg = marktr("Remove \"{0}\" for way ''{1}''"); break;
+                case RELATION: msg = marktr("Remove \"{0}\" for relation ''{1}''"); break;
+                }
+                text = tr(msg, key, name);
+            } else {
+                switch(OsmPrimitiveType.from(primitive)) {
+                case NODE: msg = marktr("Set {0}={1} for node ''{2}''"); break;
+                case WAY: msg = marktr("Set {0}={1} for way ''{2}''"); break;
+                case RELATION: msg = marktr("Set {0}={1} for relation ''{2}''"); break;
+                }
+                text = tr(msg, key, value, name);
+            }
         }
         else
Index: /trunk/src/org/openstreetmap/josm/command/DeleteCommand.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/command/DeleteCommand.java	(revision 1988)
+++ /trunk/src/org/openstreetmap/josm/command/DeleteCommand.java	(revision 1989)
@@ -15,4 +15,5 @@
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Set;
 
 import javax.swing.JLabel;
@@ -107,25 +108,35 @@
         if (toDelete.size() == 1) {
             OsmPrimitive primitive = toDelete.iterator().next();
-            return new DefaultMutableTreeNode(new JLabel(tr("Delete {1} {0}", new PrimitiveNameFormatter()
-            .getName(primitive), OsmPrimitiveType.from(primitive).getLocalizedDisplayNameSingular()),
-            ImageProvider.get(OsmPrimitiveType.from(primitive)), JLabel.HORIZONTAL));
-        }
-
-        String cname = null;
-        String apiname = null;
-        String cnamem = null;
+            String msg = "";
+            switch(OsmPrimitiveType.from(primitive)) {
+            case NODE: msg = "Delete node {0}"; break;
+            case WAY: msg = "Delete way {0}"; break;
+            case RELATION:msg = "Delete relation {0}"; break;
+            }
+
+            return new DefaultMutableTreeNode(new JLabel(tr(msg, new PrimitiveNameFormatter().getName(primitive)),
+                    ImageProvider.get(OsmPrimitiveType.from(primitive)), JLabel.HORIZONTAL));
+        }
+
+        Set<OsmPrimitiveType> typesToDelete = new HashSet<OsmPrimitiveType>();
         for (OsmPrimitive osm : toDelete) {
-            if (cname == null) {
-                apiname = OsmPrimitiveType.from(osm).getAPIName();
-                cname = OsmPrimitiveType.from(osm).getLocalizedDisplayNameSingular();
-                cnamem = OsmPrimitiveType.from(osm).getLocalizedDisplayNamePlural();
-            } else if (!cname.equals(OsmPrimitiveType.from(osm).getLocalizedDisplayNameSingular())) {
-                apiname = "object";
-                cname = trn("object", "objects", 1);
-                cnamem = trn("object", "objects", 2);
-            }
-        }
-        DefaultMutableTreeNode root = new DefaultMutableTreeNode(new JLabel(tr("Delete {0} {1}", toDelete.size(), trn(
-                cname, cnamem, toDelete.size())), ImageProvider.get("data", apiname), JLabel.HORIZONTAL));
+            typesToDelete.add(OsmPrimitiveType.from(osm));
+        }
+        String msg = "";
+        String apiname = "object";
+        if (typesToDelete.size() > 1) {
+            msg = trn("Delete {0} object", "Delete {0} objects", toDelete.size(), toDelete.size());
+        } else {
+            OsmPrimitiveType t = typesToDelete.iterator().next();
+            apiname = t.getAPIName();
+            switch(t) {
+            case NODE: msg = trn("Delete {0} node", "Delete {0} nodes", toDelete.size(), toDelete.size()); break;
+            case WAY: msg = trn("Delete {0} way", "Delete {0} ways", toDelete.size(), toDelete.size()); break;
+            case RELATION: msg = trn("Delete {0} relation", "Delete {0} relations", toDelete.size(), toDelete.size()); break;
+            }
+        }
+        DefaultMutableTreeNode root = new DefaultMutableTreeNode(
+                new JLabel(msg, ImageProvider.get("data", apiname), JLabel.HORIZONTAL)
+        );
         for (OsmPrimitive osm : toDelete) {
             root.add(new DefaultMutableTreeNode(new JLabel(new PrimitiveNameFormatter().getName(osm), ImageProvider
Index: /trunk/src/org/openstreetmap/josm/command/RemoveRelationMemberCommand.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/command/RemoveRelationMemberCommand.java	(revision 1988)
+++ /trunk/src/org/openstreetmap/josm/command/RemoveRelationMemberCommand.java	(revision 1989)
@@ -3,4 +3,5 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.marktr;
 
 import java.util.Collection;
@@ -64,8 +65,15 @@
 
     @Override public MutableTreeNode description() {
+        String msg = "";
+        switch(OsmPrimitiveType.from(member.member)) {
+        case NODE: msg = marktr("Remove node ''{0}'' at position {1} from relation ''{2}''"); break;
+        case WAY: msg = marktr("Remove way ''{0}'' at position {1} from relation ''{2}''"); break;
+        case RELATION: msg = marktr("Remove relation ''{0}'' at position {1} from relation ''{2}''"); break;
+        }
         return new DefaultMutableTreeNode(
                 new JLabel(
-                        tr("Remove relation member {0} {1}",
-                                OsmPrimitiveType.from(relation).getLocalizedDisplayNameSingular(),
+                        tr(msg,
+                                new PrimitiveNameFormatter().getName(member.member),
+                                relation.getMembers().indexOf(member),
                                 new PrimitiveNameFormatter().getName(relation)
                         ),
Index: /trunk/src/org/openstreetmap/josm/command/TagConflictResolveCommand.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/command/TagConflictResolveCommand.java	(revision 1988)
+++ /trunk/src/org/openstreetmap/josm/command/TagConflictResolveCommand.java	(revision 1989)
@@ -3,4 +3,5 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.marktr;
 
 import java.util.Collection;
@@ -64,7 +65,13 @@
     @Override
     public MutableTreeNode description() {
+        String msg = "";
+        switch(OsmPrimitiveType.from(conflict.getMy())) {
+        case NODE: msg = marktr("Resolve {0} tag conflicts in node {1}"); break;
+        case WAY: msg = marktr("Resolve {0} tag conflicts in way {1}"); break;
+        case RELATION: msg = marktr("Resolve {0} tag conflicts in relation {1}"); break;
+        }
         return new DefaultMutableTreeNode(
                 new JLabel(
-                        tr("Resolve {0} tag conflicts in {1} {2}",getNumDecidedConflicts(), OsmPrimitiveType.from(conflict.getMy()).getLocalizedDisplayNameSingular(), conflict.getMy().id),
+                        tr(msg,getNumDecidedConflicts(), conflict.getMy().id),
                         ImageProvider.get("data", "object"),
                         JLabel.HORIZONTAL
Index: /trunk/src/org/openstreetmap/josm/command/VersionConflictResolveCommand.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/command/VersionConflictResolveCommand.java	(revision 1988)
+++ /trunk/src/org/openstreetmap/josm/command/VersionConflictResolveCommand.java	(revision 1989)
@@ -3,4 +3,5 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.marktr;
 
 import java.util.Collection;
@@ -36,7 +37,13 @@
     @Override
     public MutableTreeNode description() {
+        String msg = "";
+        switch(OsmPrimitiveType.from(conflict.getMy())) {
+        case NODE: msg = marktr("Resolve version conflicts for node {0}"); break;
+        case WAY: msg = marktr("Resolve version conflicts for way {0}"); break;
+        case RELATION: msg = marktr("Resolve version conflicts for relation {0}"); break;
+        }
         return new DefaultMutableTreeNode(
                 new JLabel(
-                        tr("Resolve version conflicts for {0} {1}",OsmPrimitiveType.from(conflict.getMy()).getLocalizedDisplayNameSingular(),conflict.getMy().id),
+                        tr(msg,conflict.getMy().id),
                         ImageProvider.get("data", "object"),
                         JLabel.HORIZONTAL
Index: /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitiveType.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitiveType.java	(revision 1988)
+++ /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitiveType.java	(revision 1989)
@@ -3,33 +3,19 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import javax.swing.ImageIcon;
-
 public enum OsmPrimitiveType {
 
-    NODE ("node", tr("node"), tr("nodes")),
-    WAY  ("way", tr("way"), tr("ways")),
-    RELATION ("relation", tr("relation"), tr("relations")),
-    CHANGESET ("changeset", tr("changeset"), tr("changesets"));
+    NODE ("node"),
+    WAY  ("way"),
+    RELATION ("relation"),
+    CHANGESET ("changeset");
 
     private String apiTypeName;
-    private String localizedDisplayNameSingular;
-    private String localizedDisplayNamePlural;
 
-    OsmPrimitiveType(String apiTypeName, String localizedDisplayNameSingular, String localizedDisplayNamePlural) {
+    OsmPrimitiveType(String apiTypeName) {
         this.apiTypeName = apiTypeName;
-        this.localizedDisplayNameSingular = localizedDisplayNameSingular;
-        this.localizedDisplayNamePlural = localizedDisplayNamePlural;
     }
 
     public String getAPIName() {
         return apiTypeName;
-    }
-
-    public String getLocalizedDisplayNameSingular() {
-        return localizedDisplayNameSingular;
-    }
-
-    public String getLocalizedDisplayNamePlural() {
-        return localizedDisplayNamePlural;
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/ExceptionDialogUtil.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/ExceptionDialogUtil.java	(revision 1988)
+++ /trunk/src/org/openstreetmap/josm/gui/ExceptionDialogUtil.java	(revision 1989)
@@ -78,5 +78,5 @@
     public static void explainGeneric(Exception e) {
         String msg = e.getMessage();
-        if (msg == null) {
+        if (msg == null || msg.trim().equals("")) {
             msg = e.toString();
         }
Index: /trunk/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMerger.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMerger.java	(revision 1988)
+++ /trunk/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMerger.java	(revision 1989)
@@ -586,9 +586,8 @@
                     null,
                     tr("<html>To keep your local version, JOSM<br>"
-                            + "has to reset the id of {0} {1} to 0.<br>"
+                            + "has to reset the id of primitive {0} to 0.<br>"
                             + "On the next upload the server will assign<br>"
                             + "it a new id.<br>"
                             + "Do yo agree?</html>",
-                            OsmPrimitiveType.from(model.getMyPrimitive()).getLocalizedDisplayNamePlural(),
                             model.getMyPrimitive().id
                     ),
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java	(revision 1988)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java	(revision 1989)
@@ -3,4 +3,5 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.marktr;
 
 import java.awt.BorderLayout;
@@ -338,5 +339,11 @@
 
         protected void renderText(History h) {
-            setText(h.getEarliest().getType().getLocalizedDisplayNameSingular() + " " + h.getId());
+            String msg = "";
+            switch(h.getEarliest().getType()) {
+            case NODE:  msg = marktr("Node {0}"); break;
+            case WAY: msg = marktr("Way {0}"); break;
+            case RELATION: msg = marktr("Relation {0}"); break;
+            }
+            setText(tr(msg,h.getId()));
         }
 
@@ -412,6 +419,11 @@
                         continue;
                     }
-                    progressMonitor.indeterminateSubTask(tr("Loading history for {0} with id {1}",
-                            OsmPrimitiveType.from(primitive).getLocalizedDisplayNameSingular(),
+                    String msg = "";
+                    switch(OsmPrimitiveType.from(primitive)) {
+                    case NODE: msg = marktr("Loading history for node {0}"); break;
+                    case WAY: msg = marktr("Loading history for way {0}"); break;
+                    case RELATION: msg = marktr("Loading history for relation {0}"); break;
+                    }
+                    progressMonitor.indeterminateSubTask(tr(msg,
                             Long.toString(primitive.id)));
                     OsmServerHistoryReader reader = null;
Index: /trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialog.java	(revision 1988)
+++ /trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialog.java	(revision 1989)
@@ -3,4 +3,5 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.marktr;
 
 import java.awt.BorderLayout;
@@ -34,10 +35,14 @@
      */
     protected void renderTitle(History h) {
-        String title = tr(
-                "History for {0} {1}",
-                h.getEarliest().getType().getLocalizedDisplayNameSingular(),
+        String title = "";
+        switch(h.getEarliest().getType()) {
+        case NODE:  title = marktr("History for node {0}"); break;
+        case WAY: title = marktr("History for way {0}"); break;
+        case RELATION:  title = marktr("History for relation {0}"); break;
+        }
+        setTitle(tr(
+                title,
                 Long.toString(h.getId())
-        );
-        setTitle(title);
+        ));
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/history/RelationMemberListTableCellRenderer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/history/RelationMemberListTableCellRenderer.java	(revision 1988)
+++ /trunk/src/org/openstreetmap/josm/gui/history/RelationMemberListTableCellRenderer.java	(revision 1989)
@@ -3,4 +3,5 @@
 
 import java.awt.Color;
+import static org.openstreetmap.josm.tools.I18n.tr;
 import java.awt.Component;
 import java.util.HashMap;
@@ -73,5 +74,10 @@
             bgColor = BGCOLOR_EMPTY_ROW;
         } else {
-            text = member.getPrimitiveType().getLocalizedDisplayNameSingular() + " " + member.getPrimitiveId();
+            text = "";
+            switch(member.getPrimitiveType()) {
+            case NODE: text = tr("Node {0}", member.getPrimitiveId()); break;
+            case WAY: text = tr("Way {0}", member.getPrimitiveId()); break;
+            case RELATION: text = tr("Relation {0}", member.getPrimitiveId()); break;
+            }
             if (model.isSameInOppositeWay(row)) {
                 bgColor = Color.WHITE;
Index: /trunk/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java	(revision 1988)
+++ /trunk/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java	(revision 1989)
@@ -365,5 +365,11 @@
         for (long id : pkg) {
             try {
-                progressMonitor.setCustomText(tr("Fetching {0} with id {1} from ''{2}''", type.getLocalizedDisplayNameSingular(), id, OsmApi.getOsmApi().getBaseUrl()));
+                String msg = "";
+                switch(type) {
+                case NODE: msg = tr("Fetching node with id {0} from ''{1}''", id, OsmApi.getOsmApi().getBaseUrl()); break;
+                case WAY: msg = tr("Fetching way with id {0} from ''{1}''", id, OsmApi.getOsmApi().getBaseUrl()); break;
+                case RELATION: msg = tr("Fetching relation with id {0} from ''{1}''", id, OsmApi.getOsmApi().getBaseUrl()); break;
+                }
+                progressMonitor.setCustomText(msg);
                 singleGetId(type, id, progressMonitor);
             } catch(OsmApiException e) {
@@ -397,5 +403,11 @@
      */
     protected void fetchPrimitives(Set<Long> ids, OsmPrimitiveType type, ProgressMonitor progressMonitor) throws OsmTransferException{
-        progressMonitor.setCustomText(tr("Fetching a package of {0} from ''{1}''", type.getLocalizedDisplayNameSingular(), OsmApi.getOsmApi().getBaseUrl()));
+        String msg = "";
+        switch(type) {
+        case NODE: msg = tr("Fetching a package of nodes from ''{0}''", OsmApi.getOsmApi().getBaseUrl()); break;
+        case WAY:  msg = tr("Fetching a package of ways from ''{0}''", OsmApi.getOsmApi().getBaseUrl()); break;
+        case RELATION:  msg = tr("Fetching a package of relations from ''{0}''", OsmApi.getOsmApi().getBaseUrl()); break;
+        }
+        progressMonitor.setCustomText(msg);
         Set<Long> toFetch = new HashSet<Long>(ids);
         toFetch.addAll(ids);
Index: /trunk/src/org/openstreetmap/josm/io/OsmServerWriter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmServerWriter.java	(revision 1988)
+++ /trunk/src/org/openstreetmap/josm/io/OsmServerWriter.java	(revision 1989)
@@ -3,4 +3,5 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.marktr;
 
 import java.util.Collection;
@@ -95,9 +96,16 @@
                 int progress = progressMonitor.getTicks();
                 String time_left_str = timeLeft(progress, primitives.size());
+                String msg = "";
+                switch(OsmPrimitiveType.from(osm)) {
+                case NODE: msg = marktr("{0}% ({1}/{2}), {3} left. Uploading node ''{4}'' (id: {5})"); break;
+                case WAY: msg = marktr("{0}% ({1}/{2}), {3} left. Uploading way ''{4}'' (id: {5})"); break;
+                case RELATION: msg = marktr("{0}% ({1}/{2}), {3} left. Uploading relation ''{4}'' (id: {5})"); break;
+                }
                 progressMonitor.subTask(
-                        tr("{0}% ({1}/{2}), {3} left. Uploading {4}: {5} (id: {6})",
-                                Math.round(100.0*progress/primitives.size()), progress,
-                                primitives.size(), time_left_str,
-                                OsmPrimitiveType.from(osm).getLocalizedDisplayNameSingular(),
+                        tr(msg,
+                                Math.round(100.0*progress/primitives.size()),
+                                progress,
+                                primitives.size(),
+                                time_left_str,
                                 NAME_FORMATTER.getName(osm),
                                 osm.id));
