diff --git a/airtime_mvc/application/Bootstrap.php b/airtime_mvc/application/Bootstrap.php index d2f8f1f65..be772e009 100644 --- a/airtime_mvc/application/Bootstrap.php +++ b/airtime_mvc/application/Bootstrap.php @@ -7,6 +7,7 @@ Propel::init(__DIR__."/configs/airtime-conf-production.php"); require_once __DIR__."/configs/constants.php"; require_once 'Preference.php'; +require_once 'Locale.php'; require_once "DateHelper.php"; require_once "OsPath.php"; require_once "Database.php"; @@ -34,18 +35,7 @@ $front = Zend_Controller_Front::getInstance(); $front->registerPlugin(new RabbitMqPlugin()); //localization configuration -$codeset = 'UTF-8'; -$lang = Application_Model_Preference::GetLocale().'.'.$codeset; - -putenv("LC_ALL=$lang"); -putenv("LANG=$lang"); -$res = setlocale(LC_MESSAGES, $lang); - -$domain = 'airtime'; -bindtextdomain($domain, '/usr/share/airtime/locale'); -textdomain($domain); -bind_textdomain_codeset($domain, $codeset); - +Application_Model_Locale::configureLocalization(); /* The bootstrap class should only be used to initialize actions that return a view. Actions that return JSON will not use the bootstrap class! */ @@ -107,6 +97,7 @@ class Bootstrap extends Zend_Application_Bootstrap_Bootstrap $view->headScript()->appendFile($baseUrl.'/js/jplayer/jquery.jplayer.min.js?'.$CC_CONFIG['airtime_version'], 'text/javascript'); $view->headScript()->appendFile($baseUrl.'/js/sprintf/sprintf-0.7-beta1.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); $view->headScript()->appendFile($baseUrl.'/js/bootstrap/bootstrap.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); + $view->headScript()->appendFile($baseUrl.'/js/cookie/jquery.cookie.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); $view->headScript()->appendFile($baseUrl.'/js/i18n/jquery.i18n.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); $view->headScript()->appendFile($baseUrl.'/locale/general-translation-table?'.$CC_CONFIG['airtime_version'],'text/javascript'); $view->headScript()->appendFile($baseUrl.'/locale/datatables-translation-table?'.$CC_CONFIG['airtime_version'],'text/javascript'); diff --git a/airtime_mvc/application/controllers/LoginController.php b/airtime_mvc/application/controllers/LoginController.php index 76be05bf4..fe30097f4 100644 --- a/airtime_mvc/application/controllers/LoginController.php +++ b/airtime_mvc/application/controllers/LoginController.php @@ -5,7 +5,6 @@ class LoginController extends Zend_Controller_Action public function init() { - /* Initialize action controller here */ } public function indexAction() @@ -14,6 +13,7 @@ class LoginController extends Zend_Controller_Action $request = $this->getRequest(); + Application_Model_Locale::configureLocalization($request->getcookie('airtime_locale')); if (Zend_Auth::getInstance()->hasIdentity()) { @@ -43,6 +43,7 @@ class LoginController extends Zend_Controller_Action //get the username and password from the form $username = $form->getValue('username'); $password = $form->getValue('password'); + $locale = $form->getValue('locale'); if (Application_Model_Subjects::getLoginAttempts($username) >= 3 && $form->getElement('captcha') == NULL) { $form->addRecaptcha(); } else { @@ -67,6 +68,9 @@ class LoginController extends Zend_Controller_Action $tempSess = new Zend_Session_Namespace("referrer"); $tempSess->referrer = 'login'; + + //set the user locale in case user changed it in when logging in + Application_Model_Preference::SetUserLocale($auth->getIdentity()->id, $locale); $this->_redirect('Showbuilder'); } else { diff --git a/airtime_mvc/application/controllers/UserController.php b/airtime_mvc/application/controllers/UserController.php index cc0dff0bb..e959a5758 100644 --- a/airtime_mvc/application/controllers/UserController.php +++ b/airtime_mvc/application/controllers/UserController.php @@ -162,7 +162,7 @@ class UserController extends Zend_Controller_Action $this->view->successMessage = "
"._("User updated successfully!")."
"; } $this->view->form = $form; - die(json_encode(array("html"=>$this->view->render('user/edit-user.phtml')))); + die(json_encode(array("locale"=>$formData['cu_locale'], "html"=>$this->view->render('user/edit-user.phtml')))); } $this->view->form = $form; $this->view->html = $this->view->render('user/edit-user.phtml'); diff --git a/airtime_mvc/application/forms/Login.php b/airtime_mvc/application/forms/Login.php index bd1deb806..2d7795235 100644 --- a/airtime_mvc/application/forms/Login.php +++ b/airtime_mvc/application/forms/Login.php @@ -43,6 +43,12 @@ class Application_Form_Login extends Zend_Form 'ViewHelper' ) )); + + $locale = new Zend_Form_Element_Select("locale"); + $locale->setLabel(_("Language:")); + $locale->setMultiOptions(Application_Model_Locale::getLocales()); + $locale->setDecorators(array('ViewHelper')); + $this->addElement($locale); $recaptchaNeeded = false; if (Application_Model_LoginAttempts::getAttempts($_SERVER['REMOTE_ADDR']) >= 3) { diff --git a/airtime_mvc/application/models/Locale.php b/airtime_mvc/application/models/Locale.php index e1568e3fe..43cde2568 100644 --- a/airtime_mvc/application/models/Locale.php +++ b/airtime_mvc/application/models/Locale.php @@ -14,4 +14,22 @@ class Application_Model_Locale return $out; } -} + + public static function configureLocalization($locale = null) + { + $codeset = 'UTF-8'; + if (is_null($locale)) { + $lang = Application_Model_Preference::GetLocale().'.'.$codeset; + } else { + $lang = $locale.'.'.$codeset; + } + putenv("LC_ALL=$lang"); + putenv("LANG=$lang"); + $res = setlocale(LC_MESSAGES, $lang); + + $domain = 'airtime'; + bindtextdomain($domain, '/usr/share/airtime/locale'); + textdomain($domain); + bind_textdomain_codeset($domain, $codeset); + } +} \ No newline at end of file diff --git a/airtime_mvc/application/views/scripts/form/login.phtml b/airtime_mvc/application/views/scripts/form/login.phtml index ab8431f0d..e2bd0c16c 100644 --- a/airtime_mvc/application/views/scripts/form/login.phtml +++ b/airtime_mvc/application/views/scripts/form/login.phtml @@ -19,6 +19,15 @@ element->getElement('password') ?> +
+ +
+
+ element->getElement('locale') ?> +
+
diff --git a/airtime_mvc/public/css/styles.css b/airtime_mvc/public/css/styles.css index b6f6b501d..947ec716c 100644 --- a/airtime_mvc/public/css/styles.css +++ b/airtime_mvc/public/css/styles.css @@ -1002,6 +1002,9 @@ dt.block-display, dd.block-display { font-size:14px; padding: 6px 0 6px 3px; } +.login-content dd select { + width: 100%; +} .login-content dd input.ui-button, .login-content dd input.btn { width:100%; font-size:14px; diff --git a/airtime_mvc/public/js/airtime/dashboard/dashboard.js b/airtime_mvc/public/js/airtime/dashboard/dashboard.js index 8a517e8e3..c213c945d 100644 --- a/airtime_mvc/public/js/airtime/dashboard/dashboard.js +++ b/airtime_mvc/public/js/airtime/dashboard/dashboard.js @@ -466,6 +466,7 @@ $(document).ready(function() { $.post(baseUrl+'/user/edit-user', {format: 'json', data: data}, function(data) { var json = $.parseJSON(data); $('.edit-current-user').parent().empty().append(json.html); + $.cookie("airtime_locale", json.locale, {path: '/'}); setCurrentUserPseudoPassword(); setTimeout(removeSuccessMsg, 5000); }); diff --git a/airtime_mvc/public/js/airtime/login/login.js b/airtime_mvc/public/js/airtime/login/login.js index b0a2ebd64..dc9a722e1 100644 --- a/airtime_mvc/public/js/airtime/login/login.js +++ b/airtime_mvc/public/js/airtime/login/login.js @@ -1,3 +1,4 @@ $(window).load(function(){ $("#username").focus(); -}) \ No newline at end of file + $("#locale").val($.cookie("airtime_locale")); +});