1

Translatable と呼ばれる RoR 2.3.5 でカスタム 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

Translatable がさまざまな翻訳されたバージョンの内部表現をどのように保存するかについて、あなたは私たちに教えてくれませんでした。MongoMapper の統合以外に、動作する Translatable クラスはありますか? もしそうなら、あなたは完全なソースを投稿できますか?

議論のために、Translateable には @translated_versions というハッシュ インスタンス変数があり、カルチャ シンボルから翻訳された文字列にマップされると仮定します。次に、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) はまだ機能しないことに注意してください。これらのメソッドは Page ではなく Translatable でのみ定義したためです。p.title.languages と p.title.has_translation(:fr) を呼び出すか、ページにコードを追加して、これらのメソッドをタイトルに委譲する必要があります。

于 2010-04-20T18:34:03.717 に答える
0

i18n gemを使用して翻訳を処理 + 保存することをお勧めします! モデルで I18N-lookup-key を指定するだけで、I18N translate() メソッドを使用して、ユーザーのロケールに基づいて正しい翻訳を検索します。

あなたの場合、I18Nのルックアップキーとして使用される象徴的なページタイトルを保存することをお勧めします

I18N キーは、以下の静的変換ファイルで検索されます。./config/locales/

見る:

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

例外:

ユーザーが Web アプリ内で動的に翻訳を指定できるようにする場合にのみ、翻訳をデータベースに保存することをお勧めします。

少し掘り下げた後、ActiveRecordに翻訳を保存するこのgemを見つけました。

これはおそらく 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 に答える