我还没有解决的一个特殊问题是显示数字字段.仅显示数字时,我执行以下操作:
<%= 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显示逗号并正确验证?
解决方法
这是我讨厌做的一件事情(我在为法国用户服务,他们很容易与小数点分歧).
我专门使用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.