Čísla a skloňování na stránkách

The Zero, sobota 16. 12. 2006 - 18:09

Dost často se na různých generovaných stránkách setkávám s všemožnými číselnými údaji. Na většině těchto stránek ovšem rezignovali autoři na zrádnou češtinu, která si umí pohrát s tvary přídavných i podstatných jmen, která obalují čísla.

Jako příklad si můžeme uvést třeba kombinace "Od vaší poslední návštěvy..." - "přibyl 1 nový článek", "přibyly 2-4 nové články", "přibylo 5 a více nových článků". A to je jen špička ledovce, úplně správně by to mělo být navíc "přibylo 12 nových článků", ale "přibyly 42 nové články" (čti "čtyřicet dva nové články", "padesát jeden nový článek" atd.).

Programátoři, kteří mají alespoň nějaký smysl pro češtinu, použijí opis. "Nových článků od vaší poslední návštěvy: 4". Ale to taky není ono.

Já jsem to dlouho řešil nepěkně přímo v kódu:

if(!$num || $num>4)
echo 'Přibylo '.$num.' nových článků';
elseif($num==1)
echo 'Přibyl jeden nový článek';
else
echo 'Přibyly '.$num.' nové články';

To se mi samozřejmě nelíbilo. Nehledě na to, že tento způsob neumožňuje použít tu složitou variantu.

Proto jsem si na to napsal vlastní funkci. S úspěchem ji používám už přes půl roku, ale dneska jsem ji upravil a přidal tu složitější verzi. :) Stáhněte si zdrojový kód třídy inflect a podívejte se sami. (Update: Ono je to napsáno ve zdrojáku, ale raději to přidám i sem: kód je nabízen pod licencí LGPL - na Creative Commons to mají docela pěkně vysvětlené)  Použití je celkem jednoduché:

$msg=inflect::inflect($delta, 
' nových článků', ' nové články', ' nový článek',
'Přibylo ', 'Přibyla ', 'Přibylo ');

Ve výchozím nastavení se používá komplexní varianta (tj. bere v úvahu i desítky). Změnit to na jednoduchou (tj. jakékoli číslo >= 5 použije první řetězec) můžete buď přímo v definici třídy nebo za běhu pomocí funkce inflect::toggle. Ale to uvidíte v kódu sami ;)

Poznámka: Funguje pouze v PHP 5. Pokud to chcete použít ve čtyřce, nejjednodušší bude "vykuchat" si funkce inflect_simple a inflect_complex a používat je bez obalení třídou.

Zařazeno do kategorie PHP.

Předchozí: Až mi vypadnou oči

Následující: I know a bot

Komentáře

1. MiK

18.12.2006 13:01:42

Často se s tím setkávám v souvislosti s lokalizací webů do více jazyků. Jednoduše a systémově to lze řešit s použitím gettextu, který zabije obě rány jednou ranou: http://cz2.php.net/manual/cs/function.ngettext.php
Tvar "Jeden milion sto dvacet čtyři tisíce dvě stě padesát jeden obyvatel" nesnáším a nepodporuji. :P

Přidat komentář

Jako heslo je to proto, že lze využít magic wand a odpověď se tak bude pamatovat.

Povolené tagy: b, i, q. Bez jakýchkoli atributů a řádně ukončené. URL se převádí automaticky.

Vyžadováno je pouze jméno (proto je zvýrazněné), text, kód (ten zadáváte jen s vypnutým JavaScriptem - jestli ho nevidíte, nemusíte se o něj starat. Poslední věc, kterou formulář vyžaduje, je stisknutí tlačítka Přidat.

* E-mail slouží především k načtení gravatarů. Zobrazovat se nebude.