# Globalize tuning

**URL:** <https://www.ruby-forum.com/t/globalize-tuning/68273>\
**Category:** Rails\
**Created:** [September 11, 2006, 11:15am UTC](https://www.ruby-forum.com/t/globalize-tuning/68273 "2006-09-11T11:15:16Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![eduard](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/3da27b/32.png) [@eduard](https://www.ruby-forum.com/u/eduard)\
**Post date:** [September 11, 2006, 11:15am UTC](https://www.ruby-forum.com/t/globalize-tuning/68273/1 "2006-09-11T11:15:16Z")

</div>

Hi,  
I am using Globalize plug-in extensively and I made some “tuning” to it.

1. First I have added a method to search for strings that should be  
translated (not visiting every page from the site).
2. Then I added a new method to be able to pass an array of arguments to  
a string like: “%s likes %s and %s gave him %d bottles of %s”.t /John  
/milk /Doe /5 /beer This result into many strings added to the DB  
because .t method is called for each replacement.  
I added .t\_p method that works like:  
“%s likes %s and %s gave him %d bottles of %s”.t\_p(“John”, “milk”,  
“Doe”, 5, “beer”)
3. Then a simple class with one method to auto translates strings using  
bublefish powered by Systran.  
All are very simple codes, but I think that it might help on a starting  
project with globalize.

Codes:  
2. In core\_ext.rb add this:  
def translate\_p(arg = nil, default= nil)  
Locale.translate(self, default, arg)  
enD  
alias :t\_p :translate\_p  
Then in db\_view\_translator.rb change the fetch methid with this one:  
def fetch(key, language, default = nil, arg = nil) # :nodoc:  
# hack for “%d %d”.t / [1,2]  
if arg.kind\_of?(Array)

```
    real_default = default || key
    result = fetch_from_cache(key, language, real_default, 1)
    arg.each do |x|
      if x.kind_of?(Numeric)
        result.sub!('%d',x.to_s)
      else
        result.sub!('%s',x.to_s)
      end
    end
    return result
 # end of hack
  else

    # use argument as pluralization number, if number
    num = arg.kind_of?(Numeric) ? arg : nil

    # if there's no translation, use default or original key
    real_default = default || key

    result = fetch_from_cache(key, language, real_default, num)

    if num
      return result.sub('%d', num.to_s)
    else
      return arg.nil? ? result : result.sub('%s', arg.to_s)
    end

  end
end

```

1.add this to any controller and call it  
def get\_translateable\_strings  
Locale.clear\_cache  
Locale.translator.cache\_reset  
@strs = []  
#getting untraslated strings from views (.rhtml files)  
Dir.glob(“#{RAILS\_ROOT}/app/views/**/\*.rhtml").collect do |f|  
ll = File.read(f).scan(/"["].[t|t\_p]/)  
 @strs \<\< ll  
ll = File.read(f).scan(/'['].[t|t\_p]/)  
 @strs \<\< ll  
end  
 #getting untraslated strings from helpers  
Dir.glob("#{RAILS\_ROOT}/app/helpers/**/_.rb").collect do |f|  
ll = File.read(f).scan(/"["].[t|t\_p]/)  
 @strs \<\< ll  
ll = File.read(f).scan(/'['].[t|t\_p]/)  
 @strs \<\< ll  
end  
 #getting untraslated strings from controllers  
Dir.glob("#{RAILS\_ROOT}/app/controllers/\*\*/_.rb”).collect do |f|  
ll = File.read(f).scan(/"["].[t|t\_p]/)  
@strs \<\< ll  
ll = File.read(f).scan(/'['].[t|t\_p]/)  
@strs \<\< ll  
end  
#getting untraslated strings from environment.rb  
Dir.glob(“#{RAILS\_ROOT}/config/environment.rb”).collect do |f|  
ll = File.read(f).scan(/"["].[t|t\_p]/)  
@strs \<\< ll  
end  
@new\_strs=Array.new  
@new\_strs=@strs.flatten.uniq.sort  
LOCALES.values.each do |loc|  
Locale.set “#{loc}”  
@new\_strs.each do |str|  
str.to\_s.translate  
end  
#translate error messages  
ActiveRecord::Errors.default\_error\_messages.each\_value do  
|error\_msg|  
error\_msg.translate  
end  
end

1. 

require ‘net/http’  
require ‘uri’  
class Systran

TRANSLATOR\_ENGINE = “[Yahoo | Mail, Weather, Search, Politics, News, Finance, Sports & Videos](http://www.babelfish.altavista.com/tr)”  
#Available options for trans\_key:  
#zh\_en=\>Chinese-simp to English  
#zt\_en=\>Chinese-trad to English  
#en\_zh=\>English to Chinese-simp  
#en\_zt=\>English to Chinese-trad  
#en\_nl=\>English to Dutch  
#en\_fr=\>English to French  
#en\_de=\>English to German  
#en\_el=\>English to Greek  
#en\_it=\>English to Italian  
#en\_ja=\>English to Japanese  
#en\_ko=\>English to Korean  
#en\_pt=\>English to Portuguese  
#en\_ru=\>English to Russian  
#en\_es=\>English to Spanish  
#nl\_en=\>Dutch to English  
#nl\_fr=\>Dutch to French  
#fr\_nl=\>French to Dutch  
#fr\_en=\>French to English  
#fr\_de=\>French to German  
#fr\_el=\>French to Greek  
#fr\_it=\>French to Italian  
#fr\_pt=\>French to Portuguese  
#fr\_es=\>French to Spanish  
#de\_en=\>German to English  
#de\_fr=\>German to French  
#el\_en=\>Greek to English  
#el\_fr=\>Greek to French  
#it\_en=\>Italian to English  
#it\_fr=\>Italian to French  
#ja\_en=\>Japanese to English  
#ko\_en=\>Korean to English  
#pt\_en=\>Portuguese to English  
#pt\_fr=\>Portuguese to French  
#ru\_en=\>Russian to English  
#es\_en=\>Spanish to English  
#es\_fr=\>Spanish to French  
def self.translate\_string(string, trans\_key)  
url = URI.parse(TRANSLATOR\_ENGINE)  
http = Net::HTTP.post\_form(url,  
{“doit”=\>“done”,  
“intl”=\>“1”,  
“tt”=\>“urltext”,  
“trtext”=\>“#{string}”,  
“lp”=\>“#{trans\_key}”,  
“btnTrTxt”=\>“Translate”})  
begin  
doc = http.body.split(‘\<input type=’)  
rescue  
doc = http.body.split(‘

’)  
doc = doc[1].split(‘
’)  
end  
@translated\_text=doc[0].to\_s  
return @translated\_text  
end

end

---

<div class="post-metadata">

**Author:** ![eduard](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/3da27b/32.png) [@eduard](https://www.ruby-forum.com/u/eduard)\
**Post date:** [September 27, 2007, 2:34pm UTC](https://www.ruby-forum.com/t/globalize-tuning/68273/2 "2007-09-27T14:34:09Z")

</div>

I know you wrote this a long time ago, but I wanted to thank you. The  
Babelfish translator is exactly what I’ve been looking for and it  
still works like a charm.

Thank you,  
Anthony
