diff --git a/include/pgettext.php b/include/pgettext.php index 4f8db43d4..f72cbb08a 100644 --- a/include/pgettext.php +++ b/include/pgettext.php @@ -11,7 +11,7 @@ require_once("include/dba.php"); * * Get the language setting directly from system variables, bypassing get_config() * as database may not yet be configured. - * + * * If possible, we use the value from the browser. * */ @@ -21,22 +21,22 @@ if(! function_exists('get_browser_language')) { function get_browser_language() { if (x($_SERVER,'HTTP_ACCEPT_LANGUAGE')) { - // break up string into pieces (languages and q factors) - preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', + // break up string into pieces (languages and q factors) + preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse); - if (count($lang_parse[1])) { - // create a list like "en" => 0.8 - $langs = array_combine($lang_parse[1], $lang_parse[4]); - - // set default to 1 for any without q factor - foreach ($langs as $lang => $val) { - if ($val === '') $langs[$lang] = 1; - } + if (count($lang_parse[1])) { + // create a list like "en" => 0.8 + $langs = array_combine($lang_parse[1], $lang_parse[4]); - // sort list based on value - arsort($langs, SORT_NUMERIC); - } + // set default to 1 for any without q factor + foreach ($langs as $lang => $val) { + if ($val === '') $langs[$lang] = 1; + } + + // sort list based on value + arsort($langs, SORT_NUMERIC); + } } if(isset($langs) && count($langs)) { @@ -94,7 +94,7 @@ if(! function_exists('load_translation_table')) { * load string translation table for alternate language * * first plugin strings are loaded, then globals - * + * * @param string $lang language code to load */ function load_translation_table($lang) { @@ -111,7 +111,7 @@ function load_translation_table($lang) { } } } - + if(file_exists("view/$lang/strings.php")) { include("view/$lang/strings.php"); } @@ -145,7 +145,7 @@ function tt($singular, $plural, $count){ $k = $f($count); return is_array($t)?$t[$k]:$t; } - + if ($count!=1){ return $plural; } else { @@ -153,11 +153,34 @@ function tt($singular, $plural, $count){ } }} -// provide a fallback which will not collide with -// a function defined in any language file +// provide a fallback which will not collide with +// a function defined in any language file if(! function_exists('string_plural_select_default')) { function string_plural_select_default($n) { return ($n != 1); }} + +/** + * Return installed languages as associative array + * [ + * lang => lang, + * ... + * ] + */ +function get_avaiable_languages() { + $lang_choices = array(); + $langs = glob('view/*/strings.php'); /**/ + + if(is_array($langs) && count($langs)) { + if(! in_array('view/en/strings.php',$langs)) + $langs[] = 'view/en/'; + asort($langs); + foreach($langs as $l) { + $t = explode("/",$l); + $lang_choices[$t[1]] = $t[1]; + } + } + return $lang_choices; +} diff --git a/index.php b/index.php index 02316e1e9..9fe248e8e 100644 --- a/index.php +++ b/index.php @@ -102,13 +102,13 @@ session_start(); * Language was set earlier, but we can over-ride it in the session. * We have to do it here because the session was just now opened. */ - -if(array_key_exists('system_language',$_POST)) { - if(strlen($_POST['system_language'])) - $_SESSION['language'] = $_POST['system_language']; - else - unset($_SESSION['language']); +if (x($_SESSION,'authenticated') && !x($_SESSION,'language')) { + // we didn't loaded user data yet, but we need user language + $r = q("SELECT language FROM user WHERE uid=%d", intval($_SESSION['uid'])); + $_SESSION['language'] = $lang; + if (count($r)>0) $_SESSION['language'] = $r[0]['language']; } + if((x($_SESSION,'language')) && ($_SESSION['language'] !== $lang)) { $lang = $_SESSION['language']; load_translation_table($lang); diff --git a/mod/admin.php b/mod/admin.php index 0b38ae566..5a2ccf893 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -603,18 +603,7 @@ function admin_page_site_post(&$a){ function admin_page_site(&$a) { /* Installed langs */ - $lang_choices = array(); - $langs = glob('view/*/strings.php'); /**/ - - if(is_array($langs) && count($langs)) { - if(! in_array('view/en/strings.php',$langs)) - $langs[] = 'view/en/'; - asort($langs); - foreach($langs as $l) { - $t = explode("/",$l); - $lang_choices[$t[1]] = $t[1]; - } - } + $lang_choices = get_avaiable_languages(); if (strlen(get_config('system','directory_submit_url')) AND !strlen(get_config('system','directory'))) { diff --git a/mod/settings.php b/mod/settings.php index 6601858ee..77a575585 100644 --- a/mod/settings.php +++ b/mod/settings.php @@ -386,6 +386,8 @@ function settings_post(&$a) { $username = ((x($_POST,'username')) ? notags(trim($_POST['username'])) : ''); $email = ((x($_POST,'email')) ? notags(trim($_POST['email'])) : ''); $timezone = ((x($_POST,'timezone')) ? notags(trim($_POST['timezone'])) : ''); + $language = ((x($_POST,'language')) ? notags(trim($_POST['language'])) : ''); + $defloc = ((x($_POST,'defloc')) ? notags(trim($_POST['defloc'])) : ''); $openid = ((x($_POST,'openid_url')) ? notags(trim($_POST['openid_url'])) : ''); $maxreq = ((x($_POST,'maxreq')) ? intval($_POST['maxreq']) : 0); @@ -532,7 +534,15 @@ function settings_post(&$a) { } } - $r = q("UPDATE `user` SET `username` = '%s', `email` = '%s', `openid` = '%s', `timezone` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s', `notify-flags` = %d, `page-flags` = %d, `default-location` = '%s', `allow_location` = %d, `maxreq` = %d, `expire` = %d, `openidserver` = '%s', `def_gid` = %d, `blockwall` = %d, `hidewall` = %d, `blocktags` = %d, `unkmail` = %d, `cntunkmail` = %d WHERE `uid` = %d", + + $r = q("UPDATE `user` SET `username` = '%s', `email` = '%s', + `openid` = '%s', `timezone` = '%s', + `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s', + `notify-flags` = %d, `page-flags` = %d, `default-location` = '%s', + `allow_location` = %d, `maxreq` = %d, `expire` = %d, `openidserver` = '%s', + `def_gid` = %d, `blockwall` = %d, `hidewall` = %d, `blocktags` = %d, + `unkmail` = %d, `cntunkmail` = %d, `language` = '%s' + WHERE `uid` = %d", dbesc($username), dbesc($email), dbesc($openid), @@ -554,11 +564,15 @@ function settings_post(&$a) { intval($blocktags), intval($unkmail), intval($cntunkmail), + dbesc($language), intval(local_user()) ); if($r) info( t('Settings updated.') . EOL); + // clear session language + unset($_SESSION['language']); + $r = q("UPDATE `profile` SET `publish` = %d, `name` = '%s', @@ -985,6 +999,7 @@ function settings_content(&$a) { $email = $a->user['email']; $nickname = $a->user['nickname']; $timezone = $a->user['timezone']; + $language = $a->user['language']; $notify = $a->user['notify-flags']; $defloc = $a->user['default-location']; $openid = $a->user['openid']; @@ -1168,6 +1183,8 @@ function settings_content(&$a) { else $public_post_link = '&public=1'; + /* Installed langs */ + $lang_choices = get_avaiable_languages(); $o .= replace_macros($stpl, array( '$ptitle' => t('Account Settings'), @@ -1190,6 +1207,7 @@ function settings_content(&$a) { '$username' => array('username', t('Full Name:'), $username,''), '$email' => array('email', t('Email Address:'), $email, '', '', '', 'email'), '$timezone' => array('timezone_select' , t('Your Timezone:'), select_timezone($timezone), ''), + '$language' => array('language', t('Your Language:'), $language, t('Set the language we use to show you friendica interface and to send you emails'), $lang_choices), '$defloc' => array('defloc', t('Default Post Location:'), $defloc, ''), '$allowloc' => array('allow_location', t('Use Browser Location:'), ($a->user['allow_location'] == 1), ''), @@ -1245,7 +1263,7 @@ function settings_content(&$a) { '$notify8' => array('notify8', t('You are poked/prodded/etc. in a post'), ($notify & NOTIFY_POKE), NOTIFY_POKE, ''), '$desktop_notifications' => array('desktop_notifications', t('Activate desktop notifications') , false, t('Show desktop popup on new notifications')), - + '$email_textonly' => array('email_textonly', t('Text-only notification emails'), get_pconfig(local_user(),'system','email_textonly'), t('Send text only notification emails, without the html part')), diff --git a/view/templates/settings.tpl b/view/templates/settings.tpl index 26c44f91c..c38528457 100644 --- a/view/templates/settings.tpl +++ b/view/templates/settings.tpl @@ -27,6 +27,7 @@ {{include file="field_input.tpl" field=$email}} {{include file="field_password.tpl" field=$password4}} {{include file="field_custom.tpl" field=$timezone}} +{{include file="field_select.tpl" field=$language}} {{include file="field_input.tpl" field=$defloc}} {{include file="field_checkbox.tpl" field=$allowloc}} @@ -147,7 +148,7 @@ (function(){ var elm = $("#id_{{$desktop_notifications.0}}_onoff"); var ckbox = $("#id_{{$desktop_notifications.0}}"); - + if (getNotificationPermission() === 'granted') { ckbox.val(1); elm.find(".off").addClass("hidden"); @@ -156,18 +157,18 @@ if (getNotificationPermission() === null) { elm.parent(".field.yesno").hide(); } - + $("#id_{{$desktop_notifications.0}}_onoff").on("click", function(e){ - + if (Notification.permission === 'granted') { localStorage.setItem('notification-permissions', ckbox.val()==1 ? 'granted' : 'denied'); } else if (Notification.permission === 'denied') { localStorage.setItem('notification-permissions', 'denied'); - + ckbox.val(0); elm.find(".on").addClass("hidden"); elm.find(".off").removeClass("hidden"); - + } else if (Notification.permission === 'default') { Notification.requestPermission(function(choice) { if (choice === 'granted') { @@ -181,10 +182,10 @@ } }); } - + //console.log(getNotificationPermission()); - - + + }) })(); diff --git a/view/theme/decaf-mobile/templates/settings.tpl b/view/theme/decaf-mobile/templates/settings.tpl index 6196f80a3..94a8d5542 100644 --- a/view/theme/decaf-mobile/templates/settings.tpl +++ b/view/theme/decaf-mobile/templates/settings.tpl @@ -27,6 +27,7 @@ {{include file="field_input.tpl" field=$email}} {{include file="field_password.tpl" field=$password4}} {{include file="field_custom.tpl" field=$timezone}} +{{include file="field_select.tpl" field=$language}} {{include file="field_input.tpl" field=$defloc}} {{include file="field_checkbox.tpl" field=$allowloc}} diff --git a/view/theme/frost-mobile/templates/settings.tpl b/view/theme/frost-mobile/templates/settings.tpl index cd9e1d316..e3a636a84 100644 --- a/view/theme/frost-mobile/templates/settings.tpl +++ b/view/theme/frost-mobile/templates/settings.tpl @@ -27,6 +27,7 @@ {{include file="field_input.tpl" field=$email}} {{include file="field_password.tpl" field=$password4}} {{include file="field_custom.tpl" field=$timezone}} +{{include file="field_select.tpl" field=$language}} {{include file="field_input.tpl" field=$defloc}} {{include file="field_checkbox.tpl" field=$allowloc}}