繁体   English   中英

如何在 Liquid 中本地化日期?

[英]How to localize a date in 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}})

这会打印一些东西:

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

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

文档中似乎不支持它。 然而Shopify 自己似乎已经在他们的 Liquid 实施中建立了本地化

我想我需要向我的模板传递语言环境( 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 模板中访问类似的日期本地化。

我最终使用@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'

Sunday是带有语言环境文件的day_names中的任何内容。

使用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;

看起来你只缺少对t方法的引用。

代替

string   = "Order {{ order.id }} was created {{ order.date | date: '%A %d/%m-%Y' }}"

试试吧

string   = "Order {{ order.id }} was created {{ order.date | t: date: '%A %d/%m-%Y' }}"

您可以使用 JavaScript Intl API 来实现。

将此过滤器添加到.eleventy.js

  eleventyConfig.addFilter("displayDate", function(date, locale) {
    return new Intl.DateTimeFormat(locale, { dateStyle: "long" }).format(date);
  });

现在,您可以在 Liquid 模板中使用它来显示本地化日期:

{{ date | displayDate: locale }}

在这里, date包含日期, locale包含区域设置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM