Jak co nejjednodušeji na: 1 Položka, 2–4 položky, 5+ položek

ryu
Člen | 29
+
0
-

Viz nadpis. Někde už jsem to viděl, ale nemůžu to najít a napadají mě samé podmínkové šílenosti.
Jak toto řešíte v šablonách vy?

CZechBoY
Člen | 3608
+
0
-

O kterou cast ti konkretne jde? Prekladani pluralu? Rozrazeni do nejakych intervalu?

ryu
Člen | 29
+
0
-

Teď mám v šabloně:
{$userMessages->count} nových zpráv.

A výpis vypadá:
0 nových zpráv
1 nových zpráv
3 nových zpráv

a já bych rád viděl:
0 nových zpráv
1 nová zpráva
3 nové zprávy

Jak toho docílit s minimem kódu okolo?

Šaman
Člen | 2634
+
0
-

Myslím, že jsem to někde řešil makrem, které dostalo za parametr pole plurálů.
Tedy: {$userMessages->count|plural:["žádné nové zprávy", "nová zpráva", "nové zprávy", "nových zpráv"]}
Resp. já to používal jen pro 1, 2–4, 5+. Když jako parametr nebylo celé pole, tak jsem bral poslední tvar (třeba ["upozornění"] stačí jedno pro všechny případy.)

ryu
Člen | 29
+
0
-

@Šaman Tohle vypadá moc pěkně, ukážeš definici filtru?

Rob Bob
Člen | 60
+
0
-

Nejsem Šaman, ale já bych to udělal zhruba takto :)

<?php
function plurar(int $count, array $text) : string {
   if(empty($text)) {
      //exception
   }
   $text = array_pad($text, 4, end($text)); //zarovnání pole na 4 prvky překopírováním poslední hodnoty ať nemusíme řešit další podmínky
   switch(true) {
       case $count === 0:
          return $text[0];
       case $count === 1:
          return $text[1];
       case $count <= 4:
          return $text[2];
       default:
          return $text[3];
   }
}

?>

Editoval Rob Bob (3. 11. 2017 9:53)

CZechBoY
Člen | 3608
+
0
-

@RobBob Chybí tam modulo pro vyšší čísla…

Určitě bych nekopíroval pole do určitý délky, bude se to asi docela špatně debugovat když bude omylem nějaká hodnota chybět – radši bych to naduplikoval pokud bude pouze 1 položka.

edit: tak první vítka je asi zastaralá a už se nepoužívá

Editoval CZechBoY (3. 11. 2017 13:47)

Rob Bob
Člen | 60
+
+1
-

@CZechBoY Jaká vyšší čísla? Čeština má 3 varianty plurálu, „101 nových zpráv“ pořád odpovídá 5+. Teda podle starých pravidel by to asi mělo být „101 nová zpráva“, ale od toho se upouští a mně osobně to přijde dost kostrbaté :) viz https://www.interval.cz/…ni-cislovek/

Editoval Rob Bob (3. 11. 2017 11:19)

GEpic
Člen | 562
+
+3
-

Původního autora si již nepamatuji (sorry).

<?php
namespace App\Helper\Filter;

class Plural
{

    /**
     * @param $n
     * @return string
     */
    public static function process($n)
    {
        $args = func_get_args();
        return $args[($n == 1) ? 1 : (($n >= 2 && $n <= 4) ? 2 : 3)];
    }

}

Zaregistrovat jako filtr a používá se velice podobně jako uvedl @Šaman:

{$promenna|plural:"zpráva":"zprávy":"zpráv"}

Vrací tvary na základě proměnné, pokud chceš navíc vypsat např. „5 zpráv“, musíš použít:

{$promenna} {$promenna|plural:"zpráva":"zprávy":"zpráv"}

Je to z toho důvodu, že někdy můžeš chtít vypsat například jen ten plurál a nebo naopak původní číslo ještě nějak formátovat a je prostě hezčí to mít odděleně.

To s tím „žádné zprávy“ by se dle mě mělo ošetřovat i beztak nějakým ifem před použítím, protože při vypsání proměnné předpokládám, že již nějaká data obsahuje.

Editoval GEpic (3. 11. 2017 12:31)