Sites com múltiplos idiomas utilizando Mongoid
A versão 2.4.0 da gem Mongoid foi lançada recentemente e traz algumas novidades interessantes para quem trabalha em sites com mais de um idioma.
Antes precisavamos usar a criatividade e desenvolver nossos próprios sistemas para armazenar os dados em vários idiomas. Isso era um desafio em bancos de dados relacionais e em bancos NoSQL. Na nu design, empresa onde eu trabalho, usamos isso em vários sites e necessitavamos de uma solução simples. Meu colega de trabalho Lucas Renan desenvolveu uma gem chamada MongoidI18nEmbedded que facilitava bastante o trabalho, mas não era tão simples de usar.
Agora o Mongoid traz funcionalidades nativas que ajudam muito no armazenamento de dados em mais de um idioma. Para criar um campo com suporte a vários idioma é só usar a opção localize: true. Veja o exemplo abaixo:
class Article include Mongoid::Document field :title, localize: true end
Com esse simple localize: true é possível armazenar um hash com vários idiomas nesse campo.
article = Article.new article.title_translations = {en: 'Title in english', pt: 'Título em português'} I18n.locale = :en article.title #=> 'Title in english' I18n.locale = :pt article.title #=> 'Título em português'
Infelizmente essa incrível funcionalidade ainda não é muito conhecida. Por sorte consegui descobrir ela enquanto estudava um jeito de armazenar dados em vários idiomas com Mongoid criando um tipo de campo personalizado.
Forms
Para utilizar esses campos com múltiplos idiomas eu criei uma gem chamada Localized Fields que utiliza um FormBuilder personalizado para enviar os dados no formato que o Mongoid necessita.
<%= form_for @article do |f| %> <%= f.localized_fields do |localized_fields| %> <%= localized_fields.label :title %> <%= localized_fields.text_field :title %> <% end %> <% end %>
O helper localized_fields cria os campos para todos os idiomas retornados pelo método I18n.avalibles_locales. O método I18n.available_locales retorna os idiomas que tenham arquivos .yml na pasta config/locales. Ou você pode configurar esses idiomas manualmente utilizando o comando abaixo:
I18n.available_locales = [:pt, :en, :es, :de]
Colaboração
Se alguém quiser traduzir esse artigo para o inglês eu ficaria muito grato. Como essas funcionalidades não foram muito divulgadas é possível que muitas pessoas tenham os mesmos problemas que eu tive e não utilizem essa solução nativa do Mongoid por falta de conhecimento. Qualquer um pode colaborar no desenvolvimento das gems. Durante o desenvolvimento da versão 2.4.0 do Mongoid eu tive alguns problemas e envie três pull-requests com correções e melhorias que foram aceitas pelo Durran Jordan, criador do Mongoid.