diff --git a/src/Plugin/StringPluralForm/FiveFormsIrish.php b/src/Plugin/StringPluralForm/FiveFormsIrish.php
new file mode 100644
index 0000000000000000000000000000000000000000..8a3705e0eb51c6bd10b4d6a1991b866b397a83b8
--- /dev/null
+++ b/src/Plugin/StringPluralForm/FiveFormsIrish.php
@@ -0,0 +1,62 @@
+<?php
+
+namespace Drupal\string_plural_form\Plugin\StringPluralForm;
+
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\string_plural_form\Attribute\StringPluralForm;
+use Drupal\string_plural_form\StringPluralFormBase;
+
+/**
+ * Provides a custom block plugin.
+ */
+#[StringPluralForm(
+  id: "five_forms_irish",
+  admin_label: new TranslatableMarkup("Five Forms, special case for one, two, 3..6, 7..10, [0, 11, 12, ...]"),
+  description: new TranslatableMarkup("Case in the language like Gaeilge (Irish)."),
+)]
+class FiveFormsIrish extends StringPluralFormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextNplurals(): int {
+    return 5;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextPlural(): string {
+    return "(n==1 ? 0 : n==2 ? 1 : n>=3 && n<=6 ? 2 : n>=7 && n<=10 ? 3 : 4)";
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAssociatedLanguageCodes(): array {
+    return [
+      "ga",
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndex(int $n): int {
+    return ($n == 1 ? 0 : ($n == 2 ? 1 : ($n >= 3 && $n <= 6 ? 2 : ($n >= 7 && $n <= 10 ? 3 : 4))));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndexLabel(int $index): TranslatableMarkup {
+    return match($index) {
+      0 => new TranslatableMarkup("One"),
+      1 => new TranslatableMarkup("Two"),
+      2 => new TranslatableMarkup("3, 4, 5, 6"),
+      3 => new TranslatableMarkup("7, 8, 9, 10"),
+      4 => new TranslatableMarkup("0, 11, 12, 13..."),
+    };
+  }
+
+}
diff --git a/src/Plugin/StringPluralForm/FourFormsSlavicType4.php b/src/Plugin/StringPluralForm/FourFormsSlavicType4.php
new file mode 100644
index 0000000000000000000000000000000000000000..3b5c76016e4f7e80bb1b31ed38c5ecf13a96cfdd
--- /dev/null
+++ b/src/Plugin/StringPluralForm/FourFormsSlavicType4.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace Drupal\string_plural_form\Plugin\StringPluralForm;
+
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\string_plural_form\Attribute\StringPluralForm;
+use Drupal\string_plural_form\StringPluralFormBase;
+
+/**
+ * Provides a custom block plugin.
+ */
+#[StringPluralForm(
+  id: "four_forms_slavic_type_4",
+  admin_label: new TranslatableMarkup("Four forms, special case for one and all numbers ending in 02, 03, or 04"),
+  description: new TranslatableMarkup("Case in some Slavic family language like Slovenian."),
+)]
+class FourFormsSlavicType4 extends StringPluralFormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextNplurals(): int {
+    return 4;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextPlural(): string {
+    return "n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3";
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAssociatedLanguageCodes(): array {
+    return [
+      "sl",
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndex(int $n): int {
+    return $n % 100 == 1 ? 0 : ($n % 100 == 2 ? 1 : ($n % 100 == 3 || $n % 100 == 4 ? 2 : 3));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndexLabel(int $index): TranslatableMarkup {
+    return match($index) {
+      0 => new TranslatableMarkup("1, 101, 201, 301..."),
+      1 => new TranslatableMarkup("2, 102, 202, 302..."),
+      2 => new TranslatableMarkup("3, 4, 103, 104..."),
+      3 => new TranslatableMarkup("0, 5, 6, 7..."),
+    };
+  }
+
+}
diff --git a/src/Plugin/StringPluralForm/OnlyOneForm.php b/src/Plugin/StringPluralForm/OnlyOneForm.php
new file mode 100644
index 0000000000000000000000000000000000000000..f3476dbf13c8e26822483a67535d4247265a29c2
--- /dev/null
+++ b/src/Plugin/StringPluralForm/OnlyOneForm.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace Drupal\string_plural_form\Plugin\StringPluralForm;
+
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\string_plural_form\Attribute\StringPluralForm;
+use Drupal\string_plural_form\StringPluralFormBase;
+
+/**
+ * Provides a custom block plugin.
+ */
+#[StringPluralForm(
+  id: "only_one_form",
+  admin_label: new TranslatableMarkup("Only one form"),
+  description: new TranslatableMarkup("Some languages only require one single form. There is no distinction between the singular and plural form."),
+)]
+class OnlyOneForm extends StringPluralFormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextNplurals(): int {
+    return 1;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextPlural(): string {
+    return "0";
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAssociatedLanguageCodes(): array {
+    return [
+      "ja",
+      "vi",
+      "ko",
+      "th",
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndex(int $n): int {
+    return 0;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndexLabel(int $index): TranslatableMarkup {
+    return match($index) {
+      0 => new TranslatableMarkup("All cases"),
+    };
+  }
+
+}
diff --git a/src/Plugin/StringPluralForm/SixFormsArabic.php b/src/Plugin/StringPluralForm/SixFormsArabic.php
new file mode 100644
index 0000000000000000000000000000000000000000..acfd012e3c6a7c3d22e06fd333caa980a18f0969
--- /dev/null
+++ b/src/Plugin/StringPluralForm/SixFormsArabic.php
@@ -0,0 +1,69 @@
+<?php
+
+namespace Drupal\string_plural_form\Plugin\StringPluralForm;
+
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\string_plural_form\Attribute\StringPluralForm;
+use Drupal\string_plural_form\StringPluralFormBase;
+
+/**
+ * Provides a custom block plugin.
+ */
+#[StringPluralForm(
+  id: "six_forms_arabic",
+  admin_label: new TranslatableMarkup("Six forms, special cases for one, two, all numbers ending in 02, 03, … 10, all numbers ending in 11 … 99, and others"),
+  description: new TranslatableMarkup("Case in some Afroasiatic family language like Arabic."),
+)]
+class SixFormsArabic extends StringPluralFormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextNplurals(): int {
+    return 6;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextPlural(): string {
+    return "n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n>10 && n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5";
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAssociatedLanguageCodes(): array {
+    return [
+      "ar",
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndex(int $n): int {
+    $index = match ($n) {
+      0 => 0,
+      1 => 1,
+      2 => 2,
+      default =>  ($n>10 && $n%100>=3 && $n%100<=10) ? 3 : ($n%100>=11 ? 4 : 5)
+    };
+    return $index;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndexLabel(int $index): TranslatableMarkup {
+    return match($index) {
+      0 => new TranslatableMarkup("zero"),
+      1 => new TranslatableMarkup("one"),
+      2 => new TranslatableMarkup("two"),
+      3 => new TranslatableMarkup("all numbers ending in 02, 03, … 10"),
+      4 => new TranslatableMarkup("all numbers ending in 11 … 99"),
+      5 => new TranslatableMarkup("other cases"),
+    };
+  }
+
+}
diff --git a/src/Plugin/StringPluralForm/ThreeFormsLithuanian.php b/src/Plugin/StringPluralForm/ThreeFormsLithuanian.php
new file mode 100644
index 0000000000000000000000000000000000000000..7e435801ab4e262732a0ba52fce2e66e3b8d7a46
--- /dev/null
+++ b/src/Plugin/StringPluralForm/ThreeFormsLithuanian.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Drupal\string_plural_form\Plugin\StringPluralForm;
+
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\string_plural_form\Attribute\StringPluralForm;
+use Drupal\string_plural_form\StringPluralFormBase;
+
+/**
+ * Provides a custom block plugin.
+ */
+#[StringPluralForm(
+  id: "three_forms_lithuanian",
+  admin_label: new TranslatableMarkup("Three forms, special case for numbers ending in 1[2-9]"),
+  description: new TranslatableMarkup("Case in the Lithuanian language."),
+)]
+class ThreeFormsLithuanian extends StringPluralFormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextNplurals(): int {
+    return 3;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextPlural(): string {
+    return "n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2";
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAssociatedLanguageCodes(): array {
+    return [
+      "lt",
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndex(int $n): int {
+    return $n % 10 == 1 && $n % 100 != 11 ? 0 : ($n % 10 >= 2 && ($n % 100 < 10 || $n % 100 >= 20) ? 1 : 2);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndexLabel(int $index): TranslatableMarkup {
+    return match($index) {
+      0 => new TranslatableMarkup("1, 21, 31, 41..."),
+      1 => new TranslatableMarkup("2, 3, 4, 5, ..."),
+      2 => new TranslatableMarkup("0, 10, 11, 12..."),
+    };
+  }
+
+}
diff --git a/src/Plugin/StringPluralForm/ThreeFormsRomanian.php b/src/Plugin/StringPluralForm/ThreeFormsRomanian.php
new file mode 100644
index 0000000000000000000000000000000000000000..eaf0957c852467bdb694e14801e2ee18eeb742ad
--- /dev/null
+++ b/src/Plugin/StringPluralForm/ThreeFormsRomanian.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Drupal\string_plural_form\Plugin\StringPluralForm;
+
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\string_plural_form\Attribute\StringPluralForm;
+use Drupal\string_plural_form\StringPluralFormBase;
+
+/**
+ * Provides a custom block plugin.
+ */
+#[StringPluralForm(
+  id: "three_forms_romanian",
+  admin_label: new TranslatableMarkup("Three forms, special case for numbers ending in 00 or [2-9][0-9]"),
+  description: new TranslatableMarkup("Case in the Romanian language."),
+)]
+class ThreeFormsRomanian extends StringPluralFormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextNplurals(): int {
+    return 3;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextPlural(): string {
+    return "n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2";
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAssociatedLanguageCodes(): array {
+    return [
+      "ro",
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndex(int $n): int {
+    return $n == 1 ? 0 : (($n == 0 || ($n % 100 > 0 && $n % 100 < 20)) ? 1 : 2);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndexLabel(int $index): TranslatableMarkup {
+    return match($index) {
+      0 => new TranslatableMarkup("One"),
+      1 => new TranslatableMarkup("0, 2, 3, 4..."),
+      2 => new TranslatableMarkup("20, 21, 22, 23..."),
+    };
+  }
+
+}
diff --git a/src/Plugin/StringPluralForm/ThreeFormsSlavicType1.php b/src/Plugin/StringPluralForm/ThreeFormsSlavicType1.php
new file mode 100644
index 0000000000000000000000000000000000000000..4b9dd7739d0d45870a8d466dba0b9bad52815363
--- /dev/null
+++ b/src/Plugin/StringPluralForm/ThreeFormsSlavicType1.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace Drupal\string_plural_form\Plugin\StringPluralForm;
+
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\string_plural_form\Attribute\StringPluralForm;
+use Drupal\string_plural_form\StringPluralFormBase;
+
+/**
+ * Provides a custom block plugin.
+ */
+#[StringPluralForm(
+  id: "three_forms_slavic_type_1",
+  admin_label: new TranslatableMarkup("Three forms, special cases for numbers ending in 1 and 2, 3, 4, except those ending in 1[1-4]"),
+  description: new TranslatableMarkup("Case in some Slavic family language like Russian, Ukranian, etc."),
+)]
+class ThreeFormsSlavicType1 extends StringPluralFormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextNplurals(): int {
+    return 3;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextPlural(): string {
+    return "n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2";
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAssociatedLanguageCodes(): array {
+    return [
+      "ru",
+      "uk",
+      "be",
+      "sr",
+      "hr",
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndex(int $n): int {
+    return $n % 10 == 1 && $n % 100 != 11 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? 1 : 2);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndexLabel(int $index): TranslatableMarkup {
+    return match($index) {
+      0 => new TranslatableMarkup("1, 21, 31, 41..."),
+      1 => new TranslatableMarkup("2, 3, 4, 22..."),
+      2 => new TranslatableMarkup("0, 5, 6, 7..."),
+    };
+  }
+
+}
diff --git a/src/Plugin/StringPluralForm/ThreeFormsSlavicType2.php b/src/Plugin/StringPluralForm/ThreeFormsSlavicType2.php
new file mode 100644
index 0000000000000000000000000000000000000000..cc7980e5fed2fa8f15389f28d3a3556903caad15
--- /dev/null
+++ b/src/Plugin/StringPluralForm/ThreeFormsSlavicType2.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace Drupal\string_plural_form\Plugin\StringPluralForm;
+
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\string_plural_form\Attribute\StringPluralForm;
+use Drupal\string_plural_form\StringPluralFormBase;
+
+/**
+ * Provides a custom block plugin.
+ */
+#[StringPluralForm(
+  id: "three_forms_slavic_type_2",
+  admin_label: new TranslatableMarkup("Three forms, special cases for 1 and 2, 3, 4"),
+  description: new TranslatableMarkup("Case in some Slavic family language like Czech, Slovak."),
+)]
+class ThreeFormsSlavicType2 extends StringPluralFormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextNplurals(): int {
+    return 3;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextPlural(): string {
+    return "(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2";
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAssociatedLanguageCodes(): array {
+    return [
+      "cs",
+      "sk",
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndex(int $n): int {
+    return ($n == 1) ? 0 : (($n >= 2 && $n <= 4) ? 1 : 2);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndexLabel(int $index): TranslatableMarkup {
+    return match($index) {
+      0 => new TranslatableMarkup("One"),
+      1 => new TranslatableMarkup("2, 3, 4"),
+      2 => new TranslatableMarkup("0, 5, 6, 7..."),
+    };
+  }
+
+}
diff --git a/src/Plugin/StringPluralForm/ThreeFormsSlavicType3.php b/src/Plugin/StringPluralForm/ThreeFormsSlavicType3.php
new file mode 100644
index 0000000000000000000000000000000000000000..f2e202a6f556ed582acba9528eb7b4b5c169be50
--- /dev/null
+++ b/src/Plugin/StringPluralForm/ThreeFormsSlavicType3.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Drupal\string_plural_form\Plugin\StringPluralForm;
+
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\string_plural_form\Attribute\StringPluralForm;
+use Drupal\string_plural_form\StringPluralFormBase;
+
+/**
+ * Provides a custom block plugin.
+ */
+#[StringPluralForm(
+  id: "three_forms_slavic_type_3",
+  admin_label: new TranslatableMarkup("Three forms, special case for one and some numbers ending in 2, 3, or 4"),
+  description: new TranslatableMarkup("Case in some Slavic family language like Polish."),
+)]
+class ThreeFormsSlavicType3 extends StringPluralFormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextNplurals(): int {
+    return 3;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextPlural(): string {
+    return "n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2";
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAssociatedLanguageCodes(): array {
+    return [
+      "pl",
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndex(int $n): int {
+    return $n == 1 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? 1 : 2);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndexLabel(int $index): TranslatableMarkup {
+    return match($index) {
+      0 => new TranslatableMarkup("One"),
+      1 => new TranslatableMarkup("2, 3, 4, 22..."),
+      2 => new TranslatableMarkup("0, 5, 6, 7..."),
+    };
+  }
+
+}
diff --git a/src/Plugin/StringPluralForm/ThreeFormsSpecialCaseForZero.php b/src/Plugin/StringPluralForm/ThreeFormsSpecialCaseForZero.php
new file mode 100644
index 0000000000000000000000000000000000000000..1793cf9602a81628af079fd959426bfe8ae3c43d
--- /dev/null
+++ b/src/Plugin/StringPluralForm/ThreeFormsSpecialCaseForZero.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Drupal\string_plural_form\Plugin\StringPluralForm;
+
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\string_plural_form\Attribute\StringPluralForm;
+use Drupal\string_plural_form\StringPluralFormBase;
+
+/**
+ * Provides a custom block plugin.
+ */
+#[StringPluralForm(
+  id: "three_forms_special_case_for_zero",
+  admin_label: new TranslatableMarkup("Three forms, special case for zero"),
+  description: new TranslatableMarkup("Case in the language like Latvian."),
+)]
+class ThreeFormsSpecialCaseForZero extends StringPluralFormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextNplurals(): int {
+    return 3;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextPlural(): string {
+    return "n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2";
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAssociatedLanguageCodes(): array {
+    return [
+      "lv",
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndex(int $n): int {
+    return $n % 10 == 1 && $n % 100 != 11 ? 0 : ($n != 0 ? 1 : 2);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndexLabel(int $index): TranslatableMarkup {
+    return match($index) {
+      0 => new TranslatableMarkup("0, 10, 11, 12..."),
+      1 => new TranslatableMarkup("1, 21, 31, 41..."),
+      2 => new TranslatableMarkup("2, 3, 4, 5..."),
+    };
+  }
+
+}
diff --git a/src/Plugin/StringPluralForm/ThreeFormsSpecialCasesForOneAndTwo.php b/src/Plugin/StringPluralForm/ThreeFormsSpecialCasesForOneAndTwo.php
new file mode 100644
index 0000000000000000000000000000000000000000..e220475b52504e3a9b3a6f9664ef6217ef70bc10
--- /dev/null
+++ b/src/Plugin/StringPluralForm/ThreeFormsSpecialCasesForOneAndTwo.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Drupal\string_plural_form\Plugin\StringPluralForm;
+
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\string_plural_form\Attribute\StringPluralForm;
+use Drupal\string_plural_form\StringPluralFormBase;
+
+/**
+ * Provides a custom block plugin.
+ */
+#[StringPluralForm(
+  id: "three_forms_special_cases_for_one_and_two",
+  admin_label: new TranslatableMarkup("Three forms, special cases for one and two"),
+  description: new TranslatableMarkup("Case in the language like Gaeilge (Irish)."),
+)]
+class ThreeFormsSpecialCasesForOneAndTwo extends StringPluralFormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextNplurals(): int {
+    return 3;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextPlural(): string {
+    return "n==1 ? 0 : n==2 ? 1 : 2";
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAssociatedLanguageCodes(): array {
+    return [
+      "ga",
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndex(int $n): int {
+    return $n == 1 ? 0 : ($n == 2 ? 1 : 2);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndexLabel(int $index): TranslatableMarkup {
+    return match($index) {
+      0 => new TranslatableMarkup("One"),
+      1 => new TranslatableMarkup("Two"),
+      2 => new TranslatableMarkup("3, 4, 5..."),
+    };
+  }
+
+}
diff --git a/src/Plugin/StringPluralForm/TwoFormsSingularForZeroAndOne.php b/src/Plugin/StringPluralForm/TwoFormsSingularForZeroAndOne.php
new file mode 100644
index 0000000000000000000000000000000000000000..f058c5c4245c0f33ab13f8ecd5cba891b4d40aea
--- /dev/null
+++ b/src/Plugin/StringPluralForm/TwoFormsSingularForZeroAndOne.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Drupal\string_plural_form\Plugin\StringPluralForm;
+
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\string_plural_form\Attribute\StringPluralForm;
+use Drupal\string_plural_form\StringPluralFormBase;
+
+/**
+ * Provides a custom block plugin.
+ */
+#[StringPluralForm(
+  id: "two_forms_singular_for_zero_and_one",
+  admin_label: new TranslatableMarkup("Two forms, singular used for zero and one"),
+  description: new TranslatableMarkup("Exceptional case in the language family like Brazilian Portuguese and French."),
+)]
+class TwoFormsSingularForZeroAndOne extends StringPluralFormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextNplurals(): int {
+    return 2;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGettextPlural(): string {
+    return "n != 1";
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAssociatedLanguageCodes(): array {
+    return [
+      "pt",
+      "fr",
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndex(int $n): int {
+    return ($n > 1);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndexLabel(int $index): TranslatableMarkup {
+    return match($index) {
+      0 => new TranslatableMarkup("Zero, Singular"),
+      1 => new TranslatableMarkup("Plural"),
+    };
+  }
+
+}