diff --git a/scripts/git-post-update b/scripts/git-post-update index 08c7866..b407b1d 100755 --- a/scripts/git-post-update +++ b/scripts/git-post-update @@ -17,8 +17,11 @@ # git$ ln -s /home/www/indefero/scripts/git-post-update post-update # -SCRIPTDIR=$(dirname $(readlink -f $0)) -FULL_GIT_DIR=$(readlink -f $GIT_DIR) +dir=$(dirname "$0") +res=$(cd "$dir" && /bin/pwd || "$dir") +SCRIPTDIR="$res/$(readlink $0)" +FULL_GIT_DIR=$(cd "$GIT_DIR" && /bin/pwd || "$GIT_DIR") + PHP_POST_UPDATE=$SCRIPTDIR/gitpostupdate.php echo php $PHP_POST_UPDATE $FULL_GIT_DIR | at now > /dev/null 2>&1 diff --git a/scripts/svn-post-commit b/scripts/svn-post-commit index 54c85a3..ae2ce01 100755 --- a/scripts/svn-post-commit +++ b/scripts/svn-post-commit @@ -18,7 +18,9 @@ # www$ ln -s /home/www/indefero/scripts/svn-post-commit post-commit # -SCRIPTDIR=$(dirname $(readlink -f $0)) +dir=$(dirname "$0") +res=$(cd "$dir" && /bin/pwd || "$dir") +SCRIPTDIR="$res/$(readlink $0)" PHP_POST_COMMIT=$SCRIPTDIR/svnpostcommit.php echo php $PHP_POST_COMMIT "$1" "$2" | at now > /dev/null 2>&1 diff --git a/scripts/svn-post-revprop-change b/scripts/svn-post-revprop-change index 5949556..0fc63b8 100755 --- a/scripts/svn-post-revprop-change +++ b/scripts/svn-post-revprop-change @@ -18,7 +18,9 @@ # www$ ln -s /home/www/indefero/scripts/svn-post-revprop-change post-revprop-change # -SCRIPTDIR=$(dirname $(readlink -f $0)) +dir=$(dirname "$0") +res=$(cd "$dir" && /bin/pwd || "$dir") +SCRIPTDIR="$res/$(readlink $0)" PHP_POST_REVPROP=$SCRIPTDIR/svnpostrevpropchange.php echo php $PHP_POST_REVPROP "$1" "$2" "$3" "$4" "$5" | at now > /dev/null 2>&1 diff --git a/src/IDF/Commit.php b/src/IDF/Commit.php index 0a8690c..70414aa 100644 --- a/src/IDF/Commit.php +++ b/src/IDF/Commit.php @@ -44,9 +44,9 @@ class IDF_Commit extends Pluf_Model 'id' => array( 'type' => 'Pluf_DB_Field_Sequence', - 'blank' => true, + 'blank' => true, ), - 'project' => + 'project' => array( 'type' => 'Pluf_DB_Field_Foreignkey', 'model' => 'IDF_Project', @@ -54,7 +54,7 @@ class IDF_Commit extends Pluf_Model 'verbose' => __('project'), 'relate_name' => 'commits', ), - 'author' => + 'author' => array( 'type' => 'Pluf_DB_Field_Foreignkey', 'model' => 'Pluf_User', @@ -118,7 +118,7 @@ class IDF_Commit extends Pluf_Model { IDF_Search::index($this); if ($create) { - IDF_Timeline::insert($this, $this->get_project(), + IDF_Timeline::insert($this, $this->get_project(), $this->get_author(), $this->creation_dtime); } } @@ -200,13 +200,13 @@ class IDF_Commit extends Pluf_Model * Returns the timeline fragment for the commit. * * - * @param Pluf_HTTP_Request + * @param Pluf_HTTP_Request * @return Pluf_Template_SafeString */ public function timelineFragment($request) { - $url = Pluf_HTTP_URL_urlForView('IDF_Views_Source::commit', - array($request->project->shortname, + $url = Pluf_HTTP_URL_urlForView('IDF_Views_Source::commit', + array($request->project->shortname, $this->scm_id)); $out = ''. Pluf_esc(Pluf_Template_dateAgo($this->creation_dtime, 'without')). @@ -222,24 +222,24 @@ class IDF_Commit extends Pluf_Model -
'.sprintf(__('Commit %s, by %s'), ''.$this->scm_id.'', $user).'
'; +
'.sprintf(__('Commit %s, by %s'), ''.$this->scm_id.'', $user).'
'; return Pluf_Template::markSafe($out); } /** * Returns the feed fragment for the commit. * - * @param Pluf_HTTP_Request + * @param Pluf_HTTP_Request * @return Pluf_Template_SafeString */ public function feedFragment($request) { $url = Pluf::f('url_base') - .Pluf_HTTP_URL_urlForView('IDF_Views_Source::commit', - array($request->project->shortname, + .Pluf_HTTP_URL_urlForView('IDF_Views_Source::commit', + array($request->project->shortname, $this->scm_id)); $date = Pluf_Date::gmDateToGmString($this->creation_dtime); - $author = ($this->get_author()) ? + $author = ($this->get_author()) ? $this->get_author() : $this->origauthor; $cproject = $this->get_project(); $context = new Pluf_Template_Context_Request( @@ -298,7 +298,7 @@ class IDF_Commit extends Pluf_Model $current_locale = Pluf_Translation::getLocale(); $langs = Pluf::f('languages', array('en')); - Pluf_Translation::loadSetLocale($langs[0]); + Pluf_Translation::loadSetLocale($langs[0]); $context = new Pluf_Template_Context( array( @@ -309,13 +309,16 @@ class IDF_Commit extends Pluf_Model ); $tmpl = new Pluf_Template('idf/source/commit-created-email.txt'); $text_email = $tmpl->render($context); - $email = new Pluf_Mail(Pluf::f('from_email'), - $conf->getVal('source_notification_email'), - sprintf(__('New Commit %s - %s (%s)'), - $this->scm_id, $this->summary, - $this->get_project()->shortname)); - $email->addTextMessage($text_email); - $email->sendMail(); + $addresses = explode(',', $conf->getVal('source_notification_email')); + foreach ($addresses as $address) { + $email = new Pluf_Mail(Pluf::f('from_email'), + $address, + sprintf(__('New Commit %s - %s (%s)'), + $this->scm_id, $this->summary, + $this->get_project()->shortname)); + $email->addTextMessage($text_email); + $email->sendMail(); + } Pluf_Translation::loadSetLocale($current_locale); } } diff --git a/src/IDF/Diff.php b/src/IDF/Diff.php index d6abe56..f097183 100644 --- a/src/IDF/Diff.php +++ b/src/IDF/Diff.php @@ -169,8 +169,8 @@ class IDF_Diff $out = ''; foreach ($this->files as $filename=>$file) { $pretty = ''; - $fileinfo = IDF_Views_Source::getMimeType($filename); - if (IDF_Views_Source::isSupportedExtension($fileinfo[2])) { + $fileinfo = IDF_FileUtil::getMimeType($filename); + if (IDF_FileUtil::isSupportedExtension($fileinfo[2])) { $pretty = ' prettyprint'; } $out .= "\n".''."\n"; @@ -350,9 +350,9 @@ class IDF_Diff public function renderCompared($chunks, $filename) { - $fileinfo = IDF_Views_Source::getMimeType($filename); + $fileinfo = IDF_FileUtil::getMimeType($filename); $pretty = ''; - if (IDF_Views_Source::isSupportedExtension($fileinfo[2])) { + if (IDF_FileUtil::isSupportedExtension($fileinfo[2])) { $pretty = ' prettyprint'; } $out = ''; diff --git a/src/IDF/FileUtil.php b/src/IDF/FileUtil.php new file mode 100644 index 0000000..725d980 --- /dev/null +++ b/src/IDF/FileUtil.php @@ -0,0 +1,165 @@ +' + .''; + $i++; + } + return Pluf_Template::markSafe(implode("\n", $table)); + } + + /** + * Find the mime type of a file. + * + * Use /etc/mime.types to find the type. + * + * @param string Filename/Filepath + * @param array Mime type found or 'application/octet-stream', basename, extension + */ + public static function getMimeType($file) + { + static $mimes = null; + if ($mimes == null) { + $mimes = array(); + $src = Pluf::f('idf_mimetypes_db', '/etc/mime.types'); + $filecontent = @file_get_contents($src); + if ($filecontent !== false) { + $mimes = preg_split("/\015\012|\015|\012/", $filecontent); + } + } + + $info = pathinfo($file); + if (isset($info['extension'])) { + foreach ($mimes as $mime) { + if ('#' != substr($mime, 0, 1)) { + $elts = preg_split('/ |\t/', $mime, -1, PREG_SPLIT_NO_EMPTY); + if (in_array($info['extension'], $elts)) { + return array($elts[0], $info['basename'], $info['extension']); + } + } + } + } else { + // we consider that if no extension and base name is all + // uppercase, then we have a text file. + if ($info['basename'] == strtoupper($info['basename'])) { + return array('text/plain', $info['basename'], 'txt'); + } + $info['extension'] = 'bin'; + } + return array('application/octet-stream', $info['basename'], $info['extension']); + } + + /** + * Find the mime type of a file using the fileinfo class. + * + * @param string Filename/Filepath + * @param string File content + * @return array Mime type found or 'application/octet-stream', basename, extension + */ + public static function getMimeTypeFromContent($file, $filedata) + { + $info = pathinfo($file); + $res = array('application/octet-stream', + $info['basename'], + isset($info['extension']) ? $info['extension'] : 'bin'); + if (function_exists('finfo_open')) { + $finfo = finfo_open(FILEINFO_MIME); + $mime = finfo_buffer($finfo, $filedata); + finfo_close($finfo); + if ($mime) { + $res[0] = $mime; + } + if (!isset($info['extension']) && $mime) { + $res[2] = (0 === strpos($mime, 'text/')) ? 'txt' : 'bin'; + } elseif (!isset($info['extension'])) { + $res[2] = 'bin'; + } + } + return $res; + } + + /** + * Find if a given mime type is a text file. + * This uses the output of the self::getMimeType function. + * + * @param array (Mime type, file name, extension) + * @return bool Is text + */ + public static function isText($fileinfo) + { + if (0 === strpos($fileinfo[0], 'text/')) { + return true; + } + $ext = 'mdtext php-dist h gitignore diff patch'; + $extra_ext = trim(Pluf::f('idf_extra_text_ext', '')); + if (!empty($extra_ext)) + $ext .= ' ' . $extra_ext; + $ext = array_merge(self::$supportedExtenstions, explode(' ' , $ext)); + return (in_array($fileinfo[2], $ext)); + } +} diff --git a/src/IDF/Form/Admin/UserUpdate.php b/src/IDF/Form/Admin/UserUpdate.php index 6859859..d9111ae 100644 --- a/src/IDF/Form/Admin/UserUpdate.php +++ b/src/IDF/Form/Admin/UserUpdate.php @@ -24,13 +24,15 @@ /** * Update user's details. */ -class IDF_Form_Admin_UserUpdate extends Pluf_Form +class IDF_Form_Admin_UserUpdate extends Pluf_Form { public $user = null; public function initFields($extra=array()) { $this->user = $extra['user']; + $user_data = IDF_UserData::factory($this->user); + $this->fields['first_name'] = new Pluf_Form_Field_Varchar( array('required' => false, 'label' => __('First name'), @@ -66,7 +68,7 @@ class IDF_Form_Admin_UserUpdate extends Pluf_Form 'initial' => $this->user->language, 'widget' => 'Pluf_Form_Widget_SelectInput', 'widget_attrs' => array( - 'choices' => + 'choices' => Pluf_L10n::getInstalledLanguages() ), )); @@ -93,6 +95,66 @@ class IDF_Form_Admin_UserUpdate extends Pluf_Form ), )); + $this->fields['description'] = new Pluf_Form_Field_Varchar( + array('required' => false, + 'label' => __('Description'), + 'initial' => $user_data->description, + 'widget_attrs' => array('rows' => 3, + 'cols' => 40), + 'widget' => 'Pluf_Form_Widget_TextareaInput', + )); + + $this->fields['twitter'] = new Pluf_Form_Field_Varchar( + array('required' => false, + 'label' => __('Twitter username'), + 'initial' => $user_data->twitter, + 'widget_attrs' => array( + 'maxlength' => 50, + 'size' => 15, + ), + )); + + $this->fields['public_email'] = new Pluf_Form_Field_Email( + array('required' => false, + 'label' => __('Public email address'), + 'initial' => $user_data->public_email, + 'widget_attrs' => array( + 'maxlength' => 50, + 'size' => 15, + ), + )); + + $this->fields['website'] = new Pluf_Form_Field_Url( + array('required' => false, + 'label' => __('Website URL'), + 'initial' => $user_data->website, + 'widget_attrs' => array( + 'maxlength' => 50, + 'size' => 15, + ), + )); + + $this->fields['custom_avatar'] = new Pluf_Form_Field_File( + array('required' => false, + 'label' => __('Upload custom avatar'), + 'initial' => '', + 'max_size' => Pluf::f('max_upload_size', 2097152), + 'move_function_params' => array('upload_path' => Pluf::f('upload_path').'/avatars', + 'upload_path_create' => true, + 'upload_overwrite' => true, + 'file_name' => 'user_'.$this->user->id.'_%s'), + 'help_text' => __('An image file with a width and height not larger than 60 pixels (bigger images are scaled down).'), + )); + + $this->fields['remove_custom_avatar'] = new Pluf_Form_Field_Boolean( + array('required' => false, + 'label' => __('Remove custom avatar'), + 'initial' => false, + 'widget' => 'Pluf_Form_Widget_CheckboxInput', + 'widget_attrs' => array(), + 'help_text' => __('Tick this to delete the custom avatar.'), + )); + if ($extra['request']->user->administrator) { $this->fields['staff'] = new Pluf_Form_Field_Boolean( array('required' => false, @@ -136,8 +198,37 @@ class IDF_Form_Admin_UserUpdate extends Pluf_Form $update_pass = true; } $this->user->setFromFormData($this->cleaned_data); + if ($commit) { $this->user->update(); + + // FIXME: go the extra mile and check the input lengths for + // all fields here! + // FIXME: this is all doubled in UserAccount! + + $user_data = IDF_UserData::factory($this->user); + + // Add or remove avatar - we need to do this here because every + // single setter directly leads to a save in the database + if ($user_data->avatar != '' && + ($this->cleaned_data['remove_custom_avatar'] == 1 || + $this->cleaned_data['custom_avatar'] != '')) { + $avatar_path = Pluf::f('upload_path').'/avatars/'.basename($user_data->avatar); + if (basename($avatar_path) != '' && is_file($avatar_path)) { + unlink($avatar_path); + } + $user_data->avatar = ''; + } + + if ($this->cleaned_data['custom_avatar'] != '') { + $user_data->avatar = $this->cleaned_data['custom_avatar']; + } + + $user_data->description = $this->cleaned_data['description']; + $user_data->twitter = $this->cleaned_data['twitter']; + $user_data->public_email = $this->cleaned_data['public_email']; + $user_data->website = $this->cleaned_data['website']; + if ($update_pass) { /** * [signal] @@ -170,7 +261,7 @@ class IDF_Form_Admin_UserUpdate extends Pluf_Form { $last_name = trim($this->cleaned_data['last_name']); if ($last_name == mb_strtoupper($last_name)) { - return mb_convert_case(mb_strtolower($last_name), + return mb_convert_case(mb_strtolower($last_name), MB_CASE_TITLE, 'UTF-8'); } return $last_name; @@ -183,7 +274,7 @@ class IDF_Form_Admin_UserUpdate extends Pluf_Form throw new Pluf_Form_Invalid(__('--- is not a valid first name.')); } if ($first_name == mb_strtoupper($first_name)) { - $first_name = mb_convert_case(mb_strtolower($first_name), + $first_name = mb_convert_case(mb_strtolower($first_name), MB_CASE_TITLE, 'UTF-8'); } return $first_name; @@ -201,12 +292,23 @@ class IDF_Form_Admin_UserUpdate extends Pluf_Form return $email; } + function clean_custom_avatar() + { + // Just png, jpeg/jpg or gif + if (!preg_match('/\.(png|jpg|jpeg|gif)$/i', $this->cleaned_data['custom_avatar']) && + $this->cleaned_data['custom_avatar'] != '') { + @unlink(Pluf::f('upload_path').'/avatars/'.$this->cleaned_data['custom_avatar']); + throw new Pluf_Form_Invalid(__('For security reason, you cannot upload a file with this extension.')); + } + return $this->cleaned_data['custom_avatar']; + } + /** - * Check to see if the 2 passwords are the same. + * Check to see if the two passwords are the same. */ public function clean() { - if (!isset($this->errors['password']) + if (!isset($this->errors['password']) && !isset($this->errors['password2'])) { $password1 = $this->cleaned_data['password']; $password2 = $this->cleaned_data['password2']; diff --git a/src/IDF/Form/Field/EmailList.php b/src/IDF/Form/Field/EmailList.php new file mode 100644 index 0000000..3f5b8cc --- /dev/null +++ b/src/IDF/Form/Field/EmailList.php @@ -0,0 +1,51 @@ +empty_values)) { + $value = ''; + } + if ($value == '') { + return $value; + } + $emails = preg_split('/\s*,\s*/', $value, -1, PREG_SPLIT_NO_EMPTY); + foreach ($emails as $email) { + if (!Pluf_Utils::isValidEmail($email)) { + throw new Pluf_Form_Invalid(__( + 'Please enter one or more valid email addresses.' + )); + } + } + return implode(',', $emails); + } +} diff --git a/src/IDF/Form/TabsConf.php b/src/IDF/Form/TabsConf.php index a9087c9..969c6d7 100644 --- a/src/IDF/Form/TabsConf.php +++ b/src/IDF/Form/TabsConf.php @@ -45,7 +45,7 @@ class IDF_Form_TabsConf extends Pluf_Form array('required' => true, 'label' => $label, 'initial' => $this->conf->getVal($key, 'all'), - 'widget_attrs' => array('choices' => + 'widget_attrs' => array('choices' => array( __('Open to all') => 'all', __('Signed in users') => 'login', @@ -63,10 +63,11 @@ class IDF_Form_TabsConf extends Pluf_Form 'source_notification_email', 'issues_notification_email',); foreach ($ak as $key) { - $this->fields[$key] = new Pluf_Form_Field_Email( + $this->fields[$key] = new IDF_Form_Field_EmailList( array('required' => false, 'label' => $key, 'initial' => $this->conf->getVal($key, ''), + 'widget_attrs' => array('size' => 40), )); } diff --git a/src/IDF/Form/UserAccount.php b/src/IDF/Form/UserAccount.php index 5af3185..7b6a5cb 100644 --- a/src/IDF/Form/UserAccount.php +++ b/src/IDF/Form/UserAccount.php @@ -33,6 +33,8 @@ class IDF_Form_UserAccount extends Pluf_Form public function initFields($extra=array()) { $this->user = $extra['user']; + $user_data = IDF_UserData::factory($this->user); + $this->fields['first_name'] = new Pluf_Form_Field_Varchar( array('required' => false, 'label' => __('First name'), @@ -92,6 +94,66 @@ class IDF_Form_UserAccount extends Pluf_Form ), )); + $this->fields['description'] = new Pluf_Form_Field_Varchar( + array('required' => false, + 'label' => __('Description'), + 'initial' => $user_data->description, + 'widget_attrs' => array('rows' => 3, + 'cols' => 40), + 'widget' => 'Pluf_Form_Widget_TextareaInput', + )); + + $this->fields['twitter'] = new Pluf_Form_Field_Varchar( + array('required' => false, + 'label' => __('Twitter username'), + 'initial' => $user_data->twitter, + 'widget_attrs' => array( + 'maxlength' => 50, + 'size' => 15, + ), + )); + + $this->fields['public_email'] = new Pluf_Form_Field_Email( + array('required' => false, + 'label' => __('Public email address'), + 'initial' => $user_data->public_email, + 'widget_attrs' => array( + 'maxlength' => 50, + 'size' => 15, + ), + )); + + $this->fields['website'] = new Pluf_Form_Field_Url( + array('required' => false, + 'label' => __('Website URL'), + 'initial' => $user_data->website, + 'widget_attrs' => array( + 'maxlength' => 50, + 'size' => 15, + ), + )); + + $this->fields['custom_avatar'] = new Pluf_Form_Field_File( + array('required' => false, + 'label' => __('Upload custom avatar'), + 'initial' => '', + 'max_size' => Pluf::f('max_upload_size', 2097152), + 'move_function_params' => array('upload_path' => Pluf::f('upload_path').'/avatars', + 'upload_path_create' => true, + 'upload_overwrite' => true, + 'file_name' => 'user_'.$this->user->id.'_%s'), + 'help_text' => __('An image file with a width and height not larger than 60 pixels (bigger images are scaled down).'), + )); + + $this->fields['remove_custom_avatar'] = new Pluf_Form_Field_Boolean( + array('required' => false, + 'label' => __('Remove custom avatar'), + 'initial' => false, + 'widget' => 'Pluf_Form_Widget_CheckboxInput', + 'widget_attrs' => array(), + 'help_text' => __('Tick this to delete the custom avatar.'), + )); + $this->fields['public_key'] = new Pluf_Form_Field_Varchar( array('required' => false, 'label' => __('Add a public key'), @@ -138,7 +200,7 @@ class IDF_Form_UserAccount extends Pluf_Form 'email' => $new_email, 'user'=> $this->user, ) - ); + ); $tmpl = new Pluf_Template('idf/user/changeemail-email.txt'); $text_email = $tmpl->render($context); $email = new Pluf_Mail(Pluf::f('from_email'), $new_email, @@ -157,8 +219,37 @@ class IDF_Form_UserAccount extends Pluf_Form $key->create(); } } + if ($commit) { $this->user->update(); + + // FIXME: go the extra mile and check the input lengths for + // all fields here! + // FIXME: this is all doubled in admin/UserUpdate! + + $user_data = IDF_UserData::factory($this->user); + + // Add or remove avatar - we need to do this here because every + // single setter directly leads to a save in the database + if ($user_data->avatar != '' && + ($this->cleaned_data['remove_custom_avatar'] == 1 || + $this->cleaned_data['custom_avatar'] != '')) { + $avatar_path = Pluf::f('upload_path').'/avatars/'.basename($user_data->avatar); + if (basename($avatar_path) != '' && is_file($avatar_path)) { + unlink($avatar_path); + } + $user_data->avatar = ''; + } + + if ($this->cleaned_data['custom_avatar'] != '') { + $user_data->avatar = $this->cleaned_data['custom_avatar']; + } + + $user_data->description = $this->cleaned_data['description']; + $user_data->twitter = $this->cleaned_data['twitter']; + $user_data->public_email = $this->cleaned_data['public_email']; + $user_data->website = $this->cleaned_data['website']; + if ($update_pass) { /** * [signal] @@ -266,6 +357,19 @@ class IDF_Form_UserAccount extends Pluf_Form return $key; } + + function clean_custom_avatar() + { + // Just png, jpeg/jpg or gif + if (!preg_match('/\.(png|jpg|jpeg|gif)$/i', $this->cleaned_data['custom_avatar']) && + $this->cleaned_data['custom_avatar'] != '') { + @unlink(Pluf::f('upload_path').'/avatars/'.$this->cleaned_data['custom_avatar']); + throw new Pluf_Form_Invalid(__('For security reason, you cannot upload a file with this extension.')); + } + return $this->cleaned_data['custom_avatar']; + } + + function clean_last_name() { $last_name = trim($this->cleaned_data['last_name']); @@ -322,4 +426,6 @@ class IDF_Form_UserAccount extends Pluf_Form return $this->cleaned_data; } + + } diff --git a/src/IDF/Gconf.php b/src/IDF/Gconf.php index 4bbec62..ad09ef8 100644 --- a/src/IDF/Gconf.php +++ b/src/IDF/Gconf.php @@ -46,7 +46,7 @@ class IDF_Gconf extends Pluf_Model array( 'type' => 'Pluf_DB_Field_Sequence', //It is automatically added. - 'blank' => true, + 'blank' => true, ), 'model_class' => array( @@ -108,7 +108,7 @@ class IDF_Gconf extends Pluf_Model */ function setVal($key, $value) { - if (!is_null($this->getVal($key, null)) + if (!is_null($this->getVal($key, null)) and $value == $this->getVal($key)) { return; } @@ -121,7 +121,7 @@ class IDF_Gconf extends Pluf_Model $this->datacache[$key] = $value; return; } - } + } // we insert $conf = new IDF_Gconf(); $conf->model_class = $this->_mod->_model; diff --git a/src/IDF/Issue.php b/src/IDF/Issue.php index dc77e1a..3be0253 100644 --- a/src/IDF/Issue.php +++ b/src/IDF/Issue.php @@ -42,9 +42,9 @@ class IDF_Issue extends Pluf_Model 'id' => array( 'type' => 'Pluf_DB_Field_Sequence', - 'blank' => true, + 'blank' => true, ), - 'project' => + 'project' => array( 'type' => 'Pluf_DB_Field_Foreignkey', 'model' => 'IDF_Project', @@ -59,7 +59,7 @@ class IDF_Issue extends Pluf_Model 'size' => 250, 'verbose' => __('summary'), ), - 'submitter' => + 'submitter' => array( 'type' => 'Pluf_DB_Field_Foreignkey', 'model' => 'Pluf_User', @@ -67,7 +67,7 @@ class IDF_Issue extends Pluf_Model 'verbose' => __('submitter'), 'relate_name' => 'submitted_issue', ), - 'owner' => + 'owner' => array( 'type' => 'Pluf_DB_Field_Foreignkey', 'model' => 'Pluf_User', @@ -76,7 +76,7 @@ class IDF_Issue extends Pluf_Model 'verbose' => __('owner'), 'relate_name' => 'owned_issue', ), - 'interested' => + 'interested' => array( 'type' => 'Pluf_DB_Field_Manytomany', 'model' => 'Pluf_User', @@ -86,14 +86,14 @@ class IDF_Issue extends Pluf_Model ), 'tags' => array( - 'type' => 'Pluf_DB_Field_Manytomany', + 'type' => 'Pluf_DB_Field_Manytomany', 'blank' => true, 'model' => 'IDF_Tag', 'verbose' => __('labels'), ), - 'status' => + 'status' => array( - 'type' => 'Pluf_DB_Field_Foreignkey', + 'type' => 'Pluf_DB_Field_Foreignkey', 'blank' => false, 'model' => 'IDF_Tag', 'verbose' => __('status'), @@ -111,7 +111,7 @@ class IDF_Issue extends Pluf_Model 'verbose' => __('modification date'), ), ); - $this->_a['idx'] = array( + $this->_a['idx'] = array( 'modif_dtime_idx' => array( 'col' => 'modif_dtime', @@ -120,7 +120,7 @@ class IDF_Issue extends Pluf_Model ); $table = $this->_con->pfx.'idf_issue_idf_tag_assoc'; $this->_a['views'] = array( - 'join_tags' => + 'join_tags' => array( 'join' => 'LEFT JOIN '.$table .' ON idf_issue_id=id', @@ -164,7 +164,7 @@ class IDF_Issue extends Pluf_Model // that the issue as at least one comment in the database when // doing the indexing. if ($create) { - IDF_Timeline::insert($this, $this->get_project(), + IDF_Timeline::insert($this, $this->get_project(), $this->get_submitter()); } } @@ -177,12 +177,12 @@ class IDF_Issue extends Pluf_Model * as such create links to other items etc. You can consider that * if displayed, you can create a link to it. * - * @param Pluf_HTTP_Request + * @param Pluf_HTTP_Request * @return Pluf_Template_SafeString */ public function timelineFragment($request) { - $url = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::view', + $url = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::view', array($request->project->shortname, $this->id)); $out = ''; $out .= "\n".''; +
'.sprintf(__('Creation of issue %d, by %s'), $url, $ic, $this->id, $user).'
'; return Pluf_Template::markSafe($out); } public function feedFragment($request) { $url = Pluf::f('url_base') - .Pluf_HTTP_URL_urlForView('IDF_Views_Issue::view', + .Pluf_HTTP_URL_urlForView('IDF_Views_Issue::view', array($request->project->shortname, $this->id)); $title = sprintf(__('%s: Issue %d created - %s'), @@ -241,15 +241,17 @@ class IDF_Issue extends Pluf_Model $prj = $this->get_project(); $to_email = array(); if ('' != $conf->getVal('issues_notification_email', '')) { - $langs = Pluf::f('languages', array('en')); - $to_email[] = array($conf->getVal('issues_notification_email'), - $langs[0]); + $langs = Pluf::f('languages', array('en')); + $addresses = explode(',', $conf->getVal('issues_notification_email')); + foreach ($addresses as $address) { + $to_email[] = array($address, $langs[0]); + } } $current_locale = Pluf_Translation::getLocale(); $id = '<'.md5($this->id.md5(Pluf::f('secret_key'))).'@'.Pluf::f('mail_host', 'localhost').'>'; if ($create) { - if (null != $this->get_owner() and $this->owner != $this->submitter) { - $email_lang = array($this->get_owner()->email, + if (null != $this->get_owner() and $this->owner != $this->submitter) { + $email_lang = array($this->get_owner()->email, $this->get_owner()->language); if (!in_array($email_lang, $to_email)) { $to_email[] = $email_lang; diff --git a/src/IDF/IssueComment.php b/src/IDF/IssueComment.php index 110f3d8..084ecf3 100644 --- a/src/IDF/IssueComment.php +++ b/src/IDF/IssueComment.php @@ -41,9 +41,9 @@ class IDF_IssueComment extends Pluf_Model 'id' => array( 'type' => 'Pluf_DB_Field_Sequence', - 'blank' => true, + 'blank' => true, ), - 'issue' => + 'issue' => array( 'type' => 'Pluf_DB_Field_Foreignkey', 'model' => 'IDF_Issue', @@ -57,7 +57,7 @@ class IDF_IssueComment extends Pluf_Model 'blank' => false, 'verbose' => __('comment'), ), - 'submitter' => + 'submitter' => array( 'type' => 'Pluf_DB_Field_Foreignkey', 'model' => 'Pluf_User', @@ -79,7 +79,7 @@ class IDF_IssueComment extends Pluf_Model 'verbose' => __('creation date'), ), ); - $this->_a['idx'] = array( + $this->_a['idx'] = array( 'creation_dtime_idx' => array( 'col' => 'creation_dtime', @@ -119,7 +119,7 @@ class IDF_IssueComment extends Pluf_Model $sql = new Pluf_SQL('issue=%s', array($this->issue)); $co = Pluf::factory('IDF_IssueComment')->getList(array('filter'=>$sql->gen())); if ($co->count() > 1) { - IDF_Timeline::insert($this, $this->get_issue()->get_project(), + IDF_Timeline::insert($this, $this->get_issue()->get_project(), $this->get_submitter()); } } @@ -129,7 +129,7 @@ class IDF_IssueComment extends Pluf_Model public function timelineFragment($request) { $issue = $this->get_issue(); - $url = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::view', + $url = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::view', array($request->project->shortname, $issue->id)); $url .= '#ic'.$this->id; @@ -168,7 +168,7 @@ class IDF_IssueComment extends Pluf_Model } $out .= ''; $out .= "\n".''; +
'.sprintf(__('Comment on issue %d, by %s'), $url, $ic, $issue->id, $user).'
'; return Pluf_Template::markSafe($out); } @@ -176,7 +176,7 @@ class IDF_IssueComment extends Pluf_Model { $issue = $this->get_issue(); $url = Pluf::f('url_base') - .Pluf_HTTP_URL_urlForView('IDF_Views_Issue::view', + .Pluf_HTTP_URL_urlForView('IDF_Views_Issue::view', array($request->project->shortname, $issue->id)); $title = sprintf(__('%s: Comment on issue %d - %s'), @@ -196,4 +196,9 @@ class IDF_IssueComment extends Pluf_Model $tmpl = new Pluf_Template('idf/issues/feedfragment.xml'); return $tmpl->render($context); } + + public function get_submitter_data() + { + return IDF_UserData::factory($this->get_submitter()); + } } diff --git a/src/IDF/IssueFile.php b/src/IDF/IssueFile.php index 12b6375..9ecf559 100644 --- a/src/IDF/IssueFile.php +++ b/src/IDF/IssueFile.php @@ -39,9 +39,9 @@ class IDF_IssueFile extends Pluf_Model array( 'type' => 'Pluf_DB_Field_Sequence', //It is automatically added. - 'blank' => true, + 'blank' => true, ), - 'comment' => + 'comment' => array( 'type' => 'Pluf_DB_Field_Foreignkey', 'model' => 'IDF_IssueComment', @@ -49,7 +49,7 @@ class IDF_IssueFile extends Pluf_Model 'verbose' => __('comment'), 'relate_name' => 'attachment', ), - 'submitter' => + 'submitter' => array( 'type' => 'Pluf_DB_Field_Foreignkey', 'model' => 'Pluf_User', @@ -63,7 +63,7 @@ class IDF_IssueFile extends Pluf_Model 'size' => 100, 'verbose' => __('file name'), ), - 'attachment' => + 'attachment' => array( 'type' => 'Pluf_DB_Field_File', 'blank' => false, @@ -76,7 +76,7 @@ class IDF_IssueFile extends Pluf_Model 'verbose' => __('file size'), 'help_text' => 'Size in bytes.', ), - 'type' => + 'type' => array( 'type' => 'Pluf_DB_Field_Varchar', 'blank' => false, @@ -111,7 +111,7 @@ class IDF_IssueFile extends Pluf_Model $file = Pluf::f('upload_issue_path').'/'.$this->attachment; $this->filesize = filesize($file); // remove .dummy - $this->filename = substr(basename($file), 0, -6); + $this->filename = substr(basename($file), 0, -6); $img_extensions = array('jpeg', 'jpg', 'png', 'gif'); $info = pathinfo($this->filename); if (!isset($info['extension'])) $info['extension'] = ''; @@ -128,4 +128,10 @@ class IDF_IssueFile extends Pluf_Model { @unlink(Pluf::f('upload_issue_path').'/'.$this->attachment); } + + function isText() + { + $info = IDF_FileUtil::getMimeType($this->filename); + return IDF_FileUtil::isText($info); + } } diff --git a/src/IDF/Review/Comment.php b/src/IDF/Review/Comment.php index 0407cda..b3becda 100644 --- a/src/IDF/Review/Comment.php +++ b/src/IDF/Review/Comment.php @@ -25,12 +25,12 @@ * A comment set on a review. * * A comment is associated to a patch as a review can have many - * patches associated to it. + * patches associated to it. * * A comment is also tracking the changes in the review in the same * way the issue comment is tracking the changes in the issue. * - * + * */ class IDF_Review_Comment extends Pluf_Model { @@ -45,9 +45,9 @@ class IDF_Review_Comment extends Pluf_Model 'id' => array( 'type' => 'Pluf_DB_Field_Sequence', - 'blank' => true, + 'blank' => true, ), - 'patch' => + 'patch' => array( 'type' => 'Pluf_DB_Field_Foreignkey', 'model' => 'IDF_Review_Patch', @@ -61,7 +61,7 @@ class IDF_Review_Comment extends Pluf_Model 'blank' => true, // if only commented on lines 'verbose' => __('comment'), ), - 'submitter' => + 'submitter' => array( 'type' => 'Pluf_DB_Field_Foreignkey', 'model' => 'Pluf_User', @@ -118,8 +118,8 @@ class IDF_Review_Comment extends Pluf_Model function postSave($create=false) { if ($create) { - IDF_Timeline::insert($this, - $this->get_patch()->get_review()->get_project(), + IDF_Timeline::insert($this, + $this->get_patch()->get_review()->get_project(), $this->get_submitter()); } } @@ -127,7 +127,7 @@ class IDF_Review_Comment extends Pluf_Model public function timelineFragment($request) { $review = $this->get_patch()->get_review(); - $url = Pluf_HTTP_URL_urlForView('IDF_Views_Review::view', + $url = Pluf_HTTP_URL_urlForView('IDF_Views_Review::view', array($request->project->shortname, $review->id)); $out = ''; $out .= "\n".''; +
'.sprintf(__('Update of review %d, by %s'), $url, $ic, $review->id, $user).'
'; return Pluf_Template::markSafe($out); } public function feedFragment($request) { $review = $this->get_patch()->get_review(); - $url = Pluf_HTTP_URL_urlForView('IDF_Views_Review::view', + $url = Pluf_HTTP_URL_urlForView('IDF_Views_Review::view', array($request->project->shortname, $review->id)); $title = sprintf(__('%s: Updated review %d - %s'), @@ -221,4 +221,9 @@ class IDF_Review_Comment extends Pluf_Model } Pluf_Translation::loadSetLocale($current_locale); } + + public function get_submitter_data() + { + return IDF_UserData::factory($this->get_submitter()); + } } diff --git a/src/IDF/Review/Patch.php b/src/IDF/Review/Patch.php index 5c9f5da..656493d 100644 --- a/src/IDF/Review/Patch.php +++ b/src/IDF/Review/Patch.php @@ -197,14 +197,17 @@ class IDF_Review_Patch extends Pluf_Model ); $tmpl = new Pluf_Template('idf/review/review-created-email.txt'); $text_email = $tmpl->render($context); - $email = new Pluf_Mail(Pluf::f('from_email'), - $conf->getVal('review_notification_email'), - sprintf(__('New Code Review %s - %s (%s)'), - $this->get_review()->id, - $this->get_review()->summary, - $this->get_review()->get_project()->shortname)); - $email->addTextMessage($text_email); - $email->sendMail(); + $addresses = explode(';',$conf->getVal('review_notification_email')); + foreach ($addresses as $address) { + $email = new Pluf_Mail(Pluf::f('from_email'), + $address, + sprintf(__('New Code Review %s - %s (%s)'), + $this->get_review()->id, + $this->get_review()->summary, + $this->get_review()->get_project()->shortname)); + $email->addTextMessage($text_email); + $email->sendMail(); + } Pluf_Translation::loadSetLocale($current_locale); } } diff --git a/src/IDF/Scm.php b/src/IDF/Scm.php index 60f010a..f474cd5 100644 --- a/src/IDF/Scm.php +++ b/src/IDF/Scm.php @@ -316,6 +316,34 @@ class IDF_Scm throw new Pluf_Exception_NotImplemented(); } + /** + * Returns all recorded changes which lead to the particular commit + * or revision. + * + * Example output: + * + * stdClass object { + * 'additions' => array('path/to/file', 'path/to/directory', ...), + * 'deletions' => array('path/to/file', 'path/to/directory', ...), + * 'renames' => array('old/path/to/file' => 'new/path/to/file', ...) + * 'patches' => array('path/to/file', ...), + * 'properties' => array('path/to/file' => array( + * 'propname' => 'propvalue', 'deletedprop' => null, ...) + * ), + * ...) + * } + * + * Each member of the returned object is mandatory, but may contain + * an empty array if no changes were recorded. + * + * @param string A commit identifier + * @return object with arrays of individual changes + */ + public function getChanges($commit) + { + throw new Pluf_Exception_NotImplemented(); + } + /** * Get latest changes. * diff --git a/src/IDF/Scm/Cache/Git.php b/src/IDF/Scm/Cache/Git.php index 4e9fe7e..dc905d4 100644 --- a/src/IDF/Scm/Cache/Git.php +++ b/src/IDF/Scm/Cache/Git.php @@ -85,6 +85,8 @@ class IDF_Scm_Cache_Git extends Pluf_Model array($this->_project->id)); foreach (Pluf::factory(__CLASS__)->getList(array('filter' => $sql->gen())) as $blob) { $tmp = explode(chr(31), $blob->content, 3); + // sometimes the title might be empty + if (!isset($tmp[2])) $tmp[2] = ''; $res[$blob->githash] = (object) array( 'hash' => $blob->githash, @@ -131,4 +133,4 @@ class IDF_Scm_Cache_Git extends Pluf_Model ), ); } -} \ No newline at end of file +} diff --git a/src/IDF/Scm/Git.php b/src/IDF/Scm/Git.php index 0befdfb..ca05429 100644 --- a/src/IDF/Scm/Git.php +++ b/src/IDF/Scm/Git.php @@ -431,13 +431,13 @@ class IDF_Scm_Git extends IDF_Scm } } $out = self::parseLog($log); - $out[0]->changes = implode("\n", $change); + $out[0]->diff = implode("\n", $change); } else { $out = self::parseLog($out); - $out[0]->changes = ''; + $out[0]->diff = ''; } - $out[0]->branch = $this->inBranches($commit, null); + $out[0]->branch = implode(', ', $this->inBranches($commit, null)); return $out[0]; } diff --git a/src/IDF/Scm/Mercurial.php b/src/IDF/Scm/Mercurial.php index ad2f383..b52e9f9 100644 --- a/src/IDF/Scm/Mercurial.php +++ b/src/IDF/Scm/Mercurial.php @@ -359,7 +359,7 @@ class IDF_Scm_Mercurial extends IDF_Scm } } $out = self::parseLog($log, 6); - $out[0]->changes = implode("\n", $change); + $out[0]->diff = implode("\n", $change); return $out[0]; } diff --git a/src/IDF/Scm/Monotone.php b/src/IDF/Scm/Monotone.php index f001236..fb39d5b 100644 --- a/src/IDF/Scm/Monotone.php +++ b/src/IDF/Scm/Monotone.php @@ -599,6 +599,75 @@ class IDF_Scm_Monotone extends IDF_Scm ); } + /** + * @see IDF_Scm::getChanges() + */ + public function getChanges($commit) + { + $revs = $this->_resolveSelector($commit); + if (count($revs) == 0) + return null; + + $revision = $revs[0]; + $out = $this->stdio->exec(array('get_revision', $revision)); + $stanzas = IDF_Scm_Monotone_BasicIO::parse($out); + + $return = (object) array( + 'additions' => array(), + 'deletions' => array(), + 'renames' => array(), + 'patches' => array(), + 'properties' => array(), + ); + + foreach ($stanzas as $stanza) { + if ($stanza[0]['key'] == 'format_version' || + $stanza[0]['key'] == 'old_revision' || + $stanza[0]['key'] == 'new_manifest') + continue; + + if ($stanza[0]['key'] == 'add_file' || + $stanza[0]['key'] == 'add_dir') { + $return->additions[] = $stanza[0]['values'][0]; + continue; + } + + if ($stanza[0]['key'] == 'delete') { + $return->deletions[] = $stanza[0]['values'][0]; + continue; + } + + if ($stanza[0]['key'] == 'rename') { + $return->renames[$stanza[0]['values'][0]] = + $stanza[1]['values'][0]; + continue; + } + + if ($stanza[0]['key'] == 'patch') { + $return->patches[] = $stanza[0]['values'][0]; + continue; + } + + if ($stanza[0]['key'] == 'clear' || + $stanza[0]['key'] == 'set') { + + $filename = $stanza[0]['values'][0]; + if (!array_key_exists($filename, $return->properties)) { + $return->properties[$filename] = array(); + } + $key = $stanza[1]['values'][0]; + $value = null; + if (isset($stanza[2])) { + $value = $stanza[2]['values'][0]; + } + $return->properties[$filename][$key] = $value; + continue; + } + } + + return $return; + } + /** * @see IDF_Scm::getCommit() */ @@ -626,7 +695,7 @@ class IDF_Scm_Monotone extends IDF_Scm $res['branch'] = implode(', ', $certs['branch']); $res['commit'] = $revs[0]; - $res['changes'] = ($getdiff) ? $this->_getDiff($revs[0]) : ''; + $res['diff'] = ($getdiff) ? $this->_getDiff($revs[0]) : ''; return (object) $res; } @@ -709,10 +778,10 @@ class IDF_Scm_Monotone extends IDF_Scm $log['commit'] = $rev; $logs[] = (object)$log; - } - $out = $this->stdio->exec(array('parents', $rev)); - $horizont += preg_split("/\n/", $out, -1, PREG_SPLIT_NO_EMPTY); + $out = $this->stdio->exec(array('parents', $rev)); + $horizont += preg_split("/\n/", $out, -1, PREG_SPLIT_NO_EMPTY); + } } return $logs; diff --git a/src/IDF/Scm/Svn.php b/src/IDF/Scm/Svn.php index 0a17a78..0144738 100644 --- a/src/IDF/Scm/Svn.php +++ b/src/IDF/Scm/Svn.php @@ -398,7 +398,7 @@ class IDF_Scm_Svn extends IDF_Scm */ public function getCommit($commit, $getdiff=false) { - if (!$this->isValidRevision($commit)) { + if ($this->validateRevision($commit) != IDF_Scm::REVISION_VALID) { return false; } $res = array(); @@ -414,7 +414,7 @@ class IDF_Scm_Svn extends IDF_Scm $res['date'] = gmdate('Y-m-d H:i:s', strtotime((string) $xml->logentry->date)); $res['title'] = (string) $xml->logentry->msg; $res['commit'] = (string) $xml->logentry['revision']; - $res['changes'] = ($getdiff) ? $this->getDiff($commit) : ''; + $res['diff'] = ($getdiff) ? $this->getDiff($commit) : ''; $res['tree'] = ''; $res['branch'] = ''; return (object) $res; diff --git a/src/IDF/Template/IssueComment.php b/src/IDF/Template/IssueComment.php index 5844465..280cf2b 100644 --- a/src/IDF/Template/IssueComment.php +++ b/src/IDF/Template/IssueComment.php @@ -51,9 +51,13 @@ class IDF_Template_IssueComment extends Pluf_Template_Tag array($this, 'callbackReviews'), $text); } if ($request->rights['hasSourceAccess']) { - $text = preg_replace_callback('#(commits?\s+)([0-9a-f]{1,40}(?:(?:\s+and|\s+or|,)\s+[0-9a-f]{1,40})*)\b#i', + $verbs = array('added', 'fixed', 'reverted', 'changed', 'removed'); + $nouns = array('commit', 'commits', 'revision', 'revisions', 'rev', 'revs'); + $prefix = implode(' in|', $verbs).' in' . '|'. + implode('|', $nouns); + $text = preg_replace_callback('#((?:'.$prefix.')(?:\s+r?))([0-9a-f]{1,40}((?:\s+and|\s+or|,)\s+r?[0-9a-f]{1,40})*)\b#i', array($this, 'callbackCommits'), $text); - $text = preg_replace_callback('#(src:)([^\s\(\)\\\\]+(?:(\\\\)\s+[^\s\(\)\\\\]+){0,})+#im', + $text = preg_replace_callback('=(src:)([^\s@#,\(\)\\\\]+(?:(\\\\)[\s@#][^\s@#,\(\)\\\\]+){0,})+(?:\@([^\s#,]+))(?:#(\d+))?=im', array($this, 'callbackSource'), $text); } if ($wordwrap) $text = Pluf_Text::wrapHtml($text, 69, "\n"); @@ -122,15 +126,12 @@ class IDF_Template_IssueComment extends Pluf_Template_Tag function callbackCommits($m) { $keyword = rtrim($m[1]); - if ('commits' === $keyword) { - // Multiple commits like 'commits 6e030e6, a25bfc1 and - // 3c094f8'. - return $m[1].preg_replace_callback('#\b[0-9a-f]{4,40}\b#i', array($this, 'callbackCommit'), $m[2]); - } else if ('commit' === $keyword) { + if (empty($m[3])) { // Single commit like 'commit 6e030e6'. return $m[1].call_user_func(array($this, 'callbackCommit'), array($m[2])); } - return $m[0]; + // Multiple commits like 'commits 6e030e6, a25bfc1 and 3c094f8'. + return $m[1].preg_replace_callback('#\b[0-9a-f]{1,40}\b#i', array($this, 'callbackCommit'), $m[2]); } /** @@ -189,17 +190,38 @@ class IDF_Template_IssueComment extends Pluf_Template_Tag function callbackSource($m) { - if (!$this->scm->isAvailable()) return $m[0]; + if (!$this->scm->isAvailable()) + return $m[0]; + $commit = null; + if (!empty($m[4])) { + if (!$this->scm->getCommit($m[4])) { + return $m[0]; + } + $commit = $m[4]; + } $file = $m[2]; - if (!empty($m[3])) $file = str_replace($m[3], '', $file); - $request_file_info = $this->scm->getPathInfo($file); + if (!empty($m[3])) + $file = str_replace($m[3], '', $file); + $linktext = $file; + if (!empty($commit)) + $linktext .= '@'.$commit; + $request_file_info = $this->scm->getPathInfo($file, $commit); if (!$request_file_info) { return $m[0]; } - if ($request_file_info->type != 'tree') { - return $m[1].''.$file.''; + if ($request_file_info->type == 'tree') { + return $m[0]; } - return $m[0]; + $link = Pluf_HTTP_URL_urlForView('IDF_Views_Source::tree', array( + $this->project->shortname, + $commit == null ? $this->scm->getMainBranch() : $commit, + $file + )); + if (!empty($m[5])) { + $link .= '#L'.$m[5]; + $linktext .= '#'.$m[5]; + } + return $m[1].''.$linktext.''; } /** diff --git a/src/IDF/Template/Markdown.php b/src/IDF/Template/Markdown.php index 3054ca8..50c9f6a 100644 --- a/src/IDF/Template/Markdown.php +++ b/src/IDF/Template/Markdown.php @@ -93,7 +93,7 @@ class IDF_Template_Markdown extends Pluf_Template_Tag $info = pathinfo($m[1]); $fileinfo = array($res->headers['Content-Type'], $m[1], isset($info['extension']) ? $info['extension'] : 'bin'); - if (!IDF_Views_Source::isText($fileinfo)) { + if (!IDF_FileUtil::isText($fileinfo)) { return $m[0]; } return $res->content; diff --git a/src/IDF/Tests/TestFileUtil.php b/src/IDF/Tests/TestFileUtil.php new file mode 100644 index 0000000..31d37e2 --- /dev/null +++ b/src/IDF/Tests/TestFileUtil.php @@ -0,0 +1,47 @@ + 'application/x-httpd-php', + 'whatever.pht' => 'application/x-httpd-php', + 'README' => 'text/plain', + ); + foreach ($files as $file => $mime) { + $m = IDF_Views_Source::getMimeType($file); + $this->assertEqual($mime, $m[0]); + } + } +} diff --git a/src/IDF/Tests/TestSource.php b/src/IDF/Tests/TestSource.php index fbe95da..8634cc3 100644 --- a/src/IDF/Tests/TestSource.php +++ b/src/IDF/Tests/TestSource.php @@ -32,19 +32,6 @@ class IDF_Tests_TestSource extends UnitTestCase parent::__construct('Test the source class.'); } - public function testGetMimeType() - { - $files = array( - 'whatever.php' => 'application/x-httpd-php', - 'whatever.pht' => 'application/x-httpd-php', - 'README' => 'text/plain', - ); - foreach ($files as $file => $mime) { - $m = IDF_Views_Source::getMimeType($file); - $this->assertEqual($mime, $m[0]); - } - } - public function testRegexCommit() { $regex = '#^/p/([\-\w]+)/source/tree/([^\/]+)/(.*)$#'; @@ -61,4 +48,4 @@ class IDF_Tests_TestSource extends UnitTestCase $this->assertEqual($res[2], $m[3]); } } -} \ No newline at end of file +} diff --git a/src/IDF/Upload.php b/src/IDF/Upload.php index 955af97..8effae0 100644 --- a/src/IDF/Upload.php +++ b/src/IDF/Upload.php @@ -39,9 +39,9 @@ class IDF_Upload extends Pluf_Model 'id' => array( 'type' => 'Pluf_DB_Field_Sequence', - 'blank' => true, + 'blank' => true, ), - 'project' => + 'project' => array( 'type' => 'Pluf_DB_Field_Foreignkey', 'model' => 'IDF_Project', @@ -77,7 +77,7 @@ class IDF_Upload extends Pluf_Model 'default' => 0, 'verbose' => __('file size in bytes'), ), - 'submitter' => + 'submitter' => array( 'type' => 'Pluf_DB_Field_Foreignkey', 'model' => 'Pluf_User', @@ -87,7 +87,7 @@ class IDF_Upload extends Pluf_Model ), 'tags' => array( - 'type' => 'Pluf_DB_Field_Manytomany', + 'type' => 'Pluf_DB_Field_Manytomany', 'blank' => true, 'model' => 'IDF_Tag', 'verbose' => __('labels'), @@ -112,7 +112,7 @@ class IDF_Upload extends Pluf_Model 'verbose' => __('modification date'), ), ); - $this->_a['idx'] = array( + $this->_a['idx'] = array( 'modif_dtime_idx' => array( 'col' => 'modif_dtime', @@ -121,7 +121,7 @@ class IDF_Upload extends Pluf_Model ); $table = $this->_con->pfx.'idf_tag_idf_upload_assoc'; $this->_a['views'] = array( - 'join_tags' => + 'join_tags' => array( 'join' => 'LEFT JOIN '.$table .' ON idf_upload_id=id', @@ -150,7 +150,7 @@ class IDF_Upload extends Pluf_Model function postSave($create=false) { if ($create) { - IDF_Timeline::insert($this, $this->get_project(), + IDF_Timeline::insert($this, $this->get_project(), $this->get_submitter(), $this->creation_dtime); } } @@ -173,13 +173,13 @@ class IDF_Upload extends Pluf_Model * Returns the timeline fragment for the file. * * - * @param Pluf_HTTP_Request + * @param Pluf_HTTP_Request * @return Pluf_Template_SafeString */ public function timelineFragment($request) { - $url = Pluf_HTTP_URL_urlForView('IDF_Views_Download::view', - array($request->project->shortname, + $url = Pluf_HTTP_URL_urlForView('IDF_Views_Download::view', + array($request->project->shortname, $this->id)); $out = ''; $out .= ''; $out .= "\n".''; +
'.sprintf(__('Addition of download %d, by %s'), $url, $this->id, $user).'
'; return Pluf_Template::markSafe($out); } public function feedFragment($request) { $url = Pluf::f('url_base') - .Pluf_HTTP_URL_urlForView('IDF_Views_Download::view', - array($request->project->shortname, + .Pluf_HTTP_URL_urlForView('IDF_Views_Download::view', + array($request->project->shortname, $this->id)); $title = sprintf(__('%s: Download %d added - %s'), $request->project->name, @@ -227,7 +227,7 @@ class IDF_Upload extends Pluf_Model } $current_locale = Pluf_Translation::getLocale(); $langs = Pluf::f('languages', array('en')); - Pluf_Translation::loadSetLocale($langs[0]); + Pluf_Translation::loadSetLocale($langs[0]); $context = new Pluf_Template_Context( array('file' => $this, @@ -237,14 +237,16 @@ class IDF_Upload extends Pluf_Model )); $tmpl = new Pluf_Template('idf/downloads/download-created-email.txt'); $text_email = $tmpl->render($context); - $email = new Pluf_Mail(Pluf::f('from_email'), - $conf->getVal('downloads_notification_email'), - sprintf(__('New download - %s (%s)'), - $this->summary, - $this->get_project()->shortname)); - $email->addTextMessage($text_email); - $email->sendMail(); - + $addresses = explode(',', $conf->getVal('downloads_notification_email')); + foreach ($addresses as $address) { + $email = new Pluf_Mail(Pluf::f('from_email'), + $address, + sprintf(__('New download - %s (%s)'), + $this->summary, + $this->get_project()->shortname)); + $email->addTextMessage($text_email); + $email->sendMail(); + } Pluf_Translation::loadSetLocale($current_locale); } } \ No newline at end of file diff --git a/src/IDF/UserData.php b/src/IDF/UserData.php new file mode 100644 index 0000000..b28099e --- /dev/null +++ b/src/IDF/UserData.php @@ -0,0 +1,59 @@ +setVal($key, $value); + } + + function __get($key) + { + if (in_array($key, self::$protectedVars)) + return parent::__get($key); + return $this->getVal($key, null); + } + + public static function factory($user) + { + $conf = new IDF_UserData(); + $conf->setModel((object) array('_model'=>'IDF_UserData', 'id' => $user->id)); + $conf->initCache(); + return $conf; + } +} diff --git a/src/IDF/Views.php b/src/IDF/Views.php index 03ae86a..235eacc 100644 --- a/src/IDF/Views.php +++ b/src/IDF/Views.php @@ -86,7 +86,10 @@ class IDF_Views $title = __('Create Your Account'); $params = array('request'=>$request); if ($request->method == 'POST') { - $form = new IDF_Form_Register($request->POST, $params); + $form = new IDF_Form_Register(array_merge( + (array)$request->POST, + (array)$request->FILES + ), $params); if ($form->isValid()) { $user = $form->save(); // It is sending the confirmation email $url = Pluf_HTTP_URL_urlForView('IDF_Views::registerInputKey'); diff --git a/src/IDF/Views/Admin.php b/src/IDF/Views/Admin.php index 2b1db96..6c4d8d0 100644 --- a/src/IDF/Views/Admin.php +++ b/src/IDF/Views/Admin.php @@ -268,7 +268,9 @@ class IDF_Views_Admin } if ($request->method == 'POST') { - $form = new IDF_Form_Admin_UserUpdate($request->POST, $params); + $form = new IDF_Form_Admin_UserUpdate(array_merge($request->POST, + $request->FILES), + $params); if ($form->isValid()) { $form->save(); $request->user->setMessage(__('The user has been updated.')); @@ -299,7 +301,9 @@ class IDF_Views_Admin 'request' => $request, ); if ($request->method == 'POST') { - $form = new IDF_Form_Admin_UserCreate($request->POST, $params); + $form = new IDF_Form_Admin_UserCreate(array_merge($request->POST, + $request->FILES), + $params); if ($form->isValid()) { $cuser = $form->save(); $request->user->setMessage(sprintf(__('The user %s has been created.'), (string) $cuser)); diff --git a/src/IDF/Views/Issue.php b/src/IDF/Views/Issue.php index 211e4b4..7dbafee 100644 --- a/src/IDF/Views/Issue.php +++ b/src/IDF/Views/Issue.php @@ -79,7 +79,7 @@ class IDF_Views_Issue } /** - * View the issues of a given user. + * View the issues of a given user. * * Only open issues are shown. */ @@ -201,7 +201,7 @@ class IDF_Views_Issue { $prj = $request->project; if (!isset($request->REQUEST['q']) or trim($request->REQUEST['q']) == '') { - $url = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::index', + $url = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::index', array($prj->shortname)); return new Pluf_HTTP_Response_Redirect($url); } @@ -263,7 +263,7 @@ class IDF_Views_Issue 'issue' => $issue, ); if ($request->method == 'POST') { - $form = new IDF_Form_IssueUpdate(array_merge($request->POST, + $form = new IDF_Form_IssueUpdate(array_merge($request->POST, $request->FILES), $params); if (!isset($request->POST['preview']) && $form->isValid()) { @@ -279,6 +279,7 @@ class IDF_Views_Issue $form = new IDF_Form_IssueUpdate(null, $params); } } + $arrays = self::autoCompleteArrays($prj); return Pluf_Shortcuts_RenderToResponse('idf/issues/view.html', array_merge( @@ -290,7 +291,7 @@ class IDF_Views_Issue 'page_title' => $title, 'closed' => $closed, 'preview' => $preview, - 'interested' =>$interested->count(), + 'interested' => $interested->count(), ), $arrays), $request); @@ -306,7 +307,7 @@ class IDF_Views_Issue $prj = $request->project; $attach = Pluf_Shortcuts_GetObjectOr404('IDF_IssueFile', $match[2]); $prj->inOr404($attach->get_comment()->get_issue()); - $info = IDF_Views_Source::getMimeType($attach->filename); + $info = IDF_FileUtil::getMimeType($attach->filename); $mime = 'application/octet-stream'; if (strpos($info[0], 'image/') === 0) { $mime = $info[0]; @@ -330,14 +331,14 @@ class IDF_Views_Issue $prj->inOr404($attach->get_comment()->get_issue()); // If one cannot see the attachement, redirect to the // getAttachment view. - $info = IDF_Views_Source::getMimeType($attach->filename); - if (!IDF_Views_Source::isText($info)) { + $info = IDF_FileUtil::getMimeType($attach->filename); + if (!IDF_FileUtil::isText($info)) { return $this->getAttachment($request, $match); } // Now we want to look at the file but with links back to the // issue. - $file = IDF_Views_Source::highLight($info, - file_get_contents(Pluf::f('upload_issue_path').'/'.$attach->attachment)); + $file = IDF_FileUtil::highLight($info, + file_get_contents(Pluf::f('upload_issue_path').'/'.$attach->attachment)); $title = sprintf(__('View %s'), $attach->filename); return Pluf_Shortcuts_RenderToResponse('idf/issues/attachment.html', array( @@ -406,7 +407,7 @@ class IDF_Views_Issue { $prj = $request->project; $tag = Pluf_Shortcuts_GetObjectOr404('IDF_Tag', $match[2]); - $status = $match[3]; + $status = $match[3]; if ($tag->project != $prj->id or !in_array($status, array('open', 'closed'))) { throw new Pluf_HTTP_Error404(); } @@ -414,7 +415,7 @@ class IDF_Views_Issue $title = sprintf(__('%1$s Issues with Label %2$s'), (string) $prj, (string) $tag); } else { - $title = sprintf(__('%1$s Closed Issues with Label %2$s'), + $title = sprintf(__('%1$s Closed Issues with Label %2$s'), (string) $prj, (string) $tag); } // Get stats about the open/closed issues having this tag. @@ -547,11 +548,11 @@ class IDF_Views_Issue */ function IDF_Views_Issue_SummaryAndLabels($field, $issue, $extra='') { - $edit = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::view', + $edit = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::view', array($issue->shortname, $issue->id)); $tags = array(); foreach ($issue->get_tags_list() as $tag) { - $url = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::listLabel', + $url = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::listLabel', array($issue->shortname, $tag->id, 'open')); $tags[] = sprintf('%s', $url, Pluf_esc((string) $tag)); } @@ -574,4 +575,4 @@ function IDF_Views_Issue_SummaryAndLabels($field, $issue, $extra='') function IDF_Views_Issue_ShowStatus($field, $issue, $extra='') { return Pluf_esc($issue->get_status()->name); -} \ No newline at end of file +} diff --git a/src/IDF/Views/Project.php b/src/IDF/Views/Project.php index 0ebcf69..a59d0f6 100644 --- a/src/IDF/Views/Project.php +++ b/src/IDF/Views/Project.php @@ -147,7 +147,7 @@ class IDF_Views_Project array($prj->id)); $pag->sort_order = array('creation_dtime', 'ASC'); $pag->sort_reverse_order = array('creation_dtime'); - $pag->action = array('IDF_Views_Project::timeline', array($prj->shortname)); + $pag->action = array('IDF_Views_Project::timeline', array($prj->shortname, $model_filter)); $list_display = array( 'creation_dtime' => __('Age'), 'id' => __('Change'), diff --git a/src/IDF/Views/Review.php b/src/IDF/Views/Review.php index 79671b8..1afb0fd 100644 --- a/src/IDF/Views/Review.php +++ b/src/IDF/Views/Review.php @@ -89,10 +89,10 @@ class IDF_Views_Review )); if ($form->isValid()) { $review = $form->save(); - $urlr = Pluf_HTTP_URL_urlForView('IDF_Views_Review::view', + $urlr = Pluf_HTTP_URL_urlForView('IDF_Views_Review::view', array($prj->shortname, $review->id)); $request->user->setMessage(sprintf(__('The code review %d has been created.'), $urlr, $review->id)); - $url = Pluf_HTTP_URL_urlForView('IDF_Views_Review::index', + $url = Pluf_HTTP_URL_urlForView('IDF_Views_Review::index', array($prj->shortname)); return new Pluf_HTTP_Response_Redirect($url); } @@ -155,10 +155,10 @@ class IDF_Views_Review if ($form->isValid()) { $review_comment = $form->save(); $review = $patch->get_review(); - $urlr = Pluf_HTTP_URL_urlForView('IDF_Views_Review::view', + $urlr = Pluf_HTTP_URL_urlForView('IDF_Views_Review::view', array($prj->shortname, $review->id)); $request->user->setMessage(sprintf(__('Your code review %d has been published.'), $urlr, $review->id)); - $url = Pluf_HTTP_URL_urlForView('IDF_Views_Review::index', + $url = Pluf_HTTP_URL_urlForView('IDF_Views_Review::index', array($prj->shortname)); $review_comment->notify($request->conf); return new Pluf_HTTP_Response_Redirect($url); @@ -181,7 +181,7 @@ class IDF_Views_Review foreach ($cts as $ct) { $reviewers[] = $ct->get_comment()->get_submitter(); } - if (count($def['chunks'])) { + if (count($def['chunks'])) { $orig_file = ($fileinfo) ? $scm->getFile($fileinfo) : ''; $files[$filename] = array( $diff->fileCompare($orig_file, $def, $filename), @@ -192,6 +192,7 @@ class IDF_Views_Review $files[$filename] = array('', $form->f->{md5($filename)}, $cts); } } + $reviewers = Pluf_Model_RemoveDuplicates($reviewers); return Pluf_Shortcuts_RenderToResponse('idf/review/view.html', array_merge( @@ -219,7 +220,7 @@ class IDF_Views_Review */ function IDF_Views_Review_SummaryAndLabels($field, $review, $extra='') { - $edit = Pluf_HTTP_URL_urlForView('IDF_Views_Review::view', + $edit = Pluf_HTTP_URL_urlForView('IDF_Views_Review::view', array($review->shortname, $review->id)); $tags = array(); foreach ($review->get_tags_list() as $tag) { diff --git a/src/IDF/Views/Source.php b/src/IDF/Views/Source.php index 5817b22..6652d66 100644 --- a/src/IDF/Views/Source.php +++ b/src/IDF/Views/Source.php @@ -31,17 +31,6 @@ Pluf::loadFunction('Pluf_Shortcuts_GetFormForModel'); */ class IDF_Views_Source { - /** - * Extension supported by the syntax highlighter. - */ - public static $supportedExtenstions = array( - 'ascx', 'ashx', 'asmx', 'aspx', 'browser', 'bsh', 'c', 'cl', 'cc', - 'config', 'cpp', 'cs', 'csh', 'csproj', 'css', 'cv', 'cyc', 'el', 'fs', - 'h', 'hh', 'hpp', 'hs', 'html', 'html', 'java', 'js', 'lisp', 'master', - 'pas', 'perl', 'php', 'pl', 'pm', 'py', 'rb', 'scm', 'sh', 'sitemap', - 'skin', 'sln', 'svc', 'vala', 'vb', 'vbproj', 'vbs', 'wsdl', 'xhtml', - 'xml', 'xsd', 'xsl', 'xslt'); - /** * Display help on how to checkout etc. */ @@ -211,7 +200,7 @@ class IDF_Views_Source if ($request_file_info->type != 'tree') { $info = self::getRequestedFileMimeType($request_file_info, $commit, $scm); - if (!self::isText($info)) { + if (!IDF_FileUtil::isText($info)) { $rep = new Pluf_HTTP_Response($scm->getFile($request_file_info), $info[0]); $rep->headers['Content-Disposition'] = 'attachment; filename="'.$info[1].'"'; @@ -308,8 +297,9 @@ class IDF_Views_Source $title = sprintf(__('%s Commit Details'), (string) $request->project); $page_title = sprintf(__('%s Commit Details - %s'), (string) $request->project, $commit); $rcommit = IDF_Commit::getOrAdd($cobject, $request->project); - $diff = new IDF_Diff($cobject->changes); + $diff = new IDF_Diff($cobject->diff); $diff->parse(); + $changes = $scm->getChanges($commit); $scmConf = $request->conf->getVal('scm', 'git'); $branches = $scm->getBranches(); $in_branches = $scm->inBranches($cobject->commit, ''); @@ -322,6 +312,7 @@ class IDF_Views_Source 'diff' => $diff, 'cobject' => $cobject, 'commit' => $commit, + 'changes' => $changes, 'branches' => $branches, 'tree_in' => $in_branches, 'tags' => $tags, @@ -373,7 +364,7 @@ class IDF_Views_Source $previous = substr($request_file, 0, -strlen($l.' ')); $scmConf = $request->conf->getVal('scm', 'git'); $props = $scm->getProperties($commit, $request_file); - $content = self::highLight($extra['mime'], $scm->getFile($request_file_info)); + $content = IDF_FileUtil::highLight($extra['mime'], $scm->getFile($request_file_info)); return Pluf_Shortcuts_RenderToResponse('idf/source/'.$scmConf.'/file.html', array( 'page_title' => $page_title, @@ -451,121 +442,12 @@ class IDF_Views_Source */ public static function getRequestedFileMimeType($file_info, $commit, $scm) { - $mime = self::getMimeType($file_info->file); + $mime = IDF_FileUtil::getMimeType($file_info->file); if ('application/octet-stream' != $mime[0]) { return $mime; } - return self::getMimeTypeFromContent($file_info->file, - $scm->getFile($file_info)); - } - - /** - * Find the mime type of a file using the fileinfo class. - * - * @param string Filename/Filepath - * @param string File content - * @return array Mime type found or 'application/octet-stream', basename, extension - */ - public static function getMimeTypeFromContent($file, $filedata) - { - $info = pathinfo($file); - $res = array('application/octet-stream', - $info['basename'], - isset($info['extension']) ? $info['extension'] : 'bin'); - if (function_exists('finfo_open')) { - $finfo = finfo_open(FILEINFO_MIME); - $mime = finfo_buffer($finfo, $filedata); - finfo_close($finfo); - if ($mime) { - $res[0] = $mime; - } - if (!isset($info['extension']) && $mime) { - $res[2] = (0 === strpos($mime, 'text/')) ? 'txt' : 'bin'; - } elseif (!isset($info['extension'])) { - $res[2] = 'bin'; - } - } - return $res; - } - - /** - * Find the mime type of a file. - * - * Use /etc/mime.types to find the type. - * - * @param string Filename/Filepath - * @param array Mime type found or 'application/octet-stream', basename, extension - */ - public static function getMimeType($file) - { - $src= Pluf::f('idf_mimetypes_db', '/etc/mime.types'); - $mimes = preg_split("/\015\012|\015|\012/", file_get_contents($src)); - $info = pathinfo($file); - if (isset($info['extension'])) { - foreach ($mimes as $mime) { - if ('#' != substr($mime, 0, 1)) { - $elts = preg_split('/ |\t/', $mime, -1, PREG_SPLIT_NO_EMPTY); - if (in_array($info['extension'], $elts)) { - return array($elts[0], $info['basename'], $info['extension']); - } - } - } - } else { - // we consider that if no extension and base name is all - // uppercase, then we have a text file. - if ($info['basename'] == strtoupper($info['basename'])) { - return array('text/plain', $info['basename'], 'txt'); - } - $info['extension'] = 'bin'; - } - return array('application/octet-stream', $info['basename'], $info['extension']); - } - - /** - * Find if a given mime type is a text file. - * This uses the output of the self::getMimeType function. - * - * @param array (Mime type, file name, extension) - * @return bool Is text - */ - public static function isText($fileinfo) - { - if (0 === strpos($fileinfo[0], 'text/')) { - return true; - } - $ext = 'mdtext php-dist h gitignore diff patch'; - $extra_ext = trim(Pluf::f('idf_extra_text_ext', '')); - if (!empty($extra_ext)) - $ext .= ' ' . $extra_ext; - $ext = array_merge(self::$supportedExtenstions, explode(' ' , $ext)); - return (in_array($fileinfo[2], $ext)); - } - - public static function highLight($fileinfo, $content) - { - $pretty = ''; - if (self::isSupportedExtension($fileinfo[2])) { - $pretty = ' prettyprint'; - } - $table = array(); - $i = 1; - foreach (preg_split("/\015\012|\015|\012/", $content) as $line) { - $table[] = '' - .''; - $i++; - } - return Pluf_Template::markSafe(implode("\n", $table)); - } - - /** - * Test if an extension is supported by the syntax highlighter. - * - * @param string The extension to test - * @return bool - */ - public static function isSupportedExtension($extension) - { - return in_array($extension, self::$supportedExtenstions); + return IDF_FileUtil::getMimeTypeFromContent($file_info->file, + $scm->getFile($file_info)); } /** diff --git a/src/IDF/Views/User.php b/src/IDF/Views/User.php index 50f1579..6086ae2 100644 --- a/src/IDF/Views/User.php +++ b/src/IDF/Views/User.php @@ -33,13 +33,13 @@ Pluf::loadFunction('Pluf_Shortcuts_RenderToResponse'); class IDF_Views_User { /** - * Dashboard of a user. + * Dashboard of a user. * * Shows all the open issues assigned to the user. * * TODO: This views is a SQL horror. What needs to be done to cut * by many the number of SQL queries: - * - Add a table to cache the open/closed status ids for all the + * - Add a table to cache the open/closed status ids for all the * projects. * - Left join the issues with the project to get the shortname. * @@ -110,7 +110,10 @@ class IDF_Views_User $ext_pass = substr(sha1($request->user->password.Pluf::f('secret_key')), 0, 8); $params = array('user' => $request->user); if ($request->method == 'POST') { - $form = new IDF_Form_UserAccount($request->POST, $params); + $form = new IDF_Form_UserAccount(array_merge( + (array)$request->POST, + (array)$request->FILES + ), $params); if ($form->isValid()) { $user = $form->save(); $url = Pluf_HTTP_URL_urlForView('IDF_Views_User::myAccount'); @@ -121,10 +124,11 @@ class IDF_Views_User } else { $data = $request->user->getData(); unset($data['password']); - $form = new IDF_Form_UserAccount($data, $params); + $form = new IDF_Form_UserAccount(null, $params); } $keys = $request->user->get_idf_key_list(); - return Pluf_Shortcuts_RenderToResponse('idf/user/myaccount.html', + + return Pluf_Shortcuts_RenderToResponse('idf/user/myaccount.html', array('page_title' => __('Your Account'), 'api_key' => $api_key, 'ext_pass' => $ext_pass, @@ -170,11 +174,11 @@ class IDF_Views_User } else { $form = new IDF_Form_UserChangeEmail(); } - return Pluf_Shortcuts_RenderToResponse('idf/user/changeemail.html', + return Pluf_Shortcuts_RenderToResponse('idf/user/changeemail.html', array('page_title' => __('Confirm The Email Change'), 'form' => $form), $request); - + } /** @@ -208,13 +212,17 @@ class IDF_Views_User public function view($request, $match) { $sql = new Pluf_SQL('login=%s', array($match[1])); - $users = Pluf::factory('Pluf_User')->getList(array('filter'=>$sql->gen())); + $users = Pluf::factory('Pluf_User')->getList(array('filter'=>$sql->gen())); if (count($users) != 1 or !$users[0]->active) { throw new Pluf_HTTP_Error404(); } - return Pluf_Shortcuts_RenderToResponse('idf/user/public.html', - array('page_title' => (string) $users[0], - 'member' => $users[0], + + $user = $users[0]; + $user_data = IDF_UserData::factory($user); + return Pluf_Shortcuts_RenderToResponse('idf/user/public.html', + array('page_title' => (string) $user, + 'member' => $user, + 'user_data' => $user_data, ), $request); } @@ -230,11 +238,11 @@ class IDF_Views_User function IDF_Views_IssueSummaryAndLabels($field, $issue, $extra='') { $project = $issue->get_project(); - $edit = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::view', + $edit = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::view', array($project->shortname, $issue->id)); $tags = array(); foreach ($issue->get_tags_list() as $tag) { - $url = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::listLabel', + $url = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::listLabel', array($project->shortname, $tag->id, 'open')); $tags[] = sprintf('%s', $url, Pluf_esc((string) $tag)); } diff --git a/src/IDF/WikiRevision.php b/src/IDF/WikiRevision.php index 27504e0..5528a84 100644 --- a/src/IDF/WikiRevision.php +++ b/src/IDF/WikiRevision.php @@ -38,9 +38,9 @@ class IDF_WikiRevision extends Pluf_Model 'id' => array( 'type' => 'Pluf_DB_Field_Sequence', - 'blank' => true, + 'blank' => true, ), - 'wikipage' => + 'wikipage' => array( 'type' => 'Pluf_DB_Field_Foreignkey', 'model' => 'IDF_WikiPage', @@ -55,7 +55,7 @@ class IDF_WikiRevision extends Pluf_Model 'default' => false, 'help_text' => 'If this revision is the latest, we mark it as being the head revision.', 'index' => true, - + ), 'summary' => array( @@ -71,7 +71,7 @@ class IDF_WikiRevision extends Pluf_Model 'blank' => false, 'verbose' => __('content'), ), - 'submitter' => + 'submitter' => array( 'type' => 'Pluf_DB_Field_Foreignkey', 'model' => 'Pluf_User', @@ -92,7 +92,7 @@ class IDF_WikiRevision extends Pluf_Model 'verbose' => __('creation date'), ), ); - $this->_a['idx'] = array( + $this->_a['idx'] = array( 'creation_dtime_idx' => array( 'col' => 'creation_dtime', @@ -138,7 +138,7 @@ class IDF_WikiRevision extends Pluf_Model $sql = new Pluf_SQL('wikipage=%s', array($this->wikipage)); $rev = Pluf::factory('IDF_WikiRevision')->getList(array('filter'=>$sql->gen())); if ($rev->count() > 1) { - IDF_Timeline::insert($this, $this->get_wikipage()->get_project(), + IDF_Timeline::insert($this, $this->get_wikipage()->get_project(), $this->get_submitter()); foreach ($rev as $r) { if ($r->id != $this->id and $r->is_head) { @@ -156,7 +156,7 @@ class IDF_WikiRevision extends Pluf_Model public function timelineFragment($request) { $page = $this->get_wikipage(); - $url = Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::view', + $url = Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::view', array($request->project->shortname, $page->title)); $out = "\n".''; $out .= "\n".''; +
'.sprintf(__('Change of %s, by %s'), $url, Pluf_esc($page->title), $user).'
'; return Pluf_Template::markSafe($out); } @@ -195,13 +195,13 @@ class IDF_WikiRevision extends Pluf_Model $page = $this->get_wikipage(); if (!$this->is_head) { $url = Pluf::f('url_base') - .Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::view', + .Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::view', array($request->project->shortname, $page->title), array('rev' => $this->id)); } else { $url = Pluf::f('url_base') - .Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::view', + .Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::view', array($request->project->shortname, $page->title)); } @@ -248,7 +248,7 @@ class IDF_WikiRevision extends Pluf_Model } $current_locale = Pluf_Translation::getLocale(); $langs = Pluf::f('languages', array('en')); - Pluf_Translation::loadSetLocale($langs[0]); + Pluf_Translation::loadSetLocale($langs[0]); $context = new Pluf_Template_Context( array( 'page' => $this->get_wikipage(), @@ -260,23 +260,28 @@ class IDF_WikiRevision extends Pluf_Model if ($create) { $template = 'idf/wiki/wiki-created-email.txt'; $title = sprintf(__('New Documentation Page %s - %s (%s)'), - $this->get_wikipage()->title, - $this->get_wikipage()->summary, + $this->get_wikipage()->title, + $this->get_wikipage()->summary, $this->get_wikipage()->get_project()->shortname); } else { $template = 'idf/wiki/wiki-updated-email.txt'; $title = sprintf(__('Documentation Page Changed %s - %s (%s)'), - $this->get_wikipage()->title, - $this->get_wikipage()->summary, + $this->get_wikipage()->title, + $this->get_wikipage()->summary, $this->get_wikipage()->get_project()->shortname); } $tmpl = new Pluf_Template($template); $text_email = $tmpl->render($context); - $email = new Pluf_Mail(Pluf::f('from_email'), - $conf->getVal('wiki_notification_email'), - $title); - $email->addTextMessage($text_email); - $email->sendMail(); + + $addresses = explode(',', $conf->getVal('wiki_notification_email')); + foreach ($addresses as $address) { + $email = new Pluf_Mail(Pluf::f('from_email'), + $address, + $title); + $email->addTextMessage($text_email); + $email->sendMail(); + } + Pluf_Translation::loadSetLocale($current_locale); } } diff --git a/src/IDF/locale/fr/idf.po b/src/IDF/locale/fr/idf.po index 4be8ba9..f5d9316 100644 --- a/src/IDF/locale/fr/idf.po +++ b/src/IDF/locale/fr/idf.po @@ -2193,13 +2193,13 @@ msgid "" "If you are changing the email address of the user, you\n" "need to ensure that you are providing a valid email\n" "address" -msgstr "Si vous changez l'adresse email d'un utilisateur, vousdevez vous assurez que l'adresse est bien valide." +msgstr "Si vous changez l'adresse email d'un utilisateur, vous devez vous assurez que l'adresse est bien valide." #: IDF/gettexttemplates/idf/gadmin/users/update.html.php:6 msgid "" "If you give the user staff rights, the user will be\n" "able to create new projects and update other non staff users.\n" -msgstr "Si vous ajoutez un utilisateur au staff, l'utilisateur va avoirla possibilité de créer de nouveaux projets et d'éditer lesinformations des autres utilisateurs." +msgstr "Si vous ajoutez un utilisateur au staff, l'utilisateur va avoir la possibilité de créer de nouveaux projets et d'éditer les informations des autres utilisateurs." #: IDF/gettexttemplates/idf/gadmin/users/update.html.php:9 msgid "The form contains some errors. Please correct them to update the user." @@ -2321,7 +2321,7 @@ msgid "" "Attention! Deleting a project is a one second operation\n" "with the consequences that all the data related to the \n" "project will be deleted.\n" -msgstr "Attention ! Supprimer un projet est une opération rapide pour conséquencela suppression de toutes les données relatives au projet." +msgstr "Attention ! Supprimer un projet est une opération rapide qui a pour conséquence la suppression de toutes les données relatives au projet." #: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:10 msgid "The form contains some errors. Please correct them to delete the project." diff --git a/src/IDF/locale/zh/idf.po b/src/IDF/locale/zh/idf.po new file mode 100644 index 0000000..50cf382 --- /dev/null +++ b/src/IDF/locale/zh/idf.po @@ -0,0 +1,3668 @@ +msgid "" +msgstr "" +"Project-Id-Version: InDefero $Id\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-04-19 09:26+0200\n" +"PO-Revision-Date: 2010-08-17 19:22+0800\n" +"Last-Translator: Jerry \n" +"Language-Team: cakecode \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" +"X-Poedit-Language: Chinese\n" +"X-Poedit-Country: CHINA\n" +"X-Poedit-SourceCharset: utf-8\n" +"X-Poedit-Basepath: D:\\WebServ\\sites\\cakecode\\indefero\\src\n" + +#: IDF/Commit.php:54 +#: IDF/Conf.php:54 +#: IDF/Issue.php:52 +#: IDF/Queue.php:92 +#: IDF/Review.php:65 +#: IDF/Tag.php:52 +#: IDF/Upload.php:49 +#: IDF/WikiPage.php:54 +#: IDF/Search/Occ.php:69 +msgid "project" +msgstr "项目" + +#: IDF/Commit.php:62 +#: IDF/IssueComment.php:65 +#: IDF/IssueFile.php:57 +#: IDF/Issue.php:67 +#: IDF/Review.php:80 +#: IDF/Upload.php:85 +#: IDF/WikiPage.php:78 +#: IDF/WikiRevision.php:79 +#: IDF/Review/Comment.php:69 +msgid "submitter" +msgstr "上传者" + +#: IDF/Commit.php:86 +#: IDF/Issue.php:60 +#: IDF/Review.php:73 +#: IDF/Upload.php:57 +#: IDF/WikiPage.php:70 +#: IDF/WikiRevision.php:65 +#: IDF/Review/Patch.php:60 +msgid "summary" +msgstr "摘要" + +#: IDF/Commit.php:92 +msgid "changelog" +msgstr "修改日志" + +#: IDF/Commit.php:99 +#: IDF/IssueComment.php:79 +#: IDF/IssueFile.php:96 +#: IDF/Issue.php:105 +#: IDF/Review.php:108 +#: IDF/Upload.php:106 +#: IDF/WikiPage.php:100 +#: IDF/WikiRevision.php:92 +#: IDF/Review/FileComment.php:75 +#: IDF/Review/Patch.php:87 +#: IDF/Review/Comment.php:90 +msgid "creation date" +msgstr "创建日期" + +#: IDF/Commit.php:225 +#, php-format +msgid "Commit %s, by %s" +msgstr "" + +#: IDF/Commit.php:285 +#, php-format +msgid "New Commit %s - %s (%s)" +msgstr "" + +#: IDF/Conf.php:61 +#: IDF/Gconf.php:68 +msgid "key" +msgstr "键" + +#: IDF/Conf.php:67 +#: IDF/Gconf.php:74 +msgid "value" +msgstr "值" + +#: IDF/Gconf.php:55 +#: IDF/Search/Occ.php:56 +msgid "model class" +msgstr "" + +#: IDF/Gconf.php:61 +#: IDF/Search/Occ.php:62 +msgid "model id" +msgstr "" + +#: IDF/IssueComment.php:51 +msgid "issue" +msgstr "问题" + +#: IDF/IssueComment.php:58 +#: IDF/IssueFile.php:49 +#: IDF/Review/FileComment.php:49 +#: IDF/Review/FileComment.php:69 +#: IDF/Review/Comment.php:62 +msgid "comment" +msgstr "评论" + +#: IDF/IssueComment.php:72 +#: IDF/Upload.php:63 +#: IDF/WikiRevision.php:85 +#: IDF/Review/Comment.php:75 +msgid "changes" +msgstr "修改" + +#: IDF/IssueComment.php:73 +msgid "Serialized array of the changes in the issue." +msgstr "" + +#: IDF/IssueComment.php:143 +#: IDF/Issue.php:194 +#, php-format +msgid "Issue %3$d, %4$s" +msgstr "问题 %3$d, %4$s" + +#: IDF/IssueComment.php:151 +#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:12 +#: IDF/gettexttemplates/idf/issues/view.html.php:9 +#: IDF/gettexttemplates/idf/issues/feedfragment.xml.php:3 +#: IDF/gettexttemplates/idf/review/view.html.php:40 +#: IDF/gettexttemplates/idf/review/feedfragment.xml.php:3 +#: IDF/gettexttemplates/idf/wiki/wiki-updated-email.txt.php:6 +#: IDF/gettexttemplates/idf/wiki/wiki-updated-email.txt.php:11 +msgid "Summary:" +msgstr "摘要:" + +#: IDF/IssueComment.php:153 +#: IDF/gettexttemplates/idf/issues/issue-created-email.txt.php:7 +#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:7 +#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:13 +#: IDF/gettexttemplates/idf/issues/view.html.php:10 +#: IDF/gettexttemplates/idf/issues/view.html.php:20 +#: IDF/gettexttemplates/idf/issues/feedfragment.xml.php:4 +#: IDF/gettexttemplates/idf/review/review-updated-email.txt.php:10 +#: IDF/gettexttemplates/idf/review/review-created-email.txt.php:6 +#: IDF/gettexttemplates/idf/review/view.html.php:41 +#: IDF/gettexttemplates/idf/review/feedfragment.xml.php:4 +msgid "Status:" +msgstr "状态" + +#: IDF/IssueComment.php:155 +#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:14 +#: IDF/gettexttemplates/idf/issues/view.html.php:11 +#: IDF/gettexttemplates/idf/issues/view.html.php:21 +#: IDF/gettexttemplates/idf/issues/feedfragment.xml.php:5 +#: IDF/gettexttemplates/idf/review/feedfragment.xml.php:5 +msgid "Owner:" +msgstr "所有者" + +#: IDF/IssueComment.php:157 +#: IDF/WikiRevision.php:175 +#: IDF/gettexttemplates/idf/issues/issue-created-email.txt.php:9 +#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:10 +#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:15 +#: IDF/gettexttemplates/idf/issues/view.html.php:12 +#: IDF/gettexttemplates/idf/issues/view.html.php:23 +#: IDF/gettexttemplates/idf/issues/feedfragment.xml.php:6 +#: IDF/gettexttemplates/idf/review/review-updated-email.txt.php:13 +#: IDF/gettexttemplates/idf/review/review-created-email.txt.php:9 +#: IDF/gettexttemplates/idf/review/feedfragment.xml.php:6 +#: IDF/gettexttemplates/idf/downloads/download-created-email.txt.php:7 +#: IDF/gettexttemplates/idf/downloads/view.html.php:16 +#: IDF/gettexttemplates/idf/downloads/delete.html.php:11 +#: IDF/gettexttemplates/idf/wiki/deletepage.html.php:10 +#: IDF/gettexttemplates/idf/wiki/wiki-updated-email.txt.php:9 +#: IDF/gettexttemplates/idf/wiki/wiki-updated-email.txt.php:12 +#: IDF/gettexttemplates/idf/wiki/view.html.php:15 +#: IDF/gettexttemplates/idf/wiki/delete.html.php:13 +#: IDF/gettexttemplates/idf/wiki/wiki-created-email.txt.php:7 +msgid "Labels:" +msgstr "标签" + +#: IDF/IssueComment.php:171 +#, php-format +msgid "Comment on issue %d, by %s" +msgstr "评论 issue %d, 由 %s" + +#: IDF/IssueComment.php:182 +#, php-format +msgid "%s: Comment on issue %d - %s" +msgstr "" + +#: IDF/IssueFile.php:64 +msgid "file name" +msgstr "文件名" + +#: IDF/IssueFile.php:70 +msgid "the file" +msgstr "文件" + +#: IDF/IssueFile.php:76 +msgid "file size" +msgstr "文件大小" + +#: IDF/IssueFile.php:84 +msgid "type" +msgstr "类型" + +#: IDF/IssueFile.php:86 +msgid "Image" +msgstr "图片" + +#: IDF/IssueFile.php:87 +msgid "Other" +msgstr "其它" + +#: IDF/IssueFile.php:102 +#: IDF/Issue.php:111 +#: IDF/Review.php:114 +#: IDF/Upload.php:112 +#: IDF/WikiPage.php:106 +msgid "modification date" +msgstr "修改日期" + +#: IDF/Issue.php:76 +msgid "owner" +msgstr "所有者" + +#: IDF/Issue.php:84 +#: IDF/WikiPage.php:86 +msgid "interested users" +msgstr "" + +#: IDF/Issue.php:85 +msgid "Interested users will get an email notification when the issue is changed." +msgstr "" + +#: IDF/Issue.php:92 +#: IDF/Review.php:95 +#: IDF/Upload.php:93 +#: IDF/WikiPage.php:94 +msgid "labels" +msgstr "标签" + +#: IDF/Issue.php:99 +#: IDF/Review.php:102 +msgid "status" +msgstr "状态" + +#: IDF/Issue.php:196 +#, php-format +msgid "Creation of issue %d, by %s" +msgstr "" + +#: IDF/Issue.php:206 +#, php-format +msgid "%s: Issue %d created - %s" +msgstr "%s: Issue %d created - %s" + +#: IDF/Issue.php:270 +#, php-format +msgid "Issue %s - %s (%s)" +msgstr "" + +#: IDF/Issue.php:316 +#, php-format +msgid "Updated Issue %s - %s (%s)" +msgstr "" + +#: IDF/Key.php:49 +msgid "user" +msgstr "用户" + +#: IDF/Key.php:55 +msgid "ssh key" +msgstr "" + +#: IDF/Project.php:62 +#: IDF/Tag.php:66 +msgid "name" +msgstr "名称" + +#: IDF/Project.php:69 +msgid "short name" +msgstr "短名称" + +#: IDF/Project.php:70 +msgid "Used in the url to access the project, must be short with only letters and numbers." +msgstr "" + +#: IDF/Project.php:78 +msgid "short description" +msgstr "简要说明" + +#: IDF/Project.php:79 +msgid "A one line description of the project." +msgstr "项目简单描述" + +#: IDF/Project.php:86 +#: IDF/Review/Patch.php:74 +msgid "description" +msgstr "说明" + +#: IDF/Project.php:87 +msgid "The description can be extended using the markdown syntax." +msgstr "" + +#: IDF/Project.php:93 +msgid "private" +msgstr "私有" + +#: IDF/Project.php:130 +#, php-format +msgid "Project \"%s\" not found." +msgstr "" + +#: IDF/Tag.php:59 +msgid "tag class" +msgstr "" + +#: IDF/Tag.php:60 +msgid "The class of the tag." +msgstr "" + +#: IDF/Tag.php:73 +msgid "lcname" +msgstr "" + +#: IDF/Tag.php:74 +msgid "Lower case version of the name for fast searching." +msgstr "" + +#: IDF/Upload.php:70 +msgid "file" +msgstr "文件" + +#: IDF/Upload.php:71 +msgid "The path is relative to the upload path." +msgstr "" + +#: IDF/Upload.php:78 +msgid "file size in bytes" +msgstr "" + +#: IDF/Upload.php:100 +msgid "number of downloads" +msgstr "下载数量" + +#: IDF/Upload.php:189 +#, php-format +msgid "Download %2$d, %3$s" +msgstr "" + +#: IDF/Upload.php:192 +#, php-format +msgid "Addition of download %d, by %s" +msgstr "" + +#: IDF/Upload.php:202 +#, php-format +msgid "%s: Download %d added - %s" +msgstr "" + +#: IDF/Upload.php:242 +#, php-format +msgid "New download - %s (%s)" +msgstr "上传 - %s (%s)" + +#: IDF/Views.php:44 +#: IDF/gettexttemplates/idf/faq.html.php:35 +#: IDF/gettexttemplates/idf/faq-api.html.php:4 +#: IDF/gettexttemplates/idf/index.html.php:3 +#: IDF/gettexttemplates/idf/gadmin/base.html.php:9 +#: IDF/Views/Admin.php:57 +msgid "Projects" +msgstr "项目列表" + +#: IDF/Views.php:86 +#: IDF/gettexttemplates/idf/register/index.html.php:6 +#: IDF/gettexttemplates/idf/base-full.html.php:41 +msgid "Create Your Account" +msgstr "注册" + +#: IDF/Views.php:119 +#: IDF/Views.php:145 +msgid "Confirm Your Account Creation" +msgstr "" + +#: IDF/Views.php:165 +msgid "Welcome! You can now participate in the life of your project of choice." +msgstr "" + +#: IDF/Views.php:191 +#: IDF/Views.php:215 +#: IDF/Views.php:256 +msgid "Password Recovery" +msgstr "找回密码" + +#: IDF/Views.php:235 +msgid "Welcome back! Next time, you can use your broswer options to remember the password." +msgstr "欢迎回来!接下来,你可以使用浏览器记住你的密码" + +#: IDF/Views.php:277 +msgid "Here to Help You!" +msgstr "希望这些能帮到你" + +#: IDF/Views.php:293 +msgid "InDefero API (Application Programming Interface)" +msgstr "" + +#: IDF/WikiPage.php:62 +msgid "title" +msgstr "标题" + +#: IDF/WikiPage.php:63 +msgid "The title of the page must only contain letters, digits or the dash character. For example: My-new-Wiki-Page." +msgstr "" + +#: IDF/WikiPage.php:71 +msgid "A one line description of the page content." +msgstr "" + +#: IDF/WikiPage.php:196 +#: IDF/WikiRevision.php:167 +#, php-format +msgid "%2$s, %3$s" +msgstr "" + +#: IDF/WikiPage.php:198 +#, php-format +msgid "Creation of page %s, by %s" +msgstr "" + +#: IDF/WikiPage.php:208 +#, php-format +msgid "%s: Documentation page %s added - %s" +msgstr "" + +#: IDF/WikiRevision.php:48 +msgid "page" +msgstr "" + +#: IDF/WikiRevision.php:66 +msgid "A one line description of the changes." +msgstr "" + +#: IDF/WikiRevision.php:72 +msgid "content" +msgstr "" + +#: IDF/WikiRevision.php:189 +#, php-format +msgid "Change of %s, by %s" +msgstr "" + +#: IDF/WikiRevision.php:208 +#, php-format +msgid "%s: Documentation page %s updated - %s" +msgstr "" + +#: IDF/WikiRevision.php:262 +#, php-format +msgid "New Documentation Page %s - %s (%s)" +msgstr "" + +#: IDF/WikiRevision.php:268 +#, php-format +msgid "Documentation Page Changed %s - %s (%s)" +msgstr "" + +#: IDF/gettexttemplates/idf/project/timeline.html.php:3 +msgid "Latest updates" +msgstr "最近更新" + +#: IDF/gettexttemplates/idf/project/timeline.html.php:4 +#: IDF/gettexttemplates/idf/project/home.html.php:3 +#: IDF/gettexttemplates/idf/gadmin/home.html.php:4 +msgid "Welcome" +msgstr "欢迎" + +#: IDF/gettexttemplates/idf/project/timeline.html.php:5 +#: IDF/gettexttemplates/idf/project/home.html.php:4 +msgid "Latest Updates" +msgstr "项目更新" + +#: IDF/gettexttemplates/idf/project/timeline.html.php:6 +#: IDF/gettexttemplates/idf/project/home.html.php:5 +msgid "Featured Downloads" +msgstr "特色下载" + +#: IDF/gettexttemplates/idf/project/timeline.html.php:7 +#: IDF/gettexttemplates/idf/project/home.html.php:6 +#: IDF/gettexttemplates/idf/project/home.html.php:8 +msgid "show more..." +msgstr "显示更多..." + +#: IDF/gettexttemplates/idf/project/timeline.html.php:8 +#: IDF/gettexttemplates/idf/project/home.html.php:9 +msgid "Development Team" +msgstr "开发团队" + +#: IDF/gettexttemplates/idf/project/timeline.html.php:9 +#: IDF/gettexttemplates/idf/project/home.html.php:10 +msgid "Admins" +msgstr "管理员" + +#: IDF/gettexttemplates/idf/project/timeline.html.php:10 +#: IDF/gettexttemplates/idf/project/home.html.php:11 +msgid "Happy Crew" +msgstr "成员" + +#: IDF/gettexttemplates/idf/project/home.html.php:7 +msgid "Featured Documentation" +msgstr "" + +#: IDF/gettexttemplates/idf/login_form.html.php:3 +msgid "What is your login?" +msgstr "你的账户?" + +#: IDF/gettexttemplates/idf/login_form.html.php:4 +msgid "My login is" +msgstr "账号" + +#: IDF/gettexttemplates/idf/login_form.html.php:5 +msgid "Do you have a password?" +msgstr "你有一个密码?" + +#: IDF/gettexttemplates/idf/login_form.html.php:6 +msgid "No, I am a new here." +msgstr "不,我是新用户" + +#: IDF/gettexttemplates/idf/login_form.html.php:7 +#: IDF/Views/Admin.php:322 +msgid "Yes" +msgstr "是" + +#: IDF/gettexttemplates/idf/login_form.html.php:8 +msgid "my password is" +msgstr "密码" + +#: IDF/gettexttemplates/idf/login_form.html.php:9 +msgid "Sign in" +msgstr "登录" + +#: IDF/gettexttemplates/idf/login_form.html.php:10 +msgid "I lost my password!" +msgstr "忘记密码!" + +#: IDF/gettexttemplates/idf/issues/attachment.html.php:3 +#, php-format +msgid "Attachment to issue %%issue.id%%" +msgstr "" + +#: IDF/gettexttemplates/idf/issues/attachment.html.php:4 +#: IDF/gettexttemplates/idf/issues/view.html.php:7 +#: IDF/gettexttemplates/idf/downloads/view.html.php:4 +#: IDF/gettexttemplates/idf/downloads/delete.html.php:5 +#: IDF/gettexttemplates/idf/wiki/deletepage.html.php:4 +#: IDF/gettexttemplates/idf/wiki/deletepage.html.php:5 +#: IDF/gettexttemplates/idf/wiki/view.html.php:8 +#: IDF/gettexttemplates/idf/wiki/view.html.php:9 +#: IDF/gettexttemplates/idf/wiki/delete.html.php:7 +#: IDF/gettexttemplates/idf/wiki/delete.html.php:8 +#, php-format +msgid "by %%submitter%%" +msgstr "" + +#: IDF/gettexttemplates/idf/issues/attachment.html.php:5 +#: IDF/gettexttemplates/idf/review/view.html.php:34 +#: IDF/gettexttemplates/idf/source/mercurial/tree.html.php:11 +#: IDF/gettexttemplates/idf/source/mercurial/file.html.php:6 +#: IDF/gettexttemplates/idf/source/svn/file.html.php:8 +#: IDF/gettexttemplates/idf/source/git/tree.html.php:11 +#: IDF/gettexttemplates/idf/source/git/file.html.php:6 +#: IDF/gettexttemplates/idf/source/commit.html.php:11 +msgid "Archive" +msgstr "归档" + +#: IDF/gettexttemplates/idf/issues/attachment.html.php:6 +#: IDF/gettexttemplates/idf/source/mercurial/file.html.php:7 +#: IDF/gettexttemplates/idf/source/svn/file.html.php:9 +#: IDF/gettexttemplates/idf/source/git/file.html.php:7 +msgid "Download this file" +msgstr "下载此文件" + +#: IDF/gettexttemplates/idf/issues/attachment.html.php:7 +#: IDF/gettexttemplates/idf/issues/view.html.php:18 +#: IDF/gettexttemplates/idf/review/view.html.php:25 +#: IDF/gettexttemplates/idf/wiki/deletepage.html.php:8 +#: IDF/gettexttemplates/idf/wiki/view.html.php:13 +#: IDF/gettexttemplates/idf/wiki/delete.html.php:11 +msgid "Created:" +msgstr "创建:" + +#: IDF/gettexttemplates/idf/issues/issue-created-email.txt.php:3 +msgid "" +"A new issue has been created and assigned\n" +"to you:" +msgstr "有一个新问题需要你来处理:" + +#: IDF/gettexttemplates/idf/issues/issue-created-email.txt.php:5 +#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:5 +#: IDF/gettexttemplates/idf/review/review-updated-email.txt.php:8 +#: IDF/gettexttemplates/idf/review/review-created-email.txt.php:4 +#: IDF/gettexttemplates/idf/downloads/download-created-email.txt.php:4 +#: IDF/gettexttemplates/idf/source/commit-created-email.txt.php:4 +#: IDF/gettexttemplates/idf/wiki/wiki-updated-email.txt.php:4 +#: IDF/gettexttemplates/idf/wiki/wiki-created-email.txt.php:4 +msgid "Hello," +msgstr "你好," + +#: IDF/gettexttemplates/idf/issues/issue-created-email.txt.php:6 +#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:6 +#: IDF/gettexttemplates/idf/review/review-updated-email.txt.php:9 +#: IDF/gettexttemplates/idf/review/review-created-email.txt.php:5 +#: IDF/gettexttemplates/idf/downloads/download-created-email.txt.php:5 +#: IDF/gettexttemplates/idf/source/commit-created-email.txt.php:6 +#: IDF/gettexttemplates/idf/wiki/wiki-updated-email.txt.php:5 +#: IDF/gettexttemplates/idf/wiki/wiki-created-email.txt.php:5 +msgid "Project:" +msgstr "项目:" + +#: IDF/gettexttemplates/idf/issues/issue-created-email.txt.php:8 +#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:8 +#: IDF/gettexttemplates/idf/review/review-updated-email.txt.php:11 +#: IDF/gettexttemplates/idf/review/review-created-email.txt.php:7 +msgid "Reported by:" +msgstr "报告人:" + +#: IDF/gettexttemplates/idf/issues/issue-created-email.txt.php:10 +#: IDF/gettexttemplates/idf/review/view.html.php:30 +#: IDF/gettexttemplates/idf/downloads/download-created-email.txt.php:9 +msgid "Description:" +msgstr "描述:" + +#: IDF/gettexttemplates/idf/issues/issue-created-email.txt.php:11 +#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:16 +#: IDF/gettexttemplates/idf/gadmin/projects/index.html.php:5 +msgid "Attachments:" +msgstr "附件:" + +#: IDF/gettexttemplates/idf/issues/issue-created-email.txt.php:12 +#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:17 +msgid "Issue:" +msgstr "" + +#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:3 +msgid "The following issue has been updated:" +msgstr "你关注的问题更新了:" + +#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:4 +#: IDF/gettexttemplates/idf/review/review-updated-email.txt.php:4 +#, php-format +msgid "By %%who%%, %%c.creation_dtime%%:" +msgstr "" + +#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:9 +#: IDF/gettexttemplates/idf/review/review-updated-email.txt.php:12 +#: IDF/gettexttemplates/idf/review/review-created-email.txt.php:8 +msgid "URL:" +msgstr "" + +#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:11 +msgid "Comments (last first):" +msgstr "" + +#: IDF/gettexttemplates/idf/issues/my-issues.html.php:3 +#, php-format +msgid "See the %%nb_submit_closed%% closed." +msgid_plural "See the %%nb_submit_closed%% closed." +msgstr[0] "" +msgstr[1] "" + +#: IDF/gettexttemplates/idf/issues/my-issues.html.php:4 +#, php-format +msgid "See the %%nb_owner_closed%% closed." +msgid_plural "See the %%nb_owner_closed%% closed." +msgstr[0] "" +msgstr[1] "" + +#: IDF/gettexttemplates/idf/issues/my-issues.html.php:5 +#: IDF/gettexttemplates/idf/issues/base.html.php:4 +#: IDF/gettexttemplates/idf/issues/by-label.html.php:6 +#: IDF/gettexttemplates/idf/issues/index.html.php:5 +#: IDF/gettexttemplates/idf/issues/search.html.php:3 +msgid "New Issue" +msgstr "新问题" + +#: IDF/gettexttemplates/idf/issues/my-issues.html.php:6 +#: IDF/gettexttemplates/idf/user/dashboard.html.php:6 +msgid "Submitted issues:" +msgstr "发布的问题:" + +#: IDF/gettexttemplates/idf/issues/my-issues.html.php:7 +#: IDF/gettexttemplates/idf/user/dashboard.html.php:5 +msgid "Working issues:" +msgstr "处理中的问题:" + +#: IDF/gettexttemplates/idf/issues/base.html.php:3 +msgid "Open Issues" +msgstr "开放的问题" + +#: IDF/gettexttemplates/idf/issues/base.html.php:5 +msgid "My Issues" +msgstr "我的问题" + +#: IDF/gettexttemplates/idf/issues/base.html.php:6 +#: IDF/gettexttemplates/idf/wiki/base.html.php:6 +msgid "Search" +msgstr "搜索" + +#: IDF/gettexttemplates/idf/issues/base.html.php:7 +msgid "Back to the issue" +msgstr "返回问题" + +#: IDF/gettexttemplates/idf/issues/by-label.html.php:3 +#, php-format +msgid "" +"

Open issues: %%open%%

\n" +"

Closed issues: %%closed%%

\n" +msgstr "" +"

开放的问题: %%open%%

\n" +"

已关闭的问题: %%closed%%

\n" + +#: IDF/gettexttemplates/idf/issues/by-label.html.php:7 +msgid "Label:" +msgstr "标签:" + +#: IDF/gettexttemplates/idf/issues/by-label.html.php:8 +msgid "Completion:" +msgstr "完成率:" + +#: IDF/gettexttemplates/idf/issues/index.html.php:3 +#, fuzzy, php-format +msgid "" +"

Open issues: %%open%%

\n" +"

Closed issues: %%closed%%

" +msgstr "" +"

开放的问题: %%open%%

\n" +"

已关闭的问题: %%closed%%

\n" + +#: IDF/gettexttemplates/idf/issues/create.html.php:3 +msgid "" +"

When you submit the issue do not forget to provide the following information:

\n" +"" +msgstr "" +"

提交的问题是,不要忘记提供以下资料:

\n" +"" + +#: IDF/gettexttemplates/idf/issues/create.html.php:10 +msgid "The form contains some errors. Please correct them to submit the issue." +msgstr "" + +#: IDF/gettexttemplates/idf/issues/create.html.php:11 +#: IDF/gettexttemplates/idf/issues/create.html.php:13 +#: IDF/gettexttemplates/idf/issues/view.html.php:14 +#: IDF/gettexttemplates/idf/issues/view.html.php:16 +#: IDF/gettexttemplates/idf/wiki/update.html.php:5 +#: IDF/gettexttemplates/idf/wiki/create.html.php:5 +msgid "Preview" +msgstr "预览" + +#: IDF/gettexttemplates/idf/issues/create.html.php:12 +msgid "Submit Issue" +msgstr "提交问题" + +#: IDF/gettexttemplates/idf/issues/create.html.php:14 +#: IDF/gettexttemplates/idf/issues/view.html.php:17 +#: IDF/gettexttemplates/idf/review/create.html.php:12 +#: IDF/gettexttemplates/idf/review/view.html.php:43 +#: IDF/gettexttemplates/idf/downloads/submit.html.php:9 +#: IDF/gettexttemplates/idf/downloads/view.html.php:8 +#: IDF/gettexttemplates/idf/downloads/delete.html.php:7 +#: IDF/gettexttemplates/idf/user/passrecovery.html.php:7 +#: IDF/gettexttemplates/idf/user/myaccount.html.php:10 +#: IDF/gettexttemplates/idf/user/passrecovery-inputkey.html.php:5 +#: IDF/gettexttemplates/idf/user/changeemail.html.php:5 +#: IDF/gettexttemplates/idf/user/passrecovery-ask.html.php:5 +#: IDF/gettexttemplates/idf/wiki/deletepage.html.php:7 +#: IDF/gettexttemplates/idf/wiki/update.html.php:7 +#: IDF/gettexttemplates/idf/wiki/create.html.php:7 +#: IDF/gettexttemplates/idf/wiki/delete.html.php:10 +#: IDF/gettexttemplates/idf/gadmin/users/update.html.php:12 +#: IDF/gettexttemplates/idf/gadmin/users/create.html.php:5 +#: IDF/gettexttemplates/idf/gadmin/projects/update.html.php:16 +#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:21 +#: IDF/gettexttemplates/idf/register/index.html.php:7 +#: IDF/gettexttemplates/idf/register/confirmation.html.php:7 +#: IDF/gettexttemplates/idf/register/inputkey.html.php:5 +msgid "Cancel" +msgstr "取消" + +#: IDF/gettexttemplates/idf/issues/create.html.php:15 +#: IDF/gettexttemplates/idf/issues/view.html.php:24 +msgid "Attach file" +msgstr "附件" + +#: IDF/gettexttemplates/idf/issues/create.html.php:16 +#: IDF/gettexttemplates/idf/issues/create.html.php:17 +#: IDF/gettexttemplates/idf/issues/view.html.php:25 +#: IDF/gettexttemplates/idf/issues/view.html.php:26 +msgid "Attach another file" +msgstr "其它附件" + +#: IDF/gettexttemplates/idf/issues/search.html.php:4 +msgid "Found issues:" +msgstr "找到问题:" + +#: IDF/gettexttemplates/idf/issues/view.html.php:3 +#, php-format +msgid "Reported by %%submitter%%, %%c.creation_dtime%%" +msgstr "由 %%submitter%%, 报告于 %%c.creation_dtime%%" + +#: IDF/gettexttemplates/idf/issues/view.html.php:4 +#: IDF/gettexttemplates/idf/review/view.html.php:22 +#, php-format +msgid "Comment %%i%% by %%submitter%%, %%c.creation_dtime%%" +msgstr "评论 %%i%% 由 %%submitter%%, 发表于 %%c.creation_dtime%%" + +#: IDF/gettexttemplates/idf/issues/view.html.php:5 +#, php-format +msgid "Sign in to reply to this comment." +msgstr "登录 后回复此评论" + +#: IDF/gettexttemplates/idf/issues/view.html.php:6 +msgid "This issue is marked as closed, add a comment only if you think this issue is still valid and more work is needed to fully fix it." +msgstr "" + +#: IDF/gettexttemplates/idf/issues/view.html.php:8 +#, php-format +msgid "%%interested%% person" +msgstr "%%interested%% 人" + +#: IDF/gettexttemplates/idf/issues/view.html.php:13 +msgid "The form contains some errors. Please correct them to change the issue." +msgstr "" + +#: IDF/gettexttemplates/idf/issues/view.html.php:15 +msgid "Submit Changes" +msgstr "提交修改" + +#: IDF/gettexttemplates/idf/issues/view.html.php:19 +#: IDF/gettexttemplates/idf/review/view.html.php:26 +#: IDF/gettexttemplates/idf/downloads/view.html.php:14 +#: IDF/gettexttemplates/idf/downloads/delete.html.php:9 +#: IDF/gettexttemplates/idf/wiki/deletepage.html.php:9 +#: IDF/gettexttemplates/idf/wiki/view.html.php:14 +#: IDF/gettexttemplates/idf/wiki/delete.html.php:12 +msgid "Updated:" +msgstr "更新:" + +#: IDF/gettexttemplates/idf/issues/view.html.php:22 +msgid "Followed by:" +msgstr "关注:" + +#: IDF/gettexttemplates/idf/faq.html.php:3 +msgid "" +"

This is simple:

\n" +"
    \n" +"
  1. Write in the comments \"This is a duplicate of issue 123\", change 123 with the corresponding issue number.
  2. \n" +"
  3. Change the status of the current issue to Duplicate.
  4. \n" +"
  5. Submit the changes.
  6. \n" +"
" +msgstr "" + +#: IDF/gettexttemplates/idf/faq.html.php:9 +msgid "You need to create an account on Gravatar, this takes about 5 minutes and is free." +msgstr "" + +#: IDF/gettexttemplates/idf/faq.html.php:10 +msgid "The API (Application Programming Interface) is used to interact with InDefero with another program. For example, this can be used to create a desktop program to submit new tickets easily." +msgstr "" + +#: IDF/gettexttemplates/idf/faq.html.php:11 +#, php-format +msgid "Learn more about the API." +msgstr "" + +#: IDF/gettexttemplates/idf/faq.html.php:12 +#: IDF/gettexttemplates/idf/faq.html.php:16 +msgid "What are the keyboard shortcuts?" +msgstr "" + +#: IDF/gettexttemplates/idf/faq.html.php:13 +#: IDF/gettexttemplates/idf/faq.html.php:31 +msgid "How to mark an issue as duplicate?" +msgstr "" + +#: IDF/gettexttemplates/idf/faq.html.php:14 +#: IDF/gettexttemplates/idf/faq.html.php:32 +msgid "How can I display my head next to my comments?" +msgstr "" + +#: IDF/gettexttemplates/idf/faq.html.php:15 +#: IDF/gettexttemplates/idf/faq.html.php:33 +msgid "What is the API and how to use it?" +msgstr "" + +#: IDF/gettexttemplates/idf/faq.html.php:17 +msgid "Shift+h: This help page." +msgstr "" + +#: IDF/gettexttemplates/idf/faq.html.php:18 +msgid "If you are in a project, you have the following shortcuts:" +msgstr "如果你在一个项目中,你有以下快捷方式:" + +#: IDF/gettexttemplates/idf/faq.html.php:19 +msgid "Shift+u: Project updates." +msgstr "" + +#: IDF/gettexttemplates/idf/faq.html.php:20 +msgid "Shift+d: Downloads." +msgstr "" + +#: IDF/gettexttemplates/idf/faq.html.php:21 +msgid "Shift+o: Documentation." +msgstr "" + +#: IDF/gettexttemplates/idf/faq.html.php:22 +msgid "Shift+a: Create a new issue." +msgstr "" + +#: IDF/gettexttemplates/idf/faq.html.php:23 +msgid "Shift+i: List of open issues." +msgstr "" + +#: IDF/gettexttemplates/idf/faq.html.php:24 +msgid "Shift+m: The issues you submitted." +msgstr "" + +#: IDF/gettexttemplates/idf/faq.html.php:25 +msgid "Shift+w: The issues assigned to you." +msgstr "" + +#: IDF/gettexttemplates/idf/faq.html.php:26 +msgid "Shift+s: Source." +msgstr "" + +#: IDF/gettexttemplates/idf/faq.html.php:27 +msgid "You also have the standard access keys:" +msgstr "" + +#: IDF/gettexttemplates/idf/faq.html.php:28 +msgid "Alt+1: Home." +msgstr "" + +#: IDF/gettexttemplates/idf/faq.html.php:29 +msgid "Alt+2: Skip the menus." +msgstr "" + +#: IDF/gettexttemplates/idf/faq.html.php:30 +msgid "Alt+4: Search (when available)." +msgstr "" + +#: IDF/gettexttemplates/idf/faq.html.php:34 +#: IDF/gettexttemplates/idf/faq-api.html.php:3 +msgid "Here we are, just to help you." +msgstr "" + +#: IDF/gettexttemplates/idf/review/review-updated-email.txt.php:3 +msgid "The following review has been updated:" +msgstr "" + +#: IDF/gettexttemplates/idf/review/review-updated-email.txt.php:5 +#, php-format +msgid "" +"By %%who%%, %%c.creation_dtime%%, on file:\n" +"%%c.cfile%%\n" +msgstr "" + +#: IDF/gettexttemplates/idf/review/review-updated-email.txt.php:14 +msgid "General comments (last first):" +msgstr "" + +#: IDF/gettexttemplates/idf/review/review-updated-email.txt.php:15 +msgid "Detailed file comments (last first):" +msgstr "" + +#: IDF/gettexttemplates/idf/review/review-updated-email.txt.php:16 +#: IDF/gettexttemplates/idf/review/review-created-email.txt.php:10 +msgid "Review:" +msgstr "" + +#: IDF/gettexttemplates/idf/review/base.html.php:3 +#: IDF/gettexttemplates/idf/review/base-full.html.php:3 +msgid "Open Reviews" +msgstr "开放的审核" + +#: IDF/gettexttemplates/idf/review/base.html.php:4 +#: IDF/gettexttemplates/idf/review/index.html.php:3 +#: IDF/gettexttemplates/idf/review/create.html.php:11 +#: IDF/Views/Review.php:83 +msgid "Start Code Review" +msgstr "添加代码审核" + +#: IDF/gettexttemplates/idf/review/review-created-email.txt.php:3 +msgid "The following review has been created:" +msgstr "" + +#: IDF/gettexttemplates/idf/review/create.html.php:3 +msgid "" +"

To start a code review, you need to provide:

\n" +"" +msgstr "" + +#: IDF/gettexttemplates/idf/review/create.html.php:9 +msgid "The form contains some errors. Please correct them to submit the code review." +msgstr "" + +#: IDF/gettexttemplates/idf/review/create.html.php:10 +msgid "Select the commit against which you created your patch to be sure it applies correctly." +msgstr "" + +#: IDF/gettexttemplates/idf/review/view.html.php:3 +#: IDF/gettexttemplates/idf/source/commit.html.php:3 +#, php-format +msgid "%%ndiff%% diff" +msgid_plural "%%ndiff%% diffs" +msgstr[0] "" +msgstr[1] "" + +#: IDF/gettexttemplates/idf/review/view.html.php:4 +#, php-format +msgid "%%nc%% comment" +msgid_plural "%%nc%% comments" +msgstr[0] "" +msgstr[1] "" + +#: IDF/gettexttemplates/idf/review/view.html.php:5 +msgid "" +"Code review is a process in which\n" +"after or before changes are commited into the code repository,\n" +"different people discuss the code changes. The goal is\n" +"to improve the quality of the code and the\n" +"contributions, as such, you must be pragmatic when writing\n" +"your review. Correctly mention the line numbers (in the old or in the\n" +"new file) and try to keep a good balance between seriousness and fun.\n" +msgstr "" + +#: IDF/gettexttemplates/idf/review/view.html.php:13 +msgid "" +"\n" +"Proposing code for review is intimidating, you know\n" +"you will receive critics, so please, as a reviewer, keep this\n" +"process fun, use it to help your contributor learn your\n" +"coding standards and the structure of the code and make them want\n" +"to propose more contributions.\n" +msgstr "" + +#: IDF/gettexttemplates/idf/review/view.html.php:20 +#, php-format +msgid "Comment %%i%% by %%who%%, %%c.creation_dtime%%" +msgstr "" + +#: IDF/gettexttemplates/idf/review/view.html.php:21 +#, php-format +msgid "Your comments on the changes in file %%file%%:" +msgstr "" + +#: IDF/gettexttemplates/idf/review/view.html.php:23 +#, php-format +msgid "Sign in to participate in the review." +msgstr "" + +#: IDF/gettexttemplates/idf/review/view.html.php:24 +msgid "The form contains some errors. Please correct them to submit your review." +msgstr "" + +#: IDF/gettexttemplates/idf/review/view.html.php:27 +#: IDF/gettexttemplates/idf/source/commit.html.php:5 +msgid "Author:" +msgstr "作者:" + +#: IDF/gettexttemplates/idf/review/view.html.php:28 +#: IDF/gettexttemplates/idf/source/commit-created-email.txt.php:5 +#: IDF/gettexttemplates/idf/source/commit.html.php:6 +msgid "Commit:" +msgstr "" + +#: IDF/gettexttemplates/idf/review/view.html.php:29 +#: IDF/gettexttemplates/idf/source/commit.html.php:7 +msgid "View corresponding source tree" +msgstr "" + +#: IDF/gettexttemplates/idf/review/view.html.php:31 +msgid "Reviewers:" +msgstr "" + +#: IDF/gettexttemplates/idf/review/view.html.php:32 +msgid "No reviewers at the moment." +msgstr "" + +#: IDF/gettexttemplates/idf/review/view.html.php:33 +#: IDF/gettexttemplates/idf/source/commit.html.php:9 +msgid "Files:" +msgstr "文件:" + +#: IDF/gettexttemplates/idf/review/view.html.php:35 +#: IDF/gettexttemplates/idf/source/commit.html.php:12 +msgid "Download the corresponding diff file" +msgstr "" + +#: IDF/gettexttemplates/idf/review/view.html.php:36 +msgid "How to Participate in a Code Review" +msgstr "" + +#: IDF/gettexttemplates/idf/review/view.html.php:37 +msgid "Old" +msgstr "旧" + +#: IDF/gettexttemplates/idf/review/view.html.php:38 +msgid "New" +msgstr "新" + +#: IDF/gettexttemplates/idf/review/view.html.php:39 +msgid "General Comments" +msgstr "" + +#: IDF/gettexttemplates/idf/review/view.html.php:42 +msgid "Submit Code Review" +msgstr "" + +#: IDF/gettexttemplates/idf/downloads/download-created-email.txt.php:3 +msgid "A new file is available for download:" +msgstr "" + +#: IDF/gettexttemplates/idf/downloads/download-created-email.txt.php:6 +msgid "Submitted by:" +msgstr "" + +#: IDF/gettexttemplates/idf/downloads/download-created-email.txt.php:8 +msgid "Download:" +msgstr "下载:" + +#: IDF/gettexttemplates/idf/downloads/submit.html.php:3 +msgid "" +"Each file must have a distinct name and file contents\n" +"cannot be changed, so be sure to include release numbers in each file\n" +"name." +msgstr "每个文件名称都必须唯一用且内容不能修改
因此请确保文件版本号包含在文件名中" + +#: IDF/gettexttemplates/idf/downloads/submit.html.php:6 +#, php-format +msgid "You can use the Markdown syntax for the description." +msgstr "你可以在描述中使用 Markdown 语法" + +#: IDF/gettexttemplates/idf/downloads/submit.html.php:7 +msgid "The form contains some errors. Please correct them to submit the file." +msgstr "" + +#: IDF/gettexttemplates/idf/downloads/submit.html.php:8 +msgid "Submit File" +msgstr "提交文件" + +#: IDF/gettexttemplates/idf/downloads/submit.html.php:10 +#: IDF/gettexttemplates/idf/user/passrecovery-inputkey.html.php:6 +#: IDF/gettexttemplates/idf/user/changeemail.html.php:6 +#: IDF/gettexttemplates/idf/register/inputkey.html.php:6 +msgid "Instructions" +msgstr "提示" + +#: IDF/gettexttemplates/idf/downloads/base.html.php:3 +#: IDF/gettexttemplates/idf/base.html.php:12 +#: IDF/gettexttemplates/idf/admin/base.html.php:4 +#: IDF/gettexttemplates/idf/base-full.html.php:11 +#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:14 +#: IDF/Form/TabsConf.php:38 +msgid "Downloads" +msgstr "下载列表" + +#: IDF/gettexttemplates/idf/downloads/base.html.php:4 +#: IDF/gettexttemplates/idf/downloads/index.html.php:4 +#: IDF/Views/Download.php:193 +msgid "New Download" +msgstr "上传" + +#: IDF/gettexttemplates/idf/downloads/index.html.php:3 +#, php-format +msgid "See the deprecated files." +msgstr "" + +#: IDF/gettexttemplates/idf/downloads/index.html.php:5 +msgid "Number of files:" +msgstr "文件数目:" + +#: IDF/gettexttemplates/idf/downloads/view.html.php:3 +msgid "Attention! This file is marked as deprecated, download it only if you are sure you need this specific version." +msgstr "" + +#: IDF/gettexttemplates/idf/downloads/view.html.php:5 +msgid "Changes" +msgstr "修改" + +#: IDF/gettexttemplates/idf/downloads/view.html.php:6 +msgid "The form contains some errors. Please correct them to update the file." +msgstr "" + +#: IDF/gettexttemplates/idf/downloads/view.html.php:7 +msgid "Update File" +msgstr "更新文件" + +#: IDF/gettexttemplates/idf/downloads/view.html.php:9 +#: IDF/gettexttemplates/idf/downloads/view.html.php:11 +msgid "Remove this file" +msgstr "删除此文件" + +#: IDF/gettexttemplates/idf/downloads/view.html.php:10 +#: IDF/gettexttemplates/idf/wiki/update.html.php:9 +#: IDF/gettexttemplates/idf/wiki/view.html.php:11 +#: IDF/gettexttemplates/idf/gadmin/projects/update.html.php:18 +msgid "Trash" +msgstr "回收" + +#: IDF/gettexttemplates/idf/downloads/view.html.php:12 +msgid "Delete this file" +msgstr "删除此文件" + +#: IDF/gettexttemplates/idf/downloads/view.html.php:13 +#: IDF/gettexttemplates/idf/downloads/delete.html.php:8 +msgid "Uploaded:" +msgstr "上传时间:" + +#: IDF/gettexttemplates/idf/downloads/view.html.php:15 +#: IDF/gettexttemplates/idf/downloads/delete.html.php:10 +#: IDF/gettexttemplates/idf/gadmin/projects/index.html.php:6 +msgid "Downloads:" +msgstr "下载:" + +#: IDF/gettexttemplates/idf/downloads/delete.html.php:3 +msgid "Attention! If you want to delete a specific version of your software, maybe, someone is depending on this specific version to run his systems. Are you sure, you will not affect anybody when removing this file?" +msgstr "" + +#: IDF/gettexttemplates/idf/downloads/delete.html.php:4 +#, php-format +msgid "Instead of deleting the file, you could mark it as deprecated." +msgstr "" + +#: IDF/gettexttemplates/idf/downloads/delete.html.php:6 +msgid "Delete File" +msgstr "删除文件" + +#: IDF/gettexttemplates/idf/downloads/feedfragment.xml.php:3 +msgid "Details" +msgstr "详情" + +#: IDF/gettexttemplates/idf/base.html.php:3 +#: IDF/gettexttemplates/idf/base-simple.html.php:3 +#: IDF/gettexttemplates/idf/base-full.html.php:3 +#: IDF/gettexttemplates/idf/gadmin/base.html.php:3 +#, php-format +msgid "Welcome, %%user%%." +msgstr "欢迎,%%user%%" + +#: IDF/gettexttemplates/idf/base.html.php:4 +#: IDF/gettexttemplates/idf/base-full.html.php:4 +#, php-format +msgid "Sign in or create your account to create issues or add comments" +msgstr "登录 以便提交问题或评论" + +#: IDF/gettexttemplates/idf/base.html.php:5 +#: IDF/gettexttemplates/idf/base-simple.html.php:4 +#: IDF/gettexttemplates/idf/base-full.html.php:5 +#: IDF/gettexttemplates/idf/gadmin/base.html.php:4 +msgid "Sign Out" +msgstr "退出" + +#: IDF/gettexttemplates/idf/base.html.php:6 +#: IDF/gettexttemplates/idf/base-simple.html.php:5 +#: IDF/gettexttemplates/idf/base-full.html.php:6 +msgid "Sign in or create your account" +msgstr "登录或创建新用户" + +#: IDF/gettexttemplates/idf/base.html.php:7 +#: IDF/gettexttemplates/idf/base-simple.html.php:6 +#: IDF/gettexttemplates/idf/base-full.html.php:7 +#: IDF/gettexttemplates/idf/gadmin/projects/base.html.php:3 +#: IDF/gettexttemplates/idf/gadmin/base.html.php:5 +msgid "Project List" +msgstr "项目列表" + +#: IDF/gettexttemplates/idf/base.html.php:8 +#: IDF/gettexttemplates/idf/base-simple.html.php:7 +#: IDF/gettexttemplates/idf/gadmin/base.html.php:6 +#: IDF/Views/Admin.php:42 +msgid "Forge Management" +msgstr "系统管理" + +#: IDF/gettexttemplates/idf/base.html.php:9 +#: IDF/gettexttemplates/idf/base-simple.html.php:8 +#: IDF/gettexttemplates/idf/base-full.html.php:8 +#: IDF/gettexttemplates/idf/gadmin/base.html.php:7 +msgid "Help and accessibility features" +msgstr "帮助和辅助功能" + +#: IDF/gettexttemplates/idf/base.html.php:10 +#: IDF/gettexttemplates/idf/source/mercurial/tree.html.php:14 +#: IDF/gettexttemplates/idf/source/svn/tree.html.php:14 +#: IDF/gettexttemplates/idf/source/git/tree.html.php:14 +#: IDF/gettexttemplates/idf/base-simple.html.php:9 +#: IDF/gettexttemplates/idf/base-full.html.php:9 +#: IDF/gettexttemplates/idf/gadmin/base.html.php:8 +msgid "Help" +msgstr "帮助" + +#: IDF/gettexttemplates/idf/base.html.php:11 +#: IDF/gettexttemplates/idf/base-full.html.php:10 +msgid "Project Home" +msgstr "项目首页" + +#: IDF/gettexttemplates/idf/base.html.php:13 +#: IDF/gettexttemplates/idf/admin/base.html.php:5 +#: IDF/gettexttemplates/idf/base-full.html.php:12 +#: IDF/Form/TabsConf.php:40 +msgid "Documentation" +msgstr "文档" + +#: IDF/gettexttemplates/idf/base.html.php:14 +#: IDF/gettexttemplates/idf/base-full.html.php:13 +#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:17 +#: IDF/Form/TabsConf.php:42 +msgid "Issues" +msgstr "问题跟踪" + +#: IDF/gettexttemplates/idf/base.html.php:15 +#: IDF/gettexttemplates/idf/admin/base.html.php:7 +#: IDF/gettexttemplates/idf/base-full.html.php:14 +#: IDF/Form/TabsConf.php:41 +msgid "Source" +msgstr "源代码" + +#: IDF/gettexttemplates/idf/base.html.php:16 +#: IDF/gettexttemplates/idf/base-full.html.php:15 +#: IDF/Form/TabsConf.php:39 +msgid "Code Review" +msgstr "代码审核" + +#: IDF/gettexttemplates/idf/base.html.php:17 +#: IDF/gettexttemplates/idf/base-full.html.php:16 +msgid "Project Management" +msgstr "管理" + +#: IDF/gettexttemplates/idf/index.atom.php:3 +#, php-format +msgid "Personal project feed for %%user%%." +msgstr "" + +#: IDF/gettexttemplates/idf/source/mercurial/help.html.php:3 +#, php-format +msgid "" +"The team behind %%project%% is using\n" +"the Mercurial software to manage the source\n" +"code." +msgstr "%%project%% 项目使用 Mercurial 管理源代码" + +#: IDF/gettexttemplates/idf/source/mercurial/help.html.php:6 +#: IDF/gettexttemplates/idf/source/svn/help.html.php:6 +#, php-format +msgid "To get write access to the repository, you need to use your username and your extra password." +msgstr " " + +#: IDF/gettexttemplates/idf/source/mercurial/help.html.php:7 +#: IDF/gettexttemplates/idf/source/svn/help.html.php:7 +#: IDF/gettexttemplates/idf/source/git/help.html.php:8 +#, php-format +msgid "Find here more details on how to access %%project%% source code." +msgstr "" + +#: IDF/gettexttemplates/idf/source/mercurial/help.html.php:8 +#: IDF/gettexttemplates/idf/source/svn/help.html.php:8 +#: IDF/gettexttemplates/idf/source/git/help.html.php:9 +msgid "Command-Line Access" +msgstr "获取代码" + +#: IDF/gettexttemplates/idf/source/mercurial/help.html.php:9 +#: IDF/gettexttemplates/idf/source/svn/help.html.php:9 +msgid "Write Access Authentication" +msgstr "提交代码认证" + +#: IDF/gettexttemplates/idf/source/mercurial/changelog.html.php:3 +#: IDF/gettexttemplates/idf/source/mercurial/tree.html.php:15 +#: IDF/gettexttemplates/idf/source/mercurial/file.html.php:8 +#: IDF/gettexttemplates/idf/source/svn/tree.html.php:17 +#: IDF/gettexttemplates/idf/source/git/changelog.html.php:3 +#: IDF/gettexttemplates/idf/source/git/tree.html.php:15 +#: IDF/gettexttemplates/idf/source/git/file.html.php:8 +#: IDF/gettexttemplates/idf/source/commit.html.php:13 +msgid "Branches:" +msgstr "分支" + +#: IDF/gettexttemplates/idf/source/mercurial/changelog.html.php:4 +#: IDF/gettexttemplates/idf/source/mercurial/tree.html.php:16 +#: IDF/gettexttemplates/idf/source/mercurial/file.html.php:9 +#: IDF/gettexttemplates/idf/source/svn/tree.html.php:18 +#: IDF/gettexttemplates/idf/source/git/changelog.html.php:4 +#: IDF/gettexttemplates/idf/source/git/tree.html.php:16 +#: IDF/gettexttemplates/idf/source/git/file.html.php:9 +#: IDF/gettexttemplates/idf/source/commit.html.php:14 +msgid "Tags:" +msgstr "标签:" + +#: IDF/gettexttemplates/idf/source/mercurial/tree.html.php:3 +#: IDF/gettexttemplates/idf/source/mercurial/file.html.php:3 +#: IDF/gettexttemplates/idf/source/svn/tree.html.php:3 +#: IDF/gettexttemplates/idf/source/svn/file.html.php:3 +#: IDF/gettexttemplates/idf/source/git/tree.html.php:3 +#: IDF/gettexttemplates/idf/source/git/file.html.php:3 +#, php-format +msgid "Source at commit %%commit%% created %%cobject.date%%." +msgstr "" + +#: IDF/gettexttemplates/idf/source/mercurial/tree.html.php:4 +#: IDF/gettexttemplates/idf/source/mercurial/file.html.php:4 +#: IDF/gettexttemplates/idf/source/svn/tree.html.php:4 +#: IDF/gettexttemplates/idf/source/svn/file.html.php:4 +#: IDF/gettexttemplates/idf/source/git/tree.html.php:4 +#: IDF/gettexttemplates/idf/source/git/file.html.php:4 +#, php-format +msgid "By %%cobject.author%%, %%cobject.title%%" +msgstr "" + +#: IDF/gettexttemplates/idf/source/mercurial/tree.html.php:5 +#: IDF/gettexttemplates/idf/source/mercurial/file.html.php:5 +#: IDF/gettexttemplates/idf/source/svn/tree.html.php:5 +#: IDF/gettexttemplates/idf/source/svn/file.html.php:5 +#: IDF/gettexttemplates/idf/source/git/tree.html.php:5 +#: IDF/gettexttemplates/idf/source/git/file.html.php:5 +msgid "Root" +msgstr "Root" + +#: IDF/gettexttemplates/idf/source/mercurial/tree.html.php:6 +#: IDF/gettexttemplates/idf/source/svn/tree.html.php:6 +#: IDF/gettexttemplates/idf/source/git/tree.html.php:6 +#: IDF/Form/Upload.php:59 +#: IDF/Views/Download.php:64 +#: IDF/Views/Download.php:271 +msgid "File" +msgstr "文件" + +#: IDF/gettexttemplates/idf/source/mercurial/tree.html.php:7 +#: IDF/gettexttemplates/idf/source/svn/tree.html.php:7 +#: IDF/gettexttemplates/idf/source/changelog.html.php:3 +#: IDF/gettexttemplates/idf/source/git/tree.html.php:7 +#: IDF/Views/Project.php:109 +msgid "Age" +msgstr "时间" + +#: IDF/gettexttemplates/idf/source/mercurial/tree.html.php:8 +#: IDF/gettexttemplates/idf/source/svn/tree.html.php:9 +#: IDF/gettexttemplates/idf/source/changelog.html.php:4 +#: IDF/gettexttemplates/idf/source/git/tree.html.php:8 +msgid "Message" +msgstr "消息" + +#: IDF/gettexttemplates/idf/source/mercurial/tree.html.php:9 +#: IDF/gettexttemplates/idf/source/svn/tree.html.php:10 +#: IDF/gettexttemplates/idf/source/git/tree.html.php:9 +#: IDF/Views/Download.php:66 +#: IDF/Views/Download.php:273 +msgid "Size" +msgstr "大小" + +#: IDF/gettexttemplates/idf/source/mercurial/tree.html.php:10 +#: IDF/gettexttemplates/idf/source/svn/tree.html.php:13 +#: IDF/gettexttemplates/idf/source/git/tree.html.php:10 +msgid ":" +msgstr ":" + +#: IDF/gettexttemplates/idf/source/mercurial/tree.html.php:12 +#: IDF/gettexttemplates/idf/source/git/tree.html.php:12 +msgid "Download this version" +msgstr "下载这个版本" + +#: IDF/gettexttemplates/idf/source/mercurial/tree.html.php:13 +#: IDF/gettexttemplates/idf/source/git/tree.html.php:13 +msgid "or" +msgstr "或" + +#: IDF/gettexttemplates/idf/source/svn/help.html.php:3 +#, php-format +msgid "" +"The team behind %%project%% is using\n" +"the subversion software to manage the source\n" +"code." +msgstr "%%project%% 项目使用 subversion 管理源代码" + +#: IDF/gettexttemplates/idf/source/svn/changelog.html.php:3 +#: IDF/gettexttemplates/idf/source/svn/tree.html.php:15 +#: IDF/gettexttemplates/idf/source/svn/file.html.php:10 +#: IDF/gettexttemplates/idf/source/commit.html.php:15 +msgid "Revision:" +msgstr "版本:" + +#: IDF/gettexttemplates/idf/source/svn/changelog.html.php:4 +#: IDF/gettexttemplates/idf/source/svn/tree.html.php:16 +#: IDF/gettexttemplates/idf/source/svn/file.html.php:11 +#: IDF/gettexttemplates/idf/source/commit.html.php:16 +msgid "Go to revision" +msgstr "切换版本" + +#: IDF/gettexttemplates/idf/source/svn/tree.html.php:8 +msgid "Rev" +msgstr "版本" + +#: IDF/gettexttemplates/idf/source/svn/tree.html.php:11 +#: IDF/gettexttemplates/idf/source/svn/file.html.php:6 +msgid "Property" +msgstr "" + +#: IDF/gettexttemplates/idf/source/svn/tree.html.php:12 +#: IDF/gettexttemplates/idf/source/svn/file.html.php:7 +msgid "set to:" +msgstr "" + +#: IDF/gettexttemplates/idf/source/changelog.html.php:5 +#: IDF/gettexttemplates/idf/source/base.html.php:5 +#: IDF/Form/ReviewCreate.php:74 +msgid "Commit" +msgstr "" + +#: IDF/gettexttemplates/idf/source/changelog.html.php:6 +msgid "by" +msgstr "" + +#: IDF/gettexttemplates/idf/source/commit-created-email.txt.php:3 +msgid "A new commit has been created:" +msgstr "" + +#: IDF/gettexttemplates/idf/source/commit-created-email.txt.php:7 +#: IDF/gettexttemplates/idf/wiki/wiki-updated-email.txt.php:8 +#: IDF/gettexttemplates/idf/wiki/wiki-created-email.txt.php:6 +msgid "Created by:" +msgstr "创建于:" + +#: IDF/gettexttemplates/idf/source/commit-created-email.txt.php:8 +msgid "Created at:" +msgstr "创建于:" + +#: IDF/gettexttemplates/idf/source/commit-created-email.txt.php:9 +#: IDF/gettexttemplates/idf/wiki/wiki-created-email.txt.php:8 +msgid "Content:" +msgstr "内容:" + +#: IDF/gettexttemplates/idf/source/commit-created-email.txt.php:10 +msgid "Commit details:" +msgstr "" + +#: IDF/gettexttemplates/idf/source/git/help.html.php:3 +#, php-format +msgid "" +"The team behind %%project%% is using\n" +"the git software to manage the source\n" +"code." +msgstr " %%project%% 项目使用 git 管理源代码" + +#: IDF/gettexttemplates/idf/source/git/help.html.php:6 +#, php-format +msgid "You may need to provide your SSH key. The synchronization of your SSH key can take a couple of minutes. You can learn more about SSH key authentification." +msgstr "" + +#: IDF/gettexttemplates/idf/source/git/help.html.php:7 +msgid "To make a first commit in the repository, perform the following steps:" +msgstr "" + +#: IDF/gettexttemplates/idf/source/git/help.html.php:10 +msgid "First Commit" +msgstr "" + +#: IDF/gettexttemplates/idf/source/base.html.php:3 +msgid "Source Tree" +msgstr "源码" + +#: IDF/gettexttemplates/idf/source/base.html.php:4 +msgid "Change Log" +msgstr "修改日志" + +#: IDF/gettexttemplates/idf/source/base.html.php:6 +msgid "How To Get The Code" +msgstr "获取代码" + +#: IDF/gettexttemplates/idf/source/commit.html.php:4 +msgid "Date:" +msgstr "" + +#: IDF/gettexttemplates/idf/source/commit.html.php:8 +msgid "Message:" +msgstr "" + +#: IDF/gettexttemplates/idf/source/commit.html.php:10 +msgid "Change Details" +msgstr "" + +#: IDF/gettexttemplates/idf/source/feedfragment.xml.php:3 +#, php-format +msgid "%%cproject.name%%: Commit %%c.scm_id%%" +msgstr "" + +#: IDF/gettexttemplates/idf/user/passrecovery.html.php:3 +#: IDF/gettexttemplates/idf/user/myaccount.html.php:3 +#: IDF/gettexttemplates/idf/register/confirmation.html.php:3 +msgid "Oups, please check the form for errors." +msgstr "" + +#: IDF/gettexttemplates/idf/user/passrecovery.html.php:4 +#: IDF/gettexttemplates/idf/user/myaccount.html.php:4 +#: IDF/gettexttemplates/idf/gadmin/users/update.html.php:10 +#: IDF/gettexttemplates/idf/register/confirmation.html.php:4 +msgid "Login:" +msgstr "账号:" + +#: IDF/gettexttemplates/idf/user/passrecovery.html.php:5 +#: IDF/gettexttemplates/idf/register/confirmation.html.php:5 +msgid "Email:" +msgstr "" + +#: IDF/gettexttemplates/idf/user/passrecovery.html.php:6 +msgid "Reset Your Password" +msgstr "重置密码" + +#: IDF/gettexttemplates/idf/user/passrecovery.html.php:8 +#: IDF/gettexttemplates/idf/register/confirmation.html.php:8 +msgid "This is the last step, but just be sure to have the cookies enabled to log in afterwards." +msgstr "" + +#: IDF/gettexttemplates/idf/user/myaccount.html.php:5 +msgid "Extra password" +msgstr "" + +#: IDF/gettexttemplates/idf/user/myaccount.html.php:6 +msgid "This password is used to access some of the external systems managed by our infrastructure. It will be regenerated if you change your password." +msgstr "" + +#: IDF/gettexttemplates/idf/user/myaccount.html.php:7 +msgid "API key" +msgstr "" + +#: IDF/gettexttemplates/idf/user/myaccount.html.php:8 +msgid "Your API key will be regenerated automatically if you change your password." +msgstr "" + +#: IDF/gettexttemplates/idf/user/myaccount.html.php:9 +msgid "Update Your Account" +msgstr "更新" + +#: IDF/gettexttemplates/idf/user/myaccount.html.php:11 +#, fuzzy +msgid "Your Current SSH Keys" +msgstr "你的公共 SSH key" + +#: IDF/gettexttemplates/idf/user/myaccount.html.php:12 +#, fuzzy +msgid "Delete this key" +msgstr "删除此文件" + +#: IDF/gettexttemplates/idf/user/myaccount.html.php:13 +msgid "If possible, use your real name. By using your real name, people will have more trust in your comments and remarks." +msgstr "如果可以,请使用你的真名。" + +#: IDF/gettexttemplates/idf/user/myaccount.html.php:14 +msgid "The extra password is used to access some of the external systems and the API key is used to interact with this website using a program." +msgstr "扩展密码用于访问外部系统(如svn)和系统API" + +#: IDF/gettexttemplates/idf/user/myaccount.html.php:15 +msgid "Show API key and extra password" +msgstr "显示API key和扩展密码" + +#: IDF/gettexttemplates/idf/user/passrecovery-inputkey.html.php:3 +#: IDF/gettexttemplates/idf/user/changeemail.html.php:3 +#: IDF/gettexttemplates/idf/register/inputkey.html.php:3 +msgid "Oups, we found an error in the form." +msgstr "" + +#: IDF/gettexttemplates/idf/user/passrecovery-inputkey.html.php:4 +msgid "Recover Your Password" +msgstr "找回密码" + +#: IDF/gettexttemplates/idf/user/passrecovery-inputkey.html.php:7 +#: IDF/gettexttemplates/idf/user/changeemail.html.php:7 +msgid "Use your email software to read your emails and open your verification email. Either click directly on the verification link or copy/paste the verification key in the box and submit the form." +msgstr "" + +#: IDF/gettexttemplates/idf/user/passrecovery-inputkey.html.php:8 +msgid "Just after providing the confirmation key, you will be able to reset your password and use again this website fully." +msgstr "" + +#: IDF/gettexttemplates/idf/user/changeemail.html.php:4 +msgid "Confirm Your New Email Address" +msgstr "" + +#: IDF/gettexttemplates/idf/user/changeemail-email.txt.php:3 +#, php-format +msgid "" +"Hello %%user%%,\n" +"\n" +"To confirm that you want %%email%%\n" +"to be your new email address, just follow this link:\n" +"\n" +"%%url%%\n" +"\n" +"Alternatively, go to this page:\n" +"\n" +"%%urlik%%\n" +"\n" +"and provide the following verification key:\n" +"\n" +"%%key%%\n" +"\n" +"If you do not want to change your email address, \n" +"just ignore this message.\n" +"\n" +"Yours faithfully,\n" +"The development team.\n" +msgstr "" + +#: IDF/gettexttemplates/idf/user/dashboard.html.php:3 +#, php-format +msgid "Update your account." +msgstr "更新你的账户" + +#: IDF/gettexttemplates/idf/user/dashboard.html.php:4 +#, php-format +msgid "See your public profile." +msgstr "查看你的公开资料" + +#: IDF/gettexttemplates/idf/user/public.html.php:3 +#, php-format +msgid "You are looking at the public profile of %%member%%." +msgstr "你正在查看 %%member%% 的公开资料" + +#: IDF/gettexttemplates/idf/user/public.html.php:4 +msgid "Last time seen:" +msgstr "最近登录" + +#: IDF/gettexttemplates/idf/user/public.html.php:5 +msgid "Member since:" +msgstr "注册时间" + +#: IDF/gettexttemplates/idf/user/passrecovery-ask.html.php:3 +msgid "Oups, please check the provided login or email address to recover your password." +msgstr "出错了,请检查你提供的email或账号" + +#: IDF/gettexttemplates/idf/user/passrecovery-ask.html.php:4 +msgid "Recover My Password" +msgstr "恢复密码" + +#: IDF/gettexttemplates/idf/user/passrecovery-ask.html.php:6 +msgid "Provide either your login or email address, if a corresponding user is found in the database, we will send you an email with the details on how to reset your password." +msgstr "" + +#: IDF/gettexttemplates/idf/user/passrecovery-email.txt.php:3 +#, php-format +msgid "" +"Hello %%user%%,\n" +"\n" +"You lost your password and wanted to recover it.\n" +"To provide a new password for your account, you\n" +"just have to follow the provided link. You will\n" +"get a simple form to provide a new password.\n" +"\n" +"%%url%%\n" +"\n" +"Alternatively, go to this page:\n" +"\n" +"%%urlik%%\n" +"\n" +"and provide the following verification key:\n" +"\n" +"%%key%%\n" +"\n" +"If you are not the one who requested to reset\n" +"your password, simply ignore this email, your\n" +"password will not be changed.\n" +"\n" +"Yours faithfully,\n" +"The development team.\n" +msgstr "" + +#: IDF/gettexttemplates/idf/wiki/deletepage.html.php:3 +msgid "If you delete this documentation page, it will be removed from the database with all the associated revisions and you will not be able to recover it." +msgstr "" + +#: IDF/gettexttemplates/idf/wiki/deletepage.html.php:6 +#, fuzzy +msgid "Delete Page" +msgstr "创建页面" + +#: IDF/gettexttemplates/idf/wiki/deletepage.html.php:11 +#: IDF/gettexttemplates/idf/wiki/view.html.php:16 +#: IDF/gettexttemplates/idf/wiki/delete.html.php:14 +msgid "Old Revisions" +msgstr "" + +#: IDF/gettexttemplates/idf/wiki/wiki-updated-email.txt.php:3 +msgid "The following documentation page has been updated:" +msgstr "" + +#: IDF/gettexttemplates/idf/wiki/wiki-updated-email.txt.php:7 +msgid "Updated by:" +msgstr "" + +#: IDF/gettexttemplates/idf/wiki/wiki-updated-email.txt.php:10 +#: IDF/gettexttemplates/idf/wiki/feedfragment.xml.php:3 +msgid "Changes:" +msgstr "" + +#: IDF/gettexttemplates/idf/wiki/wiki-updated-email.txt.php:13 +msgid "New content:" +msgstr "" + +#: IDF/gettexttemplates/idf/wiki/wiki-updated-email.txt.php:14 +#: IDF/gettexttemplates/idf/wiki/wiki-created-email.txt.php:9 +msgid "Documentation page:" +msgstr "" + +#: IDF/gettexttemplates/idf/wiki/base.html.php:3 +msgid "List Pages" +msgstr "页面列表" + +#: IDF/gettexttemplates/idf/wiki/base.html.php:4 +#: IDF/gettexttemplates/idf/wiki/index.html.php:4 +#: IDF/gettexttemplates/idf/wiki/search.html.php:3 +#: IDF/Views/Wiki.php:177 +msgid "New Page" +msgstr "新页面" + +#: IDF/gettexttemplates/idf/wiki/base.html.php:5 +msgid "Update This Page" +msgstr "更新此页面" + +#: IDF/gettexttemplates/idf/wiki/index.html.php:3 +#, php-format +msgid "See the deprecated pages." +msgstr "" + +#: IDF/gettexttemplates/idf/wiki/index.html.php:5 +msgid "Number of pages:" +msgstr "文档数目:" + +#: IDF/gettexttemplates/idf/wiki/update.html.php:3 +#: IDF/gettexttemplates/idf/wiki/create.html.php:3 +msgid "Preview of the Page" +msgstr "" + +#: IDF/gettexttemplates/idf/wiki/update.html.php:4 +msgid "The form contains some errors. Please correct them to update the page." +msgstr "" + +#: IDF/gettexttemplates/idf/wiki/update.html.php:6 +msgid "Update Page" +msgstr "更新页面" + +#: IDF/gettexttemplates/idf/wiki/update.html.php:8 +#: IDF/gettexttemplates/idf/wiki/update.html.php:10 +#: IDF/gettexttemplates/idf/wiki/update.html.php:11 +#, fuzzy +msgid "Delete this page" +msgstr "删除此文件" + +#: IDF/gettexttemplates/idf/wiki/create.html.php:4 +msgid "The form contains some errors. Please correct them to create the page." +msgstr "" + +#: IDF/gettexttemplates/idf/wiki/create.html.php:6 +msgid "Create Page" +msgstr "创建页面" + +#: IDF/gettexttemplates/idf/wiki/search.html.php:4 +msgid "Pages found:" +msgstr "" + +#: IDF/gettexttemplates/idf/wiki/view.html.php:3 +msgid "" +"Attention! This page is marked as deprecated, \n" +"use it as reference only if you are sure you need these specific information." +msgstr "" + +#: IDF/gettexttemplates/idf/wiki/view.html.php:5 +#, php-format +msgid "" +"You are looking at an old revision of the page \n" +"%%page.title%%. This revision was created\n" +"by %%submitter%%." +msgstr "" + +#: IDF/gettexttemplates/idf/wiki/view.html.php:10 +#: IDF/gettexttemplates/idf/wiki/view.html.php:12 +msgid "Delete this revision" +msgstr "" + +#: IDF/gettexttemplates/idf/wiki/delete.html.php:3 +#, php-format +msgid "" +"You are looking at an old revision (%%oldrev.summary%%) of the page \n" +"%%page.title%%. This revision was created\n" +"by %%submitter%%." +msgstr "" + +#: IDF/gettexttemplates/idf/wiki/delete.html.php:6 +msgid "If you delete this old revision, it will be removed from the database and you will not be able to recover it." +msgstr "" + +#: IDF/gettexttemplates/idf/wiki/delete.html.php:9 +msgid "Delete Revision" +msgstr "删除版本" + +#: IDF/gettexttemplates/idf/wiki/wiki-created-email.txt.php:3 +msgid "A new documentation page has been created:" +msgstr "" + +#: IDF/gettexttemplates/idf/wiki/edit-info.html.php:3 +#, php-format +msgid "" +"\n" +"

Instructions:

\n" +"

The content of the page can use the Markdown syntax.

\n" +"

Website addresses are automatically linked and you can link to another page in the documentation using double square brackets like that [[AnotherPage]].

\n" +msgstr "" +"\n" +"

提示:

\n" +"

页面内容可以使用Markdown 语法

\n" +"

Website addresses are automatically linked and you can link to another page in the documentation using double square brackets like that [[AnotherPage]].

\n" + +#: IDF/gettexttemplates/idf/admin/wiki.html.php:3 +#: IDF/gettexttemplates/idf/admin/issue-tracking.html.php:3 +#: IDF/gettexttemplates/idf/admin/downloads.html.php:3 +msgid "" +"\n" +"

Instructions:

\n" +"

List one status value per line in desired sort-order.

\n" +"

Optionally, use an equals-sign to document the meaning of each status value.

\n" +msgstr "" +"\n" +"

提示:

\n" +"

List one status value per line in desired sort-order.

\n" +"

Optionally, use an equals-sign to document the meaning of each status value.

\n" + +#: IDF/gettexttemplates/idf/admin/wiki.html.php:8 +#: IDF/gettexttemplates/idf/admin/summary.html.php:8 +#: IDF/gettexttemplates/idf/admin/source.html.php:8 +#: IDF/gettexttemplates/idf/admin/tabs.html.php:15 +#: IDF/gettexttemplates/idf/admin/issue-tracking.html.php:8 +#: IDF/gettexttemplates/idf/admin/downloads.html.php:8 +#: IDF/gettexttemplates/idf/admin/members.html.php:13 +msgid "Save Changes" +msgstr "保存更改" + +#: IDF/gettexttemplates/idf/admin/summary.html.php:3 +#, php-format +msgid "" +"\n" +"

Instructions:

\n" +"

The description of the project can be improved using the Markdown syntax.

\n" +msgstr "" +"\n" +"

提示:

\n" +"

The description of the project can be improved using the Markdown syntax.

\n" + +#: IDF/gettexttemplates/idf/admin/summary.html.php:7 +msgid "The form contains some errors. Please correct them to update the summary." +msgstr "" + +#: IDF/gettexttemplates/idf/admin/source.html.php:3 +msgid "You can find here the current repository configuration of your project." +msgstr "" + +#: IDF/gettexttemplates/idf/admin/source.html.php:4 +msgid "The form contains some errors. Please correct them to update the source configuration." +msgstr "" + +#: IDF/gettexttemplates/idf/admin/source.html.php:5 +msgid "Repository type:" +msgstr "仓库类型:" + +#: IDF/gettexttemplates/idf/admin/source.html.php:6 +msgid "Repository access:" +msgstr "仓库地址:" + +#: IDF/gettexttemplates/idf/admin/source.html.php:7 +msgid "Repository size:" +msgstr "仓库使用空间:" + +#: IDF/gettexttemplates/idf/admin/base.html.php:3 +msgid "Project Summary" +msgstr "项目摘要" + +#: IDF/gettexttemplates/idf/admin/base.html.php:6 +msgid "Issue Tracking" +msgstr "问题跟踪" + +#: IDF/gettexttemplates/idf/admin/base.html.php:8 +msgid "Project Members" +msgstr "项目成员" + +#: IDF/gettexttemplates/idf/admin/base.html.php:9 +msgid "Tabs Access and Notifications" +msgstr "访问权限与提醒" + +#: IDF/gettexttemplates/idf/admin/tabs.html.php:3 +msgid "" +"\n" +"Only project members and admins have write access to the source.
\n" +"If you restrict the access to the source, anonymous access is
\n" +"not provided and the users must authenticate themselves with their
\n" +"password or SSH key." +msgstr "只有项目成员和管理员可以提交源代码" + +#: IDF/gettexttemplates/idf/admin/tabs.html.php:8 +msgid "You can configure here the project tabs access rights and notification emails." +msgstr "" + +#: IDF/gettexttemplates/idf/admin/tabs.html.php:9 +#, php-format +msgid "Notification emails will be sent from the %%from_email%% address, if you send the email to a mailing list, you may need to register this email address. If you do not want to send emails for a given type of changes, simply leave the corresponding field empty." +msgstr "" + +#: IDF/gettexttemplates/idf/admin/tabs.html.php:10 +msgid "If you mark a project as private, only the project members and administrators, together with the extra authorized users you provide will have access to the project. You will still be able to define further access rights for the different tabs but the \"Open to all\" and \"Signed in users\" will default to authorized users only." +msgstr "" + +#: IDF/gettexttemplates/idf/admin/tabs.html.php:11 +msgid "Specify each person by its login. Each person must have already registered with the given login. Separate the logins with commas and/or new lines." +msgstr "" + +#: IDF/gettexttemplates/idf/admin/tabs.html.php:12 +msgid "The form contains some errors. Please correct them to update the access rights." +msgstr "" + +#: IDF/gettexttemplates/idf/admin/tabs.html.php:13 +msgid "Access Rights" +msgstr "访问权限" + +#: IDF/gettexttemplates/idf/admin/tabs.html.php:14 +msgid "Notification Email" +msgstr "提醒Email" + +#: IDF/gettexttemplates/idf/admin/tabs.html.php:16 +#: IDF/gettexttemplates/idf/gadmin/users/update.html.php:13 +#: IDF/gettexttemplates/idf/gadmin/projects/create.html.php:17 +msgid "Instructions:" +msgstr "提示:" + +#: IDF/gettexttemplates/idf/admin/members.html.php:3 +#: IDF/gettexttemplates/idf/gadmin/projects/update.html.php:3 +msgid "" +"\n" +"

Instructions:

\n" +"

Specify each person by its login. Each person must have already registered with the given login.

\n" +"

Separate the logins with commas and/or new lines.

\n" +msgstr "" +"\n" +"

提示:

\n" +"

Specify each person by its login. Each person must have already registered with the given login.

\n" +"

Separate the logins with commas and/or new lines.

\n" + +#: IDF/gettexttemplates/idf/admin/members.html.php:8 +#: IDF/gettexttemplates/idf/gadmin/projects/update.html.php:8 +#: IDF/gettexttemplates/idf/gadmin/projects/create.html.php:9 +msgid "" +"\n" +"

Notes:

\n" +"

A project owner may make any change to this project, including removing other project owners. You need to be carefull when you give owner rights.

\n" +"

A project member will not have access to the administration area but will have more options available in the use of the project.

\n" +msgstr "" +"\n" +"

提示:

\n" +"

A project owner may make any change to this project, including removing other project owners. You need to be carefull when you give owner rights.

\n" +"

A project member will not have access to the administration area but will have more options available in the use of the project.

\n" + +#: IDF/gettexttemplates/idf/index.html.php:4 +msgid "No projects managed with InDefero were found." +msgstr "没有合适项目" + +#: IDF/gettexttemplates/idf/index.html.php:5 +#: IDF/gettexttemplates/idf/gadmin/projects/base.html.php:4 +#: IDF/gettexttemplates/idf/gadmin/projects/create.html.php:16 +#: IDF/Views/Admin.php:125 +msgid "Create Project" +msgstr "创建项目" + +#: IDF/gettexttemplates/idf/index.html.php:6 +#: IDF/Form/TabsConf.php:76 +#: IDF/Form/Admin/ProjectCreate.php:54 +msgid "Private project" +msgstr "私有项目" + +#: IDF/gettexttemplates/idf/index.html.php:7 +msgid "Managed Projects:" +msgstr "可用项目" + +#: IDF/gettexttemplates/idf/gadmin/users/base.html.php:3 +#: IDF/Views/Admin.php:198 +msgid "User List" +msgstr "用户列表" + +#: IDF/gettexttemplates/idf/gadmin/users/base.html.php:4 +#: IDF/gettexttemplates/idf/gadmin/users/update.html.php:11 +msgid "Update User" +msgstr "更新用户" + +#: IDF/gettexttemplates/idf/gadmin/users/base.html.php:5 +#: IDF/gettexttemplates/idf/gadmin/users/create.html.php:4 +msgid "Create User" +msgstr "添加用户" + +#: IDF/gettexttemplates/idf/gadmin/users/index.html.php:3 +#, php-format +msgid "See not validated users." +msgstr "查看 未验证用户" + +#: IDF/gettexttemplates/idf/gadmin/users/index.html.php:4 +msgid "

You have here an overview of the users registered in the forge.

" +msgstr "" + +#: IDF/gettexttemplates/idf/gadmin/users/index.html.php:5 +msgid "Number of users:" +msgstr "用户数量:" + +#: IDF/gettexttemplates/idf/gadmin/users/update.html.php:3 +msgid "" +"If you are changing the email address of the user, you\n" +"need to ensure that you are providing a valid email\n" +"address" +msgstr "如果要更改用户的电子邮件地址,你需要确保提供一个有效的电子邮件地址" + +#: IDF/gettexttemplates/idf/gadmin/users/update.html.php:6 +msgid "" +"If you give the user staff rights, the user will be\n" +"able to create new projects and update other non staff users.\n" +msgstr "" +"如果你给一个用户工作人员权限,他就可以\n" +"创建项目和用户并且修改其它非工作人员信息\n" + +#: IDF/gettexttemplates/idf/gadmin/users/update.html.php:9 +msgid "The form contains some errors. Please correct them to update the user." +msgstr "" + +#: IDF/gettexttemplates/idf/gadmin/users/create.html.php:3 +msgid "The form contains some errors. Please correct them to create the user." +msgstr "" + +#: IDF/gettexttemplates/idf/gadmin/users/create.html.php:6 +msgid "The user password will be sent by email to the user." +msgstr "" + +#: IDF/gettexttemplates/idf/gadmin/users/createuser-email.txt.php:3 +#, php-format +msgid "" +"Hello %%user%%,\n" +"\n" +"An account on the forge has been created for you by\n" +"the administrator %%admin%%.\n" +"\n" +"Please find here your details to access the forge:\n" +"\n" +" Address: %%url%%\n" +" Login: %%user.login%%\n" +" Password: %%password%%\n" +"\n" +"Yours faithfully,\n" +"The development team.\n" +msgstr "" + +#: IDF/gettexttemplates/idf/gadmin/projects/base.html.php:5 +msgid "Change Project Details" +msgstr "修改项目摘要" + +#: IDF/gettexttemplates/idf/gadmin/projects/index.html.php:3 +msgid "Space Usage Statistics" +msgstr "空间使用率" + +#: IDF/gettexttemplates/idf/gadmin/projects/index.html.php:4 +msgid "Repositories:" +msgstr "仓库:" + +#: IDF/gettexttemplates/idf/gadmin/projects/index.html.php:7 +msgid "Database:" +msgstr "数据库:" + +#: IDF/gettexttemplates/idf/gadmin/projects/index.html.php:8 +msgid "Total Forge:" +msgstr "合计:" + +#: IDF/gettexttemplates/idf/gadmin/projects/update.html.php:13 +msgid "The form contains some errors. Please correct them to update the project." +msgstr "" + +#: IDF/gettexttemplates/idf/gadmin/projects/update.html.php:14 +#: IDF/gettexttemplates/idf/gadmin/projects/create.html.php:15 +msgid "Provide at least one owner for the project." +msgstr "项目至少要有一个所有者" + +#: IDF/gettexttemplates/idf/gadmin/projects/update.html.php:15 +msgid "Update Project" +msgstr "更新项目" + +#: IDF/gettexttemplates/idf/gadmin/projects/update.html.php:17 +#: IDF/gettexttemplates/idf/gadmin/projects/update.html.php:19 +#: IDF/gettexttemplates/idf/gadmin/projects/update.html.php:20 +msgid "Delete this project" +msgstr "删除此项目" + +#: IDF/gettexttemplates/idf/gadmin/projects/update.html.php:21 +msgid "You will be asked to confirm." +msgstr "" + +#: IDF/gettexttemplates/idf/gadmin/projects/create.html.php:3 +msgid "You can select the type of repository you want. In the case of subversion, you can use optionally a remote repository instead of the local one." +msgstr "" + +#: IDF/gettexttemplates/idf/gadmin/projects/create.html.php:4 +msgid "Once you have defined the repository type, you cannot change it." +msgstr "" + +#: IDF/gettexttemplates/idf/gadmin/projects/create.html.php:5 +msgid "" +"\n" +"

Specify each person by its login. Each person must have already registered with the given login.

\n" +"

Separate the logins with commas and/or new lines.

\n" +msgstr "" + +#: IDF/gettexttemplates/idf/gadmin/projects/create.html.php:14 +msgid "The form contains some errors. Please correct them to create the project." +msgstr "" + +#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:3 +#, php-format +msgid "" +"Confirmation code to confirm the deletion of the project: \n" +"%%code%%." +msgstr "" + +#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:5 +msgid "" +"\n" +"Attention! Deleting a project is a one second operation\n" +"with the consequences that all the data related to the \n" +"project will be deleted.\n" +msgstr "" + +#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:10 +msgid "The form contains some errors. Please correct them to delete the project." +msgstr "" + +#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:11 +msgid "Project Statistics" +msgstr "项目统计" + +#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:12 +msgid "Tab" +msgstr "标签" + +#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:13 +msgid "Number" +msgstr "数字" + +#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:15 +msgid "Code reviews" +msgstr "代码审核" + +#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:16 +msgid "Commits" +msgstr "" + +#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:18 +msgid "Documentation pages" +msgstr "" + +#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:19 +#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:20 +msgid "Delete Project" +msgstr "删除项目" + +#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:22 +msgid "For large projects, the suppression can take a while, please be patient." +msgstr "" + +#: IDF/gettexttemplates/idf/gadmin/base.html.php:10 +msgid "People" +msgstr "用户列表" + +#: IDF/gettexttemplates/idf/gadmin/home.html.php:3 +msgid "You have here access to the administration of the forge." +msgstr "" + +#: IDF/gettexttemplates/idf/register/confirmation-email.txt.php:3 +#, php-format +msgid "" +"Hello,\n" +"\n" +"You have requested the creation of an account to\n" +"participate in the life of a software project.\n" +"\n" +"To confirm the account please follow this link:\n" +"\n" +"%%url%%\n" +"\n" +"Alternatively, go to this page:\n" +"\n" +"%%urlik%%\n" +"\n" +"and provide the following confirmation key:\n" +"\n" +"%%key%%\n" +"\n" +"If you are not interested any longer in taking\n" +"part in the life of the software project or if\n" +"you can't remember having requested the creation\n" +"of an account, please excuse us and simply ignore\n" +"this email. \n" +"\n" +"Yours faithfully,\n" +"The development team.\n" +msgstr "" + +#: IDF/gettexttemplates/idf/register/index.html.php:3 +msgid "Read the terms and conditions – basically \"Please be nice, we respect you\"." +msgstr "阅读 注册协议 – jerry \"请善用此系统\"." + +#: IDF/gettexttemplates/idf/register/index.html.php:4 +#, php-format +msgid "With your account, you will able to participate in the life of all the projects hosted here. Participating in a software project must be fun, so if you have troubles, you can let us know about your issues at anytime!" +msgstr "" + +#: IDF/gettexttemplates/idf/register/index.html.php:5 +msgid "Oups, please check the provided login and email address to register." +msgstr "注册失败,请检查一下你提供的账号和Email" + +#: IDF/gettexttemplates/idf/register/index.html.php:8 +msgid "Be sure to provide a valid email address, as we are sending a validation link by email." +msgstr "" + +#: IDF/gettexttemplates/idf/register/index.html.php:9 +msgid "Did you know?" +msgstr "你知道吗?" + +#: IDF/gettexttemplates/idf/register/confirmation.html.php:6 +msgid "Enable Your Account" +msgstr "" + +#: IDF/gettexttemplates/idf/register/inputkey.html.php:4 +msgid "Confirm Your Account" +msgstr "确认你的账户" + +#: IDF/gettexttemplates/idf/register/inputkey.html.php:7 +msgid "Use your email software to read your emails and open your confirmation email. Either click directly on the confirmation link or copy/paste the confirmation key in the box and submit the form." +msgstr "" + +#: IDF/gettexttemplates/idf/register/inputkey.html.php:8 +msgid "Just after providing the confirmation key, you will be able to set your password and start using this website fully." +msgstr "" + +#: IDF/Review/Patch.php:52 +msgid "review" +msgstr "" + +#: IDF/Review/Patch.php:67 +msgid "commit" +msgstr "" + +#: IDF/Review/Patch.php:80 +#: IDF/Review/Comment.php:55 +msgid "patch" +msgstr "补丁" + +#: IDF/Review/Patch.php:151 +#: IDF/Review/Comment.php:139 +#, php-format +msgid "Review %3$d, %4$s" +msgstr "" + +#: IDF/Review/Patch.php:153 +#, php-format +msgid "Creation of review %d, by %s" +msgstr "" + +#: IDF/Review/Patch.php:163 +#, php-format +msgid "%s: Creation of Review %d - %s" +msgstr "" + +#: IDF/Review/Patch.php:202 +#, php-format +msgid "New Code Review %s - %s (%s)" +msgstr "" + +#: IDF/Review/Comment.php:83 +msgid "vote" +msgstr "" + +#: IDF/Review/Comment.php:141 +#, php-format +msgid "Update of review %d, by %s" +msgstr "" + +#: IDF/Review/Comment.php:151 +#, php-format +msgid "%s: Updated review %d - %s" +msgstr "" + +#: IDF/Review/Comment.php:216 +#, php-format +msgid "Updated Code Review %s - %s (%s)" +msgstr "" + +#: IDF/Scm/Git.php:172 +#, php-format +msgid "Invalid value for the parameter %1$s: %2$s. Use %3$s." +msgstr "" + +#: IDF/Scm/Git.php:223 +#: IDF/Scm/Mercurial.php:135 +#, php-format +msgid "Folder %1$s not found in commit %2$s." +msgstr "" + +#: IDF/Scm/Git.php:331 +#: IDF/Scm/Mercurial.php:152 +#, php-format +msgid "Not a valid tree: %s." +msgstr "" + +#: IDF/Plugin/SyncMercurial.php:78 +#: IDF/Plugin/SyncSvn.php:81 +#, php-format +msgid "The repository %s already exists." +msgstr "" + +#: IDF/Plugin/SyncMercurial.php:142 +#, php-format +msgid "%s does not exist or is not writable." +msgstr "" + +#: IDF/Timeline/Paginator.php:49 +msgid "Today" +msgstr "今天" + +#: IDF/Form/Upload.php:40 +#: IDF/Form/ReviewFileComment.php:71 +#: IDF/Form/UpdateUpload.php:42 +#: IDF/Form/IssueUpdate.php:45 +#: IDF/Form/ReviewCreate.php:45 +#: IDF/Form/IssueCreate.php:50 +#: IDF/Views/User.php:83 +#: IDF/Views/Wiki.php:62 +#: IDF/Views/Wiki.php:109 +#: IDF/Views/Wiki.php:150 +#: IDF/Views/Review.php:58 +#: IDF/Views/Download.php:65 +#: IDF/Views/Download.php:272 +#: IDF/Views/Issue.php:62 +#: IDF/Views/Issue.php:139 +#: IDF/Views/Issue.php:226 +#: IDF/Views/Issue.php:382 +#: IDF/Views/Issue.php:441 +msgid "Summary" +msgstr "摘要" + +#: IDF/Form/Upload.php:49 +#: IDF/Form/UpdateUpload.php:51 +#: IDF/Form/ReviewCreate.php:54 +#: IDF/Form/IssueCreate.php:59 +#: IDF/Form/WikiCreate.php:70 +#: IDF/Form/WikiUpdate.php:60 +msgid "Description" +msgstr "描述" + +#: IDF/Form/Upload.php:70 +#: IDF/Form/UpdateUpload.php:71 +#: IDF/Form/IssueUpdate.php:117 +#: IDF/Form/IssueCreate.php:120 +#: IDF/Form/WikiCreate.php:93 +#: IDF/Form/WikiUpdate.php:104 +msgid "Labels" +msgstr "标签" + +#: IDF/Form/Upload.php:86 +msgid "For security reason, you cannot upload a file with this extension." +msgstr "" + +#: IDF/Form/Upload.php:119 +#: IDF/Form/UpdateUpload.php:109 +#: IDF/Form/IssueCreate.php:169 +#, php-format +msgid "You cannot provide more than label from the %s class to an issue." +msgstr "" + +#: IDF/Form/Upload.php:120 +#: IDF/Form/UpdateUpload.php:110 +#: IDF/Form/IssueCreate.php:163 +#: IDF/Form/IssueCreate.php:170 +#: IDF/Form/WikiCreate.php:151 +#: IDF/Form/WikiUpdate.php:162 +msgid "You provided an invalid label." +msgstr "" + +#: IDF/Form/Upload.php:148 +#: IDF/Form/UserChangeEmail.php:80 +#: IDF/Form/ReviewFileComment.php:125 +#: IDF/Form/Password.php:76 +#: IDF/Form/TabsConf.php:97 +#: IDF/Form/UpdateUpload.php:126 +#: IDF/Form/Admin/UserCreate.php:108 +#: IDF/Form/Admin/ProjectUpdate.php:77 +#: IDF/Form/Admin/ProjectCreate.php:215 +#: IDF/Form/Admin/UserUpdate.php:129 +#: IDF/Form/Admin/ProjectDelete.php:78 +#: IDF/Form/WikiDelete.php:59 +#: IDF/Form/UserAccount.php:118 +#: IDF/Form/IssueUpdate.php:232 +#: IDF/Form/ReviewCreate.php:187 +#: IDF/Form/IssueCreate.php:233 +#: IDF/Form/WikiCreate.php:167 +#: IDF/Form/MembersConf.php:64 +#: IDF/Form/WikiUpdate.php:178 +#: IDF/Form/Register.php:114 +msgid "Cannot save the model from an invalid form." +msgstr "" + +#: IDF/Form/UserChangeEmail.php:36 +#: IDF/Form/PasswordReset.php:39 +#: IDF/Form/PasswordInputKey.php:36 +msgid "Your verification key" +msgstr "" + +#: IDF/Form/UserChangeEmail.php:63 +msgid "The validation key is not valid. Please copy/paste it from your confirmation email." +msgstr "" + +#: IDF/Form/ReviewFileComment.php:45 +#: IDF/Form/IssueUpdate.php:55 +#: IDF/Form/WikiUpdate.php:82 +msgid "Comment" +msgstr "评论" + +#: IDF/Form/ReviewFileComment.php:56 +msgid "General comment" +msgstr "" + +#: IDF/Form/ReviewFileComment.php:81 +#: IDF/Form/IssueUpdate.php:88 +#: IDF/Form/ReviewCreate.php:103 +#: IDF/Form/IssueCreate.php:92 +#: IDF/Views/User.php:84 +#: IDF/Views/Review.php:59 +#: IDF/Views/Issue.php:63 +#: IDF/Views/Issue.php:140 +#: IDF/Views/Issue.php:227 +#: IDF/Views/Issue.php:383 +#: IDF/Views/Issue.php:442 +msgid "Status" +msgstr "状态" + +#: IDF/Form/ReviewFileComment.php:102 +msgid "You need to provide comments on at least one file." +msgstr "" + +#: IDF/Form/ReviewFileComment.php:109 +msgid "You need to provide your general comment about the proposal." +msgstr "" + +#: IDF/Form/Password.php:34 +msgid "Your login or email" +msgstr "账号或Email" + +#: IDF/Form/Password.php:35 +msgid "Provide either your login or your email to recover your password." +msgstr "使用账号或email来恢复密码" + +#: IDF/Form/Password.php:49 +#: IDF/Form/Password.php:64 +msgid "Sorry, we cannot find a user with this email address or login. Feel free to try again." +msgstr "对不起,没有找到使用这个账号或email的用户" + +#: IDF/Form/Password.php:100 +msgid "Password Recovery - InDefero" +msgstr "" + +#: IDF/Form/RegisterConfirmation.php:40 +#: IDF/Form/RegisterInputKey.php:36 +msgid "Your confirmation key" +msgstr "" + +#: IDF/Form/RegisterConfirmation.php:50 +#: IDF/Form/Admin/UserCreate.php:37 +#: IDF/Form/Admin/UserUpdate.php:36 +#: IDF/Form/UserAccount.php:38 +msgid "First name" +msgstr "名" + +#: IDF/Form/RegisterConfirmation.php:59 +#: IDF/Form/Admin/UserCreate.php:46 +#: IDF/Form/Admin/UserUpdate.php:45 +#: IDF/Form/UserAccount.php:47 +msgid "Last name" +msgstr "姓" + +#: IDF/Form/RegisterConfirmation.php:69 +#: IDF/Form/UserAccount.php:75 +#: IDF/Form/PasswordReset.php:45 +msgid "Your password" +msgstr "密码" + +#: IDF/Form/RegisterConfirmation.php:72 +#: IDF/Form/UserAccount.php:78 +#: IDF/Form/PasswordReset.php:48 +msgid "Your password must be hard for other people to find it, but easy for you to remember." +msgstr " " + +#: IDF/Form/RegisterConfirmation.php:80 +#: IDF/Form/UserAccount.php:86 +#: IDF/Form/PasswordReset.php:56 +msgid "Confirm your password" +msgstr "确认密码" + +#: IDF/Form/RegisterConfirmation.php:99 +#: IDF/Form/RegisterInputKey.php:50 +msgid "We are sorry but this confirmation key is not valid. Maybe you should directly copy/paste it from your confirmation email." +msgstr "" + +#: IDF/Form/RegisterConfirmation.php:110 +msgid "This account has already been confirmed. Maybe should you try to recover your password using the help link." +msgstr "" + +#: IDF/Form/RegisterConfirmation.php:122 +#: IDF/Form/PasswordReset.php:74 +msgid "The two passwords must be the same." +msgstr "" + +#: IDF/Form/RegisterConfirmation.php:137 +#: IDF/Form/RegisterInputKey.php:72 +#: IDF/Form/PasswordReset.php:108 +#: IDF/Form/PasswordInputKey.php:76 +msgid "Cannot save an invalid form." +msgstr "" + +#: IDF/Form/TabsConf.php:50 +msgid "Open to all" +msgstr "全部开放" + +#: IDF/Form/TabsConf.php:51 +msgid "Signed in users" +msgstr "登录用户" + +#: IDF/Form/TabsConf.php:52 +#: IDF/Form/Admin/ProjectUpdate.php:56 +#: IDF/Form/Admin/ProjectCreate.php:106 +#: IDF/Form/MembersConf.php:54 +msgid "Project members" +msgstr "项目成员" + +#: IDF/Form/TabsConf.php:53 +#: IDF/Form/Admin/ProjectUpdate.php:48 +#: IDF/Form/Admin/ProjectCreate.php:97 +#: IDF/Form/MembersConf.php:46 +msgid "Project owners" +msgstr "项目所有者" + +#: IDF/Form/MembersConf.php:62 +msgid "Project testers" +msgstr "项目测试人员" + +#: IDF/Form/TabsConf.php:54 +msgid "Closed" +msgstr "已关闭" + +#: IDF/Form/TabsConf.php:82 +msgid "Extra authorized users" +msgstr "允许访问用户(客户列表)" + +#: IDF/Form/IssueTrackingConf.php:71 +msgid "Open issue status values" +msgstr "打开问题状态值" + +#: IDF/Form/IssueTrackingConf.php:79 +msgid "Closed issue status values" +msgstr "关闭问题状态值" + +#: IDF/Form/IssueTrackingConf.php:88 +msgid "Predefined issue labels" +msgstr "预定义问题标签" + +#: IDF/Form/IssueTrackingConf.php:97 +msgid "Each issue may have at most one label with each of these classes" +msgstr "每个问题必须包含的标签" + +#: IDF/Form/Admin/UserCreate.php:56 +#, fuzzy +msgid "Login" +msgstr "账号:" + +#: IDF/Form/Admin/UserCreate.php:60 +#: IDF/Form/Register.php:45 +msgid "The login must be between 3 and 15 characters long and contains only letters and digits." +msgstr "账号必须是3至15位的字母或数字组成的字符串" + +#: IDF/Form/Admin/UserCreate.php:69 +#: IDF/Form/Admin/UserUpdate.php:55 +msgid "Email" +msgstr "Email" + +#: IDF/Form/Admin/UserCreate.php:71 +msgid "Double check the email address as the password is directly sent to the user." +msgstr "" + +#: IDF/Form/Admin/UserCreate.php:76 +#: IDF/Form/Admin/UserUpdate.php:65 +#: IDF/Form/UserAccount.php:64 +msgid "Language" +msgstr "语言" + +#: IDF/Form/Admin/UserCreate.php:87 +#: IDF/Form/UserAccount.php:97 +#, fuzzy +msgid "Add a public SSH key" +msgstr "你的公共 SSH key" + +#: IDF/Form/Admin/UserCreate.php:92 +msgid "Be careful to provide the public key and not the private key!" +msgstr "" + +#: IDF/Form/Admin/UserCreate.php:159 +msgid "Your details to access your forge." +msgstr "" + +#: IDF/Form/Admin/UserCreate.php:196 +#: IDF/Form/UserAccount.php:270 +#, php-format +msgid "The email \"%s\" is already used." +msgstr "" + +#: IDF/Form/Admin/UserCreate.php:205 +#: IDF/Form/Register.php:72 +#, php-format +msgid "The login \"%s\" can only contain letters and digits." +msgstr " 账号 \"%s\" 只能包含数字和字母" + +#: IDF/Form/Admin/UserCreate.php:210 +#: IDF/Form/Register.php:77 +#, php-format +msgid "The login \"%s\" is already used, please find another one." +msgstr "账号 \"%s\" 已存在,请换一个再试" + +#: IDF/Form/Admin/ProjectUpdate.php:42 +#: IDF/Form/Admin/ProjectCreate.php:48 +#: IDF/Views/Admin.php:66 +#: IDF/Views/Admin.php:207 +msgid "Name" +msgstr "名字" + +#: IDF/Form/Admin/ProjectCreate.php:38 +#: IDF/Views/Project.php:519 +msgid "git" +msgstr "" + +#: IDF/Form/Admin/ProjectCreate.php:39 +#: IDF/Views/Project.php:520 +msgid "Subversion" +msgstr "" + +#: IDF/Form/Admin/ProjectCreate.php:40 +#: IDF/Views/Project.php:521 +msgid "mercurial" +msgstr "" + +#: IDF/Form/Admin/ProjectCreate.php:61 +msgid "Shortname" +msgstr "短名称" + +#: IDF/Form/Admin/ProjectCreate.php:63 +msgid "It must be unique for each project and composed only of letters, digits and dash (-) like \"my-project\"." +msgstr "必须唯一且只能包含字母、数字和连接符(-) 如 \"my-project\"" + +#: IDF/Form/Admin/ProjectCreate.php:68 +msgid "Repository type" +msgstr "仓库类型" + +#: IDF/Form/Admin/ProjectCreate.php:76 +msgid "Remote Subversion repository" +msgstr "" + +#: IDF/Form/Admin/ProjectCreate.php:83 +#: IDF/Form/SourceConf.php:40 +msgid "Repository username" +msgstr "仓库用户名称" + +#: IDF/Form/Admin/ProjectCreate.php:90 +#: IDF/Form/SourceConf.php:47 +msgid "Repository password" +msgstr "仓库用户密码" + +#: IDF/Form/Admin/ProjectCreate.php:154 +msgid "Only a remote repository available throught http or https are allowed. For example \"http://somewhere.com/svn/trunk\"." +msgstr "" + +#: IDF/Form/Admin/ProjectCreate.php:163 +msgid "This shortname contains illegal characters, please use only letters, digits and dash (-)." +msgstr "" + +#: IDF/Form/Admin/ProjectCreate.php:166 +msgid "The shortname cannot start with the dash (-) character." +msgstr "" + +#: IDF/Form/Admin/ProjectCreate.php:169 +msgid "The shortname cannot end with the dash (-) character." +msgstr "" + +#: IDF/Form/Admin/ProjectCreate.php:174 +msgid "This shortname is already used. Please select another one." +msgstr "" + +#: IDF/Form/Admin/ProjectCreate.php:221 +msgid "Click on the Project Management tab to set the description of your project." +msgstr "在项目管理里管理项目描述" + +#: IDF/Form/Admin/UserUpdate.php:76 +msgid "Password" +msgstr "密码" + +#: IDF/Form/Admin/UserUpdate.php:79 +msgid "Leave blank if you do not want to change the password." +msgstr "不修改密码请留空" + +#: IDF/Form/Admin/UserUpdate.php:79 +msgid "The password must be hard for other people to find it, but easy for the user to remember." +msgstr "密码需要别人很难猜到并且方便用户自己记忆" + +#: IDF/Form/Admin/UserUpdate.php:87 +msgid "Confirm password" +msgstr "确认密码" + +#: IDF/Form/Admin/UserUpdate.php:99 +#: IDF/Views/Admin.php:208 +msgid "Staff" +msgstr "工作人员" + +#: IDF/Form/Admin/UserUpdate.php:102 +msgid "If you give staff rights to a user, you really need to trust him." +msgstr "如果你给一个用户工作人员权限,你需要绝对信任他。" + +#: IDF/Form/Admin/UserUpdate.php:110 +#: IDF/Views/Admin.php:210 +msgid "Active" +msgstr "激活" + +#: IDF/Form/Admin/UserUpdate.php:114 +msgid "If the user is not getting the confirmation email or is abusing the system, you can directly enable or disable his account here." +msgstr "如果用户不能收到确认邮件或滥用系统,你可以在此开启或禁用他的账户" + +#: IDF/Form/Admin/UserUpdate.php:183 +msgid "--- is not a valid first name." +msgstr "" + +#: IDF/Form/Admin/UserUpdate.php:199 +msgid "A user with this email already exists, please provide another email address." +msgstr "" + +#: IDF/Form/Admin/UserUpdate.php:214 +#: IDF/Form/UserAccount.php:285 +msgid "The passwords do not match. Please give them again." +msgstr "" + +#: IDF/Form/Admin/ProjectDelete.php:41 +msgid "Confirmation code" +msgstr "确认码" + +#: IDF/Form/Admin/ProjectDelete.php:46 +msgid "I have made a backup of all the important data of this project." +msgstr "" + +#: IDF/Form/Admin/ProjectDelete.php:55 +msgid "The confirmation code does not match. Please provide a valid confirmation code to delete the project." +msgstr "" + +#: IDF/Form/Admin/ProjectDelete.php:63 +msgid "Sorry, you really need to backup your data before deletion." +msgstr "" + +#: IDF/Form/WikiDelete.php:39 +msgid "Yes, I understand that the page and all its revisions will be deleted." +msgstr "" + +#: IDF/Form/WikiDelete.php:50 +msgid "You need to confirm the deletion." +msgstr "" + +#: IDF/Form/UserAccount.php:57 +msgid "Your mail" +msgstr "你的Email" + +#: IDF/Form/UserAccount.php:59 +msgid "If you change your email address, an email will be sent to the new address to confirm it." +msgstr "如果你改变你的电子邮件地址,系统将发送一份邮件到新地址账户确认。" + +#: IDF/Form/UserAccount.php:78 +msgid "Leave blank if you do not want to change your password." +msgstr "如果不修改密码请留空" + +#: IDF/Form/UserAccount.php:102 +msgid "Be careful to provide your public key and not your private key!" +msgstr "" + +#: IDF/Form/UserAccount.php:147 +msgid "Confirm your new email address." +msgstr "" + +#: IDF/Form/UserAccount.php:150 +#, php-format +msgid "A validation email has been sent to \"%s\" to validate the email address change." +msgstr "" + +#: IDF/Form/UserAccount.php:210 +msgid "The format of the key is not valid. It must start with ssh-dss or ssh-rsa, a long string on a single line and at the end a comment." +msgstr "" + +#: IDF/Form/UserAccount.php:220 +msgid "Please check the key as it does not appears to be a valid key." +msgstr "" + +#: IDF/Form/UserAccount.php:230 +msgid "You already have uploaded this SSH key." +msgstr "" + +#: IDF/Form/IssueUpdate.php:65 +#: IDF/Form/ReviewCreate.php:83 +#: IDF/Form/IssueCreate.php:69 +msgid "The \"upload_issue_path\" configuration variable was not set." +msgstr "" + +#: IDF/Form/IssueUpdate.php:75 +#: IDF/Form/IssueCreate.php:79 +msgid "Attach a file" +msgstr "添加附件" + +#: IDF/Form/IssueUpdate.php:98 +#: IDF/Form/IssueCreate.php:101 +msgid "Owner" +msgstr "所有者" + +#: IDF/Form/IssueUpdate.php:147 +#: IDF/Form/IssueCreate.php:180 +msgid "You need to provide a description of the issue." +msgstr "" + +#: IDF/Form/IssueUpdate.php:219 +msgid "No changes were entered." +msgstr "" + +#: IDF/Form/ReviewCreate.php:92 +msgid "Patch" +msgstr "补丁" + +#: IDF/Form/ReviewCreate.php:119 +msgid "We were not able to parse your patch. Please provide a valid patch." +msgstr "" + +#: IDF/Form/ReviewCreate.php:128 +msgid "You provided an invalid commit." +msgstr "" + +#: IDF/Form/ReviewCreate.php:159 +#: IDF/Form/IssueCreate.php:203 +msgid "You provided an invalid status." +msgstr "" + +#: IDF/Form/ReviewCreate.php:202 +msgid "Initial patch to be reviewed." +msgstr "" + +#: IDF/Form/PasswordReset.php:77 +msgid "This account is not active. Please contact the forge administrator to activate it." +msgstr "" + +#: IDF/Form/PasswordReset.php:89 +#: IDF/Form/PasswordInputKey.php:50 +msgid "We are sorry but this validation key is not valid. Maybe you should directly copy/paste it from your validation email." +msgstr "" + +#: IDF/Form/PasswordReset.php:100 +#: IDF/Form/PasswordInputKey.php:61 +msgid "Sorry, but this verification key has expired, please restart the password recovery sequence. For security reasons, the verification key is only valid 24h." +msgstr "" + +#: IDF/Form/IssueCreate.php:162 +msgid "You cannot add a label with the \"Status\" prefix to an issue." +msgstr "" + +#: IDF/Form/WikiCreate.php:38 +msgid "" +"# Introduction\n" +"\n" +"Add your content here.\n" +"\n" +"\n" +"# Details\n" +"\n" +"Add your content here. Format your content with:\n" +"\n" +"* Text in **bold** or *italic*.\n" +"* Headings, paragraphs, and lists.\n" +"* Links to other [[WikiPage]].\n" +msgstr "" + +#: IDF/Form/WikiCreate.php:57 +msgid "PageName" +msgstr "页面名称" + +#: IDF/Form/WikiCreate.php:60 +#: IDF/Form/WikiUpdate.php:50 +msgid "Page title" +msgstr "标题" + +#: IDF/Form/WikiCreate.php:66 +#: IDF/Form/WikiUpdate.php:56 +msgid "The page name must contains only letters, digits and the dash (-) character." +msgstr "标题只能包含字母、数字和连接号(-)" + +#: IDF/Form/WikiCreate.php:71 +#: IDF/Form/WikiUpdate.php:61 +msgid "This one line description is displayed in the list of pages." +msgstr "描述显示在文档列表页面" + +#: IDF/Form/WikiCreate.php:80 +#: IDF/Form/WikiUpdate.php:72 +msgid "Content" +msgstr "内容" + +#: IDF/Form/WikiCreate.php:108 +#: IDF/Form/WikiUpdate.php:119 +msgid "The title contains invalid characters." +msgstr "" + +#: IDF/Form/WikiCreate.php:114 +#: IDF/Form/WikiUpdate.php:125 +msgid "A page with this title already exists." +msgstr "" + +#: IDF/Form/WikiCreate.php:150 +#: IDF/Form/WikiUpdate.php:161 +#, php-format +msgid "You cannot provide more than label from the %s class to a page." +msgstr "" + +#: IDF/Form/WikiCreate.php:200 +msgid "Initial page creation" +msgstr "" + +#: IDF/Form/MembersConf.php:104 +#, php-format +msgid "The following login is invalid: %s." +msgid_plural "The following login are invalids: %s." +msgstr[0] "" +msgstr[1] "" + +#: IDF/Form/WikiConf.php:49 +msgid "Predefined documentation page labels" +msgstr "预定义文档页面标签" + +#: IDF/Form/WikiConf.php:58 +msgid "Each documentation page may have at most one label with each of these classes" +msgstr "每个文档必须包含的标签" + +#: IDF/Form/WikiUpdate.php:83 +msgid "One line to describe the changes you made." +msgstr "" + +#: IDF/Form/UploadConf.php:53 +msgid "Predefined download labels" +msgstr "预定义下载标签" + +#: IDF/Form/UploadConf.php:62 +msgid "Each download may have at most one label with each of these classes" +msgstr "每个下载必须包含的标签" + +#: IDF/Form/Register.php:41 +msgid "Your login" +msgstr "账号" + +#: IDF/Form/Register.php:53 +msgid "Your email" +msgstr "你的Email" + +#: IDF/Form/Register.php:55 +msgid "We will never send you any unsolicited emails. We hate spams too!" +msgstr "我们永远不会给你发送垃圾邮件,我们也讨厌垃圾邮件!" + +#: IDF/Form/Register.php:60 +msgid "I agree to the terms and conditions." +msgstr "同意注册协议" + +#: IDF/Form/Register.php:88 +msgid "We know, this is boring, but you need to agree with the terms and conditions." +msgstr "" + +#: IDF/Form/Register.php:99 +#, php-format +msgid "The email \"%s\" is already used. If you need, click on the help link to recover your password." +msgstr "" + +#: IDF/Form/Register.php:150 +msgid "Confirm the creation of your account." +msgstr "" + +#: IDF/Search/Occ.php:33 +msgid "occurence" +msgstr "" + +#: IDF/Search/Occ.php:49 +msgid "word" +msgstr "" + +#: IDF/Search/Occ.php:75 +msgid "occurences" +msgstr "" + +#: IDF/Search/Occ.php:81 +msgid "ponderated occurence" +msgstr "" + +#: IDF/Views/User.php:59 +msgid "Your Dashboard - Working Issues" +msgstr "你的任务" + +#: IDF/Views/User.php:62 +msgid "Your Dashboard - Submitted Issues" +msgstr "" + +#: IDF/Views/User.php:75 +#: IDF/Views/Issue.php:51 +#: IDF/Views/Issue.php:130 +msgid "This table shows the open issues." +msgstr "" + +#: IDF/Views/User.php:81 +#: IDF/Views/Review.php:57 +#: IDF/Views/Issue.php:61 +#: IDF/Views/Issue.php:138 +#: IDF/Views/Issue.php:225 +#: IDF/Views/Issue.php:381 +#: IDF/Views/Issue.php:440 +msgid "Id" +msgstr "编号" + +#: IDF/Views/User.php:82 +msgid "Project" +msgstr "项目" + +#: IDF/Views/User.php:85 +#: IDF/Views/Review.php:60 +#: IDF/Views/Issue.php:64 +#: IDF/Views/Issue.php:141 +#: IDF/Views/Issue.php:228 +#: IDF/Views/Issue.php:384 +#: IDF/Views/Issue.php:443 +msgid "Last Updated" +msgstr "最后更新" + +#: IDF/Views/User.php:89 +msgid "No issues are assigned to you, yeah!" +msgstr "太棒了,没有签给你的问题!" + +#: IDF/Views/User.php:89 +msgid "All the issues you submitted are fixed, yeah!" +msgstr "" + +#: IDF/Views/User.php:118 +msgid "Your personal information has been updated." +msgstr "你的个人资料更新成功" + +#: IDF/Views/User.php:128 +msgid "Your Account" +msgstr "账户" + +#: IDF/Views/User.php:151 +#, fuzzy +msgid "The SSH key has been deleted." +msgstr "项目删除成功" + +#: IDF/Views/User.php:174 +msgid "Confirm The Email Change" +msgstr "" + +#: IDF/Views/User.php:199 +#, php-format +msgid "Your new email address \"%s\" has been validated. Thank you!" +msgstr "" + +#: IDF/Views/Wiki.php:41 +#, php-format +msgid "%s Documentation" +msgstr "%s 文档" + +#: IDF/Views/Wiki.php:48 +msgid "This table shows the documentation pages." +msgstr "" + +#: IDF/Views/Wiki.php:61 +#: IDF/Views/Wiki.php:108 +#: IDF/Views/Wiki.php:149 +msgid "Page Title" +msgstr "标题" + +#: IDF/Views/Wiki.php:63 +#: IDF/Views/Wiki.php:110 +#: IDF/Views/Wiki.php:151 +#, fuzzy +msgid "Updated" +msgstr "更新时间" + +#: IDF/Views/Wiki.php:67 +#: IDF/Views/Wiki.php:155 +msgid "No documentation pages were found." +msgstr "没有文档" + +#: IDF/Views/Wiki.php:92 +#, php-format +msgid "Documentation Search - %s" +msgstr "" + +#: IDF/Views/Wiki.php:103 +msgid "This table shows the pages found." +msgstr "" + +#: IDF/Views/Wiki.php:114 +msgid "No pages were found." +msgstr "" + +#: IDF/Views/Wiki.php:133 +#, php-format +msgid "%1$s Documentation Pages with Label %2$s" +msgstr "" + +#: IDF/Views/Wiki.php:143 +#, php-format +msgid "This table shows the documentation pages with label %s." +msgstr "" + +#: IDF/Views/Wiki.php:188 +#, php-format +msgid "The page %s has been created." +msgstr "" + +#: IDF/Views/Wiki.php:275 +msgid "The old revision has been deleted." +msgstr "" + +#: IDF/Views/Wiki.php:281 +#, php-format +msgid "Delete Old Revision of %s" +msgstr "" + +#: IDF/Views/Wiki.php:314 +#: IDF/Views/Admin.php:93 +#: IDF/Views/Admin.php:248 +#, php-format +msgid "Update %s" +msgstr "更新 %s" + +#: IDF/Views/Wiki.php:326 +#, php-format +msgid "The page %s has been updated." +msgstr "" + +#: IDF/Views/Wiki.php:364 +#, fuzzy +msgid "The documentation page has been deleted." +msgstr "项目删除成功" + +#: IDF/Views/Wiki.php:372 +#, fuzzy, php-format +msgid "Delete Page %s" +msgstr "删除下载 %s" + +#: IDF/Views/Admin.php:60 +msgid "This table shows the projects in the forge." +msgstr "" + +#: IDF/Views/Admin.php:65 +msgid "Short Name" +msgstr "短名称" + +#: IDF/Views/Admin.php:67 +msgid "Repository Size" +msgstr "仓库大小" + +#: IDF/Views/Admin.php:73 +msgid "No projects were found." +msgstr "没有项目" + +#: IDF/Views/Admin.php:101 +#: IDF/Views/Project.php:237 +msgid "The project has been updated." +msgstr "项目更新成功" + +#: IDF/Views/Admin.php:131 +msgid "The project has been created." +msgstr "项目创建成功" + +#: IDF/Views/Admin.php:157 +#, php-format +msgid "Delete %s Project" +msgstr "删除 %s 项目" + +#: IDF/Views/Admin.php:164 +msgid "The project has been deleted." +msgstr "项目删除成功" + +#: IDF/Views/Admin.php:194 +msgid "Not Validated User List" +msgstr "未验证的用户" + +#: IDF/Views/Admin.php:202 +msgid "This table shows the users in the forge." +msgstr "" + +#: IDF/Views/Admin.php:206 +msgid "login" +msgstr "登录" + +#: IDF/Views/Admin.php:209 +msgid "Admin" +msgstr "管理员" + +#: IDF/Views/Admin.php:211 +msgid "Last Login" +msgstr "最后登录" + +#: IDF/Views/Admin.php:218 +msgid "No users were found." +msgstr "没有合适用户" + +#: IDF/Views/Admin.php:255 +msgid "You do not have the rights to update this user." +msgstr "" + +#: IDF/Views/Admin.php:271 +msgid "The user has been updated." +msgstr "" + +#: IDF/Views/Admin.php:302 +#, fuzzy, php-format +msgid "The user %s has been created." +msgstr "项目删除成功" + +#: IDF/Views/Admin.php:309 +msgid "Add User" +msgstr "添加用户" + +#: IDF/Views/Admin.php:322 +msgid "No" +msgstr "不" + +#: IDF/Views/Project.php:71 +#, php-format +msgid "%s Updates" +msgstr "%s 更新" + +#: IDF/Views/Project.php:77 +msgid "This table shows the project updates." +msgstr "" + +#: IDF/Views/Project.php:110 +msgid "Change" +msgstr "更改" + +#: IDF/Views/Project.php:114 +msgid "No changes were found." +msgstr "没有修改信息" + +#: IDF/Views/Project.php:206 +msgid "Updates" +msgstr "更新" + +#: IDF/Views/Project.php:229 +#, php-format +msgid "%s Project Summary" +msgstr "%s 项目摘要" + +#: IDF/Views/Project.php:264 +#, php-format +msgid "%s Issue Tracking Configuration" +msgstr "%s 问题跟踪配置" + +#: IDF/Views/Project.php:273 +msgid "The issue tracking configuration has been saved." +msgstr "问题跟踪配置保存成功" + +#: IDF/Views/Project.php:308 +#, php-format +msgid "%s Downloads Configuration" +msgstr "%s 下载配置" + +#: IDF/Views/Project.php:317 +msgid "The downloads configuration has been saved." +msgstr "下载配置保存成功" + +#: IDF/Views/Project.php:351 +#, php-format +msgid "%s Documentation Configuration" +msgstr "%s 文档配置" + +#: IDF/Views/Project.php:360 +msgid "The documentation configuration has been saved." +msgstr "文档配置保存成功" + +#: IDF/Views/Project.php:394 +#, php-format +msgid "%s Project Members" +msgstr "%s 项目成员" + +#: IDF/Views/Project.php:403 +msgid "The project membership has been saved." +msgstr "项目成员保存成功" + +#: IDF/Views/Project.php:426 +#, php-format +msgid "%s Tabs Access Rights" +msgstr "%s 访问权限" + +#: IDF/Views/Project.php:440 +msgid "The project tabs access rights have been saved." +msgstr "项目访问权限保存成功" + +#: IDF/Views/Project.php:483 +#, php-format +msgid "%s Source" +msgstr "%s 源代码配置" + +#: IDF/Views/Project.php:498 +msgid "The project source configuration has been saved." +msgstr "" + +#: IDF/Views/Source.php:50 +#, php-format +msgid "%s Source Help" +msgstr "%s 源代码帮助" + +#: IDF/Views/Source.php:86 +#, php-format +msgid "%1$s %2$s Change Log" +msgstr "%1$s %2$s 修改日志" + +#: IDF/Views/Source.php:131 +#: IDF/Views/Source.php:217 +#: IDF/Views/Source.php:352 +#, php-format +msgid "%1$s %2$s Source Tree" +msgstr "%1$s %2$s 源码树" + +#: IDF/Views/Source.php:301 +#, php-format +msgid "%s Commit Details" +msgstr "" + +#: IDF/Views/Source.php:302 +#, php-format +msgid "%s Commit Details - %s" +msgstr "" + +#: IDF/Views/Review.php:41 +#, php-format +msgid "%s Code Reviews" +msgstr "%s 代码审核" + +#: IDF/Views/Review.php:48 +msgid "This table shows the latest reviews." +msgstr "" + +#: IDF/Views/Review.php:64 +msgid "No reviews were found." +msgstr "没有审核" + +#: IDF/Views/Review.php:94 +#, php-format +msgid "The code review %d has been created." +msgstr "" + +#: IDF/Views/Review.php:140 +#, php-format +msgid "Review %d: %s" +msgstr "" + +#: IDF/Views/Review.php:160 +#, php-format +msgid "Your code review %d has been published." +msgstr "" + +#: IDF/Views/Download.php:45 +#, php-format +msgid "%s Downloads" +msgstr "%s 下载" + +#: IDF/Views/Download.php:51 +msgid "This table shows the files to download." +msgstr "" + +#: IDF/Views/Download.php:67 +#: IDF/Views/Download.php:274 +msgid "Uploaded" +msgstr "上传时间" + +#: IDF/Views/Download.php:71 +#: IDF/Views/Download.php:278 +msgid "No downloads were found." +msgstr "没有下载" + +#: IDF/Views/Download.php:96 +#, php-format +msgid "Download %s" +msgstr "下载 %s" + +#: IDF/Views/Download.php:113 +#, php-format +msgid "The file %2$s has been updated." +msgstr "" + +#: IDF/Views/Download.php:146 +#, php-format +msgid "Delete Download %s" +msgstr "删除下载 %s" + +#: IDF/Views/Download.php:156 +msgid "The file has been deleted." +msgstr "" + +#: IDF/Views/Download.php:202 +#, php-format +msgid "The file has been uploaded." +msgstr "" + +#: IDF/Views/Download.php:256 +#, php-format +msgid "%1$s Downloads with Label %2$s" +msgstr "" + +#: IDF/Views/Download.php:266 +#, php-format +msgid "This table shows the downloads with label %s." +msgstr "" + +#: IDF/Views/Issue.php:41 +#, php-format +msgid "%s Open Issues" +msgstr "%s 开放的问题" + +#: IDF/Views/Issue.php:68 +#: IDF/Views/Issue.php:145 +#: IDF/Views/Issue.php:232 +#: IDF/Views/Issue.php:388 +#: IDF/Views/Issue.php:447 +msgid "No issues were found." +msgstr "没有问题" + +#: IDF/Views/Issue.php:97 +#, php-format +msgid "My Submitted %s Issues" +msgstr "我提交的问题 " + +#: IDF/Views/Issue.php:101 +#, php-format +msgid "My Closed Submitted %s Issues" +msgstr "" + +#: IDF/Views/Issue.php:105 +#, php-format +msgid "My Closed Working %s Issues" +msgstr "" + +#: IDF/Views/Issue.php:109 +#, php-format +msgid "My Working %s Issues" +msgstr "" + +#: IDF/Views/Issue.php:164 +msgid "Submit a new issue" +msgstr "提交新问题" + +#: IDF/Views/Issue.php:180 +#, php-format +msgid "Issue %d has been created." +msgstr "" + +#: IDF/Views/Issue.php:209 +#, php-format +msgid "Search Issues - %s" +msgstr "搜索问题 - %s" + +#: IDF/Views/Issue.php:221 +msgid "This table shows the found issues." +msgstr "" + +#: IDF/Views/Issue.php:251 +#, php-format +msgid "Issue %d: %s" +msgstr "问题 %d: %s" + +#: IDF/Views/Issue.php:275 +#, php-format +msgid "Issue %d has been updated." +msgstr "" + +#: IDF/Views/Issue.php:341 +#, php-format +msgid "View %s" +msgstr "查看 %s" + +#: IDF/Views/Issue.php:361 +#, php-format +msgid "%s Closed Issues" +msgstr "" + +#: IDF/Views/Issue.php:371 +msgid "This table shows the closed issues." +msgstr "" + +#: IDF/Views/Issue.php:414 +#, php-format +msgid "%1$s Issues with Label %2$s" +msgstr "" + +#: IDF/Views/Issue.php:417 +#, php-format +msgid "%1$s Closed Issues with Label %2$s" +msgstr "" + +#: IDF/Views/Issue.php:430 +#, php-format +msgid "This table shows the issues with label %s." +msgstr "" + +#: IDF/Views/Issue.php:480 +msgid "The issue has been removed from your watch list." +msgstr "" + +#: IDF/Views/Issue.php:483 +msgid "The issue has been added to your watch list." +msgstr "" + +#: IDF/Views/Issue.php:561 +msgid "On your watch list." +msgstr "" + +#: IDF/Template/Markdown.php:67 +msgid "Create this documentation page" +msgstr "" + +#: IDF/Template/ShowUser.php:51 +msgid "Anonymous" +msgstr "匿名" + +#: IDF/Template/ShowUser.php:54 +msgid "Me" +msgstr "" + diff --git a/src/IDF/relations.php b/src/IDF/relations.php index 6848e1a..ffc2376 100644 --- a/src/IDF/relations.php +++ b/src/IDF/relations.php @@ -43,6 +43,8 @@ $m['IDF_Conf'] = array('relate_to' => array('IDF_Project')); $m['IDF_Commit'] = array('relate_to' => array('IDF_Project', 'Pluf_User')); $m['IDF_Scm_Cache_Git'] = array('relate_to' => array('IDF_Project')); +$m['IDF_UserData'] = array('relate_to' => array('Pluf_User')); + Pluf_Signal::connect('Pluf_Template_Compiler::construct_template_tags_modifiers', array('IDF_Middleware', 'updateTemplateTagsModifiers')); diff --git a/src/IDF/templates/idf/admin/tabs.html b/src/IDF/templates/idf/admin/tabs.html index 7a3b25a..f221d61 100644 --- a/src/IDF/templates/idf/admin/tabs.html +++ b/src/IDF/templates/idf/admin/tabs.html @@ -57,7 +57,7 @@
@@ -86,7 +86,7 @@ password or SSH key.{/blocktrans}
'.$i.''.IDF_Diff::padLine(Pluf_esc($line)).'
'. @@ -193,14 +193,14 @@ class IDF_Issue extends Pluf_Model $ic = (in_array($this->status, $request->project->getTagIdsByStatus('closed'))) ? 'issue-c' : 'issue-o'; $out .= sprintf(__('Issue %3$d, %4$s'), $url, $ic, $this->id, Pluf_esc($this->summary)).'
-
'.sprintf(__('Creation of issue %d, by %s'), $url, $ic, $this->id, $user).'
-
'.sprintf(__('Comment on issue %d, by %s'), $url, $ic, $issue->id, $user).'
'. @@ -138,14 +138,14 @@ class IDF_Review_Comment extends Pluf_Model $ic = (in_array($review->status, $request->project->getTagIdsByStatus('closed'))) ? 'issue-c' : 'issue-o'; $out .= sprintf(__('Review %3$d, %4$s'), $url, $ic, $review->id, Pluf_esc($review->summary)).'
-
'.sprintf(__('Update of review %d, by %s'), $url, $ic, $review->id, $user).'
'. Pluf_esc(Pluf_Template_dateAgo($this->creation_dtime, 'without')). @@ -189,15 +189,15 @@ class IDF_Upload extends Pluf_Model $out .= sprintf(__('Download %2$d, %3$s'), $url, $this->id, Pluf_esc($this->summary)).'
-
'.sprintf(__('Addition of download %d, by %s'), $url, $this->id, $user).'
'.$i.''.IDF_Diff::padLine(Pluf_esc($line)).'
'. @@ -186,7 +186,7 @@ class IDF_WikiRevision extends Pluf_Model } $out .= '
-
'.sprintf(__('Change of %s, by %s'), $url, Pluf_esc($page->title), $user).'
{blocktrans} Only project members and admins have write access to the source.
-If you restrict the access to the source, anonymous access is
+If you restrict the access to the source, anonymous access is
not provided and the users must authenticate themselves with their
password or SSH key.{/blocktrans}
  - +
@@ -96,7 +96,7 @@ password or SSH key.{/blocktrans}

{trans 'Instructions:'}

{blocktrans}You can configure here the project tabs access rights and notification emails.{/blocktrans}

-

{blocktrans}Notification emails will be sent from the {$from_email} address, if you send the email to a mailing list, you may need to register this email address. If you do not want to send emails for a given type of changes, simply leave the corresponding field empty.{/blocktrans}

+

{blocktrans}Notification emails will be sent from the {$from_email} address, if you send the email to a mailing list, you may need to register this email address. Multiple email addresses must be separated through commas (','). If you do not want to send emails for a given type of changes, simply leave the corresponding field empty.{/blocktrans}

{blocktrans}If you mark a project as private, only the project members and administrators, together with the extra authorized users you provide will have access to the project. You will still be able to define further access rights for the different tabs but the "Open to all" and "Signed in users" will default to authorized users only.{/blocktrans}

{blocktrans}Specify each person by its login. Each person must have already registered with the given login. Separate the logins with commas and/or new lines.{/blocktrans}

@@ -111,7 +111,7 @@ $(document).ready(function(){ $("#id_private_project").click(function(){ if ($("#id_private_project").is(":checked")) { $("#authorized-users-row").show(); - } else { + } else { $("#authorized-users-row").hide(); } }); diff --git a/src/IDF/templates/idf/gadmin/users/update.html b/src/IDF/templates/idf/gadmin/users/update.html index 2c431e2..d4a081d 100644 --- a/src/IDF/templates/idf/gadmin/users/update.html +++ b/src/IDF/templates/idf/gadmin/users/update.html @@ -9,7 +9,7 @@ {/if} {/if} -
+ {aurl 'url', 'IDF_Views_User::view', array($cuser.login)} @@ -51,7 +51,48 @@ -{if $user.administrator} + + + + + + + + + + + + + + + + + + + + + + + + + + +{if $user.administrator} + diff --git a/src/IDF/templates/idf/issues/view.html b/src/IDF/templates/idf/issues/view.html index 191909a..24e57d8 100644 --- a/src/IDF/templates/idf/issues/view.html +++ b/src/IDF/templates/idf/issues/view.html @@ -1,10 +1,17 @@ {extends "idf/issues/base.html"} {block titleicon}{if $form} {/if}{/block} {block body} -{assign $i = 0} -{assign $nc = $comments.count()} -{foreach $comments as $c}{ashowuser 'submitter', $c.get_submitter(), $request}{assign $who = $c.get_submitter()} -
 +{assign $i = 0} +{assign $nc = $comments.count()} +{foreach $comments as $c}{ashowuser 'submitter', $c.get_submitter(), $request} +{assign $submitter = $c.get_submitter()} +{assign $submitter_data = $c.get_submitter_data()} +
+{if $submitter_data.avatar != ''} + +{else} + +{/if} {if $i == 0}

{blocktrans}Reported by {$submitter}, {$c.creation_dtime|date}{/blocktrans}

{else} @@ -20,14 +27,13 @@ {if $attachments.count() > 0}
    -{foreach $attachments as $a}
  • {$a.filename} - {$a.filesize|size}
  • {/foreach} -
{/if} +{foreach $attachments as $a}
  • {$a.filename} - {$a.filesize|size}{if $a.isText()} - {trans 'view'}{/if}
  • {/foreach}{/if} {if $i> 0 and $c.changedIssue()} -
    +
    {foreach $c.changes as $w => $v} {if $w == 'su'}{trans 'Summary:'}{/if}{if $w == 'st'}{trans 'Status:'}{/if}{if $w == 'ow'}{trans 'Owner:'}{/if}{if $w == 'lb'}{trans 'Labels:'}{/if} {if $w == 'lb'}{assign $l = implode(', ', $v)}{$l}{else}{$v}{/if}
    {/foreach} -
    +
    {/if}
    {assign $i = $i + 1}{if $i == $nc and false == $form}
    diff --git a/src/IDF/templates/idf/project/home.html b/src/IDF/templates/idf/project/home.html index ef46e8f..d8b468d 100644 --- a/src/IDF/templates/idf/project/home.html +++ b/src/IDF/templates/idf/project/home.html @@ -3,7 +3,7 @@ {block tabhome} class="active"{/block} {block subtabs}
    -{trans 'Welcome'} | {trans 'Latest Updates'}{superblock} +{trans 'Welcome'} | {trans 'Latest Updates'}{superblock}
    {/block} {block body} diff --git a/src/IDF/templates/idf/review/view.html b/src/IDF/templates/idf/review/view.html index ff9bc23..462a275 100644 --- a/src/IDF/templates/idf/review/view.html +++ b/src/IDF/templates/idf/review/view.html @@ -79,9 +79,9 @@ to propose more contributions.
    {trans 'Login:'}{if $form.f.password2.errors}{$form.f.password2.fieldErrors}{/if} {$form.f.password2|unsafe}
    {trans "Public Profile"}
    {$form.f.description.labelTag}:{if $form.f.description.errors}{$form.f.description.fieldErrors}{/if} +{$form.f.description|unsafe} +
    {$form.f.twitter.labelTag}:{if $form.f.twitter.errors}{$form.f.twitter.fieldErrors}{/if} +{$form.f.twitter|unsafe} +
    {$form.f.public_email.labelTag}:{if $form.f.public_email.errors}{$form.f.public_email.fieldErrors}{/if} +{$form.f.public_email|unsafe} +
    {$form.f.website.labelTag}:{if $form.f.website.errors}{$form.f.website.fieldErrors}{/if} +{$form.f.website|unsafe} +
    {$form.f.custom_avatar.labelTag}:{if $form.f.custom_avatar.errors}{$form.f.custom_avatar.fieldErrors}{/if} +{$form.f.custom_avatar|unsafe}
    +{$form.f.custom_avatar.help_text} +
    {if $form.f.remove_custom_avatar.errors}{$form.f.remove_custom_avatar.fieldErrors}{/if} +{$form.f.remove_custom_avatar|unsafe} +{$form.f.remove_custom_avatar.labelTag}
    +{$form.f.remove_custom_avatar.help_text}
    {trans "Administrative"}
    {if $form.f.staff.errors}{$form.f.staff.fieldErrors}{/if} {$form.f.staff|unsafe} @@ -69,7 +110,7 @@
      - + | {trans 'Cancel'}
      - | + | {trans 'Cancel'}
    {assign $fcomments = $def[2]} -{assign $nc = $fcomments.count()} +{assign $nc = $fcomments.count()} {assign $i = 1} -{foreach $fcomments as $c} +{foreach $fcomments as $c}
    {assign $who = $c.get_comment().get_submitter()}{aurl 'whourl', 'IDF_Views_User::view', array($who.login)} {aurl 'url', 'IDF_Views_Review::view', array($project.shortname, $review.id)} {assign $id = $c.id} @@ -101,13 +101,18 @@ to propose more contributions. {/if} {/foreach} -{assign $i = 1} -{assign $nc = $comments.count()} +{assign $i = 1} +{assign $nc = $comments.count()} {if $nc}

    {trans 'General Comments'}

    {/if} -{foreach $comments as $c}{ashowuser 'submitter', $c.get_submitter(), $request}{assign $who = $c.get_submitter()} -
     +{foreach $comments as $c}{ashowuser 'submitter', $c.get_submitter(), $request}{assign $submitter = $c.get_submitter()}{assign $submitter_data = $c.get_submitter_data()} +
    +{if $submitter_data.avatar != ''} +  +{else} +  +{/if} {aurl 'url', 'IDF_Views_Review::view', array($project.shortname, $review.id)} {assign $id = $c.id} {assign $url = $url~'#ic'~$c.id} @@ -118,11 +123,11 @@ to propose more contributions. {if strlen($c.content) > 0}
    {issuetext $c.content, $request}
    {/if} {if $c.changedReview()} -
    +
    {foreach $c.changes as $w => $v} {if $w == 'su'}{trans 'Summary:'}{/if}{if $w == 'st'}{trans 'Status:'}{/if} {$v}
    {/foreach} -
    +
    {/if}
    {assign $i = $i + 1}{if $i == $nc+1 and $user.isAnonymous()} {/if} -
    + {aurl 'url', 'IDF_Views_User::view', array($user.login)} @@ -53,6 +53,46 @@ {$form.f.password2|unsafe} + + + + + + + + + + + + + + + + + + + + + + + + + +
    {trans 'Login:'}
    {trans "Public Profile"}
    {$form.f.description.labelTag}:{if $form.f.description.errors}{$form.f.description.fieldErrors}{/if} +{$form.f.description|unsafe} +
    {$form.f.twitter.labelTag}:{if $form.f.twitter.errors}{$form.f.twitter.fieldErrors}{/if} +{$form.f.twitter|unsafe} +
    {$form.f.public_email.labelTag}:{if $form.f.public_email.errors}{$form.f.public_email.fieldErrors}{/if} +{$form.f.public_email|unsafe} +
    {$form.f.website.labelTag}:{if $form.f.website.errors}{$form.f.website.fieldErrors}{/if} +{$form.f.website|unsafe} +
    {$form.f.custom_avatar.labelTag}:{if $form.f.custom_avatar.errors}{$form.f.custom_avatar.fieldErrors}{/if} +{$form.f.custom_avatar|unsafe}
    +{$form.f.custom_avatar.help_text} +
    {if $form.f.remove_custom_avatar.errors}{$form.f.remove_custom_avatar.fieldErrors}{/if} +{$form.f.remove_custom_avatar|unsafe} +{$form.f.remove_custom_avatar.labelTag}
    +{$form.f.remove_custom_avatar.help_text}
    {trans "Key Management"}
    {$form.f.public_key.labelTag}: {if $form.f.public_key.errors}{$form.f.public_key.fieldErrors}{/if} diff --git a/src/IDF/templates/idf/user/public.html b/src/IDF/templates/idf/user/public.html index 17d6b25..2373a23 100644 --- a/src/IDF/templates/idf/user/public.html +++ b/src/IDF/templates/idf/user/public.html @@ -2,9 +2,39 @@ {block body} - + +{if $user_data.description != ''} + + + + +{/if} +{if $user_data.twitter != ''} + + + + +{/if} +{if $user_data.public_email != ''} + + + + +{/if} +{if $user_data.website != ''} + + + + +{/if} + diff --git a/www/media/idf/css/style.css b/www/media/idf/css/style.css index fe1f8ab..ef64f05 100644 --- a/www/media/idf/css/style.css +++ b/www/media/idf/css/style.css @@ -104,6 +104,11 @@ table.form th { font-weight: normal; } +table.form td.separator { + font-weight: bold; + text-align: center; +} + .px-message-error { padding-left: 37px; background: url("../img/dialog-error.png"); @@ -499,6 +504,21 @@ table.commit th { table.commit td, table.commit th { padding: 3px; } +table.commit table.changes td { + padding: 2px; +} +table.commit table.changes table.properties { + margin: 0; +} +table.commit table.changes table.properties tr:nth-child(even) { + background: #E4E8E0; +} +table.commit table.changes table.properties td { + white-space: pre-wrap; +} +table.commit table.changes table.properties td.removed { + font-style: italic; +} /** * syntax highlighting of diffs
    {if $user_data.avatar != ''} +  +{else} +  +{/if} + {$member}
    {trans 'Description:'}{$user_data.description}
    {trans 'Twitter:'}{$user_data.twitter}
    {trans 'Public Email:'}{$user_data.public_email}
    {trans 'Website:'}{$user_data.website}
    {trans 'Last time seen:'} {$member.last_login|dateago}