Patch for PITS 00032, 00033, 00034

darcs-hash:20080719003417-982e4-7004f8a4dfb447f941457c30b0b2289eee5582e6.gz
This commit is contained in:
matthew.gregg 2008-07-18 20:34:17 -04:00
parent faa3933fbb
commit 6dd211530f
6 changed files with 139 additions and 8 deletions

View File

@ -52,8 +52,6 @@ class ProfilesettingsAction extends SettingsAction {
common_input('location', _('Location'), common_input('location', _('Location'),
($this->arg('location')) ? $this->arg('location') : $profile->location, ($this->arg('location')) ? $this->arg('location') : $profile->location,
_('Where you are, like "City, State (or Region), Country"')); _('Where you are, like "City, State (or Region), Country"'));
common_checkbox('autosubscribe', _('Automatically subscribe to whoever subscribes to me (best for non-humans)'),
($this->arg('autosubscribe')) ? $this->boolean('autosubscribe') : $user->autosubscribe);
common_submit('submit', _('Save')); common_submit('submit', _('Save'));
common_element_end('form'); common_element_end('form');
common_show_footer(); common_show_footer();
@ -66,8 +64,7 @@ class ProfilesettingsAction extends SettingsAction {
$homepage = $this->trimmed('homepage'); $homepage = $this->trimmed('homepage');
$bio = $this->trimmed('bio'); $bio = $this->trimmed('bio');
$location = $this->trimmed('location'); $location = $this->trimmed('location');
$autosubscribe = $this->boolean('autosubscribe');
# Some validation # Some validation
if (!Validate::string($nickname, array('min_length' => 1, if (!Validate::string($nickname, array('min_length' => 1,
@ -94,6 +91,8 @@ class ProfilesettingsAction extends SettingsAction {
} else if ($this->nickname_exists($nickname)) { } else if ($this->nickname_exists($nickname)) {
$this->show_form(_('Nickname already in use. Try another one.')); $this->show_form(_('Nickname already in use. Try another one.'));
return; return;
} else if (!is_null($language) && strlen($language) > 50) {
$this->show_form(_('Language is too long (max 50 chars).'));
} }
$user = common_current_user(); $user = common_current_user();
@ -117,6 +116,23 @@ class ProfilesettingsAction extends SettingsAction {
return; return;
} }
} }
if ($user->language != $language) {
common_debug('Updating user language from ' . $user->language . ' to ' . $language,
__FILE__);
$original = clone($user);
$user->language = $language;
$result = $user->updateKeys($original);
if ($result === FALSE) {
common_log_db_error($user, 'UPDATE', __FILE__);
common_server_error(_('Couldn\'t update user.'));
return;
}
}
# XXX: XOR # XXX: XOR

View File

@ -79,7 +79,7 @@ class User extends DB_DataObject
function updateKeys(&$orig) { function updateKeys(&$orig) {
$parts = array(); $parts = array();
foreach (array('nickname', 'email', 'jabber', 'incomingemail', 'sms', 'carrier', 'smsemail') as $k) { foreach (array('nickname', 'email', 'jabber', 'sms', 'carrier') as $k) {
if (strcmp($this->$k, $orig->$k) != 0) { if (strcmp($this->$k, $orig->$k) != 0) {
$parts[] = $k . ' = ' . $this->_quote($this->$k); $parts[] = $k . ' = ' . $this->_quote($this->$k);
} }

View File

@ -47,7 +47,6 @@ create table user (
email varchar(255) unique key comment 'email address for password recovery etc.', email varchar(255) unique key comment 'email address for password recovery etc.',
incomingemail varchar(255) unique key comment 'email address for post-by-email', incomingemail varchar(255) unique key comment 'email address for post-by-email',
emailnotifysub tinyint default 1 comment 'Notify by email of subscriptions', emailnotifysub tinyint default 1 comment 'Notify by email of subscriptions',
emailpost tinyint default 1 comment 'Post by email',
jabber varchar(255) unique key comment 'jabber ID for notices', jabber varchar(255) unique key comment 'jabber ID for notices',
jabbernotify tinyint default 0 comment 'whether to send notices to jabber', jabbernotify tinyint default 0 comment 'whether to send notices to jabber',
jabberreplies tinyint default 0 comment 'whether to send notices to jabber on replies', jabberreplies tinyint default 0 comment 'whether to send notices to jabber on replies',

View File

@ -36,6 +36,8 @@ require_once('PEAR.php');
require_once('DB/DataObject.php'); require_once('DB/DataObject.php');
require_once('DB/DataObject/Cast.php'); # for dates require_once('DB/DataObject/Cast.php'); # for dates
require_once(INSTALLDIR.'/lib/language.php');
// default configuration, overwritten in config.php // default configuration, overwritten in config.php
$config = $config =
@ -46,6 +48,9 @@ $config =
'path' => '/', 'path' => '/',
'logfile' => NULL, 'logfile' => NULL,
'fancy' => false, 'fancy' => false,
'locale_path' => './locale',
'language' => 'en_US',
'languages' => get_all_languages(),
'email' => 'email' =>
array_key_exists('SERVER_ADMIN', $_SERVER) ? $_SERVER['SERVER_ADMIN'] : NULL, array_key_exists('SERVER_ADMIN', $_SERVER) ? $_SERVER['SERVER_ADMIN'] : NULL,
'broughtby' => NULL, 'broughtby' => NULL,

66
lib/language.php Normal file
View File

@ -0,0 +1,66 @@
<?php
/*
* Laconica - a distributed open-source microblogging tool
* Copyright (C) 2008, Controlez-Vous, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
if (!defined('LACONICA')) { exit(1); }
function client_prefered_language($httplang) {
$client_langs = array();
$all_languages = get_all_languages();
preg_match_all('"(((\S\S)-?(\S\S)?)(;q=([0-9.]+))?)\s*(,\s*|$)"',strtolower($httplang),$httplang);
for ($i = 0; $i < count($httplang); $i++) {
if(!empty($httplang[2][$i])) {
#if no q default to 1.0
$client_langs[$httplang[2][$i]] = ($httplang[6][$i]? (float) $httplang[6][$i] : 1.0);
}
if(!empty($httplang[3][$i]) && empty($client_langs[$httplang[3][$i]])) {
#if a catchall default 0.01 lower
$client_langs[$httplang[3][$i]] = ($httplang[6][$i]? (float) $httplang[6][$i]-0.01 : 0.99);
}
}
#sort in decending q
arsort($client_langs);
foreach ($client_langs as $lang => $q) {
if (isset($all_languages[$lang])) {
return($all_languages[$lang]['lang']);
}
}
return FALSE;
}
function get_nice_language_list() {
$nice_lang = array();
$all_languages = get_all_languages();
foreach ($all_languages as $lang) {
$nice_lang = $nice_lang + array($lang['lang'] => $lang['name']);
}
return $nice_lang;
}
function get_all_languages() {
$all_languages = array('en-us' => array('q' => 1, 'lang' => 'en_US', 'name' => 'English (US)', 'direction' => 'ltr'),
'en-nz' => array('q' => 1, 'lang' => 'en_NZ', 'name' => 'English (NZ)', 'direction' => 'ltr'),
'en' => array('q' => 1, 'lang' => 'en', 'name' => 'English', 'direction' => 'ltr'),
'fr-fr' => array('q' => 1, 'lang' => 'fr_FR', 'name' => 'French', 'direction' => 'ltr'),
);
return $all_languages;
}

View File

@ -137,6 +137,10 @@ function common_show_header($pagetitle, $callable=NULL, $data=NULL, $headercall=
global $config, $xw; global $config, $xw;
$httpaccept = isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : NULL; $httpaccept = isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : NULL;
$language = common_language();
setlocale(LC_ALL, $language);
bindtextdomain("laconica", $config['site']['locale_path']);
textdomain("laconica");
# XXX: allow content negotiation for RDF, RSS, or XRDS # XXX: allow content negotiation for RDF, RSS, or XRDS
@ -157,8 +161,8 @@ function common_show_header($pagetitle, $callable=NULL, $data=NULL, $headercall=
# FIXME: correct language for interface # FIXME: correct language for interface
common_element_start('html', array('xmlns' => 'http://www.w3.org/1999/xhtml', common_element_start('html', array('xmlns' => 'http://www.w3.org/1999/xhtml',
'xml:lang' => 'en', 'xml:lang' => $language,
'lang' => 'en')); 'lang' => $language));
common_element_start('head'); common_element_start('head');
common_element('title', NULL, common_element('title', NULL,
@ -363,6 +367,26 @@ function common_checkbox($id, $label, $checked=false, $instructions=NULL, $value
common_element_end('p'); common_element_end('p');
} }
function common_dropdown($id, $label, $content, $instructions=NULL, $blank_select=FALSE, $selected=NULL) {
common_element_start('p');
common_element('label', array('for' => $id), $label);
common_element_start('select', array('id' => $id, 'name' => $id));
if ($blank_select) {
common_element('option', array('value' => $value));
}
foreach ($content as $value => $option) {
if ($value == $selected) {
common_element('option', array('value' => $value, 'selected' => $value), $option);
} else {
common_element('option', array('value' => $value), $option);
}
}
common_element_end('select');
if ($instructions) {
common_element('span', 'input_instructions', $instructions);
}
common_element_end('p');
}
function common_hidden($id, $value) { function common_hidden($id, $value) {
common_element('input', array('name' => $id, common_element('input', array('name' => $id,
'type' => 'hidden', 'type' => 'hidden',
@ -409,6 +433,27 @@ function common_textarea($id, $label, $content=NULL, $instructions=NULL) {
common_element_end('p'); common_element_end('p');
} }
function common_language() {
$httplang = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : NULL;
$language = array();
$user_language = FALSE;
if (common_logged_in()) {
$user = common_current_user();
$user_language = $user->language;
}
if ($user_language) {
return $user_language;
} else if (!empty($httplang)) {
$language = client_prefered_language($httplang);
if ($language) {
return $language;
}
} else {
return $config['site']['language'];
}
}
# salted, hashed passwords are stored in the DB # salted, hashed passwords are stored in the DB
function common_munge_password($password, $id) { function common_munge_password($password, $id) {