如何在 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'
但是如何在我的 Rails 应用程序中构建 Liquid 日期本地化?
the documentation. However Shopify themselves seems to have build localization into their Liquid implementation似乎不支持。
我想我需要向我的模板传递语言环境(en
、fr
等)和语言环境文件。我的 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 模板中访问类似的日期本地化。
当您使用 order.date
传递日期对象时
result = template.render({'order' => {'id' => '123', 'date' => order.date}})
你能传递本地化日期或本地化日期时间吗?然后当它被渲染时它应该是正确的。
否则,您可以将日期添加到具有 class 名称的跨度中,您可以将其作为目标(用于回退)并在客户端 "fix" 将其与纯 Javascript 的组合和像 Moment.js
这样的图书馆
#
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' }}"
我最终使用了@Ben 证明的 link,并写出了这个解决方案:
# 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
中包含语言环境文件的任何内容。
您可以使用 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
包含语言环境。
在我的 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'
但是如何在我的 Rails 应用程序中构建 Liquid 日期本地化?
the documentation. However Shopify themselves seems to have build localization into their Liquid implementation似乎不支持。
我想我需要向我的模板传递语言环境(en
、fr
等)和语言环境文件。我的 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 模板中访问类似的日期本地化。
当您使用 order.date
传递日期对象时result = template.render({'order' => {'id' => '123', 'date' => order.date}})
你能传递本地化日期或本地化日期时间吗?然后当它被渲染时它应该是正确的。
否则,您可以将日期添加到具有 class 名称的跨度中,您可以将其作为目标(用于回退)并在客户端 "fix" 将其与纯 Javascript 的组合和像 Moment.js
这样的图书馆#
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' }}"
我最终使用了@Ben 证明的 link,并写出了这个解决方案:
# 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
中包含语言环境文件的任何内容。
您可以使用 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
包含语言环境。