Rorra's blog Senior Developer

enero 10, 2010

Integrando radiant 0.9, globalize y GeoIP

Filed under: Ruby — admin @ 6:28 AM


Después de bajar y usar radiant 0.9 con globalize, me di cuenta que además quería que los usuarios sean dirigidos por default al sitio del lenguaje correspondiente, checkeando el IP para saber desde adonde estaban navegando. Y obvio, necesitaba GeoIP.
Instale GeoIP y después me quedaba hacer algunas modificaciones al plugin globalize para lograr mi acometido.
Primero edite config/environment.rb y agregue la linea para cargar GeoIP con la aplicación

config.gem 'geoip'

Luego, modifique el archivo vendor/extensions/globalize2/lib/globalize2/application_controller_extensions.rb

module Globalize2
  module ApplicationControllerExtensions
    def self.included(base)
      base.send(:include, InstanceMethods)
      base.class_eval do
        before_filter :set_locale
      end
    end

    module InstanceMethods
      def set_locale
        @locale = params[:locale] || session[:locale] || cookies[:locale] ||
                Globalize2Extension.ip_lookup(request.remote_ip) 

        session[:locale] = @locale
        cookies[:locale] = @locale
        I18n.locale = @locale
      end

      def reset_locale
        unless I18n.locale == Globalize2Extension.default_language
          locale = Globalize2Extension.default_language
          session[:locale] = locale
          I18n.locale = locale
          flash.now[:notice] = "The locale has been changed to default."
        end
      end
    end
  end
end



Como pueden ver en el código, también checkeo si el usuario selecciono algún lenguaje alguna vez en la cookie, y cuando el usuario selecciona (u obtiene un lenguaje por su geo localización), seteo la cookie, así la próxima vez que vuelva al sitio, va a ver el sitio con el último lenguaje seleccionado.
Finalmente, modifique el archivo vendor/extensions/globalize2/globalize2_extension.rb y agregue el siguiente método, donde obtengo el código del país del usuario, y después seteo el locale correspondiente a mi sitio en base a su IP, o el lenguaje por defecto.

  def ip_lookup(ip)
    g = GeoIP.new( File.join(File.dirname(__FILE__), '..', '..', 'gems', 'geoip-0.8.6', 'GeoIP.dat'))
    r = g.country(ip)
    country_code = r[3]
    case country_code
      when 'DE'
        'de'
      when 'GB'
        'uk'
      when 'AU'
        'au'
      when 'FR'
        'fr'
      when ' US'
        'us'
      else
        'us'
    end
  end

Y finalmente, tenemos que decirle a Radiant que cargue la librería GeoIP, así que en el mismo archivo agregamos

  extension_config do |config|
    config.gem 'geoip', :source => 'http://github.com'
  end



So that’s all, now you have GeoIP working with globalize and Radiant 0.9 :)

enero 9, 2010

Radiant y Globalize: Redirigiendo al usuario a su sitio con su lenguaje

Filed under: Ruby — admin @ 6:30 AM


Después de instalar Radiant 0.9 y Globalize, tenía que redirigir al usuario a su sitio con su lenguaje.
Si el usuario tenía asignado el locale en, al momento de visitar http://mysite.com, debería de ser redirigido a http://mysite.com/en
Todo este lío porque tenía un flash que funcionaba con archivos xml, entonces arme una estructura de ficheros y necesitaba que el usuario este parado en ese lugar, y no en la homepage, para que el flash funcione correctamente.
Estas son las modificaciones que hice al archivo vendor/extensions/globalize2/lib/globalize2/site_controller_extensions.rb, espero que les sirva

module Globalize2
  module SiteControllerExtensions
    def self.included(base)
      base.class_eval do
        alias_method_chain :find_page, :globalize

        alias_method :o riginal_show_page, :show_page
        alias_method :show_page, :check_homepage_redir

      end
    end

    def check_homepage_redir
      url = params[:url]
      if Array === url
        url = url.join('/')
      else
        url = url.to_s
      end

      if url == '/'
        locale = params[:locale] || cookies[:locale] || session[:locale] || Globalize2Extension.ip_lookup(request.remote_ip)
        redirect_to CGI.unescape('/' + locale + '/') and return
      end

      original_show_page
    end

    def find_page_with_globalize(url)
      globalized_url = '/' + I18n.locale + '/' + url
      find_page_without_globalize(globalized_url)
    end
  end
end

Powered by WordPress