1

我正在尝试在 RoR 2.3.5 中创建一个名为 Translatable 的自定义 MongoMapper 数据类型:

class Translatable < String
  def initialize(translation, culture="en") 
  end 

  def languages
  end

  def has_translation(culture)?
  end

  def self.to_mongo(value) 
  end 

  def self.from_mongo(value) 
  end 
end 

我希望能够像这样使用它:

class Page 
  include MongoMapper::Document 
  key :title, Translatable, :required => true 
  key :content, String 
end

然后像这样实现:

p = Page.new 
p.title = "Hello" 
p.title(:fr) = "Bonjour" 
p.title(:es) = "Hola" 
p.content = "Some content here" 
p.save

p = Page.first
p.languages
=> [:en, :fr, :es]
p.has_translation(:fr)
=> true
en = p.title 
=> "Hello" 
en = p.title(:en)
=> "Hello"
fr = p.title(:fr) 
=> "Bonjour" 
es = p.title(:es) 
=> "Hola" 

在 mongoDB 中,我想这些信息会像这样存储:

{ "_id" : ObjectId("4b98cd7803bca46ca6000002"), "title" : { "en" : 
"Hello", "fr" : "Bonjour", "es" : "Hola" }, "content" : "Some content 
here" } 

所以 Page.title 是一个字符串,当没有指定文化时默认为英语 (:en)。

我真的很感激任何帮助。

4

2 回答 2

0

最好使用i18n gem来处理+存储翻译!并在模型中指定一个 I18N-lookup-key,然后使用 I18N translate() 方法根据用户的语言环境查找正确的翻译。

在您的情况下,我建议只存储一个符号页面标题,然后将其用作 I18N 的查找键

在静态翻译文件中查找 I18N 键./config/locales/

看:

http://guides.rubyonrails.org/i18n.html

例外:

仅当您希望用户能够在您的网络应用程序中动态指定翻译时,您可能希望将翻译存储在数据库中。

经过一番挖掘,我找到了这个 gem,它将翻译存储在 ActiveRecord 中:

这可能很容易适应 MongoDB:

https://github.com/grosser/fast_gettext

https://github.com/grosser/fast_gettext/blob/master/examples/db/migration.rb

还:

http://groups.google.com/group/rails-i18n/browse_thread/thread/6b7ba3c401890a7e

https://github.com/svenfuchs/i18n/blob/df498763cd1968c58900d66a322325d9db8b0d06/lib/i18n/backend/active_record/translation.rb#L18

于 2011-11-02T06:15:37.840 回答
0

您还没有告诉我们 Translatable 如何存储各种翻译版本的内部表示。除了 MongoMapper 集成之外,您是否有一个可用的 Translatable 类?如果是这样,您可以发布完整的来源吗?

为了论证,我假设 Translateable 有一个名为 @translated_versions 的 Hash 实例变量,它从文化符号映射到已翻译的字符串。然后,您可以将 MongoMapper 集成实现为:

class Translatable < String
  attr_reader :translated_versions

  def initialize(value)
    @translated_versions = value
  end

  def self.to_mongo(value)
    value.translated_versions
  end

  def self.from_mongo(value) 
    self.new(value)
  end
end 

这将使您足够远地将您的 Translatable 实例存储为 MongoMapper 键。请注意 p.languages 和 p.has_translation(:fr) 仍然不起作用,因为您只在 Translatable 上定义了这些方法,而不是 Page。您要么需要调用 p.title.languages 和 p.title.has_translation(:fr),要么将代码添加到 Page 以将这些方法委托给您。

于 2010-04-20T18:34:03.717 回答