ruby-on-rails – 在Ruby on Rails中本地化包含数字的文本字段
目前,我正在开展一项项目,将我们的一个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时,需要将英文转换成法语. 手动方式 假设我有以下模型,速率字段为十进制数,精度为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 这看起来很好,因为示例中只有一个属性和一种类型的数据要解析,但是想象一下,必须为模型中的每个数字,日期或时间字段执行此操作.这不是我的乐趣. 这也是一个天真的方式进行转换,它不处理: >日期 我已经告诉你我喜欢法语吗? 输入离域 Delocalize正在按照上述相同的原则工作,但更加全面地完成了这项工作: >它处理Date,Time,DateTime和数字. 有一点值得注意:它不处理客户端验证.如果您使用它们,您将必须弄清楚如何在您喜欢的JavaScript框架中使用i18n. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |