使用i18n-active_record进行I18n翻译:相同的键使用相同的表单。

8

我正在使用i18n-active_record 0.1.0在Rails 4上开发一个应用程序,将我的翻译保存在数据库中而不是.yml文件中。它工作得很好。

然而,我遇到的一个问题是每个翻译记录都是每个区域设置一个记录,也就是说:

#1. { locale: "en", key: "hello", value: "hello")
#2. { locale: "se", key: "hello", value: "hej")

这使得更新它们变得非常繁琐。我希望能将它们合并为一个,即:

{ key: "hello", value_en: "hello", value_se: "hej" }

我想知道是否有任何简便的方法来更新同一表单中所有键的所有实例,例如通过类似的方式进行操作。但是我好像找不到相关信息,这让我感到困惑。

有没有任何类型的技巧可以实现这一点?任何类型的黑科技也可以。

2个回答

2

您可以为翻译表创建一个ActiveRecord对象,然后在该模型上创建读取和写入函数。

读取函数将获取所有关联记录,然后将它们合并成单个哈希。

写入函数将接受您的单个哈希输入,并将其拆分为多个记录以进行写入/更新。


我理解理论,但如何与 gem 协同工作并将其实践是完全不同的事情。 - Christoffer

0

最終我使用Globalize創建了自己的翻譯功能。它並不明確依賴於I18n,因此它是一個平行系統,但它可行,雖然不太美觀,也不能替代I18n,但它具有重要的功能,可以輕鬆添加區域設置並處理所有翻譯。

  • 帶有key:string的翻譯模型
  • 在翻譯模型中:

    translates :value globalize_accessors :locales => I18n.available_locales, :attributes => [:value]

在ApplicationHelper中:

  def t2(key_str)
    key_stringified = key_str.to_s.gsub(":", "")
    t = Transl8er.find_by_key(key_stringified)
    if t.blank? 
      # Translation missing
      if t.is_a? String
        return_string = "Translation missing for #{key_str}"
      else
        return_string = key_str 
      end
    else
      begin
        return_string = t.value.strip
      rescue
        return_string = t.value
      end
    end
    return_string
  end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接