Linksniuojam vienaskaitą ir daugiskaitą

Matyt ne kartą esame matę kažką panašaus į „Jūs turite 21 naujų pranešimų“. Daugiskaitos linksnių problemą lengvai išsprendžia toks pagalbininkas:

class Helper {

	/**
	 * Plural forms (Lithuanian locale)
	 * Usage:
	 * <code>
	 *  echo "$n " . Helper::plural( 'obuolys|obuoliai|obuolių', $n );
	 *  echo Helper::plural( '{vnt} obuolys|{vnt} obuoliai|{vnt} obuolių', $n, array( '{vnt}' => $n ) );
	 * </code>
	 *
	 * @param string $string
	 * @param int $n
	 * @param array $placeholders
	 * @return string
	 */
	public static function plural ( $string, $n, $placeholders = array() ) {

		$string = explode( '|', $string );
		$key = ( ( $n % 10 == 1 ) && ( $n % 100 != 11 ) ) ? 0 : ( ( ( $n % 10 >= 2 ) && ( ( $n % 100 < 10 ) || ( $n % 100 >= 20 ) ) ) ? 1 : 2 );

		return strtr( $string[$key], $placeholders ) ;
	}

}

Bandom:

<pre>
<?php
	$test = [0,1,2,11,21,99,100,101,102,111];
	foreach ( $test as $n ) {
		echo Helper::plural( '{vnt} obuolys|{vnt} obuoliai|{vnt} obuolių', $n, array( '{vnt}' => $n ) )."\n";
	}
?>
</pre>

Rezultatas

0 obuolių
1 obuolys
2 obuoliai
11 obuolių
21 obuolys
99 obuoliai
100 obuolių
101 obuolys
102 obuoliai
111 obuolių

Taisykles kitoms lokalėms galima nesunkiai susigūglinti.

Parašykite komentarą

El. pašto adresas nebus skelbiamas. Būtini laukeliai pažymėti *

Brukalų kiekiui sumažinti šis tinklalapis naudoja Akismet. Sužinokite, kaip apdorojami Jūsų komentarų duomenys.