Jump to content
webix

Auto switch language based on browser language

Recommended Posts

Hello Folks!

 

I looked here in the forums about a way to get auto-translate working on WHMCS and i only found a hook based on ip address.

For most of users, IP address is not accurate to get the correct language (example: switzerland has 3 languages: french, italian and german. A spanish living in UK). So, i focused on the browser language.

Many people use their computers on their foreign language (browser included) but it's not a rule to follow.

 

So, for those who want to get whmcs showed up with the correct language for the users, i developped the following hook based on another that i found on the whmcs blog for a very old version.

 

Just create the file includes/hooks/switch-language.php and place the following code inside of it:

 

<?php

$country_to_language = array(
'default' => 'english',
'AR' => 'arabic',
'AR-DZ' => 'arabic',
'AR-BH' => 'arabic',
'AR-EG' => 'arabic',
'AR-IQ' => 'arabic',
'AR-JO' => 'arabic',
'AR-KW' => 'arabic',
'AR-LB' => 'arabic',
'AR-LY' => 'arabic',
'AR-MA' => 'arabic',
'AR-OM' => 'arabic',
'AR-QA' => 'arabic',
'AR-SA' => 'arabic',
'AR-SY' => 'arabic',
'AR-TN' => 'arabic',
'AR-AE' => 'arabic',
'AR-YE' => 'arabic',
'AZ' => 'azerbaijani',
'CA' => 'catalan',
'ZH' => 'chinese',
'ZH-HK' => 'chinese',
'ZH-CN' => 'chinese',
'ZH-SG' => 'chinese',
'ZH-TW' => 'chinese',
'HR' => 'croatian',
'CS' => 'czech',
'DA' => 'danish',
'NL' => 'dutch',
'NL-BE' => 'dutch',
'EN' => 'english',
'EN-AU' => 'english',
'EN-BZ' => 'english',
'EN-CA' => 'english',
'EN-IE' => 'english',
'EN-JM' => 'english',
'EN-NZ' => 'english',
'EN-PH' => 'english',
'EN-ZA' => 'english',
'EN-TT' => 'english',
'EN-GB' => 'english',
'EN-US' => 'english',
'EN-ZW' => 'english',
'ET' => 'estonian',
'FA' => 'farsi',
'FR' => 'french',
'FR-BE' => 'french',
'FR-CA' => 'french',
'FR-FR' => 'french',
'FR-LU' => 'french',
'FR-MC' => 'french',
'FR-CH' => 'french',
'DE' => 'german',
'DE-AT' => 'german',
'DE-DE' => 'german',
'DE-LI' => 'german',
'DE-LU' => 'german',
'DE-CH' => 'german',
'HE' => 'hebrew',
'HU' => 'hungarian',
'IT' => 'italian',
'IT-CH' => 'italian',
'MK' => 'macedonian',
'NO' => 'norwegian',
'NB' => 'norwegian',
'NN' => 'norwegian',
'PT-BR' => 'portuguese-br',
'PT' => 'portuguese-pt',
'RO' => 'romanian',
'RO-MO' => 'romanian',
'RU' => 'russian',
'RU-MO' => 'russian',
'ES' => 'spanish',
'ES-AR' => 'spanish',
'ES-BO' => 'spanish',
'ES-CL' => 'spanish',
'ES-CO' => 'spanish',
'ES-CR' => 'spanish',
'ES-DO' => 'spanish',
'ES-EC' => 'spanish',
'ES-SV' => 'spanish',
'ES-GT' => 'spanish',
'ES-HN' => 'spanish',
'ES-MX' => 'spanish',
'ES-NI' => 'spanish',
'ES-PA' => 'spanish',
'ES-PY' => 'spanish',
'ES-PE' => 'spanish',
'ES-PR' => 'spanish',
'ES-ES' => 'spanish',
'ES-UY' => 'spanish',
'ES-VE' => 'spanish',
'SV' => 'swedish',
'SV-FI' => 'swedish',
'SV-SV' => 'swedish',
'TR' => 'turkish',
'UK' => 'ukranian',
// NOTE: You can add more below
);

if(strpos($_SERVER['REQUEST_URI'], $customadminpath) === false && !isset($_SESSION['switch-language'])
&& $_SESSION['uid'] == false) {
$_SESSION['switch-language'] = true; // prevent from redirecting back again in this session
// we will add more here....
}

$current_country = strtoupper(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2));

$language = $current_country != '' && isset($country_to_language[$current_country]) 
               ? $country_to_language[$current_country]
               : $country_to_language['default'];

if(!isset($_SESSION['Language']) || $_SESSION['Language'] != $language) {
       $location = '?language='.$language;     
       if($_SERVER['QUERY_STRING'] != '')
           $location .= '&'.$_SERVER['QUERY_STRING'];

       ob_clean();
       header('location: '.$location);
       die();
   }

 

Once done your whmcs will switch language automatically right away. The hook is loaded automatically.

This won't change the currency has it's a bit more invasive.

 

I hope this will help you.

  • Like 1

Share this post


Link to post
Share on other sites

Hi,

Would this work with the current version?

 

Regards.

Share this post


Link to post
Share on other sites

Hello there,

 

The code is working well in WHMCS 7 client area but there is a problem with the admin login. When I try to access to admin url, I get an error in the browser: Too many redirections....

 

This script add a infinite loop in the administrator url:

 

?language=spanish&language=spanish&language=spanish&language=spanish&amp;language=spanish&amp;amp;language=spanish

 

This is the old post blog:

 

https://blog.whmcs.com/?t=67990

 

Anybody has a script or hook that works ok?

Share this post


Link to post
Share on other sites
On 26/5/2017 at 11:06 PM, funmaking said:

The code is working well in WHMCS 7 client area but there is a problem with the admin login. When I try to access to admin url, I get an error in the browser: Too many redirections....

This script add a infinite loop in the administrator url:

?language=spanish&language=spanish&language=spanish&language=spanish&amp;language=spanish&amp;amp;language=spanish

 

I guess the issue is in this statement:

strpos($_SERVER['REQUEST_URI'], $customadminpath) === false

I think that checking $customadminpath is not a valid method, because:

  • it may be undefined (if you have not a custom admin directory...)
  • even if defined, it may be slightly different from REQUEST_URI

So, the question is: 

  • how to check if a code is running in client area or in admin area?

or even:

  • how to make a hook which works in client area only?

Share this post


Link to post
Share on other sites
9 hours ago, Remitur said:

how to make a hook which works in client area only?

use a ClientAreaPage hook ?

  • Like 1

Share this post


Link to post
Share on other sites

This version seems to be working fine (test it before using in production environment).
Only issue: user is not able to switch language himself. Even if he select another language from the menu, client area will stay on his browser's language.

<?php

add_hook('ClientAreaPage', 1, switch_language($vars));

function switch_language($vars) {
 
$country_to_language = array(
'default' => 'english',
'AR' => 'arabic',
'AR-DZ' => 'arabic',
'AR-BH' => 'arabic',
'AR-EG' => 'arabic',
'AR-IQ' => 'arabic',
'AR-JO' => 'arabic',
'AR-KW' => 'arabic',
'AR-LB' => 'arabic',
'AR-LY' => 'arabic',
'AR-MA' => 'arabic',
'AR-OM' => 'arabic',
'AR-QA' => 'arabic',
'AR-SA' => 'arabic',
'AR-SY' => 'arabic',
'AR-TN' => 'arabic',
'AR-AE' => 'arabic',
'AR-YE' => 'arabic',
'AZ' => 'azerbaijani',
'CA' => 'catalan',
'ZH' => 'chinese',
'ZH-HK' => 'chinese',
'ZH-CN' => 'chinese',
'ZH-SG' => 'chinese',
'ZH-TW' => 'chinese',
'HR' => 'croatian',
'CS' => 'czech',
'DA' => 'danish',
'NL' => 'dutch',
'NL-BE' => 'dutch',
'EN' => 'english',
'EN-AU' => 'english',
'EN-BZ' => 'english',
'EN-CA' => 'english',
'EN-IE' => 'english',
'EN-JM' => 'english',
'EN-NZ' => 'english',
'EN-PH' => 'english',
'EN-ZA' => 'english',
'EN-TT' => 'english',
'EN-GB' => 'english',
'EN-US' => 'english',
'EN-ZW' => 'english',
'ET' => 'estonian',
'FA' => 'farsi',
'FR' => 'french',
'FR-BE' => 'french',
'FR-CA' => 'french',
'FR-FR' => 'french',
'FR-LU' => 'french',
'FR-MC' => 'french',
'FR-CH' => 'french',
'DE' => 'german',
'DE-AT' => 'german',
'DE-DE' => 'german',
'DE-LI' => 'german',
'DE-LU' => 'german',
'DE-CH' => 'german',
'HE' => 'hebrew',
'HU' => 'hungarian',
'IT' => 'italian',
'IT-CH' => 'italian',
'MK' => 'macedonian',
'NO' => 'norwegian',
'NB' => 'norwegian',
'NN' => 'norwegian',
'PT-BR' => 'portuguese-br',
'PT' => 'portuguese-pt',
'RO' => 'romanian',
'RO-MO' => 'romanian',
'RU' => 'russian',
'RU-MO' => 'russian',
'ES' => 'spanish',
'ES-AR' => 'spanish',
'ES-BO' => 'spanish',
'ES-CL' => 'spanish',
'ES-CO' => 'spanish',
'ES-CR' => 'spanish',
'ES-DO' => 'spanish',
'ES-EC' => 'spanish',
'ES-SV' => 'spanish',
'ES-GT' => 'spanish',
'ES-HN' => 'spanish',
'ES-MX' => 'spanish',
'ES-NI' => 'spanish',
'ES-PA' => 'spanish',
'ES-PY' => 'spanish',
'ES-PE' => 'spanish',
'ES-PR' => 'spanish',
'ES-ES' => 'spanish',
'ES-UY' => 'spanish',
'ES-VE' => 'spanish',
'SV' => 'swedish',
'SV-FI' => 'swedish',
'SV-SV' => 'swedish',
'TR' => 'turkish',
'UK' => 'ukranian',
// NOTE: You can add more below
);

if(!isset($_SESSION['switch-language']) && $_SESSION['uid'] == false) 
    {
        $_SESSION['switch-language'] = true; // prevent from redirecting back again in this session
    }

$current_country = strtoupper(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2));

$language = $current_country != '' && isset($country_to_language[$current_country]) 
               ? $country_to_language[$current_country]
               : $country_to_language['default'];

if(!isset($_SESSION['Language']) || $_SESSION['Language'] != $language) {
       $location = '?language='.$language;     
       if($_SERVER['QUERY_STRING'] != '')
           $location .= '&'.$_SERVER['QUERY_STRING'];

       ob_clean();
       header('location: '.$location);
       die();
   }
	
}
 

?>

 

Share this post


Link to post
Share on other sites

perhaps a static variable so that the function is only called once? so after the language is set by the browser, you should then be able to change it via the language dropdown...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

By using this site, you agree to our Terms of Use & Guidelines