@05:20 January 11, 2010
Теги: rails, russian

20 январь 2009, или названия месяцев в russian

Захотелось мне в очередном рельсовом проекте, чтобы в датах между днём и месяцем стоял не обычный пробел, а неразрывный.

Поскольку для в проекте уже используется gem russian Ярослава Маркина, то и для вывода дат — чтобы не париться — я использовал I18n.localize. Ну и быстренько переопределил в файле локали формат:

ru:
  date:
    formats:
      long: "%d·%B·%Y"

где заместо точек надо читать неразрывный пробел. 

Посмотрел — переносов нет, всё нормально. А потом пригляделся, и увидел, что даты форматируются как «20 январь 2009».

Оказывается, в russian подстановка правильного падежа месяца определяется регулярным выражением. И выглядит оно как /(%d|%e)?(\s*)(%B)/. Неразрывный пробел, оказывается, в класс [:space:] не попадает, оттого и выражение не срабатывает, приводя к написанию «20 январь» вместо «20 января».

Один из вариантов забороть это — использовать css white-space: nowrap; — но поскольку строчка с датой приходила из модели, этот вариант мне не подошёл. Поэтому проблему я решил так:

timon:config (master) timon$ cat initializers/russian_nbsp_patch.rb 
module I18n
  module Backend
    class Advanced
      LOCALIZE_MONTH_NAMES_MATCH = /(%d|%e)?((\s|·| )*)(%B)/
    end
  end
end

Сайд-нота: вам надо будет заменить эту точку на настоящий символ неразрывного пробела, если вы захотите использовать этот код. И да, заменять значения констант в ruby можно, но не рекомендуется, поэтому я бы советовал всё-таки постараться решить эту проблему через CSS.


labria labria @06:03 January 11, 2010

 А почему не обвесить CSS то место _куда_ она приходила из модели?

caligo-mentis.livejournal.com caligo-mentis.livejournal.com @16:14 January 11, 2010

 ты так говоришь, как будто russian это что-то плохое

caligo-mentis.livejournal.com caligo-mentis.livejournal.com @16:15 January 11, 2010

labria пишет:

 А почему не обвесить CSS то место _куда_ она приходила из модели?

у него там просто так не обвесишь, подозреваю. модель должна обвешивать :)

Новый комментарий