Jak co nejjednodušeji na: 1 Položka, 2–4 položky, 5+ položek
- Šaman
- Člen | 2659
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.)
- Rob Bob
- Člen | 60
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
@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
@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 | 566
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)