mongo_translatable

Rails specific I18n model localization meant to tie-in to existing ActiveRecord models, ala Globalize2, backed by MongoDB rather than an RDBMS. May include UI elements, too.

This is a Rails engine.

If you are interested in pure MongoDB localization (your model is MongoMapper::Document, for example), check out github.com/ahe/mongo_translation.

Dependencies

MongoMapper gem for interacting with MongoDB
routing-filter gem for setting up locale in your routes

So far this is only known to work with Rails 2.3.5. Feel free to fork and hack it to work with Rails 3 and let us know about it.

Installation

You need to have mongodb installed and running.

Installing Gem

gem install mongo_translatable

Installing from Source

Get source from git and checkout submodules:
  git clone http://github.com/kete/mongo_translatable.git
  cd mongo_translatable
  git submodule init
  git submodule update

Installing Gem:
  rake gemspec
  gem build {generated gemspec file}
  gem install {generated gem file}

  Running rake will check that you have the dependencies installed correctly.

Usage

In your model…

The MongoTranslatable module is for taking advantage of MongoDB for storing translations of ActiveRecord models. Here is how it works in practice:

class Item < ActiveRecord::Base
  mongo_translate :label
end

Then you can do stuff like this (though you don’t necessarily need to directly, see below)

I18n.locale = :en

item = Item.create(:label => "a label")
p item.locale
"en"

item = Item.find(1)
p item.label
"a label"

item.translate(:label => "etiketissä", :locale => :fi).save

or you could have set I18n.locale = :fi in calling env and dropped locale from args

I18n.locale = :fi
item = Item.find(1)
p item.label
"etiketissä"
p item.locale
"fi"

Mongo_translatable also provides a UI for translations and thus an accompanying controller (translations), views, and helpers that manage CRUD for your model’s translations.

You’ll need to set up the routes for the translations controller for each model in question.

config.routes.rb in your app’s code:

ActionController::Routing::Routes.draw do |map|

map.filter 'locale' # see routing-filter gem
map.resources :items, :has_many => :translations

end

You’ll probably want to add something like this to your application’s app/controllers/application_controller.rb

# borrowed from kete application (http://github.com/kete/kete)
# modified to not rely only on mongo_translatable helpers
before_filter :set_locale
# first take the locale in the url, then the session[:locale],
# then the users locale, finally the default site locale
def set_locale
  if params[:locale] && TranslationsHelper.available_locales.include?(params[:locale])
    I18n.locale = params[:locale]
  elsif session[:locale] && TranslationsHelper.available_locales.include?(session[:locale])
    I18n.locale = session[:locale]
  else
    I18n.locale = I18n.default_locale
  end
  session[:locale] = I18n.locale # need to make sure this persists
end

There are also helpers that you can use in your application for tying into the translations UI. Like so:

<%= available_in_locales_for(@item) %> <%= needed_in_locales_for(@item, :lightbox => true) %>

Finally, you’ll probably want to provide add translation key/values for the UI’s text to your config/locales/your_locale.yml (or .rb). See this gem’s config/locales/en.yml for what to translate. Feel free to contribute back your translations to us for your locale.

See the tests and example code in the included test Rails app under test/full_2_3_5_app_with_tests for more details.

TODOs

  • add mongo_mapper “timestamps!” to …::Translation model set up by default

  • add “key :user_id, String” to …::Translation model set up by default, probably with required method implemented in owning model

Holding off on these until there is an upgrade path for translation instances that don’t have these values

Note on Patches/Pull Requests

  • Fork the project.

  • Make your feature addition or bug fix to a branch following this convention: enhancement_[ticket #]_short_description or bugfix_[ticket #]_short_description replace [ticket #] with ticket number from kete.lighthouseapp.com/projects/61584-mongo_translatable

  • Add tests for it. This is important so we don’t break it in a future version unintentionally.

  • Commit, do not mess with rakefile, version, or history.

  • Send me a pull request.

Copyright © 2010 Horowhenua Library Trust. See LICENSE for details.