diff --git a/PHPCI/Controller/UserController.php b/PHPCI/Controller/UserController.php index e4b4b350..7710c503 100644 --- a/PHPCI/Controller/UserController.php +++ b/PHPCI/Controller/UserController.php @@ -66,22 +66,34 @@ class UserController extends Controller { $user = $_SESSION['phpci_user']; - $this->layout->title = $user->getName(); - $this->layout->subtitle = Lang::get('edit_profile'); - if ($this->request->getMethod() == 'POST') { $name = $this->getParam('name', null); $email = $this->getParam('email', null); $password = $this->getParam('password', null); + $currentLang = Lang::getLanguage(); + $chosenLang = $this->getParam('language', $currentLang); + + if ($chosenLang !== $currentLang) { + setcookie('phpcilang', $chosenLang, time() + (10 * 365 * 24 * 60 * 60), '/'); + Lang::setLanguage($chosenLang); + } + $_SESSION['phpci_user'] = $this->userService->updateUser($user, $name, $email, $password); $user = $_SESSION['phpci_user']; $this->view->updated = 1; } + $this->layout->title = $user->getName(); + $this->layout->subtitle = Lang::get('edit_profile'); + $values = $user->getDataArray(); + if (array_key_exists('phpcilang', $_COOKIE)) { + $values['language'] = $_COOKIE['phpcilang']; + } + $form = new Form(); $form->setAction(PHPCI_URL.'user/profile'); $form->setMethod('POST'); @@ -107,6 +119,14 @@ class UserController extends Controller $password->setRequired(false); $form->addField($password); + $lang = new Form\Element\Select('language'); + $lang->setClass('form-control'); + $lang->setContainerClass('form-group'); + $lang->setLabel(Lang::get('language')); + $lang->setRequired(true); + $lang->setOptions(Lang::getLanguageOptions()); + $form->addField($lang); + $submit = new Form\Element\Submit(); $submit->setClass('btn btn-success'); $submit->setValue(Lang::get('save')); diff --git a/PHPCI/Helper/Lang.php b/PHPCI/Helper/Lang.php index c5093b05..d3b8f6fb 100644 --- a/PHPCI/Helper/Lang.php +++ b/PHPCI/Helper/Lang.php @@ -19,6 +19,7 @@ class Lang { protected static $language = null; protected static $strings = array(); + protected static $languages = array(); /** * Get a specific string from the language file. @@ -54,6 +55,31 @@ class Lang return self::$language; } + public static function setLanguage($language) + { + if (in_array($language, self::$languages)) { + self::$language = $language; + self::$strings = self::loadLanguage(); + return; + } + } + + /** + * Return a list of available languages and their names. + * @return array + */ + public static function getLanguageOptions() + { + $languages = array(); + + foreach (self::$languages as $language) { + require(PHPCI_DIR . 'PHPCI/Languages/lang.' . $language . '.php'); + $languages[$language] = $strings['language_name']; + } + + return $languages; + } + /** * Get the strings for the currently active language. * @return string[] @@ -69,6 +95,24 @@ class Lang */ public static function init(Config $config) { + $matches = array(); + foreach (glob(PHPCI_DIR . 'PHPCI/Languages/lang.*.php') as $file) { + if (preg_match('/lang\.([a-z]{2}\-?[a-z]*)\.php/', $file, $matches)) { + self::$languages[] = $matches[1]; + } + } + + // Try cookies first: + if (isset($_COOKIE) && array_key_exists('phpcilang', $_COOKIE)) { + $language = $_COOKIE['phpcilang']; + + if (in_array($language, self::$languages)) { + self::$language = $language; + self::$strings = self::loadLanguage(); + return; + } + } + // Try user language: if (isset($_SERVER) && array_key_exists('HTTP_ACCEPT_LANGUAGE', $_SERVER)) { $langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); @@ -76,27 +120,26 @@ class Lang foreach ($langs as $lang) { $parts = explode(';', $lang); - self::$language = strtolower($parts[0]); - self::$strings = self::loadLanguage(); + $language = strtolower($parts[0]); - if (!is_null(self::$strings)) { + if (in_array($language, self::$languages)) { + self::$language = $language; + self::$strings = self::loadLanguage(); return; } } } // Try the installation default language: - self::$language = $config->get('phpci.default_language', null); + $language = $config->get('phpci.default_language', null); - if (!is_null(self::$language)) { + if (in_array($language, self::$languages)) { + self::$language = $language; self::$strings = self::loadLanguage(); - - if (!is_null(self::$strings)) { - return; - } + return; } - // Fall back to en-GB: + // Fall back to English: self::$language = 'en'; self::$strings = self::loadLanguage(); } diff --git a/PHPCI/Languages/lang.en.php b/PHPCI/Languages/lang.en.php index 5a3b5eda..41526624 100644 --- a/PHPCI/Languages/lang.en.php +++ b/PHPCI/Languages/lang.en.php @@ -8,6 +8,9 @@ */ $strings = array( + 'language_name' => 'English', + 'language' => 'Language', + // Log in: 'log_in_to_phpci' => 'Log in to PHPCI', 'login_error' => 'Incorrect email address or password', diff --git a/PHPCI/Languages/lang.fr.php b/PHPCI/Languages/lang.fr.php index 063044c6..ab18224f 100644 --- a/PHPCI/Languages/lang.fr.php +++ b/PHPCI/Languages/lang.fr.php @@ -8,6 +8,9 @@ */ $strings = array( + 'language_name' => 'Français', + 'language' => 'Langue', + // Log in: 'log_in_to_phpci' => 'Connectez-vous à PHPCI', 'login_error' => 'Adresse email ou mot de passe invalide', diff --git a/PHPCI/Languages/lang.ru.php b/PHPCI/Languages/lang.ru.php index addb7e74..ca51aab0 100644 --- a/PHPCI/Languages/lang.ru.php +++ b/PHPCI/Languages/lang.ru.php @@ -8,6 +8,9 @@ */ $strings = array( + 'language_name' => 'Pусский', + 'language' => 'язык', + // Log in: 'log_in_to_phpci' => 'Войти в PHPCI', 'login_error' => 'Неправильный email или пароль',