This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/master by this push:
     new c442132dd7 CAUSEWAY-3321: remove plural NounForm
c442132dd7 is described below

commit c442132dd714f977fca2a74f460112bc73cbe900
Author: Andi Huber <[email protected]>
AuthorDate: Tue Feb 7 08:26:16 2023 +0100

    CAUSEWAY-3321: remove plural NounForm
---
 .../applib/annotation/DomainObjectLayout.java      |  1 -
 .../metamodel/facets/all/i8n/noun/HasNoun.java     | 14 ----
 .../metamodel/facets/all/i8n/noun/NounForm.java    |  9 +--
 .../metamodel/facets/all/i8n/noun/NounForms.java   | 16 ----
 .../all/named/ObjectNamedFacetSynthesized.java     |  2 +-
 ...tNamedFacetForDomainObjectLayoutAnnotation.java |  2 -
 .../ObjectNamedFacetForDomainObjectLayoutXml.java  |  2 -
 .../core/metamodel/layout/LayoutFacetUtil.java     | 12 ---
 .../core/metamodel/object/MmTitleUtil.java         | 14 ++++
 .../core/metamodel/object/_InternalTitleUtil.java  | 42 +++--------
 .../i18n/SynthesizeObjectNamingPostProcessor.java  | 14 ----
 .../core/metamodel/spec/ObjectSpecification.java   |  9 ---
 .../specimpl/ObjectSpecificationAbstract.java      | 11 ---
 .../core/metamodel/util/snapshot/XmlSchema.java    |  4 +-
 .../core/metamodel/util/snapshot/XmlSnapshot.java  |  2 +-
 .../DomainObjectLayoutFactoryTest.java             | 48 +-----------
 .../plural/DomainObjectLayoutPluralVm.java         |  3 +-
 .../MetaModelRegressionTest.verify.approved.xml    | 88 ++++++----------------
 .../domaintypes/DomainTypeReprRenderer.java        |  3 -
 ...entNegotiationServiceForRestfulObjectsV1_0.java | 17 +----
 20 files changed, 58 insertions(+), 255 deletions(-)

diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/annotation/DomainObjectLayout.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/annotation/DomainObjectLayout.java
index e6a39deafd..42fc022ca5 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/annotation/DomainObjectLayout.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/annotation/DomainObjectLayout.java
@@ -110,7 +110,6 @@ public @interface DomainObjectLayout {
      * @see PropertyLayout#named()
      * @see CollectionLayout#named()
      * @see DomainServiceLayout#named()
-     * @see DomainObjectLayout#plural()
      */
     String named()
             default "";
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/i8n/noun/HasNoun.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/i8n/noun/HasNoun.java
index c375a1cf37..8d376e4857 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/i8n/noun/HasNoun.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/i8n/noun/HasNoun.java
@@ -65,19 +65,5 @@ extends HasMemoizableTranslation {
         return translated(NounForm.SINGULAR).orElse(null);
     }
 
-    /**
-     * Originating text of plural noun-form to be translated before use in the 
UI.
-     */
-    default @Nullable String plural() {
-        return text(NounForm.PLURAL).orElse(null);
-    }
-
-    /**
-     * Translated text of plural noun-form to be used in the UI.
-     */
-    default @Nullable String pluralTranslated() {
-        return translated(NounForm.PLURAL).orElse(null);
-    }
-
 
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/i8n/noun/NounForm.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/i8n/noun/NounForm.java
index 0d4e444d14..d9c87ca9ad 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/i8n/noun/NounForm.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/i8n/noun/NounForm.java
@@ -22,6 +22,7 @@ package 
org.apache.causeway.core.metamodel.facets.all.i8n.noun;
  * Represents various linguistic forms, based on <i>cardinality</i>.
  * @since 2.0
  */
+@Deprecated
 public enum NounForm {
 
     /**
@@ -29,18 +30,10 @@ public enum NounForm {
      */
     SINGULAR,
 
-    /**
-     * Represents the plural linguistic form.
-     */
-    PLURAL
     ;
 
     public boolean isSingular() {
         return this == SINGULAR;
     }
 
-    public boolean isPlural() {
-        return this == PLURAL;
-    }
-
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/i8n/noun/NounForms.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/i8n/noun/NounForms.java
index 2016e85077..c116cb3b8d 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/i8n/noun/NounForms.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/i8n/noun/NounForms.java
@@ -46,13 +46,7 @@ public class NounForms {
                 .singular(singular);
     }
 
-    public static NounFormsBuilder builderPlural(final @Nullable String 
plural) {
-        return NounForms.builder()
-                .plural(plural);
-    }
-
     private final @Nullable String singular;
-    private final @Nullable String plural;
 
     @Getter(lazy = true)
     final ImmutableEnumSet<NounForm> supportedNounForms = supportedNounForms();
@@ -65,10 +59,6 @@ public class NounForms {
             supportedNounForms.add(NounForm.SINGULAR);
         }
 
-        if(plural!=null) {
-            supportedNounForms.add(NounForm.PLURAL);
-        }
-
         return ImmutableEnumSet.from(supportedNounForms);
     }
 
@@ -80,9 +70,6 @@ public class NounForms {
         case SINGULAR:
             // non-null, as nulls are guarded by getSupportedNounForms()
             return Optional.of(getSingular());
-        case PLURAL:
-            // non-null, as nulls are guarded by getSupportedNounForms()
-            return Optional.of(getPlural());
         default:
             break;
         }
@@ -103,9 +90,6 @@ public class NounForms {
             case SINGULAR:
                 builder.singular(translationService.translate(context, 
singular));
                 break;
-            case PLURAL:
-                builder.plural(translationService.translate(context, plural));
-                break;
             default:
                 throw _Exceptions.unmatchedCase(nounForm);
             }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/named/ObjectNamedFacetSynthesized.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/named/ObjectNamedFacetSynthesized.java
index 96fcd7ab06..2fe8816d0a 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/named/ObjectNamedFacetSynthesized.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/all/named/ObjectNamedFacetSynthesized.java
@@ -36,7 +36,7 @@ extends ObjectNamedFacetAbstract {
             final FacetHolder holder) {
         super(nounForms, holder, Precedence.SYNTHESIZED);
         // assert that both noun-forms are populated
-        _Assert.assertTrue(nounForms.getSupportedNounForms().stream().count() 
== 2L);
+        _Assert.assertTrue(nounForms.getSupportedNounForms().stream().count() 
== 1L);
     }
 
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobjectlayout/ObjectNamedFacetForDomainObjectLayoutAnnotation.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobjectlayout/ObjectNamedFacetForDomainObjectLayoutAnnotation.java
index b538533ebd..1cfe9ecdbb 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobjectlayout/ObjectNamedFacetForDomainObjectLayoutAnnotation.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobjectlayout/ObjectNamedFacetForDomainObjectLayoutAnnotation.java
@@ -43,12 +43,10 @@ extends ObjectNamedFacetAbstract {
         val domainObjectLayout = domainObjectLayoutIfAny.get();
 
         val singular = _Strings.emptyToNull(domainObjectLayout.named());
-        val plural = _Strings.emptyToNull(domainObjectLayout.plural());
 
         val nounForms = NounForms
                 .builder()
                 .singular(singular)
-                .plural(plural)
                 .build();
 
         if(nounForms.getSupportedNounForms().isEmpty()) {
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobjectlayout/ObjectNamedFacetForDomainObjectLayoutXml.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobjectlayout/ObjectNamedFacetForDomainObjectLayoutXml.java
index 20858843a3..1b8003ffa2 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobjectlayout/ObjectNamedFacetForDomainObjectLayoutXml.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobjectlayout/ObjectNamedFacetForDomainObjectLayoutXml.java
@@ -43,12 +43,10 @@ extends ObjectNamedFacetAbstract {
         }
 
         val singular = _Strings.emptyToNull(domainObjectLayout.getNamed());
-        val plural = _Strings.emptyToNull(domainObjectLayout.getPlural());
 
         val nounForms = NounForms
                 .builder()
                 .singular(singular)
-                .plural(plural)
                 .build();
 
         if(nounForms.getSupportedNounForms().isEmpty()) {
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/layout/LayoutFacetUtil.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/layout/LayoutFacetUtil.java
index 92a5756797..feb1fd1880 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/layout/LayoutFacetUtil.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/layout/LayoutFacetUtil.java
@@ -242,17 +242,6 @@ public class LayoutFacetUtil {
         }
     }
 
-    public void setPluralIfAny(
-            final DomainObjectLayoutData domainObjectLayoutData,
-            final FacetHolder facetHolder) {
-
-        facetHolder
-        .lookupNonFallbackFacet(ObjectNamedFacet.class)
-        
.filter(namedFacet->namedFacet.getSupportedNounForms().contains(NounForm.PLURAL))
-        .map(ObjectNamedFacet::pluralTranslated)
-        .ifPresent(domainObjectLayoutData::setPlural);
-    }
-
     public void setActionPositionIfAny(
             final ActionLayoutData actionLayoutData,
             final FacetHolder facetHolder) {
@@ -395,7 +384,6 @@ public class LayoutFacetUtil {
             setCssClassFaIfAny(domainObjectLayoutData, objectSpec);
             setObjectDescribedIfAny(domainObjectLayoutData, objectSpec);
             setObjectNamedIfAny(domainObjectLayoutData, objectSpec);
-            setPluralIfAny(domainObjectLayoutData, objectSpec);
         }
     }
 
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/MmTitleUtil.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/MmTitleUtil.java
index 43d7457c71..8995f626fa 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/MmTitleUtil.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/MmTitleUtil.java
@@ -51,4 +51,18 @@ public class MmTitleUtil {
                     : "(no object)";
     }
 
+    public static String formatAnyCardinalityAsTitle(
+            int cardinality, // number of items 
+            String singularName) {
+        switch (cardinality) {
+        case 0:
+            return "No " + singularName;
+        case 1:
+            return "1 " + singularName;
+        default:
+            return "" + cardinality + " entries of " + singularName;
+        }
+    }
+
+
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_InternalTitleUtil.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_InternalTitleUtil.java
index 4589ad8e34..b5b776338e 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_InternalTitleUtil.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_InternalTitleUtil.java
@@ -20,8 +20,11 @@ package org.apache.causeway.core.metamodel.object;
 
 import java.util.Optional;
 
+import org.springframework.lang.Nullable;
+
 import org.apache.causeway.core.metamodel.facets.collections.CollectionFacet;
 import 
org.apache.causeway.core.metamodel.facets.object.title.TitleRenderRequest;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 
 import lombok.NonNull;
 import lombok.val;
@@ -43,9 +46,9 @@ final class _InternalTitleUtil {
         return managedObject.getSpecification().isSingular()
             ? objectTitleString(titleRenderRequest)
                     .trim()
-            : collectionTitleString(
-                    managedObject,
-                    
managedObject.getSpecification().getFacet(CollectionFacet.class));
+            : formatAnyCardinalityAsTitle(
+                    
managedObject.getSpecification().getFacet(CollectionFacet.class).size(managedObject),
+                    managedObject.getElementSpecification().orElse(null));
     }
 
     // -- HELPER
@@ -68,33 +71,12 @@ final class _InternalTitleUtil {
                 .orElseGet(()->getDefaultTitle(managedObject));
     }
 
-    private String collectionTitleString(final ManagedObject managedObject, 
final CollectionFacet facet) {
-        final int size = facet.size(managedObject);
-        val elementSpec = managedObject.getElementSpecification().orElse(null);
-        if (elementSpec == null
-                || 
elementSpec.getFullIdentifier().equals(Object.class.getName())) {
-            switch (size) {
-            case -1:
-                return "Objects";
-            case 0:
-                return "No objects";
-            case 1:
-                return "1 object";
-            default:
-                return size + " objects";
-            }
-        } else {
-            switch (size) {
-            case -1:
-                return elementSpec.getPluralName();
-            case 0:
-                return "No " + elementSpec.getPluralName();
-            case 1:
-                return "1 " + elementSpec.getSingularName();
-            default:
-                return size + " " + elementSpec.getPluralName();
-            }
-        }
+    private String formatAnyCardinalityAsTitle(final int size, final @Nullable 
ObjectSpecification elementSpec) {
+        final String noun = (elementSpec == null
+                || 
elementSpec.getFullIdentifier().equals(Object.class.getName()))
+                    ? "object"
+                    : elementSpec.getSingularName();
+        return MmTitleUtil.formatAnyCardinalityAsTitle(size, noun);
     }
 
     private String getDefaultTitle(final ManagedObject managedObject) {
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/all/i18n/SynthesizeObjectNamingPostProcessor.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/all/i18n/SynthesizeObjectNamingPostProcessor.java
index 7fdd61291c..e1e562ce58 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/all/i18n/SynthesizeObjectNamingPostProcessor.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/all/i18n/SynthesizeObjectNamingPostProcessor.java
@@ -22,7 +22,6 @@ import javax.inject.Inject;
 
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.base._Strings;
-import org.apache.causeway.core.metamodel.commons.StringExtensions;
 import org.apache.causeway.core.metamodel.context.MetaModelContext;
 import org.apache.causeway.core.metamodel.facetapi.FacetUtil;
 import org.apache.causeway.core.metamodel.facets.all.i8n.noun.NounForm;
@@ -65,19 +64,10 @@ extends ObjectSpecificationPostProcessorAbstract {
                 .filter(_Strings::isNotEmpty)
                 .orElseGet(()->getSingularFallbackNoun(objectSpecification));
 
-        val plural = topRank
-                .stream()
-                
.filter(objectNamedFacet->objectNamedFacet.getSupportedNounForms().contains(NounForm.PLURAL))
-                .findFirst()
-                .map(ObjectNamedFacet::plural)
-                .filter(_Strings::isNotEmpty)
-                .orElseGet(()->getPluralFallbackNoun(singular));
-
         FacetUtil.addFacet(
                 new ObjectNamedFacetSynthesized(
                         NounForms.builder()
                             .singular(singular)
-                            .plural(plural)
                             .build(),
                         objectSpecification)
                 );
@@ -90,8 +80,4 @@ extends ObjectSpecificationPostProcessorAbstract {
         return spec.getFeatureIdentifier().getClassNaturalName();
     }
 
-    private String getPluralFallbackNoun(final String singular) {
-        return StringExtensions.asPluralName(singular);
-    }
-
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/ObjectSpecification.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/ObjectSpecification.java
index 112499eaea..70365ac7a2 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/ObjectSpecification.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/ObjectSpecification.java
@@ -207,15 +207,6 @@ extends
      */
     String getSingularName();
 
-    /**
-     * Returns the plural name for objects of this specification.
-     * Corresponds to the {@link HasNoun#translated(NounForm)}
-     * with {@link NounForm#PLURAL}
-     * of {@link ObjectNamedFacet}; is
-     * not necessarily immutable.
-     */
-    String getPluralName();
-
     /**
      * Returns the description, if any, of the specification.
      *
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index 101c6cc213..6a1a580f11 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -512,17 +512,6 @@ implements ObjectSpecification {
                     getFullIdentifier()));
     }
 
-    @Override
-    public String getPluralName() {
-        return lookupFacet(ObjectNamedFacet.class)
-            .flatMap(textFacet->textFacet.translated(NounForm.PLURAL))
-            // unexpected code reach, however keep for JUnit testing
-            .orElseGet(()->String.format(
-                    "(%s has neither title- nor object-named-facet)",
-                    getFullIdentifier()));
-
-    }
-
     /**
      * The translated description according to any available {@link 
ObjectDescribedFacet},
      * else empty string (<tt>""</tt>).
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/snapshot/XmlSchema.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/snapshot/XmlSchema.java
index 50ae80e758..6b9c565f2a 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/snapshot/XmlSchema.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/snapshot/XmlSchema.java
@@ -148,11 +148,11 @@ public final class XmlSchema {
      * doc used to create the element. The element is not parented but to avoid
      * an error can only be added as a child of another element in the same 
doc.
      */
-    Element createElement(final Document doc, final String localName, final 
String fullyQualifiedClassName, final String singularName, final String 
pluralName) {
+    Element createElement(final Document doc, final String localName, final 
String fullyQualifiedClassName, final String singularName) {
         final Element element = doc.createElementNS(getUri(), getPrefix() + 
":" + localName);
         element.setAttributeNS(CausewaySchema.NS_URI, CausewaySchema.NS_PREFIX 
+ ":fqn", fullyQualifiedClassName);
         element.setAttributeNS(CausewaySchema.NS_URI, CausewaySchema.NS_PREFIX 
+ ":singular", singularName);
-        element.setAttributeNS(CausewaySchema.NS_URI, CausewaySchema.NS_PREFIX 
+ ":plural", pluralName);
+        element.setAttributeNS(CausewaySchema.NS_URI, CausewaySchema.NS_PREFIX 
+ ":plural", "");
         causewayMeta.addNamespace(element); // good a place as any
 
         addNamespace(element, getPrefix(), getUri());
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/snapshot/XmlSnapshot.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/snapshot/XmlSnapshot.java
index 59dee4c6ed..3ff64e6741 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/snapshot/XmlSnapshot.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/snapshot/XmlSnapshot.java
@@ -634,7 +634,7 @@ public class XmlSnapshot implements Snapshot {
             log.debug("objectToElement(NO): create element and 
causeway:title");
         }
         final Element element = schema.createElement(getXmlDocument(), 
spec.getShortIdentifier(),
-                spec.getFullIdentifier(), spec.getSingularName(), 
spec.getPluralName());
+                spec.getFullIdentifier(), spec.getSingularName());
         causewayMetaModel.appendCausewayTitle(element, adapter.getTitle());
 
         if (log.isDebugEnabled()) {
diff --git 
a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java
 
b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java
index ecd9508260..6196e983d3 100644
--- 
a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java
+++ 
b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java
@@ -78,8 +78,7 @@ extends AbstractFacetFactoryJupiterTestCase {
             cssClassFaPosition = CssClassFaPosition.RIGHT,
             describedAs = "This is a description",
             named = "Name override",
-            paged = 20,
-            plural = "Customers Plural Form"
+            paged = 20
             )
     class Customer { }
 
@@ -367,49 +366,4 @@ extends AbstractFacetFactoryJupiterTestCase {
 
     }
 
-    public static class Plural extends DomainObjectLayoutFactoryTest {
-
-        @Mock ManagedObject mockAdapter;
-
-        public static class ForDomainObjectLayout extends Plural {
-
-            @BeforeEach
-            public void setUp2() throws Exception {
-            }
-
-            @Test
-            public void whenSpecified() {
-
-                final Class<?> cls = 
DomainObjectLayoutFactoryTest.Customer.class;
-
-                facetFactory.process(ProcessClassContext
-                        .forTesting(cls, mockMethodRemover, facetHolder));
-
-                val namedFacet = facetHolder.getFacet(ObjectNamedFacet.class);
-                assertNotNull(namedFacet);
-
-                assertEquals("Customers Plural Form", 
namedFacet.pluralTranslated());
-
-                expectNoMethodsRemoved();
-            }
-
-            @Test
-            public void whenDefaults() {
-
-                final Class<?> cls = CustomerWithDefaults.class;
-
-                facetFactory.process(ProcessClassContext
-                        .forTesting(cls, mockMethodRemover, facetHolder));
-
-                val namedFacet = facetHolder.getFacet(ObjectNamedFacet.class);
-                assertNull(namedFacet);
-
-                //assertEquals("", namedFacet.translated(NounForm.PLURAL));
-
-                expectNoMethodsRemoved();
-            }
-        }
-
-    }
-
 }
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/plural/DomainObjectLayoutPluralVm.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/plural/DomainObjectLayoutPluralVm.java
index 8a0709b9eb..75e364946f 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/plural/DomainObjectLayoutPluralVm.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObjectLayout/plural/DomainObjectLayoutPluralVm.java
@@ -48,7 +48,8 @@ import lombok.Setter;
 @DomainObject(
         nature=Nature.VIEW_MODEL)
 @DomainObjectLayout(
-        plural="Example Plural Name")
+        // plural="Example Plural Name" TODO: DEPRECATED
+        )
 public class DomainObjectLayoutPluralVm implements HasAsciiDocDescription {
 
     @ObjectSupport public String title() {
diff --git 
a/regressiontests/stable-domainmodel/src/test/java/org/apache/causeway/testdomain/domainmodel/MetaModelRegressionTest.verify.approved.xml
 
b/regressiontests/stable-domainmodel/src/test/java/org/apache/causeway/testdomain/domainmodel/MetaModelRegressionTest.verify.approved.xml
index bc9ae2e9f5..644241e42b 100644
--- 
a/regressiontests/stable-domainmodel/src/test/java/org/apache/causeway/testdomain/domainmodel/MetaModelRegressionTest.verify.approved.xml
+++ 
b/regressiontests/stable-domainmodel/src/test/java/org/apache/causeway/testdomain/domainmodel/MetaModelRegressionTest.verify.approved.xml
@@ -815,11 +815,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ProperActionWithNameStartingWithSetOrGet#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[Proper 
Action With Name Starting With Set Or Gets]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[Proper 
Action With Name Starting With Set Or Get]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[Proper 
Action With Name Starting With Set Or Gets]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[Proper 
Action With Name Starting With Set Or Get]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet"
 
fqcn="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation">
@@ -1746,11 +1744,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ProperChoicesWhenActionHasParamSupportingMethodTypeOfReference#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[Proper 
Choices When Action Has Param Supporting Method Type Of References]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[Proper 
Choices When Action Has Param Supporting Method Type Of Reference]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[Proper 
Choices When Action Has Param Supporting Method Type Of References]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[Proper 
Choices When Action Has Param Supporting Method Type Of Reference]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet"
 
fqcn="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation">
@@ -2820,11 +2816,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ProperChoicesWhenActionHasParamSupportingMethodTypeOfString#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[Proper 
Choices When Action Has Param Supporting Method Type Of Strings]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[Proper 
Choices When Action Has Param Supporting Method Type Of String]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[Proper 
Choices When Action Has Param Supporting Method Type Of Strings]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[Proper 
Choices When Action Has Param Supporting Method Type Of String]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet"
 
fqcn="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation">
@@ -3906,11 +3900,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ProperChoicesWhenChoicesFrom#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[Proper 
Choices When Choices Froms]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[Proper 
Choices When Choices From]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[Proper 
Choices When Choices Froms]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[Proper 
Choices When Choices From]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet"
 
fqcn="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation">
@@ -4796,11 +4788,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ProperElementTypeVm#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[Proper 
Element Type Vms]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[Proper 
Element Type Vm]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[Proper 
Element Type Vms]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[Proper 
Element Type Vm]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet"
 
fqcn="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation">
@@ -6117,11 +6107,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ProperFullyImpl#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[Proper 
Fully Impls]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[Proper 
Fully Impl]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[Proper 
Fully Impls]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[Proper 
Fully Impl]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.members.cssclass.CssClassFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.object.cssclass.method.CssClassFacetViaCssClassMethod">
@@ -7100,11 +7088,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ProperGenericImpl#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[Proper 
Generic Impls]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[Proper 
Generic Impl]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[Proper 
Generic Impls]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[Proper 
Generic Impl]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet"
 
fqcn="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation">
@@ -7888,11 +7874,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ProperLayoutOnPropertyWithLombok#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[Proper 
Layout On Property With Lomboks]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[Proper 
Layout On Property With Lombok]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[Proper 
Layout On Property With Lomboks]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[Proper 
Layout On Property With Lombok]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet"
 
fqcn="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation">
@@ -8700,11 +8684,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ProperMemberInheritance_usingAbstract#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[Proper 
Member Inheritance_using Abstracts]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[Proper 
Member Inheritance_using Abstract]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[Proper 
Member Inheritance_using Abstracts]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[Proper 
Member Inheritance_using Abstract]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.members.cssclass.CssClassFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.object.cssclass.method.CssClassFacetViaCssClassMethod">
@@ -9855,11 +9837,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ProperMemberInheritance_usingInterface#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[Proper 
Member Inheritance_using Interfaces]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[Proper 
Member Inheritance_using Interface]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[Proper 
Member Inheritance_using Interfaces]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[Proper 
Member Inheritance_using Interface]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet"
 
fqcn="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation">
@@ -11103,11 +11083,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ProperMemberOverloadingWhenInherited.WhenAnnotationOptional#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[When 
Annotation Optionals]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[When 
Annotation Optional]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[When 
Annotation Optionals]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[When 
Annotation Optional]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet"
 
fqcn="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation">
@@ -11887,11 +11865,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ProperMemberOverloadingWhenInherited.WhenAnnotationRequired#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[When 
Annotation Requireds]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[When 
Annotation Required]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[When 
Annotation Requireds]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[When 
Annotation Required]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet"
 
fqcn="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation">
@@ -12675,11 +12651,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ProperMemberOverloadingWhenInherited.WhenEncapsulationEnabled#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[When 
Encapsulation Enableds]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[When 
Encapsulation Enabled]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[When 
Encapsulation Enableds]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[When 
Encapsulation Enabled]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet"
 
fqcn="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation">
@@ -13463,11 +13437,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ProperMemberSupport#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[Proper 
Member Supports]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[Proper 
Member Support]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[Proper 
Member Supports]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[Proper 
Member Support]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet"
 
fqcn="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation">
@@ -16665,11 +16637,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ProperMemberSupportDiscovery.WhenAnnotationOptional#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[When 
Annotation Optionals]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[When 
Annotation Optional]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[When 
Annotation Optionals]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[When 
Annotation Optional]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet"
 
fqcn="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation">
@@ -17803,11 +17773,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ProperMemberSupportDiscovery.WhenAnnotationRequired#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[When 
Annotation Requireds]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[When 
Annotation Required]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[When 
Annotation Requireds]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[When 
Annotation Required]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet"
 
fqcn="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation">
@@ -18945,11 +18913,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ProperMemberSupportDiscovery.WhenEncapsulationEnabled#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[When 
Encapsulation Enableds]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[When 
Encapsulation Enabled]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[When 
Encapsulation Enableds]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[When 
Encapsulation Enabled]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet"
 
fqcn="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation">
@@ -23062,11 +23028,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ProperParameterSupport#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[Proper 
Parameter Supports]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[Proper 
Parameter Support]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[Proper 
Parameter Supports]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[Proper 
Parameter Support]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet"
 
fqcn="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation">
@@ -24047,11 +24011,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ProperPrefixedAction#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[Proper 
Prefixed Actions]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[Proper 
Prefixed Action]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[Proper 
Prefixed Actions]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[Proper 
Prefixed Action]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet"
 
fqcn="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation">
@@ -24830,11 +24792,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ProperPrefixedMember#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[Proper 
Prefixed Members]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[Proper 
Prefixed Member]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[Proper 
Prefixed Members]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[Proper 
Prefixed Member]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet"
 
fqcn="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation">
@@ -25859,11 +25819,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ViewModelWithAnnotationOptionalUsingPrivateSupport#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[View 
Model With Annotation Optional Using Private Supports]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[View 
Model With Annotation Optional Using Private Support]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[View Model 
With Annotation Optional Using Private Supports]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[View 
Model With Annotation Optional Using Private Support]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet"
 
fqcn="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation">
@@ -26851,11 +26809,9 @@
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet" 
fqcn="org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacetSynthesized">
                 <mml:attr name="context" 
value="TranslationContext(name=org.apache.causeway.testdomain.model.good.ViewModelWithEncapsulatedMembers#)"/>
                 <mml:attr name="facet" value="ObjectNamedFacetSynthesized"/>
-                <mml:attr name="nounForms" value="SINGULAR, PLURAL"/>
-                <mml:attr name="originalText.PLURAL" value="Optional[View 
Model With Encapsulated Memberses]"/>
+                <mml:attr name="nounForms" value="SINGULAR"/>
                 <mml:attr name="originalText.SINGULAR" value="Optional[View 
Model With Encapsulated Members]"/>
                 <mml:attr name="precedence" value="SYNTHESIZED"/>
-                <mml:attr name="translated.PLURAL" value="Optional[View Model 
With Encapsulated Memberses]"/>
                 <mml:attr name="translated.SINGULAR" value="Optional[View 
Model With Encapsulated Members]"/>
             </mml:facet>
             <mml:facet 
id="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet"
 
fqcn="org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation">
diff --git 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/domaintypes/DomainTypeReprRenderer.java
 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/domaintypes/DomainTypeReprRenderer.java
index dc8fb0e895..4eb951c9e8 100644
--- 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/domaintypes/DomainTypeReprRenderer.java
+++ 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/domaintypes/DomainTypeReprRenderer.java
@@ -176,9 +176,6 @@ extends ReprRendererAbstract<ObjectSpecification> {
     protected void putExtensionsNames() {
         final String singularName = objectSpecification.getSingularName();
         getExtensions().mapPutString("friendlyName", singularName);
-
-        final String pluralName = objectSpecification.getPluralName();
-        getExtensions().mapPutString("pluralName", pluralName);
     }
 
     protected void putExtensionsDescriptionIfAvailable() {
diff --git 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceForRestfulObjectsV1_0.java
 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceForRestfulObjectsV1_0.java
index 42fe932d99..e5d8f93bf2 100644
--- 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceForRestfulObjectsV1_0.java
+++ 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceForRestfulObjectsV1_0.java
@@ -40,6 +40,7 @@ import 
org.apache.causeway.core.metamodel.interactions.managed.ManagedAction;
 import 
org.apache.causeway.core.metamodel.interactions.managed.ManagedCollection;
 import org.apache.causeway.core.metamodel.interactions.managed.ManagedProperty;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
+import org.apache.causeway.core.metamodel.object.MmTitleUtil;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
 import 
org.apache.causeway.viewer.restfulobjects.applib.CausewayModuleViewerRestfulObjectsApplib;
@@ -320,21 +321,7 @@ implements ContentNegotiationService {
             final Collection<ManagedObject> collectionAdapters,
             final ObjectSpecification elementSpec) {
         final String singularName = elementSpec.getSingularName();
-        final String pluralName = elementSpec.getPluralName();
-        int size = collectionAdapters.size();
-        final String title;
-        switch (size) {
-        case 0:
-            title = "0 " + pluralName;
-            break;
-        case 1:
-            title = "1 " + singularName;
-            break;
-        default:
-            title = size + " " + pluralName;
-            break;
-        }
-        return title;
+        return 
MmTitleUtil.formatAnyCardinalityAsTitle(collectionAdapters.size(), 
singularName);
     }
 
     /**

Reply via email to