【问题标题】:Displaying hour-format (am/pm or not) in Rails based on current locale基于当前语言环境在 Rails 中显示小时格式(上午/下午或不)
【发布时间】:2011-12-16 09:25:49
【问题描述】:

我刚刚意识到 Rails(目前为 3.1.3)中的 l(或 localize)方法似乎无法根据当前设置的语言环境管理时钟格式。我只是假设是这种情况,并没有专门对此进行测试...我刚刚验证了日期已根据语言环境重新格式化。

我在我的 rails 控制台中获得了以下所有内容的 24 小时制时钟。两种语言环境之间唯一明显的区别是月份名称的大写。

I18n.l Time.now, :format => :short,  :locale => :"en"
I18n.l Time.now + 12.hours, :format => :short,  :locale => :"en"
I18n.l Time.now, :format => :short,  :locale => :"sv-SE"
I18n.l Time.now + 12.hours, :format => :short,  :locale => :"sv-SE"

现在,这是为什么呢? 这不是本地化时间的一部分吗?

我发现 AM/PM 的唯一手动干预是为我可以“手动”要求 12 小时制的表单生成选择。一个奇怪的选择,因为对我来说,这就像我想依赖语言环境一样。

查看 Mac OS,我确实可以分别为格式首选项选择语言和区域设置,但这就是我们使用 en-US、en-GB、sv-SE 命名的原因,对吧?表示语言国家。我可以通过适合瑞典的格式将 en-SE 文件添加到我的应用程序中,其中包含英语翻译。

我假设并非所有美国开发人员都进入并编辑英语的默认语言环境文件(en-US 看起来与 en btw 相同)以获得适合美国用户的 12 小时制。所以,请随意向我展示我是多么愚蠢。我完全希望这个问题能够确定一些非常基本的问题。

简而言之。我做错了什么?以及如何“修复”我的时间戳? :)

【问题讨论】:

    标签: ruby-on-rails time localization


    【解决方案1】:

    如果直接使用%I.%m %p 指定,则可以获得 12 小时制:%p 表示指示器(“AM”或“PM”),%I 表示 12 小时制的小时(01 ..12)

    >> I18n.l Time.now, :format => "%I.%m %p",  :locale => :"en"
    => "01.12 pm"
    >> I18n.l Time.now + 12.hours, :format => "%I.%m %p",  :locale => :"en"
    => "01.12 am"
    

    这适用于 Rails 3.1

    【讨论】:

    • 谢谢,但我的问题更多是 when 显示 12 或 24 小时时间。我的直觉告诉我它应该是语言环境设置的一部分,但从我的测试来看似乎并非如此。如果不写我自己的逻辑来决定是要求 12 小时还是 24 小时的格式变体,我就不能按照你的建议。在 sv-SE 语言环境中运行您的示例仅打印 01.12,因为默认语言环境文件将 am 和 pm 字符串设置为空白。
    • 我不确定,但也许这更像是一个文化问题而不是编程问题?您可以根据需要在 I18n 语言环境文件中定义时钟格式。 12小时制只在英语地区使用,但我不知道哪个更常见,12小时制还是24小时制。
    • 我认为这就是他的问题的重点——不同的语言环境使用不同的时钟(12 对 24)。例如我希望 en-US 使用 12 小时,de-DE 使用 24 小时。
    • 不应该是“%I.%M %p”之类的吗? %m 不是一个月吗?
    【解决方案2】:

    当然,您可以根据当前的语言环境显示小时格式(am/pm 或不),例如,如果您在不同的语言/语言环境文件中以不同方式定义它。请记住日期和时间格式之间存在差异,如果使用Time.now,则使用时间格式(如果使用日期值或类型转换to_date,则使用日期格式)。瑞典文文件sv.yml 看起来像

    sv:
      time:
        formats:
          default: "%H:%M"
    

    英语语言环境文件en.yml 看起来像

    en:
      time:
        formats:
          default: '%I.%m %p'
    

    然后

    > I18n.l Time.now, :format => :default, :locale => :en
    => "06.04 PM"
    > I18n.l Time.now, :format => :default, :locale => :sv
    => "18:04"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 2015-06-02
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多