2010-03-21 3 views
1

Я пытаюсь создать пользовательский тип данных MongoMapper в 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" } 

So Page.title - строка, которая по умолчанию соответствует английскому языку (: en), когда культура не указана.

Я бы очень признателен за любую помощь.

+0

Дэвид Cuadrado был достаточно любезен, чтобы помочь мне часть пути через MongoMapper группы Google со следующим кодом: http://pastie.org/873220, но я не получаю желаемого Результаты. – Jurgen

+1

Bump! Кто угодно? Кто угодно? ... – Jurgen

+0

Нашел! см. ниже. – Tilo

ответ

0

Вы не сказали нам, как Translitable хранит внутреннее представление различных переведенных версий. Помимо интеграции MongoMapper, есть ли у вас рабочий класс Translatable? Если да, можете ли вы опубликовать полный источник?

Я предполагаю, что для аргументации для параметра «Переменные» есть переменная экземпляра Hash, называемая @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 

Это вы получите достаточно далеко, чтобы сохранить ваши переводимые экземпляры в качестве ключей MongoMapper. Обратите внимание, что p.languages ​​и p.has_translation (: fr) все равно не будут работать, поскольку вы только определили эти методы на Translatable, а не на странице. Вам нужно будет вызвать p.title.languages ​​и p.title.has_translation (: fr) или добавить код на страницу, чтобы делегировать эти методы для названия.

0

лучше использовать драгоценный камень i18n для обработки + хранения переводов! и просто указать ключ поиска I18N в вашей модели, который затем использует метод I18N translate() для поиска правильного перевода на основе локали пользователя.

В вашем случае я бы предложил просто хранить символическое название страницы, которая затем используется в качестве ключа поиска для I18N

i18n-клавиши отыскиваются в статические файлы перевода под ./config/locales/

См:

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

Исключение:

только если вы хотите, чтобы пользователи могли динамически указывать переводы в своем веб-приложении, вы можете захотеть сохранить переводы в базе данных.

После немного копания, я нашел этот драгоценный камень, который хранит переводы в 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

+0

Исключением является причина для этого. Спасибо за ваш ответ. Я использую i18n везде. – Jurgen

+0

Проверьте обновленный ответ - я нашел драгоценный камень, который хранит переводы в ActiveRecord – Tilo

Смежные вопросы