2007-02-07 16:13:26 UTC

Человек, как известно, странное и капризное существо. Мы всегда хотим самого лучшего. Особенно от интерфейсов наших программ. Меня например, чрезвычайно расстраивает то, что в интерфейсе написано: «4 результаты сохранено на компьютере». Да, да, это родной Гугль (поиск по локальному компьютеру). Между тем, в данном конкретном случае, это не более чем лень разработчиков, ибо технически это не просто, а очень просто.

В русском языке, как известно, после числительных, существительное может идти либо в именительном падеже единственном числе, либо в родительном падеже единственном числе, либо в родительном падеже множественном числе. Написать код склонения ну совсем просто. Вот вариант с использованием XSLT:

	<!-- Число -->
	<xsl:variable name="number">
		<xsl:value-of select="/node()/some_node"/>
	</xsl:variable>

	<!-- Именительный падеж -->
	<xsl:variable name="nominative">
		<xsl:text>документ</xsl:text>
	</xsl:variable>

	<!-- Родительный падеж, единственное число -->
	<xsl:variable name="genitive_singular">
		<xsl:text>документа</xsl:text>
	</xsl:variable>

	<!-- Родительный падеж, множественное число -->
	<xsl:variable name="genitive_plural">
		<xsl:text>документов</xsl:text>
	</xsl:variable>

	<xsl:template name="declension">
		<xsl:variable name="last_digit">
			<xsl:value-of select="$number mod 10"/>
		</xsl:variable>
		<xsl:variable name="last_two_digits">
			<xsl:value-of select="$number mod 100"/>
		</xsl:variable>
		<xsl:choose>
			<xsl:when test="$last_digit = 1 and $last_two_digits != 11">
				<xsl:value-of select="$nominative"/>
			</xsl:when>
			<xsl:when
				test="
					$last_digit = 2 and $last_two_digits != 12
					or
					$last_digit = 3 and $last_two_digits != 13
					or
					$last_digit = 4 and $last_two_digits != 14
					"
			>
				<xsl:value-of select="$genitive_singular"/>
			</xsl:when>
			<xsl:otherwise>
				<xsl:value-of select="$genitive_plural"/>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>

Использовать просто — выводим где надо number и потом вызываем шаблон:

<xsl:value-of select="$number"/>
<xsl:text> </xsl:text>
<xsl:call-template name="declension"/>

Ну вот и все.

2007-02-07 16:13:26 UTC programming snippet web xslt