Buenas de nuevo,
llevo puesto el gorro de stress-testing, y acabo de descubrir algo que
tal vez a los que utilizais gettext os interese (y mucho!)
Ahí lo que acabo de descubrir gracias a :
http://www.dcmanges.com/blog/rails-performance-tuning-workflow
← Recomendado!
El tema es, si utilizas gettext con un lenguaje base (pongamos el
castellano), para luego traducir al inglés, alemán, etc… peeeero el
castellano no lo traduces, ya que gettext devuelve el msgid si no
encuentra la traducción, tienes un problema de rendimiento en este
idioma (en nuestro caso, el castellano).
Mirando con el ruby-prof, descubrimos donde hace la traducción
gettext, fichero lib/gettext/textdomain.rb, método gettext(msgid):
def gettext(msgid)
return "" if msgid == "" or msgid.nil?
return nil unless @current_mo
if @current_mo[msgid] and (@current_mo[msgid].size > 0)
@current_mo[msgid]
elsif msgid.include?("\000")
ret = nil
msgid_single = msgid.split("\000")[0]
@current_mo.each{|key, val|
if key =~ /^#{Regexp.quote(msgid_single)}\000/
# Usually, this is not caused to make po-files from
rgettext.
warn %Q[Warning: n_(“#{msgid_single}”,
“#{msgid.split(”\000")[1]}“) and n_(”#{key.gsub(/\000/, ‘", "’)}“) are
duplicated.] if $DEBUG
ret = val
break
end
}
ret
else
ret = nil
@current_mo.each{|key, val|
if key =~ /^#{Regexp.quote(msgid)}\000/
ret = val.split(”\000")[0]
break
end
}
ret
end
end
A partir de aqui se puede ver que si la cadena no la tienes traducida,
antes de desistir, todavia intenta buscar mediante una Regexp SOBRE
CADA MSGID de tu fichero mo, usease, si no lo tienes traducido y
tienes 1000 strings en el fichero mo, ejecuta 1000 Regexps… (!!!)
Suponiendo que en un render tengas 20 cadenas a traducir, y no tengas
ninguna traducida en el Locale correspondiente, estás ejecutando 20k
regexp / request. (Ojo al dato).
Dicho esto, los datos que tengo para un request a una pantalla
sencillita (en mi maquina pero con el environment puesto como en
production):
Con los msgid sin traducir:
boo:servifutbol isaac(production)$ while true; do curl --silent --head
–cookie “_session_id=46477c533b06eec53417433d3f4f8198”
http://localhost:3000/
| grep X-Runtime; done
X-Runtime: 0.23724
X-Runtime: 0.23574
X-Runtime: 0.23657
X-Runtime: 0.23620
X-Runtime: 0.23442
X-Runtime: 0.23484
X-Runtime: 0.23886
X-Runtime: 0.23819
X-Runtime: 0.23686
X-Runtime: 0.23568
X-Runtime: 0.23789
^C
Con los msgid traducidos:
boo:servifutbol isaac(production)$ while true; do curl --silent --head
–cookie “_session_id=46477c533b06eec53417433d3f4f8198”
http://localhost:3000/
| grep X-Runtime; done
X-Runtime: 0.08194
X-Runtime: 0.08804
X-Runtime: 0.08787
X-Runtime: 0.07829
X-Runtime: 0.07797
X-Runtime: 0.07880
X-Runtime: 0.08050
X-Runtime: 0.07714
X-Runtime: 0.08163
X-Runtime: 0.08352
X-Runtime: 0.07565
X-Runtime: 0.07446
X-Runtime: 0.07760
X-Runtime: 0.07856
X-Runtime: 0.07682
X-Runtime: 0.08380
X-Runtime: 0.08333
X-Runtime: 0.08927
^C
Da que pensar…
Todo esto con gettext 1.92.0, si alguien quiere probarlo para
corroborar mi teoria… Y si os fiais de mí, pues ya sabeis, a
traducirlo todo en gettext, incluso el idoma “por defecto”.
Salutaciones,
Isaac Feliu