如何在Liquid中本地化日期?

时间:2018-01-23 15:24:01

标签: ruby-on-rails ruby-on-rails-5 liquid

在我的Rails 5应用中,我使用Liquid让我的用户生成内容。

根据我的用户输入,我使用以下内容初始化我的模板:

string   = "Order {{ order.id }} was created {{ order.date | date: '%A %d/%m-%Y' }}"
template = Liquid::Template.parse(string)
result   = template.render({'order' => {'id' => '123', 'date' => order.date}})

这会打印出la:

'Order 123 was created Sunday 14/01-2018'

但是如何在我的Rails应用程序中构建Liquid日期本地化?

the documentation似乎不支持它。但是Shopify themselves seems to have build localization into their Liquid implementation

我想我需要将模板传递给区域设置(enfr等)和区域设置文件。我的Rails语言环境文件如下所示:

en:
  datetime: &datetime
    month_names:
      [~, January, February, March, April, May, June, July, August, September, October, November, December]
    day_names:
      [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]
    abbr_day_names:
      [~, Sun, Mon, Thue, Wed, Thu, Fri, Sat]
    formats:
       default: "%d/%m/%Y"
       long: "%A %d/%m-%Y"

我称之为:

l(order.date, :format => :long, :locale => 'en')

我希望能够在我的Liquid模板中访问类似的日期本地化。

3 个答案:

答案 0 :(得分:2)

我最终使用@Ben证明的链接,并写下了这个解决方案:

# config/initializers/liquid_filters.rb
module I18nFilters
  def l(date, format)
    I18n.l(date, :format => format.to_sym)
  end
end

Liquid::Template.register_filter(I18nFilters)

现在,在调用新方法时:

{{ order.date | l: 'long' }}

它会打印出来:

'Sunday 14/01-2018'

Sundayday_names中包含语言环境文件的内容。

答案 1 :(得分:0)

使用order.date

传递日期对象时
result   = template.render({'order' => {'id' => '123', 'date' => order.date}})

您可以传递本地化日期或本地化日期时间吗?然后当它被渲染时它应该是正确的。

否则,您可以将日期添加到具有可以定位的类名称的跨度(用于后备),并使用纯Javascript和类似Moment.js的库

# https://stackoverflow.com/a/39161134/793330
const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;

答案 2 :(得分:0)

看起来您只缺少对string = "Order {{ order.id }} was created {{ order.date | t: date: '%A %d/%m-%Y' }}" 方法的引用。

而不是

{{1}}

尝试

{{1}}