I think it should be dealt with like this:
- If there is setting in the user account, select this language; otherwise,
- If there is a cookie stored, select this language; otherwise,
- If it is possible to determine the system/browser language, select it; otherwise
- If it is possible to assign the IP address to an area, select this language, but ask for user confirmation and store the cookie.
Plus: Always allow the user to select another language, with some languages displayed on top.
First of all, language preference is something that is strictly related to the user. It is the user who does or does not speak the particular language.
Having this in mind, multilingual systems should determine the language based on the settings stored in user the account in the first place.
Secondly, the user should stay with the same language in which he used the site previously, so that it does not change all the time when travelling abroad. Thus, a cookie should be the second level of language selection.
Should it not be possible to use the above (no user accounts, no previously stored cookies, etc.), the language still needs to be automatically determined somehow. Most probably, the language of the system/browser of the user is the one he/she understands. Hence, this should be the third one.
And finally, if there is no possibility to check the language of the system, the IP address can be used. Most users who access a site from an area speak the language commonly used in this area.
But there should still be access to select other languages, and I think that some should be preferred, and thus displayed at the top of the list — especially English, Spanish, Chinese, Japanese, and the one determined by system and IP address.
Regarding language selector, there is a nice redesigned version of country selector, described at Smashing Magazine. It’s quite old now, but I like it as it allows the designer to save space. However, it is harder to manifest it is a language selector, as users got used to lists, methinks. At the same time, maybe there should be just a list of some of the most common languages, and then this little treasure.
Here is a nice article about selecting language with some alternatives to the list. I think the map is a nice option as well, although there are countries with more than one language, aren’t there? In these cases I think the user should choose it from a shortlist for these countries.