我正在尝试在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) 未指定。
我真的很感激任何帮助。
答案 0 :(得分: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添加代码以将这些方法委托给您。
答案 1 :(得分:0)
最好使用 i18n gem 来处理+存储翻译! 并在模型中指定一个I18N-lookup-key,然后使用I18N translate()方法根据用户的语言环境查找正确的翻译。
在你的情况下,我建议只存储一个符号页面标题,然后将其用作I18N的查找键
在./config/locales/
请参阅:
http://guides.rubyonrails.org/i18n.html
例外:
仅当您希望用户能够在您的Web应用程序中动态指定翻译时,您可能希望将翻译存储在数据库中。
经过一番挖掘,我找到了这个宝石,它将翻译存储在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