# Multiple versions of a site (different languages)

**URL:** <https://www.ruby-forum.com/t/multiple-versions-of-a-site-different-languages/156757>\
**Category:** Rails\
**Created:** [January 2, 2009, 3:24pm UTC](https://www.ruby-forum.com/t/multiple-versions-of-a-site-different-languages/156757 "2009-01-02T15:24:34Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![bingobob](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e480ec/32.png) [@bingobob](https://www.ruby-forum.com/u/bingobob)\
**Post date:** [January 2, 2009, 3:24pm UTC](https://www.ruby-forum.com/t/multiple-versions-of-a-site-different-languages/156757/1 "2009-01-02T15:24:34Z")

</div>

I’ve got a nice little site running which I rather like. All’s running  
tickety boo (the site is English language). It has a rudimentary CMS  
with it, basically I have a page model such that Page.name and Page.body  
exist. I simply allow the user to enter the page name and body and I  
throw the content onto various pages around the site. As I say works  
well.

Next feature - I’d like to do the site in French, German and Spanish as  
well.

So… my plan is this…

Just update the page model to include Page.name Page.body AND  
Page.bodyFrench, Page.bodyGerman, Page.bodySpanish.

I’d then update my admin views to show text areas for all the new  
languages and allow the user to update them all, that’d work fine I  
think.

How do I implement this though from a browser perspective?

I’d like to put a challenge on the front page of the asking for which  
language the user wants the site. Maybe flags int he time honoured sense  
or whatever.

Thing is though, How do I store this information so that my app knows  
which page to display for this user. I;ve heard of Sessions? but haven’t  
used them yet, is that how to do it, any tips or code fragment to get me  
started would be grately apprecaited. wer wer

cheers,

bb

---

<div class="post-metadata">

**Author:** ![bingobob](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e480ec/32.png) [@bingobob](https://www.ruby-forum.com/u/bingobob)\
**Post date:** [January 2, 2009, 8:37pm UTC](https://www.ruby-forum.com/t/multiple-versions-of-a-site-different-languages/156757/2 "2009-01-02T20:37:28Z")

</div>

On Fri, Jan 2, 2009 at 6:24 AM, bingo bob  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> So… my plan is this…
> 
> Just update the page model to include Page.name Page.body AND  
> Page.bodyFrench, Page.bodyGerman, Page.bodySpanish.

I think most people who’ve done something like this would agree that  
it’s preferable to add a ‘language’ or ‘locale’ field to the DB, and  
keep a  
single Page.body column.

> I’d like to put a challenge on the front page of the asking for which  
> language the user wants the site. Maybe flags int he time honoured sense  
> or whatever.

No, not flags – what flag would you use for English? Spanish?  
What language would you be referring to with the Swiss flag?

There isn’t remotely a mapping of languages ↔ countries. Use  
the language name directly.

> Thing is though, How do I store this information so that my app knows  
> which page to display for this user. I;ve heard of Sessions? but haven’t  
> used them yet, is that how to do it, any tips or code fragment to get me  
> started would be grately apprecaited. wer wer

Yes, you would want to store the user preference in the session. I’m  
sure a quick google on “rails session” will turn up lots of examples.

And of course reading the ActionController::SessionManagement  
doc is a good idea 🙂

## HTH,

Hassan S. ------------------------ removed\_email\_address@domain.invalid

---

<div class="post-metadata">

**Author:** ![bingobob](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e480ec/32.png) [@bingobob](https://www.ruby-forum.com/u/bingobob)\
**Post date:** [January 2, 2009, 9:43pm UTC](https://www.ruby-forum.com/t/multiple-versions-of-a-site-different-languages/156757/3 "2009-01-02T21:43:16Z")

</div>

If you’re going to have mulitple languages for a page then you’d best  
do a little bit of database normalisation otherwise you’ll end up with  
pageBodyFrench, pageBodyItalian, pageBodyGreek, pageBodySwahili etc

You have a model called Language

iso\_language\_code (see  
[List of ISO 639-1 codes - Wikipedia](http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes))  
language\_name

Then you have your Page  
page\_name\_etc

Then you have a many to many model PageLanguageBodyText

language\_id  
page\_id  
body\_text

Then

Class Language \<\< ActiveRecord::Base  
has\_many :page\_language\_body\_texts  
has\_and\_belongs\_to\_many :pages, :through=\>:page\_language\_body\_text  
end

Class Page \<\< ActiveRecord::Base  
has\_many :page\_language\_body\_texts  
has\_and\_belongs\_to\_many :languages, :through=\>:page\_language\_body\_text  
end

If the linking table had only the foreign keys required for joining  
the other two tables then there would be no need for a model, you’d  
just create the migration. But in this case you do have extra  
information so you have to have a model to access that information  
hence

Class PageLanguageBodyText \<\< ActiveRecord::Base  
belongs\_to :page  
belongs\_to :language  
end

You’d need to tidy up the names a bit.

You’d then have to modify your CMS to allow you to edit the page body  
text inside the form for your page, even though it’s now been split  
out to its own model.

Cheers

John S.

---

<div class="post-metadata">

**Author:** ![bingobob](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e480ec/32.png) [@bingobob](https://www.ruby-forum.com/u/bingobob)\
**Post date:** [January 2, 2009, 9:54pm UTC](https://www.ruby-forum.com/t/multiple-versions-of-a-site-different-languages/156757/4 "2009-01-02T21:54:25Z")

</div>

You might want to have a look at the data model we use in zena (http://  
[zenadmin.org/en/documentation/list333.html](http://zenadmin.org/en/documentation/list333.html)), the translated texts are  
stored in the “versions” table. The table also stores current  
publications along with redactions and old texts.

We do not store language preferences in a session but use a prefix on  
urls “/en/…” or “/fr/…” so that cached content is served correctly  
for each language choice.

Gaspard

---

<div class="post-metadata">

**Author:** ![bingobob](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e480ec/32.png) [@bingobob](https://www.ruby-forum.com/u/bingobob)\
**Post date:** [January 2, 2009, 10:57pm UTC](https://www.ruby-forum.com/t/multiple-versions-of-a-site-different-languages/156757/5 "2009-01-02T22:57:46Z")

</div>

On Fri, Jan 2, 2009 at 12:53 PM, Gaspard B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> We do not store language preferences in a session but use a prefix on  
> urls “/en/…” or “/fr/…” so that cached content is served correctly  
> for each language choice.

Was caching the only reason for taking that approach, or were there  
other considerations?

## Just curious 🙂

Hassan S. ------------------------ removed\_email\_address@domain.invalid

---

<div class="post-metadata">

**Author:** ![bingobob](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e480ec/32.png) [@bingobob](https://www.ruby-forum.com/u/bingobob)\
**Post date:** [January 29, 2009, 11:55pm UTC](https://www.ruby-forum.com/t/multiple-versions-of-a-site-different-languages/156757/6 "2009-01-29T23:55:51Z")

</div>

Hi Bingo Bob,

from a browsers perspective you’Re better off not showing a page where  
people pick the language… they made that decision a while ago when  
they bought their machine, OS and webbrowser.

what you want to do it use the HTTP Headers you can get which language  
the users perfer to have their content in… in case of doubt present  
a default version in the language you want to serve by default and let  
them change language easily (that’s called content negociation).

Here’s a link to the small language selector controller I use when I  
need that (it uses Gloc to determine if the sites accepts such  
language):  
[http://demo.m2i3.com/source/ror/locale\_selector\_controller.rb](http://demo.m2i3.com/source/ror/locale_selector_controller.rb)

then I make my routes to include the language at its soo and localize  
the who url (so different pages with different langauges are indexed  
properly).

Hope this helps

Jean-Marc

> **[M2i3 - Connecter les besoins aux solutions](https://m2i3.com/)**
>
> Nous sommes M2i3, des "socials-geeks" passionnés par le web, l'infonuagique et les logiciels. Nous vous présentons IncognitoDesk Après des an ...
