Теги: 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.
А почему не обвесить CSS то место _куда_ она приходила из модели?
ты так говоришь, как будто russian это что-то плохое
labria пишет:
у него там просто так не обвесишь, подозреваю. модель должна обвешивать :)