Index: trunk/src/org/openstreetmap/josm/actions/PasteTagsAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/PasteTagsAction.java	(revision 8974)
+++ trunk/src/org/openstreetmap/josm/actions/PasteTagsAction.java	(revision 8975)
@@ -25,4 +25,5 @@
 import org.openstreetmap.josm.data.osm.TagCollection;
 import org.openstreetmap.josm.gui.conflict.tags.PasteTagsConflictResolverDialog;
+import org.openstreetmap.josm.tools.I18n;
 import org.openstreetmap.josm.tools.Shortcut;
 import org.openstreetmap.josm.tools.TextTagParser;
@@ -302,7 +303,9 @@
             String title1 = trn("Pasting {0} tag", "Pasting {0} tags", commands.size(), commands.size());
             String title2 = trn("to {0} object", "to {0} objects", selection.size(), selection.size());
+            @I18n.QuirkyPluralString
+            final String title = title1 + ' ' + title2;
             Main.main.undoRedo.add(
                     new SequenceCommand(
-                            title1 + ' ' + title2,
+                            title,
                             commands
                     ));
Index: trunk/src/org/openstreetmap/josm/command/ChangePropertyCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/ChangePropertyCommand.java	(revision 8974)
+++ trunk/src/org/openstreetmap/josm/command/ChangePropertyCommand.java	(revision 8975)
@@ -21,4 +21,5 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.gui.DefaultNameFormatter;
+import org.openstreetmap.josm.tools.I18n;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -148,5 +149,6 @@
     @Override
     public String getDescriptionText() {
-        String text;
+        @I18n.QuirkyPluralString
+        final String text;
         if (objects.size() == 1 && tags.size() == 1) {
             OsmPrimitive primitive = objects.get(0);
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/DeleteFromRelationConfirmationDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/DeleteFromRelationConfirmationDialog.java	(revision 8974)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/DeleteFromRelationConfirmationDialog.java	(revision 8975)
@@ -42,4 +42,5 @@
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.widgets.HtmlPanel;
+import org.openstreetmap.josm.tools.I18n;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.WindowGeometry;
@@ -106,16 +107,16 @@
         int numObjectsToDelete = model.getNumObjectsToDelete();
         int numParentRelations = model.getNumParentRelations();
-        String msg;
-        if (numObjectsToDelete == 1 && numParentRelations == 1) {
-            msg = tr("<html>Please confirm to remove <strong>1 object</strong> from <strong>1 relation</strong>.</html>");
-        } else if (numObjectsToDelete == 1 && numParentRelations > 1) {
-            msg = tr("<html>Please confirm to remove <strong>1 object</strong> from <strong>{0} relations</strong>.</html>",
-                    numParentRelations);
-        } else if (numObjectsToDelete > 1 && numParentRelations == 1) {
-            msg = tr("<html>Please confirm to remove <strong>1 object</strong> from <strong>{0} relations</strong>.</html>",
-                    numParentRelations);
+        @I18n.QuirkyPluralString
+        final String msg;
+        if (numParentRelations == 1) {
+            msg = trn(
+                    "<html>Please confirm to remove <strong>{0} object</strong> from <strong>1 relation</strong>.</html>",
+                    "<html>Please confirm to remove <strong>{0} objects</strong> from <strong>1 relation</strong>.</html>",
+                    numObjectsToDelete, numObjectsToDelete);
         } else {
-            msg = tr("<html>Please confirm to remove <strong>{0} objects</strong> from <strong>{1} relations</strong>.</html>",
-                    numObjectsToDelete, numParentRelations);
+            msg = trn(
+                    "<html>Please confirm to remove <strong>{0} object</strong> from <strong>{1} relations</strong>.</html>",
+                    "<html>Please confirm to remove <strong>{0} objects</strong> from <strong>{1} relations</strong>.</html>",
+                    numObjectsToDelete, numObjectsToDelete, numParentRelations);
         }
         htmlPanel.getEditorPane().setText(msg);
Index: trunk/src/org/openstreetmap/josm/tools/I18n.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/I18n.java	(revision 8974)
+++ trunk/src/org/openstreetmap/josm/tools/I18n.java	(revision 8975)
@@ -8,4 +8,6 @@
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
@@ -36,4 +38,12 @@
  */
 public final class I18n {
+
+    /**
+     * This annotates strings which do not permit a clean i18n. This is mostly due to strings
+     * containing two nouns which can occur in singular or plural form.
+     */
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface QuirkyPluralString {
+    }
 
     private I18n() {
