Well, it's a longer topic.
Globalize1 kept all the translations in one table and therefore used
polymorphic associations (and, I don't remember exactly, but possibly
every single translated field had its own row). Which of course was
slow as hell after the number of translated stuff grew considerably.
Additionally the problem of N+1 queries (for each product on page
there was a query for getting its translated fields, each one slow
already by itself) was hard to circumvent due to mixed philosophy of
catch-all (single polymorphic table) and atomicity (each field in
separate row).
There were of course attempts to hack it:
http://www.artweb-design.de/2007/1/31/upcoming-globalize-feature-an-alternative-way-of-storing-model-translations
And this is basically the reason behind "Globalize is slow" meme.
Globalize2 (and, by extension, Globalize3 which is basically "2" but
rewritten for Rails3 compatibility allowing for cleaner code and API)
used a different approach though: every translated model had it's own
"something_translations" table, consisting of columns with translated
values (and, of course, locale for which it's used).
Which is not a very surprising design decision, provided both were
developed mostly by Sven Fuchs -- author of the blog post linked
above.
Now, theoretically the problem of N+1 queries is still here (every
single product needs a single row from product_translations), but it's
hell of a lot easier to prevent it now:
class Product
translates :name, :description
named_scope :with_translations, :include => :translations
# or even, for maximum comfort
default_scope :include => :translations
end
I've been using Globalize2 for some time now in my store --
http://bitspudlo.com
-- and using the above solution doesn't impair performance at all, the
app is super-fast.
The only question that remains is should
default_scope :include => :translations
go to globalize_spree extension into relevant class decorators?
Tomash