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"/>
Ну вот и все.