PHP Language detector

Tutorials

In this tutorial I will show you how to detect and display the visitor`s preferable language in PHP. I think that language detection is one of important features of any serious multilanguage website. As minimum – you can set necessary language for website interface for your visitors. Our script will show you one of 180 possible languages (depends on your browser’s preferences. Ready? Lets start.

Live Demo

[sociallocker]

download in package

[/sociallocker]


Now – download the source files and lets start developing !


Step 1. PHP

In the first – I will put an array of all possible languages in this array (into separate file):

langs.php

001 <?php
002 // all the possible languages codes
003 $aLanguages array(
004     'aa' => 'Afar',
005     'ab' => 'Abkhaz',
006     'ae' => 'Avestan',
007     'af' => 'Afrikaans',
008     'ak' => 'Akan',
009     'am' => 'Amharic',
010     'an' => 'Aragonese',
011     'ar' => 'Arabic',
012     'as' => 'Assamese',
013     'av' => 'Avaric',
014     'ay' => 'Aymara',
015     'az' => 'Azerbaijani',
016     'ba' => 'Bashkir',
017     'be' => 'Belarusian',
018     'bg' => 'Bulgarian',
019     'bh' => 'Bihari',
020     'bi' => 'Bislama',
021     'bm' => 'Bambara',
022     'bn' => 'Bengali',
023     'bo' => 'Tibetan Standard, Tibetan, Central',
024     'br' => 'Breton',
025     'bs' => 'Bosnian',
026     'ca' => 'Catalan; Valencian',
027     'ce' => 'Chechen',
028     'ch' => 'Chamorro',
029     'co' => 'Corsican',
030     'cr' => 'Cree',
031     'cs' => 'Czech',
032     'cu' => 'Old Church Slavonic, Church Slavic, Church Slavonic, Old Bulgarian, Old Slavonic',
033     'cv' => 'Chuvash',
034     'cy' => 'Welsh',
035     'da' => 'Danish',
036     'de' => 'German',
037     'dv' => 'Divehi; Dhivehi; Maldivian;',
038     'dz' => 'Dzongkha',
039     'ee' => 'Ewe',
040     'el' => 'Greek, Modern',
041     'en' => 'English',
042     'eo' => 'Esperanto',
043     'es' => 'Spanish; Castilian',
044     'et' => 'Estonian',
045     'eu' => 'Basque',
046     'fa' => 'Persian',
047     'ff' => 'Fula; Fulah; Pulaar; Pular',
048     'fi' => 'Finnish',
049     'fj' => 'Fijian',
050     'fo' => 'Faroese',
051     'fr' => 'French',
052     'fy' => 'Western Frisian',
053     'ga' => 'Irish',
054     'gd' => 'Scottish Gaelic; Gaelic',
055     'gl' => 'Galician',
056     'gn' => 'GuaranA­',
057     'gu' => 'Gujarati',
058     'gv' => 'Manx',
059     'ha' => 'Hausa',
060     'he' => 'Hebrew (modern)',
061     'hi' => 'Hindi',
062     'ho' => 'Hiri Motu',
063     'hr' => 'Croatian',
064     'ht' => 'Haitian; Haitian Creole',
065     'hu' => 'Hungarian',
066     'hy' => 'Armenian',
067     'hz' => 'Herero',
068     'ia' => 'Interlingua',
069     'id' => 'Indonesian',
070     'ie' => 'Interlingue',
071     'ig' => 'Igbo',
072     'ii' => 'Nuosu',
073     'ik' => 'Inupiaq',
074     'io' => 'Ido',
075     'is' => 'Icelandic',
076     'it' => 'Italian',
077     'iu' => 'Inuktitut',
078     'ja' => 'Japanese (ja)',
079     'jv' => 'Javanese (jv)',
080     'ka' => 'Georgian',
081     'kg' => 'Kongo',
082     'ki' => 'Kikuyu, Gikuyu',
083     'kj' => 'Kwanyama, Kuanyama',
084     'kk' => 'Kazakh',
085     'kl' => 'Kalaallisut, Greenlandic',
086     'km' => 'Khmer',
087     'kn' => 'Kannada',
088     'ko' => 'Korean',
089     'kr' => 'Kanuri',
090     'ks' => 'Kashmiri',
091     'ku' => 'Kurdish',
092     'kv' => 'Komi',
093     'kw' => 'Cornish',
094     'ky' => 'Kirghiz, Kyrgyz',
095     'la' => 'Latin',
096     'lb' => 'Luxembourgish, Letzeburgesch',
097     'lg' => 'Luganda',
098     'li' => 'Limburgish, Limburgan, Limburger',
099     'ln' => 'Lingala',
100     'lo' => 'Lao',
101     'lt' => 'Lithuanian',
102     'lu' => 'Luba-Katanga',
103     'lv' => 'Latvian',
104     'mg' => 'Malagasy',
105     'mh' => 'Marshallese',
106     'mi' => 'Maori',
107     'mk' => 'Macedonian',
108     'ml' => 'Malayalam',
109     'mn' => 'Mongolian',
110     'mr' => 'Marathi',
111     'ms' => 'Malay',
112     'mt' => 'Maltese',
113     'my' => 'Burmese',
114     'na' => 'Nauru',
115     'nb' => 'Norwegian Bokmal',
116     'nd' => 'North Ndebele',
117     'ne' => 'Nepali',
118     'ng' => 'Ndonga',
119     'nl' => 'Dutch',
120     'nn' => 'Norwegian Nynorsk',
121     'no' => 'Norwegian',
122     'nr' => 'South Ndebele',
123     'nv' => 'Navajo, Navaho',
124     'ny' => 'Chichewa; Chewa; Nyanja',
125     'oc' => 'Occitan',
126     'oj' => 'Ojibwe, Ojibwa',
127     'om' => 'Oromo',
128     'or' => 'Oriya',
129     'os' => 'Ossetian, Ossetic',
130     'pa' => 'Panjabi, Punjabi',
131     'pi' => 'Pali',
132     'pl' => 'Polish',
133     'ps' => 'Pashto, Pushto',
134     'pt' => 'Portuguese',
135     'qu' => 'Quechua',
136     'rm' => 'Romansh',
137     'rn' => 'Kirundi',
138     'ro' => 'Romanian, Moldavian, Moldovan',
139     'ru' => 'Russian',
140     'rw' => 'Kinyarwanda',
141     'sa' => 'Sanskrit',
142     'sc' => 'Sardinian',
143     'sd' => 'Sindhi',
144     'se' => 'Northern Sami',
145     'sg' => 'Sango',
146     'si' => 'Sinhala, Sinhalese',
147     'sk' => 'Slovak',
148     'sl' => 'Slovene',
149     'sm' => 'Samoan',
150     'sn' => 'Shona',
151     'so' => 'Somali',
152     'sq' => 'Albanian',
153     'sr' => 'Serbian',
154     'ss' => 'Swati',
155     'st' => 'Southern Sotho',
156     'su' => 'Sundanese',
157     'sv' => 'Swedish',
158     'sw' => 'Swahili',
159     'ta' => 'Tamil',
160     'te' => 'Telugu',
161     'tg' => 'Tajik',
162     'th' => 'Thai',
163     'ti' => 'Tigrinya',
164     'tk' => 'Turkmen',
165     'tl' => 'Tagalog',
166     'tn' => 'Tswana',
167     'to' => 'Tonga (Tonga Islands)',
168     'tr' => 'Turkish',
169     'ts' => 'Tsonga',
170     'tt' => 'Tatar',
171     'tw' => 'Twi',
172     'ty' => 'Tahitian',
173     'ug' => 'Uighur, Uyghur',
174     'uk' => 'Ukrainian',
175     'ur' => 'Urdu',
176     'uz' => 'Uzbek',
177     've' => 'Venda',
178     'vi' => 'Vietnamese',
179     'vo' => 'Volapuk',
180     'wa' => 'Walloon',
181     'wo' => 'Wolof',
182     'xh' => 'Xhosa',
183     'yi' => 'Yiddish',
184     'yo' => 'Yoruba',
185     'za' => 'Zhuang, Chuang',
186     'zh' => 'Chinese',
187     'zu' => 'Zulu',
188 );
189 ?>

Now we are going to prepare our main function to determine languages:

index.php

01 // determine preferable language
02 function tryToFindLang($aLanguages$sWhere$sDefaultLang) {
03     // set current language as default language
04     $sLanguage $sDefaultLang;
05     // initial better quality
06     $fBetterQuality = 0;
07     // search for all matched params
08     preg_match_all(&quot;/([[:alpha:]]{1,8})(-([[:alpha:]|-]{1,8}))?(\s*;\s*q\s*=\s*(1\.0{0,3}|0\.\d{0,3}))?\s*(,|$)/i&quot;, $sWhere$aMatches, PREG_SET_ORDER);
09     foreach ($aMatches as $aMatch) {
10         // get language prefix
11         $sPrefix strtolower ($aMatch[1]);
12         // prepare temp language
13         $sTempLang = (empty($aMatch[3])) ? $sPrefix $sPrefix '-' strtolower ($aMatch[3]);
14         // get quality (if it exists)
15         $fQuality = (empty($aMatch[5])) ? 1.0 : floatval($aMatch[5]);
16         if ($sTempLang) {
17             // determinate best quality
18             if ($fQuality &gt; $fBetterQuality &amp;&amp; in_array($sTempLangarray_keys($aLanguages))) {
19                 // set current language as temp language and update quality value
20                 $sLanguage $sTempLang;
21                 $fBetterQuality $fQuality;
22             elseif (($fQuality*0.9) &gt; $fBetterQuality &amp;&amp; in_array($sPrefixarray_keys($aLanguages))) {
23                 // set current language as prefix value and update quality value
24                 $sLanguage $sPrefix;
25                 $fBetterQuality $fQuality * 0.9;
26             }
27         }
28     }
29     return $sLanguage;
30 }

Main idea – to parse global variable: $_SERVER[‘HTTP_ACCEPT_LANGUAGE’], as we know – this variable contains Accept-Language request header, which is similar to Accept, but restricts the set of natural languages that are preferred as a response to the request. If you would like to understand it in details – you can read it here. I left comments in my code in order to better understand it. Now, how can we use it? – Easily, look:

1 // obtain all the possible languages codes
2 require_once('langs.php');
3 $sLanguage = tryToFindLang($aLanguages$_SERVER['HTTP_ACCEPT_LANGUAGE'], 'en');

And now our $sLanguage variable contains our preferred language code.


Live Demo

Conclusion

And again, we have made another one interesting PHP tutorial. You are welcome to use it in your projects. Good luck in your work!

Rate article