/    Sign up×
Community /Pin to ProfileBookmark

Multilingual site – Directory based language selection

Hi,

I’m building a multilingual site, and for the user to select the language I want to use the directory (or url-prefix) based approach (e.g., “/en/content.php” for english and “/nl/content.php” for the dutch page).

My [I]content.php[/I] page is the same php page in both cases, so I don’t want to have it duplicated, for example having one copy in the “/en” directory and the other in the “/nl” directory. The content itself is loaded using a dictionary file (or database).

So, for example, whenever a user clicks on “www.example.com/en/content.php” the php will identify the language by parsing the url, load the single content.php page and display the content in english (by using a dictionary, for example using gettext() or using Smarty configuration files).

I’ve searched everywhere for a way to do this, but to no avail (except for using queries, like “www.example.com/content.php?lang=en”, which I prefer not to for SEO reasons and readability of the URL.

Your help will be greatly appreciated!

to post a comment
PHP

3 Comments(s)

Copy linkTweet thisAlerts:
@irf2kApr 01.2011 — I'm not sure I understand your question. Is the content.php normally a static page in one language?

For example, do you have a set page in nl, and if you need to convert it to english you instead grab the content from the database?

If so, it might be best to just create two separate files.

But regarding using www.example.com/en/content.php or nl VS using www.example.com/content.php?lang=en:

In the second url, the one you don't like, there is only one file. In the first example, AFAIK there MUST be two folders, one (en) and one (nl) each having a different content.php file in it.

Based on that, the easiest thing would be to code each content.php page differently.

However, if I've completely misunderstood your problem, the way a php script knows its location:

$cur_host = $_SERVER['HTTP_HOST'];

$cur_uri = rtrim(dirname($_
SERVER['PHP_SELF']), '/');

You can play around with those to get the current location
Copy linkTweet thisAlerts:
@DerokorianApr 01.2011 — I don't know if you can do domain.com/en/content but you could definitely do it the other way domain.com/content/en , this is done with .htaccess -> http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html
Copy linkTweet thisAlerts:
@orinowauthorApr 05.2011 — Thank you very much Derokorian, it was a great tip. I actually managed to do domain.com/en/content.php using .htaccess. I found a good article that guided me through:

http://articles.sitepoint.com/article/apache-mod_rewrite-examples


I'll give the basics to the solution for future users, more information and possibilities can be found in the above link.

Let's say that that I have a page content.php in my website which I want to have in english and in french, and I would like to refer to the two versions of the page using the urls:

www.example.com/en/content.php

www.example.com/fr/content.php

I only want to hold one PHP document called content.php on my server and use some translation tool to determine the actual text in the page. You can use smarty, gettext() or many other tools.

I place the single copy of content.php in my base directory (www.example.com/content.php), and then I create in that base directory an ".htaccess" file with the following code:

RewriteEngine on

RewriteRule ^/?en/(.*)$ $1?lang=en

RewriteRule ^/?fr/(.*
)$ $1?lang=fr [L]

What this code will do is translate www.example.com/en/content.php to www.example.com/content.php?lang=en, and similarly for "fr". Thus in both cases, the single content.php file is called but with a $_GET['lang'] variable which I can use to display the proper language. The viewer of the page, on the other hand, just sees the original url called, which was www.example.com/en/content.php.

You can also have subdirectories and it still works with the single .htaccess file you've created in your base. For example, www.example.com/en/dir/content2.php will call the file www.example.com/dir/content2.php?lang=en without any further changes.

[I]Note - you must make sure that your server supports mod_rewrite. My server, for example, supports it but I had to add the following extra line to my .htaccess file:

RewriteBase /

You should find this information on your host's website.

[/I]


Cheers.
×

Success!

Help @orinow spread the word by sharing this article on Twitter...

Tweet This
Sign in
Forgot password?
Sign in with TwitchSign in with GithubCreate Account
about: ({
version: 0.1.9 BETA 5.25,
whats_new: community page,
up_next: more Davinci•003 tasks,
coming_soon: events calendar,
social: @webDeveloperHQ
});

legal: ({
terms: of use,
privacy: policy
});
changelog: (
version: 0.1.9,
notes: added community page

version: 0.1.8,
notes: added Davinci•003

version: 0.1.7,
notes: upvote answers to bounties

version: 0.1.6,
notes: article editor refresh
)...
recent_tips: (
tipper: @AriseFacilitySolutions09,
tipped: article
amount: 1000 SATS,

tipper: @Yussuf4331,
tipped: article
amount: 1000 SATS,

tipper: @darkwebsites540,
tipped: article
amount: 10 SATS,
)...