(Des)Localizando campos com a gem I18n-alchemy

Quando se trabalha com projetos de diferentes finalidades, pessoas, localidades, moedas, e por ai vai, é normal que seja necessário uma forma de localizar datas e campos monetários. Fazer isso manualmente é possível, mas extremamente trabalhoso e feio. Para isso, nós da Cosmit utilizamos uma Gem chamada I18n-Alchemy e é exatamente ela que iremos abordar nesse post :)

Instalação

Dentro do seu Gemfile inclua a seguinte linha:

gem 'i18n_alchemy'

A seguinte faça a chamada dentro do Modelo no qual você deseja localizar as informações.

class TestModel < ActiveRecord::Base
  include I18n::Alchemy
end

Graças a forma como a Gem foi desenvolvida ela aceita arquivos YAML de configuração, para o caso de ser necessários customizar formatos, como no arquivo abaixo:

pt-BR:
  date:
    formats:
      default: "%d/%m/%Y"

  time:
    formats:
      default: "%d/%m/%Y %H:%M:%S"

  number:
    format:
      separator: ','
      delimiter: '.'
      precision: 2

Utilizando para Localizar informações

Depois de incluir o módulo dentro do Modelo ganha-se acesso ao método .lozalized. Por exemplo:

@test = Test.first
@localized = @test.localized

É com esse método que iremos localizar os campos e enviá-los para as views. Por exemplo, digamos que você tenha um campo decimal que deseja exibir localizado em pt-BR. Fazemos isso da seguinte maneira:

@test.price       # => retorna 1.99
@localized.price  # => retorna 1,99

O mesmo acontece para datas, datetimes (porém irá exibir o timezone também):

@test.date       # => 2015-02-15
@localized.date  # => 15/02/2015

Utilizando para deslocalizar informações

Simples, ein? Mas podemos utilizar a Gem para Deslocalizar informações quando é necessário formata-las para salvar no formato do banco de dados, ou para apenas salva-las sem nenhum tipo de "máscara". Abaixo temos um exemplo de request com informações em formato pt-BR:

{"name"=>"Just a some Name", "price"=>"1.000,00", "date"=>"15/02/2015"}

Abaixo temos as chamadas de métodos dentro do controller:

class TestsController < ApplicationController
  def new
    @t = Test.new
  end

  def create
    t = Test.new.localized(permitted_params)
    t.save
  end

  def edit
    @localized = resource.localized
  end

  def update
    resource.localized.update_attributes(permitted_params)
    redirect_to your_path
  end

  protected

  def permitted_params
    params.require(:test).permit(:price, :date, :name)
  end
end

Pronto!

Com isso já podemos salvar e exibir informações independente da linguagem da sua aplicação e sem se preocupar em escrever métodos para converter e desconverter essas informações todas!

Autor:
Patrick muller
Patrick Müller
Líder Tecnológico na COSMIT. Já trabalhou com planejamento e desenvolvimento de diversas Startups ao longo dos últimos anos. Adora animes, desenhos antigos e aproveita boa parte do tempo livre em busca de conhecimento que possa ajudar seus clientes a atingirem seus objetivos.
Compartilhe: