views:

312

answers:

8

I have developed a website www.tenxian.com.

It has three language versions, English, Japanese and Chinese. How can I write an effective PHP program which can automatically choose a language version based on the IP address of the visitor?

If I use "if-else", the code would be much complicated; If I use switch-case, how to write it since the data which should be dealt with are IP ranges, not particular numbers. Besides, I don't know these IP ranges

What is the easiest way to do it?

+1  A: 

Check out GeoPlugin:

http://www.geoplugin.com/webservices/php

Xorlev
A: 

Perhaps this will help: www.countryipblocks.net

ghoppe
A: 

take a look at the maxmind geoip module for PHP (http://www.maxmind.com/app/php), as for your data structure perhaps key it to the ISO-3166-1 country code which apache_note("GEOIP_COUNTRY_CODE"); returns.

david bowies labyrinth crotch
A country code is not enough: countries like Belgium and Switzerland have more than one official language.
bart
A: 

You'd probably want to use some form of IP geocoding database (example).

Amber
A: 

Assuming you can convert IP ranges to one of your language choices, you could do this (all replies above): have all your messages in the applications stored in an associative array of this form.

$MESSAGES[$USER_LANGUAGE][$msgId]

where $USER_LANGUAGE can be chinese, japanese, or english (or any other equivalent enum). $msgId can be things like "login.successful", "login.fail" etc. Where ever you display messages to the user do not display hardcoded strings, make a reference to the variable using the $msgId.

You can access it as a global variable OR you can create a function that takes in the $msgId as a parameter and returns the message, $USER_LANGUAGE can be a global variable as well (which is set the first time the user comes in).

aip.cd.aish
+7  A: 

Please, PLEASE, do not make the mistake of thinking that IP == language. Look at the browsers accept-language header first, then the browser identification string which might contain the OS language, and only then take the IP into account. In almost 100% of all cases the browser accept-language header will be present and sufficient.

And always give the user the choice to switch to another language.

Just apart from the simple case of a foreigner abroad, how do you determine the language for Belgium, where they speak French, Dutch and German? (Maybe that doesn't apply to your case, but just philosophically. :)).

deceze
+1 for always give the user the choice to switch to another language... this is a best way.. :)
Ramesh Vel
Same in Switzerland (German, French, Italian)
Benjol
+2  A: 

Yes please don't do it... Google does this and dreaking annoying.. I always get the thai version instead the english one from my browser.

Use the http headers from the browser.

Chris
Google is horrible in this regard. Even if you managed to switch the interface to a different language, it will revert back to your IPs locale when clicking through to a different service (like Google homepage -> Maps).
deceze
A: 
<?php
$ln = split(",",$_SERVER["HTTP_ACCEPT_LANGUAGE"]);
print_r($ln[0]);
?>
Amad