加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 在Ruby on Rails中本地化包含数字的文本字段

发布时间:2020-12-16 20:30:42 所属栏目:百科 来源:网络整理
导读:目前,我正在开展一项项目,将我们的一个Ruby on-rails网络应用程序国际化,以便在其他国家(法国将成为第一个). 我还没有解决的一个特殊问题是显示数字字段.仅显示数字时,我执行以下操作: %= number_to_percentage(tax.rate,:precision = 2)% 在英语中,这显示
目前,我正在开展一项项目,将我们的一个Ruby on-rails网络应用程序国际化,以便在其他国家(法国将成为第一个).

我还没有解决的一个特殊问题是显示数字字段.仅显示数字时,我执行以下操作:

<%= number_to_percentage(tax.rate,:precision => 2)%>

在英语中,这显示为17.50,但法语中显示为预期的17,50(用逗号代替小数点).当我显示文本字段时,问题出现在“编辑”窗体中

<%= f.text_field :rate,:size => 15 %>

当这样在屏幕上显示一个文本框时,文本框总是显示17.50,一个完整的,而不是一个逗号的法语.我不确定是否正确.

当我尝试执行以下操作:

<%= f.text_field :rate,:size => 15,:value => number_with_precision(f.object.rate,:precision => 2) %>

这确实在法语的文本框中显示了17,50,但是当我点击更新按钮保存表单时,Ruby验证开始并告诉我,17,50不是数字(或者说它是“n” ‘est pas un nombre“).我必须输入17.50才能保存.

说实话,我不完全肯定在这里做的正确的事情.所有国家是否应在文本框中全部输入数字,还是有方法让Ruby-on-Rails显示逗号并正确验证?

解决方法

TL; DR

这是我讨厌做的一件事情(我在为法国用户服务,他们很容易与小数点分歧).

我专门使用delocalize gem,它为您自动进行格式翻译.你只需要安装宝石,并按原样离开你的表格,一切都应该照顾你.

我喜欢阅读,给我很长的解释

基本的转换很简单,你必须在以下格式之间来回转换:

您的持久存储(SQL数据库,NoSQL存储,YAML,平面文本文件,无论您喜欢什么,…)都使用通常是英文的后端文件.
>前端,这是您的用户喜欢的任何格式.我要用法语来坚持这个问题*.

*也是因为我很偏袒它;-)

这意味着您有两点需要进行转换:

>出站:输出HTML时,需要将英文转换成法语.
>入站:处理POST表单的结果时,需要从法语转换为英文.

手动方式

假设我有以下模型,速率字段为十进制数,精度为2(例如19.60):

class Tax < ActiveRecord::Base
  # the attr_accessor isn't really necessary here,I just want to show that there's a database field
  attr_accessor :rate
end

出站转换步骤(英语=>法语)可以通过覆盖text_field_tag来完成:

ActionView::Helpers::FormTagHelper.class_eval do
  include ActionView::Helpers::NumberHelper

  alias original_text_field_tag text_field_tag
  def text_field_tag(name,value = nil,options = {})
    value = options.delete(:value) if options.key?(:value)
    if value.is_a?(Numeric)
      value = number_with_delimiter(value) # this method uses the current locale to format our value
    end
    original_text_field_tag(name,value,options)
  end
end

在模型中将处理入站转换步骤(French => English).我们将覆盖速率属性写入器来替换英文的每个法语分隔符:

class Tax < ActiveRecord::Base
  def rate=(rate)
    write_attribute(:rate,rate.gsub(I18n.t('number.format.separator'),'.')
  end
end

这看起来很好,因为示例中只有一个属性和一种类型的数据要解析,但是想象一下,必须为模型中的每个数字,日期或时间字段执行此操作.这不是我的乐趣.

这也是一个天真的方式进行转换,它不处理:

>日期
>时代
>分隔符(例如100,000.84)

我已经告诉你我喜欢法语吗?

输入离域

Delocalize正在按照上述相同的原则工作,但更加全面地完成了这项工作:

>它处理Date,Time,DateTime和数字.
>你不必做任何事情,只需安装宝石.它会检查您的ActiveRecord列,以确定它是否需要转换并自动执行.
数字转换非常简单,但日期真的很有趣.解析表单结果时,会按照降序的方式尝试在您的区域设置文件中定义的日期格式,并且能够理解如下格式的日期:15 janvier 2012.
>每次出站转换都将自动完成.
>测试.
>它是活跃的

有一点值得注意:它不处理客户端验证.如果您使用它们,您将必须弄清楚如何在您喜欢的JavaScript框架中使用i18n.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读