diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb index d87bc6d2c..4525176ac 100644 --- a/app/controllers/attachments_controller.rb +++ b/app/controllers/attachments_controller.rb @@ -1,373 +1,373 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 Jean-Philippe Lang -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -class AttachmentsController < ApplicationController - layout "users_base" - before_filter :find_project, :only => [:show, :download, :thumbnail, :destroy, :delete_homework]#, :except => [:upload, :autocomplete] - before_filter :file_readable, :read_authorize, :only => [:show, :thumbnail]#Modified by young - before_filter :delete_authorize, :only => :destroy - before_filter :authorize_global, :only => :upload - - before_filter :login_without_softapplication, only: [:download] - accept_api_auth :show, :download, :upload - require 'iconv' - - - def show - respond_to do |format| - format.html { - if @attachment.is_diff? - @diff = File.new(@attachment.diskfile, "rb").read - @diff_type = params[:type] || User.current.pref[:diff_type] || 'inline' - @diff_type = 'inline' unless %w(inline sbs).include?(@diff_type) - # Save diff type as user preference - if User.current.logged? && @diff_type != User.current.pref[:diff_type] - User.current.pref[:diff_type] = @diff_type - User.current.preference.save - end - render :action => 'diff' - elsif @attachment.is_text? && @attachment.filesize <= Setting.file_max_size_displayed.to_i.kilobyte - @content = File.new(@attachment.diskfile, "rb").read - # 编码为非 UTF-8先进行间接转码 - # 部分unicode编码不直接支持转为 UTF-8 - # modify by nwb - if @content.encoding.name != 'UTF-8' - @content = @content.force_encoding('GBK') - @content = @content.encode('UTF-8') - end - render :action => 'file' - else - download - end - } - format.api - end - end - - def download - # modify by nwb - # 下载添加权限设置 - candown = false - if (@attachment.container.has_attribute?(:project) || @attachment.container.has_attribute?(:project_id)) && @attachment.container.project - project = @attachment.container.project - candown= User.current.member_of?(project) || (project.is_public && @attachment.is_public == 1) - elsif @attachment.container.is_a?(Project) - project = @attachment.container - candown= User.current.member_of?(project) || (project.is_public && @attachment.is_public == 1) - elsif (@attachment.container.has_attribute?(:course) ||@attachment.container.has_attribute?(:course_id) ) && @attachment.container.course - course = @attachment.container.course - candown= User.current.member_of_course?(course) || (course.is_public==1 && @attachment.is_public == 1) - elsif @attachment.container.is_a?(Course) - course = @attachment.container - candown= User.current.member_of_course?(course) || (course.is_public==1 && @attachment.is_public == 1) - elsif @attachment.container.class.to_s=="HomeworkAttach" && @attachment.container.bid.reward_type == 3 - candown = true - else - candown = @attachment.is_public == 1 - end - if candown || User.current.admin? || User.current.id == @attachment.author_id - @attachment.increment_download - - if stale?(:etag => @attachment.digest) - # images are sent inline - send_file @attachment.diskfile, :filename => filename_for_content_disposition(@attachment.filename), - :type => detect_content_type(@attachment), - :disposition => (@attachment.image? ? 'inline' : 'attachment') - end - - else - render_403 :message => :notice_not_authorized - end - - rescue => e - redirect_to "http://" + (Setting.host_name.to_s) +"/file_not_found.html" - end - - #更新资源文件类型 - def updateType - @attachment = Attachment.find(params[:attachmentid]) - if @attachment != nil - @attachment.attachtype = params[:newtype] - @attachment.save - render :text =>'success' - else - render :text=>'error' - end - end - - # 更新文件密级 - def updateFileDense - @attachment = Attachment.find(params[:attachmentid]) - if @attachment != nil - filedense = params[:newtype].to_s - # d = Iconv.conv("unicodebig","utf-8",filedense) - if filedense == "%E5%85%AC%E5%BC%80" #l(:field_is_public) - @attachment.is_public = 1 - else - @attachment.is_public = 0 - end - @attachment.save - @newfiledense = filedense - end - respond_to do |format| - format.js - end - end - - def thumbnail - if @attachment.thumbnailable? && thumbnail = @attachment.thumbnail(:size => params[:size]) - if stale?(:etag => thumbnail) - send_file thumbnail, - :filename => filename_for_content_disposition(@attachment.filename), - :type => detect_content_type(@attachment), - :disposition => 'inline' - end - else - # No thumbnail for the attachment or thumbnail could not be created - render :nothing => true, :status => 404 - end - end - - - def upload - # Make sure that API users get used to set this content type - # as it won't trigger Rails' automatic parsing of the request body for parameters - unless request.content_type == 'application/octet-stream' - render :nothing => true, :status => 406 - return - end - - @attachment = Attachment.new(:file => request.raw_post) - @attachment.author = User.current - @attachment.filename = params[:filename].presence || Redmine::Utils.random_hex(16) - saved = @attachment.save - - respond_to do |format| - format.js - format.api { - if saved - render :action => 'upload', :status => :created - else - render_validation_errors(@attachment) - end - } - end - end - - def destroy - if @attachment.container.respond_to?(:init_journal) - @attachment.container.init_journal(User.current) - end - if @attachment.container - # Make sure association callbacks are called - @attachment.container.attachments.delete(@attachment) - else - @attachment.destroy - end - - respond_to do |format| - if !@attachment.container.nil? && - (@attachment.container.is_a?(Course) || ((@attachment.container.has_attribute?(:course) || @attachment.container.has_attribute?(:course_id) ) && - @attachment.container.course ) || ((@attachment.container.has_attribute?(:board) || @attachment.container.has_attribute?(:board_id)) && - @attachment.container.board && @attachment.container.board.course ) ) - if @attachment.container.is_a?(News) - format.html { redirect_to_referer_or news_path(@attachment.container) } - elsif @attachment.container.is_a?(Message) - format.html { redirect_to_referer_or new_board_message_path(@attachment.container) } - elsif @course.nil? - format.html { redirect_to_referer_or forum_memo_path(@attachment.container.forum, @attachment.container) } - else - format.html { redirect_to_referer_or course_path(@course) } - end - else - if @project.nil? - format.html { redirect_to_referer_or forum_memo_path(@attachment.container.forum, @attachment.container) } - else - format.html { redirect_to_referer_or project_path(@project) } - end - end - - format.js - end - end - - def delete_homework - @bid = @attachment.container.bid - # Make sure association callbacks are called - container = @attachment.container - @attachment.container.attachments.delete(@attachment) - #if container.attachments.empty? - #container.delete - #end - - respond_to do |format| - format.html { redirect_to_referer_or respond_path(@bid) } - format.js - end - end - - #删除竞赛作品的附件 - def delete_softapplications - @attachment = Attachment.find params[:id] - @softapplication = @attachment.container if @attachment!=nil - @attachment.container.attachments.delete(@attachment) if @attachment!=nil - respond_to do |format| - format.html { redirect_to_referer_or edit_softapplication_path(@softapplication) } - #format.js - end - end - - def autocomplete - # modify by nwb - if params[:project_id] - @project = Project.find_by_id(params[:project_id]) - elsif params[:course_id] - @course = Course.find_by_id(params[:course_id]) - end - - respond_to do |format| - format.js - end - end - - def add_exist_file_to_project - classname = params[:class_name] - class_id = params[:class_id] - attachments = params[:attachment][:attach] - - obj = Object.const_get(classname).find_by_id(class_id) - attachments.collect do |attach_id| - ori = Attachment.find_by_id(attach_id) - next if ori.blank? - attach_copied_obj = ori.copy - attach_copied_obj.tag_list.add(ori.tag_list) # tag关联 - attach_copied_obj.container = obj - attach_copied_obj.created_on = Time.now - attach_copied_obj.author_id = User.current.id - if attach_copied_obj.attachtype == nil - attach_copied_obj.attachtype = 1 - end - @obj = obj - @save_flag = attach_copied_obj.save - @save_message = attach_copied_obj.errors.full_messages - end - - respond_to do |format| - format.js - end - rescue NoMethodError - @save_flag = false - @save_message = [] << l(:error_attachment_empty) - respond_to do |format| - format.js - end - end - - def add_exist_file_to_course - class_id = params[:class_id] - attachments = params[:attachment][:attach] - - obj = Course.find_by_id(class_id) - attachments.collect do |attach_id| - ori = Attachment.find_by_id(attach_id) - next if ori.blank? - attach_copied_obj = ori.copy - attach_copied_obj.tag_list.add(ori.tag_list) # tag关联 - attach_copied_obj.container = obj - attach_copied_obj.created_on = Time.now - attach_copied_obj.author_id = User.current.id - if attach_copied_obj.attachtype == nil - attach_copied_obj.attachtype = 4 - end - @obj = obj - @save_flag = attach_copied_obj.save - @save_message = attach_copied_obj.errors.full_messages - end - - respond_to do |format| - format.js - end - rescue NoMethodError - @save_flag = false - @save_message = [] << l(:error_attachment_empty) - respond_to do |format| - format.js - end - end - -private - def find_project - @attachment = Attachment.find(params[:id]) - # Show 404 if the filename in the url is wrong - # modify by nwb - raise ActiveRecord::RecordNotFound if params[:filename] && params[:filename] != @attachment.filename - if @attachment.container_type == 'Course' - @course = @attachment.course - elsif !@attachment.container.nil? && (@attachment.container.has_attribute?(:course) || @attachment.container.has_attribute?(:course)) && @attachment.container.course - @course = @attachment.container.course - else - unless @attachment.container_type == 'Bid' || @attachment.container_type == 'HomeworkAttach' || @attachment.container_type == 'Memo' || @attachment.container_type == 'Softapplication' - @project = @attachment.project - end - end - rescue ActiveRecord::RecordNotFound - render_404 - end - - # Checks that the file exists and is readable - def file_readable - if @attachment.readable? - true - else - logger.error "Cannot send attachment, #{@attachment.diskfile} does not exist or is unreadable." - render_404 - end - end - - def read_authorize - if @attachment.container_type == "HomeworkAttach" || @attachment.container_type == 'Bid' - true - #User.current.allowed_to?(:view_homework_attaches, @attachment.project) ? true : deny_access - else - @attachment.visible? ? true : deny_access - end - end - - def delete_authorize - @attachment.deletable? ? true : deny_access - end - - def detect_content_type(attachment) - content_type = attachment.content_type - if content_type.blank? - content_type = Redmine::MimeType.of(attachment.filename) - end - content_type.to_s - end - - def login_without_softapplication - referer = request.headers['Referer'] - require_login unless referer =~ /softapplication/ - end - - def renderTag - @attachmentNew = Attachment.find(params[:attchmentId]) - respond_to do |format| - format.js - end - end -end +# Redmine - project management software +# Copyright (C) 2006-2013 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class AttachmentsController < ApplicationController + layout "users_base" + before_filter :find_project, :only => [:show, :download, :thumbnail, :destroy, :delete_homework]#, :except => [:upload, :autocomplete] + before_filter :file_readable, :read_authorize, :only => [:show, :thumbnail]#Modified by young + before_filter :delete_authorize, :only => :destroy + before_filter :authorize_global, :only => :upload + + before_filter :login_without_softapplication, only: [:download] + accept_api_auth :show, :download, :upload + require 'iconv' + + + def show + respond_to do |format| + format.html { + if @attachment.is_diff? + @diff = File.new(@attachment.diskfile, "rb").read + @diff_type = params[:type] || User.current.pref[:diff_type] || 'inline' + @diff_type = 'inline' unless %w(inline sbs).include?(@diff_type) + # Save diff type as user preference + if User.current.logged? && @diff_type != User.current.pref[:diff_type] + User.current.pref[:diff_type] = @diff_type + User.current.preference.save + end + render :action => 'diff' + elsif @attachment.is_text? && @attachment.filesize <= Setting.file_max_size_displayed.to_i.kilobyte + @content = File.new(@attachment.diskfile, "rb").read + # 编码为非 UTF-8先进行间接转码 + # 部分unicode编码不直接支持转为 UTF-8 + # modify by nwb + if @content.encoding.name != 'UTF-8' + @content = @content.force_encoding('GBK') + @content = @content.encode('UTF-8') + end + render :action => 'file' + else + download + end + } + format.api + end + end + + def download + # modify by nwb + # 下载添加权限设置 + candown = false + if (@attachment.container.has_attribute?(:project) || @attachment.container.has_attribute?(:project_id)) && @attachment.container.project + project = @attachment.container.project + candown= User.current.member_of?(project) || (project.is_public && @attachment.is_public == 1) + elsif @attachment.container.is_a?(Project) + project = @attachment.container + candown= User.current.member_of?(project) || (project.is_public && @attachment.is_public == 1) + elsif (@attachment.container.has_attribute?(:course) ||@attachment.container.has_attribute?(:course_id) ) && @attachment.container.course + course = @attachment.container.course + candown= User.current.member_of_course?(course) || (course.is_public==1 && @attachment.is_public == 1) + elsif @attachment.container.is_a?(Course) + course = @attachment.container + candown= User.current.member_of_course?(course) || (course.is_public==1 && @attachment.is_public == 1) + elsif @attachment.container.class.to_s=="HomeworkAttach" && @attachment.container.bid.reward_type == 3 + candown = true + else + candown = @attachment.is_public == 1 + end + if candown || User.current.admin? || User.current.id == @attachment.author_id + @attachment.increment_download + + if stale?(:etag => @attachment.digest) + # images are sent inline + send_file @attachment.diskfile, :filename => filename_for_content_disposition(@attachment.filename), + :type => detect_content_type(@attachment), + :disposition => (@attachment.image? ? 'inline' : 'attachment') + end + + else + render_403 :message => :notice_not_authorized + end + + rescue => e + redirect_to "http://" + (Setting.host_name.to_s) +"/file_not_found.html" + end + + #更新资源文件类型 + def updateType + @attachment = Attachment.find(params[:attachmentid]) + if @attachment != nil + @attachment.attachtype = params[:newtype] + @attachment.save + render :text =>'success' + else + render :text=>'error' + end + end + + # 更新文件密级 + def updateFileDense + @attachment = Attachment.find(params[:attachmentid]) + if @attachment != nil + filedense = params[:newtype].to_s + # d = Iconv.conv("unicodebig","utf-8",filedense) + if filedense == "%E5%85%AC%E5%BC%80" #l(:field_is_public) + @attachment.is_public = 1 + else + @attachment.is_public = 0 + end + @attachment.save + @newfiledense = filedense + end + respond_to do |format| + format.js + end + end + + def thumbnail + if @attachment.thumbnailable? && thumbnail = @attachment.thumbnail(:size => params[:size]) + if stale?(:etag => thumbnail) + send_file thumbnail, + :filename => filename_for_content_disposition(@attachment.filename), + :type => detect_content_type(@attachment), + :disposition => 'inline' + end + else + # No thumbnail for the attachment or thumbnail could not be created + render :nothing => true, :status => 404 + end + end + + + def upload + # Make sure that API users get used to set this content type + # as it won't trigger Rails' automatic parsing of the request body for parameters + unless request.content_type == 'application/octet-stream' + render :nothing => true, :status => 406 + return + end + + @attachment = Attachment.new(:file => request.raw_post) + @attachment.author = User.current + @attachment.filename = params[:filename].presence || Redmine::Utils.random_hex(16) + saved = @attachment.save + + respond_to do |format| + format.js + format.api { + if saved + render :action => 'upload', :status => :created + else + render_validation_errors(@attachment) + end + } + end + end + + def destroy + if @attachment.container.respond_to?(:init_journal) + @attachment.container.init_journal(User.current) + end + if @attachment.container + # Make sure association callbacks are called + @attachment.container.attachments.delete(@attachment) + else + @attachment.destroy + end + + respond_to do |format| + if !@attachment.container.nil? && + (@attachment.container.is_a?(Course) || ((@attachment.container.has_attribute?(:course) || @attachment.container.has_attribute?(:course_id) ) && + @attachment.container.course ) || ((@attachment.container.has_attribute?(:board) || @attachment.container.has_attribute?(:board_id)) && + @attachment.container.board && @attachment.container.board.course ) ) + if @attachment.container.is_a?(News) + format.html { redirect_to_referer_or news_path(@attachment.container) } + elsif @attachment.container.is_a?(Message) + format.html { redirect_to_referer_or new_board_message_path(@attachment.container) } + elsif @course.nil? + format.html { redirect_to_referer_or forum_memo_path(@attachment.container.forum, @attachment.container) } + else + format.html { redirect_to_referer_or course_path(@course) } + end + else + if @project.nil? + format.html { redirect_to_referer_or forum_memo_path(@attachment.container.forum, @attachment.container) } + else + format.html { redirect_to_referer_or project_path(@project) } + end + end + + format.js + end + end + + def delete_homework + @bid = @attachment.container.bid + # Make sure association callbacks are called + container = @attachment.container + @attachment.container.attachments.delete(@attachment) + #if container.attachments.empty? + #container.delete + #end + + respond_to do |format| + format.html { redirect_to_referer_or respond_path(@bid) } + format.js + end + end + + #删除竞赛作品的附件 + def delete_softapplications + @attachment = Attachment.find params[:id] + @softapplication = @attachment.container if @attachment!=nil + @attachment.container.attachments.delete(@attachment) if @attachment!=nil + respond_to do |format| + format.html { redirect_to_referer_or edit_softapplication_path(@softapplication) } + #format.js + end + end + + def autocomplete + # modify by nwb + if params[:project_id] + @project = Project.find_by_id(params[:project_id]) + elsif params[:course_id] + @course = Course.find_by_id(params[:course_id]) + end + + respond_to do |format| + format.js + end + end + + def add_exist_file_to_project + classname = params[:class_name] + class_id = params[:class_id] + attachments = params[:attachment][:attach] + + obj = Object.const_get(classname).find_by_id(class_id) + attachments.collect do |attach_id| + ori = Attachment.find_by_id(attach_id) + next if ori.blank? + attach_copied_obj = ori.copy + attach_copied_obj.tag_list.add(ori.tag_list) # tag关联 + attach_copied_obj.container = obj + attach_copied_obj.created_on = Time.now + attach_copied_obj.author_id = User.current.id + if attach_copied_obj.attachtype == nil + attach_copied_obj.attachtype = 1 + end + @obj = obj + @save_flag = attach_copied_obj.save + @save_message = attach_copied_obj.errors.full_messages + end + + respond_to do |format| + format.js + end + rescue NoMethodError + @save_flag = false + @save_message = [] << l(:error_attachment_empty) + respond_to do |format| + format.js + end + end + + def add_exist_file_to_course + class_id = params[:class_id] + attachments = params[:attachment][:attach] + + obj = Course.find_by_id(class_id) + attachments.collect do |attach_id| + ori = Attachment.find_by_id(attach_id) + next if ori.blank? + attach_copied_obj = ori.copy + attach_copied_obj.tag_list.add(ori.tag_list) # tag关联 + attach_copied_obj.container = obj + attach_copied_obj.created_on = Time.now + attach_copied_obj.author_id = User.current.id + if attach_copied_obj.attachtype == nil + attach_copied_obj.attachtype = 4 + end + @obj = obj + @save_flag = attach_copied_obj.save + @save_message = attach_copied_obj.errors.full_messages + end + + respond_to do |format| + format.js + end + rescue NoMethodError + @save_flag = false + @save_message = [] << l(:error_attachment_empty) + respond_to do |format| + format.js + end + end + +private + def find_project + @attachment = Attachment.find(params[:id]) + # Show 404 if the filename in the url is wrong + # modify by nwb + raise ActiveRecord::RecordNotFound if params[:filename] && params[:filename] != @attachment.filename + if @attachment.container_type == 'Course' + @course = @attachment.course + elsif !@attachment.container.nil? && (@attachment.container.has_attribute?(:course) || @attachment.container.has_attribute?(:course)) && @attachment.container.course + @course = @attachment.container.course + else + unless @attachment.container_type == 'Bid' || @attachment.container_type == 'HomeworkAttach' || @attachment.container_type == 'Memo' || @attachment.container_type == 'Softapplication' + @project = @attachment.project + end + end + rescue ActiveRecord::RecordNotFound + render_404 + end + + # Checks that the file exists and is readable + def file_readable + if @attachment.readable? + true + else + logger.error "Cannot send attachment, #{@attachment.diskfile} does not exist or is unreadable." + render_404 + end + end + + def read_authorize + if @attachment.container_type == "HomeworkAttach" || @attachment.container_type == 'Bid' + true + #User.current.allowed_to?(:view_homework_attaches, @attachment.project) ? true : deny_access + else + @attachment.visible? ? true : deny_access + end + end + + def delete_authorize + @attachment.deletable? ? true : deny_access + end + + def detect_content_type(attachment) + content_type = attachment.content_type + if content_type.blank? + content_type = Redmine::MimeType.of(attachment.filename) + end + content_type.to_s + end + + def login_without_softapplication + referer = request.headers['Referer'] + require_login unless referer =~ /softapplication/ + end + + def renderTag + @attachmentNew = Attachment.find(params[:attchmentId]) + respond_to do |format| + format.js + end + end +end diff --git a/app/controllers/contests_controller.rb b/app/controllers/contests_controller.rb index e2f5e3731..b099a1db5 100644 --- a/app/controllers/contests_controller.rb +++ b/app/controllers/contests_controller.rb @@ -2,33 +2,44 @@ # class BidsController < ApplicationController class ContestsController < ApplicationController layout "contest_base" + menu_item :respond menu_item :project, :only => :show_project menu_item :application, :only => :show_softapplication menu_item :attendingcontests, :only => :show_attendingcontest menu_item :contestnotifications, :only => :index - before_filter :can_show_contest,except: [] - before_filter :find_contest, :only => [:show_contest, :show_project, :show_softapplication, :show_attendingcontest, :index, :set_reward_project, :set_reward_softapplication, :create,:destroy,:more,:back,:add,:add_softapplication,:new,:show_results, :set_reward, - :show_contest_project, :show_contest_user, :join_in_contest, :unjoin_in_contest, :new_join,:show_participator, :settings] - + before_filter :can_show_contest, :except => [] # modified by alan + + # modified by longjun + before_filter :find_contest, :only => [ + :show_contest, :show_project, :show_softapplication, + :show_attendingcontest, :index, :set_reward_project, + :set_reward_softapplication, :create, :destroy, :more, + :back, :add, :add_softapplication, :new,:show_results, + :set_reward, :show_contest_project, :show_contest_user, + :join_in_contest, :unjoin_in_contest, :new_join, :show_participator, :settings + ] + # end longjun + # added by fq before_filter :require_login, :only => [:join_in_contest, :unjoin_in_contest] # end - before_filter :require_login,:only => [:set_reward, :destroy, :add, :new, ] + before_filter :require_login,:only => [:set_reward, :destroy, :add, :new ] helper :watchers helper :attachments - include AttachmentsHelper - include ApplicationHelper helper :projects helper :words + include AttachmentsHelper + include ApplicationHelper + def index # @contests = Contest.visible # @contests ||= [] - @offset, @limit = api_offset_and_limit({:limit => 10}) + @offset, @limit = api_offset_and_limit(:limit => 10) #@contests = Contest.visible #@contests = @contests.like(params[:name]) if params[:name].present? @contests = Contest.visible.where("name like '%#{params[:name]}%'") @@ -41,43 +52,55 @@ class ContestsController < ApplicationController @offset ||= @contest_pages.reverse_offset if params[:contest_sort_type].present? case params[:contest_sort_type] - when '0' - unless @offset == 0 - @contests = @contests.reorder('contests.commit').offset(@offset).limit(@limit).all.reverse - else - limit = @contest_count % @limit - limit = @limit if limit == 0 - @contests = @contests.reorder('contests.commit').offset(@offset).limit(limit).all.reverse - end - @s_state = 0 - when '1' - unless @offset == 0 - @contests = @contests.reorder('contests.created_on').offset(@offset).limit(@limit).all.reverse - else - limit = @contest_count % @limit - limit = @limit if limit == 0 - @contests = @contests.reorder('contests.created_on').offset(@offset).limit(limit).all.reverse - end - @s_state = 1 - when '2' - unless @offset == 0 - @contests = @contests.offset(@offset).limit(@limit).all.reverse - else - limit = @contest_count % @limit - limit = @limit if limit == 0 - @contests = @contests.offset(@offset).limit(@limit).all.reverse - end - @s_state = 0 + when '0' + # modified by longjun + # never use unless and else + # unless @offset == 0 + if @offset != 0 + @contests = @contests.reorder('contests.commit').offset(@offset).limit(@limit).all.reverse + else + limit = @contest_count % @limit + limit = @limit if limit == 0 + @contests = @contests.reorder('contests.commit').offset(@offset).limit(limit).all.reverse end + @s_state = 0 + when '1' + # modified by longjun + # never use unless and else + # unless @offset == 0 + if @offset != 0 + @contests = @contests.reorder('contests.created_on').offset(@offset).limit(@limit).all.reverse else - unless @offset == 0 - @contests = @contests.reorder('contests.created_on').offset(@offset).limit(@limit).all.reverse - else - limit = @contest_count % @limit - limit = @limit if limit == 0 - @contests = @contests.reorder('contests.created_on').offset(@offset).limit(limit).all.reverse - end - @s_state = 1 + limit = @contest_count % @limit + limit = @limit if limit == 0 + @contests = @contests.reorder('contests.created_on').offset(@offset).limit(limit).all.reverse + end + @s_state = 1 + when '2' + # modified by longjun + # never use unless and else + # unless @offset == 0 + if @offset != 0 + @contests = @contests.offset(@offset).limit(@limit).all.reverse + else + limit = @contest_count % @limit + limit = @limit if limit == 0 + @contests = @contests.offset(@offset).limit(@limit).all.reverse + end + @s_state = 0 + end + else + # modified by longjun + # never use unless and else + # unless @offset == 0 + if @offset != 0 + @contests = @contests.reorder('contests.created_on').offset(@offset).limit(@limit).all.reverse + else + limit = @contest_count % @limit + limit = @limit if limit == 0 + @contests = @contests.reorder('contests.created_on').offset(@offset).limit(limit).all.reverse + end + @s_state = 1 end end @@ -93,7 +116,10 @@ class ContestsController < ApplicationController @bid_pages = Paginator.new @bid_count, @limit, params['page'] @offset ||= @bid_pages.reverse_offset - unless @offset == 0 + # modified by longjun + # never use unless and else + # unless @offset == 0 + if @offset != 0 @bids = @bids.offset(@offset).limit(@limit).all.reverse else limit = @bid_count % @limit @@ -149,10 +175,7 @@ class ContestsController < ApplicationController end end - def new_join - - end def show_participator render :layout => 'base_newcontest' @@ -186,26 +209,43 @@ class ContestsController < ApplicationController def show_contest_project contests = Contest.where('parent_id = ?', @contest.id) @projects = [] - for contest in contests - @projects += contest.contesting_projects - end + + # Modified by longjun + # 用 arr.each 替换 for [ according to the style guide ] + + # for contest in contests + # @projects += contest.contesting_projects + # end + + contests.each do |contest| + @projects += contest.contesting_projects + end + + # end respond_to do |format| format.html { render :layout => 'base_newcontest' } format.api - end end def show_contest_softapplication contests = Contest.where('parent_id = ?', @contest.id) @softapplications = [] - for contest in contests - @softapplications += contest.contesting_softapplications - end - + + # Modified by Longjun + # for contest in contests + # @softapplications += contest.contesting_softapplications + + + contests.each do |contest| + @softapplications += contest.contesting_softapplications + end + + # end + respond_to do |format| format.html { render :layout => 'base_newcontest' @@ -218,12 +258,21 @@ class ContestsController < ApplicationController def show_contest_user contests = Contest.find(:all) @users = [] - for contest in contests - for project in contest.projects - @users += project.users - end + + # Modified by Longjun + # for contest in contests + # for project in contest.projects + # @users += project.users + # end + + + contests.each do |contest| + contest.projects.each do |project| + @uers += project.users + end end - + # end + respond_to do |format| format.html { render :layout => 'base_newcontest' @@ -239,11 +288,20 @@ class ContestsController < ApplicationController # @contesting_project_count = @contesting_project_all.count # @contesting_project_pages = Paginator.new @contesting_project_count, per_page_option, params['page'] @membership.each do |membership| - unless(membership.project.project_type==1) - if User.current.allowed_to?(:quote_project, membership.project) + + # Modified by Longjun + # 将两个判断语句合并 + # unless membership.project.project_type==1 + # if User.current.allowed_to?(:quote_project, membership.project) + # @option << membership.project + # end + # end + if membership.project.project_type != 1 && User.current.allowed_to?(:quote_project, membership.project) @option << membership.project - end + end + # end + end @user = @contest.author @contesting_project = @contest.contesting_projects.all @@ -262,16 +320,19 @@ class ContestsController < ApplicationController @temp = [] @contesting_project.each do |pro| - if pro.project && pro.project.project_status - @temp << pro - end + # modified by longjun + # if pro.project && pro.project.project_status + # @temp << pro + # end + @temp << pro if pro.project && pro.project.project_status + # end longjun @temp end if @temp.size > 0 @contesting_project = @temp.sort {|a,b| b.project.project_status.grade <=> a.project.project_status.grade} end end - @contesting_project = paginateHelper @contesting_project + @contesting_project = paginateHelper(@contesting_project) respond_to do |format| format.html { render :layout => 'base_newcontest' @@ -290,7 +351,7 @@ class ContestsController < ApplicationController @softapplication = Softapplication.all @contesting_softapplication = @contest.contesting_softapplications - @contesting_softapplication = paginateHelper @contesting_softapplication, 10 + @contesting_softapplication = paginateHelper(@contesting_softapplication, 10) # @temp = [] # @softapplicationt.each do |pro| @@ -328,7 +389,7 @@ class ContestsController < ApplicationController # @contesting_project_count = @contesting_project_all.count # @contesting_project_pages = Paginator.new @contesting_project_count, per_page_option, params['page'] @membership.each do |membership| - unless(membership.project.project_type==1) + unless membership.project.project_type==1 #拥有编辑项目权限的可将该项目参赛 if User.current.allowed_to?(:quote_project, membership.project) @option << membership.project @@ -352,27 +413,31 @@ class ContestsController < ApplicationController @temp = [] @contesting_project.each do |pro| - if pro.project && pro.project.project_status - @temp << pro - end + # modified by longjun + # if pro.project && pro.project.project_status + # @temp << pro + # end + @temp << pro if pro.project && pro.project.project_status + # end longjun @temp end if @temp.size > 0 @contesting_project = @temp.sort {|a,b| b.project.project_status.grade <=> a.project.project_status.grade} end end -##取出参赛应用 --应用列表 + # 取出参赛应用 --应用列表 @softapplication = Softapplication.all @contesting_softapplication = @contest.contesting_softapplications. joins("LEFT JOIN softapplications ON contesting_softapplications.softapplication_id=softapplications.id"). joins("LEFT JOIN ( - SELECT * FROM seems_rateable_cached_ratings WHERE cacheable_type='Softapplication' AND DIMENSION = 'quality') AS cached - ON cached.cacheable_id=softapplications.id"). + SELECT * FROM seems_rateable_cached_ratings + WHERE cacheable_type='Softapplication' AND DIMENSION = 'quality') AS cached + ON cached.cacheable_id=softapplications.id"). order("cached.avg").reverse_order @contesting_softapplication = paginateHelper @contesting_softapplication, 10 -##引用base_newcontest整体样式 + #引用base_newcontest整体样式 @contest = Contest.find_by_id(params[:id]) respond_to do |format| format.html { @@ -384,15 +449,15 @@ class ContestsController < ApplicationController ###end -def show_notification - @contest = Contest.find_by_id(params[:id]) - respond_to do |format| - format.html { - render :layout => 'base_newcontest' - } - format.api - end -end + def show_notification + @contest = Contest.find_by_id(params[:id]) + respond_to do |format| + format.html { + render :layout => 'base_newcontest' + } + format.api + end + end def set_reward_project @@ -437,7 +502,11 @@ end project = Project.find(params[:contest]) contest_message = params[:contest_for_save][:contest_message] if ContestingProject.where("project_id = ? and contest_id = ?", project.id, @contest.id).size == 0 - if ContestingProject.cerate_contesting(@contest.id, project.id, contest_message) + # modified by longjun, create 写错了 + # if ContestingProject.cerate_contesting(@contest.id, project.id, contest_message) + if ContestingProject.create_contesting(@contest.id, project.id, contest_message) + # end longjun + flash.now[:notice] = l(:label_bidding_contest_succeed) end else @@ -633,9 +702,7 @@ end end - def manage - end private diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb index e1af9ca34..63ac3baaa 100644 --- a/app/controllers/messages_controller.rb +++ b/app/controllers/messages_controller.rb @@ -1,202 +1,202 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 Jean-Philippe Lang -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -class MessagesController < ApplicationController - include ApplicationHelper - menu_item :boards - default_search_scope :messages - before_filter :find_board, :only => [:new, :preview,:edit] - before_filter :find_attachments, :only => [:preview] - before_filter :find_message, :except => [:new, :preview] - before_filter :authorize, :except => [:preview, :edit, :destroy, :new] - - helper :boards - helper :watchers - helper :attachments - include AttachmentsHelper - helper :project_score - - REPLIES_PER_PAGE = 25 unless const_defined?(:REPLIES_PER_PAGE) - - # Show a topic and its replies - def show - @isReply = true - page = params[:page] - # Find the page of the requested reply - if params[:r] && page.nil? - offset = @topic.children.count(:conditions => ["#{Message.table_name}.id < ?", params[:r].to_i]) - page = 1 + offset / REPLIES_PER_PAGE - end - - @reply_count = @topic.children.count - @reply_pages = Paginator.new @reply_count, REPLIES_PER_PAGE, page - @replies = @topic.children. - includes(:author, :attachments, {:board => :project}). - reorder("#{Message.table_name}.created_on DESC"). - limit(@reply_pages.per_page). - offset(@reply_pages.offset). - all - - @reply = Message.new(:subject => "RE: #{@message.subject}") - if @course - render :action => "show", :layout => "base_courses"#by young - else - render :action => "show", :layout => "base_projects"#by young - end - end - - # Create a new topic - def new - @message = Message.new - @message.author = User.current - @message.board = @board - @message.safe_attributes = params[:message] - if request.post? - @message.save_attachments(params[:attachments]) - if @message.save - call_hook(:controller_messages_new_after_save, { :params => params, :message => @message}) - render_attachment_warning_if_needed(@message) - redirect_to board_message_path(@board, @message) - else - layout_file = @project ? 'base_projects' : 'base_courses' - render :action => 'new', :layout => layout_file - end - end - end - - # Reply to a topic - def reply - if params[:reply][:content] == "" - (redirect_to board_message_path(@board, @topic, :r => @reply), :notice => l(:label_reply_empty);return) - end - @quote = params[:quote][:quote] - @reply = Message.new - @reply.author = User.current - @reply.board = @board - @reply.safe_attributes = params[:reply] - @reply.content = @quote + @reply.content - @topic.children << @reply - #@topic.update_attribute(:updated_on, Time.now) - if !@reply.new_record? - call_hook(:controller_messages_reply_after_save, { :params => params, :message => @reply}) - attachments = Attachment.attach_files(@reply, params[:attachments]) - render_attachment_warning_if_needed(@reply) - else - #render file: 'messages#show', layout: 'base_courses' - end - redirect_to board_message_path(@board, @topic, :r => @reply) - - end - - # Edit a message - def edit - @isReply = false - if @project - (render_403; return false) unless @message.editable_by?(User.current) - else - (render_403; return false) unless @message.course_editable_by?(User.current) - end - @message.safe_attributes = params[:message] - if request.post? && @message.save - attachments = Attachment.attach_files(@message, params[:attachments]) - render_attachment_warning_if_needed(@message) - flash[:notice] = l(:notice_successful_update) - @message.reload - redirect_to board_message_path(@message.board, @message.root, :r => (@message.parent_id && @message.id)) - elsif request.get? - respond_to do |format| - format.html { - layout_file = @project ? 'base_projects' : 'base_courses' - render :layout => layout_file - } - end - end - end - - # Delete a messages - def destroy - if @project - (render_403; return false) unless @message.destroyable_by?(User.current) - else - (render_403; return false) unless @message.course_destroyable_by?(User.current) - end - r = @message.to_param - @message.destroy - # modify by nwb - if @project - if @message.parent - redirect_to board_message_path(@board, @message.parent, :r => r) - else - redirect_to project_board_path(@project, @board) - end - elsif @course - if @message.parent - redirect_to board_message_path(@board, @message.parent, :r => r) - else - redirect_to course_board_path(@course, @board) - end - end - end - - def quote - @subject = @message.subject - @subject = "RE: #{@subject}" unless @subject.starts_with?('RE:') - - @content = "> #{ll(Setting.default_language, :text_user_wrote, @message.author)}\n> " - @temp = Message.new - #@temp.content = "> #{ll(Setting.default_language, :text_user_wrote, @message.author)}> " - @content << @message.content.to_s.strip.gsub(%r{
((.|\s)*?)
}m, '[...]').gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n" - @content_html = textilizable(@content) - @temp.content = @content_html - #@content = "#{ll(Setting.default_language, :text_user_wrote, @message.author)}
  " - #@content << @message.content.to_s.strip.gsub(%r{
((.|\s)*?)
}m, '[...]').gsub(/(\r?\n|\r\n?)/, "\n") + "\n\n
" - #@content = "
" << @content - #@temp = Message.new - #@temp.content = @content - - end - - def preview - message = @board.messages.find_by_id(params[:id]) - @text = (params[:message] || params[:reply])[:content] - @previewed = message - render :partial => 'common/preview' - end - -private - def find_message - return unless find_board - @message = @board.messages.find(params[:id], :include => :parent) - @topic = @message.root - rescue ActiveRecord::RecordNotFound - render_404 - end - - def find_board - #modify by nwb - @board = Board.find(params[:board_id]) - if @board.project_id != -1 && @board.project_id != nil - @project = @board.project - elsif @board.course_id - @course = @board.course - end - - rescue ActiveRecord::RecordNotFound - render_404 - nil - end -end +# Redmine - project management software +# Copyright (C) 2006-2013 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class MessagesController < ApplicationController + include ApplicationHelper + menu_item :boards + default_search_scope :messages + before_filter :find_board, :only => [:new, :preview,:edit] + before_filter :find_attachments, :only => [:preview] + before_filter :find_message, :except => [:new, :preview] + before_filter :authorize, :except => [:preview, :edit, :destroy, :new] + + helper :boards + helper :watchers + helper :attachments + include AttachmentsHelper + helper :project_score + + REPLIES_PER_PAGE = 25 unless const_defined?(:REPLIES_PER_PAGE) + + # Show a topic and its replies + def show + @isReply = true + page = params[:page] + # Find the page of the requested reply + if params[:r] && page.nil? + offset = @topic.children.count(:conditions => ["#{Message.table_name}.id < ?", params[:r].to_i]) + page = 1 + offset / REPLIES_PER_PAGE + end + + @reply_count = @topic.children.count + @reply_pages = Paginator.new @reply_count, REPLIES_PER_PAGE, page + @replies = @topic.children. + includes(:author, :attachments, {:board => :project}). + reorder("#{Message.table_name}.created_on DESC"). + limit(@reply_pages.per_page). + offset(@reply_pages.offset). + all + + @reply = Message.new(:subject => "RE: #{@message.subject}") + if @course + render :action => "show", :layout => "base_courses"#by young + else + render :action => "show", :layout => "base_projects"#by young + end + end + + # Create a new topic + def new + @message = Message.new + @message.author = User.current + @message.board = @board + @message.safe_attributes = params[:message] + if request.post? + @message.save_attachments(params[:attachments]) + if @message.save + call_hook(:controller_messages_new_after_save, { :params => params, :message => @message}) + render_attachment_warning_if_needed(@message) + redirect_to board_message_path(@board, @message) + else + layout_file = @project ? 'base_projects' : 'base_courses' + render :action => 'new', :layout => layout_file + end + end + end + + # Reply to a topic + def reply + if params[:reply][:content] == "" + (redirect_to board_message_path(@board, @topic, :r => @reply), :notice => l(:label_reply_empty);return) + end + @quote = params[:quote][:quote] + @reply = Message.new + @reply.author = User.current + @reply.board = @board + @reply.safe_attributes = params[:reply] + @reply.content = @quote + @reply.content + @topic.children << @reply + #@topic.update_attribute(:updated_on, Time.now) + if !@reply.new_record? + call_hook(:controller_messages_reply_after_save, { :params => params, :message => @reply}) + attachments = Attachment.attach_files(@reply, params[:attachments]) + render_attachment_warning_if_needed(@reply) + else + #render file: 'messages#show', layout: 'base_courses' + end + redirect_to board_message_path(@board, @topic, :r => @reply) + + end + + # Edit a message + def edit + @isReply = false + if @project + (render_403; return false) unless @message.editable_by?(User.current) + else + (render_403; return false) unless @message.course_editable_by?(User.current) + end + @message.safe_attributes = params[:message] + if request.post? && @message.save + attachments = Attachment.attach_files(@message, params[:attachments]) + render_attachment_warning_if_needed(@message) + flash[:notice] = l(:notice_successful_update) + @message.reload + redirect_to board_message_path(@message.board, @message.root, :r => (@message.parent_id && @message.id)) + elsif request.get? + respond_to do |format| + format.html { + layout_file = @project ? 'base_projects' : 'base_courses' + render :layout => layout_file + } + end + end + end + + # Delete a messages + def destroy + if @project + (render_403; return false) unless @message.destroyable_by?(User.current) + else + (render_403; return false) unless @message.course_destroyable_by?(User.current) + end + r = @message.to_param + @message.destroy + # modify by nwb + if @project + if @message.parent + redirect_to board_message_path(@board, @message.parent, :r => r) + else + redirect_to project_board_path(@project, @board) + end + elsif @course + if @message.parent + redirect_to board_message_path(@board, @message.parent, :r => r) + else + redirect_to course_board_path(@course, @board) + end + end + end + + def quote + @subject = @message.subject + @subject = "RE: #{@subject}" unless @subject.starts_with?('RE:') + + @content = "> #{ll(Setting.default_language, :text_user_wrote, @message.author)}\n> " + @temp = Message.new + #@temp.content = "> #{ll(Setting.default_language, :text_user_wrote, @message.author)}> " + @content << @message.content.to_s.strip.gsub(%r{
((.|\s)*?)
}m, '[...]').gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n" + @content_html = textilizable(@content) + @temp.content = @content_html + #@content = "#{ll(Setting.default_language, :text_user_wrote, @message.author)}
  " + #@content << @message.content.to_s.strip.gsub(%r{
((.|\s)*?)
}m, '[...]').gsub(/(\r?\n|\r\n?)/, "\n") + "
\n\n
" + #@content = "
" << @content + #@temp = Message.new + #@temp.content = @content + + end + + def preview + message = @board.messages.find_by_id(params[:id]) + @text = (params[:message] || params[:reply])[:content] + @previewed = message + render :partial => 'common/preview' + end + +private + def find_message + return unless find_board + @message = @board.messages.find(params[:id], :include => :parent) + @topic = @message.root + rescue ActiveRecord::RecordNotFound + render_404 + end + + def find_board + #modify by nwb + @board = Board.find(params[:board_id]) + if @board.project_id != -1 && @board.project_id != nil + @project = @board.project + elsif @board.course_id + @course = @board.course + end + + rescue ActiveRecord::RecordNotFound + render_404 + nil + end +end diff --git a/app/controllers/my_controller.rb b/app/controllers/my_controller.rb index 32ae2efc2..1e58c53f1 100644 --- a/app/controllers/my_controller.rb +++ b/app/controllers/my_controller.rb @@ -75,6 +75,7 @@ class MyController < ApplicationController # Edit user's account def account @user = User.current + lg=@user.login @pref = @user.pref diskfile = disk_filename('User', @user.id) diskfile1 = diskfile + 'temp' @@ -137,7 +138,7 @@ class MyController < ApplicationController if File.exist?(diskfile1) File.delete(diskfile1) end - @user + @user.login = lg end else # 确保文件被删除 diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index a705d6934..39865d4e9 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -1,606 +1,606 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 Jean-Philippe Lang -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -require 'SVG/Graph/Bar' -require 'SVG/Graph/BarHorizontal' -require 'digest/sha1' -require 'redmine/scm/adapters/abstract_adapter' -require 'tempfile' - -class ChangesetNotFound < Exception; end -class InvalidRevisionParam < Exception; end - -class RepositoriesController < ApplicationController - menu_item :repository - menu_item :settings, :only => [:new, :create, :edit, :update, :destroy, :committers] - default_search_scope :changesets - - before_filter :find_project_by_project_id, :only => [:new, :create, :newrepo] - before_filter :find_repository, :only => [:edit, :update, :destroy, :committers] - before_filter :find_project_repository, :except => [:new, :create, :newcreate, :edit, :update, :destroy, :committers, :newrepo] - before_filter :find_changeset, :only => [:revision, :add_related_issue, :remove_related_issue] - before_filter :authorize , :except => [:newrepo,:newcreate,:fork] - accept_rss_auth :revisions - # hidden repositories filter // 隐藏代码过滤器 - before_filter :check_hidden_repo, :only => [:show, :stats, :revisions, :revision, :diff ] - helper :repositories - include RepositoriesHelper - helper :project_score - #@root_path = RepositoriesHelper::ROOT_PATH - - - rescue_from Redmine::Scm::Adapters::CommandFailed, :with => :show_error_command_failed - def new - scm = params[:repository_scm] || (Redmine::Scm::Base.all & Setting.enabled_scm).first - @repository = Repository.factory(scm) - @repository.is_default = @project.repository.nil? - @repository.project = @project - @course_tag = params[:course] - if @course_tag == 1 - render :layout => 'base_courses' - else - render :layout => 'base_projects' - end - end - - - def newrepo - scm = params[:repository_scm] || (Redmine::Scm::Base.all & Setting.enabled_scm).first - @repository = Repository.factory(scm) - @repository.is_default = @project.repository.nil? - @repository.project = @project - @course_tag = params[:course] - if @course_tag == 1 - render :layout => 'base_courses' - else - render :layout => 'base_projects' - end - end - - def fork - @repository_url = params[:repository_url] - - # @repository.url - # system "htpasswd -mb "+@root_path+"user.passwd "+params[:repository][:identifier]+" "+@upasswd - # system "echo -e '"+params[:project_id]+"-"+params[:repository][:identifier]+"-write:"+ - # " "+params[:repository][:identifier]+"' >> "+@root_path+"group.passwd" - system "git clone --bare "+@repository_url - # system "mv "+@project_path+"/hooks/post-update{.sample,}" - # system "chmod a+x "+@project_path+"/hooks/post-update" - # system "."+@project_path+"/hooks/post-update" - # system "echo -e 'Allow from all \n Order Deny,Allow \n "+ - # " \n"+ - # "Require group "+params[:project_id]+"-"+params[:repository][:identifier]+"-write \n "+ - # " \n ' >>"+ - # @project_path+"/.htaccess" - flash[:notice] = l(:label_notice_fork_successed) - @repositories = @project.repositories - render :action => 'show', :layout => 'base_projects' - end - - def create - if params[:repository_scm].to_s == 'Gitlab' - # add by nwb - # 增加对gitlab版本库的支持 - attrs = pickup_extra_info - @repository = Repository.factory('Git') - @repository.safe_attributes = params[:repository] - if attrs[:attrs_extra].keys.any? - @repository.merge_extra_info(attrs[:attrs_extra]) - end - @repository.project = @project - if request.post? && @repository.save - redirect_to settings_project_path(@project, :tab => 'repositories') - else - render :action => 'new' - end - else # 原逻辑 - ##xianbo - @root_path=RepositoriesHelper::ROOT_PATH - @repository_name=User.current.login.to_s+"/"+params[:repository][:identifier]+".git" - @project_path=@root_path+"htdocs/"+@repository_name - @repository_tag=params[:repository][:upassword] - @repo_name=User.current.login.to_s+"_"+params[:repository][:identifier] - logger.info "htpasswd -mb "+@root_path+"user.passwd "+@repo_name+": "+@repository_tag - logger.info "the value of create repository"+@root_path+": "+@repository_name+": "+@project_path+": "+@repo_name - attrs = pickup_extra_info - if((@repository_tag!="")&¶ms[:repository_scm]=="Git") - params[:repository][:url]=@project_path - end - ###xianbo - @repository = Repository.factory(params[:repository_scm]) - @repository.safe_attributes = params[:repository] - if attrs[:attrs_extra].keys.any? - @repository.merge_extra_info(attrs[:attrs_extra]) - end - #by xianbo - - @repository.project = @project - if request.post? && @repository.save - if(params[:repository_scm]=="Git") - system "htpasswd -mb "+@root_path+"user.passwd "+@repo_name+" "+@repository_tag - system "echo -e '"+@repo_name+"-write:"+ - " "+@repo_name+"' >> "+@root_path+"group.passwd" - system "mkdir "+@root_path+"htdocs/"+User.current.login.to_s - system "git init --bare "+@project_path - system "mv "+@project_path+"/hooks/post-update{.sample,}" - system "chmod a+x "+@project_path+"/hooks/post-update" - system "echo -e 'Allow from all \n Order Deny,Allow \n "+ - " \n"+ - "Require group "+@repo_name+"-write \n "+ - " \n ' >> "+ - @root_path+"htdocs/"+ @repository_name+"/.htaccess" - system "cd "+@project_path+" ;git update-server-info" - # if(create_repo_file&&create_passwd&&create_group&&init_repository&&add_privilege&&init_server_info) - # else - # logger.info "An error occured when authenticating "+"create passwd"+@creat_passwd+"create_group"+ - # crate_group+"create repository file "+create_repo_file+"init repository"+init_repostory+ - # "aad privilege to rpository"+add_privilege+"init server infos"+init_server_info - # end - @repository.update_attributes(:login => User.current.login.to_s) - end - redirect_to settings_project_path(@project, :tab => 'repositories') - else if(@repository_tag) - render :action => 'newrepo', :layout =>'base_projects' - else - render :action => 'new', :layout =>'base_projects' - end - end - end - end - - def edit - end - - def update - attrs = pickup_extra_info - @repository.safe_attributes = attrs[:attrs] - if attrs[:attrs_extra].keys.any? - @repository.merge_extra_info(attrs[:attrs_extra]) - end - @repository.project = @project - if request.put? && @repository.save - redirect_to settings_project_path(@project, :tab => 'repositories') - else - render :action => 'edit' - end - end - - def pickup_extra_info - p = {} - p_extra = {} - params[:repository].each do |k, v| - if k =~ /^extra_/ - p_extra[k] = v - else - p[k] = v - end - end - {:attrs => p, :attrs_extra => p_extra} - end - private :pickup_extra_info - - def committers - @committers = @repository.committers - @users = @project.users - additional_user_ids = @committers.collect(&:last).collect(&:to_i) - @users.collect(&:id) - @users += User.find_all_by_id(additional_user_ids) unless additional_user_ids.empty? - @users.compact! - @users.sort! - if request.post? && params[:committers].is_a?(Hash) - # Build a hash with repository usernames as keys and corresponding user ids as values - @repository.committer_ids = params[:committers].values.inject({}) {|h, c| h[c.first] = c.last; h} - flash[:notice] = l(:notice_successful_update) - redirect_to settings_project_path(@project, :tab => 'repositories') - elsif request.get? - respond_to do |format| - format.html{ - render :layout => "project_base" - } - end - - - end - end - - def destroy - @root_path=RepositoriesHelper::ROOT_PATH - @repo_name=User.current.login.to_s+"_"+@repository.identifier.to_s - @repository_name=User.current.login.to_s+"/"+@repository.identifier.to_s+".git" - @middle=User.current.login.to_s+"_"+@repository.identifier.to_s+"-write:" - @repository.destroy if request.delete? - redirect_to settings_project_path(@project, :tab => 'repositories') - if(@repository.type=="Repository::Git") - logger.info "destory the repository value"+"root path"+@root_path+"repo_name"+@repo_name+ - "repository_name"+@repository_name+"user group"+@middle - system "sed -i /"+@repo_name+"/{d} "+@root_path+"user.passwd" - system "sed -i /"+@middle+"/{d} "+@root_path+"group.passwd" - system "rm -r "+@root_path+"htdocs/"+@repository_name - # if(@sed_user&&@sed_group&&@remove) - # else - # logger.info "An error occured when destory the repository"+"delete form passwd: \n"+ - # @sed_user+"delete from group"+@sed_group+"delete from file"+@remove - # end - end - end - - def show - ## TODO: the below will move to filter, done. - # if !User.current.member_of?(@project) - # if @project.hidden_repo - # render_403 - # return -1 - # end - # end - #if( !User.current.member_of?(@project) || @project.hidden_repo) - @repository.fetch_changesets if Setting.autofetch_changesets? && @path.empty? - - @entries = @repository.entries(@path, @rev) - @changeset = @repository.find_changeset_by_name(@rev) - - #@project_path_cut = RepositoriesHelper::PROJECT_PATH_CUT - #@ip = RepositoriesHelper::REPO_IP_ADDRESS - - if request.xhr? - @entries ? render(:partial => 'dir_list_content') : render(:nothing => true) - else - #Modified by young - # (show_error_not_found; return) unless @entries - @changesets = @repository.latest_changesets(@path, @rev) - @properties = @repository.properties(@path, @rev) - @repositories = @project.repositories - @course_tag = params[:course] - project_path_cut = RepositoriesHelper::PROJECT_PATH_CUT - ip = RepositoriesHelper::REPO_IP_ADDRESS - @repos_url = "http://"+@repository.login.to_s+"_"+@repository.identifier.to_s+"@"+ip.to_s+ - @repository.url.slice(project_path_cut, @repository.url.length).to_s - if @course_tag == 1 - render :action => 'show', :layout => 'base_courses' - else - render :action => 'show', :layout => 'base_projects' - end - end - end - - alias_method :browse, :show - - def changes - @entry = @repository.entry(@path, @rev) - (show_error_not_found; return) unless @entry - @changesets = @repository.latest_changesets(@path, @rev, Setting.repository_log_display_limit.to_i) - @properties = @repository.properties(@path, @rev) - @changeset = @repository.find_changeset_by_name(@rev) - render :layout => 'base_projects' - end - - def revisions - @changeset_count = @repository.changesets.count - @changeset_pages = Paginator.new @changeset_count, - per_page_option, - params['page'] - @changesets = @repository.changesets. - limit(@changeset_pages.per_page). - offset(@changeset_pages.offset). - includes(:user, :repository, :parents). - all - - respond_to do |format| - format.html { render :layout => 'base_projects' } - format.atom { render_feed(@changesets, :title => "#{@project.name}: #{l(:label_revision_plural)}") } - end - end - - def raw - entry_and_raw(true) - end - - def entry - entry_and_raw(false) - end - - def entry_and_raw(is_raw) - @entry = @repository.entry(@path, @rev) - (show_error_not_found; return) unless @entry - - # If the entry is a dir, show the browser - (show; return) if @entry.is_dir? - - @content = @repository.cat(@path, @rev) - (show_error_not_found; return) unless @content - if is_raw || - (@content.size && @content.size > Setting.file_max_size_displayed.to_i.kilobyte) || - ! is_entry_text_data?(@content, @path) - # Force the download - send_opt = { :filename => filename_for_content_disposition(@path.split('/').last) } - send_type = Redmine::MimeType.of(@path) - send_opt[:type] = send_type.to_s if send_type - send_opt[:disposition] = (Redmine::MimeType.is_type?('image', @path) && !is_raw ? 'inline' : 'attachment') - send_data @content, send_opt - else - # Prevent empty lines when displaying a file with Windows style eol - # TODO: UTF-16 - # Is this needs? AttachmentsController reads file simply. - @content.gsub!("\r\n", "\n") - @changeset = @repository.find_changeset_by_name(@rev) - end - end - private :entry_and_raw - - def is_entry_text_data?(ent, path) - # UTF-16 contains "\x00". - # It is very strict that file contains less than 30% of ascii symbols - # in non Western Europe. - return true if Redmine::MimeType.is_type?('text', path) - # Ruby 1.8.6 has a bug of integer divisions. - # http://apidock.com/ruby/v1_8_6_287/String/is_binary_data%3F - return false if ent.is_binary_data? - true - end - private :is_entry_text_data? - - def annotate - @entry = @repository.entry(@path, @rev) - (show_error_not_found; return) unless @entry - - @annotate = @repository.scm.annotate(@path, @rev) - if @annotate.nil? || @annotate.empty? - (render_error l(:error_scm_annotate); return) - end - ann_buf_size = 0 - @annotate.lines.each do |buf| - ann_buf_size += buf.size - end - if ann_buf_size > Setting.file_max_size_displayed.to_i.kilobyte - (render_error l(:error_scm_annotate_big_text_file); return) - end - @changeset = @repository.find_changeset_by_name(@rev) - end - - def revision - respond_to do |format| - format.html{render :layout => 'project_base'} - format.js {render :layout => false} - end - end - - # Adds a related issue to a changeset - # POST /projects/:project_id/repository/(:repository_id/)revisions/:rev/issues - def add_related_issue - @issue = @changeset.find_referenced_issue_by_id(params[:issue_id]) - if @issue && (!@issue.visible? || @changeset.issues.include?(@issue)) - @issue = nil - end - - if @issue - @changeset.issues << @issue - end - end - - # Removes a related issue from a changeset - # DELETE /projects/:project_id/repository/(:repository_id/)revisions/:rev/issues/:issue_id - def remove_related_issue - @issue = Issue.visible.find_by_id(params[:issue_id]) - if @issue - @changeset.issues.delete(@issue) - end - end - - def diff - if params[:format] == 'diff' - @diff = @repository.diff(@path, @rev, @rev_to) - (show_error_not_found; return) unless @diff - filename = "changeset_r#{@rev}" - filename << "_r#{@rev_to}" if @rev_to - send_data @diff.join, :filename => "#{filename}.diff", - :type => 'text/x-patch', - :disposition => 'attachment' - else - @diff_type = params[:type] || User.current.pref[:diff_type] || 'inline' - @diff_type = 'inline' unless %w(inline sbs).include?(@diff_type) - - # Save diff type as user preference - if User.current.logged? && @diff_type != User.current.pref[:diff_type] - User.current.pref[:diff_type] = @diff_type - User.current.preference.save - end - @cache_key = "repositories/diff/#{@repository.id}/" + - Digest::MD5.hexdigest("#{@path}-#{@rev}-#{@rev_to}-#{@diff_type}-#{current_language}") - unless read_fragment(@cache_key) - @diff = @repository.diff(@path, @rev, @rev_to) - unless @diff - show_error_not_found - return - end - end - - @changeset = @repository.find_changeset_by_name(@rev) - @changeset_to = @rev_to ? @repository.find_changeset_by_name(@rev_to) : nil - @diff_format_revisions = @repository.diff_format_revisions(@changeset, @changeset_to) - end - render :layout => 'base_projects' - end - - def stats - @project_id = params[:id] - @repository_id = @repository.identifier - render :layout => 'base_projects' - end - - def graph - data = nil - case params[:graph] - when "commits_per_month" - data = graph_commits_per_month(@repository) - when "commits_per_author" - data = graph_commits_per_author(@repository) - end - if data - headers["Content-Type"] = "image/svg+xml" - send_data(data, :type => "image/svg+xml", :disposition => "inline") - else - render_404 - end - end - - private - - def find_repository - @repository = Repository.find(params[:id]) - @project = @repository.project - rescue ActiveRecord::RecordNotFound - render_404 - end - - REV_PARAM_RE = %r{\A[a-f0-9]*\Z}i - - def find_project_repository - @project = Project.find(params[:id]) - if params[:repository_id].present? - @repository = @project.repositories.find_by_identifier_param(params[:repository_id]) - else - @repository = @project.repository - end - (render_404; return false) unless @repository - @path = params[:path].is_a?(Array) ? params[:path].join('/') : params[:path].to_s - @rev = params[:rev].blank? ? @repository.default_branch : params[:rev].to_s.strip - @rev_to = params[:rev_to] - - unless @rev.to_s.match(REV_PARAM_RE) && @rev_to.to_s.match(REV_PARAM_RE) - if @repository.branches.blank? - raise InvalidRevisionParam - end - end - rescue ActiveRecord::RecordNotFound - render_404 - rescue InvalidRevisionParam - show_error_not_found - end - - def find_changeset - if @rev.present? - @changeset = @repository.find_changeset_by_name(@rev) - end - show_error_not_found unless @changeset - end - - def show_error_not_found - render_error :message => l(:error_scm_not_found), :status => 404 - end - - def show_error_forbidden - render_error :status => 403 - end - - # Handler for Redmine::Scm::Adapters::CommandFailed exception - def show_error_command_failed(exception) - render_error l(:error_scm_command_failed, exception.message) - end - - def graph_commits_per_month(repository) - @date_to = Date.today - @date_from = @date_to << 11 - @date_from = Date.civil(@date_from.year, @date_from.month, 1) - commits_by_day = Changeset.count( - :all, :group => :commit_date, - :conditions => ["repository_id = ? AND commit_date BETWEEN ? AND ?", repository.id, @date_from, @date_to]) - commits_by_month = [0] * 12 - commits_by_day.each {|c| commits_by_month[(@date_to.month - c.first.to_date.month) % 12] += c.last } - - changes_by_day = Change.count( - :all, :group => :commit_date, :include => :changeset, - :conditions => ["#{Changeset.table_name}.repository_id = ? AND #{Changeset.table_name}.commit_date BETWEEN ? AND ?", repository.id, @date_from, @date_to]) - changes_by_month = [0] * 12 - changes_by_day.each {|c| changes_by_month[(@date_to.month - c.first.to_date.month) % 12] += c.last } - - fields = [] - 12.times {|m| fields << month_name(((Date.today.month - 1 - m) % 12) + 1)} - - graph = SVG::Graph::Bar.new( - :height => 300, - :width => 600, - :fields => fields.reverse, - :stack => :side, - :scale_integers => true, - :step_x_labels => 2, - :show_data_values => false, - :graph_title => l(:label_commits_per_month), - :show_graph_title => true - ) - - graph.add_data( - :data => commits_by_month[0..11].reverse, - :title => l(:label_revision_plural) - ) - - graph.add_data( - :data => changes_by_month[0..11].reverse, - :title => l(:label_change_plural) - ) - - graph.burn - end - - def graph_commits_per_author(repository) - commits_by_author = Changeset.count(:all, :group => :committer, :conditions => ["repository_id = ?", repository.id]) - commits_by_author.to_a.sort! {|x, y| x.last <=> y.last} - - changes_by_author = Change.count(:all, :group => :committer, :include => :changeset, :conditions => ["#{Changeset.table_name}.repository_id = ?", repository.id]) - h = changes_by_author.inject({}) {|o, i| o[i.first] = i.last; o} - - fields = commits_by_author.collect {|r| r.first} - commits_data = commits_by_author.collect {|r| r.last} - changes_data = commits_by_author.collect {|r| h[r.first] || 0} - - fields = fields + [""]*(10 - fields.length) if fields.length<10 - commits_data = commits_data + [0]*(10 - commits_data.length) if commits_data.length<10 - changes_data = changes_data + [0]*(10 - changes_data.length) if changes_data.length<10 - - # Remove email adress in usernames - fields = fields.collect {|c| c.gsub(%r{<.+@.+>}, '') } - - graph = SVG::Graph::BarHorizontal.new( - :height => 400, - :width => 600, - :fields => fields, - :stack => :side, - :scale_integers => true, - :show_data_values => false, - :rotate_y_labels => false, - :graph_title => l(:label_commits_per_author), - :show_graph_title => true - ) - graph.add_data( - :data => commits_data, - :title => l(:label_revision_plural) - ) - graph.add_data( - :data => changes_data, - :title => l(:label_change_plural) - ) - graph.burn - end - def check_hidden_repo - project = Project.find(params[:id]) - if !User.current.member_of?(project) - if project.hidden_repo - #render_403 - end - end - rescue ActiveRecord::RecordNotFound - render_404 - end -end +# Redmine - project management software +# Copyright (C) 2006-2013 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require 'SVG/Graph/Bar' +require 'SVG/Graph/BarHorizontal' +require 'digest/sha1' +require 'redmine/scm/adapters/abstract_adapter' +require 'tempfile' + +class ChangesetNotFound < Exception; end +class InvalidRevisionParam < Exception; end + +class RepositoriesController < ApplicationController + menu_item :repository + menu_item :settings, :only => [:new, :create, :edit, :update, :destroy, :committers] + default_search_scope :changesets + + before_filter :find_project_by_project_id, :only => [:new, :create, :newrepo] + before_filter :find_repository, :only => [:edit, :update, :destroy, :committers] + before_filter :find_project_repository, :except => [:new, :create, :newcreate, :edit, :update, :destroy, :committers, :newrepo] + before_filter :find_changeset, :only => [:revision, :add_related_issue, :remove_related_issue] + before_filter :authorize , :except => [:newrepo,:newcreate,:fork] + accept_rss_auth :revisions + # hidden repositories filter // 隐藏代码过滤器 + before_filter :check_hidden_repo, :only => [:show, :stats, :revisions, :revision, :diff ] + helper :repositories + include RepositoriesHelper + helper :project_score + #@root_path = RepositoriesHelper::ROOT_PATH + + + rescue_from Redmine::Scm::Adapters::CommandFailed, :with => :show_error_command_failed + def new + scm = params[:repository_scm] || (Redmine::Scm::Base.all & Setting.enabled_scm).first + @repository = Repository.factory(scm) + @repository.is_default = @project.repository.nil? + @repository.project = @project + @course_tag = params[:course] + if @course_tag == 1 + render :layout => 'base_courses' + else + render :layout => 'base_projects' + end + end + + + def newrepo + scm = params[:repository_scm] || (Redmine::Scm::Base.all & Setting.enabled_scm).first + @repository = Repository.factory(scm) + @repository.is_default = @project.repository.nil? + @repository.project = @project + @course_tag = params[:course] + if @course_tag == 1 + render :layout => 'base_courses' + else + render :layout => 'base_projects' + end + end + + def fork + @repository_url = params[:repository_url] + + # @repository.url + # system "htpasswd -mb "+@root_path+"user.passwd "+params[:repository][:identifier]+" "+@upasswd + # system "echo -e '"+params[:project_id]+"-"+params[:repository][:identifier]+"-write:"+ + # " "+params[:repository][:identifier]+"' >> "+@root_path+"group.passwd" + system "git clone --bare "+@repository_url + # system "mv "+@project_path+"/hooks/post-update{.sample,}" + # system "chmod a+x "+@project_path+"/hooks/post-update" + # system "."+@project_path+"/hooks/post-update" + # system "echo -e 'Allow from all \n Order Deny,Allow \n "+ + # " \n"+ + # "Require group "+params[:project_id]+"-"+params[:repository][:identifier]+"-write \n "+ + # " \n ' >>"+ + # @project_path+"/.htaccess" + flash[:notice] = l(:label_notice_fork_successed) + @repositories = @project.repositories + render :action => 'show', :layout => 'base_projects' + end + + def create + if params[:repository_scm].to_s == 'Gitlab' + # add by nwb + # 增加对gitlab版本库的支持 + attrs = pickup_extra_info + @repository = Repository.factory('Git') + @repository.safe_attributes = params[:repository] + if attrs[:attrs_extra].keys.any? + @repository.merge_extra_info(attrs[:attrs_extra]) + end + @repository.project = @project + if request.post? && @repository.save + redirect_to settings_project_path(@project, :tab => 'repositories') + else + render :action => 'new' + end + else # 原逻辑 + ##xianbo + @root_path=RepositoriesHelper::ROOT_PATH + @repository_name=User.current.login.to_s+"/"+params[:repository][:identifier]+".git" + @project_path=@root_path+"htdocs/"+@repository_name + @repository_tag=params[:repository][:upassword] + @repo_name=User.current.login.to_s+"_"+params[:repository][:identifier] + logger.info "htpasswd -mb "+@root_path+"user.passwd "+@repo_name+": "+@repository_tag + logger.info "the value of create repository"+@root_path+": "+@repository_name+": "+@project_path+": "+@repo_name + attrs = pickup_extra_info + if((@repository_tag!="")&¶ms[:repository_scm]=="Git") + params[:repository][:url]=@project_path + end + ###xianbo + @repository = Repository.factory(params[:repository_scm]) + @repository.safe_attributes = params[:repository] + if attrs[:attrs_extra].keys.any? + @repository.merge_extra_info(attrs[:attrs_extra]) + end + #by xianbo + + @repository.project = @project + if request.post? && @repository.save + if(params[:repository_scm]=="Git") + system "htpasswd -mb "+@root_path+"user.passwd "+@repo_name+" "+@repository_tag + system "echo -e '"+@repo_name+"-write:"+ + " "+@repo_name+"' >> "+@root_path+"group.passwd" + system "mkdir "+@root_path+"htdocs/"+User.current.login.to_s + system "git init --bare "+@project_path + system "mv "+@project_path+"/hooks/post-update{.sample,}" + system "chmod a+x "+@project_path+"/hooks/post-update" + system "echo -e 'Allow from all \n Order Deny,Allow \n "+ + " \n"+ + "Require group "+@repo_name+"-write \n "+ + " \n ' >> "+ + @root_path+"htdocs/"+ @repository_name+"/.htaccess" + system "cd "+@project_path+" ;git update-server-info" + # if(create_repo_file&&create_passwd&&create_group&&init_repository&&add_privilege&&init_server_info) + # else + # logger.info "An error occured when authenticating "+"create passwd"+@creat_passwd+"create_group"+ + # crate_group+"create repository file "+create_repo_file+"init repository"+init_repostory+ + # "aad privilege to rpository"+add_privilege+"init server infos"+init_server_info + # end + @repository.update_attributes(:login => User.current.login.to_s) + end + redirect_to settings_project_path(@project, :tab => 'repositories') + else if(@repository_tag) + render :action => 'newrepo', :layout =>'base_projects' + else + render :action => 'new', :layout =>'base_projects' + end + end + end + end + + def edit + end + + def update + attrs = pickup_extra_info + @repository.safe_attributes = attrs[:attrs] + if attrs[:attrs_extra].keys.any? + @repository.merge_extra_info(attrs[:attrs_extra]) + end + @repository.project = @project + if request.put? && @repository.save + redirect_to settings_project_path(@project, :tab => 'repositories') + else + render :action => 'edit' + end + end + + def pickup_extra_info + p = {} + p_extra = {} + params[:repository].each do |k, v| + if k =~ /^extra_/ + p_extra[k] = v + else + p[k] = v + end + end + {:attrs => p, :attrs_extra => p_extra} + end + private :pickup_extra_info + + def committers + @committers = @repository.committers + @users = @project.users + additional_user_ids = @committers.collect(&:last).collect(&:to_i) - @users.collect(&:id) + @users += User.find_all_by_id(additional_user_ids) unless additional_user_ids.empty? + @users.compact! + @users.sort! + if request.post? && params[:committers].is_a?(Hash) + # Build a hash with repository usernames as keys and corresponding user ids as values + @repository.committer_ids = params[:committers].values.inject({}) {|h, c| h[c.first] = c.last; h} + flash[:notice] = l(:notice_successful_update) + redirect_to settings_project_path(@project, :tab => 'repositories') + elsif request.get? + respond_to do |format| + format.html{ + render :layout => "project_base" + } + end + + + end + end + + def destroy + @root_path=RepositoriesHelper::ROOT_PATH + @repo_name=User.current.login.to_s+"_"+@repository.identifier.to_s + @repository_name=User.current.login.to_s+"/"+@repository.identifier.to_s+".git" + @middle=User.current.login.to_s+"_"+@repository.identifier.to_s+"-write:" + @repository.destroy if request.delete? + redirect_to settings_project_path(@project, :tab => 'repositories') + if(@repository.type=="Repository::Git") + logger.info "destory the repository value"+"root path"+@root_path+"repo_name"+@repo_name+ + "repository_name"+@repository_name+"user group"+@middle + system "sed -i /"+@repo_name+"/{d} "+@root_path+"user.passwd" + system "sed -i /"+@middle+"/{d} "+@root_path+"group.passwd" + system "rm -r "+@root_path+"htdocs/"+@repository_name + # if(@sed_user&&@sed_group&&@remove) + # else + # logger.info "An error occured when destory the repository"+"delete form passwd: \n"+ + # @sed_user+"delete from group"+@sed_group+"delete from file"+@remove + # end + end + end + + def show + ## TODO: the below will move to filter, done. + # if !User.current.member_of?(@project) + # if @project.hidden_repo + # render_403 + # return -1 + # end + # end + #if( !User.current.member_of?(@project) || @project.hidden_repo) + @repository.fetch_changesets if Setting.autofetch_changesets? && @path.empty? + + @entries = @repository.entries(@path, @rev) + @changeset = @repository.find_changeset_by_name(@rev) + + #@project_path_cut = RepositoriesHelper::PROJECT_PATH_CUT + #@ip = RepositoriesHelper::REPO_IP_ADDRESS + + if request.xhr? + @entries ? render(:partial => 'dir_list_content') : render(:nothing => true) + else + #Modified by young + # (show_error_not_found; return) unless @entries + @changesets = @repository.latest_changesets(@path, @rev) + @properties = @repository.properties(@path, @rev) + @repositories = @project.repositories + @course_tag = params[:course] + project_path_cut = RepositoriesHelper::PROJECT_PATH_CUT + ip = RepositoriesHelper::REPO_IP_ADDRESS + @repos_url = "http://"+@repository.login.to_s+"_"+@repository.identifier.to_s+"@"+ip.to_s+ + @repository.url.slice(project_path_cut, @repository.url.length).to_s + if @course_tag == 1 + render :action => 'show', :layout => 'base_courses' + else + render :action => 'show', :layout => 'base_projects' + end + end + end + + alias_method :browse, :show + + def changes + @entry = @repository.entry(@path, @rev) + (show_error_not_found; return) unless @entry + @changesets = @repository.latest_changesets(@path, @rev, Setting.repository_log_display_limit.to_i) + @properties = @repository.properties(@path, @rev) + @changeset = @repository.find_changeset_by_name(@rev) + render :layout => 'base_projects' + end + + def revisions + @changeset_count = @repository.changesets.count + @changeset_pages = Paginator.new @changeset_count, + per_page_option, + params['page'] + @changesets = @repository.changesets. + limit(@changeset_pages.per_page). + offset(@changeset_pages.offset). + includes(:user, :repository, :parents). + all + + respond_to do |format| + format.html { render :layout => 'base_projects' } + format.atom { render_feed(@changesets, :title => "#{@project.name}: #{l(:label_revision_plural)}") } + end + end + + def raw + entry_and_raw(true) + end + + def entry + entry_and_raw(false) + end + + def entry_and_raw(is_raw) + @entry = @repository.entry(@path, @rev) + (show_error_not_found; return) unless @entry + + # If the entry is a dir, show the browser + (show; return) if @entry.is_dir? + + @content = @repository.cat(@path, @rev) + (show_error_not_found; return) unless @content + if is_raw || + (@content.size && @content.size > Setting.file_max_size_displayed.to_i.kilobyte) || + ! is_entry_text_data?(@content, @path) + # Force the download + send_opt = { :filename => filename_for_content_disposition(@path.split('/').last) } + send_type = Redmine::MimeType.of(@path) + send_opt[:type] = send_type.to_s if send_type + send_opt[:disposition] = (Redmine::MimeType.is_type?('image', @path) && !is_raw ? 'inline' : 'attachment') + send_data @content, send_opt + else + # Prevent empty lines when displaying a file with Windows style eol + # TODO: UTF-16 + # Is this needs? AttachmentsController reads file simply. + @content.gsub!("\r\n", "\n") + @changeset = @repository.find_changeset_by_name(@rev) + end + end + private :entry_and_raw + + def is_entry_text_data?(ent, path) + # UTF-16 contains "\x00". + # It is very strict that file contains less than 30% of ascii symbols + # in non Western Europe. + return true if Redmine::MimeType.is_type?('text', path) + # Ruby 1.8.6 has a bug of integer divisions. + # http://apidock.com/ruby/v1_8_6_287/String/is_binary_data%3F + return false if ent.is_binary_data? + true + end + private :is_entry_text_data? + + def annotate + @entry = @repository.entry(@path, @rev) + (show_error_not_found; return) unless @entry + + @annotate = @repository.scm.annotate(@path, @rev) + if @annotate.nil? || @annotate.empty? + (render_error l(:error_scm_annotate); return) + end + ann_buf_size = 0 + @annotate.lines.each do |buf| + ann_buf_size += buf.size + end + if ann_buf_size > Setting.file_max_size_displayed.to_i.kilobyte + (render_error l(:error_scm_annotate_big_text_file); return) + end + @changeset = @repository.find_changeset_by_name(@rev) + end + + def revision + respond_to do |format| + format.html{render :layout => 'project_base'} + format.js {render :layout => false} + end + end + + # Adds a related issue to a changeset + # POST /projects/:project_id/repository/(:repository_id/)revisions/:rev/issues + def add_related_issue + @issue = @changeset.find_referenced_issue_by_id(params[:issue_id]) + if @issue && (!@issue.visible? || @changeset.issues.include?(@issue)) + @issue = nil + end + + if @issue + @changeset.issues << @issue + end + end + + # Removes a related issue from a changeset + # DELETE /projects/:project_id/repository/(:repository_id/)revisions/:rev/issues/:issue_id + def remove_related_issue + @issue = Issue.visible.find_by_id(params[:issue_id]) + if @issue + @changeset.issues.delete(@issue) + end + end + + def diff + if params[:format] == 'diff' + @diff = @repository.diff(@path, @rev, @rev_to) + (show_error_not_found; return) unless @diff + filename = "changeset_r#{@rev}" + filename << "_r#{@rev_to}" if @rev_to + send_data @diff.join, :filename => "#{filename}.diff", + :type => 'text/x-patch', + :disposition => 'attachment' + else + @diff_type = params[:type] || User.current.pref[:diff_type] || 'inline' + @diff_type = 'inline' unless %w(inline sbs).include?(@diff_type) + + # Save diff type as user preference + if User.current.logged? && @diff_type != User.current.pref[:diff_type] + User.current.pref[:diff_type] = @diff_type + User.current.preference.save + end + @cache_key = "repositories/diff/#{@repository.id}/" + + Digest::MD5.hexdigest("#{@path}-#{@rev}-#{@rev_to}-#{@diff_type}-#{current_language}") + unless read_fragment(@cache_key) + @diff = @repository.diff(@path, @rev, @rev_to) + unless @diff + show_error_not_found + return + end + end + + @changeset = @repository.find_changeset_by_name(@rev) + @changeset_to = @rev_to ? @repository.find_changeset_by_name(@rev_to) : nil + @diff_format_revisions = @repository.diff_format_revisions(@changeset, @changeset_to) + end + render :layout => 'base_projects' + end + + def stats + @project_id = params[:id] + @repository_id = @repository.identifier + render :layout => 'base_projects' + end + + def graph + data = nil + case params[:graph] + when "commits_per_month" + data = graph_commits_per_month(@repository) + when "commits_per_author" + data = graph_commits_per_author(@repository) + end + if data + headers["Content-Type"] = "image/svg+xml" + send_data(data, :type => "image/svg+xml", :disposition => "inline") + else + render_404 + end + end + + private + + def find_repository + @repository = Repository.find(params[:id]) + @project = @repository.project + rescue ActiveRecord::RecordNotFound + render_404 + end + + REV_PARAM_RE = %r{\A[a-f0-9]*\Z}i + + def find_project_repository + @project = Project.find(params[:id]) + if params[:repository_id].present? + @repository = @project.repositories.find_by_identifier_param(params[:repository_id]) + else + @repository = @project.repository + end + (render_404; return false) unless @repository + @path = params[:path].is_a?(Array) ? params[:path].join('/') : params[:path].to_s + @rev = params[:rev].blank? ? @repository.default_branch : params[:rev].to_s.strip + @rev_to = params[:rev_to] + + unless @rev.to_s.match(REV_PARAM_RE) && @rev_to.to_s.match(REV_PARAM_RE) + if @repository.branches.blank? + raise InvalidRevisionParam + end + end + rescue ActiveRecord::RecordNotFound + render_404 + rescue InvalidRevisionParam + show_error_not_found + end + + def find_changeset + if @rev.present? + @changeset = @repository.find_changeset_by_name(@rev) + end + show_error_not_found unless @changeset + end + + def show_error_not_found + render_error :message => l(:error_scm_not_found), :status => 404 + end + + def show_error_forbidden + render_error :status => 403 + end + + # Handler for Redmine::Scm::Adapters::CommandFailed exception + def show_error_command_failed(exception) + render_error l(:error_scm_command_failed, exception.message) + end + + def graph_commits_per_month(repository) + @date_to = Date.today + @date_from = @date_to << 11 + @date_from = Date.civil(@date_from.year, @date_from.month, 1) + commits_by_day = Changeset.count( + :all, :group => :commit_date, + :conditions => ["repository_id = ? AND commit_date BETWEEN ? AND ?", repository.id, @date_from, @date_to]) + commits_by_month = [0] * 12 + commits_by_day.each {|c| commits_by_month[(@date_to.month - c.first.to_date.month) % 12] += c.last } + + changes_by_day = Change.count( + :all, :group => :commit_date, :include => :changeset, + :conditions => ["#{Changeset.table_name}.repository_id = ? AND #{Changeset.table_name}.commit_date BETWEEN ? AND ?", repository.id, @date_from, @date_to]) + changes_by_month = [0] * 12 + changes_by_day.each {|c| changes_by_month[(@date_to.month - c.first.to_date.month) % 12] += c.last } + + fields = [] + 12.times {|m| fields << month_name(((Date.today.month - 1 - m) % 12) + 1)} + + graph = SVG::Graph::Bar.new( + :height => 300, + :width => 600, + :fields => fields.reverse, + :stack => :side, + :scale_integers => true, + :step_x_labels => 2, + :show_data_values => false, + :graph_title => l(:label_commits_per_month), + :show_graph_title => true + ) + + graph.add_data( + :data => commits_by_month[0..11].reverse, + :title => l(:label_revision_plural) + ) + + graph.add_data( + :data => changes_by_month[0..11].reverse, + :title => l(:label_change_plural) + ) + + graph.burn + end + + def graph_commits_per_author(repository) + commits_by_author = Changeset.count(:all, :group => :committer, :conditions => ["repository_id = ?", repository.id]) + commits_by_author.to_a.sort! {|x, y| x.last <=> y.last} + + changes_by_author = Change.count(:all, :group => :committer, :include => :changeset, :conditions => ["#{Changeset.table_name}.repository_id = ?", repository.id]) + h = changes_by_author.inject({}) {|o, i| o[i.first] = i.last; o} + + fields = commits_by_author.collect {|r| r.first} + commits_data = commits_by_author.collect {|r| r.last} + changes_data = commits_by_author.collect {|r| h[r.first] || 0} + + fields = fields + [""]*(10 - fields.length) if fields.length<10 + commits_data = commits_data + [0]*(10 - commits_data.length) if commits_data.length<10 + changes_data = changes_data + [0]*(10 - changes_data.length) if changes_data.length<10 + + # Remove email adress in usernames + fields = fields.collect {|c| c.gsub(%r{<.+@.+>}, '') } + + graph = SVG::Graph::BarHorizontal.new( + :height => 400, + :width => 600, + :fields => fields, + :stack => :side, + :scale_integers => true, + :show_data_values => false, + :rotate_y_labels => false, + :graph_title => l(:label_commits_per_author), + :show_graph_title => true + ) + graph.add_data( + :data => commits_data, + :title => l(:label_revision_plural) + ) + graph.add_data( + :data => changes_data, + :title => l(:label_change_plural) + ) + graph.burn + end + def check_hidden_repo + project = Project.find(params[:id]) + if !User.current.member_of?(project) + if project.hidden_repo + #render_403 + end + end + rescue ActiveRecord::RecordNotFound + render_404 + end +end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index d479b8804..d8ecb4ef7 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,822 +1,822 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 Jean-Philippe Lang -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -class UsersController < ApplicationController - layout :setting_layout - #Added by young - menu_item :activity - menu_item :user_information, :only => :info - menu_item :user_course, :only => :user_courses - menu_item :user_homework, :only => :user_homeworks - menu_item :user_project, :only => [:user_projects, :watch_projects] - menu_item :requirement_focus, :only => :watch_bids - menu_item :requirement_focus, :only => :watch_contests - menu_item :user_newfeedback, :only => :user_newfeedback - - - #Ended by young - - before_filter :can_show_course, :only => [:user_courses,:user_homeworks] - before_filter :require_admin, :except => [:show, :index, :search, :tag_save, :tag_saveEx,:user_projects, :user_newfeedback, :user_comments, :watch_bids, :watch_contests, :info, - :user_watchlist, :user_fanslist,:update, :user_courses, :user_homeworks, :watch_projects, :show_score, :topic_score_index, :project_score_index, - :activity_score_index, :influence_score_index, :score_index,:show_new_score, :topic_new_score_index, :project_new_score_index, - :activity_new_score_index, :influence_new_score_index, :score_new_index,:update_score,:user_activities] - #edit has been deleted by huang, 2013-9-23 - before_filter :find_user, :only => [:user_fanslist, :user_watchlist, :show, :edit, :update, :destroy, :edit_membership, :user_courses, - :user_homeworks, :destroy_membership, :user_activities, :user_projects, :user_newfeedback, :user_comments, - :watch_bids, :watch_contests, :info, :watch_projects, :show_score, :topic_score_index, :project_score_index, - :activity_score_index, :influence_score_index, :score_index,:show_new_score, :topic_new_score_index, :project_new_score_index, - :activity_new_score_index, :influence_new_score_index, :score_new_index] - before_filter :auth_user_extension, only: :show - before_filter :rest_user_score, only: :show - accept_api_auth :index, :show, :create, :update, :destroy,:tag_save , :tag_saveEx - - #william - before_filter :require_login, :only => [:tag_save,:tag_saveEx] - #before_filter :refresh_changests, :only =>[:user_activities,:user_courses,:user_projects,:user_newfeedback] - - - helper :sort - include SortHelper - helper :custom_fields - include CustomFieldsHelper - include AvatarHelper - include WordsHelper - include GitlabHelper - include UserScoreHelper - helper :user_score - - # added by liuping 关注 - - helper :watchers - helper :activities - - ### added by william - include ActsAsTaggableOn::TagsHelper - - # fq - helper :words - - def refresh_changests - if !(@user.nil?) && !(@user.memberships.nil?) - @user.memberships.each do |member| - unless member.project.nil? - member.project.repository.fetch_changesets if Setting.autofetch_changesets? - end - end - end - end - - #added by young - def user_projects - - if User.current.admin? - @memberships = @user.memberships.all(conditions: "projects.project_type = #{Project::ProjectType_project}") - else - cond = Project.visible_condition(User.current) + " AND projects.project_type <> 1" - @memberships = @user.memberships.all(:conditions => cond) - end - #events = Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 20) - #@events_by_day = events.group_by(&:event_date) - @state = 0 - - - #add by huang - unless User.current.admin? - if !@user.active? #|| (@user != User.current && @memberships.empty? && events.empty?) - render_404 - return - end - end - #end - - respond_to do |format| - format.html - format.api - end - end - -# added by bai - def show_score - - end - - def show_new_score - render :layout => false - end -# end - - ##added by fq - def watch_bids - cond = 'bids.reward_type <> 1' - @bids = Bid.watched_by(@user).where('reward_type = ?', 1) # added by huang - @offset, @limit = api_offset_and_limit({:limit => 10}) - @bid_count = @bids.count - @bid_pages = Paginator.new @bid_count, @limit, params['page'] - @offset ||= @bid_pages.reverse_offset - unless @offset == 0 - @bid = @bids.offset(@offset).limit(@limit).all.reverse - else - limit = @bid_count % @limit - @bid = @bids.offset(@offset).limit(limit).all.reverse - end - - respond_to do |format| - format.html { - render :layout => 'base_users' - } - format.api - end - end - -#new add by linchun - def watch_contests - @bids = Contest.watched_by(@user) - @offset, @limit = api_offset_and_limit({:limit => 10}) - @contest_count = @contests.count - @contest_pages = Paginator.new @contest_count, @limit, params['page'] - @offset ||= @contest_pages.reverse_offset - unless @offset == 0 - @contest = @contests.offset(@offset).limit(@limit).all.reverse - else - limit = @bid_count % @limit - @contest = @contests.offset(@offset).limit(limit).all.reverse - end - - respond_to do |format| - format.html { - render :layout => 'base_users' - } - format.api - end - end - - # added by fq - def user_activities - redirect_to user_path(@user, type: params[:type], page: params[:page]) - return - # useless abort. - @watcher = User.watched_by_id(@user) - events = [] - for user in @watcher - events << Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 30) - end - - - - @events_by_day = events.group_by(&:event_date) - - unless User.current.admin? - if !@user.active? || (@user != User.current && @memberships.empty? && events.empty?) - render_404 - return - end - end - - respond_to do |format| - format.html - format.api - end - end - # end - - # added by huang - def user_homeworks - @membership = @user.memberships.all(:conditions => Project.visible_condition(User.current)) - @memberships = [] - @membership.each do |membership| - if membership.project.project_type == 1 - @memberships << membership - end - end - @bid = [] - @memberships.each do |membership| - @bid += membership.project.homeworks - end - @bid = @bid.group_by {|bid| bid.courses.first.id} - unless User.current.admin? - if !@user.active? - render_404 - return - end - end - end - - - include CoursesHelper - def user_courses - - unless User.current.admin? - if !@user.active? #|| (@user != User.current && @memberships.empty? && events.empty?) - render_404 - return - end - end - - membership = @user.coursememberships.all#@user.coursememberships.all(:conditions => Course.visible_condition(User.current)) - membership.sort! {|older, newer| newer.created_on <=> older.created_on } - @memberships = [] - membership.collect { |e| - @memberships.push(e) - } - ## 判断课程是否过期 [需封装] - @memberships_doing = [] - @memberships_done = [] - now_time = Time.now.year - @memberships.map { |e| - end_time = e.course.get_time.year - isDone = course_endTime_timeout?(e.course) - if isDone - @memberships_done.push e - else - @memberships_doing.push e - end - } - # respond_to do |format| - # format.html - # format.api - # end - end - -# modified by fq - def user_newfeedback - @jours = @user.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC') - @jours.update_all(:is_readed => true, :status => false) - @jours.each do |journal| - fetch_user_leaveWord_reply(journal).update_all(:is_readed => true, :status => false) - end - - @limit = 10 - @feedback_count = @jours.count - @feedback_pages = Paginator.new @feedback_count, @limit, params['page'] - @offset ||= @feedback_pages.offset - @jour = @jours[@offset, @limit] - @state = false - end - # end - - def user_comments - - end - - #end - def index - @status = params[:status] || 1 - sort_init 'login', 'asc' - sort_update %w(login firstname lastname mail admin created_on last_login_on) - - case params[:format] - when 'xml', 'json' - @offset, @limit = api_offset_and_limit({:limit => 15}) - else - @limit = 15 - end - - # retrieve all users - # 先内连一下statuses 保证排序之后数量一致 - scope = User.visible. - joins("INNER JOIN user_statuses ON users.id = user_statuses.user_id") - - # unknow - scope = scope.in_group(params[:group_id]) if params[:group_id].present? - - # pagination - @user_count = scope.count - @user_pages = Paginator.new @user_count, @limit, params['page'] - - # users classify - case params[:user_sort_type] - when '0' - # 创建时间排序 - @s_type = 0 - @users = scope.reorder('users.created_on DESC') - when '1' - # 活跃度排序, 就是所谓的得分情况 - @s_type = 1 - @users = scope. - joins("LEFT JOIN option_numbers ON users.id = option_numbers.user_id and option_numbers.score_type = 1"). - reorder('option_numbers.total_score DESC') - when '2' - # 粉丝数排序 - @s_type = 2 - @users = scope. - #joins("INNER JOIN user_statuses ON users.id = user_statuses.user_id"). - reorder('user_statuses.watchers_count DESC') - - else - # 默认活跃度排序 - @s_type = 1 - @users = scope. - joins("LEFT JOIN option_numbers ON users.id = option_numbers.user_id and option_numbers.score_type = 1"). - reorder('option_numbers.total_score DESC') - end - - # limit and offset - @users = @users.limit(@user_pages.per_page).offset(@user_pages.offset) - - @user_base_tag = params[:id] ? 'base_users':'users_base' - respond_to do |format| - format.html { - @groups = Group.all.sort - render :layout => @user_base_tag - } - format.api - end - end - - def search - sort_init 'login', 'asc' - sort_update %w(login firstname lastname mail admin created_on last_login_on) - (redirect_to users_path, :notice => l(:label_sumbit_empty);return) if params[:name].blank? - case params[:format] - when 'xml', 'json' - @offset, @limit = api_offset_and_limit({:limit => 15}) - else - @limit = 15#per_page_option - end - - @status = params[:status] || 1 - has = { - "show_changesets" => true - } - scope = User.logged.status(@status) - scope = scope.like(params[:name]) if params[:name].present? - @user_count = scope.count - @user_pages = Paginator.new @user_count, @limit, params['page'] - @user_base_tag = params[:id] ? 'base_users':'users_base' - @offset ||= @user_pages.reverse_offset - unless @offset == 0 - @users = scope.offset(@offset).limit(@limit).all.reverse - else - limit = @user_count % @limit - if limit == 0 - limit = @limit - end - @users = scope.offset(@offset).limit(limit).all.reverse - end - - respond_to do |format| - format.html { - @groups = Group.all.sort - render :layout => @user_base_tag - } - format.api - end - end - - def show - pre_count = 10 #limit - case params[:type] - when "1" - if @user == User.current - activity = Activity.where('user_id = ?', User.current.id).order('id desc') - @activity_count = activity.count - @activity_pages = Paginator.new @activity_count, pre_count, params['page'] - @activity = activity.offset(@activity_pages.offset).limit(@activity_pages.per_page).all - @state = 1 - end - when "2" - message = [] - if @user == User.current - message = JournalsForMessage.reference_message(@user.id) - message += Journal.reference_message(@user.id) - end - @activity_count = message.size - @info_pages = Paginator.new @activity_count, pre_count, params['page'] - messages = message.sort {|x,y| y.created_on <=> x.created_on } - @message = messages[@info_pages.offset, @info_pages.per_page] - @state = 2 - else - where_condition = nil; - # where_condition = "act_type <> 'JournalsForMessage'" - if @user == User.current - watcher = User.watched_by(@user) - watcher.push(User.current) - activity = Activity.where(where_condition).where('user_id in (?)', watcher).order('id desc') - else - activity = Activity.where(where_condition).where('user_id = ?', @user.id).order('id desc') - end - @activity_count = activity.count - @activity_pages = Paginator.new @activity_count, pre_count, params['page'] - @activity = activity.offset(@activity_pages.offset).limit(@activity_pages.per_page).all - @state = 0 - end - - if params[:user].present? - - user_temp = User.find_by_sql("select id from users where concat(lastname,firstname) like '%#{params[:user]}%' or lastname like '%#{params[:user]}%'") - - if user_temp.size > 1 - activity = Activity.where('user_id in (?)', user_temp).where('user_id in (?)', watcher).order('id desc') - elsif user_temp.size == 1 - activity = Activity.where('user_id = ?', user_temp).where('user_id in (?)', watcher).order('id desc') - else - activity = Activity.where("1 = 0") - end - @offset, @limit = api_offset_and_limit({:limit => 10}) - @activity_count = activity.count - @activity_pages = Paginator.new @activity_count, @limit, params['page'] - @offset ||= @activity_pages.offset - @activity = activity.offset(@offset).limit(@limit) - @state = 0 - end - - -#Modified by nie - unless User.current.admin? - if !@user.active? #|| (@user != User.current && @memberships.empty? && events.empty?) - # redirect_to home_path - render_404 - return - end - end - - respond_to do |format| - format.html - format.api - end - end - - ##end fq - - #### added by fq - def info - - message = [] - if @user == User.current - message = JournalsForMessage.reference_message(@user.id) - message += Journal.reference_message(@user.id) - end - @offset, @limit = api_offset_and_limit({:limit => 10}) - @info_count = message.size - @info_pages = Paginator.new @info_count, @limit, params['page'] - @offset ||= @info_pages.offset - - messages = message.sort {|x,y| y.created_on <=> x.created_on } - - @message = messages[@offset, @limit] - - unless User.current.admin? - if !@user.active? - render_404 - return - end - end - - respond_to do |format| - format.html - format.api - end - end - #### end - - - def new - @user = User.new(:language => Setting.default_language, :mail_notification => Setting.default_notification_option) - @auth_sources = AuthSource.all - render :layout => "users_base" - end - - def create - @user = User.new(:language => Setting.default_language, :mail_notification => Setting.default_notification_option) - @user.safe_attributes = params[:user] - @user.admin = params[:user][:admin] || false - @user.login = params[:user][:login] - @user.password, @user.password_confirmation = params[:user][:password], params[:user][:password_confirmation] unless @user.auth_source_id - - if @user.save - @user.pref.attributes = params[:pref] - @user.pref[:no_self_notified] = (params[:no_self_notified] == '1') - @user.pref.save - @user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : []) - - Mailer.account_information(@user, params[:user][:password]).deliver if params[:send_information] - - respond_to do |format| - format.html { - flash[:notice] = l(:notice_user_successful_create, :id => view_context.link_to(@user.login, user_path(@user))) - if params[:continue] - redirect_to new_user_path - else - redirect_to edit_user_path(@user) - end - } - format.api { render :action => 'show', :status => :created, :location => user_url(@user) } - end - else - @auth_sources = AuthSource.all - # Clear password input - @user.password = @user.password_confirmation = nil - - respond_to do |format| - format.html { render :action => 'new',:layout => "users_base" } - format.api { render_validation_errors(@user) } - end - end - - unless @user.id.nil? - #后台注册的用户默认权限为男性开发员 - ue = UserExtensions.create(:identity => 3, - :gender => 0, - :user_id => @user.id) - ue.save - end - end - - def edit - @auth_sources = AuthSource.all - @membership ||= Member.new - end - - def watch_projects - @watch_projects = Project.joins(:watchers).where("project_type <>? and watchable_type = ? and `watchers`.user_id = ?", '1','Project', @user.id) - @state = 1 - respond_to do |format| - format.html { - render :layout => 'base_users' - } - format.api - end - end - - def update - @user.admin = params[:user][:admin] if params[:user][:admin] - @user.login = params[:user][:login] if params[:user][:login] - if params[:user][:password].present? && (@user.auth_source_id.nil? || params[:user][:auth_source_id].blank?) - @user.password, @user.password_confirmation = params[:user][:password], params[:user][:password_confirmation] - end - @user.safe_attributes = params[:user] - # Was the account actived ? (do it before User#save clears the change) - was_activated = (@user.status_change == [User::STATUS_REGISTERED, User::STATUS_ACTIVE]) - # TODO: Similar to My#account - @user.pref.attributes = params[:pref] - @user.pref[:no_self_notified] = (params[:no_self_notified] == '1') - - if @user.save - @user.pref.save - @user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : []) - - if was_activated - Mailer.account_activated(@user).deliver - elsif @user.active? && params[:send_information] && !params[:user][:password].blank? && @user.auth_source_id.nil? - Mailer.account_information(@user, params[:user][:password]).deliver - end - - respond_to do |format| - format.html { - flash[:notice] = l(:notice_successful_update) - redirect_to_referer_or edit_user_path(@user) - } - format.api { render_api_ok } - end - else - @auth_sources = AuthSource.all - @membership ||= Member.new - # Clear password input - @user.password = @user.password_confirmation = nil - - respond_to do |format| - format.html { render :action => :edit } - format.api { render_validation_errors(@user) } - end - end - end - - def destroy - @user.destroy - respond_to do |format| - format.html { redirect_back_or_default(admin_users_path) } - format.api { render_api_ok } - end - end - - def edit_membership - @membership = Member.edit_membership(params[:membership_id], params[:membership], @user) - @membership.save - respond_to do |format| - format.html { redirect_to edit_user_path(@user, :tab => 'memberships') } - format.js - end - end - - def destroy_membership - @membership = Member.find(params[:membership_id]) - if @membership.deletable? - @membership.destroy - end - respond_to do |format| - format.html { redirect_to edit_user_path(@user, :tab => 'memberships') } - format.js - end - end - - ################# added by william - def tag_save - @tags = params[:tag_for_save][:name] - @obj_id = params[:tag_for_save][:object_id] - @obj_flag = params[:tag_for_save][:object_flag] - - case @obj_flag - when '1' then - @obj = User.find_by_id(@obj_id) - when '2' then - @obj = Project.find_by_id(@obj_id) - when '3' then - @obj = Issue.find_by_id(@obj_id) - when '4' then - @obj = Bid.find_by_id(@obj_id) - when '5' then - @obj = Forum.find_by_id(@obj_id) - when '6' - @obj = Attachment.find_by_id(@obj_id) - when '7' then - @obj = Contest.find_by_id(@obj_id) - when '8' - @obj = OpenSourceProject.find_by_id(@obj_id) - when '9' - @obj = Course.find_by_id(@obj_id) - else - @obj = nil - end - unless @obj.nil? - @obj.tag_list.add(@tags.split(",")) - else - return - end - if @obj.save - logger.debug "#{__FILE__}:#{__LINE__} ===> #{@obj.to_json}" - else - logger.error "#{__FILE__}:#{__LINE__} ===> #{@obj.errors.try(:full_messages)}" - end - respond_to do |format| - format.js - format.html - end - end - - def tag_saveEx - @tags = params[:tag_name] - @obj_id = params[:obj_id] - @obj_flag = params[:obj_flag] - - case @obj_flag - when '1' then - @obj = User.find_by_id(@obj_id) - when '2' then - @obj = Project.find_by_id(@obj_id) - when '3' then - @obj = Issue.find_by_id(@obj_id) - when '4' then - @obj = Bid.find_by_id(@obj_id) - when '5' then - @obj = Forum.find_by_id(@obj_id) - when '6' - @obj = Attachment.find_by_id(@obj_id) - when '7' then - @obj = Contest.find_by_id(@obj_id) - when '8' - @obj = OpenSourceProject.find_by_id(@obj_id) - when '9' - @obj = Course.find_by_id(@obj_id) - else - @obj = nil - end - unless @obj.nil? - @obj.tag_list.add(@tags.split(",")) - else - return - end - if @obj.save - ## 执行成功的操作。 - else - #捕获异常 - end - respond_to do |format| - format.js - format.html - end - end - ###add by huang - def user_watchlist - end - ###add by huang - def user_fanslist - - end - - #william - def update_extensions(user_extensions) - user_extensions = params[:user_extensions] - unless user_extensions.nil? - user_extensions = UserExtensions.find_by_id(user_extensions.user_id) - - # user_extensions. - end - end - -# added by bai - def topic_score_index - - end - - def project_score_index - - end - - def activity_score_index - - end - - def influence_score_index - - end - - def score_index - - end -# end - def topic_new_score_index - - end - - def project_new_score_index - - end - - def activity_new_score_index - - end - - def influence_new_score_index - - end - - def score_new_index - - end - - def update_score - @user = User.find(params[:id]) - end - - private - - def find_user - if params[:id] == 'current' - require_login || return - @user = User.current - else - @user = User.find(params[:id]) - end - rescue ActiveRecord::RecordNotFound - render_404 - end - - def setting_layout(default_base='base_users') - User.current.admin? ? default_base : default_base - end - - # 必填自己的工作单位,其实就是学校 - def auth_user_extension - if @user == User.current && (@user.user_extensions.nil? || @user.user_extensions.school.nil?) - flash[:error] = l(:error_complete_occupation) - redirect_to my_account_path - end - end - - #重置用户得分 - def rest_user_score - memo_num(@user) - messges_for_issue_num(@user) - issues_status_num(@user) - replay_for_memo_num(@user) - tread_num(@user) - praise_num(@user) - changeset_num(@user) - document_num(@user) - attachment_num(@user) - issue_done_ratio_num(@user) - post_issue_num(@user) - end - - #验证是否显示课程 - def can_show_course - @first_page = FirstPage.where("page_type = 'project'").first - if @first_page.show_course == 2 - render_404 - end - end -end +# Redmine - project management software +# Copyright (C) 2006-2013 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +class UsersController < ApplicationController + layout :setting_layout + #Added by young + menu_item :activity + menu_item :user_information, :only => :info + menu_item :user_course, :only => :user_courses + menu_item :user_homework, :only => :user_homeworks + menu_item :user_project, :only => [:user_projects, :watch_projects] + menu_item :requirement_focus, :only => :watch_bids + menu_item :requirement_focus, :only => :watch_contests + menu_item :user_newfeedback, :only => :user_newfeedback + + + #Ended by young + + before_filter :can_show_course, :only => [:user_courses,:user_homeworks] + before_filter :require_admin, :except => [:show, :index, :search, :tag_save, :tag_saveEx,:user_projects, :user_newfeedback, :user_comments, :watch_bids, :watch_contests, :info, + :user_watchlist, :user_fanslist,:update, :user_courses, :user_homeworks, :watch_projects, :show_score, :topic_score_index, :project_score_index, + :activity_score_index, :influence_score_index, :score_index,:show_new_score, :topic_new_score_index, :project_new_score_index, + :activity_new_score_index, :influence_new_score_index, :score_new_index,:update_score,:user_activities] + #edit has been deleted by huang, 2013-9-23 + before_filter :find_user, :only => [:user_fanslist, :user_watchlist, :show, :edit, :update, :destroy, :edit_membership, :user_courses, + :user_homeworks, :destroy_membership, :user_activities, :user_projects, :user_newfeedback, :user_comments, + :watch_bids, :watch_contests, :info, :watch_projects, :show_score, :topic_score_index, :project_score_index, + :activity_score_index, :influence_score_index, :score_index,:show_new_score, :topic_new_score_index, :project_new_score_index, + :activity_new_score_index, :influence_new_score_index, :score_new_index] + before_filter :auth_user_extension, only: :show + before_filter :rest_user_score, only: :show + accept_api_auth :index, :show, :create, :update, :destroy,:tag_save , :tag_saveEx + + #william + before_filter :require_login, :only => [:tag_save,:tag_saveEx] + #before_filter :refresh_changests, :only =>[:user_activities,:user_courses,:user_projects,:user_newfeedback] + + + helper :sort + include SortHelper + helper :custom_fields + include CustomFieldsHelper + include AvatarHelper + include WordsHelper + include GitlabHelper + include UserScoreHelper + helper :user_score + + # added by liuping 关注 + + helper :watchers + helper :activities + + ### added by william + include ActsAsTaggableOn::TagsHelper + + # fq + helper :words + + def refresh_changests + if !(@user.nil?) && !(@user.memberships.nil?) + @user.memberships.each do |member| + unless member.project.nil? + member.project.repository.fetch_changesets if Setting.autofetch_changesets? + end + end + end + end + + #added by young + def user_projects + + if User.current.admin? + @memberships = @user.memberships.all(conditions: "projects.project_type = #{Project::ProjectType_project}") + else + cond = Project.visible_condition(User.current) + " AND projects.project_type <> 1" + @memberships = @user.memberships.all(:conditions => cond) + end + #events = Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 20) + #@events_by_day = events.group_by(&:event_date) + @state = 0 + + + #add by huang + unless User.current.admin? + if !@user.active? #|| (@user != User.current && @memberships.empty? && events.empty?) + render_404 + return + end + end + #end + + respond_to do |format| + format.html + format.api + end + end + +# added by bai + def show_score + + end + + def show_new_score + render :layout => false + end +# end + + ##added by fq + def watch_bids + cond = 'bids.reward_type <> 1' + @bids = Bid.watched_by(@user).where('reward_type = ?', 1) # added by huang + @offset, @limit = api_offset_and_limit({:limit => 10}) + @bid_count = @bids.count + @bid_pages = Paginator.new @bid_count, @limit, params['page'] + @offset ||= @bid_pages.reverse_offset + unless @offset == 0 + @bid = @bids.offset(@offset).limit(@limit).all.reverse + else + limit = @bid_count % @limit + @bid = @bids.offset(@offset).limit(limit).all.reverse + end + + respond_to do |format| + format.html { + render :layout => 'base_users' + } + format.api + end + end + +#new add by linchun + def watch_contests + @bids = Contest.watched_by(@user) + @offset, @limit = api_offset_and_limit({:limit => 10}) + @contest_count = @contests.count + @contest_pages = Paginator.new @contest_count, @limit, params['page'] + @offset ||= @contest_pages.reverse_offset + unless @offset == 0 + @contest = @contests.offset(@offset).limit(@limit).all.reverse + else + limit = @bid_count % @limit + @contest = @contests.offset(@offset).limit(limit).all.reverse + end + + respond_to do |format| + format.html { + render :layout => 'base_users' + } + format.api + end + end + + # added by fq + def user_activities + redirect_to user_path(@user, type: params[:type], page: params[:page]) + return + # useless abort. + @watcher = User.watched_by_id(@user) + events = [] + for user in @watcher + events << Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 30) + end + + + + @events_by_day = events.group_by(&:event_date) + + unless User.current.admin? + if !@user.active? || (@user != User.current && @memberships.empty? && events.empty?) + render_404 + return + end + end + + respond_to do |format| + format.html + format.api + end + end + # end + + # added by huang + def user_homeworks + @membership = @user.memberships.all(:conditions => Project.visible_condition(User.current)) + @memberships = [] + @membership.each do |membership| + if membership.project.project_type == 1 + @memberships << membership + end + end + @bid = [] + @memberships.each do |membership| + @bid += membership.project.homeworks + end + @bid = @bid.group_by {|bid| bid.courses.first.id} + unless User.current.admin? + if !@user.active? + render_404 + return + end + end + end + + + include CoursesHelper + def user_courses + + unless User.current.admin? + if !@user.active? #|| (@user != User.current && @memberships.empty? && events.empty?) + render_404 + return + end + end + + membership = @user.coursememberships.all#@user.coursememberships.all(:conditions => Course.visible_condition(User.current)) + membership.sort! {|older, newer| newer.created_on <=> older.created_on } + @memberships = [] + membership.collect { |e| + @memberships.push(e) + } + ## 判断课程是否过期 [需封装] + @memberships_doing = [] + @memberships_done = [] + now_time = Time.now.year + @memberships.map { |e| + end_time = e.course.get_time.year + isDone = course_endTime_timeout?(e.course) + if isDone + @memberships_done.push e + else + @memberships_doing.push e + end + } + # respond_to do |format| + # format.html + # format.api + # end + end + +# modified by fq + def user_newfeedback + @jours = @user.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC') + @jours.update_all(:is_readed => true, :status => false) + @jours.each do |journal| + fetch_user_leaveWord_reply(journal).update_all(:is_readed => true, :status => false) + end + + @limit = 10 + @feedback_count = @jours.count + @feedback_pages = Paginator.new @feedback_count, @limit, params['page'] + @offset ||= @feedback_pages.offset + @jour = @jours[@offset, @limit] + @state = false + end + # end + + def user_comments + + end + + #end + def index + @status = params[:status] || 1 + sort_init 'login', 'asc' + sort_update %w(login firstname lastname mail admin created_on last_login_on) + + case params[:format] + when 'xml', 'json' + @offset, @limit = api_offset_and_limit({:limit => 15}) + else + @limit = 15 + end + + # retrieve all users + # 先内连一下statuses 保证排序之后数量一致 + scope = User.visible. + joins("INNER JOIN user_statuses ON users.id = user_statuses.user_id") + + # unknow + scope = scope.in_group(params[:group_id]) if params[:group_id].present? + + # pagination + @user_count = scope.count + @user_pages = Paginator.new @user_count, @limit, params['page'] + + # users classify + case params[:user_sort_type] + when '0' + # 创建时间排序 + @s_type = 0 + @users = scope.reorder('users.created_on DESC') + when '1' + # 活跃度排序, 就是所谓的得分情况 + @s_type = 1 + @users = scope. + joins("LEFT JOIN option_numbers ON users.id = option_numbers.user_id and option_numbers.score_type = 1"). + reorder('option_numbers.total_score DESC') + when '2' + # 粉丝数排序 + @s_type = 2 + @users = scope. + #joins("INNER JOIN user_statuses ON users.id = user_statuses.user_id"). + reorder('user_statuses.watchers_count DESC') + + else + # 默认活跃度排序 + @s_type = 1 + @users = scope. + joins("LEFT JOIN option_numbers ON users.id = option_numbers.user_id and option_numbers.score_type = 1"). + reorder('option_numbers.total_score DESC') + end + + # limit and offset + @users = @users.limit(@user_pages.per_page).offset(@user_pages.offset) + + @user_base_tag = params[:id] ? 'base_users':'users_base' + respond_to do |format| + format.html { + @groups = Group.all.sort + render :layout => @user_base_tag + } + format.api + end + end + + def search + sort_init 'login', 'asc' + sort_update %w(login firstname lastname mail admin created_on last_login_on) + (redirect_to users_path, :notice => l(:label_sumbit_empty);return) if params[:name].blank? + case params[:format] + when 'xml', 'json' + @offset, @limit = api_offset_and_limit({:limit => 15}) + else + @limit = 15#per_page_option + end + + @status = params[:status] || 1 + has = { + "show_changesets" => true + } + scope = User.logged.status(@status) + scope = scope.like(params[:name]) if params[:name].present? + @user_count = scope.count + @user_pages = Paginator.new @user_count, @limit, params['page'] + @user_base_tag = params[:id] ? 'base_users':'users_base' + @offset ||= @user_pages.reverse_offset + unless @offset == 0 + @users = scope.offset(@offset).limit(@limit).all.reverse + else + limit = @user_count % @limit + if limit == 0 + limit = @limit + end + @users = scope.offset(@offset).limit(limit).all.reverse + end + + respond_to do |format| + format.html { + @groups = Group.all.sort + render :layout => @user_base_tag + } + format.api + end + end + + def show + pre_count = 10 #limit + case params[:type] + when "1" + if @user == User.current + activity = Activity.where('user_id = ?', User.current.id).order('id desc') + @activity_count = activity.count + @activity_pages = Paginator.new @activity_count, pre_count, params['page'] + @activity = activity.offset(@activity_pages.offset).limit(@activity_pages.per_page).all + @state = 1 + end + when "2" + message = [] + if @user == User.current + message = JournalsForMessage.reference_message(@user.id) + message += Journal.reference_message(@user.id) + end + @activity_count = message.size + @info_pages = Paginator.new @activity_count, pre_count, params['page'] + messages = message.sort {|x,y| y.created_on <=> x.created_on } + @message = messages[@info_pages.offset, @info_pages.per_page] + @state = 2 + else + where_condition = nil; + # where_condition = "act_type <> 'JournalsForMessage'" + if @user == User.current + watcher = User.watched_by(@user) + watcher.push(User.current) + activity = Activity.where(where_condition).where('user_id in (?)', watcher).order('id desc') + else + activity = Activity.where(where_condition).where('user_id = ?', @user.id).order('id desc') + end + @activity_count = activity.count + @activity_pages = Paginator.new @activity_count, pre_count, params['page'] + @activity = activity.offset(@activity_pages.offset).limit(@activity_pages.per_page).all + @state = 0 + end + + if params[:user].present? + + user_temp = User.find_by_sql("select id from users where concat(lastname,firstname) like '%#{params[:user]}%' or lastname like '%#{params[:user]}%'") + + if user_temp.size > 1 + activity = Activity.where('user_id in (?)', user_temp).where('user_id in (?)', watcher).order('id desc') + elsif user_temp.size == 1 + activity = Activity.where('user_id = ?', user_temp).where('user_id in (?)', watcher).order('id desc') + else + activity = Activity.where("1 = 0") + end + @offset, @limit = api_offset_and_limit({:limit => 10}) + @activity_count = activity.count + @activity_pages = Paginator.new @activity_count, @limit, params['page'] + @offset ||= @activity_pages.offset + @activity = activity.offset(@offset).limit(@limit) + @state = 0 + end + + +#Modified by nie + unless User.current.admin? + if !@user.active? #|| (@user != User.current && @memberships.empty? && events.empty?) + # redirect_to home_path + render_404 + return + end + end + + respond_to do |format| + format.html + format.api + end + end + + ##end fq + + #### added by fq + def info + + message = [] + if @user == User.current + message = JournalsForMessage.reference_message(@user.id) + message += Journal.reference_message(@user.id) + end + @offset, @limit = api_offset_and_limit({:limit => 10}) + @info_count = message.size + @info_pages = Paginator.new @info_count, @limit, params['page'] + @offset ||= @info_pages.offset + + messages = message.sort {|x,y| y.created_on <=> x.created_on } + + @message = messages[@offset, @limit] + + unless User.current.admin? + if !@user.active? + render_404 + return + end + end + + respond_to do |format| + format.html + format.api + end + end + #### end + + + def new + @user = User.new(:language => Setting.default_language, :mail_notification => Setting.default_notification_option) + @auth_sources = AuthSource.all + render :layout => "users_base" + end + + def create + @user = User.new(:language => Setting.default_language, :mail_notification => Setting.default_notification_option) + @user.safe_attributes = params[:user] + @user.admin = params[:user][:admin] || false + @user.login = params[:user][:login] + @user.password, @user.password_confirmation = params[:user][:password], params[:user][:password_confirmation] unless @user.auth_source_id + + if @user.save + @user.pref.attributes = params[:pref] + @user.pref[:no_self_notified] = (params[:no_self_notified] == '1') + @user.pref.save + @user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : []) + + Mailer.account_information(@user, params[:user][:password]).deliver if params[:send_information] + + respond_to do |format| + format.html { + flash[:notice] = l(:notice_user_successful_create, :id => view_context.link_to(@user.login, user_path(@user))) + if params[:continue] + redirect_to new_user_path + else + redirect_to edit_user_path(@user) + end + } + format.api { render :action => 'show', :status => :created, :location => user_url(@user) } + end + else + @auth_sources = AuthSource.all + # Clear password input + @user.password = @user.password_confirmation = nil + + respond_to do |format| + format.html { render :action => 'new',:layout => "users_base" } + format.api { render_validation_errors(@user) } + end + end + + unless @user.id.nil? + #后台注册的用户默认权限为男性开发员 + ue = UserExtensions.create(:identity => 3, + :gender => 0, + :user_id => @user.id) + ue.save + end + end + + def edit + @auth_sources = AuthSource.all + @membership ||= Member.new + end + + def watch_projects + @watch_projects = Project.joins(:watchers).where("project_type <>? and watchable_type = ? and `watchers`.user_id = ?", '1','Project', @user.id) + @state = 1 + respond_to do |format| + format.html { + render :layout => 'base_users' + } + format.api + end + end + + def update + @user.admin = params[:user][:admin] if params[:user][:admin] + @user.login = params[:user][:login] if params[:user][:login] + if params[:user][:password].present? && (@user.auth_source_id.nil? || params[:user][:auth_source_id].blank?) + @user.password, @user.password_confirmation = params[:user][:password], params[:user][:password_confirmation] + end + @user.safe_attributes = params[:user] + # Was the account actived ? (do it before User#save clears the change) + was_activated = (@user.status_change == [User::STATUS_REGISTERED, User::STATUS_ACTIVE]) + # TODO: Similar to My#account + @user.pref.attributes = params[:pref] + @user.pref[:no_self_notified] = (params[:no_self_notified] == '1') + + if @user.save + @user.pref.save + @user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : []) + + if was_activated + Mailer.account_activated(@user).deliver + elsif @user.active? && params[:send_information] && !params[:user][:password].blank? && @user.auth_source_id.nil? + Mailer.account_information(@user, params[:user][:password]).deliver + end + + respond_to do |format| + format.html { + flash[:notice] = l(:notice_successful_update) + redirect_to_referer_or edit_user_path(@user) + } + format.api { render_api_ok } + end + else + @auth_sources = AuthSource.all + @membership ||= Member.new + # Clear password input + @user.password = @user.password_confirmation = nil + + respond_to do |format| + format.html { render :action => :edit } + format.api { render_validation_errors(@user) } + end + end + end + + def destroy + @user.destroy + respond_to do |format| + format.html { redirect_back_or_default(admin_users_path) } + format.api { render_api_ok } + end + end + + def edit_membership + @membership = Member.edit_membership(params[:membership_id], params[:membership], @user) + @membership.save + respond_to do |format| + format.html { redirect_to edit_user_path(@user, :tab => 'memberships') } + format.js + end + end + + def destroy_membership + @membership = Member.find(params[:membership_id]) + if @membership.deletable? + @membership.destroy + end + respond_to do |format| + format.html { redirect_to edit_user_path(@user, :tab => 'memberships') } + format.js + end + end + + ################# added by william + def tag_save + @tags = params[:tag_for_save][:name] + @obj_id = params[:tag_for_save][:object_id] + @obj_flag = params[:tag_for_save][:object_flag] + + case @obj_flag + when '1' then + @obj = User.find_by_id(@obj_id) + when '2' then + @obj = Project.find_by_id(@obj_id) + when '3' then + @obj = Issue.find_by_id(@obj_id) + when '4' then + @obj = Bid.find_by_id(@obj_id) + when '5' then + @obj = Forum.find_by_id(@obj_id) + when '6' + @obj = Attachment.find_by_id(@obj_id) + when '7' then + @obj = Contest.find_by_id(@obj_id) + when '8' + @obj = OpenSourceProject.find_by_id(@obj_id) + when '9' + @obj = Course.find_by_id(@obj_id) + else + @obj = nil + end + unless @obj.nil? + @obj.tag_list.add(@tags.split(",")) + else + return + end + if @obj.save + logger.debug "#{__FILE__}:#{__LINE__} ===> #{@obj.to_json}" + else + logger.error "#{__FILE__}:#{__LINE__} ===> #{@obj.errors.try(:full_messages)}" + end + respond_to do |format| + format.js + format.html + end + end + + def tag_saveEx + @tags = params[:tag_name] + @obj_id = params[:obj_id] + @obj_flag = params[:obj_flag] + + case @obj_flag + when '1' then + @obj = User.find_by_id(@obj_id) + when '2' then + @obj = Project.find_by_id(@obj_id) + when '3' then + @obj = Issue.find_by_id(@obj_id) + when '4' then + @obj = Bid.find_by_id(@obj_id) + when '5' then + @obj = Forum.find_by_id(@obj_id) + when '6' + @obj = Attachment.find_by_id(@obj_id) + when '7' then + @obj = Contest.find_by_id(@obj_id) + when '8' + @obj = OpenSourceProject.find_by_id(@obj_id) + when '9' + @obj = Course.find_by_id(@obj_id) + else + @obj = nil + end + unless @obj.nil? + @obj.tag_list.add(@tags.split(",")) + else + return + end + if @obj.save + ## 执行成功的操作。 + else + #捕获异常 + end + respond_to do |format| + format.js + format.html + end + end + ###add by huang + def user_watchlist + end + ###add by huang + def user_fanslist + + end + + #william + def update_extensions(user_extensions) + user_extensions = params[:user_extensions] + unless user_extensions.nil? + user_extensions = UserExtensions.find_by_id(user_extensions.user_id) + + # user_extensions. + end + end + +# added by bai + def topic_score_index + + end + + def project_score_index + + end + + def activity_score_index + + end + + def influence_score_index + + end + + def score_index + + end +# end + def topic_new_score_index + + end + + def project_new_score_index + + end + + def activity_new_score_index + + end + + def influence_new_score_index + + end + + def score_new_index + + end + + def update_score + @user = User.find(params[:id]) + end + + private + + def find_user + if params[:id] == 'current' + require_login || return + @user = User.current + else + @user = User.find(params[:id]) + end + rescue ActiveRecord::RecordNotFound + render_404 + end + + def setting_layout(default_base='base_users') + User.current.admin? ? default_base : default_base + end + + # 必填自己的工作单位,其实就是学校 + def auth_user_extension + if @user == User.current && (@user.user_extensions.nil? || @user.user_extensions.school.nil?) + flash[:error] = l(:error_complete_occupation) + redirect_to my_account_path + end + end + + #重置用户得分 + def rest_user_score + memo_num(@user) + messges_for_issue_num(@user) + issues_status_num(@user) + replay_for_memo_num(@user) + tread_num(@user) + praise_num(@user) + changeset_num(@user) + document_num(@user) + attachment_num(@user) + issue_done_ratio_num(@user) + post_issue_num(@user) + end + + #验证是否显示课程 + def can_show_course + @first_page = FirstPage.where("page_type = 'project'").first + if @first_page.show_course == 2 + render_404 + end + end +end diff --git a/app/controllers/versions_controller.rb b/app/controllers/versions_controller.rb index 5824848ff..c3aff06e1 100644 --- a/app/controllers/versions_controller.rb +++ b/app/controllers/versions_controller.rb @@ -1,200 +1,200 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 Jean-Philippe Lang -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -class VersionsController < ApplicationController - layout "base_projects" - menu_item :roadmap - model_object Version - before_filter :find_model_object, :except => [:index, :new, :create, :close_completed] - #before_filter :find_model_object_contest, :except => [:index, :new, :create] - before_filter :find_project_from_association, :except => [:index, :new, :create, :close_completed] - before_filter :find_project_by_project_id, :only => [:index, :new, :create, :close_completed] - before_filter :authorize - - accept_api_auth :index, :show, :create, :update, :destroy - - helper :custom_fields - helper :projects - helper :project_score - - def index - respond_to do |format| - format.html { - @trackers = @project.trackers.sorted.all - retrieve_selected_tracker_ids(@trackers, @trackers.select {|t| t.is_in_roadmap?}) - @with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1') - project_ids = @with_subprojects ? @project.self_and_descendants.collect(&:id) : [@project.id] - - @versions = @project.shared_versions || [] - @versions += @project.rolled_up_versions.visible if @with_subprojects - #added by young - @versions = @versions.uniq.reverse#Modified by young - unless params[:completed] - @completed_versions = @versions.select {|version| version.closed? || version.completed? } - @versions -= @completed_versions - end - @offset, @limit = api_offset_and_limit({:limit => 4}) - @versions_count = @versions.count - @versions_pages = Paginator.new @versions_count, @limit, params['page'] - @offset ||= @versions_pages.offset - @versions = @versions.slice(@offset, @limit) - #end by young - - - @issues_by_version = {} - if @selected_tracker_ids.any? && @versions.any? - issues = Issue.visible.all( - :include => [:project, :status, :tracker, :priority, :fixed_version], - :conditions => {:tracker_id => @selected_tracker_ids, :project_id => project_ids, :fixed_version_id => @versions.map(&:id)}, - :order => "#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id" - ) - @issues_by_version = issues.group_by(&:fixed_version) - end - @versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?} - } - format.api { - @versions = @project.shared_versions.all - } - end - end - - def show - respond_to do |format| - format.html { - @issues = @version.fixed_issues.visible. - includes(:status, :tracker, :priority). - reorder("#{Tracker.table_name}.position, #{Issue.table_name}.id"). - all - } - format.api - end - end - - def new - @version = @project.versions.build - @version.safe_attributes = params[:version] - - respond_to do |format| - format.html - format.js - end - end - - def create - @version = @project.versions.build - if params[:version] - attributes = params[:version].dup - attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing']) - @version.safe_attributes = attributes - end - - if request.post? - if @version.save - respond_to do |format| - format.html do - flash[:notice] = l(:notice_successful_create) - redirect_to settings_project_path(@project, :tab => 'versions') - end - format.js - format.api do - render :action => 'show', :status => :created, :location => version_url(@version) - end - end - else - respond_to do |format| - format.html { render :action => 'new' } - format.js { render :action => 'new' } - format.api { render_validation_errors(@version) } - end - end - end - end - - def edit - end - - def update - if request.put? && params[:version] - attributes = params[:version].dup - attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing']) - @version.safe_attributes = attributes - if @version.save - respond_to do |format| - format.html { - flash[:notice] = l(:notice_successful_update) - redirect_back_or_default settings_project_path(@project, :tab => 'versions') - } - format.api { render_api_ok } - end - else - respond_to do |format| - format.html { render :action => 'edit' } - format.api { render_validation_errors(@version) } - end - end - end - end - - def close_completed - if request.put? - @project.close_completed_versions - end - redirect_to settings_project_path(@project, :tab => 'versions') - end - - def close_completed_contest - if request.put? - @contest.close_completed_versions - end - redirect_to settings_contest_path(@contest, :tab => 'versions') - end - - def destroy - if @version.fixed_issues.empty? - @version.destroy - respond_to do |format| - format.html { redirect_back_or_default settings_project_path(@project, :tab => 'versions') } - format.api { render_api_ok } - end - else - respond_to do |format| - format.html { - flash[:error] = l(:notice_unable_delete_version) - redirect_to settings_project_path(@project, :tab => 'versions') - } - format.api { head :unprocessable_entity } - end - end - end - - def status_by - respond_to do |format| - format.html { render :action => 'show' } - format.js - end - end - - private - - def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil) - if ids = params[:tracker_ids] - @selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s } - else - @selected_tracker_ids = (selectable_trackers).collect {|t| t.id.to_s } - end - end -end +# Redmine - project management software +# Copyright (C) 2006-2013 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class VersionsController < ApplicationController + layout "base_projects" + menu_item :roadmap + model_object Version + before_filter :find_model_object, :except => [:index, :new, :create, :close_completed] + #before_filter :find_model_object_contest, :except => [:index, :new, :create] + before_filter :find_project_from_association, :except => [:index, :new, :create, :close_completed] + before_filter :find_project_by_project_id, :only => [:index, :new, :create, :close_completed] + before_filter :authorize + + accept_api_auth :index, :show, :create, :update, :destroy + + helper :custom_fields + helper :projects + helper :project_score + + def index + respond_to do |format| + format.html { + @trackers = @project.trackers.sorted.all + retrieve_selected_tracker_ids(@trackers, @trackers.select {|t| t.is_in_roadmap?}) + @with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1') + project_ids = @with_subprojects ? @project.self_and_descendants.collect(&:id) : [@project.id] + + @versions = @project.shared_versions || [] + @versions += @project.rolled_up_versions.visible if @with_subprojects + #added by young + @versions = @versions.uniq.reverse#Modified by young + unless params[:completed] + @completed_versions = @versions.select {|version| version.closed? || version.completed? } + @versions -= @completed_versions + end + @offset, @limit = api_offset_and_limit({:limit => 4}) + @versions_count = @versions.count + @versions_pages = Paginator.new @versions_count, @limit, params['page'] + @offset ||= @versions_pages.offset + @versions = @versions.slice(@offset, @limit) + #end by young + + + @issues_by_version = {} + if @selected_tracker_ids.any? && @versions.any? + issues = Issue.visible.all( + :include => [:project, :status, :tracker, :priority, :fixed_version], + :conditions => {:tracker_id => @selected_tracker_ids, :project_id => project_ids, :fixed_version_id => @versions.map(&:id)}, + :order => "#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id" + ) + @issues_by_version = issues.group_by(&:fixed_version) + end + @versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?} + } + format.api { + @versions = @project.shared_versions.all + } + end + end + + def show + respond_to do |format| + format.html { + @issues = @version.fixed_issues.visible. + includes(:status, :tracker, :priority). + reorder("#{Tracker.table_name}.position, #{Issue.table_name}.id"). + all + } + format.api + end + end + + def new + @version = @project.versions.build + @version.safe_attributes = params[:version] + + respond_to do |format| + format.html + format.js + end + end + + def create + @version = @project.versions.build + if params[:version] + attributes = params[:version].dup + attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing']) + @version.safe_attributes = attributes + end + + if request.post? + if @version.save + respond_to do |format| + format.html do + flash[:notice] = l(:notice_successful_create) + redirect_to settings_project_path(@project, :tab => 'versions') + end + format.js + format.api do + render :action => 'show', :status => :created, :location => version_url(@version) + end + end + else + respond_to do |format| + format.html { render :action => 'new' } + format.js { render :action => 'new' } + format.api { render_validation_errors(@version) } + end + end + end + end + + def edit + end + + def update + if request.put? && params[:version] + attributes = params[:version].dup + attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing']) + @version.safe_attributes = attributes + if @version.save + respond_to do |format| + format.html { + flash[:notice] = l(:notice_successful_update) + redirect_back_or_default settings_project_path(@project, :tab => 'versions') + } + format.api { render_api_ok } + end + else + respond_to do |format| + format.html { render :action => 'edit' } + format.api { render_validation_errors(@version) } + end + end + end + end + + def close_completed + if request.put? + @project.close_completed_versions + end + redirect_to settings_project_path(@project, :tab => 'versions') + end + + def close_completed_contest + if request.put? + @contest.close_completed_versions + end + redirect_to settings_contest_path(@contest, :tab => 'versions') + end + + def destroy + if @version.fixed_issues.empty? + @version.destroy + respond_to do |format| + format.html { redirect_back_or_default settings_project_path(@project, :tab => 'versions') } + format.api { render_api_ok } + end + else + respond_to do |format| + format.html { + flash[:error] = l(:notice_unable_delete_version) + redirect_to settings_project_path(@project, :tab => 'versions') + } + format.api { head :unprocessable_entity } + end + end + end + + def status_by + respond_to do |format| + format.html { render :action => 'show' } + format.js + end + end + + private + + def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil) + if ids = params[:tracker_ids] + @selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s } + else + @selected_tracker_ids = (selectable_trackers).collect {|t| t.id.to_s } + end + end +end diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb index 8f0723f2e..ca168ccb8 100644 --- a/app/controllers/welcome_controller.rb +++ b/app/controllers/welcome_controller.rb @@ -1,200 +1,200 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 Jean-Philippe Lang -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -class WelcomeController < ApplicationController - include ApplicationHelper - include WelcomeHelper - helper :project_score - caches_action :robots - before_filter :find_first_page, :only => [:index] - # before_filter :fake, :only => [:index, :course] - before_filter :entry_select, :only => [:index] - - def index - #@first_page = FirstPage.where("page_type = 'project'").first - #@show_course = @first_page.show_course - if @first_page.nil? || @first_page.sort_type.nil? - @projects = find_miracle_project(10, 3,"score desc") - else - case @first_page.sort_type - when 0 - @projects = find_miracle_project(10, 3,"created_on desc") - #@projects = @projects_all.order("created_on desc") - when 1 - @projects = find_miracle_project(10, 3,"score desc") - #@projects = @projects_all.order("grade desc") - when 2 - @projects = find_miracle_project(10, 3,"watchers_count desc") - #@projects = @projects_all.order("watchers_count desc") - - #gcm - #when '3' - #@projects=desc_sort_course_by_avtivity(@project_activity_count_array,@project_all_array) - # @projects=handle_project @projects_all,@project_activity_count - # @s_type = 3 - # @projects = @projects[@project_pages.offset, @project_pages.per_page] - - else - @projects = @projects_all.order("score desc") - end - end - - end - - def robots - @projects = Project.all_public.active - render :layout => false, :content_type => 'text/plain' - end - - def course - @course_page = FirstPage.where("page_type = 'course'").first - if params[:school_id] - @school_id = params[:school_id] - elsif User.current.logged? && User.current.user_extensions.try(:school) - @school_id = User.current.user_extensions.school.try(:id) - end - @logoLink ||= logolink() - end - - - - def logolink() - @course_page = FirstPage.where("page_type = 'course'").first - logo = get_avatar?(@course_page) - id = params[:school_id] - logo_link = "" - if id.nil? && (User.current.user_extensions.nil? || User.current.user_extensions.school.nil?) - if logo - logo_link = url_to_avatar(@course_page) - else - logo_link = '/images/transparent.png' - end - - else - if id == "0" - if logo - logo_link = url_to_avatar(@course_page) - else - logo_link = '/images/transparent.png' - end - else - if id.nil? - if School.find(User.current.user_extensions.school.id).logo_link.nil? - logo_link = '/images/transparent.png' - else - logo_link = School.find(User.current.user_extensions.school.id).logo_link - end - else - logo_link = School.find(id).logo_link - - end - end - end - return logo_link - end - - - def contest - @contest_page = FirstPage.where("page_type = 'contest'").first - @contest_notifications = ContestNotification.order("id desc") - end - - def search - search_condition = params[:q] - search_type = params[:search_type].to_sym unless search_condition.blank? - - if search_type.nil? && params[:contests_search] && params[:name] != "" - search_type = :contests - search_condition = params[:name] - end - - respond_to do |format| - format.html{ - case search_type - when :projects - redirect_to projects_search_path(:name => search_condition, - :project_type => Project::ProjectType_project) - when :courses - redirect_to courses_search_path(:name => search_condition) - when :contests - redirect_to contests_path(:name => search_condition) - when :users - redirect_to users_search_path(:name => search_condition) - when :users_teacher - redirect_to users_search_path(:name => search_condition, :role => :teacher) - when :users_student - redirect_to users_search_path(:name => search_condition, :role => :student) - else - #redirect_to home_path, :alert => l(:label_sumbit_empty) - (redirect_to home_path, :notice => l(:label_sumbit_empty);return) #if params[:name].blank? - end - } - end - end - - private - # 判断网站的入口,是课程 course 则跳过index去渲染 course 方法 - def entry_select - #@first_page = FirstPage.where("page_type = 'project'").first - url = request.original_url.gsub('/','') - if url.include?(Setting.host_course.gsub('/','')) - if @first_page.show_course == 1 - course - render :course - else - render_404 - end - - return 0 - elsif url.include?(Setting.host_contest.gsub('/','')) - if @first_page.show_contest == 1 - contest - render :contest - else - render_404 - end - - return 0 - elsif url.include?(Setting.host_user.gsub('/','')) - redirect_to(:controller => "users", :action => "index") - end - - - end - - # def render(*args) - # _fake if @fake_filter - # super - # end - - # private - - # def fake - # @fake_filter = true - # end - - # # 骗子方法 - # def _fake - # instance_variables.map { |variable| - # if variable.to_s =~ /Count$/ - # self.instance_variable_set(variable.to_sym, - # ("1" + (self.instance_variable_get(variable.to_sym).to_s)).to_i) - # end - # } - # end - -end +# Redmine - project management software +# Copyright (C) 2006-2013 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class WelcomeController < ApplicationController + include ApplicationHelper + include WelcomeHelper + helper :project_score + caches_action :robots + before_filter :find_first_page, :only => [:index] + # before_filter :fake, :only => [:index, :course] + before_filter :entry_select, :only => [:index] + + def index + #@first_page = FirstPage.where("page_type = 'project'").first + #@show_course = @first_page.show_course + if @first_page.nil? || @first_page.sort_type.nil? + @projects = find_miracle_project(10, 3,"score desc") + else + case @first_page.sort_type + when 0 + @projects = find_miracle_project(10, 3,"created_on desc") + #@projects = @projects_all.order("created_on desc") + when 1 + @projects = find_miracle_project(10, 3,"score desc") + #@projects = @projects_all.order("grade desc") + when 2 + @projects = find_miracle_project(10, 3,"watchers_count desc") + #@projects = @projects_all.order("watchers_count desc") + + #gcm + #when '3' + #@projects=desc_sort_course_by_avtivity(@project_activity_count_array,@project_all_array) + # @projects=handle_project @projects_all,@project_activity_count + # @s_type = 3 + # @projects = @projects[@project_pages.offset, @project_pages.per_page] + + else + @projects = @projects_all.order("score desc") + end + end + + end + + def robots + @projects = Project.all_public.active + render :layout => false, :content_type => 'text/plain' + end + + def course + @course_page = FirstPage.where("page_type = 'course'").first + if params[:school_id] + @school_id = params[:school_id] + elsif User.current.logged? && User.current.user_extensions.try(:school) + @school_id = User.current.user_extensions.school.try(:id) + end + @logoLink ||= logolink() + end + + + + def logolink() + @course_page = FirstPage.where("page_type = 'course'").first + logo = get_avatar?(@course_page) + id = params[:school_id] + logo_link = "" + if id.nil? && (User.current.user_extensions.nil? || User.current.user_extensions.school.nil?) + if logo + logo_link = url_to_avatar(@course_page) + else + logo_link = '/images/transparent.png' + end + + else + if id == "0" + if logo + logo_link = url_to_avatar(@course_page) + else + logo_link = '/images/transparent.png' + end + else + if id.nil? + if School.find(User.current.user_extensions.school.id).logo_link.nil? + logo_link = '/images/transparent.png' + else + logo_link = School.find(User.current.user_extensions.school.id).logo_link + end + else + logo_link = School.find(id).logo_link + + end + end + end + return logo_link + end + + + def contest + @contest_page = FirstPage.where("page_type = 'contest'").first + @contest_notifications = ContestNotification.order("id desc") + end + + def search + search_condition = params[:q] + search_type = params[:search_type].to_sym unless search_condition.blank? + + if search_type.nil? && params[:contests_search] && params[:name] != "" + search_type = :contests + search_condition = params[:name] + end + + respond_to do |format| + format.html{ + case search_type + when :projects + redirect_to projects_search_path(:name => search_condition, + :project_type => Project::ProjectType_project) + when :courses + redirect_to courses_search_path(:name => search_condition) + when :contests + redirect_to contests_path(:name => search_condition) + when :users + redirect_to users_search_path(:name => search_condition) + when :users_teacher + redirect_to users_search_path(:name => search_condition, :role => :teacher) + when :users_student + redirect_to users_search_path(:name => search_condition, :role => :student) + else + #redirect_to home_path, :alert => l(:label_sumbit_empty) + (redirect_to home_path, :notice => l(:label_sumbit_empty);return) #if params[:name].blank? + end + } + end + end + + private + # 判断网站的入口,是课程 course 则跳过index去渲染 course 方法 + def entry_select + #@first_page = FirstPage.where("page_type = 'project'").first + url = request.original_url.gsub('/','') + if url.include?(Setting.host_course.gsub('/','')) + if @first_page.show_course == 1 + course + render :course + else + render_404 + end + + return 0 + elsif url.include?(Setting.host_contest.gsub('/','')) + if @first_page.show_contest == 1 + contest + render :contest + else + render_404 + end + + return 0 + elsif url.include?(Setting.host_user.gsub('/','')) + redirect_to(:controller => "users", :action => "index") + end + + + end + + # def render(*args) + # _fake if @fake_filter + # super + # end + + # private + + # def fake + # @fake_filter = true + # end + + # # 骗子方法 + # def _fake + # instance_variables.map { |variable| + # if variable.to_s =~ /Count$/ + # self.instance_variable_set(variable.to_sym, + # ("1" + (self.instance_variable_get(variable.to_sym).to_s)).to_i) + # end + # } + # end + +end diff --git a/app/controllers/zipdown_controller.rb b/app/controllers/zipdown_controller.rb index b7eb8afe9..0393206b7 100644 --- a/app/controllers/zipdown_controller.rb +++ b/app/controllers/zipdown_controller.rb @@ -1,175 +1,175 @@ -require 'zip' -class ZipdownController < ApplicationController - #查找项目(课程) - before_filter :find_project_by_bid_id, :only => [:assort] - #检查权限 - #勿删 before_filter :authorize, :only => [:assort,:download_user_homework] - SAVE_FOLDER = "#{Rails.root}/files" - OUTPUT_FOLDER = "#{Rails.root}/tmp/archiveZip" - - #通过作业Id找到项目(课程) - def find_project_by_bid_id - obj_class = params[:obj_class] - obj_id = params[:obj_id] - obj = obj_class.constantize.find(obj_id) - case obj.class.to_s.to_sym - when :Bid - @project = obj.courses[0] - end - end - def assort - obj_class = params[:obj_class] - obj_id = params[:obj_id] - obj = obj_class.constantize.find(obj_id) - zipfile = nil - case obj.class.to_s.to_sym - when :Bid - zipfile = zip_bid obj - else - logger.error "[ZipDown#assort] ===> #{obj.class.to_s.to_sym} unKown !!" - end - send_file zipfile, :filename => obj.name+".zip", :type => detect_content_type(zipfile) if zipfile - - #rescue NameError, ActiveRecord::RecordNotFound => e - #logger.error "[ZipDown] ===> #{e}" - #@error = e - end - - #下载某一学生的作业的所有文件 - def download_user_homework - homework = HomeworkAttach.find params[:homework] - if User.current.admin? || User.current.member_of_course?(homework.bid.courses.first) - if homework != nil - if homework.attachments.count > 0 - zipfile = zip_homework_by_user homework - send_file zipfile, :filename => homework.name+".zip", :type => detect_content_type(zipfile) if(zipfile) - else - render file: 'public/no_file_found.html' , :layout => 'course_base' - end - else - render file: 'public/file_not_found.html' , :layout => 'course_base' - end - else - render_403 :message => :notice_not_authorized ,:layout => "course_base" - end - rescue => e - render file: 'public/file_not_found.html' , :layout => 'course_base' - end - - private - - def zip_user_bid(bid,user_id) - # Todo: User Access Controll - - homeattaches = bid.homeworks.where("user_id = ?",user_id) - # 得到每一个人所有文件打包的zip文件 - # 并将每一个人的zip打包为一个并返回路径 - user_zip_paths = homeattaches.map do |homeattach| - zip_homework_by_user homeattach - end - #zipping "#{Time.now.to_i}_#{bid.name}.zip", user_zip_paths, OUTPUT_FOLDER - user_zip_paths - end - - def zip_bid(bid) - # Todo: User Access Controll - - homeattaches = bid.homeworks - #记录所有作业是不是有附件,有一个附件就改为true - has_file = false - # 得到每一个人所有文件打包的zip文件 - # 并将每一个人的zip打包为一个并返回路径 - user_zip_paths = homeattaches.map do |homeattach| - if homeattach.attachments.count > 0 - zip_homework_by_user homeattach - has_file = true unless has_file - end - end - unless has_file - render file: 'public/no_file_fond.html' , :layout => 'course_base' - end - zipping "#{Time.now.to_i}_#{bid.name}.zip", user_zip_paths, OUTPUT_FOLDER - - #@paths = homeworks_attach_path - #zipfile = ziping homeworks_attach_path - #send_file zipfile, :filename => bid.name, - # :type => detect_content_type(zipfile) - #rescue Errno::ENOENT => e - # logger.error "[Errno::ENOENT] ===> #{e}" - # @error = e - end - - def zip_homework_by_user(homeattach) - #if homeattach.attachments.count > 0 - homeworks_attach_path = [] - # 需要将所有homework.attachments遍历加入zip - # 并且返回zip路径 - user_attaches_paths = homeattach.attachments.each do |attach| - #length = attach.storage_path.length - homeworks_attach_path << attach.diskfile#.to_s.slice((length+1)..-1) - end - zipping("#{homeattach.user.name.to_s}_#{Time.now.to_i}.zip", homeworks_attach_path, OUTPUT_FOLDER, true) - #user_attaches_paths - #end - end - - - def zipping(zip_name_refer, files_paths, output_path, is_attachment=false) - # 输入待打包的文件列表,已经打包文件定位到ouput_path - ic = Iconv.new('GBK//IGNORE', 'UTF-8//IGNORE') - input_filename = files_paths - - rename_zipfile = zip_name_refer ||= "archive_#{Time.now.to_i}.zip" - zipfile_name = "#{output_path}/#{rename_zipfile}" - - Dir.mkdir(File.dirname(zipfile_name)) unless File.exist?(File.dirname(zipfile_name)) - - Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile| - input_filename.each do |filename| - rename_file = Time.now.to_i.to_s+ ic.iconv( (File.basename(filename)) ).to_s - rename_file = ic.iconv( filename_to_real( File.basename(filename))).to_s if is_attachment - - zipfile.add(rename_file, filename) - end - zipfile.get_output_stream('ReadMe') do |os| - os.write 'Homeworks' - end - end - zipfile_name - rescue Errno => e - logger.error "[zipdown#zipping] ===> #{e}" - @error = e - end - - #def ziping files_path - # ic = Iconv.new('GBK//IGNORE', 'UTF-8//IGNORE') - # folder = SaveFolder - # input_filename = files_path - # zipfile_name = "#{OutputFolder}/archive_#{Time.now.to_i}.zip" - # - # Dir.mkdir(File.dirname(zipfile_name)) unless File.exist?(File.dirname(zipfile_name)) - # Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile| - # input_filename.each do |filename| - # zipfile.add(ic.iconv(filename_to_real(File.basename(filename))), folder + '/' + filename) - # end - # zipfile.get_output_stream("ReadMe") { |os| - # os.write "Homeworks" - # } - # end - # zipfile_name - #rescue Errno => e - # logger.error "[zipdown#zipping] ===> #{e}" - # @error = e - #end - - def detect_content_type(name) - content_type = Redmine::MimeType.of(name) - content_type.to_s - end - - def filename_to_real(name) - attach = Attachment.find_by_disk_filename(name) - attach.filename - end - -end +require 'zip' +class ZipdownController < ApplicationController + #查找项目(课程) + before_filter :find_project_by_bid_id, :only => [:assort] + #检查权限 + #勿删 before_filter :authorize, :only => [:assort,:download_user_homework] + SAVE_FOLDER = "#{Rails.root}/files" + OUTPUT_FOLDER = "#{Rails.root}/tmp/archiveZip" + + #通过作业Id找到项目(课程) + def find_project_by_bid_id + obj_class = params[:obj_class] + obj_id = params[:obj_id] + obj = obj_class.constantize.find(obj_id) + case obj.class.to_s.to_sym + when :Bid + @project = obj.courses[0] + end + end + def assort + obj_class = params[:obj_class] + obj_id = params[:obj_id] + obj = obj_class.constantize.find(obj_id) + zipfile = nil + case obj.class.to_s.to_sym + when :Bid + zipfile = zip_bid obj + else + logger.error "[ZipDown#assort] ===> #{obj.class.to_s.to_sym} unKown !!" + end + send_file zipfile, :filename => obj.name+".zip", :type => detect_content_type(zipfile) if zipfile + + #rescue NameError, ActiveRecord::RecordNotFound => e + #logger.error "[ZipDown] ===> #{e}" + #@error = e + end + + #下载某一学生的作业的所有文件 + def download_user_homework + homework = HomeworkAttach.find params[:homework] + if User.current.admin? || User.current.member_of_course?(homework.bid.courses.first) + if homework != nil + if homework.attachments.count > 0 + zipfile = zip_homework_by_user homework + send_file zipfile, :filename => homework.name+".zip", :type => detect_content_type(zipfile) if(zipfile) + else + render file: 'public/no_file_found.html' , :layout => 'course_base' + end + else + render file: 'public/file_not_found.html' , :layout => 'course_base' + end + else + render_403 :message => :notice_not_authorized ,:layout => "course_base" + end + rescue => e + render file: 'public/file_not_found.html' , :layout => 'course_base' + end + + private + + def zip_user_bid(bid,user_id) + # Todo: User Access Controll + + homeattaches = bid.homeworks.where("user_id = ?",user_id) + # 得到每一个人所有文件打包的zip文件 + # 并将每一个人的zip打包为一个并返回路径 + user_zip_paths = homeattaches.map do |homeattach| + zip_homework_by_user homeattach + end + #zipping "#{Time.now.to_i}_#{bid.name}.zip", user_zip_paths, OUTPUT_FOLDER + user_zip_paths + end + + def zip_bid(bid) + # Todo: User Access Controll + + homeattaches = bid.homeworks + #记录所有作业是不是有附件,有一个附件就改为true + has_file = false + # 得到每一个人所有文件打包的zip文件 + # 并将每一个人的zip打包为一个并返回路径 + user_zip_paths = homeattaches.map do |homeattach| + if homeattach.attachments.count > 0 + zip_homework_by_user homeattach + has_file = true unless has_file + end + end + unless has_file + render file: 'public/no_file_fond.html' , :layout => 'course_base' + end + zipping "#{Time.now.to_i}_#{bid.name}.zip", user_zip_paths, OUTPUT_FOLDER + + #@paths = homeworks_attach_path + #zipfile = ziping homeworks_attach_path + #send_file zipfile, :filename => bid.name, + # :type => detect_content_type(zipfile) + #rescue Errno::ENOENT => e + # logger.error "[Errno::ENOENT] ===> #{e}" + # @error = e + end + + def zip_homework_by_user(homeattach) + #if homeattach.attachments.count > 0 + homeworks_attach_path = [] + # 需要将所有homework.attachments遍历加入zip + # 并且返回zip路径 + user_attaches_paths = homeattach.attachments.each do |attach| + #length = attach.storage_path.length + homeworks_attach_path << attach.diskfile#.to_s.slice((length+1)..-1) + end + zipping("#{homeattach.user.name.to_s}_#{Time.now.to_i}.zip", homeworks_attach_path, OUTPUT_FOLDER, true) + #user_attaches_paths + #end + end + + + def zipping(zip_name_refer, files_paths, output_path, is_attachment=false) + # 输入待打包的文件列表,已经打包文件定位到ouput_path + ic = Iconv.new('GBK//IGNORE', 'UTF-8//IGNORE') + input_filename = files_paths + + rename_zipfile = zip_name_refer ||= "archive_#{Time.now.to_i}.zip" + zipfile_name = "#{output_path}/#{rename_zipfile}" + + Dir.mkdir(File.dirname(zipfile_name)) unless File.exist?(File.dirname(zipfile_name)) + + Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile| + input_filename.each do |filename| + rename_file = Time.now.to_i.to_s+ ic.iconv( (File.basename(filename)) ).to_s + rename_file = ic.iconv( filename_to_real( File.basename(filename))).to_s if is_attachment + + zipfile.add(rename_file, filename) + end + zipfile.get_output_stream('ReadMe') do |os| + os.write 'Homeworks' + end + end + zipfile_name + rescue Errno => e + logger.error "[zipdown#zipping] ===> #{e}" + @error = e + end + + #def ziping files_path + # ic = Iconv.new('GBK//IGNORE', 'UTF-8//IGNORE') + # folder = SaveFolder + # input_filename = files_path + # zipfile_name = "#{OutputFolder}/archive_#{Time.now.to_i}.zip" + # + # Dir.mkdir(File.dirname(zipfile_name)) unless File.exist?(File.dirname(zipfile_name)) + # Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile| + # input_filename.each do |filename| + # zipfile.add(ic.iconv(filename_to_real(File.basename(filename))), folder + '/' + filename) + # end + # zipfile.get_output_stream("ReadMe") { |os| + # os.write "Homeworks" + # } + # end + # zipfile_name + #rescue Errno => e + # logger.error "[zipdown#zipping] ===> #{e}" + # @error = e + #end + + def detect_content_type(name) + content_type = Redmine::MimeType.of(name) + content_type.to_s + end + + def filename_to_real(name) + attach = Attachment.find_by_disk_filename(name) + attach.filename + end + +end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 807d851be..ef18793ab 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -33,8 +33,8 @@ module ApplicationHelper extend Forwardable def_delegators :wiki_helper, :wikitoolbar_for, :heads_for_wiki_formatter - #Added by young - #Define the course menu's link class + # Added by young + # Define the course menu's link class # 不是数组的转化成数组,然后判断当前menu_item是否在给定的列表 # REVIEW: 目测menu的机制,貌似不是很需要转换,再说 def link_class(label) @@ -679,15 +679,15 @@ module ApplicationHelper def textilizable(*args) options = args.last.is_a?(Hash) ? args.pop : {} case args.size - when 1 - obj = options[:object] - text = args.shift - when 2 - obj = args.shift - attr = args.shift - text = obj.send(attr).to_s - else - raise ArgumentError, 'invalid arguments to textilizable' + when 1 + obj = options[:object] + text = args.shift + when 2 + obj = args.shift + attr = args.shift + text = obj.send(attr).to_s + else + raise ArgumentError, 'invalid arguments to textilizable' end return '' if text.blank? project = options[:project] || @project || (obj && obj.respond_to?(:project) ? obj.project : nil) diff --git a/app/helpers/attachments_helper.rb b/app/helpers/attachments_helper.rb index ee9d2a70d..e6f20ea60 100644 --- a/app/helpers/attachments_helper.rb +++ b/app/helpers/attachments_helper.rb @@ -22,6 +22,9 @@ module AttachmentsHelper # Options: # :author -- author names are not displayed if set to false # :thumbails -- display thumbnails if enabled in settings + + include Redmine::Pagination + def link_to_attachments(container, options = {}) options.assert_valid_keys(:author, :thumbnails) @@ -171,7 +174,9 @@ module AttachmentsHelper s.html_safe end - def private_filter resultSet + # Modified by Longjun + # 有参数的方法要加() + def private_filter(resultSet) result = resultSet.to_a.dup # modify by nwb @@ -190,8 +195,12 @@ module AttachmentsHelper result end - include Redmine::Pagination - def paginateHelper obj, pre_size=10 + # Modified by Longjun + # include 应放在class/model 的开始处 + # include Redmine::Pagination + # end + + def paginateHelper (obj, pre_size=10) @obj_count = obj.count @obj_pages = Paginator.new @obj_count, pre_size, params['page'] if obj.kind_of? ActiveRecord::Base or obj.kind_of? ActiveRecord::Relation diff --git a/app/helpers/contests_helper.rb b/app/helpers/contests_helper.rb index 01c7d544f..0bc3e5e73 100644 --- a/app/helpers/contests_helper.rb +++ b/app/helpers/contests_helper.rb @@ -43,16 +43,16 @@ module ContestsHelper def sort_contest_enterprise(state, project_type) content = ''.html_safe case state - when 0 - content << content_tag('li', link_to(l(:label_sort_by_active), calls_path(:contest_sort_type => '1', :project_type => project_type))) - content << content_tag('li', link_to(l(:label_sort_by_time), calls_path(:contest_sort_type => '0', :project_type => project_type), :class=>"selected"), :class=>"selected") - - when 1 - content << content_tag('li', link_to(l(:label_sort_by_active), calls_path(:contest_sort_type => '1', :project_type => project_type), :class=>"selected"), :class=>"selected") - content << content_tag('li', link_to(l(:label_sort_by_time), calls_path(:contest_sort_type => '0', :project_type => project_type))) - end - content = content_tag('ul', content) - content_tag('div', content, :class => "tabs_enterprise") + when 0 + content << content_tag('li', link_to(l(:label_sort_by_active), calls_path(:contest_sort_type => '1', :project_type => project_type))) + content << content_tag('li', link_to(l(:label_sort_by_time), calls_path(:contest_sort_type => '0', :project_type => project_type), :class=>"selected"), :class=>"selected") + + when 1 + content << content_tag('li', link_to(l(:label_sort_by_active), calls_path(:contest_sort_type => '1', :project_type => project_type), :class=>"selected"), :class=>"selected") + content << content_tag('li', link_to(l(:label_sort_by_time), calls_path(:contest_sort_type => '0', :project_type => project_type))) + end + content = content_tag('ul', content) + content_tag('div', content, :class => "tabs_enterprise") end #end @@ -100,7 +100,10 @@ module ContestsHelper def count_contest_project contests = Contest.find(:id) @projects = [] - for contest in contests + # Modified by longjun + # for contest in contests + contests.each do |contest| + # end longjun @projects += contest.contesting_projects end @projects.count @@ -109,7 +112,10 @@ module ContestsHelper def count_contest_softapplication contests = Contest.find(:id) @softapplications = [] - for contest in contests + # Modified by alan + # for contest in contests + contests.each do |contest| + # end alan @softapplications += contest.contesting_softapplications end @projects.count @@ -119,19 +125,29 @@ module ContestsHelper def count_contest_user contests = Contest.find(:id) @users = [] - for contest in contests - for project in contest.projects + # Modified by alan + # for contest in contests + contests.each do |contest| + + contest.projects.each do |project| + @users += project.users end end + # end alan + @users.count end def count_contest_softapplication_user contests = Contest.find(:id) @users = [] - for contest in contests - for project in contest.softapplications + # Modified by alan + # for contest in contests + contests.each do |contest| + + contest.projects.each do |softapplications| + # for project in contest.softapplications @users += softapplication.users end end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 9fcebe640..dfacff864 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -44,7 +44,7 @@ module ProjectsHelper content = ''.html_safe case state when 0 - + content << content_tag('li', link_to(l(:label_sort_by_active), projects_path(:project_sort_type => '1', :project_type => project_type))) content << content_tag('li', link_to(l(:label_sort_by_influence), projects_path(:project_sort_type => '2', :project_type => project_type))) content << content_tag('li', link_to(l(:label_sort_by_time), projects_path(:project_sort_type => '0', :project_type => project_type), :class=>"selected"), :class=>"selected") @@ -70,19 +70,19 @@ module ProjectsHelper content << content_tag('li', link_to(l(:label_sort_by_active), course_path(:project_sort_type => '1', :project_type => project_type, :school_id => school_id))) # content << content_tag('li', link_to(l(:label_sort_by_influence), course_path(:project_sort_type => '2', :project_type => project_type))) content << content_tag('li', link_to(l(:label_sort_by_activity), course_path(:project_sort_type => '3', :project_type => project_type, :school_id => school_id))) - + when 1 content << content_tag('li', link_to(l(:label_sort_by_time), course_path(:project_sort_type => '0', :project_type => project_type, :school_id => school_id))) content << content_tag('li', link_to(l(:label_sort_by_active), course_path(:project_sort_type => '1', :project_type => project_type, :school_id => school_id), :class=>"selected"), :class=>"selected") # content << content_tag('li', link_to(l(:label_sort_by_influence), course_path(:project_sort_type => '2', :project_type => project_type))) content << content_tag('li', link_to(l(:label_sort_by_activity), course_path(:project_sort_type => '3', :project_type => project_type, :school_id => school_id))) - + when 2 content << content_tag('li', link_to(l(:label_sort_by_time), course_path(:project_sort_type => '0', :project_type => project_type, :school_id => school_id))) content << content_tag('li', link_to(l(:label_sort_by_active), course_path(:project_sort_type => '1', :project_type => project_type, :school_id => school_id))) # content << content_tag('li', link_to(l(:label_sort_by_influence), course_path(:project_sort_type => '2', :project_type => project_type), :class=>"selected"), :class=>"selected") content << content_tag('li', link_to(l(:label_sort_by_activity), course_path(:project_sort_type => '3', :project_type => project_type, :school_id => school_id))) - + #gcm when 3 content << content_tag('li', link_to(l(:label_sort_by_time), course_path(:project_sort_type => '0', :project_type => project_type, :school_id => school_id))) @@ -101,7 +101,7 @@ module ProjectsHelper content = ''.html_safe case state when 0 - + content << content_tag('li', link_to(l(:label_sort_by_active), projects_path(:project_sort_type => '1', :project_type => project_type))) content << content_tag('li', link_to(l(:label_sort_by_influence), projects_path(:project_sort_type => '2', :project_type => project_type))) content << content_tag('li', link_to(l(:label_sort_by_time), projects_path(:project_sort_type => '0', :project_type => project_type), :class=>"selected"), :class=>"selected") @@ -142,7 +142,7 @@ module ProjectsHelper # end - #Added by young + # Added by young def course_settings_tabs tabs = [{:name => 'info', :action => :edit_project, :partial => 'projects/edit', :label => :label_information_plural, :course=>'1'}, #{:name => 'boards', :action => :manage_boards, :partial => 'projects/settings/boards', :label => :label_board_plural, :project_type => 1}, @@ -151,7 +151,7 @@ module ProjectsHelper ] tabs.select {|tab| User.current.allowed_to?(tab[:action], @project)} end - #Ended by young + # Ended by young @@ -173,14 +173,42 @@ module ProjectsHelper # Renders the projects index def render_project_hierarchy(projects) render_project_nested_lists(projects) do |project| - if (project.try(:project_type) == Project::ProjectType_course ) - s = project.is_public == 1 ? "".html_safe : "#{l(:label_private)}".html_safe - s += link_to_project(project, {}, :class => "#{project.css_classes} #{User.current.member_of?(project) ? 'my-project' : nil}").html_safe - else - s = project.is_public ? "".html_safe : "#{l(:label_private)}".html_safe - s += link_to_project(project, {}, :class => "#{project.css_classes} #{User.current.member_of?(project) ? 'my-project' : nil}") - end + #Modified by young + if project.try(:project_type) == Project::ProjectType_course + + # modified by longjun + # never use unless and else + # unless project.is_public == 1 + + if project.is_public != 1 + s = "#{l(:lable_private)}".html_safe + else + s = "".html_safe + end + # end longjun + + # modified by Longjun + s += link_to_project(project, {}, + :class => "#{project.css_classes} #{User.current.member_of?(project) ? 'my-project' : nil}").html_safe + # end longjun + else + # modified by longjun + # unless project.is_public + + if !project.is_public + # end longjun + s = "#{l(:lable_private)}".html_safe + else + s = "".html_safe + end + # modified by longjun + s += link_to_project(project, {}, + :class => "#{project.css_classes} #{User.current.member_of?(project) ? 'my-project' : nil}") + # end longjun + end + #Ended by young if project.description.present? + #Delete by nie. # s << content_tag('td', textilizable(project.short_description, :project => project), :class => 'wiki description') end s @@ -243,9 +271,14 @@ module ProjectsHelper def is_manager?(user_id,project_id) @result = false @user_id = ProjectInfo.find_by_project_id(project_id) - if @user_id == user.id - @result = true - end + + # modified by longjun + # if @user_id == user.id + # @result = true + # end + + @result = true if @user_id = user.id + # end longjun return @result end @@ -330,9 +363,9 @@ module ProjectsHelper return true if (project.nil? && project.course_extra.nil?) courses_year = project.course_extra.time current_year = Time.now.year - if(courses_year >= current_year) + if courses_year >= current_year return false - elsif( (courses_year < current_year) && (Time.now.month < 3) ) + elsif (courses_year < current_year) && (Time.now.month < 3) return false else return true diff --git a/app/models/contest.rb b/app/models/contest.rb index f1503f593..b2c11ceac 100644 --- a/app/models/contest.rb +++ b/app/models/contest.rb @@ -72,11 +72,14 @@ class Contest < ActiveRecord::Base end end - def self.creat_contests(budget, deadline, name, description=nil) - self.create(:author_id => User.current.id, :budget => budget, - :deadline => deadline, :name => name, :description => description, :commit => 0) - end - + # modified by longjun + # 这个函数没有用到 + # def self.creat_contests(budget, deadline, name, description=nil) + # self.create(:author_id => User.current.id, :budget => budget, + # :deadline => deadline, :name => name, :description => description, :commit => 0) + # end + # end longjun + def update_contests(budget, deadline, name, description=nil) if(User.current.id == self.author_id) self.name = name diff --git a/app/models/contesting_project.rb b/app/models/contesting_project.rb index cb2a7fe39..641990b8a 100644 --- a/app/models/contesting_project.rb +++ b/app/models/contesting_project.rb @@ -14,7 +14,7 @@ class ContestingProject < ActiveRecord::Base validate :validate_project validates_uniqueness_of :contest_id, :scope => :project_id - def self.cerate_contesting(contest_id, project_id, description = nil) + def self.create_contesting(contest_id, project_id, description = nil) self.create(:user_id => User.current.id, :contest_id => contest_id, :project_id => project_id, :description => description) end diff --git a/app/models/enabled_module.rb b/app/models/enabled_module.rb index 94539ec00..fe668e02c 100644 --- a/app/models/enabled_module.rb +++ b/app/models/enabled_module.rb @@ -22,7 +22,6 @@ class EnabledModule < ActiveRecord::Base validates_uniqueness_of :name, :scope => :project_id after_create :module_enabled - private # after_create callback used to do things when a module is enabled @@ -35,4 +34,6 @@ class EnabledModule < ActiveRecord::Base end end end + + end diff --git a/app/models/project.rb b/app/models/project.rb index dfb6ccd2d..ddb92a587 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1,1153 +1,1153 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 Jean-Philippe Lang -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -class Project < ActiveRecord::Base - include Redmine::SafeAttributes - ProjectType_project = 0 - ProjectType_course = 1 - - # Project statuses - STATUS_ACTIVE = 1 - STATUS_CLOSED = 5 - STATUS_ARCHIVED = 9 - - # Maximum length for project identifiers - IDENTIFIER_MAX_LENGTH = 100 - - # Specific overidden Activities - - belongs_to :homework_attach - has_many :time_entry_activities - has_many :members, :include => [:principal, :roles], :conditions => "#{Principal.table_name}.type='User' AND #{Principal.table_name}.status=#{Principal::STATUS_ACTIVE}" - has_many :memberships, :class_name => 'Member' - has_many :member_principals, :class_name => 'Member', - :include => :principal, - :conditions => "#{Principal.table_name}.type='Group' OR (#{Principal.table_name}.type='User' AND #{Principal.table_name}.status=#{Principal::STATUS_ACTIVE})" - has_many :users, :through => :members - has_many :principals, :through => :member_principals, :source => :principal - has_many :enabled_modules, :dependent => :delete_all - has_and_belongs_to_many :trackers, :order => "#{Tracker.table_name}.position" - has_many :issues, :dependent => :destroy, :include => [:status, :tracker] - has_many :issue_changes, :through => :issues, :source => :journals - has_many :versions, :dependent => :destroy, :order => "#{Version.table_name}.effective_date DESC, #{Version.table_name}.name DESC" - has_many :time_entries, :dependent => :delete_all - has_many :queries, :class_name => 'IssueQuery', :dependent => :delete_all - has_many :documents, :dependent => :destroy - has_many :news, :dependent => :destroy, :include => :author - has_many :issue_categories, :dependent => :delete_all, :order => "#{IssueCategory.table_name}.name" - has_many :boards, :dependent => :destroy, :order => "position ASC" - has_one :repository, :conditions => ["is_default = ?", true] - has_many :repositories, :dependent => :destroy - has_many :changesets, :through => :repository - #added by xianbo for delete biding_project - has_many :biding_projects, :dependent => :destroy - has_many :contesting_projects, :dependent => :destroy - has_many :softapplications, :through => :projecting_softapplications - #ended by xianbo - # added by fq - has_many :journals_for_messages, :as => :jour, :dependent => :destroy - #has_many :homework_for_courses, :dependent => :destroy - #has_many :homeworks, :through => :homework_for_courses, :source => :bid, :dependent => :destroy - has_many :shares, :dependent => :destroy - # has_many :students_for_courses, :dependent => :destroy - has_many :student, :through => :students_for_courses, :source => :user - has_one :course_extra, :class_name => 'Course', :foreign_key => :extra,:primary_key => :identifier, :dependent => :destroy - has_many :applied_projects - - - # end - #ADDED BY NIE - has_many :project_infos, :dependent => :destroy - has_one :project_status, :class_name => "ProjectStatus", :dependent => :destroy - has_many :user_grades, :class_name => "UserGrade", :dependent => :destroy - #end - - has_one :wiki, :dependent => :destroy - ##added by xianbo - has_one :course, :order => "#{Version.table_name}.effective_date DESC, #{Version.table_name}.name DESC" - accepts_nested_attributes_for :course - ##end - # Custom field for the project issues - has_and_belongs_to_many :issue_custom_fields, - :class_name => 'IssueCustomField', - :order => "#{CustomField.table_name}.position", - :join_table => "#{table_name_prefix}custom_fields_projects#{table_name_suffix}", - :association_foreign_key => 'custom_field_id' - - has_many :tags, :through => :project_tags, :class_name => 'Tag' - has_many :project_tags, :class_name => 'ProjectTags' - - # has_many :journals - - acts_as_nested_set :order => 'name', :dependent => :destroy - acts_as_attachable :view_permission => :view_files, - :delete_permission => :manage_files - - acts_as_customizable - acts_as_searchable :columns => ['name', 'identifier', 'description'], :project_key => 'id', :permission => nil - acts_as_event :title => Proc.new {|o| "#{l(:label_project)}: #{o.name}"}, - :url => Proc.new {|o| {:controller => 'projects', :action => 'show', :id => o}}, - :author => nil - ############################added by william - acts_as_taggable - scope :by_join_date, order("created_on DESC") - ###################added by liuping 关注 - acts_as_watchable - - attr_protected :status - - validates_presence_of :name, :identifier - validates_uniqueness_of :identifier - validates_uniqueness_of :name - validates_associated :repository, :wiki - # validates_length_of :description, :maximum => 255 - validates_length_of :name, :maximum => 255 - validates_length_of :homepage, :maximum => 255 - validates_length_of :identifier, :in => 1..IDENTIFIER_MAX_LENGTH - # donwcase letters, digits, dashes but not digits only - validates_format_of :identifier, :with => /\A(?!\d+$)[a-z0-9\-_]*\z/, :if => Proc.new { |p| p.identifier_changed? } - # reserved words - validates_exclusion_of :identifier, :in => %w( new ) - - #此代码功能:为原redmine中项目的树形结构按名称首字母排序,本系统项目非树形结构,且项目排序方式无按首字母排序,另该代码执行会使空数据库时创建项目时出异常故注释掉 - #after_save :update_position_under_parent, :if => Proc.new {|project| project.name_changed?} - after_save :update_inherited_members, :if => Proc.new {|project| project.inherit_members_changed?} - # 创建project之后默认创建一个board,之后的board去掉了board的概念 - after_create :create_board_sync - before_destroy :delete_all_members - def remove_references_before_destroy - return if self.id.nil? - Watcher.delete_all ['watchable_id = ?', id] - end - scope :has_module, lambda {|mod| - where("#{Project.table_name}.id IN (SELECT em.project_id FROM #{EnabledModule.table_name} em WHERE em.name=?)", mod.to_s) - } - scope :active, lambda { where(:status => STATUS_ACTIVE) } - scope :status, lambda {|arg| where(arg.blank? ? nil : {:status => arg.to_i}) } - scope :all_public, lambda { where(:is_public => true) } - scope :visible, lambda {|*args| where(Project.visible_condition(args.shift || User.current, *args)) } - scope :allowed_to, lambda {|*args| - user = User.current - permission = nil - if args.first.is_a?(Symbol) - permission = args.shift - else - user = args.shift - permission = args.shift - end - where(Project.allowed_to_condition(user, permission, *args)) - } - scope :like, lambda {|arg| - if arg.blank? - where(nil) - else - pattern = "%#{arg.to_s.strip.downcase}%" - where("LOWER(name) LIKE :p ", :p => pattern) - end - } - scope :project_entities, -> { where(project_type: ProjectType_project) } - scope :course_entities, -> { where(project_type: ProjectType_course) } - - def new_course - self.where('project_type = ?', 1) - end - - # 获取项目的资源类型列表 - def attachmenttypes - @attachmenttypes = Attachmentstype.find(:all, :conditions => ["#{Attachmentstype.table_name}.typeId= ?",self.attachmenttype ]) - end - - # 获取资源后缀名列表 - def contenttypes - attachmenttypes - if @attachmenttypes.length >0 - @attachmenttypes.last().suffixArr - end - end - - #自定义验证 - def validation - if !class_period.match([0-9]) - errors.add_to_base("class period can only digital") - end - end - -# 项目留言 added by fq - def self.add_jour(user, notes) - project = Project.find('trustie') - # project.journals_for_messages << JournalsForMessage.new(:user_id => user.id, :notes => notes, :reply_id => 0) - pjfm = project.journals_for_messages.build(:user_id => user.id, :notes => notes, :reply_id => 0) - pjfm.save - pjfm - end - - def self.add_new_jour(user, notes, id, options={}) - project = Project.find(id) - if options.count == 0 - pjfm = project.journals_for_messages.build(:user_id => user.id, :notes => notes, :reply_id => 0) - else - pjfm = project.journals_for_messages.build(options) - end - pjfm.save - pjfm - end -# end - - # 管理员的邮件列表 - def manager_recipients - notified = project.project_infos.collect(&:user) - notified.collect(&:mail) - end - - def initialize(attributes=nil, *args) - super - - initialized = (attributes || {}).stringify_keys - if !initialized.key?('identifier') && Setting.sequential_project_identifiers? - self.identifier = Project.next_identifier - end - if !initialized.key?('is_public') - self.is_public = Setting.default_projects_public? - end - if !initialized.key?('enabled_module_names') - self.enabled_module_names = Setting.default_projects_modules - end - if !initialized.key?('trackers') && !initialized.key?('tracker_ids') - default = Setting.default_projects_tracker_ids - if default.is_a?(Array) - self.trackers = Tracker.where(:id => default.map(&:to_i)).sorted.all - else - self.trackers = Tracker.sorted.all - end - end - end - - def identifier=(identifier) - super unless identifier_frozen? - end - - def identifier_frozen? - errors[:identifier].blank? && !(new_record? || identifier.blank?) - end - - # returns latest created projects - # non public projects will be returned only if user is a member of those - def self.latest(user=nil, count=5) - visible(user).limit(count).order("created_on DESC").all - end - - # Returns true if the project is visible to +user+ or to the current user. - def visible?(user=User.current) - user.allowed_to?(:view_project, self) - end - - # Returns a SQL conditions string used to find all projects visible by the specified user. - # - # Examples: - # Project.visible_condition(admin) => "projects.status = 1" - # Project.visible_condition(normal_user) => "((projects.status = 1) AND (projects.is_public = 1 OR projects.id IN (1,3,4)))" - # Project.visible_condition(anonymous) => "((projects.status = 1) AND (projects.is_public = 1))" - def self.visible_condition(user, options={}) - allowed_to_condition(user, :view_project, options) - end - - # Returns a SQL conditions string used to find all projects for which +user+ has the given +permission+ - # - # Valid options: - # * :project => limit the condition to project - # * :with_subprojects => limit the condition to project and its subprojects - # * :member => limit the condition to the user projects - def self.allowed_to_condition(user, permission, options={}) - perm = Redmine::AccessControl.permission(permission) - base_statement = (perm && perm.read? ? "#{Project.table_name}.status <> #{Project::STATUS_ARCHIVED}" : "#{Project.table_name}.status = #{Project::STATUS_ACTIVE}") - if perm && perm.project_module - # If the permission belongs to a project module, make sure the module is enabled - base_statement << " AND #{Project.table_name}.id IN (SELECT em.project_id FROM #{EnabledModule.table_name} em WHERE em.name='#{perm.project_module}')" - end - if options[:project] - project_statement = "#{Project.table_name}.id = #{options[:project].id}" - project_statement << " OR (#{Project.table_name}.lft > #{options[:project].lft} AND #{Project.table_name}.rgt < #{options[:project].rgt})" if options[:with_subprojects] - base_statement = "(#{project_statement}) AND (#{base_statement})" - end - - if user.admin? - base_statement - else - statement_by_role = {} - unless options[:member] - role = user.logged? ? Role.non_member : Role.anonymous - if role.allowed_to?(permission) - statement_by_role[role] = "#{Project.table_name}.is_public = #{connection.quoted_true}" - end - end - if user.logged? - user.projects_by_role.each do |role, projects| - if role.allowed_to?(permission) && projects.any? - statement_by_role[role] = "#{Project.table_name}.id IN (#{projects.collect(&:id).join(',')})" - end - end - end - if statement_by_role.empty? - "1=0" - else - if block_given? - statement_by_role.each do |role, statement| - if s = yield(role, user) - statement_by_role[role] = "(#{statement} AND (#{s}))" - end - end - end - "((#{base_statement}) AND (#{statement_by_role.values.join(' OR ')}))" - end - end - end - - # Returns the Systemwide and project specific activities - def activities(include_inactive=false) - if include_inactive - return all_activities - else - return active_activities - end - end - - # Will create a new Project specific Activity or update an existing one - # - # This will raise a ActiveRecord::Rollback if the TimeEntryActivity - # does not successfully save. - def update_or_create_time_entry_activity(id, activity_hash) - if activity_hash.respond_to?(:has_key?) && activity_hash.has_key?('parent_id') - self.create_time_entry_activity_if_needed(activity_hash) - else - activity = project.time_entry_activities.find_by_id(id.to_i) - activity.update_attributes(activity_hash) if activity - end - end - - # Create a new TimeEntryActivity if it overrides a system TimeEntryActivity - # - # This will raise a ActiveRecord::Rollback if the TimeEntryActivity - # does not successfully save. - def create_time_entry_activity_if_needed(activity) - if activity['parent_id'] - - parent_activity = TimeEntryActivity.find(activity['parent_id']) - activity['name'] = parent_activity.name - activity['position'] = parent_activity.position - - if Enumeration.overridding_change?(activity, parent_activity) - project_activity = self.time_entry_activities.create(activity) - - if project_activity.new_record? - raise ActiveRecord::Rollback, "Overridding TimeEntryActivity was not successfully saved" - else - self.time_entries.update_all("activity_id = #{project_activity.id}", ["activity_id = ?", parent_activity.id]) - end - end - end - end - - # Returns a :conditions SQL string that can be used to find the issues associated with this project. - # - # Examples: - # project.project_condition(true) => "(projects.id = 1 OR (projects.lft > 1 AND projects.rgt < 10))" - # project.project_condition(false) => "projects.id = 1" - def project_condition(with_subprojects) - cond = "#{Project.table_name}.id = #{id}" - cond = "(#{cond} OR (#{Project.table_name}.lft > #{lft} AND #{Project.table_name}.rgt < #{rgt}))" if with_subprojects - cond - end - - def self.find(*args) - if args.first && args.first.is_a?(String) && !args.first.match(/^\d*$/) - project = find_by_identifier(*args) - raise ActiveRecord::RecordNotFound, "Couldn't find Project with identifier=#{args.first}" if project.nil? - project - else - super - end - end - - def self.find_by_param(*args) - self.find(*args) - end - - alias :base_reload :reload - def reload(*args) - @shared_versions = nil - @rolled_up_versions = nil - @rolled_up_trackers = nil - @all_issue_custom_fields = nil - @all_time_entry_custom_fields = nil - @to_param = nil - @allowed_parents = nil - @allowed_permissions = nil - @actions_allowed = nil - @start_date = nil - @due_date = nil - base_reload(*args) - end - - # def to_param - # # id is used for projects with a numeric identifier (compatibility) - # @to_param ||= (identifier.to_s =~ %r{^\d*$} ? id.to_s : identifier) - # end - - def active? - self.status == STATUS_ACTIVE - end - - def archived? - self.status == STATUS_ARCHIVED - end - - # Archives the project and its descendants - def archive - # Check that there is no issue of a non descendant project that is assigned - # to one of the project or descendant versions - v_ids = self_and_descendants.collect {|p| p.version_ids}.flatten - if v_ids.any? && - Issue. - includes(:project). - where("#{Project.table_name}.lft < ? OR #{Project.table_name}.rgt > ?", lft, rgt). - where("#{Issue.table_name}.fixed_version_id IN (?)", v_ids). - exists? - return false - end - Project.transaction do - archive! - end - true - end - - # Unarchives the project - # All its ancestors must be active - def unarchive - return false if ancestors.detect {|a| !a.active?} - update_attribute :status, STATUS_ACTIVE - end - - def close - self_and_descendants.status(STATUS_ACTIVE).update_all :status => STATUS_CLOSED - end - - def reopen - self_and_descendants.status(STATUS_CLOSED).update_all :status => STATUS_ACTIVE - end - - # Returns an array of projects the project can be moved to - # by the current user - def allowed_parents - return @allowed_parents if @allowed_parents - @allowed_parents = Project.where(Project.allowed_to_condition(User.current, :add_subprojects)).all - @allowed_parents = @allowed_parents - self_and_descendants - if User.current.allowed_to?(:add_project, nil, :global => true) || (!new_record? && parent.nil?) - @allowed_parents << nil - end - unless parent.nil? || @allowed_parents.empty? || @allowed_parents.include?(parent) - @allowed_parents << parent - end - @allowed_parents - end - - # Sets the parent of the project with authorization check - def set_allowed_parent!(p) - unless p.nil? || p.is_a?(Project) - if p.to_s.blank? - p = nil - else - p = Project.find_by_id(p) - return false unless p - end - end - if p.nil? - if !new_record? && allowed_parents.empty? - return false - end - elsif !allowed_parents.include?(p) - return false - end - set_parent!(p) - end - - # Sets the parent of the project - # Argument can be either a Project, a String, a Fixnum or nil - def set_parent!(p) - unless p.nil? || p.is_a?(Project) - if p.to_s.blank? - p = nil - else - p = Project.find_by_id(p) - return false unless p - end - end - if p == parent && !p.nil? - # Nothing to do - true - elsif p.nil? || (p.active? && move_possible?(p)) - set_or_update_position_under(p) - Issue.update_versions_from_hierarchy_change(self) - true - else - # Can not move to the given target - false - end - end - - # Recalculates all lft and rgt values based on project names - # Unlike Project.rebuild!, these values are recalculated even if the tree "looks" valid - # Used in BuildProjectsTree migration - def self.rebuild_tree! - transaction do - update_all "lft = NULL, rgt = NULL" - rebuild!(false) - end - end - - # Returns an array of the trackers used by the project and its active sub projects - def rolled_up_trackers - @rolled_up_trackers ||= - Tracker. - joins(:projects). - joins("JOIN #{EnabledModule.table_name} ON #{EnabledModule.table_name}.project_id = #{Project.table_name}.id AND #{EnabledModule.table_name}.name = 'issue_tracking'"). - select("DISTINCT #{Tracker.table_name}.*"). - where("#{Project.table_name}.lft >= ? AND #{Project.table_name}.rgt <= ? AND #{Project.table_name}.status <> #{STATUS_ARCHIVED}", lft, rgt). - sorted. - all - end - - # Closes open and locked project versions that are completed - def close_completed_versions - Version.transaction do - versions.where(:status => %w(open locked)).all.each do |version| - if version.completed? - version.update_attribute(:status, 'closed') - end - end - end - end - - # Returns a scope of the Versions on subprojects - def rolled_up_versions - @rolled_up_versions ||= - Version.scoped(:include => :project, - :conditions => ["#{Project.table_name}.lft >= ? AND #{Project.table_name}.rgt <= ? AND #{Project.table_name}.status <> #{STATUS_ARCHIVED}", lft, rgt]) - end - - # Returns a scope of the Versions used by the project - def shared_versions - if new_record? - Version.scoped(:include => :project, - :conditions => "#{Project.table_name}.status <> #{Project::STATUS_ARCHIVED} AND #{Version.table_name}.sharing = 'system'") - else - @shared_versions ||= begin - r = root? ? self : root - Version.scoped(:include => :project, - :conditions => "#{Project.table_name}.id = #{id}" + - " OR (#{Project.table_name}.status <> #{Project::STATUS_ARCHIVED} AND (" + - " #{Version.table_name}.sharing = 'system'" + - " OR (#{Project.table_name}.lft >= #{r.lft} AND #{Project.table_name}.rgt <= #{r.rgt} AND #{Version.table_name}.sharing = 'tree')" + - " OR (#{Project.table_name}.lft < #{lft} AND #{Project.table_name}.rgt > #{rgt} AND #{Version.table_name}.sharing IN ('hierarchy', 'descendants'))" + - " OR (#{Project.table_name}.lft > #{lft} AND #{Project.table_name}.rgt < #{rgt} AND #{Version.table_name}.sharing = 'hierarchy')" + - "))") - end - end - end - - # Returns a hash of project users grouped by role - def users_by_role - members.includes(:user, :roles).all.inject({}) do |h, m| - m.roles.each do |r| - h[r] ||= [] - h[r] << m.user - end - h - end - end - - # Deletes all project's members - def delete_all_members - me, mr = Member.table_name, MemberRole.table_name - connection.delete("DELETE FROM #{mr} WHERE #{mr}.member_id IN (SELECT #{me}.id FROM #{me} WHERE #{me}.project_id = #{id})") - Member.delete_all(['project_id = ?', id]) - end - - # Users/groups issues can be assigned to - def assignable_users - assignable = Setting.issue_group_assignment? ? member_principals : members - assignable.select {|m| m.roles.detect {|role| role.assignable?}}.collect {|m| m.principal}.sort - end - - # Returns the mail adresses of users that should be always notified on project events - def recipients - notified_users.collect {|user| user.mail} - end - - # Returns the users that should be notified on project events - def notified_users - # TODO: User part should be extracted to User#notify_about? - members.select {|m| m.principal.present? && (m.mail_notification? || m.principal.mail_notification == 'all')}.collect {|m| m.principal} - end - - # Returns an array of all custom fields enabled for project issues - # (explictly associated custom fields and custom fields enabled for all projects) - def all_issue_custom_fields - @all_issue_custom_fields ||= (IssueCustomField.for_all + issue_custom_fields).uniq.sort - end - - # Returns an array of all custom fields enabled for project time entries - # (explictly associated custom fields and custom fields enabled for all projects) - def all_time_entry_custom_fields - @all_time_entry_custom_fields ||= (TimeEntryCustomField.for_all + time_entry_custom_fields).uniq.sort - end - - def project - self - end - - def <=>(project) - name.downcase <=> project.name.downcase - end - - def to_s - name - end - - # Returns a short description of the projects (first lines) - def short_description(length = 255) - #description.gsub(/^(.{#{length}}[^\n\r]*).*$/m, '\1...').strip if description - description.gsub(/<\/?.*?>/,"").html_safe if description - end - - def css_classes - s = 'project' - s << ' root' if root? - s << ' child' if child? - s << (leaf? ? ' leaf' : ' parent') - unless active? - if archived? - s << ' archived' - else - s << ' closed' - end - end - s - end - - # The earliest start date of a project, based on it's issues and versions - def start_date - @start_date ||= [ - issues.minimum('start_date'), - shared_versions.minimum('effective_date'), - Issue.fixed_version(shared_versions).minimum('start_date') - ].compact.min - end - - # The latest due date of an issue or version - def due_date - @due_date ||= [ - issues.maximum('due_date'), - shared_versions.maximum('effective_date'), - Issue.fixed_version(shared_versions).maximum('due_date') - ].compact.max - end - - def overdue? - active? && !due_date.nil? && (due_date < Date.today) - end - - # Returns the percent completed for this project, based on the - # progress on it's versions. - def completed_percent(options={:include_subprojects => false}) - if options.delete(:include_subprojects) - total = self_and_descendants.collect(&:completed_percent).sum - - total / self_and_descendants.count - else - if versions.count > 0 - total = versions.collect(&:completed_percent).sum - - total / versions.count - else - 100 - end - end - end - - # Return true if this project allows to do the specified action. - # action can be: - # * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit') - # * a permission Symbol (eg. :edit_project) - def allows_to?(action) - if archived? - # No action allowed on archived projects - return false - end - unless active? || Redmine::AccessControl.read_action?(action) - # No write action allowed on closed projects - return false - end - # No action allowed on disabled modules - if action.is_a? Hash - allowed_actions.include? "#{action[:controller]}/#{action[:action]}" - else - allowed_permissions.include? action - end - end - - def module_enabled?(module_name) - module_name = module_name.to_s - enabled_modules.detect {|m| m.name == module_name} - end - - def enabled_module_names=(module_names) - if module_names && module_names.is_a?(Array) - module_names = module_names.collect(&:to_s).reject(&:blank?) - self.enabled_modules = module_names.collect {|name| enabled_modules.detect {|mod| mod.name == name} || EnabledModule.new(:name => name)} - else - enabled_modules.clear - end - end - - # Returns an array of the enabled modules names - def enabled_module_names - enabled_modules.collect(&:name) - end - - # Enable a specific module - # - # Examples: - # project.enable_module!(:issue_tracking) - # project.enable_module!("issue_tracking") - def enable_module!(name) - enabled_modules << EnabledModule.new(:name => name.to_s) unless module_enabled?(name) - end - - # Disable a module if it exists - # - # Examples: - # project.disable_module!(:issue_tracking) - # project.disable_module!("issue_tracking") - # project.disable_module!(project.enabled_modules.first) - def disable_module!(target) - target = enabled_modules.detect{|mod| target.to_s == mod.name} unless enabled_modules.include?(target) - target.destroy unless target.blank? - end - - safe_attributes 'name', - 'description', - 'homepage', - 'is_public', - 'hidden_repo', - 'identifier', - 'custom_field_values', - 'custom_fields', - 'tracker_ids', - 'issue_custom_field_ids', - 'project_type', - 'dts_test', - 'attachmenttype' - - - - safe_attributes 'enabled_module_names', - :if => lambda {|project, user| project.new_record? || user.allowed_to?(:select_project_modules, project) } - - safe_attributes 'inherit_members', - :if => lambda {|project, user| project.parent.nil? || project.parent.visible?(user)} - - # Returns an array of projects that are in this project's hierarchy - # - # Example: parents, children, siblings - def hierarchy - parents = project.self_and_ancestors || [] - descendants = project.descendants || [] - project_hierarchy = parents | descendants # Set union - end - - # Returns an auto-generated project identifier based on the last identifier used - def self.next_identifier - p = Project.order('created_on DESC').first - p.nil? ? nil : p.identifier.to_s.succ - end - - # Copies and saves the Project instance based on the +project+. - # Duplicates the source project's: - # * Wiki - # * Versions - # * Categories - # * Issues - # * Members - # * Queries - # - # Accepts an +options+ argument to specify what to copy - # - # Examples: - # project.copy(1) # => copies everything - # project.copy(1, :only => 'members') # => copies members only - # project.copy(1, :only => ['members', 'versions']) # => copies members and versions - def copy(project, options={}) - project = project.is_a?(Project) ? project : Project.find(project) - - to_be_copied = %w(wiki versions issue_categories issues members queries boards) - to_be_copied = to_be_copied & options[:only].to_a unless options[:only].nil? - - Project.transaction do - if save - reload - to_be_copied.each do |name| - send "copy_#{name}", project - end - Redmine::Hook.call_hook(:model_project_copy_before_save, :source_project => project, :destination_project => self) - save - end - end - end - - # Returns a new unsaved Project instance with attributes copied from +project+ - def self.copy_from(project) - project = project.is_a?(Project) ? project : Project.find(project) - # clear unique attributes - attributes = project.attributes.dup.except('id', 'name', 'identifier', 'status', 'parent_id', 'lft', 'rgt') - copy = Project.new(attributes) - copy.enabled_modules = project.enabled_modules - copy.trackers = project.trackers - copy.custom_values = project.custom_values.collect {|v| v.clone} - copy.issue_custom_fields = project.issue_custom_fields - copy - end - - # Yields the given block for each project with its level in the tree - def self.project_tree(projects, &block) - ancestors = [] - projects.sort_by(&:lft).each do |project| - while (ancestors.any? && !project.is_descendant_of?(ancestors.last)) - ancestors.pop - end - yield project, ancestors.size - ancestors << project - end - end - - private - - def after_parent_changed(parent_was) - remove_inherited_member_roles - add_inherited_member_roles - end - - def update_inherited_members - if parent - if inherit_members? && !inherit_members_was - remove_inherited_member_roles - add_inherited_member_roles - elsif !inherit_members? && inherit_members_was - remove_inherited_member_roles - end - end - end - - def remove_inherited_member_roles - member_roles = memberships.map(&:member_roles).flatten - member_role_ids = member_roles.map(&:id) - member_roles.each do |member_role| - if member_role.inherited_from && !member_role_ids.include?(member_role.inherited_from) - member_role.destroy - end - end - end - - def add_inherited_member_roles - if inherit_members? && parent - parent.memberships.each do |parent_member| - member = Member.find_or_new(self.id, parent_member.user_id) - parent_member.member_roles.each do |parent_member_role| - member.member_roles << MemberRole.new(:role => parent_member_role.role, :inherited_from => parent_member_role.id) - end - member.save! - end - end - end - - # Copies wiki from +project+ - def copy_wiki(project) - # Check that the source project has a wiki first - unless project.wiki.nil? - wiki = self.wiki || Wiki.new - wiki.attributes = project.wiki.attributes.dup.except("id", "project_id") - wiki_pages_map = {} - project.wiki.pages.each do |page| - # Skip pages without content - next if page.content.nil? - new_wiki_content = WikiContent.new(page.content.attributes.dup.except("id", "page_id", "updated_on")) - new_wiki_page = WikiPage.new(page.attributes.dup.except("id", "wiki_id", "created_on", "parent_id")) - new_wiki_page.content = new_wiki_content - wiki.pages << new_wiki_page - wiki_pages_map[page.id] = new_wiki_page - end - - self.wiki = wiki - wiki.save - # Reproduce page hierarchy - project.wiki.pages.each do |page| - if page.parent_id && wiki_pages_map[page.id] - wiki_pages_map[page.id].parent = wiki_pages_map[page.parent_id] - wiki_pages_map[page.id].save - end - end - end - end - - # Copies versions from +project+ - def copy_versions(project) - project.versions.each do |version| - new_version = Version.new - new_version.attributes = version.attributes.dup.except("id", "project_id", "created_on", "updated_on") - self.versions << new_version - end - end - - # Copies issue categories from +project+ - def copy_issue_categories(project) - project.issue_categories.each do |issue_category| - new_issue_category = IssueCategory.new - new_issue_category.attributes = issue_category.attributes.dup.except("id", "project_id") - self.issue_categories << new_issue_category - end - end - - # Copies issues from +project+ - def copy_issues(project) - # Stores the source issue id as a key and the copied issues as the - # value. Used to map the two togeather for issue relations. - issues_map = {} - - # Store status and reopen locked/closed versions - version_statuses = versions.reject(&:open?).map {|version| [version, version.status]} - version_statuses.each do |version, status| - version.update_attribute :status, 'open' - end - - # Get issues sorted by root_id, lft so that parent issues - # get copied before their children - project.issues.reorder('root_id, lft').all.each do |issue| - new_issue = Issue.new - new_issue.copy_from(issue, :subtasks => false, :link => false) - new_issue.project = self - # Reassign fixed_versions by name, since names are unique per project - if issue.fixed_version && issue.fixed_version.project == project - new_issue.fixed_version = self.versions.detect {|v| v.name == issue.fixed_version.name} - end - # Reassign the category by name, since names are unique per project - if issue.category - new_issue.category = self.issue_categories.detect {|c| c.name == issue.category.name} - end - # Parent issue - if issue.parent_id - if copied_parent = issues_map[issue.parent_id] - new_issue.parent_issue_id = copied_parent.id - end - end - - self.issues << new_issue - if new_issue.new_record? - logger.info "Project#copy_issues: issue ##{issue.id} could not be copied: #{new_issue.errors.full_messages}" if logger && logger.info - else - issues_map[issue.id] = new_issue unless new_issue.new_record? - end - end - - # Restore locked/closed version statuses - version_statuses.each do |version, status| - version.update_attribute :status, status - end - - # Relations after in case issues related each other - project.issues.each do |issue| - new_issue = issues_map[issue.id] - unless new_issue - # Issue was not copied - next - end - - # Relations - issue.relations_from.each do |source_relation| - new_issue_relation = IssueRelation.new - new_issue_relation.attributes = source_relation.attributes.dup.except("id", "issue_from_id", "issue_to_id") - new_issue_relation.issue_to = issues_map[source_relation.issue_to_id] - if new_issue_relation.issue_to.nil? && Setting.cross_project_issue_relations? - new_issue_relation.issue_to = source_relation.issue_to - end - new_issue.relations_from << new_issue_relation - end - - issue.relations_to.each do |source_relation| - new_issue_relation = IssueRelation.new - new_issue_relation.attributes = source_relation.attributes.dup.except("id", "issue_from_id", "issue_to_id") - new_issue_relation.issue_from = issues_map[source_relation.issue_from_id] - if new_issue_relation.issue_from.nil? && Setting.cross_project_issue_relations? - new_issue_relation.issue_from = source_relation.issue_from - end - new_issue.relations_to << new_issue_relation - end - end - end - - # Copies members from +project+ - def copy_members(project) - # Copy users first, then groups to handle members with inherited and given roles - members_to_copy = [] - members_to_copy += project.memberships.select {|m| m.principal.is_a?(User)} - members_to_copy += project.memberships.select {|m| !m.principal.is_a?(User)} - - members_to_copy.each do |member| - new_member = Member.new - new_member.attributes = member.attributes.dup.except("id", "project_id", "created_on") - # only copy non inherited roles - # inherited roles will be added when copying the group membership - role_ids = member.member_roles.reject(&:inherited?).collect(&:role_id) - next if role_ids.empty? - new_member.role_ids = role_ids - new_member.project = self - self.members << new_member - end - end - - # Copies queries from +project+ - def copy_queries(project) - project.queries.each do |query| - new_query = IssueQuery.new - new_query.attributes = query.attributes.dup.except("id", "project_id", "sort_criteria") - new_query.sort_criteria = query.sort_criteria if query.sort_criteria - new_query.project = self - new_query.user_id = query.user_id - self.queries << new_query - end - end - - # Copies boards from +project+ - def copy_boards(project) - project.boards.each do |board| - new_board = Board.new - new_board.attributes = board.attributes.dup.except("id", "project_id", "topics_count", "messages_count", "last_message_id") - new_board.project = self - self.boards << new_board - end - end - - def allowed_permissions - @allowed_permissions ||= begin - module_names = enabled_modules.all(:select => :name).collect {|m| m.name} - Redmine::AccessControl.modules_permissions(module_names).collect {|p| p.name} - end - end - - def allowed_actions - @actions_allowed ||= allowed_permissions.inject([]) { |actions, permission| actions += Redmine::AccessControl.allowed_actions(permission) }.flatten - end - - # Returns all the active Systemwide and project specific activities - def active_activities - overridden_activity_ids = self.time_entry_activities.collect(&:parent_id) - - if overridden_activity_ids.empty? - return TimeEntryActivity.shared.active - else - return system_activities_and_project_overrides - end - end - - # Returns all the Systemwide and project specific activities - # (inactive and active) - def all_activities - overridden_activity_ids = self.time_entry_activities.collect(&:parent_id) - - if overridden_activity_ids.empty? - return TimeEntryActivity.shared - else - return system_activities_and_project_overrides(true) - end - end - - # Returns the systemwide active activities merged with the project specific overrides - def system_activities_and_project_overrides(include_inactive=false) - if include_inactive - return TimeEntryActivity.shared. - where("id NOT IN (?)", self.time_entry_activities.collect(&:parent_id)).all + - self.time_entry_activities - else - return TimeEntryActivity.shared.active. - where("id NOT IN (?)", self.time_entry_activities.collect(&:parent_id)).all + - self.time_entry_activities.active - end - end - - # Archives subprojects recursively - def archive! - children.each do |subproject| - subproject.send :archive! - end - update_attribute :status, STATUS_ARCHIVED - end - - def update_position_under_parent - set_or_update_position_under(parent) - end - - def course - @course - end - - # Inserts/moves the project so that target's children or root projects stay alphabetically sorted - def set_or_update_position_under(target_parent) - parent_was = parent - sibs = (target_parent.nil? ? self.class.roots : target_parent.children) - to_be_inserted_before = sibs.sort_by {|c| c.name.to_s.downcase}.detect {|c| c.name.to_s.downcase > name.to_s.downcase } - - if to_be_inserted_before - move_to_left_of(to_be_inserted_before) - elsif target_parent.nil? - if sibs.empty? - # move_to_root adds the project in first (ie. left) position - move_to_root - else - move_to_right_of(sibs.last) unless self == sibs.last - end - else - # move_to_child_of adds the project in last (ie.right) position - move_to_child_of(target_parent) - end - if parent_was != target_parent - after_parent_changed(parent_was) - end - end - - # 创建项目后在项目下同步创建一个讨论区 - def create_board_sync - @board = self.boards.build - self.name=" #{l(:label_borad_project) }" - @board.name = self.name - @board.description = self.name.to_s - if @board.save - logger.debug "[Project Model] ===> #{@board.to_json}" - else - logger.error "[Project Model] ===> Auto create board when Project saved, because #{@board.full_messages}" - end - end - - -end +# Redmine - project management software +# Copyright (C) 2006-2013 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class Project < ActiveRecord::Base + include Redmine::SafeAttributes + ProjectType_project = 0 + ProjectType_course = 1 + + # Project statuses + STATUS_ACTIVE = 1 + STATUS_CLOSED = 5 + STATUS_ARCHIVED = 9 + + # Maximum length for project identifiers + IDENTIFIER_MAX_LENGTH = 100 + + # Specific overidden Activities + + belongs_to :homework_attach + has_many :time_entry_activities + has_many :members, :include => [:principal, :roles], :conditions => "#{Principal.table_name}.type='User' AND #{Principal.table_name}.status=#{Principal::STATUS_ACTIVE}" + has_many :memberships, :class_name => 'Member' + has_many :member_principals, :class_name => 'Member', + :include => :principal, + :conditions => "#{Principal.table_name}.type='Group' OR (#{Principal.table_name}.type='User' AND #{Principal.table_name}.status=#{Principal::STATUS_ACTIVE})" + has_many :users, :through => :members + has_many :principals, :through => :member_principals, :source => :principal + has_many :enabled_modules, :dependent => :delete_all + has_and_belongs_to_many :trackers, :order => "#{Tracker.table_name}.position" + has_many :issues, :dependent => :destroy, :include => [:status, :tracker] + has_many :issue_changes, :through => :issues, :source => :journals + has_many :versions, :dependent => :destroy, :order => "#{Version.table_name}.effective_date DESC, #{Version.table_name}.name DESC" + has_many :time_entries, :dependent => :delete_all + has_many :queries, :class_name => 'IssueQuery', :dependent => :delete_all + has_many :documents, :dependent => :destroy + has_many :news, :dependent => :destroy, :include => :author + has_many :issue_categories, :dependent => :delete_all, :order => "#{IssueCategory.table_name}.name" + has_many :boards, :dependent => :destroy, :order => "position ASC" + has_one :repository, :conditions => ["is_default = ?", true] + has_many :repositories, :dependent => :destroy + has_many :changesets, :through => :repository + #added by xianbo for delete biding_project + has_many :biding_projects, :dependent => :destroy + has_many :contesting_projects, :dependent => :destroy + has_many :softapplications, :through => :projecting_softapplications + #ended by xianbo + # added by fq + has_many :journals_for_messages, :as => :jour, :dependent => :destroy + #has_many :homework_for_courses, :dependent => :destroy + #has_many :homeworks, :through => :homework_for_courses, :source => :bid, :dependent => :destroy + has_many :shares, :dependent => :destroy + # has_many :students_for_courses, :dependent => :destroy + has_many :student, :through => :students_for_courses, :source => :user + has_one :course_extra, :class_name => 'Course', :foreign_key => :extra,:primary_key => :identifier, :dependent => :destroy + has_many :applied_projects + + + # end + #ADDED BY NIE + has_many :project_infos, :dependent => :destroy + has_one :project_status, :class_name => "ProjectStatus", :dependent => :destroy + has_many :user_grades, :class_name => "UserGrade", :dependent => :destroy + #end + + has_one :wiki, :dependent => :destroy + ##added by xianbo + has_one :course, :order => "#{Version.table_name}.effective_date DESC, #{Version.table_name}.name DESC" + accepts_nested_attributes_for :course + ##end + # Custom field for the project issues + has_and_belongs_to_many :issue_custom_fields, + :class_name => 'IssueCustomField', + :order => "#{CustomField.table_name}.position", + :join_table => "#{table_name_prefix}custom_fields_projects#{table_name_suffix}", + :association_foreign_key => 'custom_field_id' + + has_many :tags, :through => :project_tags, :class_name => 'Tag' + has_many :project_tags, :class_name => 'ProjectTags' + + # has_many :journals + + acts_as_nested_set :order => 'name', :dependent => :destroy + acts_as_attachable :view_permission => :view_files, + :delete_permission => :manage_files + + acts_as_customizable + acts_as_searchable :columns => ['name', 'identifier', 'description'], :project_key => 'id', :permission => nil + acts_as_event :title => Proc.new {|o| "#{l(:label_project)}: #{o.name}"}, + :url => Proc.new {|o| {:controller => 'projects', :action => 'show', :id => o}}, + :author => nil + ############################added by william + acts_as_taggable + scope :by_join_date, order("created_on DESC") + ###################added by liuping 关注 + acts_as_watchable + + attr_protected :status + + validates_presence_of :name, :identifier + validates_uniqueness_of :identifier + validates_uniqueness_of :name + validates_associated :repository, :wiki + # validates_length_of :description, :maximum => 255 + validates_length_of :name, :maximum => 255 + validates_length_of :homepage, :maximum => 255 + validates_length_of :identifier, :in => 1..IDENTIFIER_MAX_LENGTH + # donwcase letters, digits, dashes but not digits only + validates_format_of :identifier, :with => /\A(?!\d+$)[a-z0-9\-_]*\z/, :if => Proc.new { |p| p.identifier_changed? } + # reserved words + validates_exclusion_of :identifier, :in => %w( new ) + + #此代码功能:为原redmine中项目的树形结构按名称首字母排序,本系统项目非树形结构,且项目排序方式无按首字母排序,另该代码执行会使空数据库时创建项目时出异常故注释掉 + #after_save :update_position_under_parent, :if => Proc.new {|project| project.name_changed?} + after_save :update_inherited_members, :if => Proc.new {|project| project.inherit_members_changed?} + # 创建project之后默认创建一个board,之后的board去掉了board的概念 + after_create :create_board_sync + before_destroy :delete_all_members + def remove_references_before_destroy + return if self.id.nil? + Watcher.delete_all ['watchable_id = ?', id] + end + scope :has_module, lambda {|mod| + where("#{Project.table_name}.id IN (SELECT em.project_id FROM #{EnabledModule.table_name} em WHERE em.name=?)", mod.to_s) + } + scope :active, lambda { where(:status => STATUS_ACTIVE) } + scope :status, lambda {|arg| where(arg.blank? ? nil : {:status => arg.to_i}) } + scope :all_public, lambda { where(:is_public => true) } + scope :visible, lambda {|*args| where(Project.visible_condition(args.shift || User.current, *args)) } + scope :allowed_to, lambda {|*args| + user = User.current + permission = nil + if args.first.is_a?(Symbol) + permission = args.shift + else + user = args.shift + permission = args.shift + end + where(Project.allowed_to_condition(user, permission, *args)) + } + scope :like, lambda {|arg| + if arg.blank? + where(nil) + else + pattern = "%#{arg.to_s.strip.downcase}%" + where("LOWER(name) LIKE :p ", :p => pattern) + end + } + scope :project_entities, -> { where(project_type: ProjectType_project) } + scope :course_entities, -> { where(project_type: ProjectType_course) } + + def new_course + self.where('project_type = ?', 1) + end + + # 获取项目的资源类型列表 + def attachmenttypes + @attachmenttypes = Attachmentstype.find(:all, :conditions => ["#{Attachmentstype.table_name}.typeId= ?",self.attachmenttype ]) + end + + # 获取资源后缀名列表 + def contenttypes + attachmenttypes + if @attachmenttypes.length >0 + @attachmenttypes.last().suffixArr + end + end + + #自定义验证 + def validation + if !class_period.match([0-9]) + errors.add_to_base("class period can only digital") + end + end + +# 项目留言 added by fq + def self.add_jour(user, notes) + project = Project.find('trustie') + # project.journals_for_messages << JournalsForMessage.new(:user_id => user.id, :notes => notes, :reply_id => 0) + pjfm = project.journals_for_messages.build(:user_id => user.id, :notes => notes, :reply_id => 0) + pjfm.save + pjfm + end + + def self.add_new_jour(user, notes, id, options={}) + project = Project.find(id) + if options.count == 0 + pjfm = project.journals_for_messages.build(:user_id => user.id, :notes => notes, :reply_id => 0) + else + pjfm = project.journals_for_messages.build(options) + end + pjfm.save + pjfm + end +# end + + # 管理员的邮件列表 + def manager_recipients + notified = project.project_infos.collect(&:user) + notified.collect(&:mail) + end + + def initialize(attributes=nil, *args) + super + + initialized = (attributes || {}).stringify_keys + if !initialized.key?('identifier') && Setting.sequential_project_identifiers? + self.identifier = Project.next_identifier + end + if !initialized.key?('is_public') + self.is_public = Setting.default_projects_public? + end + if !initialized.key?('enabled_module_names') + self.enabled_module_names = Setting.default_projects_modules + end + if !initialized.key?('trackers') && !initialized.key?('tracker_ids') + default = Setting.default_projects_tracker_ids + if default.is_a?(Array) + self.trackers = Tracker.where(:id => default.map(&:to_i)).sorted.all + else + self.trackers = Tracker.sorted.all + end + end + end + + def identifier=(identifier) + super unless identifier_frozen? + end + + def identifier_frozen? + errors[:identifier].blank? && !(new_record? || identifier.blank?) + end + + # returns latest created projects + # non public projects will be returned only if user is a member of those + def self.latest(user=nil, count=5) + visible(user).limit(count).order("created_on DESC").all + end + + # Returns true if the project is visible to +user+ or to the current user. + def visible?(user=User.current) + user.allowed_to?(:view_project, self) + end + + # Returns a SQL conditions string used to find all projects visible by the specified user. + # + # Examples: + # Project.visible_condition(admin) => "projects.status = 1" + # Project.visible_condition(normal_user) => "((projects.status = 1) AND (projects.is_public = 1 OR projects.id IN (1,3,4)))" + # Project.visible_condition(anonymous) => "((projects.status = 1) AND (projects.is_public = 1))" + def self.visible_condition(user, options={}) + allowed_to_condition(user, :view_project, options) + end + + # Returns a SQL conditions string used to find all projects for which +user+ has the given +permission+ + # + # Valid options: + # * :project => limit the condition to project + # * :with_subprojects => limit the condition to project and its subprojects + # * :member => limit the condition to the user projects + def self.allowed_to_condition(user, permission, options={}) + perm = Redmine::AccessControl.permission(permission) + base_statement = (perm && perm.read? ? "#{Project.table_name}.status <> #{Project::STATUS_ARCHIVED}" : "#{Project.table_name}.status = #{Project::STATUS_ACTIVE}") + if perm && perm.project_module + # If the permission belongs to a project module, make sure the module is enabled + base_statement << " AND #{Project.table_name}.id IN (SELECT em.project_id FROM #{EnabledModule.table_name} em WHERE em.name='#{perm.project_module}')" + end + if options[:project] + project_statement = "#{Project.table_name}.id = #{options[:project].id}" + project_statement << " OR (#{Project.table_name}.lft > #{options[:project].lft} AND #{Project.table_name}.rgt < #{options[:project].rgt})" if options[:with_subprojects] + base_statement = "(#{project_statement}) AND (#{base_statement})" + end + + if user.admin? + base_statement + else + statement_by_role = {} + unless options[:member] + role = user.logged? ? Role.non_member : Role.anonymous + if role.allowed_to?(permission) + statement_by_role[role] = "#{Project.table_name}.is_public = #{connection.quoted_true}" + end + end + if user.logged? + user.projects_by_role.each do |role, projects| + if role.allowed_to?(permission) && projects.any? + statement_by_role[role] = "#{Project.table_name}.id IN (#{projects.collect(&:id).join(',')})" + end + end + end + if statement_by_role.empty? + "1=0" + else + if block_given? + statement_by_role.each do |role, statement| + if s = yield(role, user) + statement_by_role[role] = "(#{statement} AND (#{s}))" + end + end + end + "((#{base_statement}) AND (#{statement_by_role.values.join(' OR ')}))" + end + end + end + + # Returns the Systemwide and project specific activities + def activities(include_inactive=false) + if include_inactive + return all_activities + else + return active_activities + end + end + + # Will create a new Project specific Activity or update an existing one + # + # This will raise a ActiveRecord::Rollback if the TimeEntryActivity + # does not successfully save. + def update_or_create_time_entry_activity(id, activity_hash) + if activity_hash.respond_to?(:has_key?) && activity_hash.has_key?('parent_id') + self.create_time_entry_activity_if_needed(activity_hash) + else + activity = project.time_entry_activities.find_by_id(id.to_i) + activity.update_attributes(activity_hash) if activity + end + end + + # Create a new TimeEntryActivity if it overrides a system TimeEntryActivity + # + # This will raise a ActiveRecord::Rollback if the TimeEntryActivity + # does not successfully save. + def create_time_entry_activity_if_needed(activity) + if activity['parent_id'] + + parent_activity = TimeEntryActivity.find(activity['parent_id']) + activity['name'] = parent_activity.name + activity['position'] = parent_activity.position + + if Enumeration.overridding_change?(activity, parent_activity) + project_activity = self.time_entry_activities.create(activity) + + if project_activity.new_record? + raise ActiveRecord::Rollback, "Overridding TimeEntryActivity was not successfully saved" + else + self.time_entries.update_all("activity_id = #{project_activity.id}", ["activity_id = ?", parent_activity.id]) + end + end + end + end + + # Returns a :conditions SQL string that can be used to find the issues associated with this project. + # + # Examples: + # project.project_condition(true) => "(projects.id = 1 OR (projects.lft > 1 AND projects.rgt < 10))" + # project.project_condition(false) => "projects.id = 1" + def project_condition(with_subprojects) + cond = "#{Project.table_name}.id = #{id}" + cond = "(#{cond} OR (#{Project.table_name}.lft > #{lft} AND #{Project.table_name}.rgt < #{rgt}))" if with_subprojects + cond + end + + def self.find(*args) + if args.first && args.first.is_a?(String) && !args.first.match(/^\d*$/) + project = find_by_identifier(*args) + raise ActiveRecord::RecordNotFound, "Couldn't find Project with identifier=#{args.first}" if project.nil? + project + else + super + end + end + + def self.find_by_param(*args) + self.find(*args) + end + + alias :base_reload :reload + def reload(*args) + @shared_versions = nil + @rolled_up_versions = nil + @rolled_up_trackers = nil + @all_issue_custom_fields = nil + @all_time_entry_custom_fields = nil + @to_param = nil + @allowed_parents = nil + @allowed_permissions = nil + @actions_allowed = nil + @start_date = nil + @due_date = nil + base_reload(*args) + end + + # def to_param + # # id is used for projects with a numeric identifier (compatibility) + # @to_param ||= (identifier.to_s =~ %r{^\d*$} ? id.to_s : identifier) + # end + + def active? + self.status == STATUS_ACTIVE + end + + def archived? + self.status == STATUS_ARCHIVED + end + + # Archives the project and its descendants + def archive + # Check that there is no issue of a non descendant project that is assigned + # to one of the project or descendant versions + v_ids = self_and_descendants.collect {|p| p.version_ids}.flatten + if v_ids.any? && + Issue. + includes(:project). + where("#{Project.table_name}.lft < ? OR #{Project.table_name}.rgt > ?", lft, rgt). + where("#{Issue.table_name}.fixed_version_id IN (?)", v_ids). + exists? + return false + end + Project.transaction do + archive! + end + true + end + + # Unarchives the project + # All its ancestors must be active + def unarchive + return false if ancestors.detect {|a| !a.active?} + update_attribute :status, STATUS_ACTIVE + end + + def close + self_and_descendants.status(STATUS_ACTIVE).update_all :status => STATUS_CLOSED + end + + def reopen + self_and_descendants.status(STATUS_CLOSED).update_all :status => STATUS_ACTIVE + end + + # Returns an array of projects the project can be moved to + # by the current user + def allowed_parents + return @allowed_parents if @allowed_parents + @allowed_parents = Project.where(Project.allowed_to_condition(User.current, :add_subprojects)).all + @allowed_parents = @allowed_parents - self_and_descendants + if User.current.allowed_to?(:add_project, nil, :global => true) || (!new_record? && parent.nil?) + @allowed_parents << nil + end + unless parent.nil? || @allowed_parents.empty? || @allowed_parents.include?(parent) + @allowed_parents << parent + end + @allowed_parents + end + + # Sets the parent of the project with authorization check + def set_allowed_parent!(p) + unless p.nil? || p.is_a?(Project) + if p.to_s.blank? + p = nil + else + p = Project.find_by_id(p) + return false unless p + end + end + if p.nil? + if !new_record? && allowed_parents.empty? + return false + end + elsif !allowed_parents.include?(p) + return false + end + set_parent!(p) + end + + # Sets the parent of the project + # Argument can be either a Project, a String, a Fixnum or nil + def set_parent!(p) + unless p.nil? || p.is_a?(Project) + if p.to_s.blank? + p = nil + else + p = Project.find_by_id(p) + return false unless p + end + end + if p == parent && !p.nil? + # Nothing to do + true + elsif p.nil? || (p.active? && move_possible?(p)) + set_or_update_position_under(p) + Issue.update_versions_from_hierarchy_change(self) + true + else + # Can not move to the given target + false + end + end + + # Recalculates all lft and rgt values based on project names + # Unlike Project.rebuild!, these values are recalculated even if the tree "looks" valid + # Used in BuildProjectsTree migration + def self.rebuild_tree! + transaction do + update_all "lft = NULL, rgt = NULL" + rebuild!(false) + end + end + + # Returns an array of the trackers used by the project and its active sub projects + def rolled_up_trackers + @rolled_up_trackers ||= + Tracker. + joins(:projects). + joins("JOIN #{EnabledModule.table_name} ON #{EnabledModule.table_name}.project_id = #{Project.table_name}.id AND #{EnabledModule.table_name}.name = 'issue_tracking'"). + select("DISTINCT #{Tracker.table_name}.*"). + where("#{Project.table_name}.lft >= ? AND #{Project.table_name}.rgt <= ? AND #{Project.table_name}.status <> #{STATUS_ARCHIVED}", lft, rgt). + sorted. + all + end + + # Closes open and locked project versions that are completed + def close_completed_versions + Version.transaction do + versions.where(:status => %w(open locked)).all.each do |version| + if version.completed? + version.update_attribute(:status, 'closed') + end + end + end + end + + # Returns a scope of the Versions on subprojects + def rolled_up_versions + @rolled_up_versions ||= + Version.scoped(:include => :project, + :conditions => ["#{Project.table_name}.lft >= ? AND #{Project.table_name}.rgt <= ? AND #{Project.table_name}.status <> #{STATUS_ARCHIVED}", lft, rgt]) + end + + # Returns a scope of the Versions used by the project + def shared_versions + if new_record? + Version.scoped(:include => :project, + :conditions => "#{Project.table_name}.status <> #{Project::STATUS_ARCHIVED} AND #{Version.table_name}.sharing = 'system'") + else + @shared_versions ||= begin + r = root? ? self : root + Version.scoped(:include => :project, + :conditions => "#{Project.table_name}.id = #{id}" + + " OR (#{Project.table_name}.status <> #{Project::STATUS_ARCHIVED} AND (" + + " #{Version.table_name}.sharing = 'system'" + + " OR (#{Project.table_name}.lft >= #{r.lft} AND #{Project.table_name}.rgt <= #{r.rgt} AND #{Version.table_name}.sharing = 'tree')" + + " OR (#{Project.table_name}.lft < #{lft} AND #{Project.table_name}.rgt > #{rgt} AND #{Version.table_name}.sharing IN ('hierarchy', 'descendants'))" + + " OR (#{Project.table_name}.lft > #{lft} AND #{Project.table_name}.rgt < #{rgt} AND #{Version.table_name}.sharing = 'hierarchy')" + + "))") + end + end + end + + # Returns a hash of project users grouped by role + def users_by_role + members.includes(:user, :roles).all.inject({}) do |h, m| + m.roles.each do |r| + h[r] ||= [] + h[r] << m.user + end + h + end + end + + # Deletes all project's members + def delete_all_members + me, mr = Member.table_name, MemberRole.table_name + connection.delete("DELETE FROM #{mr} WHERE #{mr}.member_id IN (SELECT #{me}.id FROM #{me} WHERE #{me}.project_id = #{id})") + Member.delete_all(['project_id = ?', id]) + end + + # Users/groups issues can be assigned to + def assignable_users + assignable = Setting.issue_group_assignment? ? member_principals : members + assignable.select {|m| m.roles.detect {|role| role.assignable?}}.collect {|m| m.principal}.sort + end + + # Returns the mail adresses of users that should be always notified on project events + def recipients + notified_users.collect {|user| user.mail} + end + + # Returns the users that should be notified on project events + def notified_users + # TODO: User part should be extracted to User#notify_about? + members.select {|m| m.principal.present? && (m.mail_notification? || m.principal.mail_notification == 'all')}.collect {|m| m.principal} + end + + # Returns an array of all custom fields enabled for project issues + # (explictly associated custom fields and custom fields enabled for all projects) + def all_issue_custom_fields + @all_issue_custom_fields ||= (IssueCustomField.for_all + issue_custom_fields).uniq.sort + end + + # Returns an array of all custom fields enabled for project time entries + # (explictly associated custom fields and custom fields enabled for all projects) + def all_time_entry_custom_fields + @all_time_entry_custom_fields ||= (TimeEntryCustomField.for_all + time_entry_custom_fields).uniq.sort + end + + def project + self + end + + def <=>(project) + name.downcase <=> project.name.downcase + end + + def to_s + name + end + + # Returns a short description of the projects (first lines) + def short_description(length = 255) + #description.gsub(/^(.{#{length}}[^\n\r]*).*$/m, '\1...').strip if description + description.gsub(/<\/?.*?>/,"").html_safe if description + end + + def css_classes + s = 'project' + s << ' root' if root? + s << ' child' if child? + s << (leaf? ? ' leaf' : ' parent') + unless active? + if archived? + s << ' archived' + else + s << ' closed' + end + end + s + end + + # The earliest start date of a project, based on it's issues and versions + def start_date + @start_date ||= [ + issues.minimum('start_date'), + shared_versions.minimum('effective_date'), + Issue.fixed_version(shared_versions).minimum('start_date') + ].compact.min + end + + # The latest due date of an issue or version + def due_date + @due_date ||= [ + issues.maximum('due_date'), + shared_versions.maximum('effective_date'), + Issue.fixed_version(shared_versions).maximum('due_date') + ].compact.max + end + + def overdue? + active? && !due_date.nil? && (due_date < Date.today) + end + + # Returns the percent completed for this project, based on the + # progress on it's versions. + def completed_percent(options={:include_subprojects => false}) + if options.delete(:include_subprojects) + total = self_and_descendants.collect(&:completed_percent).sum + + total / self_and_descendants.count + else + if versions.count > 0 + total = versions.collect(&:completed_percent).sum + + total / versions.count + else + 100 + end + end + end + + # Return true if this project allows to do the specified action. + # action can be: + # * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit') + # * a permission Symbol (eg. :edit_project) + def allows_to?(action) + if archived? + # No action allowed on archived projects + return false + end + unless active? || Redmine::AccessControl.read_action?(action) + # No write action allowed on closed projects + return false + end + # No action allowed on disabled modules + if action.is_a? Hash + allowed_actions.include? "#{action[:controller]}/#{action[:action]}" + else + allowed_permissions.include? action + end + end + + def module_enabled?(module_name) + module_name = module_name.to_s + enabled_modules.detect {|m| m.name == module_name} + end + + def enabled_module_names=(module_names) + if module_names && module_names.is_a?(Array) + module_names = module_names.collect(&:to_s).reject(&:blank?) + self.enabled_modules = module_names.collect {|name| enabled_modules.detect {|mod| mod.name == name} || EnabledModule.new(:name => name)} + else + enabled_modules.clear + end + end + + # Returns an array of the enabled modules names + def enabled_module_names + enabled_modules.collect(&:name) + end + + # Enable a specific module + # + # Examples: + # project.enable_module!(:issue_tracking) + # project.enable_module!("issue_tracking") + def enable_module!(name) + enabled_modules << EnabledModule.new(:name => name.to_s) unless module_enabled?(name) + end + + # Disable a module if it exists + # + # Examples: + # project.disable_module!(:issue_tracking) + # project.disable_module!("issue_tracking") + # project.disable_module!(project.enabled_modules.first) + def disable_module!(target) + target = enabled_modules.detect{|mod| target.to_s == mod.name} unless enabled_modules.include?(target) + target.destroy unless target.blank? + end + + safe_attributes 'name', + 'description', + 'homepage', + 'is_public', + 'hidden_repo', + 'identifier', + 'custom_field_values', + 'custom_fields', + 'tracker_ids', + 'issue_custom_field_ids', + 'project_type', + 'dts_test', + 'attachmenttype' + + + + safe_attributes 'enabled_module_names', + :if => lambda {|project, user| project.new_record? || user.allowed_to?(:select_project_modules, project) } + + safe_attributes 'inherit_members', + :if => lambda {|project, user| project.parent.nil? || project.parent.visible?(user)} + + # Returns an array of projects that are in this project's hierarchy + # + # Example: parents, children, siblings + def hierarchy + parents = project.self_and_ancestors || [] + descendants = project.descendants || [] + project_hierarchy = parents | descendants # Set union + end + + # Returns an auto-generated project identifier based on the last identifier used + def self.next_identifier + p = Project.order('created_on DESC').first + p.nil? ? nil : p.identifier.to_s.succ + end + + # Copies and saves the Project instance based on the +project+. + # Duplicates the source project's: + # * Wiki + # * Versions + # * Categories + # * Issues + # * Members + # * Queries + # + # Accepts an +options+ argument to specify what to copy + # + # Examples: + # project.copy(1) # => copies everything + # project.copy(1, :only => 'members') # => copies members only + # project.copy(1, :only => ['members', 'versions']) # => copies members and versions + def copy(project, options={}) + project = project.is_a?(Project) ? project : Project.find(project) + + to_be_copied = %w(wiki versions issue_categories issues members queries boards) + to_be_copied = to_be_copied & options[:only].to_a unless options[:only].nil? + + Project.transaction do + if save + reload + to_be_copied.each do |name| + send "copy_#{name}", project + end + Redmine::Hook.call_hook(:model_project_copy_before_save, :source_project => project, :destination_project => self) + save + end + end + end + + # Returns a new unsaved Project instance with attributes copied from +project+ + def self.copy_from(project) + project = project.is_a?(Project) ? project : Project.find(project) + # clear unique attributes + attributes = project.attributes.dup.except('id', 'name', 'identifier', 'status', 'parent_id', 'lft', 'rgt') + copy = Project.new(attributes) + copy.enabled_modules = project.enabled_modules + copy.trackers = project.trackers + copy.custom_values = project.custom_values.collect {|v| v.clone} + copy.issue_custom_fields = project.issue_custom_fields + copy + end + + # Yields the given block for each project with its level in the tree + def self.project_tree(projects, &block) + ancestors = [] + projects.sort_by(&:lft).each do |project| + while (ancestors.any? && !project.is_descendant_of?(ancestors.last)) + ancestors.pop + end + yield project, ancestors.size + ancestors << project + end + end + + private + + def after_parent_changed(parent_was) + remove_inherited_member_roles + add_inherited_member_roles + end + + def update_inherited_members + if parent + if inherit_members? && !inherit_members_was + remove_inherited_member_roles + add_inherited_member_roles + elsif !inherit_members? && inherit_members_was + remove_inherited_member_roles + end + end + end + + def remove_inherited_member_roles + member_roles = memberships.map(&:member_roles).flatten + member_role_ids = member_roles.map(&:id) + member_roles.each do |member_role| + if member_role.inherited_from && !member_role_ids.include?(member_role.inherited_from) + member_role.destroy + end + end + end + + def add_inherited_member_roles + if inherit_members? && parent + parent.memberships.each do |parent_member| + member = Member.find_or_new(self.id, parent_member.user_id) + parent_member.member_roles.each do |parent_member_role| + member.member_roles << MemberRole.new(:role => parent_member_role.role, :inherited_from => parent_member_role.id) + end + member.save! + end + end + end + + # Copies wiki from +project+ + def copy_wiki(project) + # Check that the source project has a wiki first + unless project.wiki.nil? + wiki = self.wiki || Wiki.new + wiki.attributes = project.wiki.attributes.dup.except("id", "project_id") + wiki_pages_map = {} + project.wiki.pages.each do |page| + # Skip pages without content + next if page.content.nil? + new_wiki_content = WikiContent.new(page.content.attributes.dup.except("id", "page_id", "updated_on")) + new_wiki_page = WikiPage.new(page.attributes.dup.except("id", "wiki_id", "created_on", "parent_id")) + new_wiki_page.content = new_wiki_content + wiki.pages << new_wiki_page + wiki_pages_map[page.id] = new_wiki_page + end + + self.wiki = wiki + wiki.save + # Reproduce page hierarchy + project.wiki.pages.each do |page| + if page.parent_id && wiki_pages_map[page.id] + wiki_pages_map[page.id].parent = wiki_pages_map[page.parent_id] + wiki_pages_map[page.id].save + end + end + end + end + + # Copies versions from +project+ + def copy_versions(project) + project.versions.each do |version| + new_version = Version.new + new_version.attributes = version.attributes.dup.except("id", "project_id", "created_on", "updated_on") + self.versions << new_version + end + end + + # Copies issue categories from +project+ + def copy_issue_categories(project) + project.issue_categories.each do |issue_category| + new_issue_category = IssueCategory.new + new_issue_category.attributes = issue_category.attributes.dup.except("id", "project_id") + self.issue_categories << new_issue_category + end + end + + # Copies issues from +project+ + def copy_issues(project) + # Stores the source issue id as a key and the copied issues as the + # value. Used to map the two togeather for issue relations. + issues_map = {} + + # Store status and reopen locked/closed versions + version_statuses = versions.reject(&:open?).map {|version| [version, version.status]} + version_statuses.each do |version, status| + version.update_attribute :status, 'open' + end + + # Get issues sorted by root_id, lft so that parent issues + # get copied before their children + project.issues.reorder('root_id, lft').all.each do |issue| + new_issue = Issue.new + new_issue.copy_from(issue, :subtasks => false, :link => false) + new_issue.project = self + # Reassign fixed_versions by name, since names are unique per project + if issue.fixed_version && issue.fixed_version.project == project + new_issue.fixed_version = self.versions.detect {|v| v.name == issue.fixed_version.name} + end + # Reassign the category by name, since names are unique per project + if issue.category + new_issue.category = self.issue_categories.detect {|c| c.name == issue.category.name} + end + # Parent issue + if issue.parent_id + if copied_parent = issues_map[issue.parent_id] + new_issue.parent_issue_id = copied_parent.id + end + end + + self.issues << new_issue + if new_issue.new_record? + logger.info "Project#copy_issues: issue ##{issue.id} could not be copied: #{new_issue.errors.full_messages}" if logger && logger.info + else + issues_map[issue.id] = new_issue unless new_issue.new_record? + end + end + + # Restore locked/closed version statuses + version_statuses.each do |version, status| + version.update_attribute :status, status + end + + # Relations after in case issues related each other + project.issues.each do |issue| + new_issue = issues_map[issue.id] + unless new_issue + # Issue was not copied + next + end + + # Relations + issue.relations_from.each do |source_relation| + new_issue_relation = IssueRelation.new + new_issue_relation.attributes = source_relation.attributes.dup.except("id", "issue_from_id", "issue_to_id") + new_issue_relation.issue_to = issues_map[source_relation.issue_to_id] + if new_issue_relation.issue_to.nil? && Setting.cross_project_issue_relations? + new_issue_relation.issue_to = source_relation.issue_to + end + new_issue.relations_from << new_issue_relation + end + + issue.relations_to.each do |source_relation| + new_issue_relation = IssueRelation.new + new_issue_relation.attributes = source_relation.attributes.dup.except("id", "issue_from_id", "issue_to_id") + new_issue_relation.issue_from = issues_map[source_relation.issue_from_id] + if new_issue_relation.issue_from.nil? && Setting.cross_project_issue_relations? + new_issue_relation.issue_from = source_relation.issue_from + end + new_issue.relations_to << new_issue_relation + end + end + end + + # Copies members from +project+ + def copy_members(project) + # Copy users first, then groups to handle members with inherited and given roles + members_to_copy = [] + members_to_copy += project.memberships.select {|m| m.principal.is_a?(User)} + members_to_copy += project.memberships.select {|m| !m.principal.is_a?(User)} + + members_to_copy.each do |member| + new_member = Member.new + new_member.attributes = member.attributes.dup.except("id", "project_id", "created_on") + # only copy non inherited roles + # inherited roles will be added when copying the group membership + role_ids = member.member_roles.reject(&:inherited?).collect(&:role_id) + next if role_ids.empty? + new_member.role_ids = role_ids + new_member.project = self + self.members << new_member + end + end + + # Copies queries from +project+ + def copy_queries(project) + project.queries.each do |query| + new_query = IssueQuery.new + new_query.attributes = query.attributes.dup.except("id", "project_id", "sort_criteria") + new_query.sort_criteria = query.sort_criteria if query.sort_criteria + new_query.project = self + new_query.user_id = query.user_id + self.queries << new_query + end + end + + # Copies boards from +project+ + def copy_boards(project) + project.boards.each do |board| + new_board = Board.new + new_board.attributes = board.attributes.dup.except("id", "project_id", "topics_count", "messages_count", "last_message_id") + new_board.project = self + self.boards << new_board + end + end + + def allowed_permissions + @allowed_permissions ||= begin + module_names = enabled_modules.all(:select => :name).collect {|m| m.name} + Redmine::AccessControl.modules_permissions(module_names).collect {|p| p.name} + end + end + + def allowed_actions + @actions_allowed ||= allowed_permissions.inject([]) { |actions, permission| actions += Redmine::AccessControl.allowed_actions(permission) }.flatten + end + + # Returns all the active Systemwide and project specific activities + def active_activities + overridden_activity_ids = self.time_entry_activities.collect(&:parent_id) + + if overridden_activity_ids.empty? + return TimeEntryActivity.shared.active + else + return system_activities_and_project_overrides + end + end + + # Returns all the Systemwide and project specific activities + # (inactive and active) + def all_activities + overridden_activity_ids = self.time_entry_activities.collect(&:parent_id) + + if overridden_activity_ids.empty? + return TimeEntryActivity.shared + else + return system_activities_and_project_overrides(true) + end + end + + # Returns the systemwide active activities merged with the project specific overrides + def system_activities_and_project_overrides(include_inactive=false) + if include_inactive + return TimeEntryActivity.shared. + where("id NOT IN (?)", self.time_entry_activities.collect(&:parent_id)).all + + self.time_entry_activities + else + return TimeEntryActivity.shared.active. + where("id NOT IN (?)", self.time_entry_activities.collect(&:parent_id)).all + + self.time_entry_activities.active + end + end + + # Archives subprojects recursively + def archive! + children.each do |subproject| + subproject.send :archive! + end + update_attribute :status, STATUS_ARCHIVED + end + + def update_position_under_parent + set_or_update_position_under(parent) + end + + def course + @course + end + + # Inserts/moves the project so that target's children or root projects stay alphabetically sorted + def set_or_update_position_under(target_parent) + parent_was = parent + sibs = (target_parent.nil? ? self.class.roots : target_parent.children) + to_be_inserted_before = sibs.sort_by {|c| c.name.to_s.downcase}.detect {|c| c.name.to_s.downcase > name.to_s.downcase } + + if to_be_inserted_before + move_to_left_of(to_be_inserted_before) + elsif target_parent.nil? + if sibs.empty? + # move_to_root adds the project in first (ie. left) position + move_to_root + else + move_to_right_of(sibs.last) unless self == sibs.last + end + else + # move_to_child_of adds the project in last (ie.right) position + move_to_child_of(target_parent) + end + if parent_was != target_parent + after_parent_changed(parent_was) + end + end + + # 创建项目后在项目下同步创建一个讨论区 + def create_board_sync + @board = self.boards.build + self.name=" #{l(:label_borad_project) }" + @board.name = self.name + @board.description = self.name.to_s + if @board.save + logger.debug "[Project Model] ===> #{@board.to_json}" + else + logger.error "[Project Model] ===> Auto create board when Project saved, because #{@board.full_messages}" + end + end + + +end diff --git a/app/models/project_status.rb b/app/models/project_status.rb index 7fd246234..d9e6159c3 100644 --- a/app/models/project_status.rb +++ b/app/models/project_status.rb @@ -1,21 +1,21 @@ -class ProjectStatus < ActiveRecord::Base - attr_accessible :changesets_count, :watchers_count, :project_id, :project_type,:grade - belongs_to :project - belongs_to :watchers - belongs_to :changesets - validates_presence_of :project_id - validates_uniqueness_of :project_id - - scope :visible, lambda {|*args| nil } - # 更新字段 watchers_count 加1 这里没有做用户是否存在的匹配 - # 负责这个表的聂同学 是在新建用户时就新建了该表的记录 - # 但是 如果超级用户删除其他用户的话会造成读取错误 这里是遗漏点 - # 删除用户时 此表创建人员未作相应删除动作 - def update_watchers_count(num) - if self.watchers_count||0 >= 0 - self.update_attribute(:watchers_count, self.watchers_count.to_i + num) - end - end - - -end +class ProjectStatus < ActiveRecord::Base + attr_accessible :changesets_count, :watchers_count, :project_id, :project_type,:grade + belongs_to :project + belongs_to :watchers + belongs_to :changesets + validates_presence_of :project_id + validates_uniqueness_of :project_id + + scope :visible, lambda {|*args| nil } + # 更新字段 watchers_count 加1 这里没有做用户是否存在的匹配 + # 负责这个表的聂同学 是在新建用户时就新建了该表的记录 + # 但是 如果超级用户删除其他用户的话会造成读取错误 这里是遗漏点 + # 删除用户时 此表创建人员未作相应删除动作 + def update_watchers_count(num) + if self.watchers_count||0 >= 0 + self.update_attribute(:watchers_count, self.watchers_count.to_i + num) + end + end + + +end diff --git a/app/views/account/password_recovery.html.erb b/app/views/account/password_recovery.html.erb index ff455f325..568d4d4bb 100644 --- a/app/views/account/password_recovery.html.erb +++ b/app/views/account/password_recovery.html.erb @@ -12,9 +12,9 @@

- - <%= password_field_tag 'new_password_confirmation', nil, :size => 25 %> -

+ + <%= password_field_tag 'new_password_confirmation', nil, :size => 25 %> +

<%= submit_tag l(:button_save) %>

<% end %> diff --git a/app/views/attachments/_form.html.erb b/app/views/attachments/_form.html.erb index 81dc5d939..5c22ff44c 100644 --- a/app/views/attachments/_form.html.erb +++ b/app/views/attachments/_form.html.erb @@ -1,52 +1,52 @@ - -<% if defined?(container) && container && container.saved_attachments %> - <% container.attachments.each_with_index do |attachment, i| %> - - <%= text_field_tag("attachments[p#{i}][filename]", attachment.filename, :class => 'filename readonly', :readonly=>'readonly')%> - <%= text_field_tag("attachments[p#{i}][description]", attachment.description, :maxlength => 255, :placeholder => l(:label_optional_description), :class => 'description', :style=>"display: inline-block;") + - if attachment.id.nil? - else - link_to(' '.html_safe, attachment_path(attachment, :attachment_id => "p#{i}", :format => 'js'), :method => 'delete', :remote => true, :class => 'remove-upload') - end - %> - <%#= render :partial => 'tags/tag', :locals => {:obj => attachment, :object_flag => "6"} %> - <%= check_box_tag("attachments[p#{i}][is_public_checkbox]", attachment.is_public, :class => 'is_public')%> - <%= hidden_field_tag "attachments[p#{i}][token]", "#{attachment.token}" %> - - <% end %> -<% end %> - - - -<%#= button_tag "浏览", :type=>"button", :onclick=>"CompatibleSend();" %> - -<%= button_tag "浏览", :type=>"button", :onclick=>"_file.click()",:onmouseover => 'this.focus()' %> -<%= file_field_tag 'attachments[dummy][file]', - :id => '_file', - :class => 'file_selector', - :multiple => true, - :onchange => 'addInputFiles(this);', - :style => 'display:none', - :data => { - :max_file_size => Setting.attachment_max_size.to_i.kilobytes, - :max_file_size_message => l(:error_attachment_too_big, :max_size => number_to_human_size(Setting.attachment_max_size.to_i.kilobytes)), - :max_concurrent_uploads => Redmine::Configuration['max_concurrent_ajax_uploads'].to_i, - :upload_path => uploads_path(:format => 'js'), - :description_placeholder => l(:label_optional_description) - } %> -<%= l(:label_no_file_uploaded)%> -(<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>) - - -<% content_for :header_tags do %> - <%= javascript_include_tag 'attachments' %> -<% end %> - - + +<% if defined?(container) && container && container.saved_attachments %> + <% container.attachments.each_with_index do |attachment, i| %> + + <%= text_field_tag("attachments[p#{i}][filename]", attachment.filename, :class => 'filename readonly', :readonly=>'readonly')%> + <%= text_field_tag("attachments[p#{i}][description]", attachment.description, :maxlength => 255, :placeholder => l(:label_optional_description), :class => 'description', :style=>"display: inline-block;") + + if attachment.id.nil? + else + link_to(' '.html_safe, attachment_path(attachment, :attachment_id => "p#{i}", :format => 'js'), :method => 'delete', :remote => true, :class => 'remove-upload') + end + %> + <%#= render :partial => 'tags/tag', :locals => {:obj => attachment, :object_flag => "6"} %> + <%= check_box_tag("attachments[p#{i}][is_public_checkbox]", attachment.is_public, :class => 'is_public')%> + <%= hidden_field_tag "attachments[p#{i}][token]", "#{attachment.token}" %> + + <% end %> +<% end %> + + + +<%#= button_tag "浏览", :type=>"button", :onclick=>"CompatibleSend();" %> + +<%= button_tag "浏览", :type=>"button", :onclick=>"_file.click()",:onmouseover => 'this.focus()' %> +<%= file_field_tag 'attachments[dummy][file]', + :id => '_file', + :class => 'file_selector', + :multiple => true, + :onchange => 'addInputFiles(this);', + :style => 'display:none', + :data => { + :max_file_size => Setting.attachment_max_size.to_i.kilobytes, + :max_file_size_message => l(:error_attachment_too_big, :max_size => number_to_human_size(Setting.attachment_max_size.to_i.kilobytes)), + :max_concurrent_uploads => Redmine::Configuration['max_concurrent_ajax_uploads'].to_i, + :upload_path => uploads_path(:format => 'js'), + :description_placeholder => l(:label_optional_description) + } %> +<%= l(:label_no_file_uploaded)%> +(<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>) + + +<% content_for :header_tags do %> + <%= javascript_include_tag 'attachments' %> +<% end %> + + diff --git a/app/views/attachments/file.html.erb b/app/views/attachments/file.html.erb index d4cb19880..75fa1858c 100644 --- a/app/views/attachments/file.html.erb +++ b/app/views/attachments/file.html.erb @@ -1,26 +1,26 @@ -

<%=h @attachment.filename %>

- -
-

<%= h("#{@attachment.description} - ") unless @attachment.description.blank? %> - <%= link_to_user(@attachment.author) %>, <%= format_time(@attachment.created_on) %>

-

<%= link_to_attachment @attachment, :text => l(:button_download), :download => true -%> - (<%= number_to_human_size @attachment.filesize %>)    - - <% if @attachment!=nil &&(@attachment.container_type == 'Document' || @attachment.container_type == 'WikiPage') && - User.current.allowed_to?({:controller => 'code_review', :action => 'update_diff_view'}, @attachment.project) %> - <%= l(:review_assignments)+":" %><%= link = link_to(l(:button_add), {:controller => 'code_review', - :action => 'assign', :action_type => 'attachment', - :id=>@attachment.project, - :change_id => '', :attachment_id => @attachment.id, - }, :class => 'icon icon-add') %> - <% end %> -

-
-  -<%= render :partial => 'common/file', :locals => {:content => @content, :filename => @attachment.filename} %> - -<% html_title @attachment.filename %> - -<% content_for :header_tags do -%> - <%= stylesheet_link_tag "scm" -%> -<% end -%> +

<%=h @attachment.filename %>

+ +
+

<%= h("#{@attachment.description} - ") unless @attachment.description.blank? %> + <%= link_to_user(@attachment.author) %>, <%= format_time(@attachment.created_on) %>

+

<%= link_to_attachment @attachment, :text => l(:button_download), :download => true -%> + (<%= number_to_human_size @attachment.filesize %>)    + + <% if @attachment!=nil &&(@attachment.container_type == 'Document' || @attachment.container_type == 'WikiPage') && + User.current.allowed_to?({:controller => 'code_review', :action => 'update_diff_view'}, @attachment.project) %> + <%= l(:review_assignments)+":" %><%= link = link_to(l(:button_add), {:controller => 'code_review', + :action => 'assign', :action_type => 'attachment', + :id=>@attachment.project, + :change_id => '', :attachment_id => @attachment.id, + }, :class => 'icon icon-add') %> + <% end %> +

+
+  +<%= render :partial => 'common/file', :locals => {:content => @content, :filename => @attachment.filename} %> + +<% html_title @attachment.filename %> + +<% content_for :header_tags do -%> + <%= stylesheet_link_tag "scm" -%> +<% end -%> diff --git a/app/views/boards/_project_show.html.erb b/app/views/boards/_project_show.html.erb index a14e32d6d..199155838 100644 --- a/app/views/boards/_project_show.html.erb +++ b/app/views/boards/_project_show.html.erb @@ -67,12 +67,15 @@ <% @topics.each do |topic| %> - +     + +    

diff --git a/app/views/contests/show_attendingcontest.html.erb b/app/views/contests/show_attendingcontest.html.erb index 799656f36..3ba3e73ba 100644 --- a/app/views/contests/show_attendingcontest.html.erb +++ b/app/views/contests/show_attendingcontest.html.erb @@ -79,18 +79,35 @@ <%= render_flash_messages %>
-
<%= l(:label_wellmeaning_intimation_contentone) %>
-
1) <%= l(:label_wellmeaning_intimation_contenttwo) %>
-
2) <%= l(:label_wellmeaning_intimation_contentthree) %>
+
+ <%= l(:label_wellmeaning_intimation_contentone) %> +
+
+ 1) <%= l(:label_wellmeaning_intimation_contenttwo) %> +
+
+ 2) <%= l(:label_wellmeaning_intimation_contentthree) %> +
<% if User.current.logged? %>
<%= l(:label_attending_contest) %>: - <%= link_to l(:label_new_attendingcontest_work), "javascript:void(0);", onclick: "$('#put-project-form').slideToggle();" %> + + <%= link_to l(:label_new_attendingcontest_work), + "javascript:void(0);", + onclick: "$('#put-project-form').slideToggle();" + %> +
+ + +
+ <%= render "new_softapplication" %> +
+ <% else %>
<%= l(:label_user_login_attending_contest) %> @@ -98,10 +115,7 @@
<% end %> - -
- <%= render "new_softapplication" %> -
+ diff --git a/app/views/contests/show_contest.html.erb b/app/views/contests/show_contest.html.erb index 121f5e690..11937d2bd 100644 --- a/app/views/contests/show_contest.html.erb +++ b/app/views/contests/show_contest.html.erb @@ -2,9 +2,18 @@
<%= image_tag(url_to_avatar(@contest.author), :class => "avatar")%> -

<%= link_to(@contest.author.lastname+@contest.author.firstname, user_path(@contest.author))%>:<%= @contest.name %>

+

+ <%= link_to(@contest.author.lastname+@contest.author.firstname, + user_path(@contest.author)) + %> + :<%= @contest.name %>

- <%= l(:label_bids_reward_method) %><%= @contest.budget%> + + <%= l(:label_bids_reward_method) %> + + <%= @contest.budget%> + +

<%= @contest.description %> @@ -15,7 +24,11 @@
<%= render :partial => "/praise_tread/praise_tread", - :locals => {:obj => @contest,:show_flag => true,:user_id =>User.current.id,:horizontal => false}%> + :locals => {:obj => @contest, + :show_flag => true, + :user_id =>User.current.id, + :horizontal => false} + %>
@@ -23,7 +36,9 @@
- <%= render :partial => 'history', :locals => { :contest => @contest, :journals => @jour, :state => false} %> + <%= render :partial => 'history', + :locals => { :contest => @contest, :journals => @jour, :state => false} + %>
<%= link_to image_tag(url_to_avatar(topic.author), :class => "avatar"), user_path(topic.author) %> + <%= link_to image_tag(url_to_avatar(topic.author), :class => "avatar"), user_path(topic.author) %> + - - + +
<%= link_to h(topic.subject.truncate(40,ommision:'...')), board_message_path(@board, topic),title:topic.subject.to_s %> + <%= topic.locked? ? 'locked' : '' %>"> + <%= link_to h(topic.subject.truncate(40,ommision:'...')), board_message_path(@board, topic),title:topic.subject.to_s %> diff --git a/app/views/contest_notification/show.html.erb b/app/views/contest_notification/show.html.erb index e04a18c68..5664d5398 100644 --- a/app/views/contest_notification/show.html.erb +++ b/app/views/contest_notification/show.html.erb @@ -9,8 +9,12 @@ - - + +
contest.trustie.net<%=link_to l(:field_homepage), home_path %> > <%#=link_to l(:label_contest_innovate), :controller => 'welcome', :action => 'contest' %> 详情 + contest.trustie.net + + <%=link_to l(:field_homepage), home_path %> > + <%=link_to l(:label_contest_innovate), welcome_contest_path %> > 详情
diff --git a/app/views/contestnotifications/_form.html.erb b/app/views/contestnotifications/_form.html.erb index afcb60657..36bcd78c6 100644 --- a/app/views/contestnotifications/_form.html.erb +++ b/app/views/contestnotifications/_form.html.erb @@ -3,8 +3,23 @@ <%= l(:bale_news_notice) %>
-

<%= f.text_field :title, :required => true, :size => 60,:maxlength => 60, :style => "width:488px;" %>

-

<%= f.text_area :description, :required => true, :cols => 60, :rows => 11, :class => 'wiki-edit', :style => "width:490px;" %>

+

+ <%= f.text_field :title, + :required => true, + :size => 60, + :maxlength => 60, + :style => "width:488px;" + %> +

+

+ <%= f.text_area :description, + :required => true, + :cols => 60, + :rows => 11, + :class => 'wiki-edit', + :style => "width:490px;" + %> +

diff --git a/app/views/contestnotifications/_news.html.erb b/app/views/contestnotifications/_news.html.erb index fbac2557f..c8af85cf4 100644 --- a/app/views/contestnotifications/_news.html.erb +++ b/app/views/contestnotifications/_news.html.erb @@ -2,24 +2,47 @@ + <%# unless news.summary.blank? %>
<%#= link_to h(news.title), news_path(news) %> <%#= "(#{l(:label_x_comments, :count => news.comments_count)})" if news.comments_count > 0 %> - <%# unless news.summary.blank? %><%#=h news.summary %><% end %><%#=h news.summary %> <%#= authoring news.created_on, news.author %>

--> - + - <%= l(:label_work_name) %> - * : - - (<%= l(:label_workname_lengthlimit) %>) - -
-
-
- - - <%= l(:label_running_platform) %> - * : - - (<%= l(:label_workdescription_lengthlimit) %>) - -
-
-
- - - <%= l(:label_work_type) %> - * : - - - -
-
-
- - - <%= l(:label_work_description) %> - * : - - - -
-
-
- - - <%= l(:label_softapplication_developers) %> - * : - - (<%= l(:label_workdescription_lengthlimit) %>) - -
-
-
- - - <%= l(:label_work_deposit_project) %>: - <%= select_tag 'project', options_for_select(select_option_helper(@option)), :name => 'project', :class => 'grayline2',:style => "width:328px;" %> - <%= link_to l(:label_create_new_projects),{:controller => 'projects',:action => 'new',course: 0, project_type: 0,host: Setting.project_domain}, :target => '_blank' %> - -
-
-
- -
- - <%= l(:label_upload_softworkpacket_photo) %> - - <%#= render_flash_messages %> -

- <%= render :partial => 'attachments/form' %> -

- -

- 1、<%= l(:label_upload_softapplication_packets_mustpacketed) %>
-
- 2、<%= l(:label_upload_softapplication_photo_condition) %> -

- -
-
-
- - <%#= submit_tag l(:button_create) %> - <%= submit_tag l(:button_cancel), :name => nil, :onclick => "cancel();", - :type => 'button', :class => "enterprise", :onmouseout => "this.style.backgroundPosition = 'left top'", - :onmouseover => "this.style.backgroundPosition = 'left -30px'" %> -
+<%#= error_messages_for 'softapplication' %> + + + +<%= form_for Softapplication.new, :url => softapplications_path do |f| %> +
+ <%= hidden_field_tag 'contest_id', @contest.id %> +
+ <%= l(:label_work_name) %> + * : + + (<%= l(:label_workname_lengthlimit) %>) + +
+
+
+ + + <%= l(:label_running_platform) %> + * : + + (<%= l(:label_workdescription_lengthlimit) %>) + +
+
+
+ + + <%= l(:label_work_type) %> + * : + + + +
+
+
+ + + <%= l(:label_work_description) %> + * : + + + +
+
+
+ + + <%= l(:label_softapplication_developers) %> + * : + + + (<%= l(:label_workdescription_lengthlimit) %>) + + +
+
+
+ + + <%= l(:label_work_deposit_project) %>: + + <%= select_tag 'project', + options_for_select(select_option_helper(@option)), + :name => 'project', + :class => 'grayline2', + :style => "width:328px;" + %> + + + + + <%= link_to l(:label_create_new_projects), + new_project_path(:course => 0, :project_type => 0, :host => Setting.project_domain), + :target => '_blank' + %> + + + +
+
+
+ +
+ + <%= l(:label_upload_softworkpacket_photo) %> + + <%#= render_flash_messages %> +

+ <%= render :partial => 'attachments/form' %> +

+ +

+ 1、<%= l(:label_upload_softapplication_packets_mustpacketed) %>
+
+ 2、<%= l(:label_upload_softapplication_photo_condition) %> +

+ +
+
+
+ + <%#= submit_tag l(:button_create) %> + <%= submit_tag l(:button_cancel), + :name => nil, + :onclick => "cancel();", + :type => 'button', + :class => "enterprise", + :onmouseout => "this.style.backgroundPosition = 'left top'", + :onmouseover => "this.style.backgroundPosition = 'left -30px'" %> +
<% end %> \ No newline at end of file diff --git a/app/views/contests/_pre_show.html.erb b/app/views/contests/_pre_show.html.erb index fef1f16e4..67ceeb356 100644 --- a/app/views/contests/_pre_show.html.erb +++ b/app/views/contests/_pre_show.html.erb @@ -5,7 +5,12 @@ - +
+ + - - + - - + diff --git a/app/views/contestnotifications/edit.html.erb b/app/views/contestnotifications/edit.html.erb index 7b91d922c..1606d97d6 100644 --- a/app/views/contestnotifications/edit.html.erb +++ b/app/views/contestnotifications/edit.html.erb @@ -1,9 +1,15 @@

<%=l(:label_news)%>

-<%= labelled_form_for @contestnotification, url: contest_contestnotification_path, :html => { :id => 'contestnotifications-form', :multipart => true, :method => :put } do |f| %> +<%= labelled_form_for @contestnotification, + :url => contest_contestnotification_path, + :html => { :id => 'contestnotifications-form', + :multipart => true, + :method => :put } do |f| %> <%= render :partial => 'form', :locals => { :f => f } %> <%= submit_tag l(:button_save) %> -<%= preview_link preview_contestnotifications_path(id: @contestnotification), 'contestnotifications-form' %> +<%= preview_link preview_contestnotifications_path(id: @contestnotification), + 'contestnotifications-form' +%> <% end %>
diff --git a/app/views/contestnotifications/new.html.erb b/app/views/contestnotifications/new.html.erb index 30d5f0106..a5a1c7e58 100644 --- a/app/views/contestnotifications/new.html.erb +++ b/app/views/contestnotifications/new.html.erb @@ -1,5 +1,7 @@ -<%= labelled_form_for @contestnotification, :url => contest_contestnotifications_path(@contest), :html => { :id => 'contestnotifications-form', :multipart => true } do |f| %> +<%= labelled_form_for @contestnotification, + :url => contest_contestnotifications_path(@contest), + :html => { :id => 'contestnotifications-form', :multipart => true } do |f| %> <%= render :partial => 'contestnotifications/form', :locals => { :f => f } %> <%= submit_tag l(:button_create), :class => "whiteButton m3p10 h30" %> <%= submit_tag l(:button_cancel), :class => "whiteButton m3p10 h30",:onclick => "cancel();" %> diff --git a/app/views/contestnotifications/show.html.erb b/app/views/contestnotifications/show.html.erb index b6ac88008..a44ee5909 100644 --- a/app/views/contestnotifications/show.html.erb +++ b/app/views/contestnotifications/show.html.erb @@ -1,21 +1,26 @@
<%= link_to(l(:button_edit), - edit_contest_contestnotification_path(@contest, @contestnotification), - :class => 'icon icon-edit', - :accesskey => accesskey(:edit), - :onclick => '$("#edit-contestnotifications").show(); return true;') if (User.current.admin? && User.current.logged? )||(User.current == @contest.author && User.current.logged?)%> + edit_contest_contestnotification_path(@contest, @contestnotification), + :class => 'icon icon-edit', + :accesskey => accesskey(:edit), + :onclick => '$("#edit-contestnotifications").show(); return true;') if (User.current.admin? && User.current.logged? )||(User.current == @contest.author && User.current.logged?)%> <%= delete_link contest_contestnotification_path(@contest, @contestnotification) if (User.current.admin? && User.current.logged? )||(User.current == @contest.author && User.current.logged?) %>

<%=h @contestnotification.title %>

@@ -23,7 +28,9 @@
- <%= textilizable(@contestnotification, :description) %> + + <%= textilizable(@contestnotification, :description) %> +
<%#= link_to_attachments @contestnotification %>
@@ -31,16 +38,26 @@ <% if User.current.logged? %>

- <%= toggle_link l(:label_comment_add), "add_notificationcomment_form", :focus => "notificationcomment_notificationcomments" %> + <%= toggle_link l(:label_comment_add), + "add_notificationcomment_form", + :focus => "notificationcomment_notificationcomments" + %>

<% else %> <%= l(:label_user_login_notificationcomment) %> <%= link_to l(:label_user_login_new), signin_path %> <% end %> - <%= form_tag( contest_contestnotification_notificationcomments_path(@contest, @contestnotification) , :id => "add_notificationcomment_form", :style => "display:none;") do %> + <%= form_tag( contest_contestnotification_notificationcomments_path(@contest, @contestnotification) , + :id => "add_notificationcomment_form", + :style => "display:none;") do %>
- <%= text_area 'notificationcomment', 'notificationcomments', :cols => 80, :rows => 15, :class => 'wiki-edit' %> + <%= text_area 'notificationcomment', + 'notificationcomments', + :cols => 80, + :rows => 15, + :class => 'wiki-edit' + %> <%= wikitoolbar_for 'notificationcomment_notificationcomments' %>

@@ -65,7 +82,9 @@ <% next if notificationcomment.new_record? %>

<%=link_to contestnotifications.author,contest_contestnotification_path(contestnotifications)%> - <%= l(:label_project_newshare) %> <%= link_to h(contestnotifications.title), contest_contestnotification_path(contestnotifications) %> + + + <%=link_to contestnotifications.author, + contest_contestnotification_path(contestnotifications) + %> + + + <%= l(:label_project_newshare) %> + + <%= link_to h(contestnotifications.title), + contest_contestnotification_path(contestnotifications) + %>

<%=h contestnotifications.description%>

+

+ <%=h contestnotifications.description%> +

+
<%= contestnotifications.created_at %><%= link_to l(:label_project_newother),contest_contestnotification_path(contestnotifications)%> + + + <%= contestnotifications.created_at %> + + + <%= link_to l(:label_project_newother), + contest_contestnotification_path(contestnotifications) + %> <%= "(#{l(:label_x_comments, :count => contestnotifications.notificationcomments_count)})" if contestnotifications.notificationcomments_count > 0 %>
- +
<%= image_tag(url_to_avatar(notificationcomment.author), :class => "avatar")%> + <%= image_tag(url_to_avatar(notificationcomment.author), :class => "avatar")%> + @@ -80,8 +99,9 @@ @@ -92,7 +112,11 @@

- + diff --git a/app/views/contests/_contest_list.html.erb b/app/views/contests/_contest_list.html.erb index a91978079..967d31459 100644 --- a/app/views/contests/_contest_list.html.erb +++ b/app/views/contests/_contest_list.html.erb @@ -4,7 +4,10 @@ +  <%= link_to(contest.name, + contest_contestnotifications_path(contest), + :class => 'bid_path', + :target => "_blank") %> - +
@@ -31,5 +34,7 @@ <% end %>
<% end %> - + diff --git a/app/views/contests/_new.html.erb b/app/views/contests/_new.html.erb index 7ef0e71f1..a72ff6f36 100644 --- a/app/views/contests/_new.html.erb +++ b/app/views/contests/_new.html.erb @@ -30,7 +30,18 @@ <% if User.current.logged? %>
<% if notificationcomment.author==User.current|| User.current.admin? %> - <%= link_to(l(:label_bid_respond_delete), contest_contestnotification_notificationcomment_path(@contest, @contestnotification,notificationcomment), - :method => :delete,:confirm => l(:text_are_you_sure), :title => l(:button_delete)) %> + <%= link_to(l(:label_bid_respond_delete), + contest_contestnotification_notificationcomment_path(@contest, @contestnotification,notificationcomment), + :method => :delete,:confirm => l(:text_are_you_sure), :title => l(:button_delete)) %> <% end %>
<%= format_time(notificationcomment.created_at) %> + + <%= format_time(notificationcomment.created_at) %> + + <%#= link_to_if_authorized_contest image_tag('delete.png'), {:controller => 'notificationcomments', :action => 'destroy', :id => @contestnotifications, :notificationcomment_id => notificationcomment}, :data => {:confirm => l(:text_are_you_sure)}, :method => :delete, :title => l(:button_delete) %>
<% unless contest.author.nil? %> - <%= link_to(image_tag(url_to_avatar(contest.author), :class => 'avatar'), user_path(contest.author), :class => "avatar") %> + <%= link_to(image_tag(url_to_avatar(contest.author), :class => 'avatar'), + user_path(contest.author), + :class => "avatar") + %> <% end %> @@ -12,33 +15,85 @@
<% unless contest.author.nil? %> - <%= link_to(contest.author, user_path(contest.author), :class => 'bid_user') %>: + <%= link_to(contest.author, + user_path(contest.author), + :class => 'bid_user') + %>: <% end %> -  <%= link_to(contest.name, contest_contestnotifications_path(contest), :class => 'bid_path', :target => "_blank") %>
- <%= l(:label_contests_reward_method) %>:  <%= contest.budget%> + <%= l(:label_contests_reward_method) %>:   + + <%= contest.budget%> + +
- - <% if contest.id == 2 or contest.id == 3 or contest.id == 6 %> - <%= l(:label_contest_work, :count => contest.contesting_projects.count) %>(<%= link_to(contest.projects.where('is_public=1').count, show_attendingcontest_contest_path(contest), :target => "_blank") %>) + + + <% if contest.id == 2 || contest.id == 3 || contest.id == 6 %> + <%= l(:label_contest_work, + :count => contest.contesting_projects.count) + %> + ( + + <%= link_to(contest.projects.where('is_public=1').count, + show_attendingcontest_contest_path(contest), + :target => "_blank") + %> + + ) <% else %> - <%= l(:label_contest_work, :count => contest.contesting_softapplications.count) %>(<%= link_to(contest.contesting_softapplications.count, show_attendingcontest_contest_path(contest), :target => "_blank") %>) + <%= l(:label_contest_work, + :count => contest.contesting_softapplications.count) + %> + ( + + <%= link_to(contest.contesting_softapplications.count, + show_attendingcontest_contest_path(contest), + :target => "_blank") %> + + ) <% end %>
<%= l :label_create_time %>: <%= format_time contest.created_on %> + + <%= l :label_create_time %>: <%= format_time contest.created_on %> + +
@@ -58,6 +113,6 @@ diff --git a/app/views/contests/_form_contest.html.erb b/app/views/contests/_form_contest.html.erb index 79c531969..68e941a27 100644 --- a/app/views/contests/_form_contest.html.erb +++ b/app/views/contests/_form_contest.html.erb @@ -20,17 +20,55 @@ <%= error_messages_for 'contest' %> -

<%= l(:label_bids_form_contest_new_description) %>

-

<%= f.text_field :name, :required => true, :size => 60, :style => "width:490px;", :maxlength => Contest::NAME_LENGTH_LIMIT, :placeholder => "#{l(:label_contest_name)}" %>

+

+ <%= l(:label_bids_form_contest_new_description) %> +

+

+ <%= f.text_field :name, + :required => true, + :size => 60, + :style => "width:490px;", + :maxlength => Contest::NAME_LENGTH_LIMIT, + :placeholder => "#{l(:label_contest_name)}" + %> +

-

<%= f.text_area :description, :rows => 5, :class => 'wiki-edit', :style => "font-size:small;width:490px;margin-left:10px;", :maxlength => Contest::DESCRIPTION_LENGTH_LIMIT, :placeholder => "#{l(:label_contest_description)}" %>

+

+ <%= f.text_area :description, + :rows => 5, + :class => 'wiki-edit', + :style => "font-size:small;width:490px;margin-left:10px;", + :maxlength => Contest::DESCRIPTION_LENGTH_LIMIT, + :placeholder => "#{l(:label_contest_description)}" + %> +

-

<%= f.text_field :password, :size => 60, :style => "width:488px;margin-left: 10px;" %>

+

+ <%= f.text_field :password, + :size => 60, + :style => "width:488px;margin-left: 10px;" + %> +

- <%= f.text_area :budget, :required => true, :size => 60,:rows => 4,:maxlength => Contest::DESCRIPTION_LENGTH_LIMIT, :style => "width:490px;", :placeholder => l(:label_bids_reward_what) %> + <%= f.text_area :budget, + :required => true, + :size => 60, + :rows => 4, + :maxlength => Contest::DESCRIPTION_LENGTH_LIMIT, + :style => "width:490px;", + :placeholder => l(:label_bids_reward_what) + %>

-

<%= f.text_field :deadline, :required => true, :size => 60, :style => "width:150px;", :placeholder => "#{l(:label_deadline)}" %><%= calendar_for('contest_deadline')%>

+

+ <%= f.text_field :deadline, + :required => true, + :size => 60, + :style => "width:150px;", + :placeholder => "#{l(:label_deadline)}" + %> + <%= calendar_for('contest_deadline')%> +

diff --git a/app/views/contests/_history.html.erb b/app/views/contests/_history.html.erb index 6be572c65..f59bc0fc7 100644 --- a/app/views/contests/_history.html.erb +++ b/app/views/contests/_history.html.erb @@ -11,36 +11,66 @@
    <% for journal in journals%>
  • - <%= image_tag(url_to_avatar(journal.user), :class => "avatar") %> - - <%= link_to journal.user, user_path(journal.user)%> - <% label = l(:label_contest_requirement) %> -
    <%= textilizable journal.notes%>
    - <%= l(:label_bids_published) %> <%= time_tag(journal.created_on).html_safe %> <%= l(:label_bids_published_ago) %> - - <% ids = 'project_respond_form_'+ journal.id.to_s%> - - - <% if reply_allow %> - <%#= link_to(l(:button_quote), {:controller => 'contests', :action => 'new', :id => contest, :journal_id => journal}, :remote => true, :method => 'post', :title => l(:button_quote))%> - <%= link_to(l(:button_quote), contests_path(:id => contest, :journal_id => journal), :remote => true, :method => 'post', :title => l(:button_quote))%> - <%= link_to l(:label_bid_respond_quote),'', - {:focus => 'project_respond', :onclick => "toggleAndSettingWordsVal($('##{ids}'), $('##{ids} textarea'), '#{l(:label_reply_plural)} #{journal.user.show_name}: '); $('##{ids} textarea') ;return false;"}%> - <% end %> - - <% if @user==User.current|| User.current.admin? %> - <%#= link_to(l(:label_bid_respond_delete), {:controller => 'bids', :action => 'destroy', :object_id => journal, :id => bid},:confirm => l(:label_delete_confirm), - :remote => true, :method => 'delete', :class => "delete", :confirm => l(:text_are_you_sure), :title => l(:button_delete)) %> - <%= link_to(l(:label_bid_respond_delete), {:controller => 'words', :action => 'destroy', :object_id => journal, :user_id => @user}, :remote => true, :confirm => l(:text_are_you_sure), :method => 'delete', :class => "delete", :title => l(:button_delete)) %> - <% end %> - -
    + + <%= image_tag(url_to_avatar(journal.user), :class => "avatar") %> + + + + <%= link_to journal.user, user_path(journal.user)%> + + + <% label = l(:label_contest_requirement) %> + +
    <%= textilizable journal.notes%>
    + + <%= l(:label_bids_published) %>  + <%= time_tag(journal.created_on).html_safe %>  + <%= l(:label_bids_published_ago) %> + + + <% ids = 'project_respond_form_'+ journal.id.to_s%> + + + <% if reply_allow %> + <%#= link_to(l(:button_quote), {:controller => 'contests', :action => 'new', :id => contest, :journal_id => journal}, :remote => true, :method => 'post', :title => l(:button_quote))%> + <%= link_to(l(:button_quote), + contests_path(:id => contest, + :journal_id => journal), + :remote => true, + :method => 'post', + :title => l(:button_quote)) + %> + <%= link_to l(:label_bid_respond_quote), + '', + {:focus => 'project_respond', + :onclick => "toggleAndSettingWordsVal($('##{ids}'), $('##{ids} textarea'), '#{l(:label_reply_plural)} #{journal.user.show_name}: '); $('##{ids} textarea') ;return false;" + } + %> + <% end %> + + <% if @user==User.current|| User.current.admin? %> + <%#= link_to(l(:label_bid_respond_delete), {:controller => 'bids', :action => 'destroy', :object_id => journal, :id => bid},:confirm => l(:label_delete_confirm), + :remote => true, :method => 'delete', :class => "delete", :confirm => l(:text_are_you_sure), :title => l(:button_delete)) %> + + <%= link_to(l(:label_bid_respond_delete), + + words_destroy_path(:user_id => @user, :object_id => journal), + :remote => true, + :confirm => l(:text_are_you_sure), + :method => 'delete', + :class => "delete", + :title => l(:button_delete)) %> + <% end %> + +
    <% ids = 'project_respond_form_'+ journal.id.to_s%> <% if reply_allow %>
    - <%= render :partial => 'words/new_respond', :locals => {:journal => journal, :m_reply_id => journal} %> + <%= render :partial => 'words/new_respond', + :locals => {:journal => journal, :m_reply_id => journal} + %>
    <% end %>
    diff --git a/app/views/contests/_list_projects.html.erb b/app/views/contests/_list_projects.html.erb index 10086e5a3..fec4cf24c 100644 --- a/app/views/contests/_list_projects.html.erb +++ b/app/views/contests/_list_projects.html.erb @@ -26,8 +26,9 @@
- <%= l(:label_system_grade) %>:<%= (c_project.project.project_status.nil? ? 0.0 : c_project.project.project_status.grade) unless (c_project.project.project_status.nil? && c_project.project.nil?) %> - <% if get_prize(c_project).nil? or get_prize(c_project) == "" %> + <%= l(:label_system_grade) %>: + <%= (c_project.project.project_status.nil? ? 0.0 : c_project.project.project_status.grade) unless (c_project.project.project_status.nil? && c_project.project.nil?) %> + <% if get_prize(c_project).nil? || get_prize(c_project) == "" %> <% if @contest.deadline < Date.today %> <%= l(:label_noawards)%> <% end %> diff --git a/app/views/contests/_list_softapplications.html.erb b/app/views/contests/_list_softapplications.html.erb index 89e8a3172..40a6f1cb2 100644 --- a/app/views/contests/_list_softapplications.html.erb +++ b/app/views/contests/_list_softapplications.html.erb @@ -6,7 +6,10 @@
<%=l(:label_softapplication)%>: - <%= link_to(c_softapplication.softapplication.name, softapplication_path(c_softapplication.softapplication), :target => '_blank') %> + <%= link_to(c_softapplication.softapplication.name, + softapplication_path(c_softapplication.softapplication), + :target => '_blank') + %>
- + + + +
<%= f.text_area 'message', :rows => 3, :cols => 65, :placeholder => l(:label_my_respond), :style => "resize: none;", :class => 'noline'%> + <%= f.text_area 'message', + :rows => 3, + :cols => 65, + :placeholder => l(:label_my_respond), + :style => "resize: none;", + :class => 'noline' + %> +
@@ -39,8 +50,23 @@ - + + +
<%= submit_tag l(:button_leave_meassge), :name => nil , :class => "contest_btn", :onmouseout => "this.style.backgroundPosition = 'left top'", :onmouseover => "this.style.backgroundPosition = 'left -31px'"%> - <%= submit_tag l(:button_clear_meassge), :name => nil, :onclick => "clearMessage('contest_message_message');", :type => 'button', :class => "bid_btn", :onmouseout => "this.style.backgroundPosition = 'left top'", :onmouseover => "this.style.backgroundPosition = 'left -31px'" %> + <%= submit_tag l(:button_leave_meassge), + :name => nil , + :class => "contest_btn", + :onmouseout => "this.style.backgroundPosition = 'left top'", + :onmouseover => "this.style.backgroundPosition = 'left -31px'" + %> + <%= submit_tag l(:button_clear_meassge), + :name => nil, + :onclick => "clearMessage('contest_message_message');", + :type => 'button', :class => "bid_btn", + :onmouseout => "this.style.backgroundPosition = 'left top'", + :onmouseover => "this.style.backgroundPosition = 'left -31px'" + %> +
diff --git a/app/views/contests/_new_join.html.erb b/app/views/contests/_new_join.html.erb index 3b0cff690..fc638d218 100644 --- a/app/views/contests/_new_join.html.erb +++ b/app/views/contests/_new_join.html.erb @@ -50,8 +50,17 @@ <%= text_field_tag 'contest_password', nil, :size => 45 %>

- <%= submit_tag l(:label_new_join), :name => nil, :class => "contest_btn", :onclick => "hideModal(this);" %> - <%= submit_tag l(:button_cancel), :name => nil, :class => "contest_btn", :onclick => "hideModal(this);", :type => 'button' %> + <%= submit_tag l(:label_new_join), + :name => nil, :class => "contest_btn", + :onclick => "hideModal(this);" + %> + <%= submit_tag l(:button_cancel), + :name => nil, + :class => "contest_btn", + :onclick => "hideModal(this);", + :type => 'button' + %> +

<% end %> diff --git a/app/views/contests/_new_softapplication.html.erb b/app/views/contests/_new_softapplication.html.erb index e8b0a32cd..71e5d0568 100644 --- a/app/views/contests/_new_softapplication.html.erb +++ b/app/views/contests/_new_softapplication.html.erb @@ -1,184 +1,232 @@ -<%#= error_messages_for 'softapplication' %> - - - -<%= form_for Softapplication.new, :url => softapplications_path do |f| %> -
- <%= hidden_field_tag 'contest_id', @contest.id %> -
<%= f.text_field :name, :required => true, :size => 60, :style => "width:320px;", :onblur => "regexName();" %>
- <%= f.text_field :android_min_version_available, :required => true, :size => 60, :style => "width:320px;", :onblur=>"regexWorkdescription();"%> -
- - <%#= select_tag 'app_type_name', work_type_opttion, {:name => 'app_type_name',:style => "width:358px;"} %> - - <%= f.select :app_type_name,work_type_opttion, {},{:style => "width:328px;",:onchange => "selectChange(this)"} %> - <%#= f.text_field :app_type_name, :required => true, :size => 60, :style => "width:400px;" %> -
<%= f.text_field :description, :required => true, :size => 60, :style => "width:320px;" %>
<%= f.text_field :application_developers, :required => true, :size => 60, :style => "width:320px;", :onblur => 'regexDevelopers();' %>
+ <%= f.text_field :name, + :required => true, + :size => 60, + :style => "width:320px;", + :onblur => "regexName();" + %> +
+ <%= f.text_field :android_min_version_available, + :required => true, + :size => 60, + :style => "width:320px;", + :onblur=>"regexWorkdescription();" + %> +
+ + <%#= select_tag 'app_type_name', work_type_opttion, {:name => 'app_type_name',:style => "width:358px;"} %> + + <%= f.select :app_type_name,work_type_opttion, + {}, + {:style => "width:328px;",:onchange => "selectChange(this)"} %> + <%#= f.text_field :app_type_name, :required => true, :size => 60, :style => "width:400px;" %> +
+ <%= f.text_field :description, + :required => true, + :size => 60, + :style => "width:320px;" + %> +
+ <%= f.text_field :application_developers, + :required => true, + :size => 60, + :style => "width:320px;", + :onblur => 'regexDevelopers();' + %> +
<%= textilizable content %>
<%= hidden_field_tag 'reference_content', params[:reference_content], :value => content%> + <%= hidden_field_tag 'reference_content', + params[:reference_content], + :value => content + %> +
<% end %> diff --git a/app/views/contests/_project_list.html.erb b/app/views/contests/_project_list.html.erb index 325e87105..33e884020 100644 --- a/app/views/contests/_project_list.html.erb +++ b/app/views/contests/_project_list.html.erb @@ -2,7 +2,9 @@ <%= render_flash_messages %> - + <% if User.current.logged? %>
<%= l(:label_bidding_project) %>(<%= contesting_project.count%>) + <%= l(:label_bidding_project) %>(<%= contesting_project.count%>) +
@@ -12,4 +14,6 @@ <% end %>
-<%= render :partial=> "list_projects",:locals => {:contesting_project => contesting_project,:contest => @contest }%> +<%= render :partial=> "list_projects", + :locals => {:contesting_project => contesting_project,:contest => @contest } +%> diff --git a/app/views/contests/_softapplication_list.html.erb b/app/views/contests/_softapplication_list.html.erb index e5d030123..d93923d72 100644 --- a/app/views/contests/_softapplication_list.html.erb +++ b/app/views/contests/_softapplication_list.html.erb @@ -2,14 +2,23 @@ <%= render_flash_messages %> - + <% if User.current.logged? %> <% end %>
<%= l(:label_contest_softapplication) %>(<%= @contest.contesting_softapplications.count%>) + <%= l(:label_contest_softapplication) %> + (<%= @contest.contesting_softapplications.count%>) +
- <%= link_to l(:button_contesting_as_application), "javascript:void(0);", onclick: "$('#put-bid-form').toggle();" %> + <%= link_to l(:button_contesting_as_application), + "javascript:void(0);", + onclick: "$('#put-bid-form').toggle();" + %>
-<%= render :partial=> "list_softapplications",:locals => {:contesting_softapplication => contesting_softapplication,:contest => @contest }%> +<%= render :partial=> "list_softapplications", + :locals => {:contesting_softapplication => contesting_softapplication, + :contest => @contest } +%> diff --git a/app/views/contests/index.html.erb b/app/views/contests/index.html.erb index 6f8430ca0..60608fd89 100644 --- a/app/views/contests/index.html.erb +++ b/app/views/contests/index.html.erb @@ -6,22 +6,44 @@
<%= l(:label_user_location) %> : <% if User.current.logged? %> - <% unless User.current.user_extensions.identity == 1 %> - <%= link_to(l(:label_newtype_contest), {:controller => 'contests', :action => 'new_contest'}, :class => 'icon icon-add', :target => "_blank") %> - <% end %> + <% unless User.current.user_extensions.identity == 1 %> + + <%= link_to(l(:label_newtype_contest), contest_new_contest_path, :class => 'icon icon-add', :target => "_blank") %> + + <% end %> <% end %>
<%= link_to request.host()+"/contests", :controller => 'contests', :action => 'index' %> <%=link_to l(:field_homepage), home_path %> > <%=link_to l(:label_contest_innovate), :controller => 'contests', :action => 'index' %> + + + <%= link_to request.host()+"/contests", contests_path %> + + + + <%=link_to l(:field_homepage), home_path %> > + + <%=link_to l(:label_contest_innovate), :controller => 'contests', :action => 'index' %> + +
<% end %> diff --git a/app/views/contests/new_contest.html.erb b/app/views/contests/new_contest.html.erb index 7366b4203..019c8c1db 100644 --- a/app/views/contests/new_contest.html.erb +++ b/app/views/contests/new_contest.html.erb @@ -1,10 +1,12 @@

<%=l(:label_newtype_contest)%>

-<%= labelled_form_for @contest, :url => {:controller => 'contests', :action => 'create_contest'}, method: :post do |f| %> +<%= labelled_form_for @contest, + :url => {:controller => 'contests', :action => 'create_contest'}, + method: :post do |f| %>
- <%= render :partial => 'form_contest', :locals => { :f => f } %> - <%= submit_tag l(:button_create) %> - <%= javascript_tag "$('#bid_name').focus();" %> - <% end %> + <%= render :partial => 'form_contest', :locals => { :f => f } %> + <%= submit_tag l(:button_create) %> + <%= javascript_tag "$('#bid_name').focus();" %> + <% end %>
\ No newline at end of file diff --git a/app/views/contests/set_reward_project.js.erb b/app/views/contests/set_reward_project.js.erb index c0de3e2ef..2ea06abb1 100644 --- a/app/views/contests/set_reward_project.js.erb +++ b/app/views/contests/set_reward_project.js.erb @@ -1,26 +1,27 @@ + $('#reward_result_<%= @contesting_project_id %>').html('<%= j( -if get_prize(@c_p).nil? or get_prize(@c_p) == "" +if get_prize(@c_p).nil? || get_prize(@c_p) == "" if @contest.deadline < Date.today puts '未评奖' end else case get_prize(@c_p) - when '-1' - image_tag("/images/bid/special_reward.png") - when '0' - image_tag("/images/bid/first_reward.png") - when '1' - image_tag("/images/bid/second_reward.png") - when '2' - image_tag("/images/bid/third_reward.png") - when '3' - image_tag("/images/bid/forth_reward.png") - when '4' - image_tag("/images/bid/fifth_reward.png") - when '5' - image_tag("/images/bid/qualified.png") + when '-1' + image_tag("/images/bid/special_reward.png") + when '0' + image_tag("/images/bid/first_reward.png") + when '1' + image_tag("/images/bid/second_reward.png") + when '2' + image_tag("/images/bid/third_reward.png") + when '3' + image_tag("/images/bid/forth_reward.png") + when '4' + image_tag("/images/bid/fifth_reward.png") + when '5' + image_tag("/images/bid/qualified.png") end end diff --git a/app/views/contests/set_reward_softapplication.js.erb b/app/views/contests/set_reward_softapplication.js.erb index a8cf0d486..2906d95d3 100644 --- a/app/views/contests/set_reward_softapplication.js.erb +++ b/app/views/contests/set_reward_softapplication.js.erb @@ -1,26 +1,28 @@ + $('#reward_result_<%= @contesting_softapplication_id %>').html('<%= j( -if get_prize(@c_sa).nil? or get_prize(@c_sa) == "" + +if get_prize(@c_sa).nil? || get_prize(@c_sa) == "" if @contest.deadline < Date.today puts '未评奖' end else case get_prize(@c_sa) - when '-1' - image_tag("/images/bid/special_reward.png") - when '0' - image_tag("/images/bid/first_reward.png") - when '1' - image_tag("/images/bid/second_reward.png") - when '2' - image_tag("/images/bid/third_reward.png") - when '3' - image_tag("/images/bid/forth_reward.png") - when '4' - image_tag("/images/bid/fifth_reward.png") - when '5' - image_tag("/images/bid/qualified.png") + when '-1' + image_tag("/images/bid/special_reward.png") + when '0' + image_tag("/images/bid/first_reward.png") + when '1' + image_tag("/images/bid/second_reward.png") + when '2' + image_tag("/images/bid/third_reward.png") + when '3' + image_tag("/images/bid/forth_reward.png") + when '4' + image_tag("/images/bid/fifth_reward.png") + when '5' + image_tag("/images/bid/qualified.png") end end diff --git a/app/views/contests/settings.html.erb b/app/views/contests/settings.html.erb index a2780f060..4f8b8b0f2 100644 --- a/app/views/contests/settings.html.erb +++ b/app/views/contests/settings.html.erb @@ -1,6 +1,7 @@

-

<%=l(:label_contest_settings)%><%=l(:label_contest_settings)%> <%= image_tag(url_to_avatar(user), :class => "avatar") %> - - + - <%= l(:label_work_name) %> - * : - (<%= l(:label_workname_lengthlimit) %>) -
-
-
- - - <%= l(:label_running_platform) %> - * : - (<%= l(:label_workdescription_lengthlimit) %>) - -
-
-
- - - <%= l(:label_work_type) %> - * : - - -
-
-
- - - <%= l(:label_work_description) %> - * : - - -
-
-
- - - <%= l(:label_softapplication_developers) %> - * : - (<%= l(:label_workdescription_lengthlimit) %>) - -
-
-
- - - <%= l(:label_work_deposit_project) %>: - <%= select_tag 'project', options_for_select(select_option_helper(@option),@softapplication.project_id), :name => 'project', :class => 'grayline3' %> - <%#= link_to '创建项目', new_project_path(course: 0, project_type: 0), :target=>'_blank'%> - -
-
-
- - - -
-

- <% options = {:author => true, :deletable => true} %> - - <%= render :partial => 'attachments/links', - :locals => {:attachments => @softapplication.attachments, :options => options} %> - -

- <%=l(:label_upload_softworkpacket_photo)%> - <%= render_flash_messages %> -

- <%= render :partial => 'attachments/form' %> -

-

1、<%=l(:label_upload_softapplication_packets_mustpacketed)%>
2、<%=l(:label_upload_softapplication_photo_condition)%>

- - -
-
-
<%= submit_tag l(:button_create), :onclick => "return true" %>
-<% end %> - + +<%= form_for(softapplication) do |f| %> + + <% if softapplication.errors.any? %> +
+

<%= pluralize(softapplication.errors.count, "error") %> prohibited this softapplication from being saved:

+ +
    + <% softapplication.errors.full_messages.each do |msg| %> +
  • <%= msg %>
  • + <% end %> +
+
+ <% end %> +
+ +
+ <%= l(:label_work_name) %> + * : + (<%= l(:label_workname_lengthlimit) %>) +
+
+
+ + + <%= l(:label_running_platform) %> + * : + (<%= l(:label_workdescription_lengthlimit) %>) + +
+
+
+ + + <%= l(:label_work_type) %> + * : + + +
+
+
+ + + <%= l(:label_work_description) %> + * : + + +
+
+
+ + + <%= l(:label_softapplication_developers) %> + * : + (<%= l(:label_workdescription_lengthlimit) %>) + +
+
+
+ + + <%= l(:label_work_deposit_project) %>: + <%= select_tag 'project', options_for_select(select_option_helper(@option),@softapplication.project_id), :name => 'project', :class => 'grayline3' %> + <%#= link_to '创建项目', new_project_path(course: 0, project_type: 0), :target=>'_blank'%> + +
+
+
+ + + +
+

+ <% options = {:author => true, :deletable => true} %> + + <%= render :partial => 'attachments/links', + :locals => {:attachments => @softapplication.attachments, :options => options} %> + +

+ <%=l(:label_upload_softworkpacket_photo)%> + <%= render_flash_messages %> +

+ <%= render :partial => 'attachments/form' %> +

+

1、<%=l(:label_upload_softapplication_packets_mustpacketed)%>
2、<%=l(:label_upload_softapplication_photo_condition)%>

+ + +
+
+
<%= submit_tag l(:button_create), :onclick => "return true" %>
+<% end %> + diff --git a/app/views/stores/index.html.erb b/app/views/stores/index.html.erb index 6984169d7..5df6ecca8 100644 --- a/app/views/stores/index.html.erb +++ b/app/views/stores/index.html.erb @@ -2,9 +2,9 @@ <%= render 'search_bar' %> <% end %> -
+
<% @attach_array.each do |k|%> -
+

<%= @str_arr.shift %>

@@ -64,5 +64,8 @@ $(this).find('img').attr("src", "/images/button/download.png") }); }); + if(navigator.appName=="Microsoft Internet Explorer"){ + $("#IE_resource_sum_css").children(".line_block").css("width","45%"); + } }); \ No newline at end of file diff --git a/app/views/tags/_show_contests.html.erb b/app/views/tags/_show_contests.html.erb index 891f65901..4eded773a 100644 --- a/app/views/tags/_show_contests.html.erb +++ b/app/views/tags/_show_contests.html.erb @@ -1,15 +1,15 @@ -
- <% if contests_results.try(:size).to_i > 0 %> -
- <% contests_results.each do |contest| %> -

- <%= l(:label_tags_contest) %>:<%= link_to "#{contest.name}", - :controller => "contests",:action => "show_contest",:id => contest.id %> -
- <%= l(:label_tags_contest_description) %>:<%= contest.description %> - <%= contest.updated_on %> -

-
- <% end %> - <% end %> -
+
+ <% if contests_results.try(:size).to_i > 0 %> +
+ <% contests_results.each do |contest| %> +

+ <%= l(:label_tags_contest) %>:<%= link_to "#{contest.name}", + :controller => "contests",:action => "show_contest",:id => contest.id %> +
+ <%= l(:label_tags_contest_description) %>:<%= contest.description %> + <%= contest.updated_on %> +

+
+ <% end %> + <% end %> +
diff --git a/app/views/users/_score_new_index.html.erb b/app/views/users/_score_new_index.html.erb index 733088067..e50b240fd 100644 --- a/app/views/users/_score_new_index.html.erb +++ b/app/views/users/_score_new_index.html.erb @@ -1,14 +1,14 @@ - -<% option_num = get_option_number(@user,1) %> -
<%= l(:label_user_score) %>
-
= <%= l(:label_user_score_of_collaboration) %> + <%= l(:label_user_score_of_influence) %> + - <%= l(:label_user_score_of_skill)%> + <%= l(:label_user_score_of_active) %>
- -
= <%= format("%.2f" ,collaboration(option_num)).to_i %> + <%= format("%.2f" , influence(option_num) ).to_i %> - + <%= "(" if skill(option_num) < 0 %> <%= format("%.2f" , skill(option_num)).to_i %> <%= ")" if skill(option_num) < 0 %> + <%= format("%.2f" , active(option_num)).to_i %>
- <% if (format("%.2f" ,collaboration(option_num)).to_i + format("%.2f" , influence(option_num) ).to_i + format("%.2f" , skill(option_num)).to_i + format("%.2f" , active(option_num)).to_i) < 0 %> -
<%= l(:label_score_less_than_zero) %>
- <% else %> -
= <%= format("%.2f" ,option_num.total_score).to_i %>
- <% end %> - + +<% option_num = get_option_number(@user,1) %> +
<%= l(:label_user_score) %>
+
= <%= l(:label_user_score_of_collaboration) %> + <%= l(:label_user_score_of_influence) %> + + <%= l(:label_user_score_of_skill)%> + <%= l(:label_user_score_of_active) %>
+ +
= <%= format("%.2f" ,collaboration(option_num)).to_i %> + <%= format("%.2f" , influence(option_num) ).to_i %> + + <%= "(" if skill(option_num) < 0 %> <%= format("%.2f" , skill(option_num)).to_i %> <%= ")" if skill(option_num) < 0 %> + <%= format("%.2f" , active(option_num)).to_i %>
+ <% if (format("%.2f" ,collaboration(option_num)).to_i + format("%.2f" , influence(option_num) ).to_i + format("%.2f" , skill(option_num)).to_i + format("%.2f" , active(option_num)).to_i) < 0 %> +
<%= l(:label_score_less_than_zero) %>
+ <% else %> +
= <%= format("%.2f" ,option_num.total_score).to_i %>
+ <% end %> + diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index 9bac6f886..551f7e724 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -1,336 +1,336 @@ - <% if User.current.id == @user.id %> - -
- <%= form_tag(:controller => 'users', :action => "show") do %> -
<%= content_tag "div", link_to_user(user), :class => "project_avatar_name" %> + + + <%= content_tag "div", link_to_user(user), :class => "project_avatar_name" %> +

<% unless user.memberships.empty? %> diff --git a/app/views/contests/show_participator.html.erb b/app/views/contests/show_participator.html.erb index da51aef3a..9c829b9f2 100644 --- a/app/views/contests/show_participator.html.erb +++ b/app/views/contests/show_participator.html.erb @@ -1,5 +1,9 @@ -

<%=link_to l(:label_x_join_in_contest, :count => @contest.join_in_contests.count)+"("+@contest.join_in_contests(@user.id).count.to_s+")", :controller=>"contests", :action=>"show_participator"%>

+

+ <%=link_to l(:label_x_join_in_contest, :count => @contest.join_in_contests.count)+"("+@contest.join_in_contests(@user.id).count.to_s+")", + show_participator_contest_path + %> +

<% for temp in @contest.join_in_contests %> <% user = temp.user %> diff --git a/app/views/contests/show_project.html.erb b/app/views/contests/show_project.html.erb index 3e759cfc1..84dfbbbc2 100644 --- a/app/views/contests/show_project.html.erb +++ b/app/views/contests/show_project.html.erb @@ -60,15 +60,28 @@ <% end %>
- <%= render :partial => 'project_list', :locals => {:contesting_project => @contesting_project,:contest => @contest} %> + <%= render :partial => 'project_list', + :locals => {:contesting_project => @contesting_project,:contest => @contest} + %>
diff --git a/app/views/contests/show_softapplication.html.erb b/app/views/contests/show_softapplication.html.erb index d12a70e35..7bb4b0231 100644 --- a/app/views/contests/show_softapplication.html.erb +++ b/app/views/contests/show_softapplication.html.erb @@ -60,15 +60,29 @@
-
-
- - <% if(@project.project_type==1)%> - <%= content_tag('span', "#{l(:field_tea_name)}: ") %> - <% else %> - <%= content_tag('span', "#{l(:default_role_manager)}: ") %> - <% end %> - <% @admin = @project.project_infos%> - - <% if @admin.size > Setting.show_tags_length.to_i then %> - <% i = 0 %> - <% until i>Setting.show_tags_length.to_i do %> - <%= link_to @admin[i].user.name, user_path(@admin[i].user_id) %> - <% i += 1 %> - <% end %> - <%= link_to l(:label_more_tags), member_project_path(@project) %> - <% else %> - <%= content_tag('a', @admin.collect{|u| link_to(u.user.name, user_path(u.user_id))}.join(", ").html_safe) %> - <% end %> - - <%# if @admin.size > 0 %> - <%#= content_tag('a', @admin.collect{|u| link_to(u.user.name, user_path(u.user_id))}.join(", ").html_safe) %> - <%# end %> - <% if(@project.project_type==1)%> -    <%= l(:label_course_college) %>: - <%if @admin&&@admin.first&&@admin.first.user&&@admin.first.user.user_extensions%> - <%= @admin.first.user.user_extensions.occupation %> - <% end %> - <% end %> -
-
- <%= content_tag('span', "#{l(:label_create_time)}: ") %><%= content_tag('span', format_time(@project.created_on)) %> -
- - -
- - <% if @project.project_type !=1 %> - <%= l(:label_project_grade)%>: - - <%= link_to(format("%.2f" , red_project_scores(@project) ).to_i, - {:controller => 'projects', - :action => 'show_projects_score', - :remote => true, :id => @project.id}, :style=>"color: #EC6300;") %> - - <% end %> -
- - - - - - -
-
- -
- - <%= image_tag( "/images/sidebar/tags.png") %> - - <%= render :partial => 'tags/tag_name', :locals => {:obj => @project,:object_flag => "2",:non_list_all => true }%> - -
-
+ +
+
+ <% if(@project.project_type==1)%> + <% if get_avatar?(project)%> + <%= image_tag(url_to_avatar(project), :class => "avatar2") %> + <% else %> + <%= image_tag('../images/avatars/Project/course.jpg', :class => "avatar2") %> + <% end %> + <% else %> + <%= image_tag(url_to_avatar(project), :class => "avatar2") %> +
+
+

+ <%= textilizable(project.short_description.strip, :project => project) %> +

+
+ +
+

+ + + + + + + + + + + + + + + + + +
+ <%= link_to @project.watcher_users.count, project_watcherlist_path(project)%> + + <%= content_tag('span', l(:label_x_follow_people,:count =>@project.watcher_users.count)) %> +
+ <%= link_to "#{@project.members.count}", project_member_path(@project)%> + + <%= content_tag('span', l(:label_x_current_contributors, :count => @project.users.count)) %> +
+ <%= content_tag('span', "#{(@project.repository.nil? || @project.repository.changesets[0].nil?) ? '0' : distance_of_time_in_words(Time.now, @project.repository.changesets[0].committed_on)}", :class => "info") %> + + <%= content_tag('span', l(:label_since_last_commits)) %> +
+ + <%= content_tag('span', "#{get_project_score(@project).nil? ? 0:get_project_score(@project).changeset_num}", :class => "info") %> + + <%= content_tag('span', l(:label_commit_on)) %> +
+

+
+ <% end %> + <% if(@project.project_type==1)%> +
+
+

+ <%= textilizable(project.short_description, :project => project) %> +

+
+ +
+ +

+ <%= content_tag('span', link_to("#{@project.homeworks.count}", homework_project_path(@project)), :class => "info") %><%= content_tag('span', l(:label_x_task, :count => @project.homeworks.count)) %> +

+

+ <%= content_tag('span', link_to("#{@project.members.count}", member_project_path(@project)), :class => "info") %><%= content_tag('span', l(:label_x_member, :count => @project.members.count)) %> +

+

+ <% files_count = @project.attachments.count %> + <% @project.versions.each do |version| %> + <% files_count += version.attachments.count %> + <% end %> + <%= content_tag('span', link_to(files_count, file_project_path(@project)), :class => "info") %><%= content_tag('span', l(:label_x_data,:count => files_count)) %> +

+ +
+<% end %> + +
+
+
+ + <% if(@project.project_type==1)%> + <%= content_tag('span', "#{l(:field_tea_name)}: ") %> + <% else %> + <%= content_tag('span', "#{l(:default_role_manager)}: ") %> + <% end %> + <% @admin = @project.project_infos%> + + <% if @admin.size > Setting.show_tags_length.to_i then %> + <% i = 0 %> + <% until i>Setting.show_tags_length.to_i do %> + <%= link_to @admin[i].user.name, user_path(@admin[i].user_id) %> + <% i += 1 %> + <% end %> + <%= link_to l(:label_more_tags), member_project_path(@project) %> + <% else %> + <%= content_tag('a', @admin.collect{|u| link_to(u.user.name, user_path(u.user_id))}.join(", ").html_safe) %> + <% end %> + + <%# if @admin.size > 0 %> + <%#= content_tag('a', @admin.collect{|u| link_to(u.user.name, user_path(u.user_id))}.join(", ").html_safe) %> + <%# end %> + <% if(@project.project_type==1)%> +    <%= l(:label_course_college) %>: + <%if @admin&&@admin.first&&@admin.first.user&&@admin.first.user.user_extensions%> + <%= @admin.first.user.user_extensions.occupation %> + <% end %> + <% end %> +
+
+ <%= content_tag('span', "#{l(:label_create_time)}: ") %><%= content_tag('span', format_time(@project.created_on)) %> +
+ + +
+ + <% if @project.project_type !=1 %> + <%= l(:label_project_grade)%>: + + <%= link_to(format("%.2f" , red_project_scores(@project) ).to_i, + {:controller => 'projects', + :action => 'show_projects_score', + :remote => true, :id => @project.id}, :style=>"color: #EC6300;") %> + + <% end %> +
+ + + + + + +
+
+ +
+ + <%= image_tag( "/images/sidebar/tags.png") %> + + <%= render :partial => 'tags/tag_name', :locals => {:obj => @project,:object_flag => "2",:non_list_all => true }%> + +
+
diff --git a/app/views/projects/settings/_members.html.erb b/app/views/projects/settings/_members.html.erb index f1008363c..25f02da0d 100644 --- a/app/views/projects/settings/_members.html.erb +++ b/app/views/projects/settings/_members.html.erb @@ -1,147 +1,147 @@ -<%= error_messages_for 'member' %> -<% - roles = Role.givable.all - if @project.project_type == Project::ProjectType_course - roles = roles[3..5] - else - roles = roles[0..2] - end - members = @project.member_principals.includes(:roles, :principal).all.sort -%> - -
- <% if members.any? %> - - - - - - - <%= call_hook(:view_projects_settings_members_table_header, :project => @project) %> - - - - <% members.each do |member| %> - <% next if member.new_record? %> - - - - - <% if @project.project_type == 1 %> - <% if member.roles.first.to_s == "Manager" %> - - <% else %> - - <% end %> - <% else %> - - <% end %> - - <%= call_hook(:view_projects_settings_members_table_row, {:project => @project, :member => member}) %> - - <% end; reset_cycle %> - -
<%= l(:label_user) %><%= l(:label_role_plural) %>
<%= link_to_user member.principal %> - - <%= h member.roles.sort.collect(&:to_s).join(', ') %> - - <%= form_for(member, {:as => :membership, :remote => true, :url => membership_path(member), - :method => :put, - :html => {:id => "member-#{member.id}-roles-form", :class => 'hol'}} - ) do |f| %> - -

- <% roles.each do |role| %> -
- <% end %>

- <%= hidden_field_tag 'membership[role_ids][]', '' %> -

<%= submit_tag l(:button_change), :class => "small" %> - <%= link_to_function l(:button_cancel), - "$('#member-#{member.id}-roles').show(); $('#member-#{member.id}-roles-form').hide(); return false;" - %>

- <% end %> -
- <%= link_to_function l(:button_edit), - "$('#member-#{member.id}-roles').hide(); $('#member-#{member.id}-roles-form').show(); return false;", - :class => 'icon icon-edit' %> - <%= delete_link membership_path(member), - :remote => true, - :data => (!User.current.admin? && member.include?(User.current) ? {:confirm => l(:text_own_membership_delete_confirmation)} : {}) if member.deletable? %> - - <%= link_to_function l(:button_edit), - "$('#member-#{member.id}-roles').hide(); $('#member-#{member.id}-roles-form').show(); return false;", - :class => 'icon icon-edit' %> - <%= delete_link membership_path(member), - :remote => true, - :data => (!User.current.admin? && member.include?(User.current) ? {:confirm => l(:text_own_membership_delete_confirmation)} : {}) if member.deletable? %> -
- <% else %> -

<%= l(:label_no_data) %>

- <% end %> -
- -
- <% if roles.any? %> - <% if @project.applied_projects.any? %> -
- <%= form_for(@applied_members, {:as => :membership, :url => project_memberships_path(@project), :remote => true, :method => :post}) do |f| %> -
- <%= l(:label_apply_project) %> - -
- <%= render_principals_for_applied_members(@project) %> -
-
- -

<%= l(:label_role_plural) %>: - <% roles.each do |role| %> - - - <% end %>

- -

<%= submit_tag l(:label_approve), :id => 'member-add-submit' %> - <%= submit_tag l(:label_refusal), :name => "refusal_button", :id => 'member-refusal-submit' %> -

-
- <% end %> -
- <% end %> - - <%= form_for(@member, {:as => :membership, :url => project_memberships_path(@project), :remote => true, :method => :post}) do |f| %> -
- <%= l(:label_member_new) %> - -

<%= label_tag "principal_search", l(:label_principal_search) %><%= text_field_tag 'principal_search', nil %>

- <%= javascript_tag "observeSearchfield('principal_search', null, '#{ escape_javascript autocomplete_project_memberships_path(@project, :format => 'js') }')" %> - -
- <%= render_principals_for_new_members(@project) %> -
-
- -

<%= l(:label_role_plural) %>: - <% roles.each do |role| %> - - - <% end %>

- -

<%= submit_tag l(:button_add), :id => 'member-add-submit' %>

-
- <% end %> - <% end %> -
- \ No newline at end of file diff --git a/app/views/projects/show_projects_score.html.erb b/app/views/projects/show_projects_score.html.erb index b16f46f91..7f3f05cce 100644 --- a/app/views/projects/show_projects_score.html.erb +++ b/app/views/projects/show_projects_score.html.erb @@ -1,71 +1,71 @@ - - - - <%= h html_title %> - - - <%= csrf_meta_tag %> - <%= favicon %> - <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2', 'application', 'nyan', :media => 'all' %> - <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %> - <%= javascript_heads %> - <%= heads_for_theme %> - <%= hubspot_head %> - <%= call_hook :view_layouts_base_html_head %> - - <%= yield :header_tags -%> - -<% if @project %> -

<%= l(:label_projects_score) %>

-
- - - - - - -
<%= image_tag(url_to_avatar(@project), :class => 'avatar2') %> - - - -
<%= @project.name %>
-
- - - -
<%= l(:label_projects_score) %>
<%= format("%.2f" , project_scores(@project) ).to_i %>
-
-
- -
-
    -
  • - <%= link_to l(:label_projects_score), {:controller => 'projects', :action => 'show_projects_score', :remote => true}%> : - <%= format("%.2f" , project_scores(@project) ).to_i %> -
  • -
  • - <%= link_to l(:label_issue_score), {:controller => 'projects', :action => 'issue_score_index', :remote => true}%> : - <%= format("%.2f" , issue_score(@project)).to_i %> -
  • -
  • - <%= link_to l(:label_news_score), {:controller => 'projects', :action => 'news_score_index', :remote => true}%> : - <%= format("%.2f" , news_score(@project)).to_i %> -
  • -
  • - <%= link_to l(:label_file_score), {:controller => 'projects', :action => 'file_score_index', :remote => true}%> : - <%= format("%.2f" , documents_score(@project)).to_i %> -
  • -
  • - <%= link_to l(:label_code_submit_score), {:controller => 'projects', :action => 'code_submit_score_index', :remote => true}%> : - <%= format("%.2f" , changesets_score(@project)).to_i %> -
  • -
  • - <%= link_to l(:label_topic_score), {:controller => 'projects', :action => 'projects_topic_score_index', :remote => true}%> : - <%= format("%.2f" , board_message_score(@project)).to_i %> -
  • -
-
-
- <%= render :partial => 'projects/project_score_index', :locals => {:index => 0 } %> -
+ + + + <%= h html_title %> + + + <%= csrf_meta_tag %> + <%= favicon %> + <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2', 'application', 'nyan', :media => 'all' %> + <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %> + <%= javascript_heads %> + <%= heads_for_theme %> + <%= hubspot_head %> + <%= call_hook :view_layouts_base_html_head %> + + <%= yield :header_tags -%> + +<% if @project %> +

<%= l(:label_projects_score) %>

+
+ + + + + + +
<%= image_tag(url_to_avatar(@project), :class => 'avatar2') %> + + + +
<%= @project.name %>
+
+ + + +
<%= l(:label_projects_score) %>
<%= format("%.2f" , project_scores(@project) ).to_i %>
+
+
+ +
+
    +
  • + <%= link_to l(:label_projects_score), {:controller => 'projects', :action => 'show_projects_score', :remote => true}%> : + <%= format("%.2f" , project_scores(@project) ).to_i %> +
  • +
  • + <%= link_to l(:label_issue_score), {:controller => 'projects', :action => 'issue_score_index', :remote => true}%> : + <%= format("%.2f" , issue_score(@project)).to_i %> +
  • +
  • + <%= link_to l(:label_news_score), {:controller => 'projects', :action => 'news_score_index', :remote => true}%> : + <%= format("%.2f" , news_score(@project)).to_i %> +
  • +
  • + <%= link_to l(:label_file_score), {:controller => 'projects', :action => 'file_score_index', :remote => true}%> : + <%= format("%.2f" , documents_score(@project)).to_i %> +
  • +
  • + <%= link_to l(:label_code_submit_score), {:controller => 'projects', :action => 'code_submit_score_index', :remote => true}%> : + <%= format("%.2f" , changesets_score(@project)).to_i %> +
  • +
  • + <%= link_to l(:label_topic_score), {:controller => 'projects', :action => 'projects_topic_score_index', :remote => true}%> : + <%= format("%.2f" , board_message_score(@project)).to_i %> +
  • +
+
+
+ <%= render :partial => 'projects/project_score_index', :locals => {:index => 0 } %> +
<% end %> \ No newline at end of file diff --git a/app/views/repositories/revision.html.erb b/app/views/repositories/revision.html.erb index 7b4934bfa..82b881f7d 100644 --- a/app/views/repositories/revision.html.erb +++ b/app/views/repositories/revision.html.erb @@ -1,97 +1,97 @@ -
- « - <% unless @changeset.previous.nil? -%> - <%= link_to_revision(@changeset.previous, @repository, :text => l(:label_previous)) %> - <% else -%> - <%= l(:label_previous) %> - <% end -%> -| - <% unless @changeset.next.nil? -%> - <%= link_to_revision(@changeset.next, @repository, :text => l(:label_next)) %> - <% else -%> - <%= l(:label_next) %> - <% end -%> - »  - - <%= form_tag({:controller => 'repositories', - :action => 'revision', - :id => @project, - :repository_id => @repository.identifier_param, - :rev => nil}, - :method => :get) do %> - <%= text_field_tag 'rev', @rev, :size => 8 %> - <%= submit_tag l(:label_button_ok), :name => nil %> - <% end %> -
- -

<%= avatar(@changeset.user, :size => "24") %><%= l(:label_revision) %> <%= format_revision(@changeset) %>

- -<% if @changeset.scmid.present? || @changeset.parents.present? || @changeset.children.present? %> - - <% if @changeset.scmid.present? %> - - - - <% end %> - <% if @changeset.parents.present? %> - - - - - <% end %> - <% if @changeset.children.present? %> - - - - - <% end %> -
ID<%= h(@changeset.scmid) %>
<%= l(:label_parent_revision) %> - <%= @changeset.parents.collect{ - |p| link_to_revision(p, @repository, :text => format_revision(p)) - }.join(", ").html_safe %> -
<%= l(:label_child_revision) %> - <%= @changeset.children.collect{ - |p| link_to_revision(p, @repository, :text => format_revision(p)) - }.join(", ").html_safe %> -
-<% end %> - -

- -<%= authoring(@changeset.committed_on, @changeset.author) %> - -

- -<%= textilizable @changeset.comments %> - -<% if @changeset.issues.visible.any? || User.current.allowed_to?(:manage_related_issues, @repository.project) %> - <%= render :partial => 'related_issues' %> -<% end %> - -<% if User.current.allowed_to?(:browse_repository, @project) %> -

<%= l(:label_attachment_plural) %>

-
    -
  • <%= l(:label_added) %>
  • -
  • <%= l(:label_modified) %>
  • -
  • <%= l(:label_copied) %>
  • -
  • <%= l(:label_renamed) %>
  • -
  • <%= l(:label_deleted) %>
  • -
- -

<%= link_to(l(:label_view_diff), - :action => 'diff', - :id => @project, - :repository_id => @repository.identifier_param, - :path => "", - :rev => @changeset.identifier) if @changeset.filechanges.any? %>

- -
-<%= render_changeset_changes %> -
-<% end %> - -<% content_for :header_tags do %> -<%= stylesheet_link_tag "scm" %> -<% end %> - -<% html_title("#{l(:label_revision)} #{format_revision(@changeset)}") -%> +
+ « + <% unless @changeset.previous.nil? -%> + <%= link_to_revision(@changeset.previous, @repository, :text => l(:label_previous)) %> + <% else -%> + <%= l(:label_previous) %> + <% end -%> +| + <% unless @changeset.next.nil? -%> + <%= link_to_revision(@changeset.next, @repository, :text => l(:label_next)) %> + <% else -%> + <%= l(:label_next) %> + <% end -%> + »  + + <%= form_tag({:controller => 'repositories', + :action => 'revision', + :id => @project, + :repository_id => @repository.identifier_param, + :rev => nil}, + :method => :get) do %> + <%= text_field_tag 'rev', @rev, :size => 8 %> + <%= submit_tag l(:label_button_ok), :name => nil %> + <% end %> +
+ +

<%= avatar(@changeset.user, :size => "24") %><%= l(:label_revision) %> <%= format_revision(@changeset) %>

+ +<% if @changeset.scmid.present? || @changeset.parents.present? || @changeset.children.present? %> + + <% if @changeset.scmid.present? %> + + + + <% end %> + <% if @changeset.parents.present? %> + + + + + <% end %> + <% if @changeset.children.present? %> + + + + + <% end %> +
ID<%= h(@changeset.scmid) %>
<%= l(:label_parent_revision) %> + <%= @changeset.parents.collect{ + |p| link_to_revision(p, @repository, :text => format_revision(p)) + }.join(", ").html_safe %> +
<%= l(:label_child_revision) %> + <%= @changeset.children.collect{ + |p| link_to_revision(p, @repository, :text => format_revision(p)) + }.join(", ").html_safe %> +
+<% end %> + +

+ +<%= authoring(@changeset.committed_on, @changeset.author) %> + +

+ +<%= textilizable @changeset.comments %> + +<% if @changeset.issues.visible.any? || User.current.allowed_to?(:manage_related_issues, @repository.project) %> + <%= render :partial => 'related_issues' %> +<% end %> + +<% if User.current.allowed_to?(:browse_repository, @project) %> +

<%= l(:label_attachment_plural) %>

+
    +
  • <%= l(:label_added) %>
  • +
  • <%= l(:label_modified) %>
  • +
  • <%= l(:label_copied) %>
  • +
  • <%= l(:label_renamed) %>
  • +
  • <%= l(:label_deleted) %>
  • +
+ +

<%= link_to(l(:label_view_diff), + :action => 'diff', + :id => @project, + :repository_id => @repository.identifier_param, + :path => "", + :rev => @changeset.identifier) if @changeset.filechanges.any? %>

+ +
+<%= render_changeset_changes %> +
+<% end %> + +<% content_for :header_tags do %> +<%= stylesheet_link_tag "scm" %> +<% end %> + +<% html_title("#{l(:label_revision)} #{format_revision(@changeset)}") -%> diff --git a/app/views/repositories/revisions.html.erb b/app/views/repositories/revisions.html.erb index 321ff72b2..4efc4992a 100644 --- a/app/views/repositories/revisions.html.erb +++ b/app/views/repositories/revisions.html.erb @@ -1,34 +1,34 @@ -
-<%= form_tag( - {:controller => 'repositories', :action => 'revision', :id => @project, - :repository_id => @repository.identifier_param}, - :method => :get - ) do %> - <%= l(:label_revision) %>: <%= text_field_tag 'rev', nil, :size => 8 %> - <%= submit_tag l(:label_button_ok) %> -<% end %> -
- -

<%= l(:label_revision_plural) %>

- -<%= render :partial => 'revisions', - :locals => {:project => @project, - :path => '', - :revisions => @changesets, - :entry => nil } %> - - - -<% content_for :header_tags do %> - <%= stylesheet_link_tag "scm" %> - <%= auto_discovery_link_tag( - :atom, - params.merge( - {:format => 'atom', :page => nil, :key => User.current.rss_key})) %> -<% end %> - -<% other_formats_links do |f| %> - <%= f.link_to 'Atom', :url => {:key => User.current.rss_key} %> -<% end %> - -<% html_title(l(:label_revision_plural)) -%> +
+<%= form_tag( + {:controller => 'repositories', :action => 'revision', :id => @project, + :repository_id => @repository.identifier_param}, + :method => :get + ) do %> + <%= l(:label_revision) %>: <%= text_field_tag 'rev', nil, :size => 8 %> + <%= submit_tag l(:label_button_ok) %> +<% end %> +
+ +

<%= l(:label_revision_plural) %>

+ +<%= render :partial => 'revisions', + :locals => {:project => @project, + :path => '', + :revisions => @changesets, + :entry => nil } %> + + + +<% content_for :header_tags do %> + <%= stylesheet_link_tag "scm" %> + <%= auto_discovery_link_tag( + :atom, + params.merge( + {:format => 'atom', :page => nil, :key => User.current.rss_key})) %> +<% end %> + +<% other_formats_links do |f| %> + <%= f.link_to 'Atom', :url => {:key => User.current.rss_key} %> +<% end %> + +<% html_title(l(:label_revision_plural)) -%> diff --git a/app/views/softapplications/_form.html.erb b/app/views/softapplications/_form.html.erb index 95c61ae27..916b085a0 100644 --- a/app/views/softapplications/_form.html.erb +++ b/app/views/softapplications/_form.html.erb @@ -1,122 +1,122 @@ - -<%= form_for(softapplication) do |f| %> - - <% if softapplication.errors.any? %> -
-

<%= pluralize(softapplication.errors.count, "error") %> prohibited this softapplication from being saved:

- -
    - <% softapplication.errors.full_messages.each do |msg| %> -
  • <%= msg %>
  • - <% end %> -
-
- <% end %> -
- -
<%= f.text_field :name, :required => true, :size => 60, :style => "width:400px;" %>
<%= f.text_field :android_min_version_available, :required => true, :size => 60, :style => "width:400px;" %>
- <%#= f.text_field :app_type_name, :required => true, :size => 60, :style => "width:400px;" %> - <% if work_type_opttion.include?([@softapplication.app_type_name,@softapplication.app_type_name]) %> - <%= f.select :app_type_name,options_for_select(work_type_opttion,@softapplication.app_type_name), {},{:style => "width:410px;",:onchange => "selectChange(this)"} %> - - <% else %> - <%= f.select :app_type_name,options_for_select(work_type_opttion,"其他"), {},{:style => "width:410px;",:onchange => "selectChange(this)"} %> - - <%#= f.text_field :other_input, :required => true, :size => 60, :style => "width:100px;" %> - - - <% end %> -
<%= f.text_field :description, :required => true, :size => 60, :style => "width:400px;" %>
<%= f.text_field :application_developers, :required => true, :size => 60, :style => "width:400px;" %>
<%= f.text_field :name, :required => true, :size => 60, :style => "width:400px;" %>
<%= f.text_field :android_min_version_available, :required => true, :size => 60, :style => "width:400px;" %>
+ <%#= f.text_field :app_type_name, :required => true, :size => 60, :style => "width:400px;" %> + <% if work_type_opttion.include?([@softapplication.app_type_name,@softapplication.app_type_name]) %> + <%= f.select :app_type_name,options_for_select(work_type_opttion,@softapplication.app_type_name), {},{:style => "width:410px;",:onchange => "selectChange(this)"} %> + + <% else %> + <%= f.select :app_type_name,options_for_select(work_type_opttion,"其他"), {},{:style => "width:410px;",:onchange => "selectChange(this)"} %> + + <%#= f.text_field :other_input, :required => true, :size => 60, :style => "width:100px;" %> + + + <% end %> +
<%= f.text_field :description, :required => true, :size => 60, :style => "width:400px;" %>
<%= f.text_field :application_developers, :required => true, :size => 60, :style => "width:400px;" %>
- - - -
- -
- - <% end %> - <% end %> - - <% unless @state == 2 %> - <% unless @activity.empty? %> -
- <% @activity.each do |e| %> - <%# 以下一行代码解决有未知的活动无法转换成Model报错%> - <% (Rails.logger.error "[Error] =========================================================> NameError: uninitialized constant " + e.act_type.to_s; next;) if e.act_type.safe_constantize.nil? %> - <% act = e.act %> - <% unless act.nil? %> - <% if e.act_type == 'JournalsForMessage' || e.act_type == 'Bid' || e.act_type == 'Journal'|| e.act_type == 'Changeset' || e.act_type == 'Message' || e.act_type == 'Principal' || e.act_type == 'News' || e.act_type == 'Issue' || e.act_type == 'Contest'%> - - - - - - -
<%= image_tag(url_to_avatar(e.user), :class => "avatar") %> - - <% case e.act_type %> - <% when 'JournalsForMessage' %> - - - - - - - - - - <% when 'Bid' %> - - <% if act.reward_type == 3 && @show_course == 1%> - - <% else %> - - <% end %> - - - - - - - - <% when 'Journal' %> - - - - - <% if act.notes.nil? %> - <% desStr = '' %> - <% else %> - <% desStr= textAreailizable(act, :notes) %> - <% end %> - - - - - - <% when 'Changeset' %> - - - - - - - - - - <% when 'Message' %> - - - - - - - - - - <% when 'Principal' %> - - - - - - - - - - <% when 'News' %> - - - - - - - - - - <% when 'Issue' %> - - - - - - - - - - <% when 'Contest' %> - - - - - - - - - <% else %> - <%# f=1 %> - <% end %> -
- <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> <%= l(:label_have_feedback) %> - <%= link_to("#{e.act.user.name}", user_path(e.act.user.id)) %><%= l(:label_of_feedback) + l(:label_layouts_feedback) %> -
-

<%= textAreailizable act.notes %>

-
- <%= link_to(l(:label_goto), user_newfeedback_user_path(e.user_id)) %> -
-
-
- <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %> -
-
-
- <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %><%= l(:label_i_new_activity) %> <%= link_to format_activity_title("#{l(:label_active_homework)}##{act.id}:#{act.name}"), respond_path(e.act_id) %> - - <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %><%= l(:label_i_new_activity) %> <%= link_to format_activity_title("#{l(:label_active_call)}##{act.id}:#{act.name}"), respond_path(e.act_id) %> -
-

<%=textAreailizable act, :description %>

-
- <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %> -
-
- <%= link_to l(:label_find_all_comments), respond_path(e.act_id) %><%= l(:label_comments_count, :count => e.act.commit) %> -
-
- <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> <%= l(:label_i_new_activity) %> <%= link_to(l(:label_activity_project)+act.issue.project.name, project_path(act.issue.project.id)) %> <%= link_to format_activity_title("#{act.issue.tracker} ##{act.issue.id}: #{act.issue.subject}"), {:controller => 'issues', :action => 'show', :id => act.issue.id, :anchor => "change-#{act.id}"} %> -

<%= desStr %>

-
-
- <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %> -
-
-
- <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> <%= l(:label_i_new_activity) %> <%= link_to format_activity_title(act.title), {:controller => 'repositories', :action => 'revision', :id => act.repository.project, :repository_id => act.repository.identifier_param, :rev => act.identifier} %> -
-

<%= textAreailizable act,:long_comments %>

-
- <%= format_time(e.act.committed_on) %> -
-
- <%= link_to l(:label_find_all_comments), {:controller => 'repositories', :action => 'revision', :id => act.repository.project, :repository_id => act.repository.identifier_param, :rev => act.identifier} %><%= l(:label_comments_count, :count => e.act.count) %> -
-
- <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> <%= l(:label_i_new_activity) %> <%= link_to format_activity_title("#{act.board.name}: #{act.subject}"), {:controller => 'messages', :action => 'show', :board_id => act.board_id}.merge(act.parent_id.nil? ? {:id => act.id} : {:id => act.parent_id, :r => act.id, :anchor => "message-#{act.id}"}) %> -
-

<%= textAreailizable(act,:content) %>

-
-
- <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %> -
-
-
- <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> <%= l(:label_new_user) %> -

-
- <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %> -
-
-
- <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> <%= l(:label_i_new_activity) %> <%= link_to format_activity_title("#{l(:label_news)}: #{act.title}"), {:controller => 'news', :action => 'show', :id => act.id} %> -
-

<%= textAreailizable act,:description %>

-
- <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %> -
-
- <%= link_to l(:label_find_all_comments), {:controller => 'news', :action => 'show', :id => act.id} %><%= l(:label_comments_count, :count => e.act.comments_count) %> -
-
- - <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> -   - - <%= l(:label_i_new_activity) %> -   - <%= link_to format_activity_title("#{act.source_from} (#{act.status}): #{act.tracker.name} #{act.subject}"), {:controller => 'issues', :action => 'show', :id => act.id} %> -
- <%= textAreailizable act, :description %> -
-
- <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %> -
-
- <%= link_to l(:label_find_all_comments), {:controller => 'issues', :action => 'show', :id => act.id} %><%= l(:label_comments_count, :count => e.act.journals.count) %> -
-
- <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> <%= l(:label_i_new_activity) %> <%= link_to format_activity_title("#{l(:label_contest)}: #{act.name}"), {:controller => 'contests', :action => 'show_contest', :id => act.id} %> -

<%= textAreailizable act, :description %>

-
-
- <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %> -
-
-
- <% end %> - <% end %> - - <% end %> -
- - <% else %> - <% if @user == User.current %> - <%= l(:label_user_activities) %> - <% else %> -

- <%= l(:label_user_activities_other) %> -

- <% end %> - <% end %> - - <% else %> - <% unless @message.empty? %> -
- <% @message.each do |e| -%> - - - - - -
<%= image_tag(url_to_avatar(e.user), :class => "avatar") %> - - - - - - - - - - - -
- <%= link_to(h(e.user), user_path(e.user)) %> - <% if e.instance_of?(JournalsForMessage) %> - <% if e.reply_id == User.current.id %> - <% if e.jour_type == 'Bid' %> - <%= l(:label_in_bids) %><%= link_to(e.jour.name, respond_path(e.jour)) %> <%= l(:label_quote_my_words) %> - <% elsif e.jour_type == 'User' %> - <%= l(:label_in_users) %><%= link_to(e.jour.firstname, feedback_path(e.jour)) %> <%= l(:label_quote_my_words) %> - <% elsif e.jour_type == 'Project' %> - <%= '在'<<%= link_to(e.jour.name, feedback_path(e.jour)) %> <%= l(:label_reply_plural) %> - <% end %> - <% else %> - <%= l(:label_about_requirement) %><%= link_to(e.jour.name, respond_path(e.jour_id)) %> <%= l(:label_have_respond) %> - <% end %> - <% else %> - <% if e.journal_reply.nil? || e.journal_reply.reply_id != User.current.id %> - <%= l(:label_about_issue) %><%= link_to(e.issue.subject, issue_path(e.journalized_id)) %><%= l(:label_have_respond) %> - - <% else %> - <%= l(:label_in_issues) %><%= link_to(e.issue.subject, issue_path(e.issue)) %><%= l(:label_quote_my_words) %> - <% end %> - <% end %> -

<%= textAreailizable e.notes %>

- <%= format_time e.created_on %>
-
- <% end %> -
- - - - <% else %> -

<%= l(:label_no_user_respond_you) %>

- <% end %> - - - <% end %> - + <% if User.current.id == @user.id %> + +
+ <%= form_tag(:controller => 'users', :action => "show") do %> + + <% end %> + <% end %> + + <% unless @state == 2 %> + <% unless @activity.empty? %> +
+ <% @activity.each do |e| %> + <%# 以下一行代码解决有未知的活动无法转换成Model报错%> + <% (Rails.logger.error "[Error] =========================================================> NameError: uninitialized constant " + e.act_type.to_s; next;) if e.act_type.safe_constantize.nil? %> + <% act = e.act %> + <% unless act.nil? %> + <% if e.act_type == 'JournalsForMessage' || e.act_type == 'Bid' || e.act_type == 'Journal'|| e.act_type == 'Changeset' || e.act_type == 'Message' || e.act_type == 'Principal' || e.act_type == 'News' || e.act_type == 'Issue' || e.act_type == 'Contest'%> + + + + + + +
<%= image_tag(url_to_avatar(e.user), :class => "avatar") %> + + <% case e.act_type %> + <% when 'JournalsForMessage' %> + + + + + + + + + + <% when 'Bid' %> + + <% if act.reward_type == 3 && @show_course == 1%> + + <% else %> + + <% end %> + + + + + + + + <% when 'Journal' %> + + + + + <% if act.notes.nil? %> + <% desStr = '' %> + <% else %> + <% desStr= textAreailizable(act, :notes) %> + <% end %> + + + + + + <% when 'Changeset' %> + + + + + + + + + + <% when 'Message' %> + + + + + + + + + + <% when 'Principal' %> + + + + + + + + + + <% when 'News' %> + + + + + + + + + + <% when 'Issue' %> + + + + + + + + + + <% when 'Contest' %> + + + + + + + + + <% else %> + <%# f=1 %> + <% end %> +
+ <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> <%= l(:label_have_feedback) %> + <%= link_to("#{e.act.user.name}", user_path(e.act.user.id)) %><%= l(:label_of_feedback) + l(:label_layouts_feedback) %> +
+

<%= textAreailizable act.notes %>

+
+ <%= link_to(l(:label_goto), user_newfeedback_user_path(e.user_id)) %> +
+
+
+ <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %> +
+
+
+ <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %><%= l(:label_i_new_activity) %> <%= link_to format_activity_title("#{l(:label_active_homework)}##{act.id}:#{act.name}"), respond_path(e.act_id) %> + + <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %><%= l(:label_i_new_activity) %> <%= link_to format_activity_title("#{l(:label_active_call)}##{act.id}:#{act.name}"), respond_path(e.act_id) %> +
+

<%=textAreailizable act, :description %>

+
+ <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %> +
+
+ <%= link_to l(:label_find_all_comments), respond_path(e.act_id) %><%= l(:label_comments_count, :count => e.act.commit) %> +
+
+ <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> <%= l(:label_i_new_activity) %> <%= link_to(l(:label_activity_project)+act.issue.project.name, project_path(act.issue.project.id)) %> <%= link_to format_activity_title("#{act.issue.tracker} ##{act.issue.id}: #{act.issue.subject}"), {:controller => 'issues', :action => 'show', :id => act.issue.id, :anchor => "change-#{act.id}"} %> +

<%= desStr %>

+
+
+ <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %> +
+
+
+ <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> <%= l(:label_i_new_activity) %> <%= link_to format_activity_title(act.title), {:controller => 'repositories', :action => 'revision', :id => act.repository.project, :repository_id => act.repository.identifier_param, :rev => act.identifier} %> +
+

<%= textAreailizable act,:long_comments %>

+
+ <%= format_time(e.act.committed_on) %> +
+
+ <%= link_to l(:label_find_all_comments), {:controller => 'repositories', :action => 'revision', :id => act.repository.project, :repository_id => act.repository.identifier_param, :rev => act.identifier} %><%= l(:label_comments_count, :count => e.act.count) %> +
+
+ <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> <%= l(:label_i_new_activity) %> <%= link_to format_activity_title("#{act.board.name}: #{act.subject}"), {:controller => 'messages', :action => 'show', :board_id => act.board_id}.merge(act.parent_id.nil? ? {:id => act.id} : {:id => act.parent_id, :r => act.id, :anchor => "message-#{act.id}"}) %> +
+

<%= textAreailizable(act,:content) %>

+
+
+ <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %> +
+
+
+ <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> <%= l(:label_new_user) %> +

+
+ <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %> +
+
+
+ <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> <%= l(:label_i_new_activity) %> <%= link_to format_activity_title("#{l(:label_news)}: #{act.title}"), {:controller => 'news', :action => 'show', :id => act.id} %> +
+

<%= textAreailizable act,:description %>

+
+ <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %> +
+
+ <%= link_to l(:label_find_all_comments), {:controller => 'news', :action => 'show', :id => act.id} %><%= l(:label_comments_count, :count => e.act.comments_count) %> +
+
+ + <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> +   + + <%= l(:label_i_new_activity) %> +   + <%= link_to format_activity_title("#{act.source_from} (#{act.status}): #{act.tracker.name} #{act.subject}"), {:controller => 'issues', :action => 'show', :id => act.id} %> +
+ <%= textAreailizable act, :description %> +
+
+ <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %> +
+
+ <%= link_to l(:label_find_all_comments), {:controller => 'issues', :action => 'show', :id => act.id} %><%= l(:label_comments_count, :count => e.act.journals.count) %> +
+
+ <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> <%= l(:label_i_new_activity) %> <%= link_to format_activity_title("#{l(:label_contest)}: #{act.name}"), {:controller => 'contests', :action => 'show_contest', :id => act.id} %> +

<%= textAreailizable act, :description %>

+
+
+ <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %> +
+
+
+ <% end %> + <% end %> + + <% end %> +
+ + <% else %> + <% if @user == User.current %> + <%= l(:label_user_activities) %> + <% else %> +

+ <%= l(:label_user_activities_other) %> +

+ <% end %> + <% end %> + + <% else %> + <% unless @message.empty? %> +
+ <% @message.each do |e| -%> + + + + + +
<%= image_tag(url_to_avatar(e.user), :class => "avatar") %> + + + + + + + + + + + +
+ <%= link_to(h(e.user), user_path(e.user)) %> + <% if e.instance_of?(JournalsForMessage) %> + <% if e.reply_id == User.current.id %> + <% if e.jour_type == 'Bid' %> + <%= l(:label_in_bids) %><%= link_to(e.jour.name, respond_path(e.jour)) %> <%= l(:label_quote_my_words) %> + <% elsif e.jour_type == 'User' %> + <%= l(:label_in_users) %><%= link_to(e.jour.firstname, feedback_path(e.jour)) %> <%= l(:label_quote_my_words) %> + <% elsif e.jour_type == 'Project' %> + <%= '在'<<%= link_to(e.jour.name, feedback_path(e.jour)) %> <%= l(:label_reply_plural) %> + <% end %> + <% else %> + <%= l(:label_about_requirement) %><%= link_to(e.jour.name, respond_path(e.jour_id)) %> <%= l(:label_have_respond) %> + <% end %> + <% else %> + <% if e.journal_reply.nil? || e.journal_reply.reply_id != User.current.id %> + <%= l(:label_about_issue) %><%= link_to(e.issue.subject, issue_path(e.journalized_id)) %><%= l(:label_have_respond) %> + + <% else %> + <%= l(:label_in_issues) %><%= link_to(e.issue.subject, issue_path(e.issue)) %><%= l(:label_quote_my_words) %> + <% end %> + <% end %> +

<%= textAreailizable e.notes %>

+ <%= format_time e.created_on %>
+
+ <% end %> +
+ + + + <% else %> +

<%= l(:label_no_user_respond_you) %>

+ <% end %> + + + <% end %> + diff --git a/app/views/welcome/_course_list.html.erb b/app/views/welcome/_course_list.html.erb index b6dac9022..5fdd8cf3d 100644 --- a/app/views/welcome/_course_list.html.erb +++ b/app/views/welcome/_course_list.html.erb @@ -1,32 +1,32 @@ -<% course_list.map do |course| %> -
  • /,"") %>> -
    - <%= image_tag(get_course_avatar(course), :class => "avatar-4") %> -
    - -
    - - <% unless course.is_public == 1 %> - <%= l(:label_private) %> - <% end %> - <%= link_to(course.name.truncate(30, omission: '...')+":", course_path(course.id), :class => "d-g-blue d-p-project-name", :title => "#{course.name}") %> - - - - <%= link_to(course.try(:teacher).try(:realname), user_path(course.teacher)) %> - <%#=course.try(:teacher).try(:name)%> - -
    -
    - [<%= get_course_term course %>] - <% if (course.school == nil) %> -               - <% else %> - <%= link_to course.school.name.try(:gsub, /(.+)$/, '\1'), options={:action => 'course', :school_id => course.school.id}, html_options={:method => 'get'} %> - <% end %> - (<%= course.members.count %>人) - <%# files_count = course.attachments.count.to_s %> - (<%= link_to "#{course.attachments.count.to_s}份", course_files_path(course) %>资料) -
    -
  • -<% end %> +<% course_list.map do |course| %> +
  • /,"") %>> +
    + <%= image_tag(get_course_avatar(course), :class => "avatar-4") %> +
    + +
    + + <% unless course.is_public == 1 %> + <%= l(:label_private) %> + <% end %> + <%= link_to(course.name.truncate(30, omission: '...')+":", course_path(course.id), :class => "d-g-blue d-p-project-name", :title => "#{course.name}") %> + + + + <%= link_to(course.try(:teacher).try(:realname), user_path(course.teacher)) %> + <%#=course.try(:teacher).try(:name)%> + +
    +
    + [<%= get_course_term course %>] + <% if (course.school == nil) %> +               + <% else %> + <%= link_to course.school.name.try(:gsub, /(.+)$/, '\1'), options={:action => 'course', :school_id => course.school.id}, html_options={:method => 'get'} %> + <% end %> + (<%= course.members.count %>人) + <%# files_count = course.attachments.count.to_s %> + (<%= link_to "#{course.attachments.count.to_s}份", course_files_path(course) %>资料) +
    +
  • +<% end %> diff --git a/app/views/welcome/_more_course.html.erb b/app/views/welcome/_more_course.html.erb index 41934a1ad..54d8ec6ef 100644 --- a/app/views/welcome/_more_course.html.erb +++ b/app/views/welcome/_more_course.html.erb @@ -1,8 +1,8 @@ -<% if User.current.logged?%> - <% if User.current.user_extensions.identity == 0 %> - <%= link_to(l(:label_course_new), {:controller => 'courses', :action => 'new'}, - :class => 'icon icon-add') if User.current.allowed_to?(:add_course,nil, :global => true) %> - <% end %> -<% end %> -     +<% if User.current.logged?%> + <% if User.current.user_extensions.identity == 0 %> + <%= link_to(l(:label_course_new), {:controller => 'courses', :action => 'new'}, + :class => 'icon icon-add') if User.current.allowed_to?(:add_course,nil, :global => true) %> + <% end %> +<% end %> +     <%= link_to "更多>>", {:controller => 'courses', :action => 'index', :school_id => school_id} %> \ No newline at end of file diff --git a/app/views/welcome/contest.html.erb b/app/views/welcome/contest.html.erb index 3554f85dd..4f8350fa2 100644 --- a/app/views/welcome/contest.html.erb +++ b/app/views/welcome/contest.html.erb @@ -111,6 +111,11 @@ fixedBar('backTopBtn' , {autoHidden: true, top : 186}); fixedBar('identifier-pannel' , {autoHidden: false , top : 956 , show : true}); + //修改微信扫码样式布局后添加微信扫码跟随滚动处理 + $(window).scroll(function(){ + var vtop=$(document).scrollTop(); + $("#identifier-pannel").css('top',vtop+"px"); + }) } })(); @@ -191,7 +196,7 @@
    -

    +

    <%=l(:label_notification)%>

    diff --git a/app/views/words/_feedback.html.erb b/app/views/words/_feedback.html.erb index 774ee3b64..48460e449 100644 --- a/app/views/words/_feedback.html.erb +++ b/app/views/words/_feedback.html.erb @@ -22,7 +22,7 @@ <% if User.current.logged? %> <% if journal.user_id==User.current.id|| User.current.admin? %> <%= link_to(l(:button_delete),{:controller => 'words', :action => 'destroyJournal', :object_id => journal.id, :project_id=>@project.id, :page=>@page}, - :remote => true, :title => l(:button_delete)) %> + :remote => true, :title => l(:button_delete), :confirm => l(:text_are_you_sure), :method => 'delete', :class => "delete") %> <% end %> <% end %> diff --git a/config/database.yml.example b/config/database.yml.example deleted file mode 100644 index f4c2470bb..000000000 --- a/config/database.yml.example +++ /dev/null @@ -1,52 +0,0 @@ -# Default setup is given for MySQL with ruby1.9. If you're running Redmine -# with MySQL and ruby1.8, replace the adapter name with `mysql`. -# Examples for PostgreSQL, SQLite3 and SQL Server can be found at the end. -# Line indentation must be 2 spaces (no tabs). - -production: - adapter: mysql2 - database: redmine - host: localhost - username: root - password: "" - encoding: utf8 - -development: - adapter: mysql2 - database: redmine_development - host: 10.107.17.20 - username: root - password: "1234" - encoding: utf8 - -# Warning: The database defined as "test" will be erased and -# re-generated from your development database when you run "rake". -# Do not set this db to the same as development or production. -test: - adapter: mysql2 - database: redmine_test - host: 10.107.17.20 - username: root - password: "1234" - encoding: utf8 - -# PostgreSQL configuration example -#production: -# adapter: postgresql -# database: redmine -# host: localhost -# username: postgres -# password: "postgres" - -# SQLite3 configuration example -#production: -# adapter: sqlite3 -# database: db/redmine.sqlite3 - -# SQL Server configuration example -#production: -# adapter: sqlserver -# database: redmine -# host: localhost -# username: jenkins -# password: jenkins diff --git a/config/locales/en.yml b/config/locales/en.yml index c28dd8555..8ba8402ed 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1,1824 +1,1824 @@ -en: - # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) - direction: ltr - date: - formats: - # Use the strftime parameters for formats. - # When no format has been given, it uses default. - # You can provide other formats here if you like! - default: "%m/%d/%Y" - short: "%b %d" - long: "%B %d, %Y" - - day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday] - abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat] - - # Don't forget the nil at the beginning; there's no such thing as a 0th month - month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December] - abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec] - # Used in date_select and datime_select. - order: - - :year - - :month - - :day - - time: - formats: - default: "%m/%d/%Y %I:%M %p" - time: "%I:%M %p" - short: "%d %b %H:%M" - long: "%B %d, %Y %H:%M" - am: "am" - pm: "pm" - - datetime: - distance_in_words: - half_a_minute: "half a minute" - less_than_x_seconds: - one: "less than 1 second" - other: "less than %{count} seconds" - x_seconds: - one: "1 second" - other: "%{count} seconds" - less_than_x_minutes: - one: "less than a minute" - other: "less than %{count} minutes" - x_minutes: - one: "1 minute" - other: "%{count} minutes" - about_x_hours: - one: "about 1 hour" - other: "about %{count} hours" - x_hours: - one: "1 hour" - other: "%{count} hours" - x_days: - one: "1 day" - other: "%{count} days" - about_x_months: - one: "about 1 month" - other: "about %{count} months" - x_months: - one: "1 month" - other: "%{count} months" - about_x_years: - one: "about 1 year" - other: "about %{count} years" - over_x_years: - one: "over 1 year" - other: "over %{count} years" - almost_x_years: - one: "almost 1 year" - other: "almost %{count} years" - - number: - format: - separator: "." - delimiter: "" - precision: 3 - - human: - format: - delimiter: "" - precision: 3 - storage_units: - format: "%n %u" - units: - byte: - one: "Byte" - other: "Bytes" - kb: "KB" - mb: "MB" - gb: "GB" - tb: "TB" - -# Used in array.to_sentence. - support: - array: - sentence_connector: "and" - skip_last_comma: false - - activerecord: - errors: - template: - header: - one: "1 error prohibited this %{model} from being saved" - other: "%{count} errors prohibited this %{model} from being saved" - messages: - inclusion: "is not included in the list" - exclusion: "is reserved" - invalid: "is invalid" - confirmation: "doesn't match confirmation" - accepted: "must be accepted" - empty: "can't be empty" - blank: "can't be blank" - too_long: "is too long (maximum is %{count} characters)" - too_short: "is too short (minimum is %{count} characters)" - wrong_length: "is the wrong length (should be %{count} characters)" - taken: "has already been taken" - not_a_number: "is not a number" - not_a_date: "is not a valid date" - greater_than: "must be greater than %{count}" - greater_than_or_equal_to: "must be greater than or equal to %{count}" - equal_to: "must be equal to %{count}" - less_than: "must be less than %{count}" - less_than_or_equal_to: "must be less than or equal to %{count}" - odd: "must be odd" - even: "must be even" - greater_than_start_date: "must be greater than start date" - not_same_project: "doesn't belong to the same project" - circular_dependency: "This relation would create a circular dependency" - cant_link_an_issue_with_a_descendant: "An issue cannot be linked to one of its subtasks" - - actionview_instancetag_blank_option: Please select - - attachment_all: "All" - attachment_browse: "Attachment Content Browse" - attachment_sufix_browse: "Attachment Type Browse" - attachment_type: "Attachment Type" - general_text_No: 'No' - general_text_Yes: 'Yes' - general_text_no: 'no' - general_text_yes: 'yes' - general_lang_name: 'English' - general_csv_separator: ',' - general_csv_decimal_separator: '.' - general_csv_encoding: ISO-8859-1 - general_pdf_encoding: UTF-8 - general_first_day_of_week: '7' - - label_approve: Approve - label_refusal: Refusal - notice_account_updated: Account was successfully updated. - notice_account_invalid_creditentials: Invalid user or password - notice_account_password_updated: Password was successfully updated. - notice_account_wrong_password: Wrong password - notice_account_register_done: Account was successfully created. To activate your account, click on the link that was emailed to you. - notice_account_unknown_email: Unknown user. - notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password. - notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you. - notice_account_activated: Your account has been activated. You can now log in. - notice_successful_create: Successful creation. - notice_successful_update: Successful update. - notice_successful_delete: Successful deletion. - notice_failed_delete: Successful failure. - notice_successful_connection: Successful connection. - notice_file_not_found: The page you were trying to access doesn't exist or has been removed. - notice_locking_conflict: Data has been updated by another user. - notice_not_authorized: You are not authorized to access this page. - notice_not_authorized_archived_project: The project you're trying to access has been archived. - notice_email_sent: "An email was sent to %{value}" - notice_email_error: "An error occurred while sending mail (%{value})" - notice_feeds_access_key_reseted: Your RSS access key was reset. - notice_api_access_key_reseted: Your API access key was reset. - notice_failed_to_save_issues: "Failed to save %{count} issue(s) on %{total} selected: %{ids}." - notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." - notice_failed_to_save_members: "Failed to save member(s): %{errors}." - notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit." - notice_account_pending: "Your account was created and is now pending administrator approval." - notice_default_data_loaded: Default configuration successfully loaded. - notice_unable_delete_version: Unable to delete version. - notice_unable_delete_time_entry: Unable to delete time log entry. - notice_issue_done_ratios_updated: Issue done ratios updated. - notice_gantt_chart_truncated: "The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})" - notice_issue_successful_create: "Issue %{id} created." - notice_issue_update_conflict: "The issue has been updated by an other user while you were editing it." - notice_account_deleted: "Your account has been permanently deleted." - notice_user_successful_create: "User %{id} created." - - error_attachment_empty: "error in add file" - error_class_period_only_num: "class period can only digital" - error_can_t_load_default_data: "Default configuration could not be loaded: %{value}" - error_scm_not_found: "The entry or revision was not found in the repository." - error_scm_command_failed: "An error occurred when trying to access the repository: %{value}" - error_scm_annotate: "The entry does not exist or cannot be annotated." - error_scm_annotate_big_text_file: "The entry cannot be annotated, as it exceeds the maximum text file size." - error_issue_not_found_in_project: 'The issue was not found or does not belong to this project' - error_no_tracker_in_project: 'No tracker is associated to this project. Please check the Project settings.' - error_no_default_issue_status: 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").' - error_can_not_delete_custom_field: Unable to delete custom field - error_can_not_delete_tracker: "This tracker contains issues and cannot be deleted." - error_can_not_remove_role: "This role is in use and cannot be deleted." - error_can_not_reopen_issue_on_closed_version: 'An issue assigned to a closed version cannot be reopened' - error_can_not_archive_project: This project cannot be archived - error_issue_done_ratios_not_updated: "Issue done ratios not updated." - error_workflow_copy_source: 'Please select a source tracker or role' - error_workflow_copy_target: 'Please select target tracker(s) and role(s)' - error_unable_delete_issue_status: 'Unable to delete issue status' - error_unable_to_connect: "Unable to connect (%{value})" - error_attachment_too_big: "This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})" - error_session_expired: "Your session has expired. Please login again." - warning_attachments_not_saved: "%{count} file(s) could not be saved." - - mail_subject_lost_password: "Your %{value} password" - mail_body_lost_password: 'To change your password, click on the following link:' - mail_subject_register: "Your %{value} account activation" - mail_body_register: 'To activate your account, click on the following link:' - mail_body_account_information_external: "You can use your %{value} account to log in." - mail_body_account_information: Your account information - mail_subject_account_activation_request: "%{value} account activation request" - mail_body_account_activation_request: "A new user (%{value}) has registered. The account is pending your approval:" - mail_subject_reminder: "%{count} issue(s) due in the next %{days} days" - mail_body_reminder: "%{count} issue(s) that are assigned to you are due in the next %{days} days:" - mail_subject_wiki_content_added: "'%{id}' wiki page has been added" - mail_body_wiki_content_added: "The '%{id}' wiki page has been added by %{author}." - mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated" - mail_body_wiki_content_updated: "The '%{id}' wiki page has been updated by %{author}." - - field_name: Name - field_description: Description - field_summary: Summary - field_is_required: Required - field_firstname: Name - field_lastname: Last name - field_mail: Email - field_job_category: Job category # added by bai - field_filename: File - field_file_dense: File Dense - field_filesize: Size - field_downloads: Downloads - field_author: Author - field_created_on: Created - field_updated_on: Updated - field_closed_on: Closed - field_field_format: Format - field_is_for_all: For all projects - field_possible_values: Possible values - field_regexp: Regular expression - field_min_length: Minimum length - field_max_length: Maximum length - field_value: Value - field_category: Category - field_title: Title - field_project: Project - field_issue: Issue - field_status: Status - field_notes: Notes - field_is_closed: Issue closed - field_is_default: Default value - field_tracker: Tracker - field_subject: Subject - field_due_date: Due date - field_assigned_to: Assignee - field_priority: Priority - field_fixed_version: Target version - field_user: User - field_principal: Principal - field_role: Role - field_homepage: Homepage - field_is_public: Public - field_parent: Subproject of - field_is_in_roadmap: Issues displayed in roadmap - field_login: Account/Email - field_mail_notification: Email notifications - field_admin: Administrator - field_last_login_on: Last connection - field_language: Language - field_effective_date: Date - field_password: Password - field_new_password: New password - field_password_confirmation: Confirmation - field_version: Version - field_type: Type - field_host: Host - field_port: Port - field_account: Account - field_base_dn: Base DN - field_attr_login: Login attribute - field_attr_firstname: Firstname attribute - field_attr_lastname: Lastname attribute - field_attr_mail: Email attribute - field_onthefly: On-the-fly user creation - field_start_date: Start date - field_done_ratio: "% Done" - field_auth_source: Authentication mode - field_hide_mail: Hide my email address - field_comments: Comment - field_url: URL - field_start_page: Start page - field_subproject: Subproject - field_hours: Hours - field_activity: Activity - field_spent_on: Date - field_identifier: Identifier - field_is_filter: Used as a filter - field_issue_to: Related issue - field_delay: Delay - field_assignable: Issues can be assigned to this role - field_redirect_existing_links: Redirect existing links - field_estimated_hours: Estimated time - field_column_names: Columns - field_time_entries: Log time - field_time_zone: Time zone - field_searchable: Searchable - field_default_value: Default value - field_comments_sorting: Display comments - field_parent_title: Parent page - field_editable: Editable - field_watcher: Watcher - field_identity_url: OpenID URL - field_content: Content - field_group_by: Group results by - field_sharing: Sharing - field_parent_issue: Parent task - field_member_of_group: "Assignee's group" - field_assigned_to_role: "Assignee's role" - field_text: Text field - field_visible: Visible - field_warn_on_leaving_unsaved: "Warn me when leaving a page with unsaved text" - field_issues_visibility: Issues visibility - field_is_private: Private - field_commit_logs_encoding: Commit messages encoding - field_scm_path_encoding: Path encoding - field_path_to_repository: Path to repository - field_root_directory: Root directory - field_cvsroot: CVSROOT - field_cvs_module: Module - field_repository_is_default: Main repository - field_multiple: Multiple values - field_auth_source_ldap_filter: LDAP filter - field_core_fields: Standard fields - field_timeout: "Timeout (in seconds)" - field_board_parent: Parent forum - field_private_notes: Private notes - field_inherit_members: Inherit members - - setting_app_title: Application title - setting_app_subtitle: Application subtitle - setting_welcome_text: Welcome text - setting_default_language: Default language - setting_login_required: Authentication required - setting_self_registration: Self-registration - setting_attachment_max_size: Maximum attachment size - setting_issues_export_limit: Issues export limit - setting_mail_from: Emission email address - setting_bcc_recipients: Blind carbon copy recipients (bcc) - setting_plain_text_mail: Plain text mail (no HTML) - setting_host_name: Host name and path - setting_text_formatting: Text formatting - setting_wiki_compression: Wiki history compression - setting_feeds_limit: Maximum number of items in Atom feeds - setting_default_projects_public: New projects are public by default - setting_autofetch_changesets: Fetch commits automatically - setting_sys_api_enabled: Enable WS for repository management - setting_commit_ref_keywords: Referencing keywords - setting_commit_fix_keywords: Fixing keywords - setting_autologin: Autologin - setting_date_format: Date format - setting_time_format: Time format - setting_cross_project_issue_relations: Allow cross-project issue relations - setting_cross_project_subtasks: Allow cross-project subtasks - setting_issue_list_default_columns: Default columns displayed on the issue list - setting_repositories_encodings: Attachments and repositories encodings - setting_emails_header: Email header - setting_emails_footer: Email footer - setting_protocol: Protocol - setting_per_page_options: Objects per page options - setting_user_format: Users display format - setting_activity_days_default: Days displayed on project activity - setting_display_subprojects_issues: Display subprojects issues on main projects by default - setting_enabled_scm: Enabled SCM - setting_mail_handler_body_delimiters: "Truncate emails after one of these lines" - setting_mail_handler_api_enabled: Enable WS for incoming emails - setting_mail_handler_api_key: API key - setting_sequential_project_identifiers: Generate sequential project identifiers - setting_gravatar_enabled: Use Gravatar user icons - setting_gravatar_default: Default Gravatar image - setting_diff_max_lines_displayed: Maximum number of diff lines displayed - setting_file_max_size_displayed: Maximum size of text files displayed inline - setting_repository_log_display_limit: Maximum number of revisions displayed on file log - setting_openid: Allow OpenID login and registration - setting_password_min_length: Minimum password length - setting_new_project_user_role_id: Role given to a non-admin user who creates a project - setting_default_projects_modules: Default enabled modules for new projects - setting_issue_done_ratio: Calculate the issue done ratio with - setting_issue_done_ratio_issue_field: Use the issue field - setting_issue_done_ratio_issue_status: Use the issue status - setting_start_of_week: Start calendars on - setting_rest_api_enabled: Enable REST web service - setting_cache_formatted_text: Cache formatted text - setting_default_notification_option: Default notification option - setting_commit_logtime_enabled: Enable time logging - setting_commit_logtime_activity_id: Activity for logged time - setting_gantt_items_limit: Maximum number of items displayed on the gantt chart - setting_issue_group_assignment: Allow issue assignment to groups - setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues - setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed - setting_unsubscribe: Allow users to delete their own account - setting_session_lifetime: Session maximum lifetime - setting_session_timeout: Session inactivity timeout - setting_thumbnails_enabled: Display attachment thumbnails - setting_thumbnails_size: Thumbnails size (in pixels) - setting_non_working_week_days: Non-working days - setting_jsonp_enabled: Enable JSONP support - setting_default_projects_tracker_ids: Default trackers for new projects - - permission_add_project: Create project - permission_add_subprojects: Create subprojects - permission_edit_project: Edit project - permission_close_project: Close / reopen the project - permission_select_project_modules: Select project modules - permission_manage_members: Manage members - permission_manage_project_activities: Manage project activities - permission_manage_versions: Manage versions - permission_manage_categories: Manage issue categories - permission_view_issues: View Issues - permission_add_issues: Add issues - permission_edit_issues: Edit issues - permission_manage_issue_relations: Manage issue relations - permission_set_issues_private: Set issues public or private - permission_set_own_issues_private: Set own issues public or private - permission_add_issue_notes: Add notes - permission_edit_issue_notes: Edit notes - permission_edit_own_issue_notes: Edit own notes - permission_view_private_notes: View private notes - permission_set_notes_private: Set notes as private - permission_move_issues: Move issues - permission_delete_issues: Delete issues - permission_manage_public_queries: Manage public queries - permission_save_queries: Save queries - permission_view_gantt: View gantt chart - permission_view_calendar: View calendar - permission_view_issue_watchers: View watchers list - permission_add_issue_watchers: Add watchers - permission_delete_issue_watchers: Delete watchers - permission_log_time: Log spent time - permission_view_time_entries: View spent time - permission_edit_time_entries: Edit time logs - permission_edit_own_time_entries: Edit own time logs - permission_manage_news: Manage news - permission_comment_news: Comment news - permission_view_documents: View documents - permission_add_documents: Add documents - permission_edit_documents: Edit documents - permission_delete_documents: Delete documents - permission_manage_files: Manage files - permission_view_files: View files - permission_manage_wiki: Manage wiki - permission_rename_wiki_pages: Rename wiki pages - permission_delete_wiki_pages: Delete wiki pages - permission_view_wiki_pages: View wiki - permission_view_wiki_edits: View wiki history - permission_edit_wiki_pages: Edit wiki pages - permission_delete_wiki_pages_attachments: Delete attachments - permission_protect_wiki_pages: Protect wiki pages - permission_manage_repository: Manage repository - permission_browse_repository: Browse repository - permission_view_changesets: View changesets - permission_commit_access: Commit access - permission_manage_boards: Manage forums - permission_view_messages: View messages - permission_add_messages: Post messages - permission_edit_messages: Edit messages - permission_edit_own_messages: Edit own messages - permission_delete_messages: Delete messages - permission_delete_own_messages: Delete own messages - permission_export_wiki_pages: Export wiki pages - permission_manage_subtasks: Manage subtasks - permission_manage_related_issues: Manage related issues - permission_view_journals_for_messages: View journals messages - permission_view_courses: View courses - permission_new_course: Create course - permission_configure_course: Configure course - permission_close_course: Close/open course - permission_new_assignment: Create assignment - permission_edit_assignment: Edit assignment - permission_delete_assignment: Delete assignment - permission_new_placeholder: Create placeholder - permission_edit_placeholder: Edit placeholder - permission_delete_placeholder: Delete placeholder - permission_commit_content: Commit content - permission_new_course_notify: Create course notify - permission_edit_course_notify: Eidt course notify - permission_delete_course_notify: Delete course notify - permission_view_assignment: View assignment - permission_view_placeholder: View placeholder - permission_view_course_messages: View course messages - permission_view_real_name: View real name - permission_view_students: View students - permission_export_homeworks: Export homeworks - - project_module_issue_tracking: Issue tracking - project_module_time_tracking: Time tracking - project_module_news: News - project_module_documents: Documents - project_module_files: Files - project_module_wiki: Wiki - project_module_repository: Repository - project_module_boards: Forums - project_module_calendar: Calendar - project_module_gantt: Gantt - - label_user: User - label_user_plural: Users - label_user_new: New user - label_user_anonymous: Anonymous - label_project: Project - label_activity_project: 'Project: ' #added by bai - label_project_new: New project - label_project_plural: Projects - label_project_deposit: Projects - label_x_projects: - zero: no projects - one: 1 project - other: "%{count} projects" - label_project_all: All Projects - label_project_latest: Latest projects - label_issue: Issue - label_issue_new: New issue - label_issue_plural: Issues - label_issue_view_all: View all issues - label_issues_by: "Issues by %{value}" - label_issue_added: Issue added - label_issue_updated: Issue updated - label_issue_note_added: Note added - label_issue_status_updated: Status updated - label_issue_priority_updated: Priority updated - label_document: Document - label_document_new: New document - label_document_plural: Documents - label_document_added: Document added - label_document_public_info: "If you don't choose public, only the project's members can see the document." - label_role: Role - label_role_plural: Roles - label_role_new: New role - label_role_and_permissions: Roles and permissions - label_role_anonymous: Anonymous - label_role_non_member: Non member - label_member: Members - label_member_new: New member - label_member_plural: Members - label_tracker: Tracker - label_tracker_plural: Trackers - label_tracker_new: New tracker - label_workflow: Workflow - label_issue_status: Issue status - label_issue_status_plural: Issue statuses - label_issue_status_new: New status - label_issue_category: Issue category - label_issue_category_plural: Issue categories - label_issue_category_new: New category - label_custom_field: Custom field - label_custom_field_plural: Custom fields - label_custom_field_new: New custom field - label_enumerations: Enumerations - label_enumeration_new: New value - label_information: Information - label_information_plural: Information - label_please_login: Please log in - label_register: Sign up - label_login_with_open_id_option: or login with OpenID - label_password_lost: Lost password - label_home: Home - label_my_page: My page - label_my_account: My account - label_my_message: My messages - label_my_projects: My projects - label_my_page_block: My page block - label_administration: Administration - label_login: Login - label_logout: Sign out - label_help: Help - label_reported_issues: Reported issues - label_assigned_to_me_issues: Issues assigned to me - label_last_login: Last connection - label_registered_on: Registered on - label_activity: Activities - label_overall_activity: Overall activity - label_user_activity: "%{value}'s activity" - label_new: New - label_new_user: registered a new account - label_logged_as: Logged in as - label_environment: Environment - label_authentication: Authentication - label_auth_source: Authentication mode - label_auth_source_new: New authentication mode - label_auth_source_plural: Authentication modes - label_subproject_plural: Subprojects - label_subproject_new: New subproject - label_and_its_subprojects: "%{value} and its subprojects" - label_min_max_length: Min - Max length - label_list: List - label_date: Date - label_integer: Integer - label_float: Float - label_boolean: Boolean - label_string: Text - label_text: Long text - label_attribute: Attribute - label_attribute_plural: Attributes - label_no_data: No data to display - label_change_status: Change status - label_history: History - label_attachment: Files - label_attachment_new: New file - label_attachment_delete: Delete file - label_attachment_plural: Files - label_file_added: File added - label_report: Report - label_report_plural: Reports - label_news: News - label_news_new: Add news - label_news_plural: News - label_news_latest: Latest news - label_news_view_all: View all news - label_news_added: News added - label_news_comment_added: Comment added to a news - label_settings: Settings - label_overview: Activities - label_version: Version - label_version_new: New version - label_version_plural: Versions - label_close_versions: Close completed versions - label_confirmation: Confirmation - label_export_to: 'Also available in:' - label_read: Read... - label_public_projects: Public projects - label_open_issues: open - label_open_issues_plural: open - label_closed_issues: closed - label_closed_issues_plural: closed - label_x_open_issues_abbr_on_total: - zero: 0 open / %{total} - one: 1 open / %{total} - other: "%{count} open / %{total}" - label_x_open_issues_abbr: - zero: 0 open - one: 1 open - other: "%{count} open" - label_x_closed_issues_abbr: - zero: 0 closed - one: 1 closed - other: "%{count} closed" - label_x_issues: - zero: 0 issues - one: 1 issue - other: "%{count} issues" - label_total: Total - label_total_time: Total time - label_permissions: Permissions - label_current_status: Current status - label_new_statuses_allowed: New statuses allowed - label_all: all - label_any: any - label_none: none - label_nobody: nobody - label_next: Next - label_previous: Previous - label_used_by: Used by - label_details: Details - label_add_note: Add a note - label_per_page: Per page - label_calendar: Calendar - label_months_from: months from - label_gantt: Gantt - label_internal: Internal - label_last_changes: "last %{count} changes" - label_change_view_all: View all changes - label_personalize_page: Personalize this page - label_comment: Comment - label_comment_plural: Comments - label_x_comments: - zero: no comments - one: 1 comment - other: "%{count} comments" - label_comment_add: Add a comment - label_comment_added: Comment added - label_comment_delete: Delete comments - label_query: Custom query - label_query_plural: Custom queries - label_query_new: New query - label_my_queries: My custom queries - label_filter_add: Add filter - label_filter_plural: Query condition - label_equals: is - label_not_equals: is not - label_in_less_than: in less than - label_in_more_than: in more than - label_in_the_next_days: in the next - label_in_the_past_days: in the past - label_in_users: 'in the user ' - label_greater_or_equal: '>=' - label_less_or_equal: '<=' - label_between: between - label_in: in - label_today: today - label_all_time: all time - label_yesterday: yesterday - label_this_week: this week - label_last_week: last week - label_last_n_weeks: "last %{count} weeks" - label_last_n_days: "last %{count} days" - label_this_month: this month - label_last_month: last month - label_this_year: this year - label_date_range: Date range - label_less_than_ago: less than days ago - label_more_than_ago: more than days ago - label_ago: days ago - label_contains: contains - label_not_contains: doesn't contain - label_any_issues_in_project: any issues in project - label_any_issues_not_in_project: any issues not in project - label_no_issues_in_project: no issues in project - label_day_plural: days - label_repository: Repository - #add by tan - label_repository_new: Repository setting - label_repository_no: Have no repository? - label_repository_new_repos: New repository - #end - label_repository_plural: Repositories - label_browse: Browse - label_branch: Branch - label_tag: Tag - label_revision: Revision - label_revision_plural: Revisions - label_revision_id: "Revision %{value}" - label_associated_revisions: Associated revisions - label_added: added - label_modified: modified - label_copied: copied - label_renamed: renamed - label_deleted: deleted - label_latest_revision: Latest revision - label_latest_revision_plural: Latest revisions - label_view_revisions: View revisions - label_view_all_revisions: View all revisions - label_max_size: Maximum size - label_sort_highest: Move to top - label_sort_higher: Move up - label_sort_lower: Move down - label_sort_lowest: Move to bottom - label_roadmap: Roadmap - label_roadmap_due_in: "Due in %{value}" - label_roadmap_overdue: "%{value} late" - label_roadmap_no_issues: No issues for this version - label_search: Search - label_result_plural: Results - label_all_words: All words - label_wiki: Wiki - label_wiki_edit: Wiki edit - label_wiki_edit_plural: Wiki edits - label_wiki_page: Wiki page - label_wiki_page_plural: Wiki pages - label_index_by_title: Index by title - label_index_by_date: Index by date - label_current_version: Current version - label_preview: Preview - label_feed_plural: Feeds - label_changes_details: Details of all changes - label_issue_tracking: Issue tracking - label_spent_time: Spent time - label_overall_spent_time: Overall spent time - label_f_hour: "%{value} hour" - label_f_hour_plural: "%{value} hours" - label_time_tracking: Time tracking - label_change_plural: Changes - label_statistics: Statistics - label_commits_per_month: Commits per month - label_commits_per_author: Commits per author - label_diff: diff - label_view_diff: View differences - label_diff_inline: inline - label_diff_side_by_side: side by side - label_options: Options - label_copy_workflow_from: Copy workflow from - label_permissions_report: Permissions report - label_watched_issues: Watched issues - label_related_issues: Related issues - label_applied_status: Applied status - label_loading: Loading... - label_relation_new: New relation - label_relation_delete: Delete relation - label_relates_to: Related to - label_duplicates: Duplicates - label_duplicated_by: Duplicated by - label_blocks: Blocks - label_blocked_by: Blocked by - label_precedes: Precedes - label_follows: Follows - label_copied_to: Copied to - label_copied_from: Copied from - label_end_to_start: end to start - label_end_to_end: end to end - label_start_to_start: start to start - label_start_to_end: start to end - label_stay_logged_in: Stay logged in - label_disabled: disabled - label_show_completed_versions: Show completed versions - label_me: me - label_board: Forums - label_board_description: Bring together the wisdom of crowds, and solve problems for you! - label_board_new: New forum - label_board_plural: Forums - label_board_locked: Locked - label_board_sticky: Sticky - label_topic_plural: Topics - field_sticky: '' - field_locked: '' - field_lock: '' - label_message_plural: Messages - label_message_last: Last message - label_message_new: New message - label_message_posted: Message added - label_reply_plural: Replies - label_send_information: Send account information to the user - label_year: Year - label_month: Month - label_week: Week - label_date_from: From - label_date_to: To - label_language_based: Based on user's language - label_sort_by: "Sort by %{value}" - label_send_test_email: Send a test email - label_feeds_access_key: RSS access key - label_missing_feeds_access_key: Missing a RSS access key - label_feeds_access_key_created_on: "RSS access key created %{value} ago" - label_module_plural: Modules - label_added_time_by: "Added by %{author} %{age} ago" - label_updated_time_by: "Updated by %{author} %{age} ago" - label_updated_time: "Updated %{value} ago" - label_jump_to_a_project: Jump to a project... - label_file_plural: Files - label_changeset_plural: Changesets - label_default_columns: Default columns - label_no_change_option: (No change) - label_bulk_edit_selected_issues: Bulk edit selected issues - label_bulk_edit_selected_time_entries: Bulk edit selected time entries - label_theme: Theme - label_default: Default - label_search_titles_only: Search titles only - label_user_mail_option_all: "For any event on all my projects" - label_user_mail_option_selected: "For any event on the selected projects only..." - label_user_mail_option_none: "No events" - label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in" - label_user_mail_option_only_assigned: "Only for things I am assigned to" - label_user_mail_option_only_owner: "Only for things I am the owner of" - label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself" - label_registration_activation_by_email: account activation by email - label_registration_manual_activation: manual account activation - label_registration_automatic_activation: automatic account activation - label_display_per_page: "Per page: %{value}" - label_age: Age - label_change_properties: Change properties - label_general: General - label_more: More - label_scm: SCM - label_plugins: Plugins - label_ldap_authentication: LDAP authentication - label_downloads_abbr: D/L - label_optional_description: Optional description - label_add_another_file: Add another file - label_preferences: Preferences - label_chronological_order: In chronological order - label_reverse_chronological_order: In reverse chronological order - label_planning: Planning - label_incoming_emails: Incoming emails - label_generate_key: Generate a key - label_issue_watchers: Watchers - label_example: Example - label_display: Display - label_sort: Sort - label_ascending: Ascending - label_descending: Descending - label_date_from_to: From %{start} to %{end} - label_wiki_content_added: Wiki page added - label_wiki_content_updated: Wiki page updated - label_group: Group - label_group_plural: Groups - label_group_new: New group - label_time_entry_plural: Spent time - label_version_sharing_none: Not shared - label_version_sharing_descendants: With subprojects - label_version_sharing_hierarchy: With project hierarchy - label_version_sharing_tree: With project tree - label_version_sharing_system: With all projects - label_update_issue_done_ratios: Update issue done ratios - label_copy_source: Source - label_copy_target: Target - label_copy_same_as_target: Same as target - label_display_used_statuses_only: Only display statuses that are used by this tracker - label_api_access_key: API access key - label_missing_api_access_key: Missing an API access key - label_api_access_key_created_on: "API access key created %{value} ago" - label_profile: Profile - label_subtask_plural: Subtasks - label_project_copy_notifications: Send email notifications during the project copy - label_principal_search: "Search for user or group:" - label_user_search: "Search for user:" - label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author - label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee - label_issues_visibility_all: All issues - label_issues_visibility_public: All non private issues - label_issues_visibility_own: Issues created by or assigned to the user - label_git_report_last_commit: Report last commit for files and directories - label_parent_revision: Parent - label_child_revision: Child - label_export_options: "%{export_format} export options" - label_copy_attachments: Copy attachments - label_copy_subtasks: Copy subtasks - label_item_position: "%{position} of %{count}" - label_completed_versions: Completed versions - label_search_for_watchers: Search for watchers to add - label_session_expiration: Session expiration - label_show_closed_projects: View closed projects - label_status_transitions: Status transitions - label_fields_permissions: Fields permissions - label_readonly: Read-only - label_required: Required - label_attribute_of_project: "Project's %{name}" - label_attribute_of_issue: "Issue's %{name}" - label_attribute_of_author: "Author's %{name}" - label_attribute_of_assigned_to: "Assignee's %{name}" - label_attribute_of_user: "User's %{name}" - label_attribute_of_fixed_version: "Target version's %{name}" - label_cross_project_descendants: With subprojects - label_cross_project_tree: With project tree - label_cross_project_hierarchy: With project hierarchy - label_cross_project_system: With all projects - label_gantt_progress_line: Progress line - label_files_filter: Files Filter: - - button_login: Login - button_submit: Submit - button_save: Save - button_check_all: Check all - button_uncheck_all: Uncheck all - button_collapse_all: Collapse all - button_expand_all: Expand all - button_delete: Delete - button_create: Create - button_create_and_continue: Create and continue - button_test: Test - button_edit: Edit - button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" - button_add: Add - button_change: Change - button_apply: Query - button_clear: Cancel query - button_lock: Lock - button_unlock: Unlock - button_download: Download - button_list: List - button_view: View - button_move: Move - button_move_and_follow: Move and follow - button_back: Back - button_cancel: Cancel - button_activate: Activate - button_sort: Sort - button_log_time: Log time - button_rollback: Rollback to this version - button_watch: Watch - button_unwatch: Unwatch - button_reply: Reply - button_archive: Archive - button_unarchive: Unarchive - button_reset: Reset - button_rename: Rename - button_change_password: Change password - button_copy: Copy - button_copy_and_follow: Copy and follow - button_annotate: Annotate - button_update: Update - button_configure: Configure - button_quote: Quote - button_duplicate: Duplicate - button_show: Show - button_hide: Hide - button_edit_section: Edit this section - button_export: Export - button_delete_my_account: Delete my account - button_close: Close - button_reopen: Reopen - - status_active: active - status_registered: registered - status_locked: locked - - project_status_active: active - project_status_closed: closed - project_status_archived: archived - - version_status_open: open - version_status_locked: locked - version_status_closed: closed - - field_active: Active - - text_select_mail_notifications: Select actions for which email notifications should be sent. - text_regexp_info: eg. ^[A-Z0-9]+$ - text_min_max_length_info: 0 means no restriction - text_project_destroy_confirmation: Are you sure you want to delete this project and related data? - text_subprojects_destroy_warning: "Its subproject(s): %{value} will be also deleted." - text_workflow_edit: Select a role and a tracker to edit the workflow - text_are_you_sure: Are you sure? - text_journal_changed: "%{label} changed from %{old} to %{new}" - text_journal_changed_no_detail: "%{label} updated" - text_journal_set_to: "%{label} set to %{value}" - text_journal_deleted: "%{label} deleted (%{old})" - text_journal_added: "%{label} %{value} added" - text_tip_issue_begin_day: issue beginning this day - text_tip_issue_end_day: issue ending this day - text_tip_issue_begin_end_day: issue beginning and ending this day - text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter.
    Once saved, the identifier cannot be changed.' - text_caracters_maximum: "%{count} characters maximum." - text_caracters_minimum: "Must be at least %{count} characters long." - text_length_between: "Length between %{min} and %{max} characters." - text_tracker_no_workflow: No workflow defined for this tracker - text_unallowed_characters: Unallowed characters - text_comma_separated: Multiple values allowed (comma separated). - text_line_separated: Multiple values allowed (one line for each value). - text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages - text_issue_added: "Issue %{id} has been reported by %{author}." - text_issue_updated: "Issue %{id} has been updated by %{author}." - text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content? - text_issue_category_destroy_question: "Some issues (%{count}) are assigned to this category. What do you want to do?" - text_issue_category_destroy_assignments: Remove category assignments - text_issue_category_reassign_to: Reassign issues to this category - text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)." - text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded." - text_load_default_configuration: Load the default configuration - text_status_changed_by_changeset: "Applied in changeset %{value}." - text_time_logged_by_changeset: "Applied in changeset %{value}." - text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s)?' - text_issues_destroy_descendants_confirmation: "This will also delete %{count} subtask(s)." - text_time_entries_destroy_confirmation: 'Are you sure you want to delete the selected time entr(y/ies)?' - text_select_project_modules: 'Select modules to enable for this project:' - text_default_administrator_account_changed: Default administrator account changed - text_file_repository_writable: Attachments directory writable - text_plugin_assets_writable: Plugin assets directory writable - text_rmagick_available: RMagick available (optional) - text_destroy_time_entries_question: "%{hours} hours were reported on the issues you are about to delete. What do you want to do?" - text_destroy_time_entries: Delete reported hours - text_assign_time_entries_to_project: Assign reported hours to the project - text_reassign_time_entries: 'Reassign reported hours to this issue:' - text_user_wrote: "%{value} wrote:" - text_enumeration_destroy_question: "%{count} objects are assigned to this value." - text_enumeration_category_reassign_to: 'Reassign them to this value:' - text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/configuration.yml and restart the application to enable them." - text_repository_usernames_mapping: "Select or update the Trustie user mapped to each username found in the repository log.\nUsers with the same Trustie and repository username or email are automatically mapped." - text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.' - text_custom_field_possible_values_info: 'One line for each value' - text_wiki_page_destroy_question: "This page has %{descendants} child page(s) and descendant(s). What do you want to do?" - text_wiki_page_nullify_children: "Keep child pages as root pages" - text_wiki_page_destroy_children: "Delete child pages and all their descendants" - text_wiki_page_reassign_children: "Reassign child pages to this parent page" - text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" - text_zoom_in: Zoom in - text_zoom_out: Zoom out - text_warn_on_leaving_unsaved: "The current page contains unsaved text that will be lost if you leave this page." - text_scm_path_encoding_note: "Default: UTF-8" - text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) - text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) - text_scm_command: Command - text_scm_command_version: Version - text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. - text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. - text_issue_conflict_resolution_overwrite: "Apply my changes anyway (previous notes will be kept but some changes may be overwritten)" - text_issue_conflict_resolution_add_notes: "Add my notes and discard my other changes" - text_issue_conflict_resolution_cancel: "Discard all my changes and redisplay %{link}" - text_account_destroy_confirmation: "Are you sure you want to proceed?\nYour account will be permanently deleted, with no way to reactivate it." - text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." - text_project_closed: This project is closed and read-only. - text_turning_multiple_off: "If you disable multiple values, multiple values will be removed in order to preserve only one value per item." - text_applied_project: "User %{id} Apply Join Project %{project}" - - default_role_manager: Manager - default_role_developer: Developer - default_role_reporter: Reporter - default_tracker_bug: Bug - default_tracker_feature: Feature - default_tracker_support: Support - default_issue_status_new: New - default_issue_status_in_progress: In Progress - default_issue_status_resolved: Resolved - default_issue_status_feedback: Feedback - default_issue_status_closed: Closed - default_issue_status_rejected: Rejected - default_doc_category_user: User documentation - default_doc_category_tech: Technical documentation - default_priority_low: Low - default_priority_normal: Normal - default_priority_high: High - default_priority_urgent: Urgent - default_priority_immediate: Immediate - default_activity_design: Design - default_activity_development: Development - - enumeration_issue_priorities: Issue priorities - enumeration_doc_categories: Document categories - enumeration_activities: Activities - enumeration_system_activity: System Activity - description_filter: Filter - description_search: Searchfield - description_choose_project: Projects - description_project_scope: Search scope - description_notes: Notes - description_message_content: Message content - description_query_sort_criteria_attribute: Sort attribute - description_query_sort_criteria_direction: Sort direction - description_user_mail_notification: Mail notification settings - description_available_columns: Available Columns - description_selected_columns: Selected Columns - description_all_columns: All Columns - description_issue_category_reassign: Choose issue category - description_wiki_subpages_reassign: Choose new parent page - description_date_range_list: Choose range from list - description_date_range_interval: Choose range by selecting start and end date - description_date_from: Enter start date - description_date_to: Enter end date - text_repository_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed.' - - #modify by mkz - #by young - label_requirement: Calls - label_requirement_focus: Calls # modified by bai - label_developer: Users - label_investor: Investor: - label_theme: Theme - label_logged_as_new: Current user - button_register: Register - issue_list: Issue list - lastest_respond: Lastest reply - label_news_lastest: Lastest news - label_version_display_settings: Display settings - label_versions_progress: Complete schedule - label_versions_description: Versions description - label_my_photo: My photo - label_documents_sort: Order setting: - label_activities_settings: Display settings - #end - - label_joined_course: Joined Courses - label_created_course: Created Courses - label_borad_course: Course Borad - - #huang - label_file_new: Download - label_user_edit: "Edit information" - label_my_course: "My Course" - label_user_info: "User information" #huang 添加 - label_user_watcher: "Following" # huang添加的 # modified by bai - label_user_fans: "Followed by" # modified by bai - - # modify by men - label_x_user_fans: - zero: fan - one: fan - other: fans - #end - label_user_commits: "Code commits" - label_user_watchered: "Followed by" # huang添加的 - label_user_newfeedback: "Messages" ## huang添加的 # modified by bai - label_user_login: "Last login:" - label_user_mail: "E-mail:" - label_user_joinin: "Join date:" - label_user_activities: "You have no activities,come and join us!" - label_user_activities_other: The user has no activities now! - label_project_overview: "Overview" - label_project_tool: "Tool" - label_project_issues: "Issues" - label_project_newother: "See other comments" - label_project_newshare: "has shared" - label_project_newadd: "added" - label_project_unadd: "No project,go to creat it!" - label_project_un: "You haven't joined any project!" - #end by huang - - #added by liuping - button_unfollow: Unfollow - button_follow: Follow - label_delete_confirm: Confirm delete? - label_more_tags: More - label_tags_bid: Call name - label_tags_bid_description: call description - label_tags_issue_description: issue description - label_tags_all_objects: all objects - label_apply_project: Apply Project - label_exit_project: Exit Project - label_apply_project_waiting: "Application has been submitted, please wait for administrator review." - label_unapply_project: Unsubscribe - - #fq - button_leave_meassge: Submit - label_leave_message_to: leave %{name} a message - label_leave_message: Message content - label_message: message board - field_add: Add before %{time} - button_more: More - label_user_response: Feedback # modified by bai - label_bidding_project: projects - button_bidding: I will participate in it - label_new_call: New call - label_user_information: My informations - - #Customer added!Added by nie - label_create_time: Created time - label_current_contributors: current contributors - #modify by men - label_x_current_contributors: - zero: current contributor - one: current contributor - other: current contributors - #end - label_lines_of_code: lines of code - label_since_last_commits: since last commit - label_users_on_trustie: User - label_front: first page - label_commit_on: commit times - #modify by men - label_x_commit_on: - zero: commit time - one: commit time - other: commit times - #end - label_follow_people: following # modified by bai - #modify by men - label_x_follow_people: - zero: Follower - one: Follower - other: Followers - #end - label_member_since: joined - label_contribute_to: Participates %{project_count} projects: - #modify by men - label_x_contribute_to: - zero: Participates %{count} project: - one: Participates %{count} project: - other: Participates %{count} projects: - #end - label_total_commit: Totally %{total_commit} commits # modified by bai - #modify by men - label_x_total_commit: - zero: Totally %{count} commit - one: Totally %{count} commit - other: Totally %{count} commits - #end - label_upload_profile: Upload avatar - label_type_as: Type as - label_status_as: Status as - label_priority_as: Priority as - label_member_list: Member list - label_author_name: Posted by %{author_name} - label_comments_count: (%{count} comments) - label_post_on: posts on - label_find_all_comments: view all comments - label_updated_time_on: " Updated on %{value} " - label_call_list: Calls list - - label_requirement_list: Requirement list - label_x_biding_project: #modify by men - zero: project - one: project - other: projects - #end - label_x_responses: #modify by men - zero: comment - one: comment - other: comments - #end - label_x_followers: #modified by men - zero: Follower - one: Follower - other: Followers - #end - - - - label_price: price: - label_RMB_sign: ¥ - label_investment_budget: Investment budget: - label_investment_time_limit: Investment time limit: - label_my_respond: Feedbacks: # modified by bai - label_respond_requirement: has commented this call - label_deadline: deadline yyyy-mm-dd - label_requirement_name: give your requirement a name ~~ - label_requirement_description: content:descript your requirement - label_requirement_bargain_money: type in your rewards(ex. money, reward, grade) - label_wrong_budget: The error format of money - label_wrong_date: wrong date format, input right date yyyy-mm-dd - button_upload_photo: Upload photo - label_leave_me_message: left a message to me - label_leave_others_message: leave message to him/her - label_leave_a_message: Leave him/her a message: - label_leave_your_message: Leave a message to you - label_new_activities: ' has new activity in' # modified by bai - label_new_activity: ' has new activity in' - label_i_new_activity: ' have new activity in' - label_create_project: had participated in - label_praise: praise - label_cancel_praise: cancel praise - label_bid_reason: Please show your reason - default_tracker_task: Task - label_create_new_projects_description: Create a new project, you will open a magical journey of collaborative creation and development! - label_call_for_bids_description: Publish your call for anything, feel the excitement of hundreds respond to a single call! - label_create_course_description: Create a new course, let us share the public resources in the course community which are more than you can imagine! - label_news: News - label_news_description: Track the latest activities of projects, and obtain the latest information! - label_milestone: Milestone - label_milestone_description: Review the commits, branches and versions of your project! - label_features: Features - label_has_praisers: praisers(%{count}) - label_has_watchers: following(%{count}) # modified by bai - label_has_fans: followed by(%{count}) # modified by bai - #modify by men - label_x_has_fans: - zero: fan(%{count}) - one: fan(%{count}) - other: fans(%{count}) - #end - label_me: me - label_my: my - label_i: I - label_join_bidding: joined the bidding - label_bidding_user: Bidding user: - label_bidding_reason: Bidding reason: - label_username: username: - label_password: password: - label_about_requirement: about requirement: - label_about_issue: about issue: - label_quote_my_words: ' quoted my words' - label_have_respond: had a respond - label_welcome: Welcome - - label_goto: Go to>> - label_join: join Trustie! - label_repository_new: link to existing SVN repository - label_repository_path: path of repository - label_repository_new_repos: create a new repository - label_repository_no: have no repository? - label_welcome_page_to: Participate %{project_count} projects! - label_repository_path_not_null: repository path can't be null - label_password_not_null: password can't be blank - label_exist_repository_path: Define exist repository's path of URL and format must be file:///, http://, https://, svn:// - label_project_no_activity: The project has no activities now! - label_follow_no_requirement: You don't have followed any requirements! - label_no_user_respond_you: There is no respond for you! - label_tags_issue: issue: - label_tags_project_name: Project name: - label_tags_project_description: Project description: - label_tags_user_mail: User E-mail: - label_tags_user_name: User Name: - label_tags_numbers: Tag numbers: - label_max_number: Open label nickname is displayed on the web site of your,Must be at most 25 characters long. - label_all_revisions: All revisions: - label_repository_name: Repository name - label_upassword_info: The password can be shared in the group - label_how_commit_code: How to commit code: - label_how_commit_code_chinese: Chinese - label_welcome_leave_message: Hi!The platform is currently in beta version.If you have any comments and suggestions, please - label_welcome_click_me: Click me - label_issue_praise: Good question,praise! - label_issue_tread: Poor question,tread! - label_issue_praise_over: Praised over! - label_issue_tread_over: Treaded over! - label_issue_appraise_over: Appraised over! - label_welcome_my_respond: Please leave your comments and suggestions here! - label_no_current_fans: the user has no fans now - label_no_current_watchers: the user hasn't watched others - label_project_tool_response: Response - label_course_feedback: Feedback - label_tags_search_result: Search Results - label_active_call: call - label_tags_call: Calls - label_user_extensions: Other information - label_boy: Man - label_girl: Woman - field_gender: Gender - field_birthday: Birthday - field_brief_introduction: Info - field_location: Location - field_occupation: Position - field_work_experience: Work experience(year) - field_zip_code: Zip code - label_reward: reward: - label_credit: credit: - label_choose_reward: choose reward - label_money: money - label_reward_1: others - label_bids_credit: credit - label_bids_credit_number: points - field_budget: reward - field_deadline: deadline - label_tags_selected: Selected Tags - label_tags_related: Related Tags - button_project_tags_add: Add - label_issue_query_condition: Query condition - label_homework_source: Task - label_issue_query: Query - label_issue_cancel_query: Cancel query - field_reward_type: The type of reward - label_tags_no: no tags now! - label_bid_publish: published - label_bid_project: projects - label_project_no_follow: The project hasn't been followed now! - label_no_bid_project: has no participate project - label_bids_reward_method: Reward: - label_bids_reward_what: input what for reward - label_call_bonus: bonus - label_bids_form_new_description: Publish a requirement,a competition or a course work. - label_bids_new_money: input the award money,such as 500,2.5 etc. - label_bids_new_credit: input the work corresponding course credits,such as 3,2.5 etc. - label_bids_new_content: input the award content,such as certificate,things etc. - label_user_login_tips: You havn't logged in,for leaving message please login first - label_user_login_new: login - label_project_sort: the way of sorting - #modified by bai - label_sort_by_time: sorted by time - label_sort_by_active: sorted by active - label_sort_by_influence: sorted by influence - #end - label_bids_published: published - label_bids_published_ago: ago - label_welcome_trustie: Trustie - label_welcome_trustie_project: Online projects hosting platform - label_welcome_trustie_course: Online Courses practice platform - label_welcome_trustie_contest: Online Contests practice platform - label_welcome_trustie_project_description: Software for Chinese college students and practitioners to provide social-oriented project management, code hosting, resource sharing, cooperation and exchange. - label_welcome_trustie_course_description: Teachers and Students for Chinese universities to provide social-oriented curriculum management, resource sharing, cooperation achieved, collaborative research. - label_welcome_trustie_contest_description: Software for Chinese college students and practitioners to provide social-oriented contest management, code hosting, resource sharing, cooperation and exchange. - label_welcome_trustie_description: a socialized collaboration platform for project management, collaborative research, software development and software crowdsourcing for creative university students and entrepreneurs. - label_user_project: Projects - label_bid_respond_quote: Respond - label_bid_if_agreement: If you like me, please press me #bai - label_bid_respond_delete: Delete - label_newfeedback_message: messages - label_newfeedback_quote: Respond - label_newfeedback_delete: Delete - label_user_all_activity: All activities - label_user_activity_myself: About me - label_user_all_respond: All replies - label_layouts_feedback: Messages - label_have_feedback: Have - label_of_feedback: Of - label_welcome_participate: participates - #modify by men - label_x_welcome_participate: - zero: participate - one: participate - other: participates - #end - label_welcome_participate_project: projects - label_projects_feedback: responded to the project - label_projects_feedback_respond: Respond - label_projects_feedback_respond_success: Respond success - button_projects_feedback_respond: Respond - label_projects_feedback_respond_content: Please input your words - label_in_issues: in the issue: - label_in_bids: in the call: - label_in_users: in the user: - label_user_create_project: has created - -#added by bai - label_identity: Identity - label_teacher: Teacher - label_student: Student - label_school_all: Schools - label_school_not_fount: Not found by your input query condition. - label_other: Other - label_gender: Gender - label_gender_male: male - label_gender_female: female - label_location: Location -#end - label_course: Course - label_course_new: New course - label_public_info: "If you don't choose public, only the project's members can see the project." - label_course_public_info: "If you don't choose public, only the course's members can see the course." - label_course_student: Student - label_homework: Task - label_course_new_homework: New homework - label_course_homework_list: Homework List - label_course_homework_new: new homework - - label_x_course_data: - zero: File - one: File - other: Files - - label_x_base_courses_student: - zero: student - one: students - other: students - label_x_base_courses_teacher: - zero: teacher - one: teachers - other: teachers - #add by men - label_brief_introduction: Personality words - label_technical_title: Title - label_technicl_title_professor: Professor - label_technicl_title_associate_professor: Associate professor - label_technicl_title_lecturer: Lecturer - label_technicl_title_teaching_assistant: Teaching assistant - label_account_identity_teacher: Teacher - label_account_identity_student: Student - label_account_identity_developer: Developer - label_account_identity_enterprise: Enterprise - label_account_identity_choose: --Please choose your identity-- - label_enter_college: College Entrance - lable_enter_enterprise: Enterprise Entrance - label_homework_info: Status - label_question_student: Feedback - label_student_response: Feedback - label_my_question: Please raise your questions here! - label_teacher_homework: "Teacher's name" - label_course_homework: Corresponding courses - label_course_done: finished courses - label_course_doing: Doing course - label_limit_time: Deadline - label_commit_homework: Submitted Task - label_no_course_project: No submitted work! - button_clear_requirement: Cancel -#end - label_x_bids_responses: #modify by huang - zero: response - one: response - other: responses - #end - label_teaching_course: My Courses - label_release_homework: Released Tasks - label_term: Term - label_spring: spring term - label_summer: summer term - label_autumn: autumn term - label_winter: winter term - text_command: The password is required when applying a course, and it will be released by the teacher of. - label_enterprise_into: Enterprise Entrance - label_college_into: College Entrance - label_user_course: Courses - label_new_course: Courses - field_tea_name: Teacher - label_course_college: College - label_x_task: - zero: Task - one: Task - other: Tasks - label_project_course_unadd: You have no course,creat one now! - label_my_create_honework_no_homework: no task now! - label_my_homework_no_homework: no task now! - label_x_member: - zero: member - one: member - other: members - label_x_data: - zero: file - one: file - other: files - label_bid_show_course_name: Course - label_bid_show_teacher_name: Teacher - label_bid_contest_show_course_name: Course - label_bid_contest_show_teacher_name: Teacher - label_x_homework_project: - zero: submitted task - one: submitted task - other: submitted tasks - label_new_homework: Tasks - label_new_contest: Contests - label_contest_list: Contests list - label_newtype_contest: Release contest - label_question_requirement: introduce a question! - label_contest_requirement: has commented this contest - button_bidding_homework: To take part in contest - label_bids_form_contest_new_description: Enterprise or college can release a contest here. - label_contest_name: Input the name of the contest - label_contest_description: Content:description your contest - label_main_teacher: Main teacher - label_main_term: Term - label_teacher_work_unit: Position - label_course_overview: Status - label_course_file: File - label_stores_index: Resource search - label_course_news: News - #wang - label_contest_userresponse: Userresponse - label_contest_joincontest: Joincontest - label_contest_notification: Notification - #end - label_x_base_courses_member: - zero: member - one: member - other: members - - label_bids_task_list: Tasks list - label_join_course: join course - label_exit_course: exit course - label_new_join: Join - label_new_join_order: Please input the course order. - label_homeworks_form_new_description: Release a task,the submit form of the task may be accessory or project,setting in the task form. - label_course_settings: Setting - field_homework_type: Submit form - label_task_submit_form_accessory: Submitted as accessory - label_task_submit_form_project: Submitted as project - label_news_notice: Release course news - - role_of_course: Role - label_student: student - label_teacher: teacher - label_ta: teacher assistant - label_in_course: in course - label_assign_homework: assigned homewok - label_noawards: No awards - label_user_location: Location - label_requirement_enterprise: Requirements - label_requirement_enterprise_list: Requirements List - label_contest_innovate: Competition community - label_software_user: Users - label_course_practice: Courses - label_course_all: Teacher - label_teacher_all: Student - label_user_home: User Space - - field_hidden_repo: code protected - label_newbie_faq: newbie FAQ - label_hot_project: 'HOT Projects' - label_memo_create_succ: Memo was successfully created. - label_memo_create_fail: Memo was failures created. - label_forum_create_succ: Forum was successfully created. - label_forum_create_fail: Forum was failures created. - label_forum_edit: Editing forum - label_memo_create: publish - label_memo_new: new memo - label_memo_edit: edit memo - label_project_module_forums: Forums - label_forum: Forum - label_tags_forum_description: Forum description - label_tags_forum: Call forum - label_memo_locked: 'Topic is locked' - label_downloads_list: enter file list. - label_sumbit_empty: search bar need container. - label_reply_empty: Reply Cann't Empty. - label_setup_time: Start date - label_endup_time: Over date - label_class_period: Class hour - label_class_hour: period - label_activity_time: publish date - - label_your_course: your course - label_have_message : have a new message - label_login_prompt: Email/NickName - :lable_not_receive_mail: Click here don't receive email form site! -#added by linchun as competition# - - label_current_hot_contest: Latest Hot Competition - label_current_attendingcontest_work: Latest Competition Work - label_issue_feedback_activities: Question&Feedback - label_more_information: More... - label_my_question: My-question - label_my_feedback: My-feedback - label_release_time: Release-time - label_question_sponsor: Sponsor - label_final_reply: Final-reply - label_reply: Reply - label_weixin: WeiXin - label_search_intimation: please input the keywords - label_work_quantity: work - label_projects_management_platform: Projects-platform - label_courses_management_platform: Courses-platform - label_contests_management_platform: Competitions-platform - label_contest_work: Competition work - label_contests_reward_method: Reward method - label_attendingcontestwork_developers: Developers - label_attendingcontestwork_release_time: Release time - label_attendingcontestwork_belongs_contest: Contesting - label_attendingcontestwork_belongs_type: Work-type - label_attendingcontestwork_release_person: Release person - label_attendingcontestwork_adaptive_system: Adaptive-system - label_attendingcontestwork_download: Work download - label_attendingcontestwork_average_scores: Average score - label_attendingcontestwork_deposit_project: Deposit project - label_attendingcontestwork_sorting_intimation: You can re-scoring, but just record the last scoring result! - - label_upload_files: Files-upload - label_upload_softwarepackage: Softwarepackage-upload - label_upload_cuttingphoto: Photo-upload - label_system_platform: Platform - label_nextstep: Next - label_participate: Participate - label_setting: Setting - label_contest_project: Competition-project - label_contest_softapplication: Competition-application - label_contest_response: Feedback - label_contest_watchers: Watchers - label_contest_work: Competition-work - button_contesting_as_project: Competition(New-project) - button_contesting_as_application: Competition(Release-app) - label_release_softapplication: Release-application - label_upload_softapplication_packets: Upload-apppacket - label_upload_softapplication_photo: Upload-appphoto - label_upload_softapplication_packets_mustpacketed: Works code and ralated-document must be packaged before upload. - label_upload_softapplication_photo_condition: The best works. 0~4 (redundant pictures would not show page), each is less than 5M, photo format such as gif,jpg,png etc. - label_updated_caution: Note:if you edit the work, the uploaded screenshot and package will be deleted, please re-load! - label_softapplication_name: App-name - label_work_name: Work name - label_softapplication_description: App-description - label_work_description: Work description - label_work_scores: Work score - label_work_rating: Work rating - label_work_tishi: You can re-scoring, but just record the last scoring result! - label_work_scores_proportion: Score porportion - label_softapplication_type: App-type - label_work_type: Work type - label_work_photo: Work photo - label_work_comment: Work comment - label_softapplication_version_available: Version - label_running_platform: Running platform - label_softapplication_developer: Upload person - label_softapplication_developers: Developers - label_work_deposit_project_url: Deposit url - label_work_deposit_project: Deposit project - label_softapplication_name_condition: Less than 50 characters - label_softapplication_description_condition: Less than 250 characters - label_user_login_softapplication_board: You are not logged in, please log in and then participate in the evaluation! - label_user_login_attending_contest: You are not logged in, please log in and then join the competition! - label_contest_description_no: No description - label_no_contest_softapplication: No application - label_button_ok: Ok - label_tags_contest: Competition tag - label_final_scores: Final scores - label_rating_person_amount: Rating person - label_tags_contest_description: Contest description - label_release_add_contest_succeed: The application succeed released and added! - label_add_contest_succeed_fail: Added fails, the application has been joined the competition! - label_no_ftapplication: No application - label_edit_softapplication: Edit application - label_edit_work: Edit work - label_contest_delete: Delete contest - label_noawards_current: No awards - label_softapplication: Application software - label_attending_contest: Joining - label_new_attendingcontest_work: New competition work - label_workname_lengthlimit: Less than 50 characters - label_workdescription_lengthlimit: Less than 250 characters - label_please_input_password: Please input the competition password! - label_please_select_project: Please select the project! - label_upload_softworkpacket_photo: Upload work package and screenshots - label_reward: Reward - label_please_select_contestingsoftapplication: Please select the competition application! - label_attendingcontest_time: Join-contest time - label_attendingcontest_spoksman: Join-contest representive - label_wellmeaning_intimation_contentone: Note:if you are ready attenging contest, please click"New competition work"! - label_wellmeaning_intimation_contenttwo: if you have already completed the development, and just release your work, you can not select"Deposit project"! - label_wellmeaning_intimation_contentthree: if you want to deposit the competition data and code, and want to keep track of the development and code-submission,please selcet a created project from"Deposit project", if you have no project, please click"New project"! - - notice_attendingcontest_work_successfully_created: Congratulations, competition work successfully created! - notice_softapplication_was_successfully_updated: Congratulations, competition work successfully updated! - - label_contest_notification: Notice - lable_contest_user: Release person - label_contest_innovate_community: Competition community - - label_user_login_score_and_comment: You are not logged in, please log in and then score and comment the work! - label_user_login_notificationcomment: You are not logged in, please log in and then comment the notification! - label_contest_work_list: Competition work list - - - label_borad_project: Project-borad - label_search_intimation: please input the searching keywords! - label_update_time: Update time - label_project_notice: release the notice - label_no_file_uploaded: No file uploaded - label_forum_new: New forum - label_memo_new_from_forum: Release memo - bale_edit_notice: Edit - - label_user_grade: Individual score - label_active_homework: homework - label_course_term: Semester - label_comment_time: Comment time - label_bidding_user_studentcode: Student ID - - label_organizers: Organizer - label_organizers_information: National Key Laboratory of Parallel and Distributed Processing, NUDT - label_organizers_information_institute: Department of Computer Sciencer and Technology - label_copyright: Copyright - label_contact_us: Contact us - label_record: 湘ICP备09019772 - label_check_comment: Check comment - label_notification: Notification - - -#end - - # ajax异步验证 - modal_valid_passing: can be used. - - label_company_name: Company Name - notice_account_invalid_creditentials_new: You have not to the mailbox activation - label_school_no_course: The school did not offer any courses, you can view other school curriculum - label_school_less_course: The school offers courses in less, you can view other school curriculum - label_file_not_found: Sorry, the file can't be downloaded now! - label_goto_homepage: Return to the home page - label_trustie_team: The Trustie development team - label_memos_max_length: The content of the post up to 65535 characters in length - label_forums_max_length: Post Bar describing the maximum length of 65535 characters - label_unknow_type: Unknow type - label_score_less_than_zero: Score less than 0, revised to 0 - review_assignments: Review assignments - label_private: private - label_my_school: My school - label_all_schol: All school - label_select_province: Please select the provinces +en: + # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) + direction: ltr + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%m/%d/%Y" + short: "%b %d" + long: "%B %d, %Y" + + day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday] + abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December] + abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%m/%d/%Y %I:%M %p" + time: "%I:%M %p" + short: "%d %b %H:%M" + long: "%B %d, %Y %H:%M" + am: "am" + pm: "pm" + + datetime: + distance_in_words: + half_a_minute: "half a minute" + less_than_x_seconds: + one: "less than 1 second" + other: "less than %{count} seconds" + x_seconds: + one: "1 second" + other: "%{count} seconds" + less_than_x_minutes: + one: "less than a minute" + other: "less than %{count} minutes" + x_minutes: + one: "1 minute" + other: "%{count} minutes" + about_x_hours: + one: "about 1 hour" + other: "about %{count} hours" + x_hours: + one: "1 hour" + other: "%{count} hours" + x_days: + one: "1 day" + other: "%{count} days" + about_x_months: + one: "about 1 month" + other: "about %{count} months" + x_months: + one: "1 month" + other: "%{count} months" + about_x_years: + one: "about 1 year" + other: "about %{count} years" + over_x_years: + one: "over 1 year" + other: "over %{count} years" + almost_x_years: + one: "almost 1 year" + other: "almost %{count} years" + + number: + format: + separator: "." + delimiter: "" + precision: 3 + + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + +# Used in array.to_sentence. + support: + array: + sentence_connector: "and" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + messages: + inclusion: "is not included in the list" + exclusion: "is reserved" + invalid: "is invalid" + confirmation: "doesn't match confirmation" + accepted: "must be accepted" + empty: "can't be empty" + blank: "can't be blank" + too_long: "is too long (maximum is %{count} characters)" + too_short: "is too short (minimum is %{count} characters)" + wrong_length: "is the wrong length (should be %{count} characters)" + taken: "has already been taken" + not_a_number: "is not a number" + not_a_date: "is not a valid date" + greater_than: "must be greater than %{count}" + greater_than_or_equal_to: "must be greater than or equal to %{count}" + equal_to: "must be equal to %{count}" + less_than: "must be less than %{count}" + less_than_or_equal_to: "must be less than or equal to %{count}" + odd: "must be odd" + even: "must be even" + greater_than_start_date: "must be greater than start date" + not_same_project: "doesn't belong to the same project" + circular_dependency: "This relation would create a circular dependency" + cant_link_an_issue_with_a_descendant: "An issue cannot be linked to one of its subtasks" + + actionview_instancetag_blank_option: Please select + + attachment_all: "All" + attachment_browse: "Attachment Content Browse" + attachment_sufix_browse: "Attachment Type Browse" + attachment_type: "Attachment Type" + general_text_No: 'No' + general_text_Yes: 'Yes' + general_text_no: 'no' + general_text_yes: 'yes' + general_lang_name: 'English' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: ISO-8859-1 + general_pdf_encoding: UTF-8 + general_first_day_of_week: '7' + + label_approve: Approve + label_refusal: Refusal + notice_account_updated: Account was successfully updated. + notice_account_invalid_creditentials: Invalid user or password + notice_account_password_updated: Password was successfully updated. + notice_account_wrong_password: Wrong password + notice_account_register_done: Account was successfully created. To activate your account, click on the link that was emailed to you. + notice_account_unknown_email: Unknown user. + notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password. + notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you. + notice_account_activated: Your account has been activated. You can now log in. + notice_successful_create: Successful creation. + notice_successful_update: Successful update. + notice_successful_delete: Successful deletion. + notice_failed_delete: Successful failure. + notice_successful_connection: Successful connection. + notice_file_not_found: The page you were trying to access doesn't exist or has been removed. + notice_locking_conflict: Data has been updated by another user. + notice_not_authorized: You are not authorized to access this page. + notice_not_authorized_archived_project: The project you're trying to access has been archived. + notice_email_sent: "An email was sent to %{value}" + notice_email_error: "An error occurred while sending mail (%{value})" + notice_feeds_access_key_reseted: Your RSS access key was reset. + notice_api_access_key_reseted: Your API access key was reset. + notice_failed_to_save_issues: "Failed to save %{count} issue(s) on %{total} selected: %{ids}." + notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + notice_failed_to_save_members: "Failed to save member(s): %{errors}." + notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit." + notice_account_pending: "Your account was created and is now pending administrator approval." + notice_default_data_loaded: Default configuration successfully loaded. + notice_unable_delete_version: Unable to delete version. + notice_unable_delete_time_entry: Unable to delete time log entry. + notice_issue_done_ratios_updated: Issue done ratios updated. + notice_gantt_chart_truncated: "The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})" + notice_issue_successful_create: "Issue %{id} created." + notice_issue_update_conflict: "The issue has been updated by an other user while you were editing it." + notice_account_deleted: "Your account has been permanently deleted." + notice_user_successful_create: "User %{id} created." + + error_attachment_empty: "error in add file" + error_class_period_only_num: "class period can only digital" + error_can_t_load_default_data: "Default configuration could not be loaded: %{value}" + error_scm_not_found: "The entry or revision was not found in the repository." + error_scm_command_failed: "An error occurred when trying to access the repository: %{value}" + error_scm_annotate: "The entry does not exist or cannot be annotated." + error_scm_annotate_big_text_file: "The entry cannot be annotated, as it exceeds the maximum text file size." + error_issue_not_found_in_project: 'The issue was not found or does not belong to this project' + error_no_tracker_in_project: 'No tracker is associated to this project. Please check the Project settings.' + error_no_default_issue_status: 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").' + error_can_not_delete_custom_field: Unable to delete custom field + error_can_not_delete_tracker: "This tracker contains issues and cannot be deleted." + error_can_not_remove_role: "This role is in use and cannot be deleted." + error_can_not_reopen_issue_on_closed_version: 'An issue assigned to a closed version cannot be reopened' + error_can_not_archive_project: This project cannot be archived + error_issue_done_ratios_not_updated: "Issue done ratios not updated." + error_workflow_copy_source: 'Please select a source tracker or role' + error_workflow_copy_target: 'Please select target tracker(s) and role(s)' + error_unable_delete_issue_status: 'Unable to delete issue status' + error_unable_to_connect: "Unable to connect (%{value})" + error_attachment_too_big: "This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})" + error_session_expired: "Your session has expired. Please login again." + warning_attachments_not_saved: "%{count} file(s) could not be saved." + + mail_subject_lost_password: "Your %{value} password" + mail_body_lost_password: 'To change your password, click on the following link:' + mail_subject_register: "Your %{value} account activation" + mail_body_register: 'To activate your account, click on the following link:' + mail_body_account_information_external: "You can use your %{value} account to log in." + mail_body_account_information: Your account information + mail_subject_account_activation_request: "%{value} account activation request" + mail_body_account_activation_request: "A new user (%{value}) has registered. The account is pending your approval:" + mail_subject_reminder: "%{count} issue(s) due in the next %{days} days" + mail_body_reminder: "%{count} issue(s) that are assigned to you are due in the next %{days} days:" + mail_subject_wiki_content_added: "'%{id}' wiki page has been added" + mail_body_wiki_content_added: "The '%{id}' wiki page has been added by %{author}." + mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated" + mail_body_wiki_content_updated: "The '%{id}' wiki page has been updated by %{author}." + + field_name: Name + field_description: Description + field_summary: Summary + field_is_required: Required + field_firstname: Name + field_lastname: Last name + field_mail: Email + field_job_category: Job category # added by bai + field_filename: File + field_file_dense: File Dense + field_filesize: Size + field_downloads: Downloads + field_author: Author + field_created_on: Created + field_updated_on: Updated + field_closed_on: Closed + field_field_format: Format + field_is_for_all: For all projects + field_possible_values: Possible values + field_regexp: Regular expression + field_min_length: Minimum length + field_max_length: Maximum length + field_value: Value + field_category: Category + field_title: Title + field_project: Project + field_issue: Issue + field_status: Status + field_notes: Notes + field_is_closed: Issue closed + field_is_default: Default value + field_tracker: Tracker + field_subject: Subject + field_due_date: Due date + field_assigned_to: Assignee + field_priority: Priority + field_fixed_version: Target version + field_user: User + field_principal: Principal + field_role: Role + field_homepage: Homepage + field_is_public: Public + field_parent: Subproject of + field_is_in_roadmap: Issues displayed in roadmap + field_login: Account/Email + field_mail_notification: Email notifications + field_admin: Administrator + field_last_login_on: Last connection + field_language: Language + field_effective_date: Date + field_password: Password + field_new_password: New password + field_password_confirmation: Confirmation + field_version: Version + field_type: Type + field_host: Host + field_port: Port + field_account: Account + field_base_dn: Base DN + field_attr_login: Login attribute + field_attr_firstname: Firstname attribute + field_attr_lastname: Lastname attribute + field_attr_mail: Email attribute + field_onthefly: On-the-fly user creation + field_start_date: Start date + field_done_ratio: "% Done" + field_auth_source: Authentication mode + field_hide_mail: Hide my email address + field_comments: Comment + field_url: URL + field_start_page: Start page + field_subproject: Subproject + field_hours: Hours + field_activity: Activity + field_spent_on: Date + field_identifier: Identifier + field_is_filter: Used as a filter + field_issue_to: Related issue + field_delay: Delay + field_assignable: Issues can be assigned to this role + field_redirect_existing_links: Redirect existing links + field_estimated_hours: Estimated time + field_column_names: Columns + field_time_entries: Log time + field_time_zone: Time zone + field_searchable: Searchable + field_default_value: Default value + field_comments_sorting: Display comments + field_parent_title: Parent page + field_editable: Editable + field_watcher: Watcher + field_identity_url: OpenID URL + field_content: Content + field_group_by: Group results by + field_sharing: Sharing + field_parent_issue: Parent task + field_member_of_group: "Assignee's group" + field_assigned_to_role: "Assignee's role" + field_text: Text field + field_visible: Visible + field_warn_on_leaving_unsaved: "Warn me when leaving a page with unsaved text" + field_issues_visibility: Issues visibility + field_is_private: Private + field_commit_logs_encoding: Commit messages encoding + field_scm_path_encoding: Path encoding + field_path_to_repository: Path to repository + field_root_directory: Root directory + field_cvsroot: CVSROOT + field_cvs_module: Module + field_repository_is_default: Main repository + field_multiple: Multiple values + field_auth_source_ldap_filter: LDAP filter + field_core_fields: Standard fields + field_timeout: "Timeout (in seconds)" + field_board_parent: Parent forum + field_private_notes: Private notes + field_inherit_members: Inherit members + + setting_app_title: Application title + setting_app_subtitle: Application subtitle + setting_welcome_text: Welcome text + setting_default_language: Default language + setting_login_required: Authentication required + setting_self_registration: Self-registration + setting_attachment_max_size: Maximum attachment size + setting_issues_export_limit: Issues export limit + setting_mail_from: Emission email address + setting_bcc_recipients: Blind carbon copy recipients (bcc) + setting_plain_text_mail: Plain text mail (no HTML) + setting_host_name: Host name and path + setting_text_formatting: Text formatting + setting_wiki_compression: Wiki history compression + setting_feeds_limit: Maximum number of items in Atom feeds + setting_default_projects_public: New projects are public by default + setting_autofetch_changesets: Fetch commits automatically + setting_sys_api_enabled: Enable WS for repository management + setting_commit_ref_keywords: Referencing keywords + setting_commit_fix_keywords: Fixing keywords + setting_autologin: Autologin + setting_date_format: Date format + setting_time_format: Time format + setting_cross_project_issue_relations: Allow cross-project issue relations + setting_cross_project_subtasks: Allow cross-project subtasks + setting_issue_list_default_columns: Default columns displayed on the issue list + setting_repositories_encodings: Attachments and repositories encodings + setting_emails_header: Email header + setting_emails_footer: Email footer + setting_protocol: Protocol + setting_per_page_options: Objects per page options + setting_user_format: Users display format + setting_activity_days_default: Days displayed on project activity + setting_display_subprojects_issues: Display subprojects issues on main projects by default + setting_enabled_scm: Enabled SCM + setting_mail_handler_body_delimiters: "Truncate emails after one of these lines" + setting_mail_handler_api_enabled: Enable WS for incoming emails + setting_mail_handler_api_key: API key + setting_sequential_project_identifiers: Generate sequential project identifiers + setting_gravatar_enabled: Use Gravatar user icons + setting_gravatar_default: Default Gravatar image + setting_diff_max_lines_displayed: Maximum number of diff lines displayed + setting_file_max_size_displayed: Maximum size of text files displayed inline + setting_repository_log_display_limit: Maximum number of revisions displayed on file log + setting_openid: Allow OpenID login and registration + setting_password_min_length: Minimum password length + setting_new_project_user_role_id: Role given to a non-admin user who creates a project + setting_default_projects_modules: Default enabled modules for new projects + setting_issue_done_ratio: Calculate the issue done ratio with + setting_issue_done_ratio_issue_field: Use the issue field + setting_issue_done_ratio_issue_status: Use the issue status + setting_start_of_week: Start calendars on + setting_rest_api_enabled: Enable REST web service + setting_cache_formatted_text: Cache formatted text + setting_default_notification_option: Default notification option + setting_commit_logtime_enabled: Enable time logging + setting_commit_logtime_activity_id: Activity for logged time + setting_gantt_items_limit: Maximum number of items displayed on the gantt chart + setting_issue_group_assignment: Allow issue assignment to groups + setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues + setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed + setting_unsubscribe: Allow users to delete their own account + setting_session_lifetime: Session maximum lifetime + setting_session_timeout: Session inactivity timeout + setting_thumbnails_enabled: Display attachment thumbnails + setting_thumbnails_size: Thumbnails size (in pixels) + setting_non_working_week_days: Non-working days + setting_jsonp_enabled: Enable JSONP support + setting_default_projects_tracker_ids: Default trackers for new projects + + permission_add_project: Create project + permission_add_subprojects: Create subprojects + permission_edit_project: Edit project + permission_close_project: Close / reopen the project + permission_select_project_modules: Select project modules + permission_manage_members: Manage members + permission_manage_project_activities: Manage project activities + permission_manage_versions: Manage versions + permission_manage_categories: Manage issue categories + permission_view_issues: View Issues + permission_add_issues: Add issues + permission_edit_issues: Edit issues + permission_manage_issue_relations: Manage issue relations + permission_set_issues_private: Set issues public or private + permission_set_own_issues_private: Set own issues public or private + permission_add_issue_notes: Add notes + permission_edit_issue_notes: Edit notes + permission_edit_own_issue_notes: Edit own notes + permission_view_private_notes: View private notes + permission_set_notes_private: Set notes as private + permission_move_issues: Move issues + permission_delete_issues: Delete issues + permission_manage_public_queries: Manage public queries + permission_save_queries: Save queries + permission_view_gantt: View gantt chart + permission_view_calendar: View calendar + permission_view_issue_watchers: View watchers list + permission_add_issue_watchers: Add watchers + permission_delete_issue_watchers: Delete watchers + permission_log_time: Log spent time + permission_view_time_entries: View spent time + permission_edit_time_entries: Edit time logs + permission_edit_own_time_entries: Edit own time logs + permission_manage_news: Manage news + permission_comment_news: Comment news + permission_view_documents: View documents + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + permission_manage_files: Manage files + permission_view_files: View files + permission_manage_wiki: Manage wiki + permission_rename_wiki_pages: Rename wiki pages + permission_delete_wiki_pages: Delete wiki pages + permission_view_wiki_pages: View wiki + permission_view_wiki_edits: View wiki history + permission_edit_wiki_pages: Edit wiki pages + permission_delete_wiki_pages_attachments: Delete attachments + permission_protect_wiki_pages: Protect wiki pages + permission_manage_repository: Manage repository + permission_browse_repository: Browse repository + permission_view_changesets: View changesets + permission_commit_access: Commit access + permission_manage_boards: Manage forums + permission_view_messages: View messages + permission_add_messages: Post messages + permission_edit_messages: Edit messages + permission_edit_own_messages: Edit own messages + permission_delete_messages: Delete messages + permission_delete_own_messages: Delete own messages + permission_export_wiki_pages: Export wiki pages + permission_manage_subtasks: Manage subtasks + permission_manage_related_issues: Manage related issues + permission_view_journals_for_messages: View journals messages + permission_view_courses: View courses + permission_new_course: Create course + permission_configure_course: Configure course + permission_close_course: Close/open course + permission_new_assignment: Create assignment + permission_edit_assignment: Edit assignment + permission_delete_assignment: Delete assignment + permission_new_placeholder: Create placeholder + permission_edit_placeholder: Edit placeholder + permission_delete_placeholder: Delete placeholder + permission_commit_content: Commit content + permission_new_course_notify: Create course notify + permission_edit_course_notify: Eidt course notify + permission_delete_course_notify: Delete course notify + permission_view_assignment: View assignment + permission_view_placeholder: View placeholder + permission_view_course_messages: View course messages + permission_view_real_name: View real name + permission_view_students: View students + permission_export_homeworks: Export homeworks + + project_module_issue_tracking: Issue tracking + project_module_time_tracking: Time tracking + project_module_news: News + project_module_documents: Documents + project_module_files: Files + project_module_wiki: Wiki + project_module_repository: Repository + project_module_boards: Forums + project_module_calendar: Calendar + project_module_gantt: Gantt + + label_user: User + label_user_plural: Users + label_user_new: New user + label_user_anonymous: Anonymous + label_project: Project + label_activity_project: 'Project: ' #added by bai + label_project_new: New project + label_project_plural: Projects + label_project_deposit: Projects + label_x_projects: + zero: no projects + one: 1 project + other: "%{count} projects" + label_project_all: All Projects + label_project_latest: Latest projects + label_issue: Issue + label_issue_new: New issue + label_issue_plural: Issues + label_issue_view_all: View all issues + label_issues_by: "Issues by %{value}" + label_issue_added: Issue added + label_issue_updated: Issue updated + label_issue_note_added: Note added + label_issue_status_updated: Status updated + label_issue_priority_updated: Priority updated + label_document: Document + label_document_new: New document + label_document_plural: Documents + label_document_added: Document added + label_document_public_info: "If you don't choose public, only the project's members can see the document." + label_role: Role + label_role_plural: Roles + label_role_new: New role + label_role_and_permissions: Roles and permissions + label_role_anonymous: Anonymous + label_role_non_member: Non member + label_member: Members + label_member_new: New member + label_member_plural: Members + label_tracker: Tracker + label_tracker_plural: Trackers + label_tracker_new: New tracker + label_workflow: Workflow + label_issue_status: Issue status + label_issue_status_plural: Issue statuses + label_issue_status_new: New status + label_issue_category: Issue category + label_issue_category_plural: Issue categories + label_issue_category_new: New category + label_custom_field: Custom field + label_custom_field_plural: Custom fields + label_custom_field_new: New custom field + label_enumerations: Enumerations + label_enumeration_new: New value + label_information: Information + label_information_plural: Information + label_please_login: Please log in + label_register: Sign up + label_login_with_open_id_option: or login with OpenID + label_password_lost: Lost password + label_home: Home + label_my_page: My page + label_my_account: My account + label_my_message: My messages + label_my_projects: My projects + label_my_page_block: My page block + label_administration: Administration + label_login: Login + label_logout: Sign out + label_help: Help + label_reported_issues: Reported issues + label_assigned_to_me_issues: Issues assigned to me + label_last_login: Last connection + label_registered_on: Registered on + label_activity: Activities + label_overall_activity: Overall activity + label_user_activity: "%{value}'s activity" + label_new: New + label_new_user: registered a new account + label_logged_as: Logged in as + label_environment: Environment + label_authentication: Authentication + label_auth_source: Authentication mode + label_auth_source_new: New authentication mode + label_auth_source_plural: Authentication modes + label_subproject_plural: Subprojects + label_subproject_new: New subproject + label_and_its_subprojects: "%{value} and its subprojects" + label_min_max_length: Min - Max length + label_list: List + label_date: Date + label_integer: Integer + label_float: Float + label_boolean: Boolean + label_string: Text + label_text: Long text + label_attribute: Attribute + label_attribute_plural: Attributes + label_no_data: No data to display + label_change_status: Change status + label_history: History + label_attachment: Files + label_attachment_new: New file + label_attachment_delete: Delete file + label_attachment_plural: Files + label_file_added: File added + label_report: Report + label_report_plural: Reports + label_news: News + label_news_new: Add news + label_news_plural: News + label_news_latest: Latest news + label_news_view_all: View all news + label_news_added: News added + label_news_comment_added: Comment added to a news + label_settings: Settings + label_overview: Activities + label_version: Version + label_version_new: New version + label_version_plural: Versions + label_close_versions: Close completed versions + label_confirmation: Confirmation + label_export_to: 'Also available in:' + label_read: Read... + label_public_projects: Public projects + label_open_issues: open + label_open_issues_plural: open + label_closed_issues: closed + label_closed_issues_plural: closed + label_x_open_issues_abbr_on_total: + zero: 0 open / %{total} + one: 1 open / %{total} + other: "%{count} open / %{total}" + label_x_open_issues_abbr: + zero: 0 open + one: 1 open + other: "%{count} open" + label_x_closed_issues_abbr: + zero: 0 closed + one: 1 closed + other: "%{count} closed" + label_x_issues: + zero: 0 issues + one: 1 issue + other: "%{count} issues" + label_total: Total + label_total_time: Total time + label_permissions: Permissions + label_current_status: Current status + label_new_statuses_allowed: New statuses allowed + label_all: all + label_any: any + label_none: none + label_nobody: nobody + label_next: Next + label_previous: Previous + label_used_by: Used by + label_details: Details + label_add_note: Add a note + label_per_page: Per page + label_calendar: Calendar + label_months_from: months from + label_gantt: Gantt + label_internal: Internal + label_last_changes: "last %{count} changes" + label_change_view_all: View all changes + label_personalize_page: Personalize this page + label_comment: Comment + label_comment_plural: Comments + label_x_comments: + zero: no comments + one: 1 comment + other: "%{count} comments" + label_comment_add: Add a comment + label_comment_added: Comment added + label_comment_delete: Delete comments + label_query: Custom query + label_query_plural: Custom queries + label_query_new: New query + label_my_queries: My custom queries + label_filter_add: Add filter + label_filter_plural: Query condition + label_equals: is + label_not_equals: is not + label_in_less_than: in less than + label_in_more_than: in more than + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_in_users: 'in the user ' + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_between: between + label_in: in + label_today: today + label_all_time: all time + label_yesterday: yesterday + label_this_week: this week + label_last_week: last week + label_last_n_weeks: "last %{count} weeks" + label_last_n_days: "last %{count} days" + label_this_month: this month + label_last_month: last month + label_this_year: this year + label_date_range: Date range + label_less_than_ago: less than days ago + label_more_than_ago: more than days ago + label_ago: days ago + label_contains: contains + label_not_contains: doesn't contain + label_any_issues_in_project: any issues in project + label_any_issues_not_in_project: any issues not in project + label_no_issues_in_project: no issues in project + label_day_plural: days + label_repository: Repository + #add by tan + label_repository_new: Repository setting + label_repository_no: Have no repository? + label_repository_new_repos: New repository + #end + label_repository_plural: Repositories + label_browse: Browse + label_branch: Branch + label_tag: Tag + label_revision: Revision + label_revision_plural: Revisions + label_revision_id: "Revision %{value}" + label_associated_revisions: Associated revisions + label_added: added + label_modified: modified + label_copied: copied + label_renamed: renamed + label_deleted: deleted + label_latest_revision: Latest revision + label_latest_revision_plural: Latest revisions + label_view_revisions: View revisions + label_view_all_revisions: View all revisions + label_max_size: Maximum size + label_sort_highest: Move to top + label_sort_higher: Move up + label_sort_lower: Move down + label_sort_lowest: Move to bottom + label_roadmap: Roadmap + label_roadmap_due_in: "Due in %{value}" + label_roadmap_overdue: "%{value} late" + label_roadmap_no_issues: No issues for this version + label_search: Search + label_result_plural: Results + label_all_words: All words + label_wiki: Wiki + label_wiki_edit: Wiki edit + label_wiki_edit_plural: Wiki edits + label_wiki_page: Wiki page + label_wiki_page_plural: Wiki pages + label_index_by_title: Index by title + label_index_by_date: Index by date + label_current_version: Current version + label_preview: Preview + label_feed_plural: Feeds + label_changes_details: Details of all changes + label_issue_tracking: Issue tracking + label_spent_time: Spent time + label_overall_spent_time: Overall spent time + label_f_hour: "%{value} hour" + label_f_hour_plural: "%{value} hours" + label_time_tracking: Time tracking + label_change_plural: Changes + label_statistics: Statistics + label_commits_per_month: Commits per month + label_commits_per_author: Commits per author + label_diff: diff + label_view_diff: View differences + label_diff_inline: inline + label_diff_side_by_side: side by side + label_options: Options + label_copy_workflow_from: Copy workflow from + label_permissions_report: Permissions report + label_watched_issues: Watched issues + label_related_issues: Related issues + label_applied_status: Applied status + label_loading: Loading... + label_relation_new: New relation + label_relation_delete: Delete relation + label_relates_to: Related to + label_duplicates: Duplicates + label_duplicated_by: Duplicated by + label_blocks: Blocks + label_blocked_by: Blocked by + label_precedes: Precedes + label_follows: Follows + label_copied_to: Copied to + label_copied_from: Copied from + label_end_to_start: end to start + label_end_to_end: end to end + label_start_to_start: start to start + label_start_to_end: start to end + label_stay_logged_in: Stay logged in + label_disabled: disabled + label_show_completed_versions: Show completed versions + label_me: me + label_board: Forums + label_board_description: Bring together the wisdom of crowds, and solve problems for you! + label_board_new: New forum + label_board_plural: Forums + label_board_locked: Locked + label_board_sticky: Sticky + label_topic_plural: Topics + field_sticky: '' + field_locked: '' + field_lock: '' + label_message_plural: Messages + label_message_last: Last message + label_message_new: New message + label_message_posted: Message added + label_reply_plural: Replies + label_send_information: Send account information to the user + label_year: Year + label_month: Month + label_week: Week + label_date_from: From + label_date_to: To + label_language_based: Based on user's language + label_sort_by: "Sort by %{value}" + label_send_test_email: Send a test email + label_feeds_access_key: RSS access key + label_missing_feeds_access_key: Missing a RSS access key + label_feeds_access_key_created_on: "RSS access key created %{value} ago" + label_module_plural: Modules + label_added_time_by: "Added by %{author} %{age} ago" + label_updated_time_by: "Updated by %{author} %{age} ago" + label_updated_time: "Updated %{value} ago" + label_jump_to_a_project: Jump to a project... + label_file_plural: Files + label_changeset_plural: Changesets + label_default_columns: Default columns + label_no_change_option: (No change) + label_bulk_edit_selected_issues: Bulk edit selected issues + label_bulk_edit_selected_time_entries: Bulk edit selected time entries + label_theme: Theme + label_default: Default + label_search_titles_only: Search titles only + label_user_mail_option_all: "For any event on all my projects" + label_user_mail_option_selected: "For any event on the selected projects only..." + label_user_mail_option_none: "No events" + label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in" + label_user_mail_option_only_assigned: "Only for things I am assigned to" + label_user_mail_option_only_owner: "Only for things I am the owner of" + label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself" + label_registration_activation_by_email: account activation by email + label_registration_manual_activation: manual account activation + label_registration_automatic_activation: automatic account activation + label_display_per_page: "Per page: %{value}" + label_age: Age + label_change_properties: Change properties + label_general: General + label_more: More + label_scm: SCM + label_plugins: Plugins + label_ldap_authentication: LDAP authentication + label_downloads_abbr: D/L + label_optional_description: Optional description + label_add_another_file: Add another file + label_preferences: Preferences + label_chronological_order: In chronological order + label_reverse_chronological_order: In reverse chronological order + label_planning: Planning + label_incoming_emails: Incoming emails + label_generate_key: Generate a key + label_issue_watchers: Watchers + label_example: Example + label_display: Display + label_sort: Sort + label_ascending: Ascending + label_descending: Descending + label_date_from_to: From %{start} to %{end} + label_wiki_content_added: Wiki page added + label_wiki_content_updated: Wiki page updated + label_group: Group + label_group_plural: Groups + label_group_new: New group + label_time_entry_plural: Spent time + label_version_sharing_none: Not shared + label_version_sharing_descendants: With subprojects + label_version_sharing_hierarchy: With project hierarchy + label_version_sharing_tree: With project tree + label_version_sharing_system: With all projects + label_update_issue_done_ratios: Update issue done ratios + label_copy_source: Source + label_copy_target: Target + label_copy_same_as_target: Same as target + label_display_used_statuses_only: Only display statuses that are used by this tracker + label_api_access_key: API access key + label_missing_api_access_key: Missing an API access key + label_api_access_key_created_on: "API access key created %{value} ago" + label_profile: Profile + label_subtask_plural: Subtasks + label_project_copy_notifications: Send email notifications during the project copy + label_principal_search: "Search for user or group:" + label_user_search: "Search for user:" + label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee + label_issues_visibility_all: All issues + label_issues_visibility_public: All non private issues + label_issues_visibility_own: Issues created by or assigned to the user + label_git_report_last_commit: Report last commit for files and directories + label_parent_revision: Parent + label_child_revision: Child + label_export_options: "%{export_format} export options" + label_copy_attachments: Copy attachments + label_copy_subtasks: Copy subtasks + label_item_position: "%{position} of %{count}" + label_completed_versions: Completed versions + label_search_for_watchers: Search for watchers to add + label_session_expiration: Session expiration + label_show_closed_projects: View closed projects + label_status_transitions: Status transitions + label_fields_permissions: Fields permissions + label_readonly: Read-only + label_required: Required + label_attribute_of_project: "Project's %{name}" + label_attribute_of_issue: "Issue's %{name}" + label_attribute_of_author: "Author's %{name}" + label_attribute_of_assigned_to: "Assignee's %{name}" + label_attribute_of_user: "User's %{name}" + label_attribute_of_fixed_version: "Target version's %{name}" + label_cross_project_descendants: With subprojects + label_cross_project_tree: With project tree + label_cross_project_hierarchy: With project hierarchy + label_cross_project_system: With all projects + label_gantt_progress_line: Progress line + label_files_filter: Files Filter: + + button_login: Login + button_submit: Submit + button_save: Save + button_check_all: Check all + button_uncheck_all: Uncheck all + button_collapse_all: Collapse all + button_expand_all: Expand all + button_delete: Delete + button_create: Create + button_create_and_continue: Create and continue + button_test: Test + button_edit: Edit + button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" + button_add: Add + button_change: Change + button_apply: Query + button_clear: Cancel query + button_lock: Lock + button_unlock: Unlock + button_download: Download + button_list: List + button_view: View + button_move: Move + button_move_and_follow: Move and follow + button_back: Back + button_cancel: Cancel + button_activate: Activate + button_sort: Sort + button_log_time: Log time + button_rollback: Rollback to this version + button_watch: Watch + button_unwatch: Unwatch + button_reply: Reply + button_archive: Archive + button_unarchive: Unarchive + button_reset: Reset + button_rename: Rename + button_change_password: Change password + button_copy: Copy + button_copy_and_follow: Copy and follow + button_annotate: Annotate + button_update: Update + button_configure: Configure + button_quote: Quote + button_duplicate: Duplicate + button_show: Show + button_hide: Hide + button_edit_section: Edit this section + button_export: Export + button_delete_my_account: Delete my account + button_close: Close + button_reopen: Reopen + + status_active: active + status_registered: registered + status_locked: locked + + project_status_active: active + project_status_closed: closed + project_status_archived: archived + + version_status_open: open + version_status_locked: locked + version_status_closed: closed + + field_active: Active + + text_select_mail_notifications: Select actions for which email notifications should be sent. + text_regexp_info: eg. ^[A-Z0-9]+$ + text_min_max_length_info: 0 means no restriction + text_project_destroy_confirmation: Are you sure you want to delete this project and related data? + text_subprojects_destroy_warning: "Its subproject(s): %{value} will be also deleted." + text_workflow_edit: Select a role and a tracker to edit the workflow + text_are_you_sure: Are you sure? + text_journal_changed: "%{label} changed from %{old} to %{new}" + text_journal_changed_no_detail: "%{label} updated" + text_journal_set_to: "%{label} set to %{value}" + text_journal_deleted: "%{label} deleted (%{old})" + text_journal_added: "%{label} %{value} added" + text_tip_issue_begin_day: issue beginning this day + text_tip_issue_end_day: issue ending this day + text_tip_issue_begin_end_day: issue beginning and ending this day + text_project_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter.
    Once saved, the identifier cannot be changed.' + text_caracters_maximum: "%{count} characters maximum." + text_caracters_minimum: "Must be at least %{count} characters long." + text_length_between: "Length between %{min} and %{max} characters." + text_tracker_no_workflow: No workflow defined for this tracker + text_unallowed_characters: Unallowed characters + text_comma_separated: Multiple values allowed (comma separated). + text_line_separated: Multiple values allowed (one line for each value). + text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages + text_issue_added: "Issue %{id} has been reported by %{author}." + text_issue_updated: "Issue %{id} has been updated by %{author}." + text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content? + text_issue_category_destroy_question: "Some issues (%{count}) are assigned to this category. What do you want to do?" + text_issue_category_destroy_assignments: Remove category assignments + text_issue_category_reassign_to: Reassign issues to this category + text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)." + text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded." + text_load_default_configuration: Load the default configuration + text_status_changed_by_changeset: "Applied in changeset %{value}." + text_time_logged_by_changeset: "Applied in changeset %{value}." + text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s)?' + text_issues_destroy_descendants_confirmation: "This will also delete %{count} subtask(s)." + text_time_entries_destroy_confirmation: 'Are you sure you want to delete the selected time entr(y/ies)?' + text_select_project_modules: 'Select modules to enable for this project:' + text_default_administrator_account_changed: Default administrator account changed + text_file_repository_writable: Attachments directory writable + text_plugin_assets_writable: Plugin assets directory writable + text_rmagick_available: RMagick available (optional) + text_destroy_time_entries_question: "%{hours} hours were reported on the issues you are about to delete. What do you want to do?" + text_destroy_time_entries: Delete reported hours + text_assign_time_entries_to_project: Assign reported hours to the project + text_reassign_time_entries: 'Reassign reported hours to this issue:' + text_user_wrote: "%{value} wrote:" + text_enumeration_destroy_question: "%{count} objects are assigned to this value." + text_enumeration_category_reassign_to: 'Reassign them to this value:' + text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/configuration.yml and restart the application to enable them." + text_repository_usernames_mapping: "Select or update the Trustie user mapped to each username found in the repository log.\nUsers with the same Trustie and repository username or email are automatically mapped." + text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.' + text_custom_field_possible_values_info: 'One line for each value' + text_wiki_page_destroy_question: "This page has %{descendants} child page(s) and descendant(s). What do you want to do?" + text_wiki_page_nullify_children: "Keep child pages as root pages" + text_wiki_page_destroy_children: "Delete child pages and all their descendants" + text_wiki_page_reassign_children: "Reassign child pages to this parent page" + text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" + text_zoom_in: Zoom in + text_zoom_out: Zoom out + text_warn_on_leaving_unsaved: "The current page contains unsaved text that will be lost if you leave this page." + text_scm_path_encoding_note: "Default: UTF-8" + text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) + text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) + text_scm_command: Command + text_scm_command_version: Version + text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. + text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + text_issue_conflict_resolution_overwrite: "Apply my changes anyway (previous notes will be kept but some changes may be overwritten)" + text_issue_conflict_resolution_add_notes: "Add my notes and discard my other changes" + text_issue_conflict_resolution_cancel: "Discard all my changes and redisplay %{link}" + text_account_destroy_confirmation: "Are you sure you want to proceed?\nYour account will be permanently deleted, with no way to reactivate it." + text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." + text_project_closed: This project is closed and read-only. + text_turning_multiple_off: "If you disable multiple values, multiple values will be removed in order to preserve only one value per item." + text_applied_project: "User %{id} Apply Join Project %{project}" + + default_role_manager: Manager + default_role_developer: Developer + default_role_reporter: Reporter + default_tracker_bug: Bug + default_tracker_feature: Feature + default_tracker_support: Support + default_issue_status_new: New + default_issue_status_in_progress: In Progress + default_issue_status_resolved: Resolved + default_issue_status_feedback: Feedback + default_issue_status_closed: Closed + default_issue_status_rejected: Rejected + default_doc_category_user: User documentation + default_doc_category_tech: Technical documentation + default_priority_low: Low + default_priority_normal: Normal + default_priority_high: High + default_priority_urgent: Urgent + default_priority_immediate: Immediate + default_activity_design: Design + default_activity_development: Development + + enumeration_issue_priorities: Issue priorities + enumeration_doc_categories: Document categories + enumeration_activities: Activities + enumeration_system_activity: System Activity + description_filter: Filter + description_search: Searchfield + description_choose_project: Projects + description_project_scope: Search scope + description_notes: Notes + description_message_content: Message content + description_query_sort_criteria_attribute: Sort attribute + description_query_sort_criteria_direction: Sort direction + description_user_mail_notification: Mail notification settings + description_available_columns: Available Columns + description_selected_columns: Selected Columns + description_all_columns: All Columns + description_issue_category_reassign: Choose issue category + description_wiki_subpages_reassign: Choose new parent page + description_date_range_list: Choose range from list + description_date_range_interval: Choose range by selecting start and end date + description_date_from: Enter start date + description_date_to: Enter end date + text_repository_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed.' + + #modify by mkz + #by young + label_requirement: Calls + label_requirement_focus: Calls # modified by bai + label_developer: Users + label_investor: Investor: + label_theme: Theme + label_logged_as_new: Current user + button_register: Register + issue_list: Issue list + lastest_respond: Lastest reply + label_news_lastest: Lastest news + label_version_display_settings: Display settings + label_versions_progress: Complete schedule + label_versions_description: Versions description + label_my_photo: My photo + label_documents_sort: Order setting: + label_activities_settings: Display settings + #end + + label_joined_course: Joined Courses + label_created_course: Created Courses + label_borad_course: Course Borad + + #huang + label_file_new: Download + label_user_edit: "Edit information" + label_my_course: "My Course" + label_user_info: "User information" #huang 添加 + label_user_watcher: "Following" # huang添加的 # modified by bai + label_user_fans: "Followed by" # modified by bai + + # modify by men + label_x_user_fans: + zero: fan + one: fan + other: fans + #end + label_user_commits: "Code commits" + label_user_watchered: "Followed by" # huang添加的 + label_user_newfeedback: "Messages" ## huang添加的 # modified by bai + label_user_login: "Last login:" + label_user_mail: "E-mail:" + label_user_joinin: "Join date:" + label_user_activities: "You have no activities,come and join us!" + label_user_activities_other: The user has no activities now! + label_project_overview: "Overview" + label_project_tool: "Tool" + label_project_issues: "Issues" + label_project_newother: "See other comments" + label_project_newshare: "has shared" + label_project_newadd: "added" + label_project_unadd: "No project,go to creat it!" + label_project_un: "You haven't joined any project!" + #end by huang + + #added by liuping + button_unfollow: Unfollow + button_follow: Follow + label_delete_confirm: Confirm delete? + label_more_tags: More + label_tags_bid: Call name + label_tags_bid_description: call description + label_tags_issue_description: issue description + label_tags_all_objects: all objects + label_apply_project: Apply Project + label_exit_project: Exit Project + label_apply_project_waiting: "Application has been submitted, please wait for administrator review." + label_unapply_project: Unsubscribe + + #fq + button_leave_meassge: Submit + label_leave_message_to: leave %{name} a message + label_leave_message: Message content + label_message: message board + field_add: Add before %{time} + button_more: More + label_user_response: Feedback # modified by bai + label_bidding_project: projects + button_bidding: I will participate in it + label_new_call: New call + label_user_information: My informations + + #Customer added!Added by nie + label_create_time: Created time + label_current_contributors: current contributors + #modify by men + label_x_current_contributors: + zero: current contributor + one: current contributor + other: current contributors + #end + label_lines_of_code: lines of code + label_since_last_commits: since last commit + label_users_on_trustie: User + label_front: first page + label_commit_on: commit times + #modify by men + label_x_commit_on: + zero: commit time + one: commit time + other: commit times + #end + label_follow_people: following # modified by bai + #modify by men + label_x_follow_people: + zero: Follower + one: Follower + other: Followers + #end + label_member_since: joined + label_contribute_to: Participates %{project_count} projects: + #modify by men + label_x_contribute_to: + zero: Participates %{count} project: + one: Participates %{count} project: + other: Participates %{count} projects: + #end + label_total_commit: Totally %{total_commit} commits # modified by bai + #modify by men + label_x_total_commit: + zero: Totally %{count} commit + one: Totally %{count} commit + other: Totally %{count} commits + #end + label_upload_profile: Upload avatar + label_type_as: Type as + label_status_as: Status as + label_priority_as: Priority as + label_member_list: Member list + label_author_name: Posted by %{author_name} + label_comments_count: (%{count} comments) + label_post_on: posts on + label_find_all_comments: view all comments + label_updated_time_on: " Updated on %{value} " + label_call_list: Calls list + + label_requirement_list: Requirement list + label_x_biding_project: #modify by men + zero: project + one: project + other: projects + #end + label_x_responses: #modify by men + zero: comment + one: comment + other: comments + #end + label_x_followers: #modified by men + zero: Follower + one: Follower + other: Followers + #end + + + + label_price: price: + label_RMB_sign: ¥ + label_investment_budget: Investment budget: + label_investment_time_limit: Investment time limit: + label_my_respond: Feedbacks: # modified by bai + label_respond_requirement: has commented this call + label_deadline: deadline yyyy-mm-dd + label_requirement_name: give your requirement a name ~~ + label_requirement_description: content:descript your requirement + label_requirement_bargain_money: type in your rewards(ex. money, reward, grade) + label_wrong_budget: The error format of money + label_wrong_date: wrong date format, input right date yyyy-mm-dd + button_upload_photo: Upload photo + label_leave_me_message: left a message to me + label_leave_others_message: leave message to him/her + label_leave_a_message: Leave him/her a message: + label_leave_your_message: Leave a message to you + label_new_activities: ' has new activity in' # modified by bai + label_new_activity: ' has new activity in' + label_i_new_activity: ' have new activity in' + label_create_project: had participated in + label_praise: praise + label_cancel_praise: cancel praise + label_bid_reason: Please show your reason + default_tracker_task: Task + label_create_new_projects_description: Create a new project, you will open a magical journey of collaborative creation and development! + label_call_for_bids_description: Publish your call for anything, feel the excitement of hundreds respond to a single call! + label_create_course_description: Create a new course, let us share the public resources in the course community which are more than you can imagine! + label_news: News + label_news_description: Track the latest activities of projects, and obtain the latest information! + label_milestone: Milestone + label_milestone_description: Review the commits, branches and versions of your project! + label_features: Features + label_has_praisers: praisers(%{count}) + label_has_watchers: following(%{count}) # modified by bai + label_has_fans: followed by(%{count}) # modified by bai + #modify by men + label_x_has_fans: + zero: fan(%{count}) + one: fan(%{count}) + other: fans(%{count}) + #end + label_me: me + label_my: my + label_i: I + label_join_bidding: joined the bidding + label_bidding_user: Bidding user: + label_bidding_reason: Bidding reason: + label_username: username: + label_password: password: + label_about_requirement: about requirement: + label_about_issue: about issue: + label_quote_my_words: ' quoted my words' + label_have_respond: had a respond + label_welcome: Welcome + + label_goto: Go to>> + label_join: join Trustie! + label_repository_new: link to existing SVN repository + label_repository_path: path of repository + label_repository_new_repos: create a new repository + label_repository_no: have no repository? + label_welcome_page_to: Participate %{project_count} projects! + label_repository_path_not_null: repository path can't be null + label_password_not_null: password can't be blank + label_exist_repository_path: Define exist repository's path of URL and format must be file:///, http://, https://, svn:// + label_project_no_activity: The project has no activities now! + label_follow_no_requirement: You don't have followed any requirements! + label_no_user_respond_you: There is no respond for you! + label_tags_issue: issue: + label_tags_project_name: Project name: + label_tags_project_description: Project description: + label_tags_user_mail: User E-mail: + label_tags_user_name: User Name: + label_tags_numbers: Tag numbers: + label_max_number: Open label nickname is displayed on the web site of your,Must be at most 25 characters long. + label_all_revisions: All revisions: + label_repository_name: Repository name + label_upassword_info: The password can be shared in the group + label_how_commit_code: How to commit code: + label_how_commit_code_chinese: Chinese + label_welcome_leave_message: Hi!The platform is currently in beta version.If you have any comments and suggestions, please + label_welcome_click_me: Click me + label_issue_praise: Good question,praise! + label_issue_tread: Poor question,tread! + label_issue_praise_over: Praised over! + label_issue_tread_over: Treaded over! + label_issue_appraise_over: Appraised over! + label_welcome_my_respond: Please leave your comments and suggestions here! + label_no_current_fans: the user has no fans now + label_no_current_watchers: the user hasn't watched others + label_project_tool_response: Response + label_course_feedback: Feedback + label_tags_search_result: Search Results + label_active_call: call + label_tags_call: Calls + label_user_extensions: Other information + label_boy: Man + label_girl: Woman + field_gender: Gender + field_birthday: Birthday + field_brief_introduction: Info + field_location: Location + field_occupation: Position + field_work_experience: Work experience(year) + field_zip_code: Zip code + label_reward: reward: + label_credit: credit: + label_choose_reward: choose reward + label_money: money + label_reward_1: others + label_bids_credit: credit + label_bids_credit_number: points + field_budget: reward + field_deadline: deadline + label_tags_selected: Selected Tags + label_tags_related: Related Tags + button_project_tags_add: Add + label_issue_query_condition: Query condition + label_homework_source: Task + label_issue_query: Query + label_issue_cancel_query: Cancel query + field_reward_type: The type of reward + label_tags_no: no tags now! + label_bid_publish: published + label_bid_project: projects + label_project_no_follow: The project hasn't been followed now! + label_no_bid_project: has no participate project + label_bids_reward_method: Reward: + label_bids_reward_what: input what for reward + label_call_bonus: bonus + label_bids_form_new_description: Publish a requirement,a competition or a course work. + label_bids_new_money: input the award money,such as 500,2.5 etc. + label_bids_new_credit: input the work corresponding course credits,such as 3,2.5 etc. + label_bids_new_content: input the award content,such as certificate,things etc. + label_user_login_tips: You havn't logged in,for leaving message please login first + label_user_login_new: login + label_project_sort: the way of sorting + #modified by bai + label_sort_by_time: sorted by time + label_sort_by_active: sorted by active + label_sort_by_influence: sorted by influence + #end + label_bids_published: published + label_bids_published_ago: ago + label_welcome_trustie: Trustie + label_welcome_trustie_project: Online projects hosting platform + label_welcome_trustie_course: Online Courses practice platform + label_welcome_trustie_contest: Online Contests practice platform + label_welcome_trustie_project_description: Software for Chinese college students and practitioners to provide social-oriented project management, code hosting, resource sharing, cooperation and exchange. + label_welcome_trustie_course_description: Teachers and Students for Chinese universities to provide social-oriented curriculum management, resource sharing, cooperation achieved, collaborative research. + label_welcome_trustie_contest_description: Software for Chinese college students and practitioners to provide social-oriented contest management, code hosting, resource sharing, cooperation and exchange. + label_welcome_trustie_description: a socialized collaboration platform for project management, collaborative research, software development and software crowdsourcing for creative university students and entrepreneurs. + label_user_project: Projects + label_bid_respond_quote: Respond + label_bid_if_agreement: If you like me, please press me #bai + label_bid_respond_delete: Delete + label_newfeedback_message: messages + label_newfeedback_quote: Respond + label_newfeedback_delete: Delete + label_user_all_activity: All activities + label_user_activity_myself: About me + label_user_all_respond: All replies + label_layouts_feedback: Messages + label_have_feedback: Have + label_of_feedback: Of + label_welcome_participate: participates + #modify by men + label_x_welcome_participate: + zero: participate + one: participate + other: participates + #end + label_welcome_participate_project: projects + label_projects_feedback: responded to the project + label_projects_feedback_respond: Respond + label_projects_feedback_respond_success: Respond success + button_projects_feedback_respond: Respond + label_projects_feedback_respond_content: Please input your words + label_in_issues: in the issue: + label_in_bids: in the call: + label_in_users: in the user: + label_user_create_project: has created + +#added by bai + label_identity: Identity + label_teacher: Teacher + label_student: Student + label_school_all: Schools + label_school_not_fount: Not found by your input query condition. + label_other: Other + label_gender: Gender + label_gender_male: male + label_gender_female: female + label_location: Location +#end + label_course: Course + label_course_new: New course + label_public_info: "If you don't choose public, only the project's members can see the project." + label_course_public_info: "If you don't choose public, only the course's members can see the course." + label_course_student: Student + label_homework: Task + label_course_new_homework: New homework + label_course_homework_list: Homework List + label_course_homework_new: new homework + + label_x_course_data: + zero: File + one: File + other: Files + + label_x_base_courses_student: + zero: student + one: students + other: students + label_x_base_courses_teacher: + zero: teacher + one: teachers + other: teachers + #add by men + label_brief_introduction: Personality words + label_technical_title: Title + label_technicl_title_professor: Professor + label_technicl_title_associate_professor: Associate professor + label_technicl_title_lecturer: Lecturer + label_technicl_title_teaching_assistant: Teaching assistant + label_account_identity_teacher: Teacher + label_account_identity_student: Student + label_account_identity_developer: Developer + label_account_identity_enterprise: Enterprise + label_account_identity_choose: --Please choose your identity-- + label_enter_college: College Entrance + lable_enter_enterprise: Enterprise Entrance + label_homework_info: Status + label_question_student: Feedback + label_student_response: Feedback + label_my_question: Please raise your questions here! + label_teacher_homework: "Teacher's name" + label_course_homework: Corresponding courses + label_course_done: finished courses + label_course_doing: Doing course + label_limit_time: Deadline + label_commit_homework: Submitted Task + label_no_course_project: No submitted work! + button_clear_requirement: Cancel +#end + label_x_bids_responses: #modify by huang + zero: response + one: response + other: responses + #end + label_teaching_course: My Courses + label_release_homework: Released Tasks + label_term: Term + label_spring: spring term + label_summer: summer term + label_autumn: autumn term + label_winter: winter term + text_command: The password is required when applying a course, and it will be released by the teacher of. + label_enterprise_into: Enterprise Entrance + label_college_into: College Entrance + label_user_course: Courses + label_new_course: Courses + field_tea_name: Teacher + label_course_college: College + label_x_task: + zero: Task + one: Task + other: Tasks + label_project_course_unadd: You have no course,creat one now! + label_my_create_honework_no_homework: no task now! + label_my_homework_no_homework: no task now! + label_x_member: + zero: member + one: member + other: members + label_x_data: + zero: file + one: file + other: files + label_bid_show_course_name: Course + label_bid_show_teacher_name: Teacher + label_bid_contest_show_course_name: Course + label_bid_contest_show_teacher_name: Teacher + label_x_homework_project: + zero: submitted task + one: submitted task + other: submitted tasks + label_new_homework: Tasks + label_new_contest: Contests + label_contest_list: Contests list + label_newtype_contest: Release contest + label_question_requirement: introduce a question! + label_contest_requirement: has commented this contest + button_bidding_homework: To take part in contest + label_bids_form_contest_new_description: Enterprise or college can release a contest here. + label_contest_name: Input the name of the contest + label_contest_description: Content:description your contest + label_main_teacher: Main teacher + label_main_term: Term + label_teacher_work_unit: Position + label_course_overview: Status + label_course_file: File + label_stores_index: Resource search + label_course_news: News + #wang + label_contest_userresponse: Userresponse + label_contest_joincontest: Joincontest + label_contest_notification: Notification + #end + label_x_base_courses_member: + zero: member + one: member + other: members + + label_bids_task_list: Tasks list + label_join_course: join course + label_exit_course: exit course + label_new_join: Join + label_new_join_order: Please input the course order. + label_homeworks_form_new_description: Release a task,the submit form of the task may be accessory or project,setting in the task form. + label_course_settings: Setting + field_homework_type: Submit form + label_task_submit_form_accessory: Submitted as accessory + label_task_submit_form_project: Submitted as project + label_news_notice: Release course news + + role_of_course: Role + label_student: student + label_teacher: teacher + label_ta: teacher assistant + label_in_course: in course + label_assign_homework: assigned homewok + label_noawards: No awards + label_user_location: Location + label_requirement_enterprise: Requirements + label_requirement_enterprise_list: Requirements List + label_contest_innovate: Competition community + label_software_user: Users + label_course_practice: Courses + label_course_all: Teacher + label_teacher_all: Student + label_user_home: User Space + + field_hidden_repo: code protected + label_newbie_faq: newbie FAQ + label_hot_project: 'HOT Projects' + label_memo_create_succ: Memo was successfully created. + label_memo_create_fail: Memo was failures created. + label_forum_create_succ: Forum was successfully created. + label_forum_create_fail: Forum was failures created. + label_forum_edit: Editing forum + label_memo_create: publish + label_memo_new: new memo + label_memo_edit: edit memo + label_project_module_forums: Forums + label_forum: Forum + label_tags_forum_description: Forum description + label_tags_forum: Call forum + label_memo_locked: 'Topic is locked' + label_downloads_list: enter file list. + label_sumbit_empty: search bar need container. + label_reply_empty: Reply Cann't Empty. + label_setup_time: Start date + label_endup_time: Over date + label_class_period: Class hour + label_class_hour: period + label_activity_time: publish date + + label_your_course: your course + label_have_message : have a new message + label_login_prompt: Email/NickName + :lable_not_receive_mail: Click here don't receive email form site! +#added by linchun as competition# + + label_current_hot_contest: Latest Hot Competition + label_current_attendingcontest_work: Latest Competition Work + label_issue_feedback_activities: Question&Feedback + label_more_information: More... + label_my_question: My-question + label_my_feedback: My-feedback + label_release_time: Release-time + label_question_sponsor: Sponsor + label_final_reply: Final-reply + label_reply: Reply + label_weixin: WeiXin + label_search_intimation: please input the keywords + label_work_quantity: work + label_projects_management_platform: Projects-platform + label_courses_management_platform: Courses-platform + label_contests_management_platform: Competitions-platform + label_contest_work: Competition work + label_contests_reward_method: Reward method + label_attendingcontestwork_developers: Developers + label_attendingcontestwork_release_time: Release time + label_attendingcontestwork_belongs_contest: Contesting + label_attendingcontestwork_belongs_type: Work-type + label_attendingcontestwork_release_person: Release person + label_attendingcontestwork_adaptive_system: Adaptive-system + label_attendingcontestwork_download: Work download + label_attendingcontestwork_average_scores: Average score + label_attendingcontestwork_deposit_project: Deposit project + label_attendingcontestwork_sorting_intimation: You can re-scoring, but just record the last scoring result! + + label_upload_files: Files-upload + label_upload_softwarepackage: Softwarepackage-upload + label_upload_cuttingphoto: Photo-upload + label_system_platform: Platform + label_nextstep: Next + label_participate: Participate + label_setting: Setting + label_contest_project: Competition-project + label_contest_softapplication: Competition-application + label_contest_response: Feedback + label_contest_watchers: Watchers + label_contest_work: Competition-work + button_contesting_as_project: Competition(New-project) + button_contesting_as_application: Competition(Release-app) + label_release_softapplication: Release-application + label_upload_softapplication_packets: Upload-apppacket + label_upload_softapplication_photo: Upload-appphoto + label_upload_softapplication_packets_mustpacketed: Works code and ralated-document must be packaged before upload. + label_upload_softapplication_photo_condition: The best works. 0~4 (redundant pictures would not show page), each is less than 5M, photo format such as gif,jpg,png etc. + label_updated_caution: Note:if you edit the work, the uploaded screenshot and package will be deleted, please re-load! + label_softapplication_name: App-name + label_work_name: Work name + label_softapplication_description: App-description + label_work_description: Work description + label_work_scores: Work score + label_work_rating: Work rating + label_work_tishi: You can re-scoring, but just record the last scoring result! + label_work_scores_proportion: Score porportion + label_softapplication_type: App-type + label_work_type: Work type + label_work_photo: Work photo + label_work_comment: Work comment + label_softapplication_version_available: Version + label_running_platform: Running platform + label_softapplication_developer: Upload person + label_softapplication_developers: Developers + label_work_deposit_project_url: Deposit url + label_work_deposit_project: Deposit project + label_softapplication_name_condition: Less than 50 characters + label_softapplication_description_condition: Less than 250 characters + label_user_login_softapplication_board: You are not logged in, please log in and then participate in the evaluation! + label_user_login_attending_contest: You are not logged in, please log in and then join the competition! + label_contest_description_no: No description + label_no_contest_softapplication: No application + label_button_ok: Ok + label_tags_contest: Competition tag + label_final_scores: Final scores + label_rating_person_amount: Rating person + label_tags_contest_description: Contest description + label_release_add_contest_succeed: The application succeed released and added! + label_add_contest_succeed_fail: Added fails, the application has been joined the competition! + label_no_ftapplication: No application + label_edit_softapplication: Edit application + label_edit_work: Edit work + label_contest_delete: Delete contest + label_noawards_current: No awards + label_softapplication: Application software + label_attending_contest: Joining + label_new_attendingcontest_work: New competition work + label_workname_lengthlimit: Less than 50 characters + label_workdescription_lengthlimit: Less than 250 characters + label_please_input_password: Please input the competition password! + label_please_select_project: Please select the project! + label_upload_softworkpacket_photo: Upload work package and screenshots + label_reward: Reward + label_please_select_contestingsoftapplication: Please select the competition application! + label_attendingcontest_time: Join-contest time + label_attendingcontest_spoksman: Join-contest representive + label_wellmeaning_intimation_contentone: Note:if you are ready attenging contest, please click"New competition work"! + label_wellmeaning_intimation_contenttwo: if you have already completed the development, and just release your work, you can not select"Deposit project"! + label_wellmeaning_intimation_contentthree: if you want to deposit the competition data and code, and want to keep track of the development and code-submission,please selcet a created project from"Deposit project", if you have no project, please click"New project"! + + notice_attendingcontest_work_successfully_created: Congratulations, competition work successfully created! + notice_softapplication_was_successfully_updated: Congratulations, competition work successfully updated! + + label_contest_notification: Notice + lable_contest_user: Release person + label_contest_innovate_community: Competition community + + label_user_login_score_and_comment: You are not logged in, please log in and then score and comment the work! + label_user_login_notificationcomment: You are not logged in, please log in and then comment the notification! + label_contest_work_list: Competition work list + + + label_borad_project: Project-borad + label_search_intimation: please input the searching keywords! + label_update_time: Update time + label_project_notice: release the notice + label_no_file_uploaded: No file uploaded + label_forum_new: New forum + label_memo_new_from_forum: Release memo + bale_edit_notice: Edit + + label_user_grade: Individual score + label_active_homework: homework + label_course_term: Semester + label_comment_time: Comment time + label_bidding_user_studentcode: Student ID + + label_organizers: Organizer + label_organizers_information: National Key Laboratory of Parallel and Distributed Processing, NUDT + label_organizers_information_institute: Department of Computer Sciencer and Technology + label_copyright: Copyright + label_contact_us: Contact us + label_record: 湘ICP备09019772 + label_check_comment: Check comment + label_notification: Notification + + +#end + + # ajax异步验证 + modal_valid_passing: can be used. + + label_company_name: Company Name + notice_account_invalid_creditentials_new: You have not to the mailbox activation + label_school_no_course: The school did not offer any courses, you can view other school curriculum + label_school_less_course: The school offers courses in less, you can view other school curriculum + label_file_not_found: Sorry, the file can't be downloaded now! + label_goto_homepage: Return to the home page + label_trustie_team: The Trustie development team + label_memos_max_length: The content of the post up to 65535 characters in length + label_forums_max_length: Post Bar describing the maximum length of 65535 characters + label_unknow_type: Unknow type + label_score_less_than_zero: Score less than 0, revised to 0 + review_assignments: Review assignments + label_private: private + label_my_school: My school + label_all_schol: All school + label_select_province: Please select the provinces label_search_conditions_not_null: The search conditions can not be empty \ No newline at end of file diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 8c3741deb..2333ea674 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -1,2125 +1,2125 @@ - -# Chinese (China) translations for Ruby on Rails -# by tsechingho (http://github.com/tsechingho) -zh: - # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) - direction: ltr - jquery: - locale: "zh-CN" - date: - formats: - # Use the strftime parameters for formats. - # When no format has been given, it uses default. - # You can provide other formats here if you like! - default: "%Y-%m-%d" - short: "%b%d日" - long: "%Y年%b%d日" - zh_date: - formats: - default: "%Y年%m月%d日" - - day_names: [星期天, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六] - abbr_day_names: [日, 一, 二, 三, 四, 五, 六] - - # Don't forget the nil at the beginning; there's no such thing as a 0th month - month_names: [~, 一月, 二月, 三月, 四月, 五月, 六月, 七月, 八月, 九月, 十月, 十一月, 十二月] - abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月] - # Used in date_select and datime_select. - order: - - :year - - :month - - :day - - time: - formats: - default: "%Y年%b%d日 %A %H:%M:%S" - time: "%H:%M" - short: "%b%d日 %H:%M" - long: "%Y年%b%d日 %H:%M" - am: "上午" - pm: "下午" - - datetime: - distance_in_words: - half_a_minute: "半分钟" - less_than_x_seconds: - one: "1秒内" - other: "少于 %{count} 秒" - x_seconds: - one: "1秒" - other: "%{count} 秒" - less_than_x_minutes: - one: "1分钟内" - other: "少于 %{count} 分钟" - x_minutes: - one: "1分钟" - other: "%{count} 分钟" - about_x_hours: - one: "大约1小时" - other: "大约 %{count} 小时" - x_hours: - one: "1 小时" - other: "%{count} 小时" - x_days: - one: "1天" - other: "%{count} 天" - about_x_months: - one: "大约1个月" - other: "大约 %{count} 个月" - x_months: - one: "1个月" - other: "%{count} 个月" - about_x_years: - one: "大约1年" - other: "大约 %{count} 年" - over_x_years: - one: "超过1年" - other: "超过 %{count} 年" - almost_x_years: - one: "将近 1 年" - other: "将近 %{count} 年" - - number: - # Default format for numbers - format: - separator: "." - delimiter: "" - precision: 3 - human: - format: - delimiter: "" - precision: 3 - storage_units: - format: "%n %u" - units: - byte: - one: "Byte" - other: "Bytes" - kb: "KB" - mb: "MB" - gb: "GB" - tb: "TB" - -# Used in array.to_sentence. - support: - array: - sentence_connector: "和" - skip_last_comma: false - - activerecord: - errors: - template: - header: - one: "由于发生了一个错误 %{model} 无法保存" - other: "%{count} 个错误使得 %{model} 无法保存" - messages: - inclusion: "不包含于列表中" - exclusion: "是保留关键字" - invalid: "是无效的" - confirmation: "与确认值不匹配" - accepted: "必须是可被接受的" - empty: "不能留空" - blank: "不能为空字符" - too_long: "过长(最长为 %{count} 个字符)" - too_short: "过短(最短为 %{count} 个字符)" - wrong_length: "长度非法(必须为 %{count} 个字符)" - taken: "已经被使用" - not_a_number: "不是数字" - not_a_date: "不是合法日期" - greater_than: "必须大于 %{count}" - greater_than_or_equal_to: "必须大于或等于 %{count}" - equal_to: "必须等于 %{count}" - less_than: "必须小于 %{count}" - less_than_or_equal_to: "必须小于或等于 %{count}" - odd: "必须为单数" - even: "必须为双数" - greater_than_start_date: "必须在起始日期之后" - not_same_project: "不属于同一个项目" - circular_dependency: "此关联将导致循环依赖" - cant_link_an_issue_with_a_descendant: "问题不能关联到它的子任务" - - actionview_instancetag_blank_option: 请选择 - - attachment_all: "全部" - attachment_sufix_browse: "文件类型" - attachment_browse: "内容类型" - attachment_type: '分类' - general_text_No: '否' - general_text_Yes: '是' - general_text_no: '否' - general_text_yes: '是' - general_lang_name: 'Simplified Chinese (简体中文)' - general_csv_separator: ',' - general_csv_decimal_separator: '.' - general_csv_encoding: gb18030 - general_pdf_encoding: gb18030 - general_first_day_of_week: '7' - - label_approve: 批准 - label_refusal: 拒绝 - - notice_account_updated: 帐号更新成功 - notice_account_invalid_creditentials: 无效的用户名或密码 - notice_account_invalid_creditentials_new: 您还未到邮箱激活 - notice_account_password_updated: 密码更新成功 - notice_account_wrong_password: 密码错误 - notice_account_register_done: 帐号创建成功,请使用注册确认邮件中的链接来激活您的帐号, 如果您的邮件没有在收件箱中可能在垃圾箱中,请您注意查收。 - notice_account_unknown_email: 未知用户 - notice_can_t_change_password: 该帐号使用了外部认证,因此无法更改密码。 - notice_account_lost_email_sent: 系统已将引导您设置新密码的邮件发送给您。 - notice_account_activated: 您的帐号已被激活。 - notice_successful_create: 创建成功 - notice_successful_update: 更新成功 - notice_successful_delete: 删除成功 - notice_failed_delete: 删除失败 - notice_successful_connection: 连接成功 - notice_file_not_found: 您访问的页面不存在或已被删除。 - notice_locking_conflict: 数据已被另一位用户更新 - notice_not_authorized: 对不起,您无权访问此页面。 - notice_has_homework: 您已经提交过一份作业 - notice_not_contest_setting_authorized: 对不起,您无权配置此竞赛。 - notice_not_contest_delete_authorized: 对不起,您无权删除此竞赛。 - notice_not_authorized_archived_project: 要访问的项目已经归档。 - notice_email_sent: "邮件已发送至 %{value}" - notice_email_error: "发送邮件时发生错误 (%{value})" - notice_feeds_access_key_reseted: 您的RSS存取键已被重置。 - notice_api_access_key_reseted: 您的API访问键已被重置。 - notice_failed_to_save_issues: "%{count} 个问题保存失败(共选择 %{total} 个问题):%{ids}." - notice_failed_to_save_members: "成员保存失败: %{errors}." - notice_no_issue_selected: "未选择任何问题!请选择您要编辑的问题。" - notice_account_pending: "您的帐号已被成功创建,正在等待管理员的审核。" - notice_default_data_loaded: 成功载入默认设置。 - notice_unable_delete_version: 无法删除版本 - notice_unable_delete_time_entry: 无法删除工时 - notice_issue_done_ratios_updated: 问题完成度已更新。 - notice_gantt_chart_truncated: "这个表是截断的因为它超过了可以显示的最大数量(%{max})" - - error_complete_occupation: "请您填写工作单位,否则本系统的部分功能将无法正常使用。" - error_attachment_empty: "添加文件出错!" - - error_class_period_only_num: "课程学时只能为数字" - error_can_t_load_default_data: "无法载入默认设置:%{value}" - error_scm_not_found: "版本库中不存在该条目和(或)其修订版本。" - error_scm_command_failed: "访问版本库时发生错误:%{value}" - error_scm_annotate: "该条目不存在或无法追溯。" - error_issue_not_found_in_project: '问题不存在或不属于此项目' - error_no_tracker_in_project: 该项目未设定跟踪标签,请检查项目配置。 - error_no_default_issue_status: 未设置默认的问题状态。请检查系统设置("管理" -> "问题状态")。 - error_can_not_delete_custom_field: 无法删除自定义属性 - error_can_not_delete_tracker: "该跟踪标签已包含问题,无法删除" - error_can_not_remove_role: "该角色正在使用中,无法删除" - error_can_not_reopen_issue_on_closed_version: 该问题被关联到一个已经关闭的版本,因此无法重新打开。 - error_can_not_archive_project: 该项目无法被存档 - error_issue_done_ratios_not_updated: 问题完成度未能被更新。 - error_workflow_copy_source: 请选择一个源跟踪标签或者角色 - error_workflow_copy_target: 请选择目标跟踪标签和角色 - error_unable_delete_issue_status: '无法删除问题状态' - error_unable_to_connect: "无法连接 (%{value})" - warning_attachments_not_saved: "%{count} 个文件保存失败" - - mail_subject_lost_password: "您的 %{value} 密码" - mail_body_lost_password: '请点击以下链接来修改您的密码:' - mail_subject_register: "%{value}帐号激活" - mail_body_register: '请点击以下链接来激活您的帐号:' - mail_body_account_information_external: "您可以使用您的 %{value} 帐号来登录。" - mail_body_account_information: 您的帐号信息 - mail_subject_account_activation_request: "%{value}帐号激活请求" - mail_body_account_activation_request: "新用户(%{value})已完成注册,正在等候您的审核:" - mail_subject_reminder: "%{count} 个问题需要尽快解决 (%{days})" - mail_body_reminder: "指派给您的 %{count} 个问题需要在 %{days} 天内完成:" - mail_subject_wiki_content_added: "'%{id}' wiki页面已添加" - mail_body_wiki_content_added: "'%{id}' wiki页面已由 %{author} 添加。" - mail_subject_wiki_content_updated: "'%{id}' wiki页面已更新。" - mail_body_wiki_content_updated: "'%{id}' wiki页面已由 %{author} 更新。" - - - - field_name: 名称 - #added by huang - field_tea_name: 教师 - field_couurse_time: 学时 - field_course_code: 学分 - field_state: 加入课程口令 - field_term: 课程学期 - field_course_un: 暂未填写 - #end - field_description: 描述 - field_summary: 摘要 - field_is_required: 必填 - field_firstname: 名字 - field_firstname_eg: '(例:张三丰,请填写[三丰])' - field_lastname: 姓氏 - field_lastname_eg: '(例:张三丰,请填写[张])' - field_mail: 邮件地址 - field_filename: 文件 - field_file_dense: 是否公开 - field_filesize: 大小 - field_downloads: 下载次数 - field_author: 作者 - field_created_on: 创建于 - field_updated_on: 更新于 - field_field_format: 格式 - field_is_for_all: 用于所有项目 - field_possible_values: 可能的值 - field_regexp: 正则表达式 - field_min_length: 最小长度 - field_max_length: 最大长度 - field_value: 值 - field_category: 类别 - field_title: 标题 - field_web_title: 浏览器标题 - field_project: 项目 - field_issue: 问题 - field_status: 状态 - field_notes: 说明 - field_is_closed: 已关闭的问题 - field_is_default: 默认值 - field_tracker: 跟踪 - field_subject: 主题 - field_quote: 描述 - field_due_date: 计划完成日期 - field_assigned_to: 指派给 - field_priority: 优先级 - field_fixed_version: 目标版本 - field_user: 用户 - field_principal: 用户/用户组 - field_role: 角色 - field_homepage: 主页 - field_time: 课时 - field_class_period: 学时 - field_code: 学分 - field_is_public: 公开 - field_parent: 上级项目 - field_is_in_roadmap: 在路线图中显示 - field_login: 昵称 - field_mail_notification: 邮件通知 - field_admin: 管理员 - field_last_login_on: 最后登录 - field_language: 语言 - field_effective_date: 日期 - field_password: 密码 - field_new_password: 新密码 - field_password_confirmation: 确认 - field_version: 版本 - field_type: 类型 - field_host: 主机 - field_port: 端口 - field_account: 帐号 - field_base_dn: Base DN - field_attr_login: 登录名属性 - field_attr_firstname: 名字属性 - field_attr_lastname: 姓氏属性 - field_attr_mail: 邮件属性 - field_onthefly: 即时用户生成 - field_start_date: 开始日期 - field_done_ratio: "% 完成" - field_auth_source: 认证模式 - field_hide_mail: 隐藏我的邮件地址 - field_comments: 注释 - field_url: 路径 - field_start_page: 起始页 - field_subproject: 子项目 - field_hours: 小时 - field_activity: 活动 - field_spent_on: 日期 - field_identifier: 标识 - field_is_filter: 作为过滤条件 - field_issue_to: 相关问题 - field_delay: 延期 - field_assignable: 问题可指派给此角色 - field_redirect_existing_links: 重定向到现有链接 - field_estimated_hours: 预期时间 - field_column_names: 列 - field_time_entries: 工时 - field_time_zone: 时区 - field_searchable: 可用作搜索条件 - field_default_value: 默认值 - field_comments_sorting: 显示注释 - field_parent_title: 上级页面 - field_editable: 可编辑 - field_watcher: 跟踪者 - field_identity_url: OpenID URL - field_content: 内容 - field_group_by: 根据此条件分组 - field_sharing: 共享 - field_parent_issue: 父任务 - field_member_of_group: 用户组的成员 - field_assigned_to_role: 角色的成员 - field_text: 文本字段 - field_visible: 可见的 - - setting_app_title: 应用程序标题 - setting_app_subtitle: 应用程序子标题 - setting_welcome_text: 欢迎文字 - setting_default_language: 默认语言 - setting_login_required: 要求认证 - setting_self_registration: 允许自注册 - setting_attachment_max_size: 附件大小限制 - setting_issues_export_limit: 问题导出条目的限制 - setting_mail_from: 邮件发件人地址 - setting_bcc_recipients: 使用密件抄送 (bcc) - setting_plain_text_mail: 纯文本(无HTML) - setting_host_name: 主机名称 - setting_text_formatting: 文本格式 - setting_wiki_compression: 压缩Wiki历史文档 - setting_feeds_limit: RSS Feed内容条数限制 - setting_default_projects_public: 新建项目默认为公开项目 - setting_autofetch_changesets: 自动获取程序变更 - setting_sys_api_enabled: 启用用于版本库管理的Web Service - setting_commit_ref_keywords: 用于引用问题的关键字 - setting_commit_fix_keywords: 用于解决问题的关键字 - setting_autologin: 自动登录 - setting_date_format: 日期格式 - setting_time_format: 时间格式 - setting_cross_project_issue_relations: 允许不同项目之间的问题关联 - setting_issue_list_default_columns: 问题列表中显示的默认列 - setting_emails_header: 邮件头 - setting_emails_footer: 邮件签名 - setting_protocol: 协议 - setting_per_page_options: 每页显示条目个数的设置 - setting_user_format: 用户显示格式 - setting_activity_days_default: 在项目活动中显示的天数 - setting_display_subprojects_issues: 在项目页面上默认显示子项目的问题 - setting_enabled_scm: 启用 SCM - setting_mail_handler_body_delimiters: 在这些行之后截断邮件 - setting_mail_handler_api_enabled: 启用用于接收邮件的服务 - setting_mail_handler_api_key: API key - setting_sequential_project_identifiers: 顺序产生项目标识 - setting_gravatar_enabled: 使用Gravatar用户头像 - setting_gravatar_default: 默认的Gravatar头像 - setting_diff_max_lines_displayed: 查看差别页面上显示的最大行数 - setting_file_max_size_displayed: 允许直接显示的最大文本文件 - setting_repository_log_display_limit: 在文件变更记录页面上显示的最大修订版本数量 - setting_openid: 允许使用OpenID登录和注册 - setting_password_min_length: 最短密码长度 - setting_new_project_user_role_id: 非管理员用户新建项目时将被赋予的(在该项目中的)角色 - setting_default_projects_modules: 新建项目默认启用的模块 - setting_issue_done_ratio: 计算问题完成度: - setting_issue_done_ratio_issue_field: 使用问题(的完成度)属性 - setting_issue_done_ratio_issue_status: 使用问题状态 - setting_start_of_week: 日历开始于 - setting_rest_api_enabled: 启用REST web service - setting_cache_formatted_text: 缓存格式化文字 - setting_default_notification_option: 默认提醒选项 - setting_commit_logtime_enabled: 激活时间日志 - setting_commit_logtime_activity_id: 记录的活动 - setting_gantt_items_limit: 在甘特图上显示的最大记录数 - - permission_add_project: 新建项目 - permission_add_subprojects: 新建子项目 - permission_edit_project: 编辑项目 - permission_select_project_modules: 选择项目模块 - permission_manage_members: 管理成员 - permission_manage_project_activities: 管理项目活动 - permission_manage_versions: 管理版本 - permission_manage_categories: 管理问题类别 - permission_view_issues: 查看问题 - permission_add_issues: 新建问题 - permission_edit_issues: 更新问题 - permission_manage_issue_relations: 管理问题关联 - permission_add_issue_notes: 添加说明 - permission_edit_issue_notes: 编辑说明 - permission_edit_own_issue_notes: 编辑自己的说明 - permission_move_issues: 移动问题 - permission_delete_issues: 删除问题 - permission_manage_public_queries: 管理公开的查询 - permission_save_queries: 保存查询 - permission_view_gantt: 查看甘特图 - permission_view_calendar: 查看日历 - permission_view_issue_watchers: 查看跟踪者列表 - permission_add_issue_watchers: 添加跟踪者 - permission_delete_issue_watchers: 删除跟踪者 - permission_log_time: 登记工时 - permission_view_time_entries: 查看耗时 - permission_edit_time_entries: 编辑耗时 - permission_edit_own_time_entries: 编辑自己的耗时 - permission_manage_news: 管理新闻 - permission_comment_news: 为新闻添加评论 - permission_view_documents: 查看文档 - permission_manage_files: 管理文件 - permission_view_files: 查看文件 - permission_manage_wiki: 管理Wiki - permission_rename_wiki_pages: 重定向/重命名Wiki页面 - permission_delete_wiki_pages: 删除Wiki页面 - permission_view_wiki_pages: 查看Wiki - permission_view_wiki_edits: 查看Wiki历史记录 - permission_edit_wiki_pages: 编辑Wiki页面 - permission_delete_wiki_pages_attachments: 删除附件 - permission_protect_wiki_pages: 保护Wiki页面 - permission_manage_repository: 管理版本库 - permission_browse_repository: 浏览版本库 - permission_view_changesets: 查看变更 - permission_commit_access: 访问提交信息 - permission_manage_boards: 管理讨论区 - permission_view_messages: 查看帖子 - permission_add_messages: 发表帖子 - permission_edit_messages: 编辑帖子 - permission_edit_own_messages: 编辑自己的帖子 - permission_delete_messages: 删除帖子 - permission_delete_own_messages: 删除自己的帖子 - permission_export_wiki_pages: 导出 wiki 页面 - permission_manage_subtasks: 管理子任务 - permission_view_journals_for_messages: 查看留言 - permission_view_courses: 查看课程 - permission_new_course: 新建课程 - permission_configure_course: 配置课程 - permission_close_course: 关闭/重开课程 - permission_new_assignment: 新建任务 - permission_edit_assignment: 编辑任务 - permission_delete_assignment: 删除任务 - permission_new_placeholder: 新建占位 - permission_edit_placeholder: 编辑占位 - permission_delete_placeholder: 删除占位 - permission_commit_content: 提交内容 - permission_new_course_notify: 发布课程通知 - permission_edit_course_notify: 编辑课程通知 - permission_delete_course_notify: 删除课程通知 - permission_view_assignment: 查看任务 - permission_view_placeholder: 查看占位 - permission_view_course_messages: 查看留言 - permission_view_real_name: 查看真名 - permission_view_students: 查看成员 - permission_export_homeworks: 导出作业 - permission_quote_project: 引用项目 - permission_is_manager: 作为管理员 - permission_as_teacher: 作为教师 - permission_as_student: 作为学生 - permission_paret_in_homework: 加入作业 - permission_view_homework_attaches: 查看作业附件 - permission_view_course_journals_for_messages: 查看课程留言 - permission_select_course_modules: 选择课程模块 - permission_view_course_files: 查看课程资源 - permission_add_course: 新建课程 - permission_edit_course: 编辑课程 - permission_select_contest_modules: 选择竞赛模块 - permission_manage_contestnotifications: 管理竞赛通知 - - - - project_module_issue_tracking: 问题跟踪 - project_module_time_tracking: 时间跟踪 - project_module_news: 新闻 - project_module_documents: 文档 - project_module_files: 作品下载 - project_module_wiki: Wiki - project_module_repository: 版本库 - project_module_boards: 讨论区 - project_module_calendar: 日历 - project_module_gantt: 甘特图 - project_module_course: 课程 - project_module_dts: DTS测试工具 - label_module_share: DTS测试工具 - - label_user: 用户 - label_user_plural: 用户列表 - label_user_new: 新建用户 - label_user_anonymous: 匿名用户 - label_project: 项目 - label_activity_project: '项目: ' #added by bai - label_project_new: 新建项目 - label_project_new_description: '项目可以是软件开发项目,也可以是协作研究项目。' - label_project_plural: 项目列表 - label_project_score: 项目评分 - label_first_page_made: 首页定制 - label_project_first_page: 项目托管平台首页 - label_course_first_page: 课程实践平台首页 - label_contest_first_page: 竞赛实战平台首页 - label_x_projects: - zero: 无项目 - one: 1 个项目 - other: "%{count} 个项目" - label_project_all: 所有的项目 - label_project_latest: 最近的项目 - label_issue: 问题 - label_issue_new: 新建问题 - label_issue_plural: 缺陷 - label_issue_view_all: 查看所有问题 - label_issues_by: "按 %{value} 分组显示问题" - label_issue_added: 问题已添加 - label_issue_updated: 问题已更新 - label_document: 文档 - label_document_new: 新建文档 - label_document_plural: 文档 - label_document_added: 文档已添加 - label_document_public_info: (打钩为公开,不打钩则不公开,若不公开,仅项目成员可见该文档。) - label_role: 角色 - label_role_plural: 角色 - label_role_new: 新建角色 - label_role_and_permissions: 角色和权限 - label_member: 成员 - label_member_new: 添加成员 - label_member_plural: 成员 - label_tracker: 跟踪标签 - label_tracker_plural: 跟踪标签 - label_tracker_new: 新建跟踪标签 - label_workflow: 工作流程 - label_issue_status: 问题状态 - label_issue_status_plural: 问题状态 - label_issue_status_new: 新建问题状态 - label_issue_category: 问题类别 - label_issue_category_plural: 问题类别 - label_issue_category_new: 新建问题类别 - label_custom_field: 自定义属性 - label_custom_field_plural: 自定义属性 - label_custom_field_new: 新建自定义属性 - label_enumerations: 枚举值 - label_enumeration_new: 新建枚举值 - label_information: 信息 - label_information_plural: 信息 - label_please_login: 请登录 - label_register: 注册 - label_login_with_open_id_option: 或使用OpenID登录 - label_password_lost: 忘记密码 - label_home: 主页 - label_web_title: 浏览器标题 - label_site_title: 网站标题 - label_site_description: 网站简介 - label_site_image: 简介图片 - label_image_width: 图片宽度 - label_imgae_height: 图片高度 - image_width_error_message: 图片宽度只能是50至120之间的整数 - image_height_error_message: 图片高度只能是50至80之间的整数 - label_sort_type: 热门项目排序方式 - label_contest_notification_title: 竞赛通知标题 - label_contest_notification_content: 竞赛通知内容 - label_show_course: 显示课程 - label_show_contest: 显示竞赛 - #by young - label_requirement: 需求 - label_new_course: 课程列表 - label_course_practice: 课程实践 - label_course_all: 课程列表 - label_teacher_all: 所有教师 - label_project_deposit: 项目托管 - label_software_user: 软件创客 - label_contest_innovate: 创新竞赛 - label_requirement_enterprise: 软件众包 - label_requirement_enterprise_list: 众包列表 - label_new_homework: 作业 - label_new_contest: 竞赛 - label_requirement_focus: 关注需求 - label_developer: 用户 - label_account_developer: 开发者 - label_enterprise_into: 进入企业 - label_college_into: 进入高校 - label_investor: 投资人: - lable_contest_user: 竞赛发布人 - label_user_home: 创客空间 - label_user_location: 当前位置 - label_course_term: 开课学期 - label_theme: 主题 - label_logged_as_new: 当前用户 - button_register: 注册 - issue_list: 缺陷列表 - lastest_respond: 最新反馈 - label_respond_view_all: 其他120个反馈 - label_news_lastest: 最新动态 - label_version_display_settings: 显示设置 - label_versions_progress: 完成进度 - label_versions_description: 版本描述 - label_my_photo: 我的头像 - label_documents_sort: 排序设置: - label_activities_settings: 显示设置 - label_user_login_new: 登录 - label_user_login_tips: 您还没有登录,请登录后留言 - label_user_login_course_board: 您还没有登录,请登录后参与课程讨论 - label_user_login_project_board: 您还没有登录,请登录后参与项目讨论 - label_user_login_attending_contest: 您还没有登录,请登录后参赛 - label_user_login_score_and_comment: 您还没有登录,请登录后对作品进行打分评价 - label_user_login_notificationcomment: 您还没有登录,请登录后参加评论 - #end - #by huang # modified by bai - label_college: 高校进入 - label_enter_college: 进入高校 - #label_enterprise: 企业进入 - lable_enter_enterprise: 进入企业 - label_term: 开课学期 - label_spring: 春季学期 - label_summer: 夏季学期 - label_autumn: 秋季学期 - label_winter: 冬季学期 - label_followers: 关注 - label_teacher: 教师 - label_teacher_list: 教师列表 - label_student_list: 学生列表 - label_limit_time: 截止日期 - label_commit_homework: 提交作业 - label_course_homework: 对应课程 - label_course_doing: 进行中的课程 - label_course_done: 已结束的课程 - label_homework_response: 作业咨询 - label_bidding_homework: 提交作业 - label_add_homework: 添加作业 - label_edit_homework: 修改作业 - label_delete_homework: 删除作业 - label_new_homework: 创建作业 - - #end - label_my_page: 我的工作台 - label_my_account: 我的帐号 - label_my_message: 留言 - label_my_projects: 我的项目 - label_my_page_block: 我的工作台模块 - label_administration: 管理 - label_login: 登录 - label_login_prompt: 邮箱/昵称 - lable_user_name: 登录名 - label_logout: 退出 - label_help: 帮助 - label_reported_issues: 已报告的问题 - label_assigned_to_me_issues: 指派给我的问题 - label_last_login: 最后登录 - label_registered_on: 注册于 - label_activity: 动态 # modified by bai - label_overall_activity: 活动概览 - label_user_activity: "%{value} 的活动" - label_new: 新建 - label_new_user: 注册了一个新用户 # added by bai - label_logged_as: 登录为 - label_environment: 环境 - label_authentication: 认证 - label_auth_source: 认证模式 - label_auth_source_new: 新建认证模式 - label_auth_source_plural: 认证模式 - label_subproject_plural: 子项目 - label_subproject_new: 新建子项目 - label_and_its_subprojects: "%{value} 及其子项目" - label_min_max_length: 最小 - 最大 长度 - label_list: 列表 - label_date: 日期 - label_integer: 整数 - label_float: 浮点数 - label_boolean: 布尔值 - label_string: 字符串 - label_text: 文本 - label_attribute: 属性 - label_attribute_plural: 属性 - label_no_data: 没有任何数据可供显示 - label_change_status: 变更状态 - label_history: 历史记录 - label_attachment: 文件 - label_attachment_new: 新建文件 - label_file_upload: 上传资料 - label_attachment_delete: 删除文件 - label_attachment_plural: 文件 - label_file_added: 文件已添加 - label_report: 报表 - label_report_plural: 报表 - label_news: 新闻 - label_news_new: 添加新闻 - bale_news_notice: 添加通知 #huang - bale_edit_notice: 修改通知 - label_news_notice: 发布课程通知 - label_news_plural: 新闻 - label_news_latest: 最近的新闻 - label_news_view_all: 查看所有新闻 - label_news_added: 新闻已添加 - label_settings: 配置 - label_overview: 项目动态 - label_course_overview: "课程动态" - label_question_student: 作业交流 #bai - label_homework_commit: 提交作业 #huang - label_homework_info: 提交情况 #huang - label_course_news: 课程通知 - label_course_news_description: '课程必须是高校正式开设的课程,或是围绕特定主题定期发布课程资料的公共开放课程;
    如果您想创建一个协作研究空间,请您前往“我的项目”页面创建项目,谢谢!' - label_course_board: 讨论区 - label_version: 版本 - label_version_new: 新建版本 - label_version_plural: 版本 - label_close_versions: 关闭已完成的版本 - label_confirmation: 确认 - label_export_to: 导出 - label_read: 读取... - label_public_projects: 公开的项目 - label_open_issues: 打开 - label_open_issues_plural: 打开 - label_closed_issues: 已关闭 - label_closed_issues_plural: 已关闭 - label_x_open_issues_abbr_on_total: - zero: 0 打开 / %{total} - one: 1 打开 / %{total} - other: "%{count} 打开 / %{total}" - label_x_open_issues_abbr: - zero: 0 打开 - one: 1 打开 - other: "%{count} 打开" - label_x_closed_issues_abbr: - zero: 0 已关闭 - one: 1 已关闭 - other: "%{count} 已关闭" - label_total: 合计 - label_permissions: 权限 - label_current_status: 当前状态 - label_new_statuses_allowed: 允许的新状态 - label_all: 全部 - label_none: 无 - label_nobody: 无人 - label_next: 下一页 - label_previous: 上一页 - label_used_by: 使用中 - label_details: 详情 - label_add_note: 添加说明 - label_per_page: 每页 - label_calendar: 日历 - label_months_from: 个月以来 - label_gantt: 甘特图 - label_internal: 内部 - label_last_changes: "最近的 %{count} 次变更" - label_change_view_all: 查看所有变更 - label_personalize_page: 个性化定制本页 - label_comment: 评论 - label_comment_plural: 评论 - label_x_comments: - zero: 无评论 - one: 1 条评论 - other: "%{count} 条评论" - label_comment_add: 添加评论 - label_comment_added: 评论已添加 - label_comment_delete: 删除评论 - label_query: 自定义查询 - label_query_plural: 自定义查询 - label_query_new: 新建查询 - label_filter_add: 增加过滤器 - - label_filter_plural: 查询条件 - label_equals: 等于 - label_not_equals: 不等于 - label_in_less_than: 剩余天数小于 - label_in_more_than: 剩余天数大于 - label_greater_or_equal: '>=' - label_less_or_equal: '<=' - label_in: 剩余天数 - label_today: 今天 - label_all_time: 全部时间 - label_yesterday: 昨天 - label_this_week: 本周 - label_last_week: 上周 - label_last_n_days: "最后 %{count} 天" - label_this_month: 本月 - label_last_month: 上月 - label_this_year: 今年 - label_date_range: 日期范围 - label_less_than_ago: 之前天数少于 - label_more_than_ago: 之前天数大于 - label_ago: 之前天数 - label_contains: 包含 - label_not_contains: 不包含 - label_day_plural: 天 - label_repository: 版本库 - label_course_repository: 代码库 - label_repository_plural: 版本库 - label_browse: 浏览 - label_branch: 分支 - label_tag: 标签 - label_revision: 修订 - label_revision_plural: 修订 - label_revision_id: 修订 %{value} - label_associated_revisions: 相关修订版本 - label_added: 已添加 - label_modified: 已修改 - label_copied: 已复制 - label_renamed: 已重命名 - label_deleted: 已删除 - label_latest_revision: 最近的修订版本 - label_latest_revision_plural: 最近的修订版本 - label_view_revisions: 查看修订 - label_view_all_revisions: 查看所有修订 - label_no_file_uploaded: 未上传文件 - label_max_size: 最大文件大小 - label_sort_highest: 置顶 - label_sort_higher: 上移 - label_sort_lower: 下移 - label_sort_lowest: 置底 - label_roadmap: 里程碑 #版本路线图 - label_roadmap_due_in: "截止日期到 %{value}" - label_roadmap_overdue: "%{value} 延期" - label_roadmap_no_issues: 该版本没有问题 - label_search: 搜索 - label_result_plural: 结果 - label_all_words: 所有单词 - label_wiki: Wiki - label_wiki_edit: Wiki 编辑 - label_wiki_edit_plural: Wiki 编辑记录 - label_wiki_page: Wiki 页面 - label_wiki_page_plural: Wiki 页面 - label_index_by_title: 按标题索引 - label_index_by_date: 按日期索引 - label_current_version: 当前版本 - label_preview: 预览 - label_feed_plural: Feeds - label_changes_details: 所有变更的详情 - label_issue_tracking: 问题跟踪 - label_spent_time: 耗时 - label_overall_spent_time: 总体耗时 - label_f_hour: "%{value} 小时" - label_f_hour_plural: "%{value} 小时" - label_time_tracking: 时间跟踪 - label_change_plural: 变更 - label_statistics: 统计 - label_contest: 竞赛 - label_commits_per_month: 每月提交次数 - label_commits_per_author: 每用户提交次数 - label_view_diff: 查看差别 - label_diff_inline: 直列 - label_diff_side_by_side: 并排 - label_options: 选项 - label_copy_workflow_from: 从以下选项复制工作流程 - label_permissions_report: 权限报表 - label_watched_issues: 跟踪的问题 - label_related_issues: 相关的问题 - label_applied_status: 应用后的状态 - label_loading: 载入中... - label_relation_new: 新建关联 - label_relation_delete: 删除关联 - label_relates_to: 关联到 - label_duplicates: 重复 - label_duplicated_by: 与其重复 - label_blocks: 阻挡 - label_blocked_by: 被阻挡 - label_precedes: 优先于 - label_follows: 跟随于 - label_end_to_start: 结束-开始 - label_end_to_end: 结束-结束 - label_start_to_start: 开始-开始 - label_start_to_end: 开始-结束 - label_stay_logged_in: 保持登录状态 - label_disabled: 禁用 - label_show_completed_versions: 显示已完成的版本 - label_me: 我 - label_board: 讨论区 - label_board_new: 新建讨论区 - label_board_plural: 讨论区 - label_board_locked: 锁定 - label_board_sticky: 置顶 - field_sticky: '' - field_locked: '' - field_lock: '' - label_topic_plural: 主题 - label_message_plural: 帖子 - label_message_last: 最新的帖子 - label_message_new: 发布新帖 - label_message_posted: 发帖成功 - label_reply_plural: 回复 - label_send_information: 给用户发送帐号信息 - label_year: 年 - label_month: 月 - label_week: 周 - label_date_from: 从 - label_date_to: 到 - label_language_based: 根据用户的语言 - label_sort_by: "根据 %{value} 排序" - label_send_test_email: 发送测试邮件 - label_feeds_access_key: RSS存取键 - label_missing_feeds_access_key: 缺少RSS存取键 - label_feeds_access_key_created_on: "RSS存取键是在 %{value} 之前建立的" - label_module_plural: 模块 - label_added_time_by: "由 %{author} 在 %{age} 之前添加" - label_added_time: "在 %{age} 之前添加" - label_updated_time: " 更新于 %{value} 之前" - label_updated_time_by: "由 %{author} 更新于 %{age} 之前" - label_jump_to_a_project: 选择一个项目... - label_file_plural: 文件 - label_changeset_plural: 变更 - label_default_columns: 默认列 - label_no_change_option: (不变) - label_bulk_edit_selected_issues: 批量修改选中的问题 - label_theme: 主题 - label_default: 默认 - label_search_titles_only: 仅在标题中搜索 - label_user_mail_option_all: "收取我的项目的所有通知" - #huang - label_file_new: 下载 - label_user_edit: "修改资料" - label_user_info: "个人简介" #huang 添加 - label_user_watcher: "关注" # huang添加的 - label_user_fans: "粉丝" - # modify by men - label_x_user_fans: - zero: 粉丝 - one: 粉丝 - other: 粉丝 - #end - label_x_join_in_contest: - zero: 参与者 - one: 参与者 - other: 参与者 - #end - label_user_commits: "代码提交" - label_user_watchered: "关注" # huang添加的 - label_user_newfeedback: "留言" ## huang添加的 - label_feedback_success: "留言成功" - label_feedback_fail: "留言失败" - label_user_login: "最后登录" - label_user_mail: "邮件地址" - label_user_joinin: "加入时间" - label_user_activities: 您没有关注该用户,请尝试重新输入! - label_user_activities_other: 该用户暂无任何动态! - label_project_overview: "概述" - label_project_tool: "项目工具集" - label_project_issues: "缺陷" - label_project_newother: "查看其他评论" - label_project_newshare: "分享了" - label_project_notice: "发布了通知:" - label_project_newadd: "添加了" - label_project_unadd: "暂无项目,赶快去创建吧!" - label_project_un: "该用户暂未参与任何项目!" - label_project_course_un: "该用户暂未加入任何课程!" - label_project_course_unadd: "你还未创建课程,赶快去创建吧!" - label_project_cousre_studentun: "你还未加入任何课程,赶快加入吧!" - #end by huang - label_user_mail_option_selected: "收取选中项目的所有通知..." - label_user_mail_option_none: "不收取任何通知" - label_user_mail_option_only_my_events: "只收取我跟踪或参与的项目的通知" - label_user_mail_option_only_assigned: "只收取分配给我的" - label_user_mail_option_only_owner: 只收取由我创建的 - label_user_mail_no_self_notified: "不要发送对我自己提交的修改的通知" - label_registration_activation_by_email: 通过邮件认证激活帐号 - label_registration_manual_activation: 手动激活帐号 - label_registration_automatic_activation: 自动激活帐号 - label_display_per_page: "每页显示:%{value}" - label_age: 提交时间 - label_change_properties: 修改属性 - label_general: 一般 - label_more: 更多>> - label_scm: 管理系统 - label_plugins: 插件 - label_ldap_authentication: LDAP 认证 - label_downloads_abbr: D/L - label_optional_description: 可选的描述 - label_add_another_file: 添加其它文件 - label_preferences: 首选项 - label_chronological_order: 按时间顺序 - label_reverse_chronological_order: 按时间顺序(倒序) - label_planning: 计划 - label_incoming_emails: 接收邮件 - label_generate_key: 生成一个key - label_issue_watchers: 跟踪者 - label_example: 示例 - label_display: 显示 - label_sort: 排序 - label_ascending: 升序 - label_descending: 降序 - label_date_from_to: 从 %{start} 到 %{end} - label_wiki_content_added: Wiki 页面已添加 - label_wiki_content_updated: Wiki 页面已更新 - label_group: 组 - label_group_plural: 组 - label_group_new: 新建组 - label_time_entry_plural: 耗时 - label_version_sharing_none: 不共享 - label_version_sharing_descendants: 与子项目共享 - label_version_sharing_hierarchy: 与项目继承层次共享 - label_version_sharing_tree: 与项目树共享 - label_version_sharing_system: 与所有项目共享 - label_update_issue_done_ratios: 更新问题的完成度 - label_copy_source: 源 - label_copy_target: 目标 - label_copy_same_as_target: 与目标一致 - label_display_used_statuses_only: 只显示被此跟踪标签使用的状态 - label_api_access_key: API访问键 - label_missing_api_access_key: 缺少API访问键 - label_api_access_key_created_on: API访问键是在 %{value} 之前建立的 - label_profile: 简介 - label_subtask_plural: 子任务 - label_project_copy_notifications: 复制项目时发送邮件通知 - label_principal_search: "搜索用户或组:" - label_user_search: "搜索用户:" - - button_login: 登录 - button_submit: 提交 - button_save: 保存 - button_check_all: 全选 - button_uncheck_all: 清除 - button_delete: 删除 - button_create: 提交 #bai - button_create_and_continue: 创建并继续 - button_test: 测试 - button_edit: 编辑 - button_edit_associated_wikipage: "编辑相关wiki页面: %{page_title}" - button_add: 新增 - button_change: 修改 - button_ok_and_submit: 确定并提交 - - button_apply: 查询 - button_clear: 取消查询 - button_clear_requirement: 取消 - button_lock: 锁定 - button_unlock: 解锁 - button_download: 下载 - button_list: 列表 - button_view: 查看 - button_move: 移动 - button_move_and_follow: 移动并转到新问题 - button_back: 返回 - button_cancel: 取消 - button_activate: 激活 - button_sort: 排序 - button_log_time: 登记工时 - button_rollback: 恢复到这个版本 - button_watch: 跟踪 - button_unwatch: 取消跟踪 - button_reply: 回复 - button_archive: 存档 - button_unarchive: 取消存档 - button_reset: 重置 - button_rename: 重命名/重定向 - button_change_password: 修改密码 - button_copy: 复制 - button_copy_and_follow: 复制并转到新问题 - button_annotate: 追溯 - button_update: 更新 - button_configure: 配置 - button_quote: 引用 - button_duplicate: 副本 - button_show: 显示 - - status_active: 活动的 - status_registered: 已注册 - status_locked: 已锁定 - - version_status_open: 打开 - version_status_locked: 锁定 - version_status_closed: 关闭 - - field_active: 活动 - - text_select_mail_notifications: 选择需要发送邮件通知的动作 - text_regexp_info: 例如:^[A-Z0-9]+$ - text_min_max_length_info: 0 表示没有限制 - text_project_destroy_confirmation: 您确信要删除这个项目以及所有相关的数据吗? - text_subprojects_destroy_warning: "以下子项目也将被同时删除:%{value}" - text_workflow_edit: 选择角色和跟踪标签来编辑工作流程 - text_are_you_sure: 您确定要删除吗? - text_are_you_sure_out: 你确定要退出该课程吗? - text_journal_changed: "%{label} 从 %{old} 变更为 %{new}" - text_journal_set_to: "%{label} 被设置为 %{value}" - text_journal_deleted: "%{label} 已删除 (%{old})" - text_journal_added: "%{label} %{value} 已添加" - text_tip_issue_begin_day: 今天开始的任务 - text_tip_issue_end_day: 今天结束的任务 - text_tip_issue_begin_end_day: 今天开始并结束的任务 - text_caracters_maximum: "最多 %{count} 个字符。" - text_caracters_minimum: "至少需要 %{count} 个字符。" - text_length_between: "长度必须在 %{min} 到 %{max} 个字符之间。" - text_command: 学生或其他成员申请加入课程时候需要使用该口令,该口令可以由老师在课堂上公布。 - text_contest_reward: 选择奖励后输入描述。 - text_tracker_no_workflow: 此跟踪标签未定义工作流程 - text_unallowed_characters: 非法字符 - text_comma_separated: 可以使用多个值(用逗号,分开)。 - text_line_separated: 可以使用多个值(每行一个值)。 - text_issues_ref_in_commit_messages: 在提交信息中引用和解决问题 - text_issue_added: "问题 %{id} 已由 %{author} 提交。" - text_issue_updated: "问题 %{id} 已由 %{author} 更新。" - text_wiki_destroy_confirmation: 您确定要删除这个 wiki 及其所有内容吗? - text_issue_category_destroy_question: "有一些问题(%{count} 个)属于此类别。您想进行哪种操作?" - text_issue_category_destroy_assignments: 删除问题的所属类别(问题变为无类别) - text_issue_category_reassign_to: 为问题选择其它类别 - text_user_mail_option: "对于没有选中的项目,您将只会收到您跟踪或参与的项目的通知(比如说,您是问题的报告者, 或被指派解决此问题)。" - text_no_configuration_data: "角色、跟踪标签、问题状态和工作流程还没有设置。\n强烈建议您先载入默认设置,然后在此基础上进行修改。" - text_load_default_configuration: 载入默认设置 - text_status_changed_by_changeset: "已应用到变更列表 %{value}." - text_time_logged_by_changeset: "已应用到修订版本 %{value}." - text_issues_destroy_confirmation: '您确定要删除选中的问题吗?' - text_select_project_modules: '请选择此项目可以使用的模块:' - text_default_administrator_account_changed: 默认的管理员帐号已改变 - text_file_repository_writable: 附件路径可写 - text_plugin_assets_writable: 插件的附件路径可写 - text_rmagick_available: RMagick 可用(可选的) - text_destroy_time_entries_question: 您要删除的问题已经上报了 %{hours} 小时的工作量。您想进行那种操作? - text_destroy_time_entries: 删除上报的工作量 - text_assign_time_entries_to_project: 将已上报的工作量提交到项目中 - text_reassign_time_entries: '将已上报的工作量指定到此问题:' - text_user_wrote: "%{value} 写到:" - text_enumeration_destroy_question: "%{count} 个对象被关联到了这个枚举值。" - text_enumeration_category_reassign_to: '将它们关联到新的枚举值:' - text_email_delivery_not_configured: "邮件参数尚未配置,因此邮件通知功能已被禁用。\n请在config/configuration.yml中配置您的SMTP服务器信息并重新启动以使其生效。" - text_repository_usernames_mapping: "选择或更新与版本库中的用户名对应的Trustie用户。\n版本库中与Trustie中的同名用户将被自动对应。" - text_diff_truncated: '... 差别内容超过了可显示的最大行数并已被截断' - text_custom_field_possible_values_info: '每项数值一行' - text_wiki_page_destroy_question: 此页面有 %{descendants} 个子页面和下级页面。您想进行那种操作? - text_wiki_page_nullify_children: 将子页面保留为根页面 - text_wiki_page_destroy_children: 删除子页面及其所有下级页面 - text_wiki_page_reassign_children: 将子页面的上级页面设置为 - text_own_membership_delete_confirmation: 你正在删除你现有的某些或全部权限,如果这样做了你可能将会再也无法编辑该项目了。你确定要继续吗? - text_zoom_in: 放大 - text_zoom_out: 缩小 - text_applied_project: "用户 %{id} 申请加入项目 %{project}" - text_issue_expire: "分配给您的任务%{issue}即将到期" - - default_role_manager: 管理人员 - default_role_developer: 开发人员 - default_role_reporter: 报告人员 - default_tracker_bug: 错误 - default_tracker_feature: 功能 - default_tracker_support: 支持 - default_issue_status_new: 新建 - default_issue_status_in_progress: 进行中 - default_issue_status_resolved: 已解决 - default_issue_status_feedback: 反馈 - default_issue_status_closed: 已关闭 - default_issue_status_rejected: 已拒绝 - default_doc_category_user: 用户文档 - default_doc_category_tech: 技术文档 - default_priority_low: 低 - default_priority_normal: 普通 - default_priority_high: 高 - default_priority_urgent: 紧急 - default_priority_immediate: 立刻 - default_activity_design: 设计 - default_activity_development: 开发 - - enumeration_issue_priorities: 问题优先级 - enumeration_doc_categories: 文档类别 - enumeration_activities: 活动(时间跟踪) - enumeration_system_activity: 系统活动 - - field_warn_on_leaving_unsaved: 当离开未保存内容的页面时,提示我 - text_warn_on_leaving_unsaved: 若离开当前页面,则该页面内未保存的内容将丢失。 - label_my_queries: 我的自定义查询 - text_journal_changed_no_detail: "%{label} 已更新。" - label_news_comment_added: 添加到新闻的评论 - button_expand_all: 展开所有 - button_collapse_all: 合拢所有 - label_additional_workflow_transitions_for_assignee: 当用户是问题的分配对象时所允许的问题状态转换 - label_additional_workflow_transitions_for_author: 当用户是问题作者时所允许的问题状态转换 - label_bulk_edit_selected_time_entries: 批量修改选定的时间条目 - text_time_entries_destroy_confirmation: 是否确定要删除选定的时间条目? - label_role_anonymous: Anonymous - label_role_non_member: Non member - label_issue_note_added: 问题备注已添加 - label_issue_status_updated: 问题状态更新 - label_issue_priority_updated: 问题优先级更新 - label_issues_visibility_own: 创建或分配给用户的问题 - field_issues_visibility: 问题可见 - label_issues_visibility_all: 全部问题 - permission_set_own_issues_private: 设置自己的问题为公开或私有 - field_is_private: 私有 - permission_set_issues_private: 设置问题为公开或私有 - label_issues_visibility_public: 全部非私有问题 - text_issues_destroy_descendants_confirmation: 此操作同时会删除 %{count} 个子任务。 - - field_commit_logs_encoding: 提交注释的编码 - field_scm_path_encoding: 路径编码 - text_scm_path_encoding_note: "默认: UTF-8" - field_path_to_repository: 库路径 - field_root_directory: 根目录 - field_cvs_module: CVS Module - field_cvsroot: CVSROOT - text_mercurial_repository_note: 本地库 (e.g. /hgrepo, c:\hgrepo) - text_scm_command: 命令 - text_scm_command_version: 版本 - label_git_report_last_commit: 报告最后一次文件/目录提交 - text_scm_config: 您可以在config/configuration.yml中配置您的SCM命令。 请在编辑后,重启Redmine应用。 - text_scm_command_not_available: Scm命令不可用。 请检查管理面板的配置。 - text_git_repository_note: 库中无内容。(e.g. /gitrepo, c:\gitrepo) - notice_issue_successful_create: 问题 %{id} 已创建。 - label_between: 介于 - setting_issue_group_assignment: 允许问题被分配给组 - label_diff: 查看差别 - description_query_sort_criteria_direction: 排序方式 - description_project_scope: 搜索范围 - description_filter: 过滤器 - description_user_mail_notification: 邮件通知设置 - description_date_from: 输入开始日期 - description_message_content: 信息内容 - description_available_columns: 备选列 - description_date_range_interval: 按开始日期和结束日期选择范围 - description_issue_category_reassign: 选择问题类别 - description_search: 搜索字段 - description_notes: 批注 - description_date_range_list: 从列表中选择范围 - description_choose_project: 项目 - description_date_to: 输入结束日期 - description_query_sort_criteria_attribute: 排序方式 - description_wiki_subpages_reassign: 选择父页面 - description_selected_columns: 已选列 - label_parent_revision: 父修订 - label_child_revision: 子修订 - error_scm_annotate_big_text_file: 输入文本内容超长,无法输入。 - setting_default_issue_start_date_to_creation_date: 使用当前日期作为新问题的开始日期 - button_edit_section: 编辑此区域 - setting_repositories_encodings: 附件和版本库编码 - description_all_columns: 所有列 - button_export: 导出 - label_export_options: "%{export_format} 导出选项" - error_attachment_too_big: 该文件无法上传。超过文件大小限制 (%{max_size}) - error_pic_type: "仅支持如下图片格式:" - notice_failed_to_save_time_entries: "无法保存下列所选取的 %{total} 个项目中的 %{count} 工时: %{ids}。" - label_x_issues: - zero: 0 问题 - one: 1 问题 - other: "%{count} 问题" - #add by tan - label_repository_new: 连接到已有的SVN版本库 - label_repository_no: 还没有版本库? - label_repository_new_repos: 新建版本库 - label_repository_name: 版本库名 - #end - field_repository_is_default: 主版本库 - label_copy_attachments: 复制附件 - label_item_position: "%{position}/%{count}" - label_completed_versions: 已完成的版本 - text_project_identifier_info: 仅小写字母(a-z)、数字、破折号(-)和下划线(_)可以使用。
    一旦保存,标识无法修改。 - field_multiple: 多重取值 - setting_commit_cross_project_ref: 允许引用/修复所有其他项目的问题 - text_issue_conflict_resolution_add_notes: 添加说明并取消我的其他变更处理。 - text_issue_conflict_resolution_overwrite: 直接套用我的变更 (先前的说明将被保留,但是某些变更内容可能会被覆盖) - notice_issue_update_conflict: 当您正在编辑这个问题的时候,它已经被其他人抢先一步更新过了。 - text_issue_conflict_resolution_cancel: 取消我所有的变更并重新刷新显示 %{link} 。 - permission_manage_related_issues: 相关问题管理 - field_auth_source_ldap_filter: LDAP 过滤器 - label_search_for_watchers: 通过查找方式添加跟踪者 - notice_account_deleted: 您的账号已被永久删除(账号已无法恢复)。 - setting_unsubscribe: 允许用户退订 - button_delete_my_account: 删除我的账号 - text_account_destroy_confirmation: |- - 确定继续处理? - 您的账号一旦删除,将无法再次激活使用。 - error_session_expired: 您的会话已过期。请重新登陆。 - text_session_expiration_settings: "警告: 更改这些设置将会使包括你在内的当前会话失效。" - setting_session_lifetime: 会话最大有效时间 - setting_session_timeout: 会话闲置超时 - label_session_expiration: 会话过期 - permission_close_project: 关闭/重开项目 - label_show_closed_projects: 查看已关闭的项目 - button_close: 关闭 - button_reopen: 重开 - project_status_active: 已激活 - project_status_closed: 已关闭 - project_status_archived: 已存档 - text_project_closed: 当前项目已被关闭。当前项目只读。 - notice_user_successful_create: 用户 %{id} 已创建。 - field_core_fields: 标准字段 - field_timeout: 超时 (秒) - setting_thumbnails_enabled: 显示附件略缩图 - setting_thumbnails_size: 略缩图尺寸 (像素) - label_status_transitions: 状态转换 - label_fields_permissions: 字段权限 - label_readonly: 只读 - label_required: 必填 - text_repository_identifier_info: 仅小写字母(a-z)、数字、破折号(-)和下划线(_)可以使用。
    一旦保存,标识无法修改。 - field_board_parent: 父论坛 - label_attribute_of_project: 项目 %{name} - label_attribute_of_author: 作者 %{name} - label_attribute_of_assigned_to: 分配给 %{name} - label_attribute_of_fixed_version: 目标版本 %{name} - label_copy_subtasks: 复制子任务 - label_copied_to: 复制到 - label_copied_from: 复制于 - label_any_issues_in_project: 项目内任意问题 - label_any_issues_not_in_project: 项目外任意问题 - field_private_notes: 私有注解 - permission_view_private_notes: 查看私有注解 - permission_set_notes_private: 设置为私有注解 - label_no_issues_in_project: 项目内无相关问题 - label_any: 全部 - label_last_n_weeks: 上 %{count} 周前 - setting_cross_project_subtasks: 支持跨项目子任务 - label_cross_project_descendants: 与子项目共享 - label_cross_project_tree: 与项目树共享 - label_cross_project_hierarchy: 与项目继承层次共享 - label_cross_project_system: 与所有项目共享 - button_hide: 隐藏 - setting_non_working_week_days: Non-working days - label_in_the_next_days: in the next - label_in_the_past_days: in the past - label_attribute_of_user: User's %{name} - text_turning_multiple_off: If you disable multiple values, multiple values will be - removed in order to preserve only one value per item. - label_attribute_of_issue: Issue's %{name} - permission_add_documents: Add documents - permission_edit_documents: Edit documents - permission_delete_documents: Delete documents - permission_add_documents: 新建文档 - permission_edit_documents: 编辑文档 - permission_delete_documents: 删除文档 - label_gantt_progress_line: 进度线 - setting_jsonp_enabled: Enable JSONP support - field_inherit_members: Inherit members - field_closed_on: 已关闭 - setting_default_projects_tracker_ids: Default trackers for new projects - label_total_time: 合计 - label_create_time: 创建时间 #Customer added!Added by nie - label_comment_time: 留言时间 - label_activity_time: 发布时间 - label_update_time: 更新时间 - label_current_contributors: 位当前贡献者 - label_commit_limit: 作业提交时间已过! - label_commit_ar: 作业提交截止时间快到了! - lable_has_commit_homework: 您已提交过作业 - #modify by men - label_x_current_contributors: - zero: 位当前贡献者 - one: 位当前贡献者 - other: 位当前贡献者 - #end - label_lines_of_code: 行代码 - label_since_last_commits: 距离上次提交时间 - label_users_on_trustie: 用户 - label_front: 第一页 - label_commit_on: 次提交 - label_uncommit_homework: 暂无学生提交作业! - #modify by men - label_x_commit_on: - zero: 次提交 - one: 次提交 - other: 次提交 - #end - label_follow_people: 个关注者 - #modify by men - label_x_follow_people: - zero: 个关注者 - one: 个关注者 - other: 个关注者 - #end - label_member_since: 加入 - label_contribute_to: 参与了 %{project_count} 个项目: - #modify by men - label_x_contribute_to: - zero: 参与了 %{count} 个项目: - one: 参与了 %{count} 个项目: - other: 参与了 %{count} 个项目: - #end - label_total_commit: 共%{total_commit}次提交 - #modify by men - label_x_total_commit: - zero: 共 %{count} 次提交 - one: 共 %{count} 次提交 - other: 共 %{count} 次提交 - #end - label_upload_profile: 上传头像 - label_type_as: 类型为 - label_status_as: 状态为 - label_priority_as: 优先级为 - label_member_list: 成员列表 - label_author_name: 由%{author_name}发表了 - label_comments_count: (%{count}条评论) - label_post_on: 发表了 - label_find_all_comments: 查看所有评论 - label_updated_time_on: " 更新于 %{value} " - label_call_list: 需求列表 - #added by liuping - button_unfollow: 取消关注 - button_follow: 关注 - label_followers: 关注 - label_responses: 留言 - label_delete_confirm: 确认删除? - label_more_tags: 更多 - label_tags_bid: 需求名称 - label_tags_course_name: 课程名称 - label_tags_bid_description: 需求描述 - label_tags_issue_description: 问题描述 - label_tags_all_objects: 所有 - label_apply_project: 申请加入 - label_exit_project: 退出项目 - label_apply_project_waiting: 已处理申请,请等待管理员审核 - label_unapply_project: 取消申请 - - #fq - button_leave_meassge: 留言 - button_clear_meassge: 清除留言 - label_leave_message_to: 给用户 %{name}留言 - label_leave_message: 留言内容 - label_message: 留言板 - field_add: 添加于 %{time} 之前 - button_more: 更多 - label_user_response: 用户留言 - label_student_response: 作业答疑 # modified by bai - label_bidding_project: 参与项目 - label_homework_project: 已提交作业 #huang - button_bidding: 我要参加 - field_enterprise: '企业:' - - no_attachmens_allowed: 提交作业不能为空 - - button_bidding_homework: 参加竞标 #huang - field_homework_type: 提交形式 #bai - label_homework_respond: 作业情况 - - label_bid_me: 我要应标 - label_new_call: 发布需求 - - label_newtype_contest: 发布竞赛 - - label_user_information: "与我相关" - label_bid_succeed: "需求发布成功" - label_wrong_budget: 错误的金额格式 - label_wrong_date: 时间格式错误,请输入正确的时间 yyyy-mm-dd - label_bidding_succeed: 应标成功 - label_bidding_contest_succeed: 竞赛提交成功 #added by bai - label_bidding_homework_succeed: 作业提交成功 #added by bai - label_bidding_homework_failed: 作业提交失败 #added by bai - label_bidding_homework_committed: 你已经提交过作业,不能重复提交! - label_bidding_fail: 应标失败,该项目已经应标 - label_bidding_homework_fail: 作业提交失败,该作业已经被提交! - - label_requirement_list: 需求列表 - - label_x_biding_project: #modify by men - zero: 应标项目 - one: 应标项目 - other: 应标项目 - #end - label_x_homework_project: #modify by huang - zero: 已提交的作业 - one: 已提交的作业 - other: 已提交的作业 - #end - label_x_responses: #modify by men - zero: 留言 - one: 留言 - other: 留言 - #end - label_x_responses: #modify by huang - zero: 学生提问 - one: 学生提问 - other: 学生提问 - #end - label_x_bids_responses: #modify by huang - zero: 用户反馈 - one: 用户反馈 - other: 用户反馈 - #end - label_x_followers: #modify by men - zero: 关注 - one: 关注 - other: 关注 - #end - label_price: 悬赏: - label_RMB_sign: ¥ - label_investment_budget: 投资预算: - label_investment_time_limit: 投资时限: - label_my_respond: 如有问题请在这里留下您的宝贵意见^-^ - label_my_question: 请在此处留下您的意见或者问题~ # modified by bai - label_respond_requirement: 对需求进行了反馈 - label_contest_requirement: 对竞赛进行了反馈 - label_question_requirement: 对作业提出了问题! - label_deadline: 截止日期yyyy-mm-dd - label_requirement_name: 在此输入需求名称 - label_contest_name: 在此输入竞赛名称 - label_requirement_description: 内容:对你的需求进行描述 - label_contest_description: 内容:对你的竞赛进行描述 - label_requirement_bargain_money: 输入具体奖励方式(如金钱、奖项、学分) - button_upload_photo: 上传图片 - button_delete_file: 删除 - label_leave_me_message: 给我留言了 - label_leave_others_message: 给他留言了 - label_leave_a_message: 给他(她)留言 - label_leave_your_message: 给你留言了 - label_new_activity: 有了最新动态 - label_create_project: 参与了 - label_praise: 赞 - label_cancel_praise: 取消赞 - label_bid_reason: 请输入参与理由 - label_bid_reason_homework: 请输入作业提交说明! - label_create_new_projects: 创建项目 - label_call_for_bids: 发布需求 - label_create_course: 创建课程 - label_news: 新闻 - label_milestone: 里程碑 - label_features: 特性 - label_has_praisers: 赞(%{count}) - label_has_watchers: 关注(%{count}) - label_has_fans: 粉丝(%{count}) - label_coursefile_sharingarea: 课程文件共享专区 - #modify by men - label_x_has_fans: - zero: 粉丝(%{count}) - one: 粉丝(%{count}) - other: 粉丝(%{count}) - #end - label_me: 我 - label_my: 我 - label_i: 我 - label_you: 你 - label_join_bidding: 参与了应标 - label_jion_bidding_homework: 已提交! - label_bidding_user: 应标人: - label_bidding_user_homework: 作业提交者 - label_bidding_user_studentcode: 学号 - label_bidding_reason: 应标宣言: - label_bidding_reason_homewrok: 作业提交说明 - label_username: 用户名: - label_password: 密码: - label_about_requirement: 对需求: - label_about_issue: 对问题: - label_quote_my_words: 中对我的话进行了引用 - label_have_respond: 进行了反馈 - label_in_issues: 在问题: - label_in_bids: 在需求: - label_in_users: 在用户: - label_have_respond: 进行了反馈 - label_create_new_projects_description: 创建项目,让我们开启一次神奇的协同创作和开发之旅! - label_call_for_bids_description: 发布需求,征集解决方案,体验一呼百应的兴奋感觉! - label_news_description: 实时了解项目的最新动态,掌握最新项目咨询! - label_milestone_description: 在这里您可以看见任何一个版本的工程! - label_have_respond: 进行了反馈 - label_welcome: 欢迎 - label_join: 加入Trustie! - label_repository_path: 库路径 - label_board_description: 七嘴八舌,汇聚众人智慧,为您排忧解难! - label_create_course_description: 课程小社区,创建新课程,让我们共同分享多到想不到的公共资源! - label_welcome_page_to: 参与了 %{project_count} 个项目! - label_repository_path_not_null: 库路径 不能为空字符 - label_password_not_null: 密码不能设置为空。 - label_exist_repository_path: 定义已有版本库URL路径,定义格式file://, http://, https://, svn:// - label_project_no_activity: 该项目暂无动态! - label_course_homework_un: 暂未发布任何作业 - label_follow_no_requirement: 暂未关注任何需求! - label_no_user_respond_you: 暂无任何用户对您进行反馈! - label_tags_issue: 问题名称: - label_tags_project_name: 项目名称: - label_tags_project_description: 项目描述: - label_tags_user_mail: 用户邮箱: - label_tags_user_name: 用户名: - label_tags_numbers: Tag统计: - label_max_number: 昵称是在网站中显示的您的公开标识,至多25个字符。 - label_mail_attention: qq邮箱可能收不到此邮件,其他邮箱如果没有收到可能在垃圾邮件中,其中gmail与教育网邮箱的激活邮件有时比较慢,请耐心等待。 - label_your_course: 您的课程《 - label_have_message : 》有新的留言 - label_all_revisions: 所有版本: - label_upassword_info: 该密码在项目组内可共享 - label_how_commit_code: 查看如何提交代码: - label_how_commit_code_chinese: 中文 -# modified by bai - label_welcome_leave_message: 您好!系统目前正在公测,有意见和建议请 - label_welcome_click_me: 点击我 - label_issue_praise: 好问题,顶! - label_issue_tread: 烂问题,踩! - label_issue_praise_over: 我刚才顶过了~ - label_issue_tread_over: 我刚才踩过了~ - label_issue_not_praise_over: 不能顶自己~ - label_issue_not_treed_over: 不能踩自己~ - label_issues_score_not_enough: 积分不够,不能踩别人~ - #end - label_goto: 前往>> - label_issue_appraise_over: 只能评价一次哦! - label_welcome_my_respond: 请在此留下你的意见和建议! - label_no_current_fans: 该用户暂无粉丝 - label_no_current_watchers: 该用户暂未关注其他用户 - label_project_tool_response: 用户反馈 - label_course_feedback: 留言 - label_tags_search_result: 搜索结果 - label_active_call: 需求 - label_active_homework: 作业 - label_tags_call: 需求 - label_user_extensions: 其他信息 - label_boy: 男 - label_girl: 女 - field_gender: 性别 - field_birthday: 生日 - field_brief_introduction: 个人简介 - field_location: 现住址 - field_occupation: 工作单位 - field_work_experience: 工作经验(年) - field_zip_code: 邮编 - label_reward: 奖励: - label_credit: 学分: - label_choose_reward: 选择奖励方式 - label_money: 货币 - label_reward_1: 其他 - label_bids_credit: 学分 - label_bids_credit_number: 分 - field_budget: 奖励 - field_deadline: 截止日期 - field_is_evaluation: 是否启动互评 - field_proportion: 教师评分比例 - label_tags_selected: 已选标签 - label_tags_related: 相关标签 - button_project_tags_add: 增加 - label_issue_query_condition: 查询条件 - label_issue_query: 查询 - label_issue_cancel_query: 取消查询 - field_reward_type: 奖励类型 - label_tags_no: 暂无标签! - label_course_description_no: 你还未对该课程添加描述! - label_bid_publish: 发布了 - label_bid_project: 项目 - label_project_no_follow: 该项目暂未被关注! - label_no_bid_project: 暂无参与项目 - label_no_course_project: 暂无已提交的作业! - label_bids_reward_method: 奖励方式 : - label_bids_reward_what: 输入奖励内容 - label_call_bonus: 奖金 - label_bids_form_new_description: 企业可以在此发布一个软件开发任务或者一个技术方案需求:(1)获得价廉物美的解决方案;(2)发现对此项任务有贡献的大学生,获得可以招聘的人才。 - label_bids_form_contest_new_description: 企业或者高校可以在此发布一个竞赛。 - label_homeworks_form_new_description: 发布一个作业,作业提交方式可以是附件或者项目形式。 - label_fork_form_new_description: 该需求将作为某课程的作业被发布,作业提交方式可以使附件或者项目形式,在作业类型里面设置。 - label_bids_new_money: 输入奖励金额,如 500,2.5等 - label_bids_new_credit: 输入该作业对应课程的学分,如 3,2.5等 - label_bids_new_content: 输入奖励内容,如 奖项,物品等 - label_project_sort: 排序方式 - label_sort_by_time: 按时间排序 - label_sort_by_active: 按活跃度排序 - label_sort_by_influence: 按影响力排序 - label_bids_published: 发布于 - label_bids_published_ago: 之前 - label_welcome_trustie: Trustie - label_welcome_trustie_project: 在线项目托管平台 - label_welcome_trustie_course: 在线课程实践平台 - label_welcome_trustie_contest: 在线竞赛实战平台 - label_welcome_trustie_project_description: 面向中国大学生与软件从业者,提供社交化的项目管理、代码托管、资源共享、合作交流。 - label_welcome_trustie_course_description: 面向中国高校教师与大学生,提供社交化的课程管理、资源共享、合作实验、协同研究。 - label_welcome_trustie_contest_description: 面向中国大学生与编程爱好者,提供社交化的竞赛管理、应用管理、代码托管、合作交流。 - label_user_project: 项目 - label_user_course: 课程 - label_user_homework: 作业 - label_bid_respond_quote: 回复 - label_bid_if_agreement: 如果喜欢我,请点击我 - label_bid_respond_delete: 删除 - label_newfeedback_message: 留言 - label_newfeedback_quote: 回复 - label_newfeedback_delete: 删除 - label_user_all_activity: 所有动态 - label_user_activity_myself: 我的动态 # modified by bai - label_my_honework_no_homework: 暂无任何作业! - label_user_all_respond: 所有反馈 - label_layouts_feedback: 留言 - label_have_feedback: 有了 - label_of_feedback: 的 - label_welcome_participate: 参与了 - label_cant_download: 未开启互评功能作业不允许下载 - lable_close_evaluation: 该作业未开启互评功能 - lable_has_evaluation: 您已进行过评价 - #modify by men - label_x_welcome_participate: - zero: 参与了 - one: 参与了 - other: 参与了 - #end - label_welcome_participate_project: 个项目 - label_projects_feedback: 对项目进行了反馈 - label_projects_feedback_respond: 回复 - label_projects_feedback_respond_success: 回复成功 - button_projects_feedback_respond: 回复 - label_projects_feedback_respond_content: 请输入回复内容 - label_user_create_project: 创建了 - label_user_create_project_homework: 创建了作业 -#added by bai - label_identity: 身份 - label_teacher: 教师 - label_teacher_homework: 教师姓名 - label_student: 学生 - label_TA: 助教 - label_other: 其他 - label_enterprise: 企业 - label_developer: 用户 - label_gender: 性别 - label_gender_male: 男 - label_gender_female: 女 - label_location: 地区 - label_brief_introduction: 个性签名 - label_my_brief_introduction: 今天的心情如何?留下你的脚印吧~ - label_time: 年度 - label_main_teacher: 主讲教师 - label_main_term: 课程学期 - label_teacher_work_unit: 教师单位 - label_course_time: 课程年度 - label_i_new_activity: 有了新活动在 - label_choose_course: 选择课程 - button_submit_homework: 提交作业 - label_my_course: 我的课程 - button_submit_bid: 参与竞标 - label_requirement_from: 需求来源 - label_course_view: 作业界面 - label_course_return: "返 回 课 程" - label_setup_time: 开课日期 - label_endup_time: 结课日期 - label_class_period: 学时总数 - label_class_hour: 学时 - label_user_score: 个人综合得分 - label_user_score_of_topic: 帖子得分 - label_user_score_of_project: 项目得分 - label_user_score_of_activity: 活跃度得分 - label_user_score_of_influence: 影响力得分 - label_user_score_of_collaboration: 协同得分 - label_user_score_of_skill: 技术得分 - label_user_score_of_active: 项目贡献得分 - label_question_top: 问题被顶次数 - label_question_down: 问题被踩次数 - label_answer_top: 回答被顶次数 - label_answer_down: 回答被踩次数 - label_comments_number: 评论的数量 - label_news_number: 新闻的数量 - label_wiki_number: wiki的数量 - label_message_number: 留言的数量 - label_activity_number: 个人动态数量 - label_issue_message_number: 对issue的留言数量 - label_code_submit_number: 代码提交次数 - label_topic_number: 讨论区发言数量 - label_projects_score: 项目综合得分 - label_issue_score: issue得分 - label_news_score: 新闻得分 - label_file_score: 文档得分 - label_code_submit_score: 代码提交得分 - label_topic_score: 讨论区得分 - label_issue_number: issue的数量 - label_issue_journal_number: issue的留言数量 - label_new_number: 新闻的数量 - label_file_number: 文档的数量 - label_code_submit_number: 代码提交数量 - label_topic_number: 讨论区帖子数量 - label_files_filter: 资源过滤: - - label_course_contribute_to: 参与了 %{project_count} 个项目: - label_x_course_contribute_to: - zero: "参与了 %{count} 个课程:" - one: "参与了 %{count} 个课程:" - other: "参与了 %{count} 个课程:" - - label_join_contest: 加入竞赛 - label_exit_contest: 退出竞赛 - label_participator: 参与者 - label_contest_modify_settings: 配置竞赛 - label_no_current_participate: 该竞赛暂无参与者 - - #end - - label_joined_course: 参加的课程 - label_created_course: 创建的课程 - label_course: 课程 - label_course_new: 新建课程 - label_course_join_student: 加入课程 - label_public_info: (打钩为公开,不打钩则不公开,若不公开,仅项目成员可见该项目。) - label_course_public_info: (打钩为公开,不打钩则不公开,若不公开,仅课程成员可见该课程。) - label_course_view_student: 查看其他课程 - label_course_student: 学生 - label_homework: 课程作业 - label_course_file: 资源库 #资料共享 - label_stores_index: 资源搜索 - label_course_new_homework: 新建作业 - label_course_homework_list: 作业列表 - label_course_homework_new: 发布作业 - label_fork_homework_new: 选为作业 - #wang - label_contest_userresponse: 用户留言 - label_contest_joincontest: 参加竞赛 - label_contest_notification: 竞赛通知 - #end - - label_x_course_data: - zero: 资料 - one: 资料 - other: 资料 - label_x_base_courses_student: - zero: 学生 - one: 学生 - other: 学生 - label_x_base_courses_teacher: - zero: 教师 - one: 教师 - other: 教师 - - label_homework_statistics: 作业统计 - label_technical_title: 职称 - - # added by william 无english版本 - label_bidding_results: 应标结果 - label_bid_end: 该需求已经结束! - label_special_reward: 特等奖 - label_first_reward: 一等奖 - label_second_reward: 二等奖 - label_third_reward: 三等奖 - label_fourth_reward: 四等奖 - label_fifth_reward: 五等奖 - label_excellence_reward: 优秀奖 - label_comfort_reward: 入围奖 - label_course_settings: 课程设置 - -#added by nie - label_x_task: - zero: 份作业 - one: 份作业 - other: 份作业 - label_x_member: - zero: 个成员 - one: 个成员 - other: 个成员 - label_x_data: - zero: 份资料 - one: 份资料 - other: 份资料 - - - - #add by men - label_technicl_title_professor: 教授 - label_technicl_title_associate_professor: 副教授 - label_technicl_title_lecturer: 讲师 - label_technicl_title_teaching_assistant: 助教 - label_account_identity_teacher: 教师 - label_account_identity_student: 学生 - label_account_identity_developer: 开发者 - label_account_identity_enterprise: 企业 - label_account_identity_choose: --请选择身份-- - label_teaching_course: 我执教的课程 - label_release_homework: 我发布的作业 - label_enterprise_into: 进入企业 - label_homework_source: 作业来源 - label_course_college: 大学 - label_my_create_honework_no_homework: 暂无任何作业 - label_my_homework_no_homework: 暂无任何作业 - label_bid_show_course_name: 课程名称 - label_bid_show_teacher_name: 教师 - label_bid_contest_show_course_name: 课程名称 - label_bid_contest_show_teacher_name: 教师 - label_contest_list: 竞赛列表 - - label_x_base_courses_member: - zero: 成员 - one: 成员 - other: 成员 - - label_bids_task_list: 作业列表 - label_join_course: 加入课程 - label_exit_course: 退出课程 - label_new_join: 加入 - label_new_course_password: 课程密码 - label_new_course_school: 开课学校 - label_new_course_description: 课程描述 - label_new_join_order: 请输入课程密码 - label_task_submit_form_accessory: 作业最终以附件形式提交 - label_task_submit_form_project: 作业最终以项目形式提交 - lable_start_mutual_evaluation: 启动互评 - lable_close_mutual_evaluation: 关闭互评 - label_has_been: 已经被 - label_course_userd_by: 个课程引用 - no_file_dowmload: 该作业没有任何的附件可以下载 - - role_of_course: 课程角色 - label_student: 学生 - - #added by Wen - label_school_all: 中国高校 - label_school_not_fount: 没有符合的高校信息 - - - label_project_grade: 项目得分 - label_user_grade: 个人得分 - label_user_for_project_grade: 个人得分 - label_system_grade: 系统评分 - label_teacher: 老师 - label_ta: 助教 - label_in_course: 在课程中 - label_assign_homework: 中布置了作业 - label_noawards: 未评奖 - - label_course_modify_settings: 配置课程 - label_homework_prompt: 贴心小提示: - label_homework_prompt_content: 亲,在这里我们的作业将以项目的形式提交,如果小伙伴们还没有创建项目,请先创建一个项目。项目创建成功后,就可以 - label_create_homework: 布置了作业: - label_watch_project: 关注了 - label_watch_no_projects: 没有关注任何项目 - label_has_watched_project: 关注的项目 - label_project_take: 参与的项目 - label_peoject_take_in: 加入了项目: - label_search_by_user: 按用户搜索 - label_update_homework_succeed: 作业更新成功 - label_task_plural: 作业 - label_search_by_student_id: 按学号过滤 - label_institution_name: 单位名称 - label_duration_time: 授课时间 - label_course_brief_introduction: 课程简介 - field_teacher_name: 教 师 - - field_hidden_repo: 隐藏代码库 - field_dts_test: DTS测试工具 - - label_newbie_faq: '新手指引 & 问答' - label_hot_project: '热门项目' - label_borad_project: 项目讨论区 - label_borad_course: 课程讨论区 - label_memo_create_succ: 发布成功 - label_memo_create_fail: 发布失败 - label_forum_create_succ: 贴吧新建成功 - label_forum_create_fail: 贴吧新建失败 - label_forum_update_succ: 贴吧更新成功 - label_forum_update_fail: 贴吧更新失败 - label_first_page_create_fail: 首页定制失败 - label_forum_edit: 编辑讨论区 - label_memo_create: 发布 - label_memo_new: 新建主题 - label_memo_edit: 修改主题label_board_new - label_memo_new_from_forum: 发布帖子 - label_forum: 公共贴吧 - label_forum_new: 新建贴吧 - label_tags_forum_description: 贴吧描述 - label_tags_forum: 贴吧名称 - label_project_module_forums: 公共贴吧 - label_memo_locked: 帖子已被锁定 - label_downloads_list: 进入附件列表 - label_joined_contest: 参与了竞赛 - label_contest_user: 参赛人: - label_contest_reason: 参赛宣言: - label_notification: 通知 - label_sumbit_empty: 搜索内容不能为空 - label_reply_empty: 回复内容不能为空 - no_use: 没有帮助 - cancel_no_use: 撤销没有帮助 - cancel_apply: 取消申请 - apply_master: 申请成为版主 - you_are_master: 您是该项目的版主 - - #add by linchun (竞赛相关) - label_upload_files: 上传文件 - label_upload_softwarepackage: 上传软件包 - label_upload_cuttingphoto: 上传截图 - label_contests_reward_method: 奖励方式 - label_system_platform: 系统平台 - label_nextstep: 下一步 - label_participate: 参赛者 - label_setting: 配置 - label_contest_project: 参赛项目 - label_contest_softapplication: 参赛应用 - label_contest_response: 用户反馈 - label_contest_watchers: 关注人数 - label_contest_application: 参赛应用 - label_contest_work: 参赛作品 - button_contesting_as_project: 我要参赛(新建项目) - button_contesting_as_application: 我要参赛(发布应用) - label_release_softapplication: 发布应用 - label_upload_softapplication_packets: 上传应用软件包 - label_upload_softapplication_photo: 上传产品截图 - label_upload_softapplication_packets_mustpacketed: 作品相关代码及相关说明文件必须打包后以压缩包的形式上传,便于上传和下载 ; - label_upload_softapplication_photo_condition: 作品截图最好0~4张(多余图片不会在展示页面上显示);格式为gif/jpg/png/bmp等, 每张小于5M - label_updated_caution: 注意:若编辑参赛作品,则之前上传的软件包和截图都将被删除,请重新上传! - label_softapplication_name: 应用名称 - label_work_name: 作品名称 - label_softapplication_description: 应用简介 - label_work_description: 作品简介 - label_work_scores: 作品得分 - label_work_rating: 评分 - label_work_tishi: 您可以重新打分,打分结果以最后一次打分为主! - label_work_scores_proportion: 得分比例 - label_softapplication_type: 应用分类 - label_work_type: 作品分类 - label_work_photo: 作品截图 - label_work_comment: 作品评论 - label_softapplication_version_available: 适配版本 - label_running_platform: 运行平台 - label_softapplication_developer: 上传人员 - label_softapplication_developers: 开发人员 - label_work_deposit_project_url: 托管项目网址 - label_work_deposit_project: 托管项目 - label_softapplication_name_condition: 25个汉字以内(50个字符) - label_softapplication_description_condition: 125个汉字以内 - label_user_login_softapplication_board: 您还没有登录,请登录后参与应用评价。 - label_contest_description_no: 暂无描述。 - label_no_contest_softapplication: 暂无参赛应用 - label_button_ok: 确定 - label_tags_contest: 竞赛标签 - label_tags_contest: 竞赛名称 - label_final_scores: 最终得分 - label_rating_person_amount: 打分总人数 - label_tags_contest_description: 竞赛描述 - label_release_add_contest_succeed: 该应用发布并添加成功. - label_add_contest_succeed_fail: 添加失败,该应用已参赛. - label_no_ftapplication: 暂无应用 - label_edit_softapplication: 修改应用 - label_edit_work: 修改作品 - label_contest_delete: 删除竞赛 - label_softapplication_list: 应用列表 - label_contest_work_list: 参赛作品列表 - label_attending_contest: 我要参赛 - label_contest_notification: 竞赛通知 - label_company_name: 企业名 - - label_coursefile_sharingarea: 课程资源共享区 - label_sort_by_activity: 按动态数排序 - label_homework: 课程实践 - label_x_activity: - zero: 个动态 - one: 个动态 - other: 个动态 - label_school_all: 中国高校 - label_upload_files: 上传资源 - label_relation_files: 关联已有资源 - label_contest_settings: 配置竞赛 - label_contest_delete: 删除竞赛 - label_noawards_current: 暂未评奖 - - label_softapplication: 应用软件 - label_attending_contest: 参加竞赛 - label_new_attendingcontest_work: 新建参赛作品 - label_workname_lengthlimit: 25个汉字以内 - label_workdescription_lengthlimit: 125个汉字以内 - label_please_input_password: 请输入竞赛密码 - label_please_select_project: 请选择项目 - label_upload_softworkpacket_photo: 上传作品软件包和作品截图 - label_reward: 评奖 - label_please_select_contestingsoftapplication: 请选择参赛应用 - label_attendingcontest_time: 参赛时间 - label_attendingcontest_spoksman: 参赛代表 - label_wellmeaning_intimation_contentone: 温馨提示:如果您准备参加竞赛,请点击下面的"新建参赛作品"! - label_wellmeaning_intimation_contenttwo: 若您已完成开发,且只希望发布您的作品,“托管项目”一项可以不选; - label_wellmeaning_intimation_contentthree: 若您希望托管竞赛数据和代码以及保留开发和提交代码的轨迹,请从“托管项目”中选择一项您已创建好的项目作为该参赛作品的托管项目,若您还没有创建项目,请点击右边的“创建项目”,然后回到本页再选择。 - - notice_account_updated: 帐号更新成功 - notice_attendingcontest_work_successfully_created: 恭喜您,参赛作品创建成功! - notice_softapplication_was_successfully_updated: 恭喜您,参赛作品更新成功! - notice_attendingcontest_work_failed_created: 参赛产品创建失败 - - label_attendingcontestwork_belongs_contest: 所属竞赛 - label_attendingcontestwork_belongs_type: 所属类别 - label_attendingcontestwork_release_person: 发布人员 - label_attendingcontestwork_adaptive_system: 系统支持 - label_attendingcontestwork_download: 作品下载 - label_attendingcontestwork_developers: 开发人员 - label_attendingcontestwork_average_scores: 平均评分 - label_attendingcontestwork_release_time: 发布时间 - label_attendingcontestwork_deposit_project: 托管项目 - label_attendingcontestwork_sorting_intimation: 您可以重新打分,打分结果以最后一次打分为主! - lable_not_receive_mail: 点此设置接收本站邮件偏好! - label_contest_notification: 竞赛通知 - label_contest_innovate_community: 创新竞赛社区 - #english site translation - label_current_hot_contest: 最新热门竞赛 - label_current_attendingcontest_work: 最新参赛作品 - label_issue_feedback_activities: 问题和反馈动态 - label_more_information: 更多... - label_my_question: 我要提问 - label_my_feedback: 我要反馈 - label_release_time: 发布时间 - label_question_sponsor: 楼主 - label_final_reply: 最后回复 - label_reply: 回复 - label_weixin: 微信扫码 - label_search_intimation: 请输入要搜索的关键字 - label_work_quantity: 个作品 - label_projects_management_platform: 项目托管平台 - label_courses_management_platform: 课程实践平台 - label_contests_management_platform: 竞赛托管平台 - - label_organizers: 主办单位 - label_organizers_information: 国防科学技术大学并行与分布处理国家重点实验室 - label_organizers_information_institute: 计算机科学与技术系 - label_copyright: 版权 - label_contact_us: 联系我们 - label_record: 湘ICP备09019772 - label_check_comment: 查看通知评论 - label_notification: 通知公告 - #end - - #end - - # ajax异步验证 - modal_valid_passing: 可以使用 - label_bug: 漏洞 - - label_school_no_course: 该学校未开设任何课程,您可以查看其他学校课程 - label_school_less_course: 该学校开设课程较少,您可以查看其他学校课程 - - label_file_not_found: 对不起,该文件现在不能下载 - label_goto_homepage: 返回主页 - label_trustie_team: Trustie开发团队 - - label_memos_max_length: 帖子内容最大长度为65535个字符 - label_forums_max_length: 贴吧描述最大长度为65535个字符 - label_unknow_type: 未知类型 - label_score_less_than_zero: 得分小于0,修正为0 - review_assignments: 评审任务 - label_private: 私有 - label_my_school: 我的学校 - label_all_schol: 全部学校 - label_select_province: 请选择省份 + +# Chinese (China) translations for Ruby on Rails +# by tsechingho (http://github.com/tsechingho) +zh: + # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl) + direction: ltr + jquery: + locale: "zh-CN" + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%Y-%m-%d" + short: "%b%d日" + long: "%Y年%b%d日" + zh_date: + formats: + default: "%Y年%m月%d日" + + day_names: [星期天, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六] + abbr_day_names: [日, 一, 二, 三, 四, 五, 六] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, 一月, 二月, 三月, 四月, 五月, 六月, 七月, 八月, 九月, 十月, 十一月, 十二月] + abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day + + time: + formats: + default: "%Y年%b%d日 %A %H:%M:%S" + time: "%H:%M" + short: "%b%d日 %H:%M" + long: "%Y年%b%d日 %H:%M" + am: "上午" + pm: "下午" + + datetime: + distance_in_words: + half_a_minute: "半分钟" + less_than_x_seconds: + one: "1秒内" + other: "少于 %{count} 秒" + x_seconds: + one: "1秒" + other: "%{count} 秒" + less_than_x_minutes: + one: "1分钟内" + other: "少于 %{count} 分钟" + x_minutes: + one: "1分钟" + other: "%{count} 分钟" + about_x_hours: + one: "大约1小时" + other: "大约 %{count} 小时" + x_hours: + one: "1 小时" + other: "%{count} 小时" + x_days: + one: "1天" + other: "%{count} 天" + about_x_months: + one: "大约1个月" + other: "大约 %{count} 个月" + x_months: + one: "1个月" + other: "%{count} 个月" + about_x_years: + one: "大约1年" + other: "大约 %{count} 年" + over_x_years: + one: "超过1年" + other: "超过 %{count} 年" + almost_x_years: + one: "将近 1 年" + other: "将近 %{count} 年" + + number: + # Default format for numbers + format: + separator: "." + delimiter: "" + precision: 3 + human: + format: + delimiter: "" + precision: 3 + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + +# Used in array.to_sentence. + support: + array: + sentence_connector: "和" + skip_last_comma: false + + activerecord: + errors: + template: + header: + one: "由于发生了一个错误 %{model} 无法保存" + other: "%{count} 个错误使得 %{model} 无法保存" + messages: + inclusion: "不包含于列表中" + exclusion: "是保留关键字" + invalid: "是无效的" + confirmation: "与确认值不匹配" + accepted: "必须是可被接受的" + empty: "不能留空" + blank: "不能为空字符" + too_long: "过长(最长为 %{count} 个字符)" + too_short: "过短(最短为 %{count} 个字符)" + wrong_length: "长度非法(必须为 %{count} 个字符)" + taken: "已经被使用" + not_a_number: "不是数字" + not_a_date: "不是合法日期" + greater_than: "必须大于 %{count}" + greater_than_or_equal_to: "必须大于或等于 %{count}" + equal_to: "必须等于 %{count}" + less_than: "必须小于 %{count}" + less_than_or_equal_to: "必须小于或等于 %{count}" + odd: "必须为单数" + even: "必须为双数" + greater_than_start_date: "必须在起始日期之后" + not_same_project: "不属于同一个项目" + circular_dependency: "此关联将导致循环依赖" + cant_link_an_issue_with_a_descendant: "问题不能关联到它的子任务" + + actionview_instancetag_blank_option: 请选择 + + attachment_all: "全部" + attachment_sufix_browse: "文件类型" + attachment_browse: "内容类型" + attachment_type: '分类' + general_text_No: '否' + general_text_Yes: '是' + general_text_no: '否' + general_text_yes: '是' + general_lang_name: 'Simplified Chinese (简体中文)' + general_csv_separator: ',' + general_csv_decimal_separator: '.' + general_csv_encoding: gb18030 + general_pdf_encoding: gb18030 + general_first_day_of_week: '7' + + label_approve: 批准 + label_refusal: 拒绝 + + notice_account_updated: 帐号更新成功 + notice_account_invalid_creditentials: 无效的用户名或密码 + notice_account_invalid_creditentials_new: 您还未到邮箱激活 + notice_account_password_updated: 密码更新成功 + notice_account_wrong_password: 密码错误 + notice_account_register_done: 帐号创建成功,请使用注册确认邮件中的链接来激活您的帐号, 如果您的邮件没有在收件箱中可能在垃圾箱中,请您注意查收。 + notice_account_unknown_email: 未知用户 + notice_can_t_change_password: 该帐号使用了外部认证,因此无法更改密码。 + notice_account_lost_email_sent: 系统已将引导您设置新密码的邮件发送给您。 + notice_account_activated: 您的帐号已被激活。 + notice_successful_create: 创建成功 + notice_successful_update: 更新成功 + notice_successful_delete: 删除成功 + notice_failed_delete: 删除失败 + notice_successful_connection: 连接成功 + notice_file_not_found: 您访问的页面不存在或已被删除。 + notice_locking_conflict: 数据已被另一位用户更新 + notice_not_authorized: 对不起,您无权访问此页面。 + notice_has_homework: 您已经提交过一份作业 + notice_not_contest_setting_authorized: 对不起,您无权配置此竞赛。 + notice_not_contest_delete_authorized: 对不起,您无权删除此竞赛。 + notice_not_authorized_archived_project: 要访问的项目已经归档。 + notice_email_sent: "邮件已发送至 %{value}" + notice_email_error: "发送邮件时发生错误 (%{value})" + notice_feeds_access_key_reseted: 您的RSS存取键已被重置。 + notice_api_access_key_reseted: 您的API访问键已被重置。 + notice_failed_to_save_issues: "%{count} 个问题保存失败(共选择 %{total} 个问题):%{ids}." + notice_failed_to_save_members: "成员保存失败: %{errors}." + notice_no_issue_selected: "未选择任何问题!请选择您要编辑的问题。" + notice_account_pending: "您的帐号已被成功创建,正在等待管理员的审核。" + notice_default_data_loaded: 成功载入默认设置。 + notice_unable_delete_version: 无法删除版本 + notice_unable_delete_time_entry: 无法删除工时 + notice_issue_done_ratios_updated: 问题完成度已更新。 + notice_gantt_chart_truncated: "这个表是截断的因为它超过了可以显示的最大数量(%{max})" + + error_complete_occupation: "请您填写工作单位,否则本系统的部分功能将无法正常使用。" + error_attachment_empty: "添加文件出错!" + + error_class_period_only_num: "课程学时只能为数字" + error_can_t_load_default_data: "无法载入默认设置:%{value}" + error_scm_not_found: "版本库中不存在该条目和(或)其修订版本。" + error_scm_command_failed: "访问版本库时发生错误:%{value}" + error_scm_annotate: "该条目不存在或无法追溯。" + error_issue_not_found_in_project: '问题不存在或不属于此项目' + error_no_tracker_in_project: 该项目未设定跟踪标签,请检查项目配置。 + error_no_default_issue_status: 未设置默认的问题状态。请检查系统设置("管理" -> "问题状态")。 + error_can_not_delete_custom_field: 无法删除自定义属性 + error_can_not_delete_tracker: "该跟踪标签已包含问题,无法删除" + error_can_not_remove_role: "该角色正在使用中,无法删除" + error_can_not_reopen_issue_on_closed_version: 该问题被关联到一个已经关闭的版本,因此无法重新打开。 + error_can_not_archive_project: 该项目无法被存档 + error_issue_done_ratios_not_updated: 问题完成度未能被更新。 + error_workflow_copy_source: 请选择一个源跟踪标签或者角色 + error_workflow_copy_target: 请选择目标跟踪标签和角色 + error_unable_delete_issue_status: '无法删除问题状态' + error_unable_to_connect: "无法连接 (%{value})" + warning_attachments_not_saved: "%{count} 个文件保存失败" + + mail_subject_lost_password: "您的 %{value} 密码" + mail_body_lost_password: '请点击以下链接来修改您的密码:' + mail_subject_register: "%{value}帐号激活" + mail_body_register: '请点击以下链接来激活您的帐号:' + mail_body_account_information_external: "您可以使用您的 %{value} 帐号来登录。" + mail_body_account_information: 您的帐号信息 + mail_subject_account_activation_request: "%{value}帐号激活请求" + mail_body_account_activation_request: "新用户(%{value})已完成注册,正在等候您的审核:" + mail_subject_reminder: "%{count} 个问题需要尽快解决 (%{days})" + mail_body_reminder: "指派给您的 %{count} 个问题需要在 %{days} 天内完成:" + mail_subject_wiki_content_added: "'%{id}' wiki页面已添加" + mail_body_wiki_content_added: "'%{id}' wiki页面已由 %{author} 添加。" + mail_subject_wiki_content_updated: "'%{id}' wiki页面已更新。" + mail_body_wiki_content_updated: "'%{id}' wiki页面已由 %{author} 更新。" + + + + field_name: 名称 + #added by huang + field_tea_name: 教师 + field_couurse_time: 学时 + field_course_code: 学分 + field_state: 加入课程口令 + field_term: 课程学期 + field_course_un: 暂未填写 + #end + field_description: 描述 + field_summary: 摘要 + field_is_required: 必填 + field_firstname: 名字 + field_firstname_eg: '(例:张三丰,请填写[三丰])' + field_lastname: 姓氏 + field_lastname_eg: '(例:张三丰,请填写[张])' + field_mail: 邮件地址 + field_filename: 文件 + field_file_dense: 是否公开 + field_filesize: 大小 + field_downloads: 下载次数 + field_author: 作者 + field_created_on: 创建于 + field_updated_on: 更新于 + field_field_format: 格式 + field_is_for_all: 用于所有项目 + field_possible_values: 可能的值 + field_regexp: 正则表达式 + field_min_length: 最小长度 + field_max_length: 最大长度 + field_value: 值 + field_category: 类别 + field_title: 标题 + field_web_title: 浏览器标题 + field_project: 项目 + field_issue: 问题 + field_status: 状态 + field_notes: 说明 + field_is_closed: 已关闭的问题 + field_is_default: 默认值 + field_tracker: 跟踪 + field_subject: 主题 + field_quote: 描述 + field_due_date: 计划完成日期 + field_assigned_to: 指派给 + field_priority: 优先级 + field_fixed_version: 目标版本 + field_user: 用户 + field_principal: 用户/用户组 + field_role: 角色 + field_homepage: 主页 + field_time: 课时 + field_class_period: 学时 + field_code: 学分 + field_is_public: 公开 + field_parent: 上级项目 + field_is_in_roadmap: 在路线图中显示 + field_login: 昵称 + field_mail_notification: 邮件通知 + field_admin: 管理员 + field_last_login_on: 最后登录 + field_language: 语言 + field_effective_date: 日期 + field_password: 密码 + field_new_password: 新密码 + field_password_confirmation: 确认 + field_version: 版本 + field_type: 类型 + field_host: 主机 + field_port: 端口 + field_account: 帐号 + field_base_dn: Base DN + field_attr_login: 登录名属性 + field_attr_firstname: 名字属性 + field_attr_lastname: 姓氏属性 + field_attr_mail: 邮件属性 + field_onthefly: 即时用户生成 + field_start_date: 开始日期 + field_done_ratio: "% 完成" + field_auth_source: 认证模式 + field_hide_mail: 隐藏我的邮件地址 + field_comments: 注释 + field_url: 路径 + field_start_page: 起始页 + field_subproject: 子项目 + field_hours: 小时 + field_activity: 活动 + field_spent_on: 日期 + field_identifier: 标识 + field_is_filter: 作为过滤条件 + field_issue_to: 相关问题 + field_delay: 延期 + field_assignable: 问题可指派给此角色 + field_redirect_existing_links: 重定向到现有链接 + field_estimated_hours: 预期时间 + field_column_names: 列 + field_time_entries: 工时 + field_time_zone: 时区 + field_searchable: 可用作搜索条件 + field_default_value: 默认值 + field_comments_sorting: 显示注释 + field_parent_title: 上级页面 + field_editable: 可编辑 + field_watcher: 跟踪者 + field_identity_url: OpenID URL + field_content: 内容 + field_group_by: 根据此条件分组 + field_sharing: 共享 + field_parent_issue: 父任务 + field_member_of_group: 用户组的成员 + field_assigned_to_role: 角色的成员 + field_text: 文本字段 + field_visible: 可见的 + + setting_app_title: 应用程序标题 + setting_app_subtitle: 应用程序子标题 + setting_welcome_text: 欢迎文字 + setting_default_language: 默认语言 + setting_login_required: 要求认证 + setting_self_registration: 允许自注册 + setting_attachment_max_size: 附件大小限制 + setting_issues_export_limit: 问题导出条目的限制 + setting_mail_from: 邮件发件人地址 + setting_bcc_recipients: 使用密件抄送 (bcc) + setting_plain_text_mail: 纯文本(无HTML) + setting_host_name: 主机名称 + setting_text_formatting: 文本格式 + setting_wiki_compression: 压缩Wiki历史文档 + setting_feeds_limit: RSS Feed内容条数限制 + setting_default_projects_public: 新建项目默认为公开项目 + setting_autofetch_changesets: 自动获取程序变更 + setting_sys_api_enabled: 启用用于版本库管理的Web Service + setting_commit_ref_keywords: 用于引用问题的关键字 + setting_commit_fix_keywords: 用于解决问题的关键字 + setting_autologin: 自动登录 + setting_date_format: 日期格式 + setting_time_format: 时间格式 + setting_cross_project_issue_relations: 允许不同项目之间的问题关联 + setting_issue_list_default_columns: 问题列表中显示的默认列 + setting_emails_header: 邮件头 + setting_emails_footer: 邮件签名 + setting_protocol: 协议 + setting_per_page_options: 每页显示条目个数的设置 + setting_user_format: 用户显示格式 + setting_activity_days_default: 在项目活动中显示的天数 + setting_display_subprojects_issues: 在项目页面上默认显示子项目的问题 + setting_enabled_scm: 启用 SCM + setting_mail_handler_body_delimiters: 在这些行之后截断邮件 + setting_mail_handler_api_enabled: 启用用于接收邮件的服务 + setting_mail_handler_api_key: API key + setting_sequential_project_identifiers: 顺序产生项目标识 + setting_gravatar_enabled: 使用Gravatar用户头像 + setting_gravatar_default: 默认的Gravatar头像 + setting_diff_max_lines_displayed: 查看差别页面上显示的最大行数 + setting_file_max_size_displayed: 允许直接显示的最大文本文件 + setting_repository_log_display_limit: 在文件变更记录页面上显示的最大修订版本数量 + setting_openid: 允许使用OpenID登录和注册 + setting_password_min_length: 最短密码长度 + setting_new_project_user_role_id: 非管理员用户新建项目时将被赋予的(在该项目中的)角色 + setting_default_projects_modules: 新建项目默认启用的模块 + setting_issue_done_ratio: 计算问题完成度: + setting_issue_done_ratio_issue_field: 使用问题(的完成度)属性 + setting_issue_done_ratio_issue_status: 使用问题状态 + setting_start_of_week: 日历开始于 + setting_rest_api_enabled: 启用REST web service + setting_cache_formatted_text: 缓存格式化文字 + setting_default_notification_option: 默认提醒选项 + setting_commit_logtime_enabled: 激活时间日志 + setting_commit_logtime_activity_id: 记录的活动 + setting_gantt_items_limit: 在甘特图上显示的最大记录数 + + permission_add_project: 新建项目 + permission_add_subprojects: 新建子项目 + permission_edit_project: 编辑项目 + permission_select_project_modules: 选择项目模块 + permission_manage_members: 管理成员 + permission_manage_project_activities: 管理项目活动 + permission_manage_versions: 管理版本 + permission_manage_categories: 管理问题类别 + permission_view_issues: 查看问题 + permission_add_issues: 新建问题 + permission_edit_issues: 更新问题 + permission_manage_issue_relations: 管理问题关联 + permission_add_issue_notes: 添加说明 + permission_edit_issue_notes: 编辑说明 + permission_edit_own_issue_notes: 编辑自己的说明 + permission_move_issues: 移动问题 + permission_delete_issues: 删除问题 + permission_manage_public_queries: 管理公开的查询 + permission_save_queries: 保存查询 + permission_view_gantt: 查看甘特图 + permission_view_calendar: 查看日历 + permission_view_issue_watchers: 查看跟踪者列表 + permission_add_issue_watchers: 添加跟踪者 + permission_delete_issue_watchers: 删除跟踪者 + permission_log_time: 登记工时 + permission_view_time_entries: 查看耗时 + permission_edit_time_entries: 编辑耗时 + permission_edit_own_time_entries: 编辑自己的耗时 + permission_manage_news: 管理新闻 + permission_comment_news: 为新闻添加评论 + permission_view_documents: 查看文档 + permission_manage_files: 管理文件 + permission_view_files: 查看文件 + permission_manage_wiki: 管理Wiki + permission_rename_wiki_pages: 重定向/重命名Wiki页面 + permission_delete_wiki_pages: 删除Wiki页面 + permission_view_wiki_pages: 查看Wiki + permission_view_wiki_edits: 查看Wiki历史记录 + permission_edit_wiki_pages: 编辑Wiki页面 + permission_delete_wiki_pages_attachments: 删除附件 + permission_protect_wiki_pages: 保护Wiki页面 + permission_manage_repository: 管理版本库 + permission_browse_repository: 浏览版本库 + permission_view_changesets: 查看变更 + permission_commit_access: 访问提交信息 + permission_manage_boards: 管理讨论区 + permission_view_messages: 查看帖子 + permission_add_messages: 发表帖子 + permission_edit_messages: 编辑帖子 + permission_edit_own_messages: 编辑自己的帖子 + permission_delete_messages: 删除帖子 + permission_delete_own_messages: 删除自己的帖子 + permission_export_wiki_pages: 导出 wiki 页面 + permission_manage_subtasks: 管理子任务 + permission_view_journals_for_messages: 查看留言 + permission_view_courses: 查看课程 + permission_new_course: 新建课程 + permission_configure_course: 配置课程 + permission_close_course: 关闭/重开课程 + permission_new_assignment: 新建任务 + permission_edit_assignment: 编辑任务 + permission_delete_assignment: 删除任务 + permission_new_placeholder: 新建占位 + permission_edit_placeholder: 编辑占位 + permission_delete_placeholder: 删除占位 + permission_commit_content: 提交内容 + permission_new_course_notify: 发布课程通知 + permission_edit_course_notify: 编辑课程通知 + permission_delete_course_notify: 删除课程通知 + permission_view_assignment: 查看任务 + permission_view_placeholder: 查看占位 + permission_view_course_messages: 查看留言 + permission_view_real_name: 查看真名 + permission_view_students: 查看成员 + permission_export_homeworks: 导出作业 + permission_quote_project: 引用项目 + permission_is_manager: 作为管理员 + permission_as_teacher: 作为教师 + permission_as_student: 作为学生 + permission_paret_in_homework: 加入作业 + permission_view_homework_attaches: 查看作业附件 + permission_view_course_journals_for_messages: 查看课程留言 + permission_select_course_modules: 选择课程模块 + permission_view_course_files: 查看课程资源 + permission_add_course: 新建课程 + permission_edit_course: 编辑课程 + permission_select_contest_modules: 选择竞赛模块 + permission_manage_contestnotifications: 管理竞赛通知 + + + + project_module_issue_tracking: 问题跟踪 + project_module_time_tracking: 时间跟踪 + project_module_news: 新闻 + project_module_documents: 文档 + project_module_files: 作品下载 + project_module_wiki: Wiki + project_module_repository: 版本库 + project_module_boards: 讨论区 + project_module_calendar: 日历 + project_module_gantt: 甘特图 + project_module_course: 课程 + project_module_dts: DTS测试工具 + label_module_share: DTS测试工具 + + label_user: 用户 + label_user_plural: 用户列表 + label_user_new: 新建用户 + label_user_anonymous: 匿名用户 + label_project: 项目 + label_activity_project: '项目: ' #added by bai + label_project_new: 新建项目 + label_project_new_description: '项目可以是软件开发项目,也可以是协作研究项目。' + label_project_plural: 项目列表 + label_project_score: 项目评分 + label_first_page_made: 首页定制 + label_project_first_page: 项目托管平台首页 + label_course_first_page: 课程实践平台首页 + label_contest_first_page: 竞赛实战平台首页 + label_x_projects: + zero: 无项目 + one: 1 个项目 + other: "%{count} 个项目" + label_project_all: 所有的项目 + label_project_latest: 最近的项目 + label_issue: 问题 + label_issue_new: 新建问题 + label_issue_plural: 缺陷 + label_issue_view_all: 查看所有问题 + label_issues_by: "按 %{value} 分组显示问题" + label_issue_added: 问题已添加 + label_issue_updated: 问题已更新 + label_document: 文档 + label_document_new: 新建文档 + label_document_plural: 文档 + label_document_added: 文档已添加 + label_document_public_info: (打钩为公开,不打钩则不公开,若不公开,仅项目成员可见该文档。) + label_role: 角色 + label_role_plural: 角色 + label_role_new: 新建角色 + label_role_and_permissions: 角色和权限 + label_member: 成员 + label_member_new: 添加成员 + label_member_plural: 成员 + label_tracker: 跟踪标签 + label_tracker_plural: 跟踪标签 + label_tracker_new: 新建跟踪标签 + label_workflow: 工作流程 + label_issue_status: 问题状态 + label_issue_status_plural: 问题状态 + label_issue_status_new: 新建问题状态 + label_issue_category: 问题类别 + label_issue_category_plural: 问题类别 + label_issue_category_new: 新建问题类别 + label_custom_field: 自定义属性 + label_custom_field_plural: 自定义属性 + label_custom_field_new: 新建自定义属性 + label_enumerations: 枚举值 + label_enumeration_new: 新建枚举值 + label_information: 信息 + label_information_plural: 信息 + label_please_login: 请登录 + label_register: 注册 + label_login_with_open_id_option: 或使用OpenID登录 + label_password_lost: 忘记密码 + label_home: 主页 + label_web_title: 浏览器标题 + label_site_title: 网站标题 + label_site_description: 网站简介 + label_site_image: 简介图片 + label_image_width: 图片宽度 + label_imgae_height: 图片高度 + image_width_error_message: 图片宽度只能是50至120之间的整数 + image_height_error_message: 图片高度只能是50至80之间的整数 + label_sort_type: 热门项目排序方式 + label_contest_notification_title: 竞赛通知标题 + label_contest_notification_content: 竞赛通知内容 + label_show_course: 显示课程 + label_show_contest: 显示竞赛 + #by young + label_requirement: 需求 + label_new_course: 课程列表 + label_course_practice: 课程实践 + label_course_all: 课程列表 + label_teacher_all: 所有教师 + label_project_deposit: 项目托管 + label_software_user: 软件创客 + label_contest_innovate: 创新竞赛 + label_requirement_enterprise: 软件众包 + label_requirement_enterprise_list: 众包列表 + label_new_homework: 作业 + label_new_contest: 竞赛 + label_requirement_focus: 关注需求 + label_developer: 用户 + label_account_developer: 开发者 + label_enterprise_into: 进入企业 + label_college_into: 进入高校 + label_investor: 投资人: + lable_contest_user: 竞赛发布人 + label_user_home: 创客空间 + label_user_location: 当前位置 + label_course_term: 开课学期 + label_theme: 主题 + label_logged_as_new: 当前用户 + button_register: 注册 + issue_list: 缺陷列表 + lastest_respond: 最新反馈 + label_respond_view_all: 其他120个反馈 + label_news_lastest: 最新动态 + label_version_display_settings: 显示设置 + label_versions_progress: 完成进度 + label_versions_description: 版本描述 + label_my_photo: 我的头像 + label_documents_sort: 排序设置: + label_activities_settings: 显示设置 + label_user_login_new: 登录 + label_user_login_tips: 您还没有登录,请登录后留言 + label_user_login_course_board: 您还没有登录,请登录后参与课程讨论 + label_user_login_project_board: 您还没有登录,请登录后参与项目讨论 + label_user_login_attending_contest: 您还没有登录,请登录后参赛 + label_user_login_score_and_comment: 您还没有登录,请登录后对作品进行打分评价 + label_user_login_notificationcomment: 您还没有登录,请登录后参加评论 + #end + #by huang # modified by bai + label_college: 高校进入 + label_enter_college: 进入高校 + #label_enterprise: 企业进入 + lable_enter_enterprise: 进入企业 + label_term: 开课学期 + label_spring: 春季学期 + label_summer: 夏季学期 + label_autumn: 秋季学期 + label_winter: 冬季学期 + label_followers: 关注 + label_teacher: 教师 + label_teacher_list: 教师列表 + label_student_list: 学生列表 + label_limit_time: 截止日期 + label_commit_homework: 提交作业 + label_course_homework: 对应课程 + label_course_doing: 进行中的课程 + label_course_done: 已结束的课程 + label_homework_response: 作业咨询 + label_bidding_homework: 提交作业 + label_add_homework: 添加作业 + label_edit_homework: 修改作业 + label_delete_homework: 删除作业 + label_new_homework: 创建作业 + + #end + label_my_page: 我的工作台 + label_my_account: 我的帐号 + label_my_message: 留言 + label_my_projects: 我的项目 + label_my_page_block: 我的工作台模块 + label_administration: 管理 + label_login: 登录 + label_login_prompt: 邮箱/昵称 + lable_user_name: 登录名 + label_logout: 退出 + label_help: 帮助 + label_reported_issues: 已报告的问题 + label_assigned_to_me_issues: 指派给我的问题 + label_last_login: 最后登录 + label_registered_on: 注册于 + label_activity: 动态 # modified by bai + label_overall_activity: 活动概览 + label_user_activity: "%{value} 的活动" + label_new: 新建 + label_new_user: 注册了一个新用户 # added by bai + label_logged_as: 登录为 + label_environment: 环境 + label_authentication: 认证 + label_auth_source: 认证模式 + label_auth_source_new: 新建认证模式 + label_auth_source_plural: 认证模式 + label_subproject_plural: 子项目 + label_subproject_new: 新建子项目 + label_and_its_subprojects: "%{value} 及其子项目" + label_min_max_length: 最小 - 最大 长度 + label_list: 列表 + label_date: 日期 + label_integer: 整数 + label_float: 浮点数 + label_boolean: 布尔值 + label_string: 字符串 + label_text: 文本 + label_attribute: 属性 + label_attribute_plural: 属性 + label_no_data: 没有任何数据可供显示 + label_change_status: 变更状态 + label_history: 历史记录 + label_attachment: 文件 + label_attachment_new: 新建文件 + label_file_upload: 上传资料 + label_attachment_delete: 删除文件 + label_attachment_plural: 文件 + label_file_added: 文件已添加 + label_report: 报表 + label_report_plural: 报表 + label_news: 新闻 + label_news_new: 添加新闻 + bale_news_notice: 添加通知 #huang + bale_edit_notice: 修改通知 + label_news_notice: 发布课程通知 + label_news_plural: 新闻 + label_news_latest: 最近的新闻 + label_news_view_all: 查看所有新闻 + label_news_added: 新闻已添加 + label_settings: 配置 + label_overview: 项目动态 + label_course_overview: "课程动态" + label_question_student: 作业交流 #bai + label_homework_commit: 提交作业 #huang + label_homework_info: 提交情况 #huang + label_course_news: 课程通知 + label_course_news_description: '课程必须是高校正式开设的课程,或是围绕特定主题定期发布课程资料的公共开放课程;
    如果您想创建一个协作研究空间,请您前往“我的项目”页面创建项目,谢谢!' + label_course_board: 讨论区 + label_version: 版本 + label_version_new: 新建版本 + label_version_plural: 版本 + label_close_versions: 关闭已完成的版本 + label_confirmation: 确认 + label_export_to: 导出 + label_read: 读取... + label_public_projects: 公开的项目 + label_open_issues: 打开 + label_open_issues_plural: 打开 + label_closed_issues: 已关闭 + label_closed_issues_plural: 已关闭 + label_x_open_issues_abbr_on_total: + zero: 0 打开 / %{total} + one: 1 打开 / %{total} + other: "%{count} 打开 / %{total}" + label_x_open_issues_abbr: + zero: 0 打开 + one: 1 打开 + other: "%{count} 打开" + label_x_closed_issues_abbr: + zero: 0 已关闭 + one: 1 已关闭 + other: "%{count} 已关闭" + label_total: 合计 + label_permissions: 权限 + label_current_status: 当前状态 + label_new_statuses_allowed: 允许的新状态 + label_all: 全部 + label_none: 无 + label_nobody: 无人 + label_next: 下一页 + label_previous: 上一页 + label_used_by: 使用中 + label_details: 详情 + label_add_note: 添加说明 + label_per_page: 每页 + label_calendar: 日历 + label_months_from: 个月以来 + label_gantt: 甘特图 + label_internal: 内部 + label_last_changes: "最近的 %{count} 次变更" + label_change_view_all: 查看所有变更 + label_personalize_page: 个性化定制本页 + label_comment: 评论 + label_comment_plural: 评论 + label_x_comments: + zero: 无评论 + one: 1 条评论 + other: "%{count} 条评论" + label_comment_add: 添加评论 + label_comment_added: 评论已添加 + label_comment_delete: 删除评论 + label_query: 自定义查询 + label_query_plural: 自定义查询 + label_query_new: 新建查询 + label_filter_add: 增加过滤器 + + label_filter_plural: 查询条件 + label_equals: 等于 + label_not_equals: 不等于 + label_in_less_than: 剩余天数小于 + label_in_more_than: 剩余天数大于 + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + label_in: 剩余天数 + label_today: 今天 + label_all_time: 全部时间 + label_yesterday: 昨天 + label_this_week: 本周 + label_last_week: 上周 + label_last_n_days: "最后 %{count} 天" + label_this_month: 本月 + label_last_month: 上月 + label_this_year: 今年 + label_date_range: 日期范围 + label_less_than_ago: 之前天数少于 + label_more_than_ago: 之前天数大于 + label_ago: 之前天数 + label_contains: 包含 + label_not_contains: 不包含 + label_day_plural: 天 + label_repository: 版本库 + label_course_repository: 代码库 + label_repository_plural: 版本库 + label_browse: 浏览 + label_branch: 分支 + label_tag: 标签 + label_revision: 修订 + label_revision_plural: 修订 + label_revision_id: 修订 %{value} + label_associated_revisions: 相关修订版本 + label_added: 已添加 + label_modified: 已修改 + label_copied: 已复制 + label_renamed: 已重命名 + label_deleted: 已删除 + label_latest_revision: 最近的修订版本 + label_latest_revision_plural: 最近的修订版本 + label_view_revisions: 查看修订 + label_view_all_revisions: 查看所有修订 + label_no_file_uploaded: 未上传文件 + label_max_size: 最大文件大小 + label_sort_highest: 置顶 + label_sort_higher: 上移 + label_sort_lower: 下移 + label_sort_lowest: 置底 + label_roadmap: 里程碑 #版本路线图 + label_roadmap_due_in: "截止日期到 %{value}" + label_roadmap_overdue: "%{value} 延期" + label_roadmap_no_issues: 该版本没有问题 + label_search: 搜索 + label_result_plural: 结果 + label_all_words: 所有单词 + label_wiki: Wiki + label_wiki_edit: Wiki 编辑 + label_wiki_edit_plural: Wiki 编辑记录 + label_wiki_page: Wiki 页面 + label_wiki_page_plural: Wiki 页面 + label_index_by_title: 按标题索引 + label_index_by_date: 按日期索引 + label_current_version: 当前版本 + label_preview: 预览 + label_feed_plural: Feeds + label_changes_details: 所有变更的详情 + label_issue_tracking: 问题跟踪 + label_spent_time: 耗时 + label_overall_spent_time: 总体耗时 + label_f_hour: "%{value} 小时" + label_f_hour_plural: "%{value} 小时" + label_time_tracking: 时间跟踪 + label_change_plural: 变更 + label_statistics: 统计 + label_contest: 竞赛 + label_commits_per_month: 每月提交次数 + label_commits_per_author: 每用户提交次数 + label_view_diff: 查看差别 + label_diff_inline: 直列 + label_diff_side_by_side: 并排 + label_options: 选项 + label_copy_workflow_from: 从以下选项复制工作流程 + label_permissions_report: 权限报表 + label_watched_issues: 跟踪的问题 + label_related_issues: 相关的问题 + label_applied_status: 应用后的状态 + label_loading: 载入中... + label_relation_new: 新建关联 + label_relation_delete: 删除关联 + label_relates_to: 关联到 + label_duplicates: 重复 + label_duplicated_by: 与其重复 + label_blocks: 阻挡 + label_blocked_by: 被阻挡 + label_precedes: 优先于 + label_follows: 跟随于 + label_end_to_start: 结束-开始 + label_end_to_end: 结束-结束 + label_start_to_start: 开始-开始 + label_start_to_end: 开始-结束 + label_stay_logged_in: 保持登录状态 + label_disabled: 禁用 + label_show_completed_versions: 显示已完成的版本 + label_me: 我 + label_board: 讨论区 + label_board_new: 新建讨论区 + label_board_plural: 讨论区 + label_board_locked: 锁定 + label_board_sticky: 置顶 + field_sticky: '' + field_locked: '' + field_lock: '' + label_topic_plural: 主题 + label_message_plural: 帖子 + label_message_last: 最新的帖子 + label_message_new: 发布新帖 + label_message_posted: 发帖成功 + label_reply_plural: 回复 + label_send_information: 给用户发送帐号信息 + label_year: 年 + label_month: 月 + label_week: 周 + label_date_from: 从 + label_date_to: 到 + label_language_based: 根据用户的语言 + label_sort_by: "根据 %{value} 排序" + label_send_test_email: 发送测试邮件 + label_feeds_access_key: RSS存取键 + label_missing_feeds_access_key: 缺少RSS存取键 + label_feeds_access_key_created_on: "RSS存取键是在 %{value} 之前建立的" + label_module_plural: 模块 + label_added_time_by: "由 %{author} 在 %{age} 之前添加" + label_added_time: "在 %{age} 之前添加" + label_updated_time: " 更新于 %{value} 之前" + label_updated_time_by: "由 %{author} 更新于 %{age} 之前" + label_jump_to_a_project: 选择一个项目... + label_file_plural: 文件 + label_changeset_plural: 变更 + label_default_columns: 默认列 + label_no_change_option: (不变) + label_bulk_edit_selected_issues: 批量修改选中的问题 + label_theme: 主题 + label_default: 默认 + label_search_titles_only: 仅在标题中搜索 + label_user_mail_option_all: "收取我的项目的所有通知" + #huang + label_file_new: 下载 + label_user_edit: "修改资料" + label_user_info: "个人简介" #huang 添加 + label_user_watcher: "关注" # huang添加的 + label_user_fans: "粉丝" + # modify by men + label_x_user_fans: + zero: 粉丝 + one: 粉丝 + other: 粉丝 + #end + label_x_join_in_contest: + zero: 参与者 + one: 参与者 + other: 参与者 + #end + label_user_commits: "代码提交" + label_user_watchered: "关注" # huang添加的 + label_user_newfeedback: "留言" ## huang添加的 + label_feedback_success: "留言成功" + label_feedback_fail: "留言失败" + label_user_login: "最后登录" + label_user_mail: "邮件地址" + label_user_joinin: "加入时间" + label_user_activities: 您没有关注该用户,请尝试重新输入! + label_user_activities_other: 该用户暂无任何动态! + label_project_overview: "概述" + label_project_tool: "项目工具集" + label_project_issues: "缺陷" + label_project_newother: "查看其他评论" + label_project_newshare: "分享了" + label_project_notice: "发布了通知:" + label_project_newadd: "添加了" + label_project_unadd: "暂无项目,赶快去创建吧!" + label_project_un: "该用户暂未参与任何项目!" + label_project_course_un: "该用户暂未加入任何课程!" + label_project_course_unadd: "你还未创建课程,赶快去创建吧!" + label_project_cousre_studentun: "你还未加入任何课程,赶快加入吧!" + #end by huang + label_user_mail_option_selected: "收取选中项目的所有通知..." + label_user_mail_option_none: "不收取任何通知" + label_user_mail_option_only_my_events: "只收取我跟踪或参与的项目的通知" + label_user_mail_option_only_assigned: "只收取分配给我的" + label_user_mail_option_only_owner: 只收取由我创建的 + label_user_mail_no_self_notified: "不要发送对我自己提交的修改的通知" + label_registration_activation_by_email: 通过邮件认证激活帐号 + label_registration_manual_activation: 手动激活帐号 + label_registration_automatic_activation: 自动激活帐号 + label_display_per_page: "每页显示:%{value}" + label_age: 提交时间 + label_change_properties: 修改属性 + label_general: 一般 + label_more: 更多>> + label_scm: 管理系统 + label_plugins: 插件 + label_ldap_authentication: LDAP 认证 + label_downloads_abbr: D/L + label_optional_description: 可选的描述 + label_add_another_file: 添加其它文件 + label_preferences: 首选项 + label_chronological_order: 按时间顺序 + label_reverse_chronological_order: 按时间顺序(倒序) + label_planning: 计划 + label_incoming_emails: 接收邮件 + label_generate_key: 生成一个key + label_issue_watchers: 跟踪者 + label_example: 示例 + label_display: 显示 + label_sort: 排序 + label_ascending: 升序 + label_descending: 降序 + label_date_from_to: 从 %{start} 到 %{end} + label_wiki_content_added: Wiki 页面已添加 + label_wiki_content_updated: Wiki 页面已更新 + label_group: 组 + label_group_plural: 组 + label_group_new: 新建组 + label_time_entry_plural: 耗时 + label_version_sharing_none: 不共享 + label_version_sharing_descendants: 与子项目共享 + label_version_sharing_hierarchy: 与项目继承层次共享 + label_version_sharing_tree: 与项目树共享 + label_version_sharing_system: 与所有项目共享 + label_update_issue_done_ratios: 更新问题的完成度 + label_copy_source: 源 + label_copy_target: 目标 + label_copy_same_as_target: 与目标一致 + label_display_used_statuses_only: 只显示被此跟踪标签使用的状态 + label_api_access_key: API访问键 + label_missing_api_access_key: 缺少API访问键 + label_api_access_key_created_on: API访问键是在 %{value} 之前建立的 + label_profile: 简介 + label_subtask_plural: 子任务 + label_project_copy_notifications: 复制项目时发送邮件通知 + label_principal_search: "搜索用户或组:" + label_user_search: "搜索用户:" + + button_login: 登录 + button_submit: 提交 + button_save: 保存 + button_check_all: 全选 + button_uncheck_all: 清除 + button_delete: 删除 + button_create: 提交 #bai + button_create_and_continue: 创建并继续 + button_test: 测试 + button_edit: 编辑 + button_edit_associated_wikipage: "编辑相关wiki页面: %{page_title}" + button_add: 新增 + button_change: 修改 + button_ok_and_submit: 确定并提交 + + button_apply: 查询 + button_clear: 取消查询 + button_clear_requirement: 取消 + button_lock: 锁定 + button_unlock: 解锁 + button_download: 下载 + button_list: 列表 + button_view: 查看 + button_move: 移动 + button_move_and_follow: 移动并转到新问题 + button_back: 返回 + button_cancel: 取消 + button_activate: 激活 + button_sort: 排序 + button_log_time: 登记工时 + button_rollback: 恢复到这个版本 + button_watch: 跟踪 + button_unwatch: 取消跟踪 + button_reply: 回复 + button_archive: 存档 + button_unarchive: 取消存档 + button_reset: 重置 + button_rename: 重命名/重定向 + button_change_password: 修改密码 + button_copy: 复制 + button_copy_and_follow: 复制并转到新问题 + button_annotate: 追溯 + button_update: 更新 + button_configure: 配置 + button_quote: 引用 + button_duplicate: 副本 + button_show: 显示 + + status_active: 活动的 + status_registered: 已注册 + status_locked: 已锁定 + + version_status_open: 打开 + version_status_locked: 锁定 + version_status_closed: 关闭 + + field_active: 活动 + + text_select_mail_notifications: 选择需要发送邮件通知的动作 + text_regexp_info: 例如:^[A-Z0-9]+$ + text_min_max_length_info: 0 表示没有限制 + text_project_destroy_confirmation: 您确信要删除这个项目以及所有相关的数据吗? + text_subprojects_destroy_warning: "以下子项目也将被同时删除:%{value}" + text_workflow_edit: 选择角色和跟踪标签来编辑工作流程 + text_are_you_sure: 您确定要删除吗? + text_are_you_sure_out: 你确定要退出该课程吗? + text_journal_changed: "%{label} 从 %{old} 变更为 %{new}" + text_journal_set_to: "%{label} 被设置为 %{value}" + text_journal_deleted: "%{label} 已删除 (%{old})" + text_journal_added: "%{label} %{value} 已添加" + text_tip_issue_begin_day: 今天开始的任务 + text_tip_issue_end_day: 今天结束的任务 + text_tip_issue_begin_end_day: 今天开始并结束的任务 + text_caracters_maximum: "最多 %{count} 个字符。" + text_caracters_minimum: "至少需要 %{count} 个字符。" + text_length_between: "长度必须在 %{min} 到 %{max} 个字符之间。" + text_command: 学生或其他成员申请加入课程时候需要使用该口令,该口令可以由老师在课堂上公布。 + text_contest_reward: 选择奖励后输入描述。 + text_tracker_no_workflow: 此跟踪标签未定义工作流程 + text_unallowed_characters: 非法字符 + text_comma_separated: 可以使用多个值(用逗号,分开)。 + text_line_separated: 可以使用多个值(每行一个值)。 + text_issues_ref_in_commit_messages: 在提交信息中引用和解决问题 + text_issue_added: "问题 %{id} 已由 %{author} 提交。" + text_issue_updated: "问题 %{id} 已由 %{author} 更新。" + text_wiki_destroy_confirmation: 您确定要删除这个 wiki 及其所有内容吗? + text_issue_category_destroy_question: "有一些问题(%{count} 个)属于此类别。您想进行哪种操作?" + text_issue_category_destroy_assignments: 删除问题的所属类别(问题变为无类别) + text_issue_category_reassign_to: 为问题选择其它类别 + text_user_mail_option: "对于没有选中的项目,您将只会收到您跟踪或参与的项目的通知(比如说,您是问题的报告者, 或被指派解决此问题)。" + text_no_configuration_data: "角色、跟踪标签、问题状态和工作流程还没有设置。\n强烈建议您先载入默认设置,然后在此基础上进行修改。" + text_load_default_configuration: 载入默认设置 + text_status_changed_by_changeset: "已应用到变更列表 %{value}." + text_time_logged_by_changeset: "已应用到修订版本 %{value}." + text_issues_destroy_confirmation: '您确定要删除选中的问题吗?' + text_select_project_modules: '请选择此项目可以使用的模块:' + text_default_administrator_account_changed: 默认的管理员帐号已改变 + text_file_repository_writable: 附件路径可写 + text_plugin_assets_writable: 插件的附件路径可写 + text_rmagick_available: RMagick 可用(可选的) + text_destroy_time_entries_question: 您要删除的问题已经上报了 %{hours} 小时的工作量。您想进行那种操作? + text_destroy_time_entries: 删除上报的工作量 + text_assign_time_entries_to_project: 将已上报的工作量提交到项目中 + text_reassign_time_entries: '将已上报的工作量指定到此问题:' + text_user_wrote: "%{value} 写到:" + text_enumeration_destroy_question: "%{count} 个对象被关联到了这个枚举值。" + text_enumeration_category_reassign_to: '将它们关联到新的枚举值:' + text_email_delivery_not_configured: "邮件参数尚未配置,因此邮件通知功能已被禁用。\n请在config/configuration.yml中配置您的SMTP服务器信息并重新启动以使其生效。" + text_repository_usernames_mapping: "选择或更新与版本库中的用户名对应的Trustie用户。\n版本库中与Trustie中的同名用户将被自动对应。" + text_diff_truncated: '... 差别内容超过了可显示的最大行数并已被截断' + text_custom_field_possible_values_info: '每项数值一行' + text_wiki_page_destroy_question: 此页面有 %{descendants} 个子页面和下级页面。您想进行那种操作? + text_wiki_page_nullify_children: 将子页面保留为根页面 + text_wiki_page_destroy_children: 删除子页面及其所有下级页面 + text_wiki_page_reassign_children: 将子页面的上级页面设置为 + text_own_membership_delete_confirmation: 你正在删除你现有的某些或全部权限,如果这样做了你可能将会再也无法编辑该项目了。你确定要继续吗? + text_zoom_in: 放大 + text_zoom_out: 缩小 + text_applied_project: "用户 %{id} 申请加入项目 %{project}" + text_issue_expire: "分配给您的任务%{issue}即将到期" + + default_role_manager: 管理人员 + default_role_developer: 开发人员 + default_role_reporter: 报告人员 + default_tracker_bug: 错误 + default_tracker_feature: 功能 + default_tracker_support: 支持 + default_issue_status_new: 新建 + default_issue_status_in_progress: 进行中 + default_issue_status_resolved: 已解决 + default_issue_status_feedback: 反馈 + default_issue_status_closed: 已关闭 + default_issue_status_rejected: 已拒绝 + default_doc_category_user: 用户文档 + default_doc_category_tech: 技术文档 + default_priority_low: 低 + default_priority_normal: 普通 + default_priority_high: 高 + default_priority_urgent: 紧急 + default_priority_immediate: 立刻 + default_activity_design: 设计 + default_activity_development: 开发 + + enumeration_issue_priorities: 问题优先级 + enumeration_doc_categories: 文档类别 + enumeration_activities: 活动(时间跟踪) + enumeration_system_activity: 系统活动 + + field_warn_on_leaving_unsaved: 当离开未保存内容的页面时,提示我 + text_warn_on_leaving_unsaved: 若离开当前页面,则该页面内未保存的内容将丢失。 + label_my_queries: 我的自定义查询 + text_journal_changed_no_detail: "%{label} 已更新。" + label_news_comment_added: 添加到新闻的评论 + button_expand_all: 展开所有 + button_collapse_all: 合拢所有 + label_additional_workflow_transitions_for_assignee: 当用户是问题的分配对象时所允许的问题状态转换 + label_additional_workflow_transitions_for_author: 当用户是问题作者时所允许的问题状态转换 + label_bulk_edit_selected_time_entries: 批量修改选定的时间条目 + text_time_entries_destroy_confirmation: 是否确定要删除选定的时间条目? + label_role_anonymous: Anonymous + label_role_non_member: Non member + label_issue_note_added: 问题备注已添加 + label_issue_status_updated: 问题状态更新 + label_issue_priority_updated: 问题优先级更新 + label_issues_visibility_own: 创建或分配给用户的问题 + field_issues_visibility: 问题可见 + label_issues_visibility_all: 全部问题 + permission_set_own_issues_private: 设置自己的问题为公开或私有 + field_is_private: 私有 + permission_set_issues_private: 设置问题为公开或私有 + label_issues_visibility_public: 全部非私有问题 + text_issues_destroy_descendants_confirmation: 此操作同时会删除 %{count} 个子任务。 + + field_commit_logs_encoding: 提交注释的编码 + field_scm_path_encoding: 路径编码 + text_scm_path_encoding_note: "默认: UTF-8" + field_path_to_repository: 库路径 + field_root_directory: 根目录 + field_cvs_module: CVS Module + field_cvsroot: CVSROOT + text_mercurial_repository_note: 本地库 (e.g. /hgrepo, c:\hgrepo) + text_scm_command: 命令 + text_scm_command_version: 版本 + label_git_report_last_commit: 报告最后一次文件/目录提交 + text_scm_config: 您可以在config/configuration.yml中配置您的SCM命令。 请在编辑后,重启Redmine应用。 + text_scm_command_not_available: Scm命令不可用。 请检查管理面板的配置。 + text_git_repository_note: 库中无内容。(e.g. /gitrepo, c:\gitrepo) + notice_issue_successful_create: 问题 %{id} 已创建。 + label_between: 介于 + setting_issue_group_assignment: 允许问题被分配给组 + label_diff: 查看差别 + description_query_sort_criteria_direction: 排序方式 + description_project_scope: 搜索范围 + description_filter: 过滤器 + description_user_mail_notification: 邮件通知设置 + description_date_from: 输入开始日期 + description_message_content: 信息内容 + description_available_columns: 备选列 + description_date_range_interval: 按开始日期和结束日期选择范围 + description_issue_category_reassign: 选择问题类别 + description_search: 搜索字段 + description_notes: 批注 + description_date_range_list: 从列表中选择范围 + description_choose_project: 项目 + description_date_to: 输入结束日期 + description_query_sort_criteria_attribute: 排序方式 + description_wiki_subpages_reassign: 选择父页面 + description_selected_columns: 已选列 + label_parent_revision: 父修订 + label_child_revision: 子修订 + error_scm_annotate_big_text_file: 输入文本内容超长,无法输入。 + setting_default_issue_start_date_to_creation_date: 使用当前日期作为新问题的开始日期 + button_edit_section: 编辑此区域 + setting_repositories_encodings: 附件和版本库编码 + description_all_columns: 所有列 + button_export: 导出 + label_export_options: "%{export_format} 导出选项" + error_attachment_too_big: 该文件无法上传。超过文件大小限制 (%{max_size}) + error_pic_type: "仅支持如下图片格式:" + notice_failed_to_save_time_entries: "无法保存下列所选取的 %{total} 个项目中的 %{count} 工时: %{ids}。" + label_x_issues: + zero: 0 问题 + one: 1 问题 + other: "%{count} 问题" + #add by tan + label_repository_new: 连接到已有的SVN版本库 + label_repository_no: 还没有版本库? + label_repository_new_repos: 新建版本库 + label_repository_name: 版本库名 + #end + field_repository_is_default: 主版本库 + label_copy_attachments: 复制附件 + label_item_position: "%{position}/%{count}" + label_completed_versions: 已完成的版本 + text_project_identifier_info: 仅小写字母(a-z)、数字、破折号(-)和下划线(_)可以使用。
    一旦保存,标识无法修改。 + field_multiple: 多重取值 + setting_commit_cross_project_ref: 允许引用/修复所有其他项目的问题 + text_issue_conflict_resolution_add_notes: 添加说明并取消我的其他变更处理。 + text_issue_conflict_resolution_overwrite: 直接套用我的变更 (先前的说明将被保留,但是某些变更内容可能会被覆盖) + notice_issue_update_conflict: 当您正在编辑这个问题的时候,它已经被其他人抢先一步更新过了。 + text_issue_conflict_resolution_cancel: 取消我所有的变更并重新刷新显示 %{link} 。 + permission_manage_related_issues: 相关问题管理 + field_auth_source_ldap_filter: LDAP 过滤器 + label_search_for_watchers: 通过查找方式添加跟踪者 + notice_account_deleted: 您的账号已被永久删除(账号已无法恢复)。 + setting_unsubscribe: 允许用户退订 + button_delete_my_account: 删除我的账号 + text_account_destroy_confirmation: |- + 确定继续处理? + 您的账号一旦删除,将无法再次激活使用。 + error_session_expired: 您的会话已过期。请重新登陆。 + text_session_expiration_settings: "警告: 更改这些设置将会使包括你在内的当前会话失效。" + setting_session_lifetime: 会话最大有效时间 + setting_session_timeout: 会话闲置超时 + label_session_expiration: 会话过期 + permission_close_project: 关闭/重开项目 + label_show_closed_projects: 查看已关闭的项目 + button_close: 关闭 + button_reopen: 重开 + project_status_active: 已激活 + project_status_closed: 已关闭 + project_status_archived: 已存档 + text_project_closed: 当前项目已被关闭。当前项目只读。 + notice_user_successful_create: 用户 %{id} 已创建。 + field_core_fields: 标准字段 + field_timeout: 超时 (秒) + setting_thumbnails_enabled: 显示附件略缩图 + setting_thumbnails_size: 略缩图尺寸 (像素) + label_status_transitions: 状态转换 + label_fields_permissions: 字段权限 + label_readonly: 只读 + label_required: 必填 + text_repository_identifier_info: 仅小写字母(a-z)、数字、破折号(-)和下划线(_)可以使用。
    一旦保存,标识无法修改。 + field_board_parent: 父论坛 + label_attribute_of_project: 项目 %{name} + label_attribute_of_author: 作者 %{name} + label_attribute_of_assigned_to: 分配给 %{name} + label_attribute_of_fixed_version: 目标版本 %{name} + label_copy_subtasks: 复制子任务 + label_copied_to: 复制到 + label_copied_from: 复制于 + label_any_issues_in_project: 项目内任意问题 + label_any_issues_not_in_project: 项目外任意问题 + field_private_notes: 私有注解 + permission_view_private_notes: 查看私有注解 + permission_set_notes_private: 设置为私有注解 + label_no_issues_in_project: 项目内无相关问题 + label_any: 全部 + label_last_n_weeks: 上 %{count} 周前 + setting_cross_project_subtasks: 支持跨项目子任务 + label_cross_project_descendants: 与子项目共享 + label_cross_project_tree: 与项目树共享 + label_cross_project_hierarchy: 与项目继承层次共享 + label_cross_project_system: 与所有项目共享 + button_hide: 隐藏 + setting_non_working_week_days: Non-working days + label_in_the_next_days: in the next + label_in_the_past_days: in the past + label_attribute_of_user: User's %{name} + text_turning_multiple_off: If you disable multiple values, multiple values will be + removed in order to preserve only one value per item. + label_attribute_of_issue: Issue's %{name} + permission_add_documents: Add documents + permission_edit_documents: Edit documents + permission_delete_documents: Delete documents + permission_add_documents: 新建文档 + permission_edit_documents: 编辑文档 + permission_delete_documents: 删除文档 + label_gantt_progress_line: 进度线 + setting_jsonp_enabled: Enable JSONP support + field_inherit_members: Inherit members + field_closed_on: 已关闭 + setting_default_projects_tracker_ids: Default trackers for new projects + label_total_time: 合计 + label_create_time: 创建时间 #Customer added!Added by nie + label_comment_time: 留言时间 + label_activity_time: 发布时间 + label_update_time: 更新时间 + label_current_contributors: 位当前贡献者 + label_commit_limit: 作业提交时间已过! + label_commit_ar: 作业提交截止时间快到了! + lable_has_commit_homework: 您已提交过作业 + #modify by men + label_x_current_contributors: + zero: 位当前贡献者 + one: 位当前贡献者 + other: 位当前贡献者 + #end + label_lines_of_code: 行代码 + label_since_last_commits: 距离上次提交时间 + label_users_on_trustie: 用户 + label_front: 第一页 + label_commit_on: 次提交 + label_uncommit_homework: 暂无学生提交作业! + #modify by men + label_x_commit_on: + zero: 次提交 + one: 次提交 + other: 次提交 + #end + label_follow_people: 个关注者 + #modify by men + label_x_follow_people: + zero: 个关注者 + one: 个关注者 + other: 个关注者 + #end + label_member_since: 加入 + label_contribute_to: 参与了 %{project_count} 个项目: + #modify by men + label_x_contribute_to: + zero: 参与了 %{count} 个项目: + one: 参与了 %{count} 个项目: + other: 参与了 %{count} 个项目: + #end + label_total_commit: 共%{total_commit}次提交 + #modify by men + label_x_total_commit: + zero: 共 %{count} 次提交 + one: 共 %{count} 次提交 + other: 共 %{count} 次提交 + #end + label_upload_profile: 上传头像 + label_type_as: 类型为 + label_status_as: 状态为 + label_priority_as: 优先级为 + label_member_list: 成员列表 + label_author_name: 由%{author_name}发表了 + label_comments_count: (%{count}条评论) + label_post_on: 发表了 + label_find_all_comments: 查看所有评论 + label_updated_time_on: " 更新于 %{value} " + label_call_list: 需求列表 + #added by liuping + button_unfollow: 取消关注 + button_follow: 关注 + label_followers: 关注 + label_responses: 留言 + label_delete_confirm: 确认删除? + label_more_tags: 更多 + label_tags_bid: 需求名称 + label_tags_course_name: 课程名称 + label_tags_bid_description: 需求描述 + label_tags_issue_description: 问题描述 + label_tags_all_objects: 所有 + label_apply_project: 申请加入 + label_exit_project: 退出项目 + label_apply_project_waiting: 已处理申请,请等待管理员审核 + label_unapply_project: 取消申请 + + #fq + button_leave_meassge: 留言 + button_clear_meassge: 清除留言 + label_leave_message_to: 给用户 %{name}留言 + label_leave_message: 留言内容 + label_message: 留言板 + field_add: 添加于 %{time} 之前 + button_more: 更多 + label_user_response: 用户留言 + label_student_response: 作业答疑 # modified by bai + label_bidding_project: 参与项目 + label_homework_project: 已提交作业 #huang + button_bidding: 我要参加 + field_enterprise: '企业:' + + no_attachmens_allowed: 提交作业不能为空 + + button_bidding_homework: 参加竞标 #huang + field_homework_type: 提交形式 #bai + label_homework_respond: 作业情况 + + label_bid_me: 我要应标 + label_new_call: 发布需求 + + label_newtype_contest: 发布竞赛 + + label_user_information: "与我相关" + label_bid_succeed: "需求发布成功" + label_wrong_budget: 错误的金额格式 + label_wrong_date: 时间格式错误,请输入正确的时间 yyyy-mm-dd + label_bidding_succeed: 应标成功 + label_bidding_contest_succeed: 竞赛提交成功 #added by bai + label_bidding_homework_succeed: 作业提交成功 #added by bai + label_bidding_homework_failed: 作业提交失败 #added by bai + label_bidding_homework_committed: 你已经提交过作业,不能重复提交! + label_bidding_fail: 应标失败,该项目已经应标 + label_bidding_homework_fail: 作业提交失败,该作业已经被提交! + + label_requirement_list: 需求列表 + + label_x_biding_project: #modify by men + zero: 应标项目 + one: 应标项目 + other: 应标项目 + #end + label_x_homework_project: #modify by huang + zero: 已提交的作业 + one: 已提交的作业 + other: 已提交的作业 + #end + label_x_responses: #modify by men + zero: 留言 + one: 留言 + other: 留言 + #end + label_x_responses: #modify by huang + zero: 学生提问 + one: 学生提问 + other: 学生提问 + #end + label_x_bids_responses: #modify by huang + zero: 用户反馈 + one: 用户反馈 + other: 用户反馈 + #end + label_x_followers: #modify by men + zero: 关注 + one: 关注 + other: 关注 + #end + label_price: 悬赏: + label_RMB_sign: ¥ + label_investment_budget: 投资预算: + label_investment_time_limit: 投资时限: + label_my_respond: 如有问题请在这里留下您的宝贵意见^-^ + label_my_question: 请在此处留下您的意见或者问题~ # modified by bai + label_respond_requirement: 对需求进行了反馈 + label_contest_requirement: 对竞赛进行了反馈 + label_question_requirement: 对作业提出了问题! + label_deadline: 截止日期yyyy-mm-dd + label_requirement_name: 在此输入需求名称 + label_contest_name: 在此输入竞赛名称 + label_requirement_description: 内容:对你的需求进行描述 + label_contest_description: 内容:对你的竞赛进行描述 + label_requirement_bargain_money: 输入具体奖励方式(如金钱、奖项、学分) + button_upload_photo: 上传图片 + button_delete_file: 删除 + label_leave_me_message: 给我留言了 + label_leave_others_message: 给他留言了 + label_leave_a_message: 给他(她)留言 + label_leave_your_message: 给你留言了 + label_new_activity: 有了最新动态 + label_create_project: 参与了 + label_praise: 赞 + label_cancel_praise: 取消赞 + label_bid_reason: 请输入参与理由 + label_bid_reason_homework: 请输入作业提交说明! + label_create_new_projects: 创建项目 + label_call_for_bids: 发布需求 + label_create_course: 创建课程 + label_news: 新闻 + label_milestone: 里程碑 + label_features: 特性 + label_has_praisers: 赞(%{count}) + label_has_watchers: 关注(%{count}) + label_has_fans: 粉丝(%{count}) + label_coursefile_sharingarea: 课程文件共享专区 + #modify by men + label_x_has_fans: + zero: 粉丝(%{count}) + one: 粉丝(%{count}) + other: 粉丝(%{count}) + #end + label_me: 我 + label_my: 我 + label_i: 我 + label_you: 你 + label_join_bidding: 参与了应标 + label_jion_bidding_homework: 已提交! + label_bidding_user: 应标人: + label_bidding_user_homework: 作业提交者 + label_bidding_user_studentcode: 学号 + label_bidding_reason: 应标宣言: + label_bidding_reason_homewrok: 作业提交说明 + label_username: 用户名: + label_password: 密码: + label_about_requirement: 对需求: + label_about_issue: 对问题: + label_quote_my_words: 中对我的话进行了引用 + label_have_respond: 进行了反馈 + label_in_issues: 在问题: + label_in_bids: 在需求: + label_in_users: 在用户: + label_have_respond: 进行了反馈 + label_create_new_projects_description: 创建项目,让我们开启一次神奇的协同创作和开发之旅! + label_call_for_bids_description: 发布需求,征集解决方案,体验一呼百应的兴奋感觉! + label_news_description: 实时了解项目的最新动态,掌握最新项目咨询! + label_milestone_description: 在这里您可以看见任何一个版本的工程! + label_have_respond: 进行了反馈 + label_welcome: 欢迎 + label_join: 加入Trustie! + label_repository_path: 库路径 + label_board_description: 七嘴八舌,汇聚众人智慧,为您排忧解难! + label_create_course_description: 课程小社区,创建新课程,让我们共同分享多到想不到的公共资源! + label_welcome_page_to: 参与了 %{project_count} 个项目! + label_repository_path_not_null: 库路径 不能为空字符 + label_password_not_null: 密码不能设置为空。 + label_exist_repository_path: 定义已有版本库URL路径,定义格式file://, http://, https://, svn:// + label_project_no_activity: 该项目暂无动态! + label_course_homework_un: 暂未发布任何作业 + label_follow_no_requirement: 暂未关注任何需求! + label_no_user_respond_you: 暂无任何用户对您进行反馈! + label_tags_issue: 问题名称: + label_tags_project_name: 项目名称: + label_tags_project_description: 项目描述: + label_tags_user_mail: 用户邮箱: + label_tags_user_name: 用户名: + label_tags_numbers: Tag统计: + label_max_number: 昵称是在网站中显示的您的公开标识,至多25个字符。 + label_mail_attention: qq邮箱可能收不到此邮件,其他邮箱如果没有收到可能在垃圾邮件中,其中gmail与教育网邮箱的激活邮件有时比较慢,请耐心等待。 + label_your_course: 您的课程《 + label_have_message : 》有新的留言 + label_all_revisions: 所有版本: + label_upassword_info: 该密码在项目组内可共享 + label_how_commit_code: 查看如何提交代码: + label_how_commit_code_chinese: 中文 +# modified by bai + label_welcome_leave_message: 您好!系统目前正在公测,有意见和建议请 + label_welcome_click_me: 点击我 + label_issue_praise: 好问题,顶! + label_issue_tread: 烂问题,踩! + label_issue_praise_over: 我刚才顶过了~ + label_issue_tread_over: 我刚才踩过了~ + label_issue_not_praise_over: 不能顶自己~ + label_issue_not_treed_over: 不能踩自己~ + label_issues_score_not_enough: 积分不够,不能踩别人~ + #end + label_goto: 前往>> + label_issue_appraise_over: 只能评价一次哦! + label_welcome_my_respond: 请在此留下你的意见和建议! + label_no_current_fans: 该用户暂无粉丝 + label_no_current_watchers: 该用户暂未关注其他用户 + label_project_tool_response: 用户反馈 + label_course_feedback: 留言 + label_tags_search_result: 搜索结果 + label_active_call: 需求 + label_active_homework: 作业 + label_tags_call: 需求 + label_user_extensions: 其他信息 + label_boy: 男 + label_girl: 女 + field_gender: 性别 + field_birthday: 生日 + field_brief_introduction: 个人简介 + field_location: 现住址 + field_occupation: 工作单位 + field_work_experience: 工作经验(年) + field_zip_code: 邮编 + label_reward: 奖励: + label_credit: 学分: + label_choose_reward: 选择奖励方式 + label_money: 货币 + label_reward_1: 其他 + label_bids_credit: 学分 + label_bids_credit_number: 分 + field_budget: 奖励 + field_deadline: 截止日期 + field_is_evaluation: 是否启动互评 + field_proportion: 教师评分比例 + label_tags_selected: 已选标签 + label_tags_related: 相关标签 + button_project_tags_add: 增加 + label_issue_query_condition: 查询条件 + label_issue_query: 查询 + label_issue_cancel_query: 取消查询 + field_reward_type: 奖励类型 + label_tags_no: 暂无标签! + label_course_description_no: 你还未对该课程添加描述! + label_bid_publish: 发布了 + label_bid_project: 项目 + label_project_no_follow: 该项目暂未被关注! + label_no_bid_project: 暂无参与项目 + label_no_course_project: 暂无已提交的作业! + label_bids_reward_method: 奖励方式 : + label_bids_reward_what: 输入奖励内容 + label_call_bonus: 奖金 + label_bids_form_new_description: 企业可以在此发布一个软件开发任务或者一个技术方案需求:(1)获得价廉物美的解决方案;(2)发现对此项任务有贡献的大学生,获得可以招聘的人才。 + label_bids_form_contest_new_description: 企业或者高校可以在此发布一个竞赛。 + label_homeworks_form_new_description: 发布一个作业,作业提交方式可以是附件或者项目形式。 + label_fork_form_new_description: 该需求将作为某课程的作业被发布,作业提交方式可以使附件或者项目形式,在作业类型里面设置。 + label_bids_new_money: 输入奖励金额,如 500,2.5等 + label_bids_new_credit: 输入该作业对应课程的学分,如 3,2.5等 + label_bids_new_content: 输入奖励内容,如 奖项,物品等 + label_project_sort: 排序方式 + label_sort_by_time: 按时间排序 + label_sort_by_active: 按活跃度排序 + label_sort_by_influence: 按影响力排序 + label_bids_published: 发布于 + label_bids_published_ago: 之前 + label_welcome_trustie: Trustie + label_welcome_trustie_project: 在线项目托管平台 + label_welcome_trustie_course: 在线课程实践平台 + label_welcome_trustie_contest: 在线竞赛实战平台 + label_welcome_trustie_project_description: 面向中国大学生与软件从业者,提供社交化的项目管理、代码托管、资源共享、合作交流。 + label_welcome_trustie_course_description: 面向中国高校教师与大学生,提供社交化的课程管理、资源共享、合作实验、协同研究。 + label_welcome_trustie_contest_description: 面向中国大学生与编程爱好者,提供社交化的竞赛管理、应用管理、代码托管、合作交流。 + label_user_project: 项目 + label_user_course: 课程 + label_user_homework: 作业 + label_bid_respond_quote: 回复 + label_bid_if_agreement: 如果喜欢我,请点击我 + label_bid_respond_delete: 删除 + label_newfeedback_message: 留言 + label_newfeedback_quote: 回复 + label_newfeedback_delete: 删除 + label_user_all_activity: 所有动态 + label_user_activity_myself: 我的动态 # modified by bai + label_my_honework_no_homework: 暂无任何作业! + label_user_all_respond: 所有反馈 + label_layouts_feedback: 留言 + label_have_feedback: 有了 + label_of_feedback: 的 + label_welcome_participate: 参与了 + label_cant_download: 未开启互评功能作业不允许下载 + lable_close_evaluation: 该作业未开启互评功能 + lable_has_evaluation: 您已进行过评价 + #modify by men + label_x_welcome_participate: + zero: 参与了 + one: 参与了 + other: 参与了 + #end + label_welcome_participate_project: 个项目 + label_projects_feedback: 对项目进行了反馈 + label_projects_feedback_respond: 回复 + label_projects_feedback_respond_success: 回复成功 + button_projects_feedback_respond: 回复 + label_projects_feedback_respond_content: 请输入回复内容 + label_user_create_project: 创建了 + label_user_create_project_homework: 创建了作业 +#added by bai + label_identity: 身份 + label_teacher: 教师 + label_teacher_homework: 教师姓名 + label_student: 学生 + label_TA: 助教 + label_other: 其他 + label_enterprise: 企业 + label_developer: 用户 + label_gender: 性别 + label_gender_male: 男 + label_gender_female: 女 + label_location: 地区 + label_brief_introduction: 个性签名 + label_my_brief_introduction: 今天的心情如何?留下你的脚印吧~ + label_time: 年度 + label_main_teacher: 主讲教师 + label_main_term: 课程学期 + label_teacher_work_unit: 教师单位 + label_course_time: 课程年度 + label_i_new_activity: 有了新活动在 + label_choose_course: 选择课程 + button_submit_homework: 提交作业 + label_my_course: 我的课程 + button_submit_bid: 参与竞标 + label_requirement_from: 需求来源 + label_course_view: 作业界面 + label_course_return: "返 回 课 程" + label_setup_time: 开课日期 + label_endup_time: 结课日期 + label_class_period: 学时总数 + label_class_hour: 学时 + label_user_score: 个人综合得分 + label_user_score_of_topic: 帖子得分 + label_user_score_of_project: 项目得分 + label_user_score_of_activity: 活跃度得分 + label_user_score_of_influence: 影响力得分 + label_user_score_of_collaboration: 协同得分 + label_user_score_of_skill: 技术得分 + label_user_score_of_active: 项目贡献得分 + label_question_top: 问题被顶次数 + label_question_down: 问题被踩次数 + label_answer_top: 回答被顶次数 + label_answer_down: 回答被踩次数 + label_comments_number: 评论的数量 + label_news_number: 新闻的数量 + label_wiki_number: wiki的数量 + label_message_number: 留言的数量 + label_activity_number: 个人动态数量 + label_issue_message_number: 对issue的留言数量 + label_code_submit_number: 代码提交次数 + label_topic_number: 讨论区发言数量 + label_projects_score: 项目综合得分 + label_issue_score: issue得分 + label_news_score: 新闻得分 + label_file_score: 文档得分 + label_code_submit_score: 代码提交得分 + label_topic_score: 讨论区得分 + label_issue_number: issue的数量 + label_issue_journal_number: issue的留言数量 + label_new_number: 新闻的数量 + label_file_number: 文档的数量 + label_code_submit_number: 代码提交数量 + label_topic_number: 讨论区帖子数量 + label_files_filter: 资源过滤: + + label_course_contribute_to: 参与了 %{project_count} 个项目: + label_x_course_contribute_to: + zero: "参与了 %{count} 个课程:" + one: "参与了 %{count} 个课程:" + other: "参与了 %{count} 个课程:" + + label_join_contest: 加入竞赛 + label_exit_contest: 退出竞赛 + label_participator: 参与者 + label_contest_modify_settings: 配置竞赛 + label_no_current_participate: 该竞赛暂无参与者 + + #end + + label_joined_course: 参加的课程 + label_created_course: 创建的课程 + label_course: 课程 + label_course_new: 新建课程 + label_course_join_student: 加入课程 + label_public_info: (打钩为公开,不打钩则不公开,若不公开,仅项目成员可见该项目。) + label_course_public_info: (打钩为公开,不打钩则不公开,若不公开,仅课程成员可见该课程。) + label_course_view_student: 查看其他课程 + label_course_student: 学生 + label_homework: 课程作业 + label_course_file: 资源库 #资料共享 + label_stores_index: 资源搜索 + label_course_new_homework: 新建作业 + label_course_homework_list: 作业列表 + label_course_homework_new: 发布作业 + label_fork_homework_new: 选为作业 + #wang + label_contest_userresponse: 用户留言 + label_contest_joincontest: 参加竞赛 + label_contest_notification: 竞赛通知 + #end + + label_x_course_data: + zero: 资料 + one: 资料 + other: 资料 + label_x_base_courses_student: + zero: 学生 + one: 学生 + other: 学生 + label_x_base_courses_teacher: + zero: 教师 + one: 教师 + other: 教师 + + label_homework_statistics: 作业统计 + label_technical_title: 职称 + + # added by william 无english版本 + label_bidding_results: 应标结果 + label_bid_end: 该需求已经结束! + label_special_reward: 特等奖 + label_first_reward: 一等奖 + label_second_reward: 二等奖 + label_third_reward: 三等奖 + label_fourth_reward: 四等奖 + label_fifth_reward: 五等奖 + label_excellence_reward: 优秀奖 + label_comfort_reward: 入围奖 + label_course_settings: 课程设置 + +#added by nie + label_x_task: + zero: 份作业 + one: 份作业 + other: 份作业 + label_x_member: + zero: 个成员 + one: 个成员 + other: 个成员 + label_x_data: + zero: 份资料 + one: 份资料 + other: 份资料 + + + + #add by men + label_technicl_title_professor: 教授 + label_technicl_title_associate_professor: 副教授 + label_technicl_title_lecturer: 讲师 + label_technicl_title_teaching_assistant: 助教 + label_account_identity_teacher: 教师 + label_account_identity_student: 学生 + label_account_identity_developer: 开发者 + label_account_identity_enterprise: 企业 + label_account_identity_choose: --请选择身份-- + label_teaching_course: 我执教的课程 + label_release_homework: 我发布的作业 + label_enterprise_into: 进入企业 + label_homework_source: 作业来源 + label_course_college: 大学 + label_my_create_honework_no_homework: 暂无任何作业 + label_my_homework_no_homework: 暂无任何作业 + label_bid_show_course_name: 课程名称 + label_bid_show_teacher_name: 教师 + label_bid_contest_show_course_name: 课程名称 + label_bid_contest_show_teacher_name: 教师 + label_contest_list: 竞赛列表 + + label_x_base_courses_member: + zero: 成员 + one: 成员 + other: 成员 + + label_bids_task_list: 作业列表 + label_join_course: 加入课程 + label_exit_course: 退出课程 + label_new_join: 加入 + label_new_course_password: 课程密码 + label_new_course_school: 开课学校 + label_new_course_description: 课程描述 + label_new_join_order: 请输入课程密码 + label_task_submit_form_accessory: 作业最终以附件形式提交 + label_task_submit_form_project: 作业最终以项目形式提交 + lable_start_mutual_evaluation: 启动互评 + lable_close_mutual_evaluation: 关闭互评 + label_has_been: 已经被 + label_course_userd_by: 个课程引用 + no_file_dowmload: 该作业没有任何的附件可以下载 + + role_of_course: 课程角色 + label_student: 学生 + + #added by Wen + label_school_all: 中国高校 + label_school_not_fount: 没有符合的高校信息 + + + label_project_grade: 项目得分 + label_user_grade: 个人得分 + label_user_for_project_grade: 个人得分 + label_system_grade: 系统评分 + label_teacher: 老师 + label_ta: 助教 + label_in_course: 在课程中 + label_assign_homework: 中布置了作业 + label_noawards: 未评奖 + + label_course_modify_settings: 配置课程 + label_homework_prompt: 贴心小提示: + label_homework_prompt_content: 亲,在这里我们的作业将以项目的形式提交,如果小伙伴们还没有创建项目,请先创建一个项目。项目创建成功后,就可以 + label_create_homework: 布置了作业: + label_watch_project: 关注了 + label_watch_no_projects: 没有关注任何项目 + label_has_watched_project: 关注的项目 + label_project_take: 参与的项目 + label_peoject_take_in: 加入了项目: + label_search_by_user: 按用户搜索 + label_update_homework_succeed: 作业更新成功 + label_task_plural: 作业 + label_search_by_student_id: 按学号过滤 + label_institution_name: 单位名称 + label_duration_time: 授课时间 + label_course_brief_introduction: 课程简介 + field_teacher_name: 教 师 + + field_hidden_repo: 隐藏代码库 + field_dts_test: DTS测试工具 + + label_newbie_faq: '新手指引 & 问答' + label_hot_project: '热门项目' + label_borad_project: 项目讨论区 + label_borad_course: 课程讨论区 + label_memo_create_succ: 发布成功 + label_memo_create_fail: 发布失败 + label_forum_create_succ: 贴吧新建成功 + label_forum_create_fail: 贴吧新建失败 + label_forum_update_succ: 贴吧更新成功 + label_forum_update_fail: 贴吧更新失败 + label_first_page_create_fail: 首页定制失败 + label_forum_edit: 编辑讨论区 + label_memo_create: 发布 + label_memo_new: 新建主题 + label_memo_edit: 修改主题label_board_new + label_memo_new_from_forum: 发布帖子 + label_forum: 公共贴吧 + label_forum_new: 新建贴吧 + label_tags_forum_description: 贴吧描述 + label_tags_forum: 贴吧名称 + label_project_module_forums: 公共贴吧 + label_memo_locked: 帖子已被锁定 + label_downloads_list: 进入附件列表 + label_joined_contest: 参与了竞赛 + label_contest_user: 参赛人: + label_contest_reason: 参赛宣言: + label_notification: 通知 + label_sumbit_empty: 搜索内容不能为空 + label_reply_empty: 回复内容不能为空 + no_use: 没有帮助 + cancel_no_use: 撤销没有帮助 + cancel_apply: 取消申请 + apply_master: 申请成为版主 + you_are_master: 您是该项目的版主 + + #add by linchun (竞赛相关) + label_upload_files: 上传文件 + label_upload_softwarepackage: 上传软件包 + label_upload_cuttingphoto: 上传截图 + label_contests_reward_method: 奖励方式 + label_system_platform: 系统平台 + label_nextstep: 下一步 + label_participate: 参赛者 + label_setting: 配置 + label_contest_project: 参赛项目 + label_contest_softapplication: 参赛应用 + label_contest_response: 用户反馈 + label_contest_watchers: 关注人数 + label_contest_application: 参赛应用 + label_contest_work: 参赛作品 + button_contesting_as_project: 我要参赛(新建项目) + button_contesting_as_application: 我要参赛(发布应用) + label_release_softapplication: 发布应用 + label_upload_softapplication_packets: 上传应用软件包 + label_upload_softapplication_photo: 上传产品截图 + label_upload_softapplication_packets_mustpacketed: 作品相关代码及相关说明文件必须打包后以压缩包的形式上传,便于上传和下载 ; + label_upload_softapplication_photo_condition: 作品截图最好0~4张(多余图片不会在展示页面上显示);格式为gif/jpg/png/bmp等, 每张小于5M + label_updated_caution: 注意:若编辑参赛作品,则之前上传的软件包和截图都将被删除,请重新上传! + label_softapplication_name: 应用名称 + label_work_name: 作品名称 + label_softapplication_description: 应用简介 + label_work_description: 作品简介 + label_work_scores: 作品得分 + label_work_rating: 评分 + label_work_tishi: 您可以重新打分,打分结果以最后一次打分为主! + label_work_scores_proportion: 得分比例 + label_softapplication_type: 应用分类 + label_work_type: 作品分类 + label_work_photo: 作品截图 + label_work_comment: 作品评论 + label_softapplication_version_available: 适配版本 + label_running_platform: 运行平台 + label_softapplication_developer: 上传人员 + label_softapplication_developers: 开发人员 + label_work_deposit_project_url: 托管项目网址 + label_work_deposit_project: 托管项目 + label_softapplication_name_condition: 25个汉字以内(50个字符) + label_softapplication_description_condition: 125个汉字以内 + label_user_login_softapplication_board: 您还没有登录,请登录后参与应用评价。 + label_contest_description_no: 暂无描述。 + label_no_contest_softapplication: 暂无参赛应用 + label_button_ok: 确定 + label_tags_contest: 竞赛标签 + label_tags_contest: 竞赛名称 + label_final_scores: 最终得分 + label_rating_person_amount: 打分总人数 + label_tags_contest_description: 竞赛描述 + label_release_add_contest_succeed: 该应用发布并添加成功. + label_add_contest_succeed_fail: 添加失败,该应用已参赛. + label_no_ftapplication: 暂无应用 + label_edit_softapplication: 修改应用 + label_edit_work: 修改作品 + label_contest_delete: 删除竞赛 + label_softapplication_list: 应用列表 + label_contest_work_list: 参赛作品列表 + label_attending_contest: 我要参赛 + label_contest_notification: 竞赛通知 + label_company_name: 企业名 + + label_coursefile_sharingarea: 课程资源共享区 + label_sort_by_activity: 按动态数排序 + label_homework: 课程实践 + label_x_activity: + zero: 个动态 + one: 个动态 + other: 个动态 + label_school_all: 中国高校 + label_upload_files: 上传资源 + label_relation_files: 关联已有资源 + label_contest_settings: 配置竞赛 + label_contest_delete: 删除竞赛 + label_noawards_current: 暂未评奖 + + label_softapplication: 应用软件 + label_attending_contest: 参加竞赛 + label_new_attendingcontest_work: 新建参赛作品 + label_workname_lengthlimit: 25个汉字以内 + label_workdescription_lengthlimit: 125个汉字以内 + label_please_input_password: 请输入竞赛密码 + label_please_select_project: 请选择项目 + label_upload_softworkpacket_photo: 上传作品软件包和作品截图 + label_reward: 评奖 + label_please_select_contestingsoftapplication: 请选择参赛应用 + label_attendingcontest_time: 参赛时间 + label_attendingcontest_spoksman: 参赛代表 + label_wellmeaning_intimation_contentone: 温馨提示:如果您准备参加竞赛,请点击下面的"新建参赛作品"! + label_wellmeaning_intimation_contenttwo: 若您已完成开发,且只希望发布您的作品,“托管项目”一项可以不选; + label_wellmeaning_intimation_contentthree: 若您希望托管竞赛数据和代码以及保留开发和提交代码的轨迹,请从“托管项目”中选择一项您已创建好的项目作为该参赛作品的托管项目,若您还没有创建项目,请点击右边的“创建项目”,然后回到本页再选择。 + + notice_account_updated: 帐号更新成功 + notice_attendingcontest_work_successfully_created: 恭喜您,参赛作品创建成功! + notice_softapplication_was_successfully_updated: 恭喜您,参赛作品更新成功! + notice_attendingcontest_work_failed_created: 参赛产品创建失败 + + label_attendingcontestwork_belongs_contest: 所属竞赛 + label_attendingcontestwork_belongs_type: 所属类别 + label_attendingcontestwork_release_person: 发布人员 + label_attendingcontestwork_adaptive_system: 系统支持 + label_attendingcontestwork_download: 作品下载 + label_attendingcontestwork_developers: 开发人员 + label_attendingcontestwork_average_scores: 平均评分 + label_attendingcontestwork_release_time: 发布时间 + label_attendingcontestwork_deposit_project: 托管项目 + label_attendingcontestwork_sorting_intimation: 您可以重新打分,打分结果以最后一次打分为主! + lable_not_receive_mail: 点此设置接收本站邮件偏好! + label_contest_notification: 竞赛通知 + label_contest_innovate_community: 创新竞赛社区 + #english site translation + label_current_hot_contest: 最新热门竞赛 + label_current_attendingcontest_work: 最新参赛作品 + label_issue_feedback_activities: 问题和反馈动态 + label_more_information: 更多... + label_my_question: 我要提问 + label_my_feedback: 我要反馈 + label_release_time: 发布时间 + label_question_sponsor: 楼主 + label_final_reply: 最后回复 + label_reply: 回复 + label_weixin: 微信扫码 + label_search_intimation: 请输入要搜索的关键字 + label_work_quantity: 个作品 + label_projects_management_platform: 项目托管平台 + label_courses_management_platform: 课程实践平台 + label_contests_management_platform: 竞赛托管平台 + + label_organizers: 主办单位 + label_organizers_information: 国防科学技术大学并行与分布处理国家重点实验室 + label_organizers_information_institute: 计算机科学与技术系 + label_copyright: 版权 + label_contact_us: 联系我们 + label_record: 湘ICP备09019772 + label_check_comment: 查看通知评论 + label_notification: 通知公告 + #end + + #end + + # ajax异步验证 + modal_valid_passing: 可以使用 + label_bug: 漏洞 + + label_school_no_course: 该学校未开设任何课程,您可以查看其他学校课程 + label_school_less_course: 该学校开设课程较少,您可以查看其他学校课程 + + label_file_not_found: 对不起,该文件现在不能下载 + label_goto_homepage: 返回主页 + label_trustie_team: Trustie开发团队 + + label_memos_max_length: 帖子内容最大长度为65535个字符 + label_forums_max_length: 贴吧描述最大长度为65535个字符 + label_unknow_type: 未知类型 + label_score_less_than_zero: 得分小于0,修正为0 + review_assignments: 评审任务 + label_private: 私有 + label_my_school: 我的学校 + label_all_schol: 全部学校 + label_select_province: 请选择省份 label_search_conditions_not_null: 搜索条件不能为空 \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 33b5cd16a..be65d0eb4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -15,6 +15,16 @@ # along with this program; if not, write tobthe Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# modified by longjun +# 统一route风格 +# match 'path', :to => 'controller#action' +# 如果 path = controller#action 则 match 'path' +# Example: +# match 'welcome/course', :to => 'welcome#course' 变成 +# match 'welcome/cource' +# 所有的 act: :act 变成 :act => :act +# Example: :via => :get ====> :via => :get + RedmineApp::Application.routes.draw do @@ -31,14 +41,14 @@ RedmineApp::Application.routes.draw do resources :homework_attach do collection do get 'get_homework_member_list' - match 'addjours', via: [:get, :post] - match 'add_jour_reply', via: [:get,:post] - match 'destroy_jour', via: [:get,:post] - match 'comprehensive_evaluation_jour', via: [:get,:post] + match 'addjours', :via => [:get, :post] + match 'add_jour_reply', :via => [:get,:post] + match 'destroy_jour', :via => [:get,:post] + match 'comprehensive_evaluation_jour', :via => [:get,:post] end member do - match 'add_homework_users', via:[:get,:post] - match 'destory_homework_users',via:[:get,:post] + match 'add_homework_users', :via => [:get,:post] + match 'destory_homework_users', :via => [:get,:post] end end @@ -46,17 +56,17 @@ RedmineApp::Application.routes.draw do resources :open_source_projects do collection do - match 'search', via: [:get, :post] - match 'remove_condition', via: [:get, :post] - match 'allbug', via: [:get, :post] + match 'search', :via => [:get, :post] + match 'remove_condition', :via => [:get, :post] + match 'allbug', :via => [:get, :post] end resources :relative_memos member do - match 'master_apply', via: [:get, :post] - match 'accept_master_apply', via: [:get, :post] - match 'refuse_master_apply', via: [:get, :post] - match 'showmemo', via: [:get, :post] - match 'showbug', via: [:get, :post] + match 'master_apply', :via => [:get, :post] + match 'accept_master_apply', :via => [:get, :post] + match 'refuse_master_apply', :via => [:get, :post] + match 'showmemo', :via => [:get, :post] + match 'showbug', :via => [:get, :post] end end @@ -75,11 +85,11 @@ RedmineApp::Application.routes.draw do resources :softapplications do collection do - match 'new_message', via: :get - match 'search', via: [:get, :post] + match 'new_message', :via => :get + match 'search', :via => [:get, :post] end member do - match 'create_message' , via: :post + match 'create_message' , :via => :post end end @@ -90,46 +100,44 @@ RedmineApp::Application.routes.draw do #resources :contestnotifications, :only => [:index, :show, :edit, :update, :destroy] # match '/contestnotifications/:id/notificationcomments', :to => 'notificationcomments#create', :via => :post # match '/contestnotifications/:id/notificationcomments/:notificationcomment_id', :to => 'notificationcomments#destroy', :via => :delete - match '/contestnotifications/preview', :controller => 'previews', :action => 'contestnotification', :as => 'preview_contestnotifications', :via => [:get, :post, :put] + match '/contestnotifications/preview', :to => 'previews#contestnotification', :as => 'preview_contestnotifications', :via => [:get, :post, :put] ## new added by linchun #新竞赛相关 resources :contests, only: [:index] do resources :contestnotifications do # get 'preview', on: :collection - resources :notificationcomments do - - end + resources :notificationcomments end collection do - match 'new_contest' , via: :get - match 'join_in_contest' , via: :post - match 'unjoin_in_contest' , via: :delete - match 'create_contest' , via: :post - match 'new_join' , via: :post - match 'new' , via: :post + match 'new_contest' , :via => :get + match 'join_in_contest' , :via => :post + match 'unjoin_in_contest' , :via => :delete + match 'create_contest' , :via => :post + match 'new_join' , :via => :post + match 'new' , :via => :post end member do delete 'destroy_contest' match 'add_softapplication' - match 'update_contest' , via: [:put] - match 'show_contest' , via: [:get, :post] - match 'show_project' , via: :get - match 'show_softapplication' , via: :get - match 'show_attendingcontest' , via: :get - #match 'show_notification' , via: :get - match 'show_participator' , via: :get - match 'set_reward_project' , via: [:get, :post] - match 'set_reward_softapplication' , via: [:get, :post] - match 'add' , via: [:get, :post] - match 'add_softapplication' , via: [:get, :post] - match 'create' , via: :post - match 'settings' , via: [:get, :post] + match 'update_contest' , :via => [:put] + match 'show_contest' , :via => [:get, :post] + match 'show_project' , :via => :get + match 'show_softapplication' , :via => :get + match 'show_attendingcontest' , :via => :get + #match 'show_notification' , :via => :get + match 'show_participator' , :via => :get + match 'set_reward_project' , :via => [:get, :post] + match 'set_reward_softapplication' , :via => [:get, :post] + match 'add' , :via => [:get, :post] + match 'add_softapplication' , :via => [:get, :post] + match 'create' , :via => :post + match 'settings' , :via => [:get, :post] end end resources :stores do collection do - match 'search', via: [:get, :post] + match 'search', :via => [:get, :post] end end @@ -161,22 +169,25 @@ RedmineApp::Application.routes.draw do #end root :to => 'welcome#index', :as => 'home' + # added by longjun + match 'welcome/contest', :via => :get + # end longjun #added by baiyu - match 'git_usage/ch_usage', :controller => 'git_usage', :action => 'ch_usage', :via => :get, :as => 'ch_usage' - match 'git_usage/en_usage', :controller => 'git_usage', :action => 'en_usage', :via => :get, :as => 'en_usage' + match 'git_usage/ch_usage', :via => :get, :as => 'ch_usage' + match 'git_usage/en_usage', :via => :get, :as => 'en_usage' #added by nie - match '/projects/search', :controller => 'projects', :action => 'search', :via => [:get, :post] - match '/users/search', :controller => 'users', :action => 'search', :via => [:get, :post] + match '/projects/search', :via => [:get, :post] + match '/users/search', :via => [:get, :post] #end match 'login', :to => 'account#login', :as => 'signin', :via => [:get, :post] match 'logout', :to => 'account#logout', :as => 'signout', :via => [:get, :post] - match 'account/register', :to => 'account#register', :via => [:get, :post], :as => 'register' - match 'account/lost_password', :to => 'account#lost_password', :via => [:get, :post], :as => 'lost_password' - match 'account/activate', :to => 'account#activate', :via => :get - match 'account/valid_ajax', :to => 'account#valid_ajax', :via => :get + match 'account/register', :via => [:get, :post], :as => 'register' + match 'account/lost_password', :via => [:get, :post], :as => 'lost_password' + match 'account/activate', :via => :get + match 'account/valid_ajax', :via => :get - match '/news/preview', :controller => 'previews', :action => 'news', :as => 'preview_news', :via => [:get, :post, :put] + match '/news/preview', :to => 'previews#news', :as => 'preview_news', :via => [:get, :post, :put] match '/issues/preview/new/:project_id', :to => 'previews#issue', :as => 'preview_new_issue', :via => [:get, :post, :put] match '/issues/preview/edit/:id', :to => 'previews#issue', :as => 'preview_edit_issue', :via => [:get, :post, :put] match '/issues/preview', :to => 'previews#issue', :as => 'preview_issue', :via => [:get, :post, :put] @@ -220,13 +231,13 @@ RedmineApp::Application.routes.draw do #added by young resources :users do collection do - match "tag_saveEx" , via: [:get, :post] + match "tag_saveEx" , :via => [:get, :post] end member do match 'user_projects', :to => 'users#user_projects', :via => :get match 'user_activities', :to => 'users#user_activities', :via => :get, :as => "user_activities" match 'user_newfeedback', :to => 'users#user_newfeedback', :via => :get, :as => "user_newfeedback" - match 'watch_calls', :controller => 'users', :action => 'watch_bids', :via => [:get , :post] + match 'watch_calls', :to => 'users#watch_bids', :via => [:get , :post] match 'info', :to => 'users#info', :via => [:get , :post], :as => 'user_info' match 'user_watchlist', :to => 'users#user_watchlist', :via => :get, :as => "user_watchlist" #add by huang match 'user_fanslist', :to => 'users#user_fanslist', :via => :get, :as => "user_fanslist" #add by huang @@ -235,14 +246,14 @@ RedmineApp::Application.routes.draw do match 'watch_projects', :to => 'users#watch_projects', :via => :get # added by bai match 'show_score', :to => 'users#show_score', :via => :get - match 'topic_score_index', :controller => 'users', :action => 'topic_score_index', :via => [:get, :post] + match 'topic_score_index', :to => 'users#topic_score_index', :via => [:get, :post] match 'project_score_index', :to => 'users#project_score_index', :via => :get match 'activity_score_index', :to => 'users#activity_score_index', :via => :get match 'influence_score_index', :to => 'users#influence_score_index', :via => :get match 'score_index', :to => 'users#score_index', :via => :get match 'show_new_score', :to => 'users#show_new_score', :via => :get - match 'topic_new_score_index', :controller => 'users', :action => 'topic_new_score_index', :via => [:get, :post] + match 'topic_new_score_index', :to => 'users#topic_new_score_index', :via => [:get, :post] match 'project_new_score_index', :to => 'users#project_new_score_index', :via => :get match 'activity_new_score_index', :to => 'users#activity_new_score_index', :via => :get match 'influence_new_score_index', :to => 'users#influence_new_score_index', :via => :get @@ -259,21 +270,21 @@ RedmineApp::Application.routes.draw do end end match 'users/:id/user_newfeedback', :to => 'users#user_newfeedback', :via => :get, :as => "feedback" - match 'users/:id/user_projects', :controller => 'users', :action => 'user_projects', :via => :get + match 'users/:id/user_projects', :to => 'users#user_projects', :via => :get #match 'user/:id/watch_calls', :controller => 'users', :action => 'watch_bids', :via => [:get , :post] #end - match 'my/account', :controller => 'my', :action => 'account', :via => [:get, :post] - match 'my/account/destroy', :controller => 'my', :action => 'destroy', :via => [:get, :post] - match 'my/page', :controller => 'my', :action => 'page', :via => :get - match 'my', :controller => 'my', :action => 'index', :via => :get # Redirects to my/page - match 'my/reset_rss_key', :controller => 'my', :action => 'reset_rss_key', :via => :post - match 'my/reset_api_key', :controller => 'my', :action => 'reset_api_key', :via => :post - match 'my/password', :controller => 'my', :action => 'password', :via => [:get, :post] - match 'my/page_layout', :controller => 'my', :action => 'page_layout', :via => :get - match 'my/add_block', :controller => 'my', :action => 'add_block', :via => :post - match 'my/remove_block', :controller => 'my', :action => 'remove_block', :via => :post - match 'my/order_blocks', :controller => 'my', :action => 'order_blocks', :via => :post + match 'my/account', :via => [:get, :post] + match 'my/account/destroy', :to => 'my#destroy', :via => [:get, :post] + match 'my/page', :via => :get + match 'my', :to => 'my#index', :via => :get # Redirects to my/page + match 'my/reset_rss_key', :via => :post + match 'my/reset_api_key', :via => :post + match 'my/password', :via => [:get, :post] + match 'my/page_layout', :via => :get + match 'my/add_block', :via => :post + match 'my/remove_block', :via => :post + match 'my/order_blocks', :via => :post get 'my/page2', :to => 'my#page2', :as => "my_page2" @@ -282,8 +293,8 @@ RedmineApp::Application.routes.draw do match 'users/:id/memberships/:membership_id', :to => 'users#destroy_membership', :via => :delete match 'users/:id/memberships', :to => 'users#edit_membership', :via => :post, :as => 'user_memberships' ################# added by william - match 'users/tag_save', :to => 'users#tag_save', :via => :post, :as => 'tag' - match 'users/tag_saveEx', :to => 'users#tag_saveEx', :via => [:get, :post] + match 'users/tag_save', :via => :post, :as => 'tag' + match 'users/tag_saveEx', :via => [:get, :post] post 'watchers/watch', :to => 'watchers#watch', :as => 'watch' delete 'watchers/watch', :to => 'watchers#unwatch' @@ -308,9 +319,10 @@ RedmineApp::Application.routes.draw do member do get 'settings(/:tab)', :action => 'settings', :as => 'settings' #by young - get 'member', :controller => 'projects', :action => 'member', :as => 'member' + get 'member', :to => 'projects#member', :as => 'member' get 'file', :action => 'file', :as => 'file' get 'statistics', :action => 'statistics', :as => 'statistics' + get 'feedback', :action => 'feedback', :as => 'project_feedback' get 'watcherlist', :action=> 'watcherlist' match 'user_watcherlist', :to => 'projects#watcherlist', :via => :get, :as => "watcherlist" #add by huang @@ -327,11 +339,11 @@ RedmineApp::Application.routes.draw do end #by young - match '/member', :controller => 'projects', :action => 'member', :as => 'member', :via => :get - match '/file', :controller => 'projects', :action => 'file', :as => 'file', :via => :get - match '/statistics', :controller => 'projects', :action => 'statistics', :as => 'statistics', :via => :get + match '/member', :to => 'projects#member', :as => 'member', :via => :get + match '/file', :to => 'projects#file', :as => 'file', :via => :get + match '/statistics', :to => 'projects#statistics', :as => 'statistics', :via => :get # match '/investor', :controller => 'projects', :action => 'investor', :as => 'investor', :via => :get - match '/homework', :controller => 'projects', :action => 'homework', :as => 'homework', :via => :get + match '/homework', :to => 'projects#homework', :as => 'homework', :via => :get # match '/activity', :controller => 'activities', :action => 'index', :as => 'activity', :via => :get # match '/repository', :controller => 'repositories', :action => 'show', :repository_id => nil, :path => nil, :rev => nil, :as => 'repository', :via => :get @@ -340,7 +352,7 @@ RedmineApp::Application.routes.draw do # get 'projects/:project_id/repository', :to => 'repositories#show', :as => 'project_repository' # match '/show', :controller => 'projects', :action => 'show', :as => 'project_show', :via => :get - match '/watcherlist', :controller=>'projects', :action=> 'watcherlist', :as => 'watcherlist', :via => :get #add by huang + match '/watcherlist', :to=>'projects#watcherlist', :as => 'watcherlist', :via => :get #add by huang # matche '/news', :controller => 'news', :action => 'index', :as => 'news', :via => :get #end @@ -362,12 +374,12 @@ RedmineApp::Application.routes.draw do end end # issue form update - match 'issues/update_form', :controller => 'issues', :action => 'update_form', :via => [:put, :post], :as => 'issue_form' + match 'issues/update_form', :to => 'issues#update_form', :via => [:put, :post], :as => 'issue_form' resources :files, :only => [:index, :new, :create] do collection do - match "getattachtype" , via: [:get, :post] - #match 'getattachtype/:attachtype', :to => 'files#getattachtype', via: [:get, :post] + match "getattachtype" , :via => [:get, :post] + #match 'getattachtype/:attachtype', :to => 'files#getattachtype', :via => [:get, :post] end end @@ -399,7 +411,7 @@ RedmineApp::Application.routes.draw do # get 'create', :via=>[:get, :post] end end - match 'wiki/index', :controller => 'wiki', :action => 'index', :via => :get + match 'wiki/index', :via => :get resources :wiki, :except => [:index, :new, :create], :as => 'wiki_page' do member do get 'rename' @@ -415,7 +427,7 @@ RedmineApp::Application.routes.draw do get 'date_index' end end - match 'wiki', :controller => 'wiki', :action => 'show', :via => :get + match 'wiki', :to => 'wiki#show', :via => :get get 'wiki/:id/:version', :to => 'wiki#show', :constraints => {:version => /\d+/} delete 'wiki/:id/:version', :to => 'wiki#destroy_version' get 'wiki/:id/:version/annotate', :to => 'wiki#annotate' @@ -434,7 +446,7 @@ RedmineApp::Application.routes.draw do end resources :relations, :shallow => true, :controller => 'issue_relations', :only => [:index, :show, :create, :destroy] end - match '/issues', :controller => 'issues', :action => 'destroy', :via => :delete + match '/issues', :to => 'issues#destroy', :via => :delete resources :queries, :except => [:show] @@ -520,16 +532,16 @@ RedmineApp::Application.routes.draw do get 'attachments/download/:id', :to => 'attachments#download', :id => /\d+/ get 'attachments/thumbnail/:id(/:size)', :to => 'attachments#thumbnail', :id => /\d+/, :size => /\d+/, :as => 'thumbnail' get 'attachments/autocomplete' - match 'attachments/autocomplete', :to => 'attachments#autocomplete', via: [:post] + match 'attachments/autocomplete', :to => 'attachments#autocomplete', :via => [:post] post 'attachments/relationfile', to: 'attachments#add_exist_file_to_project', as: 'attach_relation' post 'attachments/courserelationfile', to: 'attachments#add_exist_file_to_course', as: 'course_attach_relation' get 'attachments/renderTag/:attchmentId', :to => 'attachments#renderTag', :attchmentId => /\d+/ resources :attachments, :only => [:show, :destroy] do collection do - match "updateType" , via: [:get, :post] - match "updateFileDense" , via: [:get, :post] - match "renderTag" , via: [:get, :post] - match 'delete_softapplications', via: [:get, :post] + match "updateType" , :via => [:get, :post] + match "updateFileDense" , :via => [:get, :post] + match "renderTag" , :via => [:get, :post] + match 'delete_softapplications', :via => [:get, :post] end end @@ -539,10 +551,10 @@ RedmineApp::Application.routes.draw do end end - match 'groups/:id/users', :controller => 'groups', :action => 'add_users', :id => /\d+/, :via => :post, :as => 'group_users' - match 'groups/:id/users/:user_id', :controller => 'groups', :action => 'remove_user', :id => /\d+/, :via => :delete, :as => 'group_user' - match 'groups/destroy_membership/:id', :controller => 'groups', :action => 'destroy_membership', :id => /\d+/, :via => :post - match 'groups/edit_membership/:id', :controller => 'groups', :action => 'edit_membership', :id => /\d+/, :via => :post + match 'groups/:id/users', :to => 'groups#add_users', :id => /\d+/, :via => :post, :as => 'group_users' + match 'groups/:id/users/:user_id', :to => 'groups#remove_user', :id => /\d+/, :via => :delete, :as => 'group_user' + match 'groups/destroy_membership/:id', :to => 'groups#destroy_membership', :id => /\d+/, :via => :post + match 'groups/edit_membership/:id', :to => 'groups#edit_membership', :id => /\d+/, :via => :post resources :trackers, :except => :show do collection do @@ -566,20 +578,20 @@ RedmineApp::Application.routes.draw do get 'projects/:id/search', :controller => 'search', :action => 'index' get 'search', :controller => 'search', :action => 'index' - match 'mail_handler', :controller => 'mail_handler', :action => 'index', :via => :post - match 'mail_handler/cancel/:id', :controller => 'mail_handler', :action => 'cancel_mail_notify',:via => :get - - match 'admin', :controller => 'admin', :action => 'index', :via => :get - match 'admin/projects', :controller => 'admin', :action => 'projects', :via => :get - match 'admin/users', :controller => 'admin', :action => 'users', :via => :get - match 'admin/first_page_made',:controller => 'admin',:action => 'first_page_made',:via => [:get,:post] - match 'admin/course_page_made',:controller => 'admin',:action => 'course_page_made',:via => [:get,:post] - match 'admin/contest_page_made',:controller => 'admin',:action => 'contest_page_made',:via => [:get,:post] - match 'admin/search', :controller => 'admin', :action => 'search', :via => [:get, :post] - match 'admin/plugins', :controller => 'admin', :action => 'plugins', :via => :get - match 'admin/info', :controller => 'admin', :action => 'info', :via => :get - match 'admin/test_email', :controller => 'admin', :action => 'test_email', :via => :get - match 'admin/default_configuration', :controller => 'admin', :action => 'default_configuration', :via => :post + match 'mail_handler', :to => 'mail_handler#index', :via => :post + match 'mail_handler/cancel/:id', :to => 'mail_handler#cancel_mail_notify',:via => :get + + match 'admin', :to => 'admin#index', :via => :get + match 'admin/projects', :via => :get + match 'admin/users', :via => :get + match 'admin/first_page_made', :via => [:get,:post] + match 'admin/course_page_made', :via => [:get,:post] + match 'admin/contest_page_made', :via => [:get,:post] + match 'admin/search', :via => [:get, :post] + match 'admin/plugins', :via => :get + match 'admin/info', :via => :get + match 'admin/test_email', :via => :get + match 'admin/default_configuration', :via => :post resources :auth_sources do member do @@ -590,8 +602,8 @@ RedmineApp::Application.routes.draw do end end - match 'courses/search', :to => 'courses#search' - match '/contests/search', :controller => 'contests', :action => 'search', :via => [:get, :post] + match 'courses/search' + match '/contests/search', :via => [:get, :post] # add by nwb # 课程路由设置 resources :courses do @@ -605,11 +617,11 @@ RedmineApp::Application.routes.draw do post 'finishcourse' post 'restartcourse' end - match '/member', :controller => 'courses', :action => 'member', :as => 'member', :via => :get + match '/member', :to => 'courses#member', :as => 'member', :via => :get resources :boards resources :files, :only => [:index, :new, :create] do collection do - match "getattachtype", via: [:get, :post] + match "getattachtype", :via => [:get, :post] end end resources :memberships, :shallow => true, :controller => 'members', :only => [:index, :show, :new, :create, :update, :destroy] do @@ -620,24 +632,24 @@ RedmineApp::Application.routes.draw do end resources :news, :except => [:show, :edit, :update, :destroy] resources :boards - match '/homework', :controller => 'courses', :action => 'homework', :as => 'homework', :via => :get + match '/homework', :to => 'courses#homework', :as => 'homework', :via => :get end # end of resources :courses match 'courses/:id/feedback', :to => 'courses#feedback', :via => :get, :as => 'course_feedback' - match '/courses/search', :controller => 'courses', :action => 'search', :via => [:get, :post] - match 'words/:id/leave_course_message', :controller => 'words', :action => 'leave_course_message' + match '/courses/search', :via => [:get, :post] + match 'words/:id/leave_course_message', :to => 'words#leave_course_message' - match 'workflows', :controller => 'workflows', :action => 'index', :via => :get - match 'workflows/edit', :controller => 'workflows', :action => 'edit', :via => [:get, :post] - match 'workflows/permissions', :controller => 'workflows', :action => 'permissions', :via => [:get, :post] - match 'workflows/copy', :controller => 'workflows', :action => 'copy', :via => [:get, :post] + match 'workflows', :to => 'workflows#index', :via => :get + match 'workflows/edit', :via => [:get, :post] + match 'workflows/permissions', :via => [:get, :post] + match 'workflows/copy', :via => [:get, :post] match 'settings', :controller => 'settings', :action => 'index', :via => :get - match 'settings/edit', :controller => 'settings', :action => 'edit', :via => [:get, :post] - match 'settings/plugin/:id', :controller => 'settings', :action => 'plugin', :via => [:get, :post], :as => 'plugin_settings' + match 'settings/edit', :via => [:get, :post] + match 'settings/plugin/:id', :to => 'settings#plugin', :via => [:get, :post], :as => 'plugin_settings' - match 'sys/projects', :to => 'sys#projects', :via => :get + match 'sys/projects', :via => :get match 'sys/projects/:id/repository', :to => 'sys#create_project_repository', :via => :post - match 'sys/fetch_changesets', :to => 'sys#fetch_changesets', :via => :get + match 'sys/fetch_changesets', :via => :get match 'uploads', :to => 'attachments#upload', :via => :post # Added by Tao @@ -659,20 +671,20 @@ RedmineApp::Application.routes.draw do ############## fq post 'calls/create', :to => 'bids#create' delete 'calls/destroy', :to => 'bids#destroy' - match 'calls/new', :controller => 'bids', :action => 'new', :via => [:get , :post] + match 'calls/new', :to => 'bids#new', :via => [:get , :post] get 'calls/more', :to => 'bids#more' get 'calls/back', :to=> 'bids#back' - match 'calls/new_bid', :controller => 'bids', :action => 'new_bid' - match 'contest/new_contest', :controller => 'bids', :action => 'new_contest' #huang - match 'calls/:id/show_project', :controller => 'bids', :action => 'show_project', :as => 'project_for_bid' - match 'calls/:id/show_course', :controller => 'bids', :action => 'show_courseEx', :as => 'course_for_bid' # nwb added - match 'calls/:id/new_exercise_book', :controller => 'homework_attach', :action => 'new', :as => 'new_homework_attach' - match 'calls/:id/add', :controller => 'bids', :action => 'add' - match 'calls/:id/delete', :controller => 'bids', :action => 'delete' - match 'calls/:id/add_homework', :controller => 'bids', :action => 'add_homework', via: :post - match 'calls/:id/new_submit_homework', to: 'bids#new_submit_homework', via: :get, as: 'new_submit_homework' - match 'words/add_project_respond', :controller => 'words', :action => 'add_project_respond' - match 'words/:id/leave_project_message', :controller => 'words', :action => 'leave_project_message' + match 'calls/new_bid', :to => 'bids#new_bid' + match 'contest/new_contest', :to => 'bids#new_contest' #huang + match 'calls/:id/show_project', :to => 'bids#show_project', :as => 'project_for_bid' + match 'calls/:id/show_course', :to => 'bids#show_courseEx', :as => 'course_for_bid' # nwb added + match 'calls/:id/new_exercise_book', :to => 'homework_attach#new', :as => 'new_homework_attach' + match 'calls/:id/add', :to => 'bids#add' + match 'calls/:id/delete', :to => 'bids#delete' + match 'calls/:id/add_homework', :to => 'bids#add_homework', :via => :post + match 'calls/:id/new_submit_homework', :to => 'bids#new_submit_homework', :via => :get, :as => 'new_submit_homework' + match 'words/add_project_respond', :to => 'words#add_project_respond' + match 'words/:id/leave_project_message', :to => 'words#leave_project_message' match 'projects/:id/feedback', :to => 'projects#feedback', :via => :get, :as => 'project_feedback' match 'calls/create_bid', :to => 'bids#create_bid' @@ -693,9 +705,9 @@ RedmineApp::Application.routes.draw do delete 'join_in/join', :to => 'courses#unjoin' post 'calls/:id/join_in_contest', :to => 'bids#join_in_contest', :as => 'join_in_contest' delete 'calls/:id/join_in_contest', :to => 'bids#unjoin_in_contest' - match 'calls/:id/show_participator', :to => 'bids#show_participator' #bai - match 'calls/:id/update_contest', :to => 'bids#update_contest' #bai - match 'calls/:id/settings', :to => 'bids#settings' #bai + match 'calls/:id/show_participator', :to => 'bids#show_participator' # bai + match 'calls/:id/update_contest', :to => 'bids#update_contest' # bai + match 'calls/:id/settings', :to => 'bids#settings' # bai delete 'attachment/:id', :to => 'attachments#delete_homework' match 'new_join', :to => 'courses#new_join', :as => 'try_join' @@ -707,13 +719,16 @@ RedmineApp::Application.routes.draw do #added by william # match 'calls/:id/set_results',:controller => 'bids', :action => 'set_results',:via => [:get,:post],:as => 'set_results' # match 'calls/:id/set_prizes',:controller => 'bids',:action => 'set_prizes',:as => 'set_prizes' - match 'calls/:id/set_reward',:controller => 'bids',:action => 'set_reward',:as => 'set_reward' + match 'calls/:id/set_reward',:to => 'bids#set_reward',:as => 'set_reward' # added by young - match 'calls', :controller => 'bids', :action => 'index' + match 'calls', :to => 'bids#index' - match 'calls/:id', :controller => 'bids', :action => 'show', :as => 'respond' - match 'contest', :controller => 'bids', :action => 'contests', :as => 'contest' #modified @20140403 + match 'calls/:id', :to => 'bid#show', :as => 'respond' + # modified by longjun + # bids#contests is not exist + # match 'contest', :to => 'bids#contests', :as => 'contest' #modified @20140403 + # end longjun ######################## ##added by wen########## @@ -738,17 +753,17 @@ RedmineApp::Application.routes.draw do get 'school/upload_logo', :to => 'school#upload_logo' ######added by nie - match 'tags/show_projects_tags',:to => 'tags#show_projects_tags' + match 'tags/show_projects_tags' ########### added by liuping - match 'tags/add_tag',:to => 'tags#add_tag',:as=>"add_tag" - match 'tags/delete_tag',:to => 'tags#delete_tag',:as=>"add_tag" - match 'tags/show_all',:to => 'tags#show_all' - match 'parise_tread/praise_plus',:to => 'parise_tread#praise_plus',:as=>"praise" - match 'parise_tread/tread_plus',:to => 'parise_tread#tread_plus',:as=>"tread" - match 'tags/delete',:to=>'tags#delete' - match 'tags/remove_tag',:to=>'tags#remove_tag',:as=>"remove_tag" - - match 'words/add_brief_introdution', :controller => 'words', :action => 'add_brief_introdution' + match 'tags/add_tag', :as=>"add_tag" + match 'tags/delete_tag', :as=>"add_tag" + match 'tags/show_all' + match 'parise_tread/praise_plus', :as=>"praise" + match 'parise_tread/tread_plus', :as=>"tread" + match 'tags/delete' + match 'tags/remove_tag', :as=>"remove_tag" + + match 'words/add_brief_introdution' Dir.glob File.expand_path("plugins/*", Rails.root) do |plugin_dir| diff --git a/public/file_not_found.html.erb b/public/file_not_found.html.erb index 8cd5e7af6..fdc21c1a1 100644 --- a/public/file_not_found.html.erb +++ b/public/file_not_found.html.erb @@ -1,42 +1,42 @@ - - - - - File not found - - - -
    - -

    <%= l(:label_file_not_found) %>

    -

    <%= link_to l(:label_goto_homepage),{:controller=>'welcome',:action=>'index',:host=>Setting.host_name} %>

    - -
    -
    -

    <%= l(:label_trustie_team) %>

    -
    -
    - -
    - - + + + + + File not found + + + +
    + +

    <%= l(:label_file_not_found) %>

    +

    <%= link_to l(:label_goto_homepage),{:controller=>'welcome',:action=>'index',:host=>Setting.host_name} %>

    + +
    +
    +

    <%= l(:label_trustie_team) %>

    +
    +
    + +
    + + diff --git a/public/javascripts/welcome.js b/public/javascripts/welcome.js index a0166bb3f..13466edd0 100644 --- a/public/javascripts/welcome.js +++ b/public/javascripts/welcome.js @@ -60,5 +60,10 @@ fixedBar('backTopBtn' , {autoHidden: true, top : 186}); fixedBar('identifier-pannel' , {autoHidden: false , top : 956 , show : true}); + //修改微信扫码样式布局后添加微信扫码跟随滚动处理 + $(window).scroll(function(){ + var vtop=$(document).scrollTop(); + $("#identifier-pannel").css('top',vtop+"px"); + }) } })(); \ No newline at end of file diff --git a/public/no_file_found.html b/public/no_file_found.html index 7fc343e50..1b4f3c798 100644 --- a/public/no_file_found.html +++ b/public/no_file_found.html @@ -1,42 +1,42 @@ - - - - - File not found - - - -
    - -

    该作业没有任何的附件可以下载

    -

    返回主页

    - -
    -
    -

    Trustie开发团队.

    -
    -
    - -
    - - + + + + + File not found + + + +
    + +

    该作业没有任何的附件可以下载

    +

    返回主页

    + +
    +
    +

    Trustie开发团队.

    +
    +
    + +
    + + diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css index 50d339fa8..72b379585 100644 --- a/public/stylesheets/application.css +++ b/public/stylesheets/application.css @@ -1,2796 +1,2796 @@ -html {overflow-y:scroll;} -body { font-family:'微软雅黑', Verdana, sans-serif; font-size: 13px; color:#484848; margin: 0; padding: 0; min-width: 900px; } /*modified by linchun*/ - -h1, h2, h3, h4 {font-family: '微软雅黑', "Trebuchet MS", Verdana, sans-serif;padding: 2px 10px 1px 0px;margin: 0 0 10px 0;} -#content h1, h2, h3, h4 {color: #555;} -h2, .wiki h1 {font-size: 20px;} -h3, .wiki h2 {font-size: 15px; padding-left: 5px} -h4, .wiki h3 {font-size: 13px;} -h4 {border-bottom: 1px dotted #bbb;} -/*huang*/ -/*current position*/ -.contest_count{ - width: 20%; - height: 60px; - border: 1px solid #15bccf; - border-radius: 5px 5px 5px 5px; - float:right; -} - -.top-content{ - background-color: #f7f7f7; - height: 56px; - width: 940px; - line-height: 1.2em; - padding-top: 6px; - margin-bottom: 10px; -} - -div.position-f{ - padding-left: 8px; - float: left; - width: 238px; - line-height: 0.5em; - vertical-align: middle; - alignment-adjust: middle; - alignment-adjust: middle; -} - -div.position-f p.font{ - font-family: "Microsoft YaHei"; - font-weight: bold; - font-size: 16px; - color: #15bccf; -} - -div.position-s{ - float: left; - width: 430px; - line-height: 0.5em; -} - -div.position-s p.font{ - color: #15bccf; - font-weight: bold; -} - -div.position-t{ - padding-top: 13px; - float: left; - width: 238px; - line-height: 0.5em; -} - -/*end current position*/ -/*new sidebar*/ -div.sidebar-user{ - float: left; - padding-left: 8px; - border-bottom: 1px solid #15bccf; -} - -.inf-user-image{ - padding-left:8px; - margin:0px; - background-color:#fff; - height: auto; - padding-bottom: 8px; - float: left; -} -.inf-user-image img.avatar2{ - background: rgb(245, 245, 245); - padding: 4px; - border: 1px solid #e5dfc7; - float: left; - display: block; - height:80px; - width: 80px; - -} - -.sidebar-f{ - width: 238px; - float: left; - margin:0px; - background-color:#fff; - height: auto; - padding-bottom: 8px; -} - -div.sidebar-f div.name{ - float: left; - padding-left: 8px; - font-family:"Microsoft YaHei"; - font-weight:bold; - font-size:16px; - color:#4d4d4d; - word-wrap: break-word; - word-break: break-all; -} - -div.sidebar-f p.watch{ - padding-left: 3px; -} - -div.sidebar-s{ - line-height: 1em; -} - -div.sidebar-s p.mail{ - width: 220px; - white-space: nowrap; - white-space: nowrap; - overflow: hidden; -} - -div.sidebar-s p.location{ - word-wrap: break-word; - word-break: break-all; -} - -div.sidebar-t{ - -} -/*end*/ - -/*main-conten*/ -div.main-content{ - float: left; - width: 660px; - border-bottom: 1px dashed rgb(204, 204, 204); - margin-bottom: 10px; - font-size:14px; -} - -div.main-content-f{ - float:left; - width: 80px; -} - -div.main-content-s{ - float: left; - width: 580px; -} -/**/ - -/*forums-index*/ -div.forums-index{ - padding-left: 10px; - padding-top: 10px; - float: left; - width: 100%; - border-bottom: 1px dashed rgb(204, 204, 204); -} -div.forums-inex-avatar{ - padding-left: 15px; - float: left; - width: 7%; -} - -div.forums-index-content{ - float: left; - width: 72%; - line-height: 1.5em; -} - -div.forums-index-count{ - padding-top: 10px; - float: right; - padding-right: 40px; - -} -table.forums-count-color{ - width: 80px; - height: 60px; - background-color: #e5e2e2; - -} - -table.forums-count-color tr{ - font-weight: bold; - font-size: 14px; - background-color: #e5e2e2; - vertical-align: middle; - alignment-adjust: middle; - -} -/*forums-index end*/ -.vatar-size{ - height: 70px; - width: 70px; -} - -div.position-title{ - line-height: 0.5em; -} - -div.sidebar-forums{ - padding-left: 8px; - width: 214px; -} - -div.forums-tags{ - border-bottom: solid 1px #15bccf; - width: 214px; -} - -div.forums-line{ - border-bottom: solid 1px #15bccf; -} - -div.forums-info{ - /*background-image: url(../images/sidebar/forums.png); */ - border-bottom: solid 1px #15bccf; - height: 100px; - width: 214px; - padding-left: 5px; - -} - -div.forums-title{ - font-family: "Microsoft YaHei"; - font-weight: bold; - font-size: 16px; - color: rgb(237, 137, 36); - word-wrap: break-word; - word-break: break-all; -} - -div.forums-description{ - color: rgb(145, 146, 148); -} - -span.forums-avatar-left{ - float:left; - width: 27%; -} - -span.forums-avatar-right{ - float: right; - width: 65%; -} - -.formus-first-title{ - font-family: "Microsoft YaHei"; - font-weight:bold; - padding-top:3px; - padding-bottom:3px; - font-size:16px; -} -/*end*/ -.welcome-index{ - width: 290px; - white-space: nowrap; - overflow: hidden; - -o-text-overflow: ellipsis; - text-overflow: ellipsis; -} -.contextual-borad{ - float:left; - white-space: nowrap; - line-height:1.4em; - margin-top:0px; - margin-right:8px; - font-size:0.9em; -} - -.borad-text-list{ - margin-bottom: 10px; - border-bottom: 1px dashed rgb(204, 204, 204); - width: 680px; -} - -.borad-message{ - margin-bottom: 10px; - border-bottom: 1px dashed rgb(204, 204, 204); -} - -.borad-count{ - width: 50px; - background-color: #e5e2e2; -} - -.borad-title{ - font-size: 15px; - color: #555555; - padding-left: 5px; - padding-top: -5px; - font-weight: 400; -} - -.borad-setitle{ - padding-bottom: 5px; - padding-top: 10px; - border-bottom: 1px dashed rgb(204, 204, 204); -} - -.borad-topic-count{ - padding-top: 10px; - padding-left: 5px; - padding-right: 5px; - clear: left; -} - -.borad-topic-count-message{ - padding-left: 5px; - border-bottom:solid 1px #848282; - color: #848282; - -} - -.borad-description{ - padding-top: 5px; - color: #848282; - padding-left: 5px; -} - -.borad-count-digit{ - font-size: 14px; - font-weight: bold; -} -.underline-evreycontent{ - margin-bottom: 10px; - border-bottom: 1px dashed rgb(204, 204, 204); - width: 660px; -} - -.content-title-top-avtive{ - padding-bottom: 15px; - padding-left: 5px; - padding-top: 5px; -} - -.content-title-top-project{ - padding-left: 5px; -} - -.content-title-top{ - padding-bottom: 20px; - padding-left: 5px; -} - -.new_submit{ - padding-bottom: 5px; - width: 55px; - height: 25px; - font-family: '微软雅黑',Arial,Helvetica,sans-serif; - font-size: 12px; - color: #fff; - padding: 0px; - background: #15bccf; - border: 1px solid #15bccf; -} -.content-text-list{ - margin-bottom: 10px; - border-bottom: 1px dashed rgb(204, 204, 204); - width: 580px; -} - -.location-list{ - width: 180px; - color: #15bccf; -} - -.top-content-list{ - width: 430px; - white-space: nowrap; - overflow: hidden; - -o-text-overflow: ellipsis; - text-overflow: ellipsis; -} - -.top-content-list-homework{ - width: 650px; - white-space: nowrap; - overflow: hidden; - -o-text-overflow: ellipsis; - text-overflow: ellipsis; -} - -/*added by bai*/ -.user_underlinescore{ - margin:1; - padding:1; - width:700px; - height:1px; - background-color:#15bccf; - overflow:hidden -} - -.top-course-content{ - background-color: rgb(181,227, 251); - height: 45px; - width: 940px; - line-height: 1em; - padding-top: 5px; -} - -.top-user-content{ - background-color: rgb(195,291, 232); - height: 45px; - width: 940px; - line-height: 1em; - padding-top: 5px; -} - -.top-context-content{ - background-color: rgb(242,241, 192); - height: 45px; - width: 940px; - line-height: 1em; - padding-top: 5px; -} -.top-bid-content{ - background-color: rgb(246,176, 133); - height: 45px; - width: 940px; - line-height: 1em; - padding-top: 5px; -} - -.button-submit{ - padding-bottom: 5px; - width: 55px; - height: 25px; - font-family: '微软雅黑',Arial,Helvetica,sans-serif; - font-size: 12px; - color: #fff; - padding: 0px; - background: #15bccf; - border: 1px solid #15bccf; - -} -/*end*/ - -.top-content-home{ - background-color: rgb(226, 244, 255); - width: 25%; - padding-bottom :50px; - -} - -.top-content-search{ - float: right; - padding-right: 15px; - -} - -.top-content-location{ - margin-left: 133px; /*modified by bai*/ - -} - - - -.project_avatar_name { - position: relative; - font-size: 16px; - display:block; -} - -a.bids_user { - font-family:"Microsoft YaHei"; - color:#15bccf; - font-size:14px; - font-weight: bold; -} -.welcome_logo{ - float: left; - padding-left: 5px; - padding-top: 2px; -} -.welcome_images{ - width: 200px; - height: 200px; -} - -.base_footer{ - color:#acaeb1; - font-size:12px; -} - -.project_top{ - padding: 10px 20px; -} - -.line{ - height: 1px; - margin: 0px; - background-color: #cacaca; - overflow: hidden; - margin-top: 10px; -} - -ul.list_watch{ - padding-left: 0px; - list-style-type:none; - height:auto; - border-bottom: 1px dashed rgb(204, 204, 204); - } - -.new_creat{ - padding-top: 0px; - float: right; - padding-right: 30px; - -} -ul.tool{margin:0px; padding-left:0em;} -ul.tool li{list-style-type:none; - height:auto;} -.font_index{ - font-size:22px; - font-family: "Microsoft YaHei"; - color:#068d9c; -} -.font_aram{ - font-size: 14px; - font-family: "Microsoft YaHei"; - font-weight: bold; -} -.font_content{ - font-size:14px; - font-family: "Microsoft YaHei"; - color:#FFFFFF; -} - -.time_project{ - font-size:12px; - font-family: "Microsoft YaHei"; -} -.line_bottom{ - margin-top: 1px; - dashed: #ffff00; - height: 1px; - overflow: hidden; -} -/*多行隐藏*/ -.tablecontext{ - /*white-space:nowrap;*/ - overflow: hidden; - height:35px; - width:200px; - text-align: left; - font-family: arial; - font-size:12px; - color:#7e7e7e; -} -.content_frame{ - padding-bottom: 30px; - float: left; - -} - -.user_other_model{ - margin:5px 0px 0px 0px; - padding-left:8px; - height:auto; - background-color: #d0d9e0; -} - -.font_title_document{ - font-size: 13px; - font-weight: bold; -} - -.font_title_tag{ - font-family: "Microsoft YaHei"; - font-weight:bold; - padding-top:3px; - padding-bottom:3px; - font-size:16px; - /*color:#05a8bb;*/ -} - -.font_title_left{ - font-family: "Microsoft YaHei"; - font-weight:bold; - padding-left: 10px; - padding-top:3px; - padding-bottom:3px; - font-size:16px; - /*color:#05a8bb;*/ -} -.font_small_watch{ - font-family: "Microsoft YaHei"; - font-weight:bold; - color:#15bccf; -} -.left_wf{ - padding-left:8px; -} -.main_context{ - padding-bottom: 5px; -} -.welcome_image{ - height: 27px; - width: 30px; - -} -.font_welcome{ - font-family: "Microsoft YaHei"; - font-weight: bold; - font-size: 16px; - color:#6d6e6e; -} - -.font_welcome_trustie{ - font-family: Tahoma,"Microsoft YaHei"; - font-weight: bold; - font-size: 18px; - color:#15bccf; -} - -.font_welcome_school{ - font-family: Tahoma,"Microsoft YaHei"; - font-weight: bold; - font-size: 20px; - color:#e8770d; -} - -.font_welcome_Cdescription{ - font-family: "Microsoft YaHei"; - font-size: 16px; - color: #5c5c5c; -} - -.font_welcome_tdescription{ - font-family: "Microsoft YaHei"; - font-size: 16px; - color: #5c5c5c; - text-align: justify; - text-justify: inter-ideograph; -} - -.inf_user_image{ - padding-left:8px; - margin:0px; - background-color:#fff; - height: auto; - padding-bottom: 8px; -} -.inf_user_image img.avatar2{ - background: rgb(245, 245, 245); - padding: 4px; - border: 1px solid #e5dfc7; - float: left; - display: block; - height:80px; - width: 80px; - -} - -.font_welcome_tdescription2{ - font-family: Arial, Helvetica, sans-serif; - font-size: 20px; - color: #FF0000; - text-align: justify; - text-justify: inter-ideograph; -} - - -.font_welcome_Edescription{ - font-family: Default; - font-size: 16px; - color: #9a9a9a; -} - -.font_welcome_feature{ - font-family: "Microsoft YaHei"; - font-weight: bold; - font-size: 16px; - color:#09b2c8; - padding-top: 50px; -} - -.info-course{ - padding-left: 8px; - font-family: "Microsoft YaHei"; - font-weight:bold; - font-size:16px; - color:#4d4d4d; - word-wrap: break-word; - word-break: break-all; -} - -ul.user_course_sort{margin:0px; padding-left:0em;} -ul.user_course_sort li{list-style-type:none; - height:auto;} - - -.info-break{ - word-wrap: break-word; - word-break: break-all; -} - -.info_font{ - padding-left: 8px; - font-family: "Microsoft YaHei"; - font-weight:bold; - font-size:16px; - color:#4d4d4d; - word-wrap: break-word; - word-break: break-all; -} -.font_lighter{ - font-family: "Microsoft YaHei"; - color:#acaeb1; - font-size:13px; -} -.font_lighter_e{ - width: 700px; - color:#acaeb1; - font-size:13px; -} -.font_lighter2{ - font-family: "Microsoft YaHei"; - color:#9a9a9a; - font-size:14px; -} - -.font_lighter_welcome{ - color:#acaeb1; - font-size:12px; - font-family: "Microsoft YaHei"; -} -.justify_side > span{ - text-align: justify; - width: 180px; -} -.font_lighter_sidebar{ - /*font-family:微软雅黑;*/ - color:#919294; - font-size:13px; - padding-left: 12px; - padding-right: 8px; -} -.created_on_project{ - padding-left: 12px; - padding-bottom: 5px; -} -.font_description{ - font-size:14px; - line-height: 1.5em; - -} -.font_description2{ - font-size:13px; - line-height: 1.5em; - padding-left: 10px; -} -.font_tool{ - font-family: "Microsoft YaHei"; - font-size:14px; - color: #1a1a1a; - padding-left: 6px; -} - -.spaceleft{float: left; width: 240px;} - -.spaceright{float:left; width:620px;} - -.welcome_left{ - float:left; - display:inline-block; - /*margin-top: 50px;*/ - /*padding-left: 20px;*/ - max-width: 315px; - margin: 0; - padding: 0; - margin-left: 15px; -} - -.welcome_right{ - float:left; - width: 49%; - -} - -.inf_user_motto{ - padding-left:8px; - margin:5px 0px 0px 0px; - padding-top:1px; - background-color:#b8c1c8; - height: auto; -} -/*.user_watcher{ - padding-left:8px; - margin:5px 0px 0px 0px; - height: 220px; - background-color:#bababa; -}*/ - -.user_fans{ - padding-left:0px; - margin:0px; - height: auto; - background-color:#fff; -} -.inf_user_context{ - padding-left:0px; - margin:0px; - padding-top:1px; - background-color:#fff; - height: auto; - /*color:#fff; */ -} - -.user_tags{ - padding-top: 5px; - padding-bottom: 5px; - padding-left: 12px; - padding-right: 12px; -} - -.tool{ - padding-left:0px; - margin:0px 0px 0px 0px; - height: auto; - background-color:#fff; - padding-bottom:0px; -} -.user_private{ - padding-left:8px; - margin:5px 0px 0px 0px; - height: 100px; - background-color:#dbdbde; -} -.user_private_left{ - padding-left:8px; - - float:left; - height: 100px; - width:110px; - background-color:#a5abb4; -} -.user_private_right{ - - margin:0px 0px 0px 5px; - float:left; - height: 100px; - width:115px; - background-color:#adb6c5; -} -.user_underline{ - margin:1; - padding:1; - width:240px; - height:1px; - background-color:#15bccf; - overflow:hidden -} - - - -.user_enterprise_underline{ - margin:1; - padding:1; - width:240px; - height:1px; - background-color:#ac344f; - overflow:hidden -} - -.user_underline2{ - margin:1; - padding:1; - width:240px; - height:1px; - background-color:#c6e9fe; - overflow:hidden -} -.user_underline3{ - margin:1; - padding:1; - width:120px; - height:1px; - background-color:#c6e9fe; - overflow:hidden; - margin-top: 10px; -} -.homepage_underline{ - margin:1; - padding:1; - width:240px; - height:1px; - background-color:#c6e9fe; - overflow:hidden; - margin-top: 0px; - margin-bottom: 20px; -} -.line_under{ - border-bottom: 1px dashed rgb(204, 204, 204); -} -.line_heng{ - width: 670px; - height: 1px; - margin-top:5px; - border: 0px; - background-color:#D5D5D5; - color: #D5D5D5; -} - -ul.user_project_sort{margin:0px; padding-left:0em;} -ul.user_project_sort li{list-style-type:none; - height:auto;} -/**/ - - - -/*h写的样式*/ -.lbadding{float:left; padding-left: 10px} /*huang*/ -.rlbadding{float:left; padding-left: 0px; margin-top:40px} /*huang*/ -/*.lbadding h7{letter-spacing: -0.0125em; font-weight:700}*//*未用*/ -.newsplitcontentright{float:right; width:49%;}/*huang*/ -.newsplitcontentleft{float:left; width:49%;}/*huang*/ -.newsplitcontentall{float:left; padding-left: 30px; width:95%} - -.more{float:right; padding-right:60px; padding-top:20px;text-decoration: underline; color: #95c3bc} -/*字体*/ - -.header_logo_left{ - float: left; - width: 70%; - height: 50px; -} -.header_logo_right{ - padding-left:-50px; - padding-top:-50px; - float: right; - width: 30%; - height: 50px; -} -a.htags{ - background-color: #deebf0; - - border-radius: 5px 5px 5px 5px; - padding: 0px 4px 0px 4px; - margin:0 3px; -} -a.logical_int{ - color: #ed8924; -} - -.contextdescription2 { - font-family: "Microsoft YaHei"; - font-size: 12px; - font-weight: lighter; - color: #7e7e7e; -} -ul.context_projects{margin:0px; padding-left:0em;} - -ul.context_projects ul {padding-left:1.6em;} - -ul.context_projects li { - list-style-type:none; - height:50px; -} -/*字体*/ - -.more{float:right; padding-right:40px; text-decoration: underline; color: #95c3bc} - -/*控制project里面header内容,一排读数*/ -.newprojectheader{ - font-weight: bold; - font-size: 14px; - font-family:"黑体"; - color:#597e95; - /*text-decoration:underline;*/ - padding:10px 0px 10px 20px; -} -/*显示一个区域,多余的隐藏 比如项目描述内容多余部分的隐藏 两行隐藏*/ -.tablecontext{ - /*white-space:nowrap;*/ - overflow: hidden; - - height: 30px; - width: 450px; - margin-right:auto; - - margin-left:auto; - text-align: left; - padding-top:12px; - font-family: arial; - font-size:12px; - font-weight:lighter; - color:#7e7e7e; -} - -.top_description{ - overflow: hidden; - height: 65px; - width: 600px; - color: #7e7e7e; -} -/*显示浅颜色的字体*/ -.fontligher{ - font-family: arial; - font-size:12px; - font-weight:lighter; - color:#505050; - - height: 34px; - width: 500px; - margin-right:auto; - margin-left:auto; - text-align: left; - padding-top:10px; - -} -.documenttext{ /*没用*/ - /*white-space:nowrap;*/ - overflow: hidden; - height: 220px; - width: 100px; - margin-right:auto; - margin-left:auto; - text-align: left; - padding-top:10px; -} -.tablecontext_single{ - white-space:nowrap; - overflow: hidden; - text-overflow:ellipsis; - - width: 450px; - margin-right:auto; - margin-left:auto; - text-align: left; - padding-top:0px; -} -/*单行隐藏不限长度*/ -.alone_sigle{ - white-space:nowrap; - overflow: hidden; - text-overflow:ellipsis; -} -.firstname_project{ /*控制读出的project标题内容*/ - white-space:nowrap; - width: 120px; - - width: 300px; - margin-right:auto; - margin-left:auto; - text-align: left; - padding-top:5px; -} -.firstname_project{ /*控制读出的project标题内容*/ - white-space:nowrap; - width: 100px; - - overflow: hidden; - margin-right:auto; - margin-left:auto; - text-align: left; - - - font-size:24px; - font-weight:bold; - text-decoration:none; - color:#000000; -} -.firdtname_project{ - - font-size:12px; - font-weight:bold; - text-decoration:none; - color:#116699; - - - -} -.lbadding h3{ - color: #1c5c76; - font-size: 16px; - line-height: 19px; - margin-bottom: 0; - margin-top: 0; - text-decoration: underline; -} -.last_active{ - color: #AA9C84; - font-size:12px; - text-decoration: none; -} -ul.newprojects{ /*huang*/ - margin: 0px; - padding-left: 2em; -} -ul.newprojects ul{ - padding-left:1.6em; -} -ul.newprojects li{ /*huang 块状*/ - padding:4%; - background-color:#f5f1e8; - margin:0 0 3px; - display:inline-block; - display:inline-block; - vertical-align:top; - width:200px; - vertical-align:top; - border-bottom:5px #DBEDF4 solid; - border-left:2px dotted #DBEDF4; - min-height:260px; - line-height: 30px; -} -/*ul.newprojects li documenttext{ *//*未wan*/ - /*overflow: hidden;*/ - /*height: 260px;*/ - /*width: 200px;*/ - /*margin-right:auto;*/ - /**/ - /*padding-top:10px;*/ -/*}*/ -ul.newprojects2{ /*huang*/ - margin: 0px; - padding-left: 2em; -} -ul.newprojects2 ul{ - padding-left:1.6em; -} -ul.newprojects2 li{ - list-style-type: none; - line-height: 10px; - } -.newfeedback{ - height: auto; - margin-left: 0px; - margin-bottom: 12px; - border: 0px none !important; -} - -.newfeedback h1{ - color: inherit; -} -/***** Layout *****/ -#wrapper {background: white;} - -#top-menu {background: #3E5B76; color: #000; height:1.8em; font-size: 1.0em; padding: 2px 2px 0px 6px;} -#top-menu ul {margin: 0; padding: 0;} -#top-menu li { - float:left; - list-style-type:none; - margin: 0px 0px 0px 0px; - padding: 0px 0px 0px 0px; - white-space:nowrap; -} -#top-menu a {color: #fff; margin-right: 8px; font-weight: bold;} -#top-menu #loggedas - { - float: right; - - margin-right: 0.5em; - color: #fff; - } - -#account {float:right;} -#account-enterprise{ - float: right; - padding-top: 10px; - padding-right: 347px; - -} -#account-college{ - - float: right; - padding-top: 10px; - padding-right: 302px; - -} - -#header {min-height:5.3em;margin:0;background-color:#628DB6;color:#f8f8f8; padding: 4px 8px 20px 6px; position:relative;} -#header a {color:#f8f8f8;} -#header h1 a.ancestor { font-size: 80%; } -#quick-search {float:right;} - -#main-menu {left:6px;}/*by young*/ -#main-menu ul {margin: 0; padding: 0;} -#main-menu li { - float:left; - list-style-type:none; - margin: 0px 2px 0px 0px; - padding: 0px 0px 0px 0px; - white-space:nowrap; -} -#main-menu li a { - display: block; - color: #039ea0; - text-decoration: none; - font-weight: bold; - margin: 0; - padding: 4px 10px 4px 10px; -} -#main-menu li a:hover {background:#759FCF; color:#fff;} -#main-menu li a.selected, #main-menu li a.selected:hover {background:#fff; color:#555;} - -#admin-menu ul {margin: 0; padding: 0;} -#admin-menu li {margin: 0; padding: 0 0 6px 0; list-style-type:none;} - -#admin-menu a { background-position: 0% 40%; background-repeat: no-repeat; padding-left: 20px; padding-top: 2px; padding-bottom: 3px;} -#admin-menu a.projects { background-image: url(../images/projects.png); } -#admin-menu a.users { background-image: url(../images/user.png); } -#admin-menu a.groups { background-image: url(../images/group.png); } -#admin-menu a.roles { background-image: url(../images/database_key.png); } -#admin-menu a.trackers { background-image: url(../images/ticket.png); } -#admin-menu a.issue_statuses { background-image: url(../images/ticket_edit.png); } -#admin-menu a.workflows { background-image: url(../images/ticket_go.png); } -#admin-menu a.custom_fields { background-image: url(../images/textfield.png); } -#admin-menu a.enumerations { background-image: url(../images/text_list_bullets.png); } -#admin-menu a.settings { background-image: url(../images/changeset.png); } -#admin-menu a.plugins { background-image: url(../images/plugin.png); } -#admin-menu a.info { background-image: url(../images/help.png); } -#admin-menu a.server_authentication { background-image: url(../images/server_key.png); } - -#main {background-color:#EEEEEE;} - -#sidebar{ float: left; width: 22%; position: relative; z-index: 9; padding: 0; margin: 0;}/*by young*/ -* html #sidebar{ width: 22%; } -#sidebar h3{ font-size: 14px; margin-top:14px; color: #666; } -#sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; } -* html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; } -#sidebar .contextual { margin-right: 1em; } - -#content { }/*by young*/ -* html #content{ width: 75%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;} -html>body #content { min-height: 600px; } -* html body #content { height: 600px; } /* IE */ - -#main.nosidebar #sidebar{ display: none; } -#main.nosidebar #content{ width: auto; border-right: 0; } - - -#footer {clear: both; border-top: 1px solid #bbb; font-size: 0.9em; color: #aaa; padding: 5px; text-align:center; background:#fff;} - -#login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; } -#login-form table td {padding: 6px;} -#login-form label {font-weight: bold;} -#login-form input#username, #login-form input#password { width: 300px; } - -div.modal { border-radius:5px; background:#fff; z-index:50; padding:4px;} -div.modal h3.title {display:none;} -div.modal p.buttons {text-align:right; margin-bottom:0;} - -input#openid_url { background: url(../images/openid-bg.gif) no-repeat; background-color: #fff; background-position: 0 50%; padding-left: 18px; } - -.clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; } - -/***** Links *****/ -a, a:link, a:visited{ color: #169; text-decoration: none; } -a:hover, a:active{ color: #c61a1a; text-decoration: underline;} -a img{ border: 0; } - -a.issue.closed, a.issue.closed:link, a.issue.closed:visited { color: #999; text-decoration: line-through; } -a.project.closed, a.project.closed:link, a.project.closed:visited { color: #999; } -a.user.locked, a.user.locked:link, a.user.locked:visited {color: #999;} - -#sidebar a.selected {line-height:1.7em; padding:1px 3px 2px 2px; margin-left:-2px; background-color:#9DB9D5; color:#fff; border-radius:2px;} -#sidebar a.selected:hover {text-decoration:none;} -#admin-menu a {line-height:1.7em;} -#admin-menu a.selected {padding-left: 20px !important; background-position: 2px 40%;} - -a.collapsible {padding-left: 12px; background: url(../images/arrow_expanded.png) no-repeat -3px 40%;} -a.collapsible.collapsed {background: url(../images/arrow_collapsed.png) no-repeat -5px 40%;} - -a#toggle-completed-versions {color:#999;} -/***** Tables *****/ -table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; } -table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; } -table.list td { vertical-align: top; padding-right:10px; } -table.list td.id { width: 2%; text-align: center;} -table.list td.checkbox { width: 15px; padding: 2px 0 0 0; } -table.list td.checkbox input {padding:0px;} -table.list td.buttons { width: 15%; white-space:nowrap; text-align: right; } -table.list td.buttons a { padding-right: 0.6em; } -table.list caption { text-align: left; padding: 0.5em 0.5em 0.5em 0; } - -tr.project td.name a { white-space:nowrap; } -tr.project.closed, tr.project.archived { color: #aaa; } -tr.project.closed a, tr.project.archived a { color: #aaa; } - -tr.project.idnt td.name span {background: url(../images/bullet_arrow_right.png) no-repeat 0 50%; padding-left: 16px;} -tr.project.idnt-1 td.name {padding-left: 0.5em;} -tr.project.idnt-2 td.name {padding-left: 2em;} -tr.project.idnt-3 td.name {padding-left: 3.5em;} -tr.project.idnt-4 td.name {padding-left: 5em;} -tr.project.idnt-5 td.name {padding-left: 6.5em;} -tr.project.idnt-6 td.name {padding-left: 8em;} -tr.project.idnt-7 td.name {padding-left: 9.5em;} -tr.project.idnt-8 td.name {padding-left: 11em;} -tr.project.idnt-9 td.name {padding-left: 12.5em;} - -tr.issue { text-align: center; white-space: nowrap; } -tr.issue td.subject, tr.issue td.category, td.assigned_to, tr.issue td.string, tr.issue td.text, tr.issue td.relations { white-space: normal; } -tr.issue td.subject, tr.issue td.relations { text-align: left; } -tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;} -tr.issue td.relations span {white-space: nowrap;} -table.issues td.description {color:#777; font-size:90%; padding:4px 4px 4px 24px; text-align:left; white-space:normal;} -table.issues td.description pre {white-space:normal;} - -tr.issue.idnt td.subject a {background: url(../images/bullet_arrow_right.png) no-repeat 0 50%; padding-left: 16px;} -tr.issue.idnt-1 td.subject {padding-left: 0.5em;} -tr.issue.idnt-2 td.subject {padding-left: 2em;} -tr.issue.idnt-3 td.subject {padding-left: 3.5em;} -tr.issue.idnt-4 td.subject {padding-left: 5em;} -tr.issue.idnt-5 td.subject {padding-left: 6.5em;} -tr.issue.idnt-6 td.subject {padding-left: 8em;} -tr.issue.idnt-7 td.subject {padding-left: 9.5em;} -tr.issue.idnt-8 td.subject {padding-left: 11em;} -tr.issue.idnt-9 td.subject {padding-left: 12.5em;} - -tr.entry { border: 1px solid #f8f8f8; } -tr.entry td { white-space: nowrap; } -tr.entry td.filename { width: 30%; } -tr.entry td.filename_no_report { width: 70%; } -tr.entry td.size { text-align: right; font-size: 90%; } -tr.entry td.revision, tr.entry td.author { text-align: center; } -tr.entry td.age { text-align: right; } -tr.entry.file td.filename a { margin-center: 16px; } -tr.entry.file td.filename_no_report a { margin-left: 16px; } - -tr span.expander {background-image: url(../images/bullet_toggle_plus.png); padding-left: 8px; margin-left: 0; cursor: pointer;} -tr.open span.expander {background-image: url(../images/bullet_toggle_minus.png);} - -tr.changeset { height: 20px } -tr.changeset ul, ol { margin-top: 0px; margin-bottom: 0px; } -tr.changeset td.revision_graph { width: 15%; background-color: #fffffb; } -tr.changeset td.author { text-align: center; width: 15%; white-space:nowrap;} -tr.changeset td.committed_on { text-align: center; width: 15%; white-space:nowrap;} - -table.files tr.file td { text-align: center; } -table.files tr.file td.filename { text-align: left; padding-left: 24px; } -table.files tr.file td.digest { font-size: 80%; } - -table.members td.roles, table.memberships td.roles { width: 45%; } - -tr.message { height: 2.6em; } -tr.message td.subject { padding-left: 20px; } -tr.message td.created_on { white-space: nowrap; } -tr.message td.last_message { font-size: 80%; white-space: nowrap; } -tr.message.locked td.subject { background: url(../images/locked.png) no-repeat 0 1px; } -tr.message.sticky td.subject { background: url(../images/bullet_go.png) no-repeat 0 1px; font-weight: bold; } - -tr.version.closed, tr.version.closed a { color: #999; } -tr.version td.name { padding-left: 20px;word-break: break-all; } -tr.version td.description{word-break: break-all} -tr.version.shared td.name { background: url(../images/link.png) no-repeat 0% 70%; } -tr.version td.date, tr.version td.status, tr.version td.sharing { text-align: center; white-space:nowrap; } - -tr.user td { width:13%; } -tr.user td.email { width:18%; } -tr.user td { white-space: nowrap; } -tr.user.locked, tr.user.registered { color: #aaa; } -tr.user.locked a, tr.user.registered a { color: #aaa; } - -table.permissions td.role {color:#999;font-size:90%;font-weight:normal !important;text-align:center;vertical-align:bottom;} - -tr.wiki-page-version td.updated_on, tr.wiki-page-version td.author {text-align:center;} - -tr.time-entry { text-align: center; white-space: nowrap; } -tr.time-entry td.issue, tr.time-entry td.comments { text-align: left; white-space: normal; } -td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; } -td.hours .hours-dec { font-size: 0.9em; } - -table.plugins td { vertical-align: middle; } -table.plugins td.configure { text-align: right; padding-right: 1em; } -table.plugins span.name { font-weight: bold; display: block; margin-bottom: 6px; } -table.plugins span.description { display: block; font-size: 0.9em; } -table.plugins span.url { display: block; font-size: 0.9em; } - -table.list tbody tr.group td { padding: 0.8em 0 0.5em 0.3em; font-weight: bold; border-bottom: 1px solid #ccc; } -table.list tbody tr.group span.count {position:relative; top:-1px; color:#fff; font-size:10px; background:#9DB9D5; padding:0px 6px 1px 6px; border-radius:3px; margin-left:4px;} -tr.group a.toggle-all { color: #aaa; font-size: 80%; font-weight: normal; display:none;} -tr.group:hover a.toggle-all { display:inline;} -a.toggle-all:hover {text-decoration:none;} - -table.list tbody tr:hover { background-color:#ffffdd; } -table.list tbody tr.group:hover { background-color:inherit; } -table td {padding:2px;} -table p {margin:0;} -.odd {background-color:#f6f7f8;} -.even {background-color: #fff;} - -a.sort { padding-right: 16px; background-position: 100% 50%; background-repeat: no-repeat; } -a.sort.asc { background-image: url(../images/sort_asc.png); } -a.sort.desc { background-image: url(../images/sort_desc.png); } - -table.attributes { width: 100% } -table.attributes th { vertical-align: top; text-align: left; } -table.attributes td { vertical-align: top; } - -/*table.boards a.board, h3.comments {*background: url(../images/comment.png) no-repeat 0% 50%; padding-left: 5px; }*/ -table.boards td.topic-count, table.boards td.message-count {text-align:center;} -table.boards td.last-message {font-size:80%;} - -table.messages td.author, table.messages td.created_on, table.messages td.reply-count {text-align:center;} - -table.query-columns { - border-collapse: collapse; - border: 0; -} - -table.query-columns td.buttons { - vertical-align: middle; - text-align: center; -} - -td.center {text-align:center;} - -h3.version { background: url(../images/package.png) no-repeat 0% 50%; padding-left: 20px; } - -div.issues h3 { background: url(../images/ticket.png) no-repeat 0% 50%; padding-left: 20px; } -div.members h3 { background: url(../images/group.png) no-repeat 0% 50%; padding-left: 20px; } -div.news h3 { background: url(../images/news.png) no-repeat 0% 50%; padding-left: 20px; } -div.projects h3 { background: url(../images/projects.png) no-repeat 0% 50%; padding-left: 20px; } - -#watchers ul {margin: 0; padding: 0;} -#watchers li {list-style-type:none;margin: 0px 2px 0px 0px; padding: 0px 0px 0px 0px;} -#watchers select {width: 95%; display: block;} -#watchers a.delete {opacity: 0.4; vertical-align: middle;} -#watchers a.delete:hover {opacity: 1;} -#watchers img.gravatar {margin: 0 4px 2px 0;} - -span#watchers_inputs {overflow:auto; display:block;} -span.search_for_watchers {display:block;} -span.search_for_watchers, span.add_attachment {font-size:80%; line-height:2.5em;} -span.search_for_watchers a, span.add_attachment a {padding-left:16px; background: url(../images/bullet_add.png) no-repeat 0 50%; } - - -.highlight { background-color: #FCFD8D;} -.highlight.token-1 { background-color: #faa;} -.highlight.token-2 { background-color: #afa;} -.highlight.token-3 { background-color: #aaf;} - -.box{ - padding:6px; - margin-bottom: 10px; - background-color:#f6f6f6; - color:#505050; - line-height:1.5em; - border: 1px solid #e4e4e4; -} - -div.square { - border: 1px solid #999; - float: left; - margin: .3em .4em 0 .4em; - overflow: hidden; - width: .6em; height: .6em; -} -.contextual {float:right; white-space: nowrap; line-height:1.4em;/*margin-top:5px;*/ padding-left: 10px;padding-right: 10px;padding-top: 5px; font-size:0.9em;} -.contextual input, .contextual select {font-size:0.9em;} -.message .contextual { margin-top: 0; } - -.splitcontent {overflow:auto;} -.splitcontentleft{float:left; width:49%;} -/*Added by young*/ - -.hotlist { -padding:0 15px 25px; -} -.splitcontentleft_{float:left; width:33%;} -.splitcontentright_{float:right; width:33%;} -.table{margin-top:10px;margin-left: 100px;} -.table_{margin-top:-10px; -margin-left:-10px; -} - -.splitcontentleft_{float:left; width:33%;} -.splitcontentright_{float:right; width:33%;} -.table{margin-top:10px;margin-left: 100px;} -.table_{margin-top:10px;} - -.table_font{font-size:20px;color:#DD0000} -.registerd_box{padding-left: 600px;} -.project_table{margin:0,0,0,0;margin-bottom:10px;background-color:#0ee;height:50px;} -.project_header_tag{float:right; color:#000000;} - -.project_right_tag{margin-top:44%;} -.project_homepage_tag{float:left; margin-top:9%;color:#000000;} -.project_infor_tag{/*float:auto;*/color:#000000;padding-left: 15px;} -.project_page_tag{float:right;color:#C0C0C0; font-family: '微软雅黑';font-size: 13px;} -.wiki_text{font-size:small;color:#000000;} -.user_setting{float:right; color:#000000;padding-right: 10px;} -.line_color{color:#000000;} - -.project_right_tag{margin-top:40%;} -.project_homepage_tag{padding-left:570px;color:#000000;} -.project_infor_tag{/*float:auto;*/color:#000000;padding-left: 15px; } -.project_page_tag{float:right;color:#C0C0C0; font-family: '微软雅黑';font-size: 13px;} -.wiki_text{font-size:small;color:#000000;} -.user_setting -{ - float:right; - /*color:#000000;*/ - padding-right:10px; - background-color: #CCCCBB; - border-radius: 5px 5px 5px 5px; - color: rgb(58, 88, 125) !important; - padding: 0px 4px; - margin: 3px; - display: inline-block; - font-size: 11px; - text-decoration: none; - cursor: pointer; -} -.line_color{color:#000000;} -.project_description -{ - overflow: hidden; - text-overflow:ellipsis; - width:500px; - height:50px; -} - -/*#header a {font-family:'微软雅黑', Verdana, sans-serif; font-size: 12px; color:#808080;}*/ -#login-form_new table/*Added by young*/ -{ - height: 165px; - padding:20px 25px; - background:#fff; - text-align:left; - - margin-top: 50px; - width:320px; - - /*font-family:微软雅黑,lucida grande,verdana;*/ - font-size:12px; - -webkit-border-radius:10px; - -moz-border-radius:10px; - border-radius:10px; - -moz-box-shadow:0 0 6px #039ea0; - -webkit-box-shadow:0 0 6px #039ea0; - box-shadow:0 0 6px #039ea0; - border:1px solid #AAA; - margin-left:20px; -} -/*end*/ -.splitcontentright{float:right; width:49%;} -form {display: inline;} - -/*added by bai*/ -input[type="submit"].bid_btn { - padding-bottom: 5px; - width: 55px; - height: 25px; - font-family: '微软雅黑', Arial, Helvetica, sans-serif; - font-size: 12px; - color: #fff; - padding: 0px; - background: #15bccf; - border-radius: 4px; - border: 1px solid #15bccf; - box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.2), 0px 0px 2px rgb(255, 255, 255) inset; - text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.2), 0px 1px 0px rgb(255, 255, 255); - cursor: pointer; -} - -input[type="button"].bid_btn { - /*padding-bottom: 5px;*/ - width: 55px; - height: 25px; - font-family: '微软雅黑', Arial, Helvetica, sans-serif; - font-size: 12px; - color: #fff; - padding: 0px; - background: #15bccf; - border-radius: 4px; - border: 1px solid #15bccf; - box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.2), 0px 0px 2px rgb(255, 255, 255) inset; - text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.2), 0px 1px 0px rgb(255, 255, 255); - cursor: pointer; -} -/*end */ - -fieldset {border: 1px solid #e4e4e4; margin:0;} -legend {color: #484848;} -hr { width: 100%; height: 1px; background: #ccc; border: 0; color:#000000;} -blockquote { - /*font-style: italic; */ - border-left: 1px solid #e0e0e0; - border-right: 1px solid #e0e0e0; - border-top: 1px solid #e0e0e0; - border-bottom: 1px solid #e0e0e0; - padding-left: 0.6em; - padding-top: 0.6em; - padding-right: 0.6em; - padding-bottom: 0.6em; - margin-left: 1.4em; - margin-right: 0.4em; - border-radius: 4px; - font-family: "Microsoft YaHei"; - background: url('../images/requirements/reference.jpg') -} - -blockquote blockquote { margin-left: 0;} -acronym { border-bottom: 1px dotted; cursor: help; } -textarea.wiki-edit {width:99%; resize:vertical;} -li p {margin-top: 0;} -div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;} -p.breadcrumb { font-size: 0.9em; margin: 4px 0 4px 0;} -p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; } -p.footnote { font-size: 0.9em; margin-top: 0px; margin-bottom: 0px; } - -div.issue div.subject div div { padding-left: 16px; } -div.issue div.subject p {margin: 0; margin-bottom: 0.1em; font-size: 90%; color: #999;} -div.issue div.subject>div>p { margin-top: 0.5em; } -div.issue div.subject h3 {margin: 0; margin-bottom: 0.1em;} -div.issue span.private { position:relative; bottom: 2px; text-transform: uppercase; background: #d22; color: #fff; font-weight:bold; padding: 0px 2px 0px 2px; font-size: 60%; margin-right: 2px; border-radius: 2px;} -div.issue .next-prev-links {color:#999;} -div.issue table.attributes th {width:22%;} -div.issue table.attributes td {width:28%;} - -.private_project { position:relative; bottom: 2px; text-transform: uppercase; background: #d22; color: #fff; font-weight:bold; padding: 0px 2px 0px 2px; font-size: 60%; margin-right: 2px; border-radius: 2px;} - -#issue_tree table.issues, #relations table.issues { border: 0; } -#issue_tree td.checkbox, #relations td.checkbox {display:none;} -#relations td.buttons {padding:0;} - -fieldset.collapsible { border-width: 1px 0 0 0; font-size: 0.9em; } -fieldset.collapsible>legend { padding-left: 16px; background: url(../images/arrow_expanded.png) no-repeat 0% 40%; cursor:pointer; } -fieldset.collapsible.collapsed>legend { background-image: url(../images/arrow_collapsed.png); } - -fieldset#date-range p { margin: 2px 0 2px 0; } -fieldset#filters table { border-collapse: collapse; } -fieldset#filters table td { padding: 0; vertical-align: middle; } -fieldset#filters tr.filter { height: 2.1em; } -fieldset#filters td.field { width:230px; } -fieldset#filters td.operator { width:180px; } -fieldset#filters td.operator select {max-width:170px;} -fieldset#filters td.values { white-space:nowrap; } -fieldset#filters td.values select {min-width:130px;max-width: 100px;} -fieldset#filters td.values input {height:1em;} -fieldset#filters td.add-filter { text-align: right; vertical-align: top; } - -.toggle-multiselect {/*background: url(../images/bullet_toggle_plus.png) no-repeat 0% 40%;*/ padding-left:8px; margin-left:0; cursor:pointer;} -.buttons { font-size: 0.9em; margin-bottom: 1.4em; margin-top: 1em; } - -div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;} -div#issue-changesets div.changeset { padding: 4px;} -div#issue-changesets div.changeset { border-bottom: 1px solid #ddd; } -div#issue-changesets p { margin-top: 0; margin-bottom: 1em;} - -.journal ul.details img {margin:0 0 -3px 4px;} -div.journal {overflow:auto;} -div.journal.private-notes {border-left:2px solid #d22; padding-left:4px; margin-left:-6px;} - -div#activity dl, #search-results { margin-left: 2em; } -div#activity dd, #search-results dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; } -div#activity dt, #search-results dt { margin-bottom: 0px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; } -div#activity dt.me .time { border-bottom: 1px solid #999; } -div#activity dt .time { color: #777; font-size: 80%; } -div#activity dd .description, #search-results dd .description { font-style: italic; } -div#activity span.project:after, #search-results span.project:after { content: " -"; } -div#activity dd span.description, #search-results dd span.description { display:block; color: #808080; } -div#activity dt.grouped {margin-left:5em;} -div#activity dd.grouped {margin-left:9em;} - -#search-results dd { margin-bottom: 1em; padding-left: 20px; margin-left:0px; } - -div#search-results-counts {float:right;} -div#search-results-counts ul { margin-top: 0.5em; } -div#search-results-counts li { list-style-type:none; float: left; margin-left: 1em; } - -dt.issue { background-image: url(../images/ticket.png); } -dt.issue-edit { background-image: url(../images/ticket_edit.png); } -dt.issue-closed { background-image: url(../images/ticket_checked.png); } -dt.issue-note { background-image: url(../images/ticket_note.png); } -dt.changeset { background-image: url(../images/changeset.png); } -dt.news { background-image: url(../images/news.png); } -dt.message { background-image: url(../images/message.png); } -dt.reply { background-image: url(../images/comments.png); } -dt.wiki-page { background-image: url(../images/wiki_edit.png); } -dt.attachment { background-image: url(../images/attachment.png); } -dt.document { background-image: url(../images/document.png); } -dt.project { background-image: url(../images/projects.png); } -dt.time-entry { background-image: url(../images/time.png); } - -#search-results dt.issue.closed { background-image: url(../images/ticket_checked.png); } - -div#roadmap .related-issues { margin-bottom: 1em; } -div#roadmap .related-issues td.checkbox { display: none; } -div#roadmap .wiki h1:first-child { display: none; } -div#roadmap .wiki h1 { font-size: 120%; } -div#roadmap .wiki h2 { font-size: 110%; } -body.controller-versions.action-show div#roadmap .related-issues {width:70%;} - -div#version-summary { float:right; width:28%; margin-left: 16px; margin-bottom: 16px; background-color: #fff; } -div#version-summary fieldset { margin-bottom: 1em; } -div#version-summary fieldset.time-tracking table { width:100%; } -div#version-summary th, div#version-summary td.total-hours { text-align: right; } - -table#time-report td.hours, table#time-report th.period, table#time-report th.total { text-align: right; padding-right: 0.5em; } -table#time-report tbody tr.subtotal { font-style: italic; color:#777;} -table#time-report tbody tr.subtotal td.hours { color:#b0b0b0; } -table#time-report tbody tr.total { font-weight: bold; background-color:#EEEEEE; border-top:1px solid #e4e4e4;} -table#time-report .hours-dec { font-size: 0.9em; } - -div.wiki-page .contextual a {opacity: 0.4} -div.wiki-page .contextual a:hover {opacity: 1} - -form .attributes select { width: 60%; } -input#issue_subject { width: 99%; } -select#issue_done_ratio { width: 95px; } - -ul.projects {margin:0px; padding-left:0em;}/*1em*/ -ul.projects ul {padding-left:1.6em;} -ul.projects.root {margin:0; padding:0;} - -ul.projects li {list-style-type:none;} - -ul.projects li {list-style-type:none; - - } - - -#projects-index ul.projects ul.projects { border-left: 3px solid #e0e0e0; padding-left:1em;} -#projects-index ul.projects li.root {margin-bottom: 1em;} -#projects-index ul.projects li.child {margin-top: 1em;} -#projects-index ul.projects div.root a.project {font-family:'微软雅黑', "Trebuchet MS", Verdana, sans-serif; font-weight: bold; font-size: 14px; margin: 0 0 10px 0; } -.my-project { padding-left: 18px; background: url(../images/fav.png) no-repeat 0 50%; } - -#notified-projects ul{max-height:250px; overflow-y:auto;} -#tracker_project_ids ul {max-height:250px; /*overflow-y:auto;*/} -#related-issues li img {vertical-align:middle;} - -ul.properties {padding:0; font-size: 0.9em; color: #777;} -ul.properties li {list-style-type:none;} -ul.properties li span {font-style:italic;} - -.total-hours { font-size: 110%; font-weight: bold; } -.total-hours span.hours-int { font-size: 120%; } -.gender { width: 20%; } -/*added by bai 增加了性别、地区和单位的样式 */ -#my_account_form select.gender { width: 20%; } -#my_account_form select.location {width: 31%;} -#my_account_form .occupation { width: 56%; } -/*end*/ - -/*added by bai 增加了性别、地区和单位的样式 */ -#my_account_form select.gender { width: 20%; } -#my_account_form select.location {width: 31%;} -#my_account_form .occupation { width: 56%; } -/*end*/ - -.autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em;} -/*#user_login, #user_firstname, #user_lastname, #user_mail, #my_account_form select, #user_form select, #user_identity_url { width: 45%; }*/ - -#workflow_copy_form select { width: 200px; } -table.transitions td.enabled {background: #bfb;} -table.fields_permissions select {font-size:90%} -table.fields_permissions td.readonly {background:#ddd;} -table.fields_permissions td.required {background:#d88;} - -textarea#custom_field_possible_values {width: 99%} -textarea#custom_field_default_value {width: 99%} - -input#content_comments {width: 99%} - - -p.pagination {margin-top:8px; font-size: 90%} - - -ul.courses {margin:0px; padding-left:0em;} -ul.courses ul {padding-left:1.6em;} -ul.courses.root {margin:0; padding:0;} - -ul.courses li {list-style-type:none;} - -ul.courses li {list-style-type:none;} -#courses-index ul.courses ul.courses { border-left: 3px solid #e0e0e0; padding-left:1em;} -#courses-index ul.courses li.root {margin-bottom: 1em;} -#courses-index ul.courses li.child {margin-top: 1em;} -#courses-index ul.courses div.root a.course {font-family:'微软雅黑', "Trebuchet MS", Verdana, sans-serif; font-weight: bold; font-size: 14px; margin: 0 0 10px 0; } -.my-course { padding-left: 18px; background: url(../images/fav.png) no-repeat 0 50%; } - - - -/***** Tabular forms ******/ -.tabular p{ - margin: 0; - padding: 3px 0 3px 0; - padding-left: 100px; /* width of left column containing the label elements *//*by young*/ - /*min-height: 1.8em;*/ - clear:left; -} - -.tabular .tabDiv{ - margin: 0; - padding: 3px 0 3px 0; - padding-left: 100px; /* width of left column containing the label elements *//*by young*/ - /*min-height: 1.8em;*/ - clear:left; -} - -html>body .tabular p {overflow:hidden;} - -.tabular label{ - font-weight: bold; - float: left; - text-align: right; - /* width of left column */ - margin-left: -180px; - /* width of labels. Should be smaller than left column to create some right margin */ - width: 175px; - font-size: 12px; -} - -.tabular label.floating{ - font-weight: normal; - margin-left: 0px; - text-align: left; - width: 270px; -} - -.tabular label.block{ - font-weight: normal; - margin-left: 0px !important; - text-align: left; - float: none; - display: block; - width: auto; -} - -.tabular label.inline{ - font-weight: normal; - float:none; - margin-left: 5px !important; - width: auto; -} - -label.no-css { - font-weight: inherit; - float:none; - text-align:left; - margin-left:0px; - width:auto; -} -input#time_entry_comments { width: 90%;} - -#preview fieldset {margin-top: 1em; background: url(../images/draft.png)} - -.tabular.settings p{ padding-left: 300px; } -.tabular.settings label{ margin-left: -300px; width: 295px; } -.tabular.settings textarea { width: 99%; } - -.settings.enabled_scm table {width:100%} -.settings.enabled_scm td.scm_name{ font-weight: bold; } - -fieldset.settings label { display: block; } -fieldset#notified_events .parent { padding-left: 20px; } - -span.required {color: #bb0000;} -.summary {font-style: italic;} - -#attachments_fields input.description {margin-left:4px; width:100px; } -#attachments_fields span {display:block; white-space:nowrap;} -#attachments_fields span .boldSpan{display:block; white-space:nowrap; font-family:'微软雅黑';} -#attachments_fields input.filename {border:0; height:1.8em; width:150px; color:#555; background-color:inherit; background:url(../images/attachment.png) no-repeat 1px 50%; padding-left:18px;}/*Modified by young*/ -#attachments_fields .ajax-waiting input.filename {background:url(../images/hourglass.png) no-repeat 0px 50%;} -#attachments_fields .ajax-loading input.filename {background:url(../images/loading.gif) no-repeat 0px 50%;} -#attachments_fields div.ui-progressbar { width: 100px; height:14px; margin: 2px 0 -5px 8px; display: inline-block; } -a.remove-upload {background: url(../images/delete.png) no-repeat 1px 50%; width:1px; display:inline-block; padding-left:16px;} -a.remove-upload:hover {text-decoration:none !important;} -#attachments_fields input.is_public_checkbox {width:20px;} -#attachments_fields span.ispublic-label {display:inline-block;width:30px;margin-left:10px; } - -/*gcm upload file count and deleteall*/ -#upload_file_count #count {color:red; font-size:1.5em;} -span.add_attachment .remove_all {background:none;background: url(../images/delete.png) no-repeat 1px 50%; width:1px; display:inline-block;right:10%;text-decoration:none;} - - -div.fileover { background-color: lavender; } - -div.attachments { margin-top: 12px; } -div.attachments p { margin:4px 0 2px 0; } -div.attachments img { vertical-align: middle; } -div.attachments span.author { font-size: 0.9em; color: #888; } - -div.thumbnails {margin-top:0.6em;} -div.thumbnails div {background:#fff;border:2px solid #ddd;display:inline-block;margin-right:2px;} -div.thumbnails img {margin: 3px;} - -p.other-formats { text-align: right; font-size:0.9em; color: #666; } -.other-formats span + span:before { content: "| "; } - -a.atom { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; } - -/*modified by bai 改变了字体颜色和加粗*/ -em.info {font-style:normal; font-size:90%; color:#505050; font-weight:bold; display:block;} -em.info.error {padding-left:20px; background:url(../images/exclamation.png) no-repeat 0 50%;} -/*end*/ -textarea.text_cf {width:90%;} - -#tab-content-modules fieldset p {margin:3px 0 4px 0;} - -#tab-content-members .splitcontentleft, #tab-content-memberships .splitcontentleft, #tab-content-users .splitcontentleft {width: 64%;} -#tab-content-members .splitcontentright, #tab-content-memberships .splitcontentright, #tab-content-users .splitcontentright {width: 34%;} -#tab-content-members fieldset, #tab-content-memberships fieldset, #tab-content-users fieldset {padding:1em; margin-bottom: 1em;} -#tab-content-members fieldset legend, #tab-content-memberships fieldset legend, #tab-content-users fieldset legend {font-weight: bold; font-size: 12px} -#tab-content-members fieldset label, #tab-content-memberships fieldset label, #tab-content-users fieldset label {display: block;} -#tab-content-members #principals, #tab-content-users #principals {max-height: 400px; overflow: auto;} - -#users_for_watcher {height: 200px; overflow:auto;} -#users_for_watcher label {display: block;} - -table.members td.group { padding-left: 20px; background: url(../images/group.png) no-repeat 0% 50%; } - -input#principal_search, input#user_search {width:90%} - -input.autocomplete { - background: #fff url(../images/magnifier.png) no-repeat right 50%; padding-left:20px; - border:1px solid #9EB1C2; border-radius:2px; height:1.5em; -} -input.autocomplete.ajax-loading { - background-image: url(../images/loading.gif); -} - -/***** Flash & error messages ****/ -#errorExplanation, div.flash, .nodata, .warning, .conflict { - padding: 4px 4px 4px 30px; - margin-bottom: 12px; - font-size: 1.1em; - border: 2px solid; -} - -div.flash {margin-top: 8px;} - -div.flash.error, #errorExplanation { - background: url(../images/exclamation.png) 8px 50% no-repeat; - background-color: #ffe3e3; - border-color: #dd0000; - color: #880000; -} - -div.flash.notice { - background: url(../images/true.png) 8px 5px no-repeat; - background-color: #dfffdf; - border-color: #9fcf9f; - color: #005f00; -} - -div.flash.warning, .conflict { - background: url(../images/warning.png) 8px 5px no-repeat; - background-color: #FFEBC1; - border-color: #FDBF3B; - color: #A6750C; - text-align: left; -} - -.nodata, .warning { - text-align: center; - background-color: #FFEBC1; - border-color: #FDBF3B; - color: #A6750C; -} - -#errorExplanation ul { font-size: 0.9em;} -#errorExplanation h2, #errorExplanation p { display: none; } - -.conflict-details {font-size:80%;} - -/***** Ajax indicator ******/ -#ajax-indicator { -position: absolute; /* fixed not supported by IE */ -background-color:#eee; -border: 1px solid #bbb; -top:35%; -left:40%; -width:20%; -font-weight:bold; -text-align:center; -padding:0.6em; -z-index:100; -opacity: 0.5; -} - -html>body #ajax-indicator { position: fixed; } - -#ajax-indicator span { -background-position: 0% 40%; -background-repeat: no-repeat; -background-image: url(../images/loading.gif); -padding-left: 26px; -vertical-align: bottom; -} - -/***** Calendar *****/ -table.cal {border-collapse: collapse; width: 100%; margin: 0px 0 6px 0;border: 1px solid #d7d7d7;} -table.cal thead th {width: 14%; background-color:#EEEEEE; padding: 4px; } -table.cal thead th.week-number {width: auto;} -table.cal tbody tr {height: 100px;} -table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;} -table.cal td.week-number { background-color:#EEEEEE; padding: 4px; border:none; font-size: 1em;} -table.cal td p.day-num {font-size: 1.1em; text-align:right;} -table.cal td.odd p.day-num {color: #bbb;} -table.cal td.today {background:#ffffdd;} -table.cal td.today p.day-num {font-weight: bold;} -table.cal .starting a, p.cal.legend .starting {background: url(../images/bullet_go.png) no-repeat -1px -2px; padding-left:16px;} -table.cal .ending a, p.cal.legend .ending {background: url(../images/bullet_end.png) no-repeat -1px -2px; padding-left:16px;} -table.cal .starting.ending a, p.cal.legend .starting.ending {background: url(../images/bullet_diamond.png) no-repeat -1px -2px; padding-left:16px;} -p.cal.legend span {display:block;} - -/***** Tooltips ******/ -.tooltip{position:relative;z-index:24;} -.tooltip:hover{z-index:25;color:#000;} -.tooltip span.tip{display: none; text-align:left;} - -div.tooltip:hover span.tip{ -display:block; -position:absolute; -top:12px; left:24px; width:270px; -border:1px solid #555; -background-color:#fff; -padding: 4px; -font-size: 0.8em; -color:#505050; -} - -img.ui-datepicker-trigger { - cursor: pointer; - vertical-align: middle; - margin-left: 4px; -} - -/***** Progress bar *****/ -table.progress { - border-collapse: collapse; - border-spacing: 0pt; - empty-cells: show; - text-align: center; - float:left; - margin: 1px 6px 1px 0px; -} - -table.progress td { height: 1em; } -table.progress td.closed { background: #BAE0BA none repeat scroll 0%; } -table.progress td.done { background: #D3EDD3 none repeat scroll 0%; } -table.progress td.todo { background: #eee none repeat scroll 0%; } -p.percent {font-size: 80%;} -p.progress-info {clear: left; font-size: 80%; margin-top:-4px; color:#777;} - -#roadmap table.progress td { height: 1.2em; } -/***** Tabs *****/ -#content .tabs {height: 2.6em; margin-bottom:1.2em; position:relative; overflow:hidden;} -#content .tabs ul {margin:0; position:absolute; bottom:0; padding-left:0.5em; font-family: 14px; width:2000px; border-bottom: 1px solid #15BCCF;} -#content .tabs ul li { - float:left; - list-style-type:none; - white-space:nowrap; - margin-right:0px; - background:#fff; - position:relative; - margin-bottom:-1px; -} -#content .tabs ul li a{ - display:block; - font-size: 14px; - text-decoration: none; - line-height:1.3em; - padding:2px 6px 2px 6px; - background-color:#fff; - color:#606060; - font-weight:bold; - border-top-left-radius:3px; - border-top-right-radius:3px; -} - -#content .tabs ul li a:hover { - background-color: #fff; - text-decoration:none; -} - -#content .tabs ul li a.selected { - background-color: #fff; - border: 1px solid #15BCCF; - border-bottom: 1px solid #fff; - color:#111; -} - -#content .tabs ul li a.selected:hover {background-color: #E2F4FF;} - -div.tabs-buttons { position:absolute; right: 0; width: 48px; height: 24px; background: white; bottom: 0; border-bottom: 1px solid #bbbbbb; } - -button.tab-left, button.tab-right { - font-size: 0.9em; - cursor: pointer; - height:24px; - border: 1px solid #ccc; - border-bottom: 1px solid #bbbbbb; - position:absolute; - padding:4px; - width: 20px; - bottom: -1px; - -} - -button.tab-left { - right: 20px; - background: #eeeeee url(../images/bullet_arrow_left.png) no-repeat 50% 50%; - border-top-left-radius:3px; -} - -button.tab-right { - right: 0; - background: #eeeeee url(../images/bullet_arrow_right.png) no-repeat 50% 50%; - border-top-right-radius:3px; -} -/*added by young*/ -/***** Settings Tabs *****/ -/*modified by huang*/ -#content .tabs_new {height: 2.6em; margin-bottom:1.2em; margin-top: 0.8em; position:relative; overflow:hidden;} -#content .tabs_new ul {margin:0; position:absolute; bottom:0; padding-left: 0.5em; width: 100%; border-bottom: 1px solid #15BCCF;font-size:14px;} -#content .tabs_new ul li { - width:80px; /*modified by linchun*/ - float:left; - list-style-type:none; - white-space:nowrap; - margin-right:4px; - background:#fff; - position:relative; - margin-bottom:-1px; -} -#content .tabs_new ul li a{ - display:block; - font-size: 15px; - text-decoration:none; - line-height:1.2em; - padding-top: 6px; - padding-bottom: 2px; - text-align: center; - border: 1px solid #15BCCF; - /*border-bottom: 0px solid #15BCCF;*/ - - color:#606060; - font-weight:bold; - border-top-left-radius:4px; - border-top-right-radius:4px; - /*new added*/ - margin-top: 16px; - /*end*/ -} - -#content .tabs_new ul li a:hover { - background-color: #E2F4FF; - text-decoration:none; -} - -#content .tabs_new ul li a.selected { - background-color: rgba(28, 158, 199, 0.68); - border: 1px solid #15BCCF; - border-bottom: 1px solid #fff; - color:#FFF; -} - -#content .tabs_new ul li a.selected:hover {background-color: #15BCCC;} - -div.tabs_new-buttons { position:absolute; right: 0; width: 48px; height: 24px; background: white; bottom: 0; border-bottom: 1px solid #bbbbbb; } - -button.tab_new-left, button.tab_new-right { - font-size: 0.9em; - cursor: pointer; - height:24px; - border: 1px solid #ccc; - border-bottom: 1px solid #bbbbbb; - position:absolute; - padding:4px; - width: 20px; - bottom: -1px; -} - -button.tab_new-left { - right: 20px; - background: #eeeeee url(../images/bullet_arrow_left.png) no-repeat 50% 50%; - border-top-left-radius:3px; -} - -button.tab_new-right { - right: 0; - background: #eeeeee url(../images/bullet_arrow_right.png) no-repeat 50% 50%; - border-top-right-radius:3px; -} - - -/*added by huang*/ -#content .tabs_new_enterprise {height: 2.6em; margin-bottom:1.2em; margin-top: 0.8em; position:relative; overflow:hidden;} -#content .tabs_new_enterprise ul {margin:0; position:absolute; bottom:0; padding-left: 0.5em; width: 2000px; border-bottom: 1px solid #ac344f;font-size:14px;} -#content .tabs_new_enterprise ul li { - width:85px; /*modified by linchun*/ - float:left; - list-style-type:none; - white-space:nowrap; - margin-right:4px; - background:#fff; - position:relative; - margin-bottom:-1px; -} -#content .tabs_new_enterprise ul li a{ - display:block; - font-size: 15px; - text-decoration:none; - line-height:1.2em; - padding-top: 6px; - padding-bottom: 2px; - text-align: center; - - border: 1px solid #b60003; - /*border-bottom: 0px solid #15BCCF;*/ - - color:#606060; - font-weight:bold; - border-top-left-radius:4px; - border-top-right-radius:4px; -} - -#content .tabs_new_enterprise ul li a:hover { - background-color: #cda3ad; - text-decoration:none; -} - -#content .tabs_new_enterprise ul li a.selected { - background-color: #9f4056; - border: 1px solid #ac344f; - border-bottom: 1px solid #fff; - color:#FFF; -} - -#content .tabs_new_enterprise ul li a.selected:hover {background-color: #ac344f;} - -div.tabs_new_enterprise-buttons { position:absolute; right: 0; width: 48px; height: 24px; background: white; bottom: 0; border-bottom: 1px solid #bbbbbb; } - -button.tabs_new_enterprise-left, button.tabs_new_enterprise-right { - font-size: 0.9em; - cursor: pointer; - height:24px; - border: 1px solid #ccc; - border-bottom: 1px solid #bbbbbb; - position:absolute; - padding:4px; - width: 20px; - bottom: -1px; -} - -button.tabs_new_enterprise-left { - right: 20px; - background: #eeeeee url(../images/bullet_arrow_left.png) no-repeat 50% 50%; - border-top-left-radius:3px; -} - -button.tabs_new_enterprise-right { - right: 0; - background: #eeeeee url(../images/bullet_arrow_right.png) no-repeat 50% 50%; - border-top-right-radius:3px; -} -/*end*/ -/*added by huang*/ -#content_ .tabs {height: 3.5em; margin-bottom:1.2em; position:relative; overflow:hidden;} -#content_ .tabs ul {margin:0; position:absolute; bottom:0; padding-left:0.5em; width:2000px; border-bottom: 1px solid #15BCCF;font-size:14px;} -#content_ .tabs ul li { - float:left; - list-style-type:none; - white-space:nowrap; - margin-right:0px; - background:#fff; - position:relative; - margin-bottom:-1px; -} -#content_ .tabs ul li a{ - - display:block; - font-size: 13px; - text-decoration: none; - line-height:1.3em; - padding:4px 6px 4px 6px; - background-color:#fff; - color:#606060; - font-weight:bold; - border-top-left-radius:3px; - border-top-right-radius:3px; -} - -#content_ .tabs ul li a:hover { - background-color: #fff; - text-decoration:none; -} - -#content_ .tabs ul li a.selected { - background-color: #fff; - border: 1px solid #15BCCF; - border-bottom: 1px solid #fff; - color:#111; -} - -#content_ .tabs ul li a.selected:hover {background-color: #E2F4FF;} -/*end*/ -/*added by huang*/ -#content_ .tabs_enterprise {height: 3.5em; margin-bottom:1.2em; position:relative; overflow:hidden;} -#content_ .tabs_enterprise ul {margin:0; position:absolute; bottom:0; padding-left:0.5em; width:2000px; border-bottom: 1px solid #bc7787;font-size:14px;} -#content_ .tabs_enterprise ul li { - float:left; - list-style-type:none; - white-space:nowrap; - margin-right:0px; - background:#fff; - position:relative; - margin-bottom:-1px; -} -#content_ .tabs_enterprise ul li a{ - - display:block; - font-size: 13px; - text-decoration: none; - line-height:1.3em; - padding:4px 6px 4px 6px; - background-color:#fff; - color:#606060; - font-weight:bold; - border-top-left-radius:3px; - border-top-right-radius:3px; -} - -#content_ .tabs_enterprise ul li a:hover { - background-color: #fff; - text-decoration:none; -} - -#content_ .tabs_enterprise ul li a.selected { - background-color: #fff; - border: 1px solid #bc7787; - border-bottom: 1px solid #fff; - color:#111; -} - -#content_ .tabs_enterprise ul li a.selected:hover {background-color: #E2F4FF;} -/*end*/ -/*end*/ -/***** Diff *****/ -.diff_out { background: #fcc; } -.diff_out span { background: #faa; } -.diff_in { background: #cfc; } -.diff_in span { background: #afa; } - -.text-diff { - padding: 1em; - background-color:#f6f6f6; - color:#505050; - border: 1px solid #e4e4e4; -} - -/***** Wiki *****/ -div.wiki table { - border-collapse: collapse; - margin-bottom: 1em; -} - -div.wiki table, div.wiki td, div.wiki th { - border: 1px solid #bbb; - padding: 4px; -} - -div.wiki .noborder, div.wiki .noborder td, div.wiki .noborder th {border:0;} - -div.wiki .external { - background-position: 0% 60%; - background-repeat: no-repeat; - padding-left: 12px; - background-image: url(../images/external.png); -} - -div.wiki a.new {color: #b73535;} - -div.wiki ul, div.wiki ol {margin-bottom:1em;} - -div.wiki pre { - margin: 1em 1em 1em 1.6em; - padding: 8px; - background-color: #fafafa; - border: 1px solid #e2e2e2; - width:auto; - overflow-x: auto; - overflow-y: hidden; -} - -div.wiki ul.toc { - background-color: #ffffdd; - border: 1px solid #e4e4e4; - padding: 4px; - line-height: 1.2em; - margin-bottom: 12px; - margin-right: 12px; - margin-left: 0; - display: table -} -* html div.wiki ul.toc { width: 50%; } /* IE6 doesn't autosize div */ - -div.wiki ul.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; } -div.wiki ul.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; } -div.wiki ul.toc ul { margin: 0; padding: 0; } -div.wiki ul.toc li {list-style-type:none; margin: 0; font-size:12px;} -div.wiki ul.toc li li {margin-left: 1.5em; font-size:10px;} -div.wiki ul.toc a { - font-size: 0.9em; - font-weight: normal; - text-decoration: none; - color: #606060; -} -div.wiki ul.toc a:hover { color: #c61a1a; text-decoration: underline;} - -a.wiki-anchor { display: none; margin-left: 6px; text-decoration: none; } -a.wiki-anchor:hover { color: #aaa !important; text-decoration: none; } -h1:hover a.wiki-anchor, h2:hover a.wiki-anchor, h3:hover a.wiki-anchor { display: inline; color: #ddd; } - -div.wiki img { vertical-align: middle; } - -/***** My page layout *****/ -.block-receiver { - border:1px dashed #c0c0c0; - margin-bottom: 20px; - padding: 15px 0 15px 0; -} - -.mypage-box { - margin:0 0 20px 0; - color:#505050; - line-height:1.5em; -} - -.handle {cursor: move;} - -a.close-icon { - display:block; - margin-top:3px; - overflow:hidden; - width:12px; - height:12px; - background-repeat: no-repeat; - cursor:pointer; - background-image:url('../images/close.png'); -} -a.close-icon:hover {background-image:url('../images/close_hl.png');} - -/***** Gantt chart *****/ -.gantt_hdr { - position:absolute; - top:0; - height:16px; - border-top: 1px solid #c0c0c0; - border-bottom: 1px solid #c0c0c0; - border-right: 1px solid #c0c0c0; - text-align: center; - overflow: hidden; -} - -.gantt_hdr.nwday {background-color:#f1f1f1;} - -.gantt_subjects { font-size: 0.8em; } -.gantt_subjects div { line-height:16px;height:16px;overflow:hidden;white-space:nowrap;text-overflow: ellipsis; } - -.task { - position: absolute; - height:8px; - font-size:0.8em; - color:#888; - padding:0; - margin:0; - line-height:16px; - white-space:nowrap; -} - -.task.label {width:100%;} -.task.label.project, .task.label.version { font-weight: bold; } - -.task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; } -.task_done { background:#00c600 url(../images/task_done.png); border: 1px solid #00c600; } -.task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; } - -.task_todo.parent { background: #888; border: 1px solid #888; height: 3px;} -.task_late.parent, .task_done.parent { height: 3px;} -.task.parent.marker.starting { position: absolute; background: url(../images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-left: -4px; left: 0px; top: -1px;} -.task.parent.marker.ending { position: absolute; background: url(../images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-left: -4px; right: 0px; top: -1px;} - -.version.task_late { background:#f66 url(../images/milestone_late.png); border: 1px solid #f66; height: 2px; margin-top: 3px;} -.version.task_done { background:#00c600 url(../images/milestone_done.png); border: 1px solid #00c600; height: 2px; margin-top: 3px;} -.version.task_todo { background:#fff url(../images/milestone_todo.png); border: 1px solid #fff; height: 2px; margin-top: 3px;} -.version.marker { background-image:url(../images/version_marker.png); background-repeat: no-repeat; border: 0; margin-left: -4px; margin-top: 1px; } - -.project.task_late { background:#f66 url(../images/milestone_late.png); border: 1px solid #f66; height: 2px; margin-top: 3px;} -.project.task_done { background:#00c600 url(../images/milestone_done.png); border: 1px solid #00c600; height: 2px; margin-top: 3px;} -.project.task_todo { background:#fff url(../images/milestone_todo.png); border: 1px solid #fff; height: 2px; margin-top: 3px;} -.project.marker { background-image:url(../images/project_marker.png); background-repeat: no-repeat; border: 0; margin-left: -4px; margin-top: 1px; } - -.version-behind-schedule a, .issue-behind-schedule a {color: #f66914;} -.version-overdue a, .issue-overdue a, .project-overdue a {color: #f00;} - -/***** Icons *****/ -.icon { - background-position: 0% 50%; - background-repeat: no-repeat; - font-family: '微软雅黑'; /*modify by men*/ - padding-left: 20px; - padding-top: 2px; - padding-bottom: 3px; -} -.icon_enterprise { - background-position: 0% 50%; - background-repeat: no-repeat; - font-family: '微软雅黑'; /*modify by men*/ - padding-left: 20px; - padding-top: 2px; - padding-bottom: 3px; -} -.icon_enterprise-add { background-image: url(../images/add_enterprise.png); } -.icon-add { background-image: url(../images/add.png); } -.icon-edit { /*background-image: url(../images/edit.png);*/ } -.icon-copy { background-image: url(../images/copy.png); } -.icon-duplicate { background-image: url(../images/duplicate.png); } -.icon-del { /*background-image: url(../images/delete.png); */} -.icon-move { background-image: url(../images/move.png); } -.icon-save { background-image: url(../images/save.png); } -.icon-cancel { background-image: url(../images/cancel.png); } -.icon-multiple { background-image: url(../images/table_multiple.png); } -.icon-folder { background-image: url(../images/folder.png); } -.open .icon-folder { background-image: url(../images/folder_open.png); } -.icon-package { background-image: url(../images/package.png); } -.icon-user { background-image: url(../images/user.png); } -.icon-projects { background-image: url(../images/projects.png); } -.icon-help { background-image: url(../images/help.png); } -.icon-attachment { background-image: url(../images/attachment.png); } -.icon-history { background-image: url(../images/history.png); } -.icon-time { background-image: url(../images/time.png); } -.icon-time-add { background-image: url(../images/time_add.png); } -.icon-stats { background-image: url(../images/stats.png); } -.icon-warning { background-image: url(../images/warning.png); } -.icon-fav { background-image: url(../images/fav.png); } -.icon-fav-off { background-image: url(../images/fav_off.png); } -.icon-reload { background-image: url(../images/reload.png); } -.icon-lock { background-image: url(../images/locked.png); } -.icon-unlock { background-image: url(../images/unlock.png); } -.icon-checked { background-image: url(../images/true.png); } -.icon-details { background-image: url(../images/zoom_in.png); } -.icon-report { background-image: url(../images/report.png); } -.icon-comment { /*background-image: url(../images/comment.png); */} -.icon-summary { background-image: url(../images/lightning.png); } -.icon-server-authentication { background-image: url(../images/server_key.png); } -.icon-issue { background-image: url(../images/ticket.png); } -.icon-zoom-in { background-image: url(../images/zoom_in.png); } -.icon-zoom-out { background-image: url(../images/zoom_out.png); } -.icon-passwd { background-image: url(../images/textfield_key.png); } -.icon-test { background-image: url(../images/bullet_go.png); } - -.icon-file { background-image: url(../images/files/default.png); } -.icon-file.text-plain { background-image: url(../images/files/text.png); } -.icon-file.text-x-c { background-image: url(../images/files/c.png); } -.icon-file.text-x-csharp { background-image: url(../images/files/csharp.png); } -.icon-file.text-x-java { background-image: url(../images/files/java.png); } -.icon-file.text-x-javascript { background-image: url(../images/files/js.png); } -.icon-file.text-x-php { background-image: url(../images/files/php.png); } -.icon-file.text-x-ruby { background-image: url(../images/files/ruby.png); } -.icon-file.text-xml { background-image: url(../images/files/xml.png); } -.icon-file.text-css { background-image: url(../images/files/css.png); } -.icon-file.text-html { background-image: url(../images/files/html.png); } -.icon-file.image-gif { background-image: url(../images/files/image.png); } -.icon-file.image-jpeg { background-image: url(../images/files/image.png); } -.icon-file.image-png { background-image: url(../images/files/image.png); } -.icon-file.image-tiff { background-image: url(../images/files/image.png); } -.icon-file.application-pdf { background-image: url(../images/files/pdf.png); } -.icon-file.application-zip { background-image: url(../images/files/zip.png); } -.icon-file.application-x-gzip { background-image: url(../images/files/zip.png); } - -img.gravatar { - padding: 2px; - border: solid 1px #d5d5d5; - background: #fff; - vertical-align: middle; -} - -div.issue img.gravatar { - float: left; - margin: 0 6px 0 0; - padding: 5px; -} - -div.issue table img.gravatar { - height: 14px; - width: 14px; - padding: 2px; - float: left; - margin: 0 0.5em 0 0; -} - -h2 img.gravatar {margin: -2px 4px -4px 0;} -h3 img.gravatar {margin: -4px 4px -4px 0;} -h4 img.gravatar {margin: -6px 4px -4px 0;} -td.username img.gravatar {margin: 0 0.5em 0 0; vertical-align: top;} -#activity dt img.gravatar {float: left; margin: 0 1em 1em 0;} -/* Used on 12px Gravatar img tags without the icon background */ -.icon-gravatar {float: left; margin-right: 4px;} - -#activity dt, .journal {clear: left;} - -.journal-link {float: right;} - -h2 img { vertical-align:middle; } - -.hascontextmenu { cursor: context-menu; } - -/************* CodeRay styles *************/ -.syntaxhl div {display: inline;} -.syntaxhl .line-numbers {padding: 2px 4px 2px 4px; background-color: #eee; margin:0px 5px 0px 0px;} -.syntaxhl .code pre { overflow: auto } -.syntaxhl .debug { color: white !important; background: blue !important; } - -.syntaxhl .annotation { color:#007 } -.syntaxhl .attribute-name { color:#b48 } -.syntaxhl .attribute-value { color:#700 } -.syntaxhl .binary { color:#509 } -.syntaxhl .char .content { color:#D20 } -.syntaxhl .char .delimiter { color:#710 } -.syntaxhl .char { color:#D20 } -.syntaxhl .class { color:#258; font-weight:bold } -.syntaxhl .class-variable { color:#369 } -.syntaxhl .color { color:#0A0 } -.syntaxhl .comment { color:#385 } -.syntaxhl .comment .char { color:#385 } -.syntaxhl .comment .delimiter { color:#385 } -.syntaxhl .complex { color:#A08 } -.syntaxhl .constant { color:#258; font-weight:bold } -.syntaxhl .decorator { color:#B0B } -.syntaxhl .definition { color:#099; font-weight:bold } -.syntaxhl .delimiter { color:black } -.syntaxhl .directive { color:#088; font-weight:bold } -.syntaxhl .doc { color:#970 } -.syntaxhl .doc-string { color:#D42; font-weight:bold } -.syntaxhl .doctype { color:#34b } -.syntaxhl .entity { color:#800; font-weight:bold } -.syntaxhl .error { color:#F00; background-color:#FAA } -.syntaxhl .escape { color:#666 } -.syntaxhl .exception { color:#C00; font-weight:bold } -.syntaxhl .float { color:#06D } -.syntaxhl .function { color:#06B; font-weight:bold } -.syntaxhl .global-variable { color:#d70 } -.syntaxhl .hex { color:#02b } -.syntaxhl .imaginary { color:#f00 } -.syntaxhl .include { color:#B44; font-weight:bold } -.syntaxhl .inline { background-color: hsla(0,0%,0%,0.07); color: black } -.syntaxhl .inline-delimiter { font-weight: bold; color: #666 } -.syntaxhl .instance-variable { color:#33B } -.syntaxhl .integer { color:#06D } -.syntaxhl .key .char { color: #60f } -.syntaxhl .key .delimiter { color: #404 } -.syntaxhl .key { color: #606 } -.syntaxhl .keyword { color:#939; font-weight:bold } -.syntaxhl .label { color:#970; font-weight:bold } -.syntaxhl .local-variable { color:#963 } -.syntaxhl .namespace { color:#707; font-weight:bold } -.syntaxhl .octal { color:#40E } -.syntaxhl .operator { } -.syntaxhl .predefined { color:#369; font-weight:bold } -.syntaxhl .predefined-constant { color:#069 } -.syntaxhl .predefined-type { color:#0a5; font-weight:bold } -.syntaxhl .preprocessor { color:#579 } -.syntaxhl .pseudo-class { color:#00C; font-weight:bold } -.syntaxhl .regexp .content { color:#808 } -.syntaxhl .regexp .delimiter { color:#404 } -.syntaxhl .regexp .modifier { color:#C2C } -.syntaxhl .regexp { background-color:hsla(300,100%,50%,0.06); } -.syntaxhl .reserved { color:#080; font-weight:bold } -.syntaxhl .shell .content { color:#2B2 } -.syntaxhl .shell .delimiter { color:#161 } -.syntaxhl .shell { background-color:hsla(120,100%,50%,0.06); } -.syntaxhl .string .char { color: #46a } -.syntaxhl .string .content { color: #46a } -.syntaxhl .string .delimiter { color: #46a } -.syntaxhl .string .modifier { color: #46a } -.syntaxhl .symbol .content { color:#d33 } -.syntaxhl .symbol .delimiter { color:#d33 } -.syntaxhl .symbol { color:#d33 } -.syntaxhl .tag { color:#070 } -.syntaxhl .type { color:#339; font-weight:bold } -.syntaxhl .value { color: #088; } -.syntaxhl .variable { color:#037 } - -.syntaxhl .insert { background: hsla(120,100%,50%,0.12) } -.syntaxhl .delete { background: hsla(0,100%,50%,0.12) } -.syntaxhl .change { color: #bbf; background: #007; } -.syntaxhl .head { color: #f8f; background: #505 } -.syntaxhl .head .filename { color: white; } - -.syntaxhl .delete .eyecatcher { background-color: hsla(0,100%,50%,0.2); border: 1px solid hsla(0,100%,45%,0.5); margin: -1px; border-bottom: none; border-top-left-radius: 5px; border-top-right-radius: 5px; } -.syntaxhl .insert .eyecatcher { background-color: hsla(120,100%,50%,0.2); border: 1px solid hsla(120,100%,25%,0.5); margin: -1px; border-top: none; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; } - -.syntaxhl .insert .insert { color: #0c0; background:transparent; font-weight:bold } -.syntaxhl .delete .delete { color: #c00; background:transparent; font-weight:bold } -.syntaxhl .change .change { color: #88f } -.syntaxhl .head .head { color: #f4f } - -/***** Media print specific styles *****/ -@media print { - #top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; } - #main { background: #fff; } - #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; overflow: visible !important;} - #wiki_add_attachment { display:none; } - .hide-when-print { display: none; } - .autoscroll {overflow-x: visible;} - table.list {margin-top:0.5em;} - table.list th, table.list td {border: 1px solid #aaa;} -} - -/* Accessibility specific styles */ -.hidden-for-sighted { - position:absolute; - left:-10000px; - top:auto; - width:1px; - height:1px; - overflow:hidden; -} - -/*added by william*/ -#tag { - background: url(../images/issue_tag.png) no-repeat right -19px; - border-radius: 3px; - color: #3a587d !important; - padding: 1px 4px 2px 4px; - margin: 3px; - display: inline-block; - font-size: 13px; /*modified by linchun*/ - text-decoration: none; - cursor: pointer; -} - -/*tanxianbo*/ -div.repos_explain{ - word-wrap: normal; - line-height: 8px; - font-size: 13px; - background-color: #f8f8f8; - border: 1px solid #ddd; - overflow: auto; - border-radius: 3px; - padding: 6px 10px; - font-family: Consolas, 'Liberation Mono', Courier, monospace; - color: rgb(51, 51, 51); -} -#admin-index{ - margin-left: -220px; -} - -/* new linchun compitition */ -.contest_underline{ - margin:1; - padding:1; - width:900px; - height:0.5px; - background-color:#aaa; - overflow:hidden -} - -.underline-contests_one{ - margin-bottom: 10px; - border-bottom: 1px dashed rgb(204, 204, 204); - width: 930px; -} -.underline-contests_two{ - margin-bottom: 10px; - border-bottom: 1px dashed rgb(204, 204, 204); - width: 660px; -} -.underline-contests_three{ - margin-bottom: 10px; - border-bottom: 1px dashed rgb(204, 204, 204); - width: 688px; -} -.underline-contests_four{ - margin-bottom: 10px; - border-bottom: 1px dashed rgb(204, 204, 204); - width: 349px; - padding-bottom:5px -} -.contest-star{ - color: #bb0000; -} - -.contes-new-box{ - background: #fcfcfc; - padding-left: 85px; - padding-top: 20px; - padding-bottom: 20px; -} +html {overflow-y:scroll;} +body { font-family:'微软雅黑', Verdana, sans-serif; font-size: 13px; color:#484848; margin: 0; padding: 0; min-width: 900px; } /*modified by linchun*/ + +h1, h2, h3, h4 {font-family: '微软雅黑', "Trebuchet MS", Verdana, sans-serif;padding: 2px 10px 1px 0px;margin: 0 0 10px 0;} +#content h1, h2, h3, h4 {color: #555;} +h2, .wiki h1 {font-size: 20px;} +h3, .wiki h2 {font-size: 15px; padding-left: 5px} +h4, .wiki h3 {font-size: 13px;} +h4 {border-bottom: 1px dotted #bbb;} +/*huang*/ +/*current position*/ +.contest_count{ + width: 20%; + height: 60px; + border: 1px solid #15bccf; + border-radius: 5px 5px 5px 5px; + float:right; +} + +.top-content{ + background-color: #f7f7f7; + height: 56px; + width: 940px; + line-height: 1.2em; + padding-top: 6px; + margin-bottom: 10px; +} + +div.position-f{ + padding-left: 8px; + float: left; + width: 238px; + line-height: 0.5em; + vertical-align: middle; + alignment-adjust: middle; + alignment-adjust: middle; +} + +div.position-f p.font{ + font-family: "Microsoft YaHei"; + font-weight: bold; + font-size: 16px; + color: #15bccf; +} + +div.position-s{ + float: left; + width: 430px; + line-height: 0.5em; +} + +div.position-s p.font{ + color: #15bccf; + font-weight: bold; +} + +div.position-t{ + padding-top: 13px; + float: left; + width: 238px; + line-height: 0.5em; +} + +/*end current position*/ +/*new sidebar*/ +div.sidebar-user{ + float: left; + padding-left: 8px; + border-bottom: 1px solid #15bccf; +} + +.inf-user-image{ + padding-left:8px; + margin:0px; + background-color:#fff; + height: auto; + padding-bottom: 8px; + float: left; +} +.inf-user-image img.avatar2{ + background: rgb(245, 245, 245); + padding: 4px; + border: 1px solid #e5dfc7; + float: left; + display: block; + height:80px; + width: 80px; + +} + +.sidebar-f{ + width: 238px; + float: left; + margin:0px; + background-color:#fff; + height: auto; + padding-bottom: 8px; +} + +div.sidebar-f div.name{ + float: left; + padding-left: 8px; + font-family:"Microsoft YaHei"; + font-weight:bold; + font-size:16px; + color:#4d4d4d; + word-wrap: break-word; + word-break: break-all; +} + +div.sidebar-f p.watch{ + padding-left: 3px; +} + +div.sidebar-s{ + line-height: 1em; +} + +div.sidebar-s p.mail{ + width: 220px; + white-space: nowrap; + white-space: nowrap; + overflow: hidden; +} + +div.sidebar-s p.location{ + word-wrap: break-word; + word-break: break-all; +} + +div.sidebar-t{ + +} +/*end*/ + +/*main-conten*/ +div.main-content{ + float: left; + width: 660px; + border-bottom: 1px dashed rgb(204, 204, 204); + margin-bottom: 10px; + font-size:14px; +} + +div.main-content-f{ + float:left; + width: 80px; +} + +div.main-content-s{ + float: left; + width: 580px; +} +/**/ + +/*forums-index*/ +div.forums-index{ + padding-left: 10px; + padding-top: 10px; + float: left; + width: 100%; + border-bottom: 1px dashed rgb(204, 204, 204); +} +div.forums-inex-avatar{ + padding-left: 15px; + float: left; + width: 7%; +} + +div.forums-index-content{ + float: left; + width: 72%; + line-height: 1.5em; +} + +div.forums-index-count{ + padding-top: 10px; + float: right; + padding-right: 40px; + +} +table.forums-count-color{ + width: 80px; + height: 60px; + background-color: #e5e2e2; + +} + +table.forums-count-color tr{ + font-weight: bold; + font-size: 14px; + background-color: #e5e2e2; + vertical-align: middle; + alignment-adjust: middle; + +} +/*forums-index end*/ +.vatar-size{ + height: 70px; + width: 70px; +} + +div.position-title{ + line-height: 0.5em; +} + +div.sidebar-forums{ + padding-left: 8px; + width: 214px; +} + +div.forums-tags{ + border-bottom: solid 1px #15bccf; + width: 214px; +} + +div.forums-line{ + border-bottom: solid 1px #15bccf; +} + +div.forums-info{ + /*background-image: url(../images/sidebar/forums.png); */ + border-bottom: solid 1px #15bccf; + height: 100px; + width: 214px; + padding-left: 5px; + +} + +div.forums-title{ + font-family: "Microsoft YaHei"; + font-weight: bold; + font-size: 16px; + color: rgb(237, 137, 36); + word-wrap: break-word; + word-break: break-all; +} + +div.forums-description{ + color: rgb(145, 146, 148); +} + +span.forums-avatar-left{ + float:left; + width: 27%; +} + +span.forums-avatar-right{ + float: right; + width: 65%; +} + +.formus-first-title{ + font-family: "Microsoft YaHei"; + font-weight:bold; + padding-top:3px; + padding-bottom:3px; + font-size:16px; +} +/*end*/ +.welcome-index{ + width: 290px; + white-space: nowrap; + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; +} +.contextual-borad{ + float:left; + white-space: nowrap; + line-height:1.4em; + margin-top:0px; + margin-right:8px; + font-size:0.9em; +} + +.borad-text-list{ + margin-bottom: 10px; + border-bottom: 1px dashed rgb(204, 204, 204); + width: 680px; +} + +.borad-message{ + margin-bottom: 10px; + border-bottom: 1px dashed rgb(204, 204, 204); +} + +.borad-count{ + width: 50px; + background-color: #e5e2e2; +} + +.borad-title{ + font-size: 15px; + color: #555555; + padding-left: 5px; + padding-top: -5px; + font-weight: 400; +} + +.borad-setitle{ + padding-bottom: 5px; + padding-top: 10px; + border-bottom: 1px dashed rgb(204, 204, 204); +} + +.borad-topic-count{ + padding-top: 10px; + padding-left: 5px; + padding-right: 5px; + clear: left; +} + +.borad-topic-count-message{ + padding-left: 5px; + border-bottom:solid 1px #848282; + color: #848282; + +} + +.borad-description{ + padding-top: 5px; + color: #848282; + padding-left: 5px; +} + +.borad-count-digit{ + font-size: 14px; + font-weight: bold; +} +.underline-evreycontent{ + margin-bottom: 10px; + border-bottom: 1px dashed rgb(204, 204, 204); + width: 660px; +} + +.content-title-top-avtive{ + padding-bottom: 15px; + padding-left: 5px; + padding-top: 5px; +} + +.content-title-top-project{ + padding-left: 5px; +} + +.content-title-top{ + padding-bottom: 20px; + padding-left: 5px; +} + +.new_submit{ + padding-bottom: 5px; + width: 55px; + height: 25px; + font-family: '微软雅黑',Arial,Helvetica,sans-serif; + font-size: 12px; + color: #fff; + padding: 0px; + background: #15bccf; + border: 1px solid #15bccf; +} +.content-text-list{ + margin-bottom: 10px; + border-bottom: 1px dashed rgb(204, 204, 204); + width: 580px; +} + +.location-list{ + width: 180px; + color: #15bccf; +} + +.top-content-list{ + width: 430px; + white-space: nowrap; + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; +} + +.top-content-list-homework{ + width: 650px; + white-space: nowrap; + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; +} + +/*added by bai*/ +.user_underlinescore{ + margin:1; + padding:1; + width:700px; + height:1px; + background-color:#15bccf; + overflow:hidden +} + +.top-course-content{ + background-color: rgb(181,227, 251); + height: 45px; + width: 940px; + line-height: 1em; + padding-top: 5px; +} + +.top-user-content{ + background-color: rgb(195,291, 232); + height: 45px; + width: 940px; + line-height: 1em; + padding-top: 5px; +} + +.top-context-content{ + background-color: rgb(242,241, 192); + height: 45px; + width: 940px; + line-height: 1em; + padding-top: 5px; +} +.top-bid-content{ + background-color: rgb(246,176, 133); + height: 45px; + width: 940px; + line-height: 1em; + padding-top: 5px; +} + +.button-submit{ + padding-bottom: 5px; + width: 55px; + height: 25px; + font-family: '微软雅黑',Arial,Helvetica,sans-serif; + font-size: 12px; + color: #fff; + padding: 0px; + background: #15bccf; + border: 1px solid #15bccf; + +} +/*end*/ + +.top-content-home{ + background-color: rgb(226, 244, 255); + width: 25%; + padding-bottom :50px; + +} + +.top-content-search{ + float: right; + padding-right: 15px; + +} + +.top-content-location{ + margin-left: 133px; /*modified by bai*/ + +} + + + +.project_avatar_name { + position: relative; + font-size: 16px; + display:block; +} + +a.bids_user { + font-family:"Microsoft YaHei"; + color:#15bccf; + font-size:14px; + font-weight: bold; +} +.welcome_logo{ + float: left; + padding-left: 5px; + padding-top: 2px; +} +.welcome_images{ + width: 200px; + height: 200px; +} + +.base_footer{ + color:#acaeb1; + font-size:12px; +} + +.project_top{ + padding: 10px 20px; +} + +.line{ + height: 1px; + margin: 0px; + background-color: #cacaca; + overflow: hidden; + margin-top: 10px; +} + +ul.list_watch{ + padding-left: 0px; + list-style-type:none; + height:auto; + border-bottom: 1px dashed rgb(204, 204, 204); + } + +.new_creat{ + padding-top: 0px; + float: right; + padding-right: 30px; + +} +ul.tool{margin:0px; padding-left:0em;} +ul.tool li{list-style-type:none; + height:auto;} +.font_index{ + font-size:22px; + font-family: "Microsoft YaHei"; + color:#068d9c; +} +.font_aram{ + font-size: 14px; + font-family: "Microsoft YaHei"; + font-weight: bold; +} +.font_content{ + font-size:14px; + font-family: "Microsoft YaHei"; + color:#FFFFFF; +} + +.time_project{ + font-size:12px; + font-family: "Microsoft YaHei"; +} +.line_bottom{ + margin-top: 1px; + dashed: #ffff00; + height: 1px; + overflow: hidden; +} +/*多行隐藏*/ +.tablecontext{ + /*white-space:nowrap;*/ + overflow: hidden; + height:35px; + width:200px; + text-align: left; + font-family: arial; + font-size:12px; + color:#7e7e7e; +} +.content_frame{ + padding-bottom: 30px; + float: left; + +} + +.user_other_model{ + margin:5px 0px 0px 0px; + padding-left:8px; + height:auto; + background-color: #d0d9e0; +} + +.font_title_document{ + font-size: 13px; + font-weight: bold; +} + +.font_title_tag{ + font-family: "Microsoft YaHei"; + font-weight:bold; + padding-top:3px; + padding-bottom:3px; + font-size:16px; + /*color:#05a8bb;*/ +} + +.font_title_left{ + font-family: "Microsoft YaHei"; + font-weight:bold; + padding-left: 10px; + padding-top:3px; + padding-bottom:3px; + font-size:16px; + /*color:#05a8bb;*/ +} +.font_small_watch{ + font-family: "Microsoft YaHei"; + font-weight:bold; + color:#15bccf; +} +.left_wf{ + padding-left:8px; +} +.main_context{ + padding-bottom: 5px; +} +.welcome_image{ + height: 27px; + width: 30px; + +} +.font_welcome{ + font-family: "Microsoft YaHei"; + font-weight: bold; + font-size: 16px; + color:#6d6e6e; +} + +.font_welcome_trustie{ + font-family: Tahoma,"Microsoft YaHei"; + font-weight: bold; + font-size: 18px; + color:#15bccf; +} + +.font_welcome_school{ + font-family: Tahoma,"Microsoft YaHei"; + font-weight: bold; + font-size: 20px; + color:#e8770d; +} + +.font_welcome_Cdescription{ + font-family: "Microsoft YaHei"; + font-size: 16px; + color: #5c5c5c; +} + +.font_welcome_tdescription{ + font-family: "Microsoft YaHei"; + font-size: 16px; + color: #5c5c5c; + text-align: justify; + text-justify: inter-ideograph; +} + +.inf_user_image{ + padding-left:8px; + margin:0px; + background-color:#fff; + height: auto; + padding-bottom: 8px; +} +.inf_user_image img.avatar2{ + background: rgb(245, 245, 245); + padding: 4px; + border: 1px solid #e5dfc7; + float: left; + display: block; + height:80px; + width: 80px; + +} + +.font_welcome_tdescription2{ + font-family: Arial, Helvetica, sans-serif; + font-size: 20px; + color: #FF0000; + text-align: justify; + text-justify: inter-ideograph; +} + + +.font_welcome_Edescription{ + font-family: Default; + font-size: 16px; + color: #9a9a9a; +} + +.font_welcome_feature{ + font-family: "Microsoft YaHei"; + font-weight: bold; + font-size: 16px; + color:#09b2c8; + padding-top: 50px; +} + +.info-course{ + padding-left: 8px; + font-family: "Microsoft YaHei"; + font-weight:bold; + font-size:16px; + color:#4d4d4d; + word-wrap: break-word; + word-break: break-all; +} + +ul.user_course_sort{margin:0px; padding-left:0em;} +ul.user_course_sort li{list-style-type:none; + height:auto;} + + +.info-break{ + word-wrap: break-word; + word-break: break-all; +} + +.info_font{ + padding-left: 8px; + font-family: "Microsoft YaHei"; + font-weight:bold; + font-size:16px; + color:#4d4d4d; + word-wrap: break-word; + word-break: break-all; +} +.font_lighter{ + font-family: "Microsoft YaHei"; + color:#acaeb1; + font-size:13px; +} +.font_lighter_e{ + width: 700px; + color:#acaeb1; + font-size:13px; +} +.font_lighter2{ + font-family: "Microsoft YaHei"; + color:#9a9a9a; + font-size:14px; +} + +.font_lighter_welcome{ + color:#acaeb1; + font-size:12px; + font-family: "Microsoft YaHei"; +} +.justify_side > span{ + text-align: justify; + width: 180px; +} +.font_lighter_sidebar{ + /*font-family:微软雅黑;*/ + color:#919294; + font-size:13px; + padding-left: 12px; + padding-right: 8px; +} +.created_on_project{ + padding-left: 12px; + padding-bottom: 5px; +} +.font_description{ + font-size:14px; + line-height: 1.5em; + +} +.font_description2{ + font-size:13px; + line-height: 1.5em; + padding-left: 10px; +} +.font_tool{ + font-family: "Microsoft YaHei"; + font-size:14px; + color: #1a1a1a; + padding-left: 6px; +} + +.spaceleft{float: left; width: 240px;} + +.spaceright{float:left; width:620px;} + +.welcome_left{ + float:left; + display:inline-block; + /*margin-top: 50px;*/ + /*padding-left: 20px;*/ + max-width: 315px; + margin: 0; + padding: 0; + margin-left: 15px; +} + +.welcome_right{ + float:left; + width: 49%; + +} + +.inf_user_motto{ + padding-left:8px; + margin:5px 0px 0px 0px; + padding-top:1px; + background-color:#b8c1c8; + height: auto; +} +/*.user_watcher{ + padding-left:8px; + margin:5px 0px 0px 0px; + height: 220px; + background-color:#bababa; +}*/ + +.user_fans{ + padding-left:0px; + margin:0px; + height: auto; + background-color:#fff; +} +.inf_user_context{ + padding-left:0px; + margin:0px; + padding-top:1px; + background-color:#fff; + height: auto; + /*color:#fff; */ +} + +.user_tags{ + padding-top: 5px; + padding-bottom: 5px; + padding-left: 12px; + padding-right: 12px; +} + +.tool{ + padding-left:0px; + margin:0px 0px 0px 0px; + height: auto; + background-color:#fff; + padding-bottom:0px; +} +.user_private{ + padding-left:8px; + margin:5px 0px 0px 0px; + height: 100px; + background-color:#dbdbde; +} +.user_private_left{ + padding-left:8px; + + float:left; + height: 100px; + width:110px; + background-color:#a5abb4; +} +.user_private_right{ + + margin:0px 0px 0px 5px; + float:left; + height: 100px; + width:115px; + background-color:#adb6c5; +} +.user_underline{ + margin:1; + padding:1; + width:240px; + height:1px; + background-color:#15bccf; + overflow:hidden +} + + + +.user_enterprise_underline{ + margin:1; + padding:1; + width:240px; + height:1px; + background-color:#ac344f; + overflow:hidden +} + +.user_underline2{ + margin:1; + padding:1; + width:240px; + height:1px; + background-color:#c6e9fe; + overflow:hidden +} +.user_underline3{ + margin:1; + padding:1; + width:120px; + height:1px; + background-color:#c6e9fe; + overflow:hidden; + margin-top: 10px; +} +.homepage_underline{ + margin:1; + padding:1; + width:240px; + height:1px; + background-color:#c6e9fe; + overflow:hidden; + margin-top: 0px; + margin-bottom: 20px; +} +.line_under{ + border-bottom: 1px dashed rgb(204, 204, 204); +} +.line_heng{ + width: 670px; + height: 1px; + margin-top:5px; + border: 0px; + background-color:#D5D5D5; + color: #D5D5D5; +} + +ul.user_project_sort{margin:0px; padding-left:0em;} +ul.user_project_sort li{list-style-type:none; + height:auto;} +/**/ + + + +/*h写的样式*/ +.lbadding{float:left; padding-left: 10px} /*huang*/ +.rlbadding{float:left; padding-left: 0px; margin-top:40px} /*huang*/ +/*.lbadding h7{letter-spacing: -0.0125em; font-weight:700}*//*未用*/ +.newsplitcontentright{float:right; width:49%;}/*huang*/ +.newsplitcontentleft{float:left; width:49%;}/*huang*/ +.newsplitcontentall{float:left; padding-left: 30px; width:95%} + +.more{float:right; padding-right:60px; padding-top:20px;text-decoration: underline; color: #95c3bc} +/*字体*/ + +.header_logo_left{ + float: left; + width: 70%; + height: 50px; +} +.header_logo_right{ + padding-left:-50px; + padding-top:-50px; + float: right; + width: 30%; + height: 50px; +} +a.htags{ + background-color: #deebf0; + + border-radius: 5px 5px 5px 5px; + padding: 0px 4px 0px 4px; + margin:0 3px; +} +a.logical_int{ + color: #ed8924; +} + +.contextdescription2 { + font-family: "Microsoft YaHei"; + font-size: 12px; + font-weight: lighter; + color: #7e7e7e; +} +ul.context_projects{margin:0px; padding-left:0em;} + +ul.context_projects ul {padding-left:1.6em;} + +ul.context_projects li { + list-style-type:none; + height:50px; +} +/*字体*/ + +.more{float:right; padding-right:40px; text-decoration: underline; color: #95c3bc} + +/*控制project里面header内容,一排读数*/ +.newprojectheader{ + font-weight: bold; + font-size: 14px; + font-family:"黑体"; + color:#597e95; + /*text-decoration:underline;*/ + padding:10px 0px 10px 20px; +} +/*显示一个区域,多余的隐藏 比如项目描述内容多余部分的隐藏 两行隐藏*/ +.tablecontext{ + /*white-space:nowrap;*/ + overflow: hidden; + + height: 30px; + width: 450px; + margin-right:auto; + + margin-left:auto; + text-align: left; + padding-top:12px; + font-family: arial; + font-size:12px; + font-weight:lighter; + color:#7e7e7e; +} + +.top_description{ + overflow: hidden; + height: 65px; + width: 600px; + color: #7e7e7e; +} +/*显示浅颜色的字体*/ +.fontligher{ + font-family: arial; + font-size:12px; + font-weight:lighter; + color:#505050; + + height: 34px; + width: 500px; + margin-right:auto; + margin-left:auto; + text-align: left; + padding-top:10px; + +} +.documenttext{ /*没用*/ + /*white-space:nowrap;*/ + overflow: hidden; + height: 220px; + width: 100px; + margin-right:auto; + margin-left:auto; + text-align: left; + padding-top:10px; +} +.tablecontext_single{ + white-space:nowrap; + overflow: hidden; + text-overflow:ellipsis; + + width: 450px; + margin-right:auto; + margin-left:auto; + text-align: left; + padding-top:0px; +} +/*单行隐藏不限长度*/ +.alone_sigle{ + white-space:nowrap; + overflow: hidden; + text-overflow:ellipsis; +} +.firstname_project{ /*控制读出的project标题内容*/ + white-space:nowrap; + width: 120px; + + width: 300px; + margin-right:auto; + margin-left:auto; + text-align: left; + padding-top:5px; +} +.firstname_project{ /*控制读出的project标题内容*/ + white-space:nowrap; + width: 100px; + + overflow: hidden; + margin-right:auto; + margin-left:auto; + text-align: left; + + + font-size:24px; + font-weight:bold; + text-decoration:none; + color:#000000; +} +.firdtname_project{ + + font-size:12px; + font-weight:bold; + text-decoration:none; + color:#116699; + + + +} +.lbadding h3{ + color: #1c5c76; + font-size: 16px; + line-height: 19px; + margin-bottom: 0; + margin-top: 0; + text-decoration: underline; +} +.last_active{ + color: #AA9C84; + font-size:12px; + text-decoration: none; +} +ul.newprojects{ /*huang*/ + margin: 0px; + padding-left: 2em; +} +ul.newprojects ul{ + padding-left:1.6em; +} +ul.newprojects li{ /*huang 块状*/ + padding:4%; + background-color:#f5f1e8; + margin:0 0 3px; + display:inline-block; + display:inline-block; + vertical-align:top; + width:200px; + vertical-align:top; + border-bottom:5px #DBEDF4 solid; + border-left:2px dotted #DBEDF4; + min-height:260px; + line-height: 30px; +} +/*ul.newprojects li documenttext{ *//*未wan*/ + /*overflow: hidden;*/ + /*height: 260px;*/ + /*width: 200px;*/ + /*margin-right:auto;*/ + /**/ + /*padding-top:10px;*/ +/*}*/ +ul.newprojects2{ /*huang*/ + margin: 0px; + padding-left: 2em; +} +ul.newprojects2 ul{ + padding-left:1.6em; +} +ul.newprojects2 li{ + list-style-type: none; + line-height: 10px; + } +.newfeedback{ + height: auto; + margin-left: 0px; + margin-bottom: 12px; + border: 0px none !important; +} + +.newfeedback h1{ + color: inherit; +} +/***** Layout *****/ +#wrapper {background: white;} + +#top-menu {background: #3E5B76; color: #000; height:1.8em; font-size: 1.0em; padding: 2px 2px 0px 6px;} +#top-menu ul {margin: 0; padding: 0;} +#top-menu li { + float:left; + list-style-type:none; + margin: 0px 0px 0px 0px; + padding: 0px 0px 0px 0px; + white-space:nowrap; +} +#top-menu a {color: #fff; margin-right: 8px; font-weight: bold;} +#top-menu #loggedas + { + float: right; + + margin-right: 0.5em; + color: #fff; + } + +#account {float:right;} +#account-enterprise{ + float: right; + padding-top: 10px; + padding-right: 347px; + +} +#account-college{ + + float: right; + padding-top: 10px; + padding-right: 302px; + +} + +#header {min-height:5.3em;margin:0;background-color:#628DB6;color:#f8f8f8; padding: 4px 8px 20px 6px; position:relative;} +#header a {color:#f8f8f8;} +#header h1 a.ancestor { font-size: 80%; } +#quick-search {float:right;} + +#main-menu {left:6px;}/*by young*/ +#main-menu ul {margin: 0; padding: 0;} +#main-menu li { + float:left; + list-style-type:none; + margin: 0px 2px 0px 0px; + padding: 0px 0px 0px 0px; + white-space:nowrap; +} +#main-menu li a { + display: block; + color: #039ea0; + text-decoration: none; + font-weight: bold; + margin: 0; + padding: 4px 10px 4px 10px; +} +#main-menu li a:hover {background:#759FCF; color:#fff;} +#main-menu li a.selected, #main-menu li a.selected:hover {background:#fff; color:#555;} + +#admin-menu ul {margin: 0; padding: 0;} +#admin-menu li {margin: 0; padding: 0 0 6px 0; list-style-type:none;} + +#admin-menu a { background-position: 0% 40%; background-repeat: no-repeat; padding-left: 20px; padding-top: 2px; padding-bottom: 3px;} +#admin-menu a.projects { background-image: url(../images/projects.png); } +#admin-menu a.users { background-image: url(../images/user.png); } +#admin-menu a.groups { background-image: url(../images/group.png); } +#admin-menu a.roles { background-image: url(../images/database_key.png); } +#admin-menu a.trackers { background-image: url(../images/ticket.png); } +#admin-menu a.issue_statuses { background-image: url(../images/ticket_edit.png); } +#admin-menu a.workflows { background-image: url(../images/ticket_go.png); } +#admin-menu a.custom_fields { background-image: url(../images/textfield.png); } +#admin-menu a.enumerations { background-image: url(../images/text_list_bullets.png); } +#admin-menu a.settings { background-image: url(../images/changeset.png); } +#admin-menu a.plugins { background-image: url(../images/plugin.png); } +#admin-menu a.info { background-image: url(../images/help.png); } +#admin-menu a.server_authentication { background-image: url(../images/server_key.png); } + +#main {background-color:#EEEEEE;} + +#sidebar{ float: left; width: 22%; position: relative; z-index: 9; padding: 0; margin: 0;}/*by young*/ +* html #sidebar{ width: 22%; } +#sidebar h3{ font-size: 14px; margin-top:14px; color: #666; } +#sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; } +* html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; } +#sidebar .contextual { margin-right: 1em; } + +#content { }/*by young*/ +* html #content{ width: 75%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;} +html>body #content { min-height: 600px; } +* html body #content { height: 600px; } /* IE */ + +#main.nosidebar #sidebar{ display: none; } +#main.nosidebar #content{ width: auto; border-right: 0; } + + +#footer {clear: both; border-top: 1px solid #bbb; font-size: 0.9em; color: #aaa; padding: 5px; text-align:center; background:#fff;} + +#login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; } +#login-form table td {padding: 6px;} +#login-form label {font-weight: bold;} +#login-form input#username, #login-form input#password { width: 300px; } + +div.modal { border-radius:5px; background:#fff; z-index:50; padding:4px;} +div.modal h3.title {display:none;} +div.modal p.buttons {text-align:right; margin-bottom:0;} + +input#openid_url { background: url(../images/openid-bg.gif) no-repeat; background-color: #fff; background-position: 0 50%; padding-left: 18px; } + +.clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; } + +/***** Links *****/ +a, a:link, a:visited{ color: #169; text-decoration: none; } +a:hover, a:active{ color: #c61a1a; text-decoration: underline;} +a img{ border: 0; } + +a.issue.closed, a.issue.closed:link, a.issue.closed:visited { color: #999; text-decoration: line-through; } +a.project.closed, a.project.closed:link, a.project.closed:visited { color: #999; } +a.user.locked, a.user.locked:link, a.user.locked:visited {color: #999;} + +#sidebar a.selected {line-height:1.7em; padding:1px 3px 2px 2px; margin-left:-2px; background-color:#9DB9D5; color:#fff; border-radius:2px;} +#sidebar a.selected:hover {text-decoration:none;} +#admin-menu a {line-height:1.7em;} +#admin-menu a.selected {padding-left: 20px !important; background-position: 2px 40%;} + +a.collapsible {padding-left: 12px; background: url(../images/arrow_expanded.png) no-repeat -3px 40%;} +a.collapsible.collapsed {background: url(../images/arrow_collapsed.png) no-repeat -5px 40%;} + +a#toggle-completed-versions {color:#999;} +/***** Tables *****/ +table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; } +table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; } +table.list td { vertical-align: top; padding-right:10px; } +table.list td.id { width: 2%; text-align: center;} +table.list td.checkbox { width: 15px; padding: 2px 0 0 0; } +table.list td.checkbox input {padding:0px;} +table.list td.buttons { width: 15%; white-space:nowrap; text-align: right; } +table.list td.buttons a { padding-right: 0.6em; } +table.list caption { text-align: left; padding: 0.5em 0.5em 0.5em 0; } + +tr.project td.name a { white-space:nowrap; } +tr.project.closed, tr.project.archived { color: #aaa; } +tr.project.closed a, tr.project.archived a { color: #aaa; } + +tr.project.idnt td.name span {background: url(../images/bullet_arrow_right.png) no-repeat 0 50%; padding-left: 16px;} +tr.project.idnt-1 td.name {padding-left: 0.5em;} +tr.project.idnt-2 td.name {padding-left: 2em;} +tr.project.idnt-3 td.name {padding-left: 3.5em;} +tr.project.idnt-4 td.name {padding-left: 5em;} +tr.project.idnt-5 td.name {padding-left: 6.5em;} +tr.project.idnt-6 td.name {padding-left: 8em;} +tr.project.idnt-7 td.name {padding-left: 9.5em;} +tr.project.idnt-8 td.name {padding-left: 11em;} +tr.project.idnt-9 td.name {padding-left: 12.5em;} + +tr.issue { text-align: center; white-space: nowrap; } +tr.issue td.subject, tr.issue td.category, td.assigned_to, tr.issue td.string, tr.issue td.text, tr.issue td.relations { white-space: normal; } +tr.issue td.subject, tr.issue td.relations { text-align: left; } +tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;} +tr.issue td.relations span {white-space: nowrap;} +table.issues td.description {color:#777; font-size:90%; padding:4px 4px 4px 24px; text-align:left; white-space:normal;} +table.issues td.description pre {white-space:normal;} + +tr.issue.idnt td.subject a {background: url(../images/bullet_arrow_right.png) no-repeat 0 50%; padding-left: 16px;} +tr.issue.idnt-1 td.subject {padding-left: 0.5em;} +tr.issue.idnt-2 td.subject {padding-left: 2em;} +tr.issue.idnt-3 td.subject {padding-left: 3.5em;} +tr.issue.idnt-4 td.subject {padding-left: 5em;} +tr.issue.idnt-5 td.subject {padding-left: 6.5em;} +tr.issue.idnt-6 td.subject {padding-left: 8em;} +tr.issue.idnt-7 td.subject {padding-left: 9.5em;} +tr.issue.idnt-8 td.subject {padding-left: 11em;} +tr.issue.idnt-9 td.subject {padding-left: 12.5em;} + +tr.entry { border: 1px solid #f8f8f8; } +tr.entry td { white-space: nowrap; } +tr.entry td.filename { width: 30%; } +tr.entry td.filename_no_report { width: 70%; } +tr.entry td.size { text-align: right; font-size: 90%; } +tr.entry td.revision, tr.entry td.author { text-align: center; } +tr.entry td.age { text-align: right; } +tr.entry.file td.filename a { margin-center: 16px; } +tr.entry.file td.filename_no_report a { margin-left: 16px; } + +tr span.expander {background-image: url(../images/bullet_toggle_plus.png); padding-left: 8px; margin-left: 0; cursor: pointer;} +tr.open span.expander {background-image: url(../images/bullet_toggle_minus.png);} + +tr.changeset { height: 20px } +tr.changeset ul, ol { margin-top: 0px; margin-bottom: 0px; } +tr.changeset td.revision_graph { width: 15%; background-color: #fffffb; } +tr.changeset td.author { text-align: center; width: 15%; white-space:nowrap;} +tr.changeset td.committed_on { text-align: center; width: 15%; white-space:nowrap;} + +table.files tr.file td { text-align: center; } +table.files tr.file td.filename { text-align: left; padding-left: 24px; } +table.files tr.file td.digest { font-size: 80%; } + +table.members td.roles, table.memberships td.roles { width: 45%; } + +tr.message { height: 2.6em; } +tr.message td.subject { padding-left: 20px; } +tr.message td.created_on { white-space: nowrap; } +tr.message td.last_message { font-size: 80%; white-space: nowrap; } +tr.message.locked td.subject { background: url(../images/locked.png) no-repeat 0 1px; } +tr.message.sticky td.subject { background: url(../images/bullet_go.png) no-repeat 0 1px; font-weight: bold; } + +tr.version.closed, tr.version.closed a { color: #999; } +tr.version td.name { padding-left: 20px;word-break: break-all; } +tr.version td.description{word-break: break-all} +tr.version.shared td.name { background: url(../images/link.png) no-repeat 0% 70%; } +tr.version td.date, tr.version td.status, tr.version td.sharing { text-align: center; white-space:nowrap; } + +tr.user td { width:13%; } +tr.user td.email { width:18%; } +tr.user td { white-space: nowrap; } +tr.user.locked, tr.user.registered { color: #aaa; } +tr.user.locked a, tr.user.registered a { color: #aaa; } + +table.permissions td.role {color:#999;font-size:90%;font-weight:normal !important;text-align:center;vertical-align:bottom;} + +tr.wiki-page-version td.updated_on, tr.wiki-page-version td.author {text-align:center;} + +tr.time-entry { text-align: center; white-space: nowrap; } +tr.time-entry td.issue, tr.time-entry td.comments { text-align: left; white-space: normal; } +td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; } +td.hours .hours-dec { font-size: 0.9em; } + +table.plugins td { vertical-align: middle; } +table.plugins td.configure { text-align: right; padding-right: 1em; } +table.plugins span.name { font-weight: bold; display: block; margin-bottom: 6px; } +table.plugins span.description { display: block; font-size: 0.9em; } +table.plugins span.url { display: block; font-size: 0.9em; } + +table.list tbody tr.group td { padding: 0.8em 0 0.5em 0.3em; font-weight: bold; border-bottom: 1px solid #ccc; } +table.list tbody tr.group span.count {position:relative; top:-1px; color:#fff; font-size:10px; background:#9DB9D5; padding:0px 6px 1px 6px; border-radius:3px; margin-left:4px;} +tr.group a.toggle-all { color: #aaa; font-size: 80%; font-weight: normal; display:none;} +tr.group:hover a.toggle-all { display:inline;} +a.toggle-all:hover {text-decoration:none;} + +table.list tbody tr:hover { background-color:#ffffdd; } +table.list tbody tr.group:hover { background-color:inherit; } +table td {padding:2px;} +table p {margin:0;} +.odd {background-color:#f6f7f8;} +.even {background-color: #fff;} + +a.sort { padding-right: 16px; background-position: 100% 50%; background-repeat: no-repeat; } +a.sort.asc { background-image: url(../images/sort_asc.png); } +a.sort.desc { background-image: url(../images/sort_desc.png); } + +table.attributes { width: 100% } +table.attributes th { vertical-align: top; text-align: left; } +table.attributes td { vertical-align: top; } + +/*table.boards a.board, h3.comments {*background: url(../images/comment.png) no-repeat 0% 50%; padding-left: 5px; }*/ +table.boards td.topic-count, table.boards td.message-count {text-align:center;} +table.boards td.last-message {font-size:80%;} + +table.messages td.author, table.messages td.created_on, table.messages td.reply-count {text-align:center;} + +table.query-columns { + border-collapse: collapse; + border: 0; +} + +table.query-columns td.buttons { + vertical-align: middle; + text-align: center; +} + +td.center {text-align:center;} + +h3.version { background: url(../images/package.png) no-repeat 0% 50%; padding-left: 20px; } + +div.issues h3 { background: url(../images/ticket.png) no-repeat 0% 50%; padding-left: 20px; } +div.members h3 { background: url(../images/group.png) no-repeat 0% 50%; padding-left: 20px; } +div.news h3 { background: url(../images/news.png) no-repeat 0% 50%; padding-left: 20px; } +div.projects h3 { background: url(../images/projects.png) no-repeat 0% 50%; padding-left: 20px; } + +#watchers ul {margin: 0; padding: 0;} +#watchers li {list-style-type:none;margin: 0px 2px 0px 0px; padding: 0px 0px 0px 0px;} +#watchers select {width: 95%; display: block;} +#watchers a.delete {opacity: 0.4; vertical-align: middle;} +#watchers a.delete:hover {opacity: 1;} +#watchers img.gravatar {margin: 0 4px 2px 0;} + +span#watchers_inputs {overflow:auto; display:block;} +span.search_for_watchers {display:block;} +span.search_for_watchers, span.add_attachment {font-size:80%; line-height:2.5em;} +span.search_for_watchers a, span.add_attachment a {padding-left:16px; background: url(../images/bullet_add.png) no-repeat 0 50%; } + + +.highlight { background-color: #FCFD8D;} +.highlight.token-1 { background-color: #faa;} +.highlight.token-2 { background-color: #afa;} +.highlight.token-3 { background-color: #aaf;} + +.box{ + padding:6px; + margin-bottom: 10px; + background-color:#f6f6f6; + color:#505050; + line-height:1.5em; + border: 1px solid #e4e4e4; +} + +div.square { + border: 1px solid #999; + float: left; + margin: .3em .4em 0 .4em; + overflow: hidden; + width: .6em; height: .6em; +} +.contextual {float:right; white-space: nowrap; line-height:1.4em;/*margin-top:5px;*/ padding-left: 10px;padding-right: 10px;padding-top: 5px; font-size:0.9em;} +.contextual input, .contextual select {font-size:0.9em;} +.message .contextual { margin-top: 0; } + +.splitcontent {overflow:auto;} +.splitcontentleft{float:left; width:49%;} +/*Added by young*/ + +.hotlist { +padding:0 15px 25px; +} +.splitcontentleft_{float:left; width:33%;} +.splitcontentright_{float:right; width:33%;} +.table{margin-top:10px;margin-left: 100px;} +.table_{margin-top:-10px; +margin-left:-10px; +} + +.splitcontentleft_{float:left; width:33%;} +.splitcontentright_{float:right; width:33%;} +.table{margin-top:10px;margin-left: 100px;} +.table_{margin-top:10px;} + +.table_font{font-size:20px;color:#DD0000} +.registerd_box{padding-left: 600px;} +.project_table{margin:0,0,0,0;margin-bottom:10px;background-color:#0ee;height:50px;} +.project_header_tag{float:right; color:#000000;} + +.project_right_tag{margin-top:44%;} +.project_homepage_tag{float:left; margin-top:9%;color:#000000;} +.project_infor_tag{/*float:auto;*/color:#000000;padding-left: 15px;} +.project_page_tag{float:right;color:#C0C0C0; font-family: '微软雅黑';font-size: 13px;} +.wiki_text{font-size:small;color:#000000;} +.user_setting{float:right; color:#000000;padding-right: 10px;} +.line_color{color:#000000;} + +.project_right_tag{margin-top:40%;} +.project_homepage_tag{padding-left:570px;color:#000000;} +.project_infor_tag{/*float:auto;*/color:#000000;padding-left: 15px; } +.project_page_tag{float:right;color:#C0C0C0; font-family: '微软雅黑';font-size: 13px;} +.wiki_text{font-size:small;color:#000000;} +.user_setting +{ + float:right; + /*color:#000000;*/ + padding-right:10px; + background-color: #CCCCBB; + border-radius: 5px 5px 5px 5px; + color: rgb(58, 88, 125) !important; + padding: 0px 4px; + margin: 3px; + display: inline-block; + font-size: 11px; + text-decoration: none; + cursor: pointer; +} +.line_color{color:#000000;} +.project_description +{ + overflow: hidden; + text-overflow:ellipsis; + width:500px; + height:50px; +} + +/*#header a {font-family:'微软雅黑', Verdana, sans-serif; font-size: 12px; color:#808080;}*/ +#login-form_new table/*Added by young*/ +{ + height: 165px; + padding:20px 25px; + background:#fff; + text-align:left; + + margin-top: 50px; + width:320px; + + /*font-family:微软雅黑,lucida grande,verdana;*/ + font-size:12px; + -webkit-border-radius:10px; + -moz-border-radius:10px; + border-radius:10px; + -moz-box-shadow:0 0 6px #039ea0; + -webkit-box-shadow:0 0 6px #039ea0; + box-shadow:0 0 6px #039ea0; + border:1px solid #AAA; + margin-left:20px; +} +/*end*/ +.splitcontentright{float:right; width:49%;} +form {display: inline;} + +/*added by bai*/ +input[type="submit"].bid_btn { + padding-bottom: 5px; + width: 55px; + height: 25px; + font-family: '微软雅黑', Arial, Helvetica, sans-serif; + font-size: 12px; + color: #fff; + padding: 0px; + background: #15bccf; + border-radius: 4px; + border: 1px solid #15bccf; + box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.2), 0px 0px 2px rgb(255, 255, 255) inset; + text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.2), 0px 1px 0px rgb(255, 255, 255); + cursor: pointer; +} + +input[type="button"].bid_btn { + /*padding-bottom: 5px;*/ + width: 55px; + height: 25px; + font-family: '微软雅黑', Arial, Helvetica, sans-serif; + font-size: 12px; + color: #fff; + padding: 0px; + background: #15bccf; + border-radius: 4px; + border: 1px solid #15bccf; + box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.2), 0px 0px 2px rgb(255, 255, 255) inset; + text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.2), 0px 1px 0px rgb(255, 255, 255); + cursor: pointer; +} +/*end */ + +fieldset {border: 1px solid #e4e4e4; margin:0;} +legend {color: #484848;} +hr { width: 100%; height: 1px; background: #ccc; border: 0; color:#000000;} +blockquote { + /*font-style: italic; */ + border-left: 1px solid #e0e0e0; + border-right: 1px solid #e0e0e0; + border-top: 1px solid #e0e0e0; + border-bottom: 1px solid #e0e0e0; + padding-left: 0.6em; + padding-top: 0.6em; + padding-right: 0.6em; + padding-bottom: 0.6em; + margin-left: 1.4em; + margin-right: 0.4em; + border-radius: 4px; + font-family: "Microsoft YaHei"; + background: url('../images/requirements/reference.jpg') +} + +blockquote blockquote { margin-left: 0;} +acronym { border-bottom: 1px dotted; cursor: help; } +textarea.wiki-edit {width:99%; resize:vertical;} +li p {margin-top: 0;} +div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;} +p.breadcrumb { font-size: 0.9em; margin: 4px 0 4px 0;} +p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; } +p.footnote { font-size: 0.9em; margin-top: 0px; margin-bottom: 0px; } + +div.issue div.subject div div { padding-left: 16px; } +div.issue div.subject p {margin: 0; margin-bottom: 0.1em; font-size: 90%; color: #999;} +div.issue div.subject>div>p { margin-top: 0.5em; } +div.issue div.subject h3 {margin: 0; margin-bottom: 0.1em;} +div.issue span.private { position:relative; bottom: 2px; text-transform: uppercase; background: #d22; color: #fff; font-weight:bold; padding: 0px 2px 0px 2px; font-size: 60%; margin-right: 2px; border-radius: 2px;} +div.issue .next-prev-links {color:#999;} +div.issue table.attributes th {width:22%;} +div.issue table.attributes td {width:28%;} + +.private_project { position:relative; bottom: 2px; text-transform: uppercase; background: #d22; color: #fff; font-weight:bold; padding: 0px 2px 0px 2px; font-size: 60%; margin-right: 2px; border-radius: 2px;} + +#issue_tree table.issues, #relations table.issues { border: 0; } +#issue_tree td.checkbox, #relations td.checkbox {display:none;} +#relations td.buttons {padding:0;} + +fieldset.collapsible { border-width: 1px 0 0 0; font-size: 0.9em; } +fieldset.collapsible>legend { padding-left: 16px; background: url(../images/arrow_expanded.png) no-repeat 0% 40%; cursor:pointer; } +fieldset.collapsible.collapsed>legend { background-image: url(../images/arrow_collapsed.png); } + +fieldset#date-range p { margin: 2px 0 2px 0; } +fieldset#filters table { border-collapse: collapse; } +fieldset#filters table td { padding: 0; vertical-align: middle; } +fieldset#filters tr.filter { height: 2.1em; } +fieldset#filters td.field { width:230px; } +fieldset#filters td.operator { width:180px; } +fieldset#filters td.operator select {max-width:170px;} +fieldset#filters td.values { white-space:nowrap; } +fieldset#filters td.values select {min-width:130px;max-width: 100px;} +fieldset#filters td.values input {height:1em;} +fieldset#filters td.add-filter { text-align: right; vertical-align: top; } + +.toggle-multiselect {/*background: url(../images/bullet_toggle_plus.png) no-repeat 0% 40%;*/ padding-left:8px; margin-left:0; cursor:pointer;} +.buttons { font-size: 0.9em; margin-bottom: 1.4em; margin-top: 1em; } + +div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;} +div#issue-changesets div.changeset { padding: 4px;} +div#issue-changesets div.changeset { border-bottom: 1px solid #ddd; } +div#issue-changesets p { margin-top: 0; margin-bottom: 1em;} + +.journal ul.details img {margin:0 0 -3px 4px;} +div.journal {overflow:auto;} +div.journal.private-notes {border-left:2px solid #d22; padding-left:4px; margin-left:-6px;} + +div#activity dl, #search-results { margin-left: 2em; } +div#activity dd, #search-results dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; } +div#activity dt, #search-results dt { margin-bottom: 0px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; } +div#activity dt.me .time { border-bottom: 1px solid #999; } +div#activity dt .time { color: #777; font-size: 80%; } +div#activity dd .description, #search-results dd .description { font-style: italic; } +div#activity span.project:after, #search-results span.project:after { content: " -"; } +div#activity dd span.description, #search-results dd span.description { display:block; color: #808080; } +div#activity dt.grouped {margin-left:5em;} +div#activity dd.grouped {margin-left:9em;} + +#search-results dd { margin-bottom: 1em; padding-left: 20px; margin-left:0px; } + +div#search-results-counts {float:right;} +div#search-results-counts ul { margin-top: 0.5em; } +div#search-results-counts li { list-style-type:none; float: left; margin-left: 1em; } + +dt.issue { background-image: url(../images/ticket.png); } +dt.issue-edit { background-image: url(../images/ticket_edit.png); } +dt.issue-closed { background-image: url(../images/ticket_checked.png); } +dt.issue-note { background-image: url(../images/ticket_note.png); } +dt.changeset { background-image: url(../images/changeset.png); } +dt.news { background-image: url(../images/news.png); } +dt.message { background-image: url(../images/message.png); } +dt.reply { background-image: url(../images/comments.png); } +dt.wiki-page { background-image: url(../images/wiki_edit.png); } +dt.attachment { background-image: url(../images/attachment.png); } +dt.document { background-image: url(../images/document.png); } +dt.project { background-image: url(../images/projects.png); } +dt.time-entry { background-image: url(../images/time.png); } + +#search-results dt.issue.closed { background-image: url(../images/ticket_checked.png); } + +div#roadmap .related-issues { margin-bottom: 1em; } +div#roadmap .related-issues td.checkbox { display: none; } +div#roadmap .wiki h1:first-child { display: none; } +div#roadmap .wiki h1 { font-size: 120%; } +div#roadmap .wiki h2 { font-size: 110%; } +body.controller-versions.action-show div#roadmap .related-issues {width:70%;} + +div#version-summary { float:right; width:28%; margin-left: 16px; margin-bottom: 16px; background-color: #fff; } +div#version-summary fieldset { margin-bottom: 1em; } +div#version-summary fieldset.time-tracking table { width:100%; } +div#version-summary th, div#version-summary td.total-hours { text-align: right; } + +table#time-report td.hours, table#time-report th.period, table#time-report th.total { text-align: right; padding-right: 0.5em; } +table#time-report tbody tr.subtotal { font-style: italic; color:#777;} +table#time-report tbody tr.subtotal td.hours { color:#b0b0b0; } +table#time-report tbody tr.total { font-weight: bold; background-color:#EEEEEE; border-top:1px solid #e4e4e4;} +table#time-report .hours-dec { font-size: 0.9em; } + +div.wiki-page .contextual a {opacity: 0.4} +div.wiki-page .contextual a:hover {opacity: 1} + +form .attributes select { width: 60%; } +input#issue_subject { width: 99%; } +select#issue_done_ratio { width: 95px; } + +ul.projects {margin:0px; padding-left:0em;}/*1em*/ +ul.projects ul {padding-left:1.6em;} +ul.projects.root {margin:0; padding:0;} + +ul.projects li {list-style-type:none;} + +ul.projects li {list-style-type:none; + + } + + +#projects-index ul.projects ul.projects { border-left: 3px solid #e0e0e0; padding-left:1em;} +#projects-index ul.projects li.root {margin-bottom: 1em;} +#projects-index ul.projects li.child {margin-top: 1em;} +#projects-index ul.projects div.root a.project {font-family:'微软雅黑', "Trebuchet MS", Verdana, sans-serif; font-weight: bold; font-size: 14px; margin: 0 0 10px 0; } +.my-project { padding-left: 18px; background: url(../images/fav.png) no-repeat 0 50%; } + +#notified-projects ul{max-height:250px; overflow-y:auto;} +#tracker_project_ids ul {max-height:250px; /*overflow-y:auto;*/} +#related-issues li img {vertical-align:middle;} + +ul.properties {padding:0; font-size: 0.9em; color: #777;} +ul.properties li {list-style-type:none;} +ul.properties li span {font-style:italic;} + +.total-hours { font-size: 110%; font-weight: bold; } +.total-hours span.hours-int { font-size: 120%; } +.gender { width: 20%; } +/*added by bai 增加了性别、地区和单位的样式 */ +#my_account_form select.gender { width: 20%; } +#my_account_form select.location {width: 31%;} +#my_account_form .occupation { width: 56%; } +/*end*/ + +/*added by bai 增加了性别、地区和单位的样式 */ +#my_account_form select.gender { width: 20%; } +#my_account_form select.location {width: 31%;} +#my_account_form .occupation { width: 56%; } +/*end*/ + +.autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em;} +/*#user_login, #user_firstname, #user_lastname, #user_mail, #my_account_form select, #user_form select, #user_identity_url { width: 45%; }*/ + +#workflow_copy_form select { width: 200px; } +table.transitions td.enabled {background: #bfb;} +table.fields_permissions select {font-size:90%} +table.fields_permissions td.readonly {background:#ddd;} +table.fields_permissions td.required {background:#d88;} + +textarea#custom_field_possible_values {width: 99%} +textarea#custom_field_default_value {width: 99%} + +input#content_comments {width: 99%} + + +p.pagination {margin-top:8px; font-size: 90%} + + +ul.courses {margin:0px; padding-left:0em;} +ul.courses ul {padding-left:1.6em;} +ul.courses.root {margin:0; padding:0;} + +ul.courses li {list-style-type:none;} + +ul.courses li {list-style-type:none;} +#courses-index ul.courses ul.courses { border-left: 3px solid #e0e0e0; padding-left:1em;} +#courses-index ul.courses li.root {margin-bottom: 1em;} +#courses-index ul.courses li.child {margin-top: 1em;} +#courses-index ul.courses div.root a.course {font-family:'微软雅黑', "Trebuchet MS", Verdana, sans-serif; font-weight: bold; font-size: 14px; margin: 0 0 10px 0; } +.my-course { padding-left: 18px; background: url(../images/fav.png) no-repeat 0 50%; } + + + +/***** Tabular forms ******/ +.tabular p{ + margin: 0; + padding: 3px 0 3px 0; + padding-left: 100px; /* width of left column containing the label elements *//*by young*/ + /*min-height: 1.8em;*/ + clear:left; +} + +.tabular .tabDiv{ + margin: 0; + padding: 3px 0 3px 0; + padding-left: 100px; /* width of left column containing the label elements *//*by young*/ + /*min-height: 1.8em;*/ + clear:left; +} + +html>body .tabular p {overflow:hidden;} + +.tabular label{ + font-weight: bold; + float: left; + text-align: right; + /* width of left column */ + margin-left: -180px; + /* width of labels. Should be smaller than left column to create some right margin */ + width: 175px; + font-size: 12px; +} + +.tabular label.floating{ + font-weight: normal; + margin-left: 0px; + text-align: left; + width: 270px; +} + +.tabular label.block{ + font-weight: normal; + margin-left: 0px !important; + text-align: left; + float: none; + display: block; + width: auto; +} + +.tabular label.inline{ + font-weight: normal; + float:none; + margin-left: 5px !important; + width: auto; +} + +label.no-css { + font-weight: inherit; + float:none; + text-align:left; + margin-left:0px; + width:auto; +} +input#time_entry_comments { width: 90%;} + +#preview fieldset {margin-top: 1em; background: url(../images/draft.png)} + +.tabular.settings p{ padding-left: 300px; } +.tabular.settings label{ margin-left: -300px; width: 295px; } +.tabular.settings textarea { width: 99%; } + +.settings.enabled_scm table {width:100%} +.settings.enabled_scm td.scm_name{ font-weight: bold; } + +fieldset.settings label { display: block; } +fieldset#notified_events .parent { padding-left: 20px; } + +span.required {color: #bb0000;} +.summary {font-style: italic;} + +#attachments_fields input.description {margin-left:4px; width:100px; } +#attachments_fields span {display:block; white-space:nowrap;} +#attachments_fields span .boldSpan{display:block; white-space:nowrap; font-family:'微软雅黑';} +#attachments_fields input.filename {border:0; height:1.8em; width:150px; color:#555; background-color:inherit; background:url(../images/attachment.png) no-repeat 1px 50%; padding-left:18px;}/*Modified by young*/ +#attachments_fields .ajax-waiting input.filename {background:url(../images/hourglass.png) no-repeat 0px 50%;} +#attachments_fields .ajax-loading input.filename {background:url(../images/loading.gif) no-repeat 0px 50%;} +#attachments_fields div.ui-progressbar { width: 100px; height:14px; margin: 2px 0 -5px 8px; display: inline-block; } +a.remove-upload {background: url(../images/delete.png) no-repeat 1px 50%; width:1px; display:inline-block; padding-left:16px;} +a.remove-upload:hover {text-decoration:none !important;} +#attachments_fields input.is_public_checkbox {width:20px;} +#attachments_fields span.ispublic-label {display:inline-block;width:30px;margin-left:10px; } + +/*gcm upload file count and deleteall*/ +#upload_file_count #count {color:red; font-size:1.5em;} +span.add_attachment .remove_all {background:none;background: url(../images/delete.png) no-repeat 1px 50%; width:1px; display:inline-block;right:10%;text-decoration:none;} + + +div.fileover { background-color: lavender; } + +div.attachments { margin-top: 12px; } +div.attachments p { margin:4px 0 2px 0; } +div.attachments img { vertical-align: middle; } +div.attachments span.author { font-size: 0.9em; color: #888; } + +div.thumbnails {margin-top:0.6em;} +div.thumbnails div {background:#fff;border:2px solid #ddd;display:inline-block;margin-right:2px;} +div.thumbnails img {margin: 3px;} + +p.other-formats { text-align: right; font-size:0.9em; color: #666; } +.other-formats span + span:before { content: "| "; } + +a.atom { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; } + +/*modified by bai 改变了字体颜色和加粗*/ +em.info {font-style:normal; font-size:90%; color:#505050; font-weight:bold; display:block;} +em.info.error {padding-left:20px; background:url(../images/exclamation.png) no-repeat 0 50%;} +/*end*/ +textarea.text_cf {width:90%;} + +#tab-content-modules fieldset p {margin:3px 0 4px 0;} + +#tab-content-members .splitcontentleft, #tab-content-memberships .splitcontentleft, #tab-content-users .splitcontentleft {width: 64%;} +#tab-content-members .splitcontentright, #tab-content-memberships .splitcontentright, #tab-content-users .splitcontentright {width: 34%;} +#tab-content-members fieldset, #tab-content-memberships fieldset, #tab-content-users fieldset {padding:1em; margin-bottom: 1em;} +#tab-content-members fieldset legend, #tab-content-memberships fieldset legend, #tab-content-users fieldset legend {font-weight: bold; font-size: 12px} +#tab-content-members fieldset label, #tab-content-memberships fieldset label, #tab-content-users fieldset label {display: block;} +#tab-content-members #principals, #tab-content-users #principals {max-height: 400px; overflow: auto;} + +#users_for_watcher {height: 200px; overflow:auto;} +#users_for_watcher label {display: block;} + +table.members td.group { padding-left: 20px; background: url(../images/group.png) no-repeat 0% 50%; } + +input#principal_search, input#user_search {width:90%} + +input.autocomplete { + background: #fff url(../images/magnifier.png) no-repeat right 50%; padding-left:20px; + border:1px solid #9EB1C2; border-radius:2px; height:1.5em; +} +input.autocomplete.ajax-loading { + background-image: url(../images/loading.gif); +} + +/***** Flash & error messages ****/ +#errorExplanation, div.flash, .nodata, .warning, .conflict { + padding: 4px 4px 4px 30px; + margin-bottom: 12px; + font-size: 1.1em; + border: 2px solid; +} + +div.flash {margin-top: 8px;} + +div.flash.error, #errorExplanation { + background: url(../images/exclamation.png) 8px 50% no-repeat; + background-color: #ffe3e3; + border-color: #dd0000; + color: #880000; +} + +div.flash.notice { + background: url(../images/true.png) 8px 5px no-repeat; + background-color: #dfffdf; + border-color: #9fcf9f; + color: #005f00; +} + +div.flash.warning, .conflict { + background: url(../images/warning.png) 8px 5px no-repeat; + background-color: #FFEBC1; + border-color: #FDBF3B; + color: #A6750C; + text-align: left; +} + +.nodata, .warning { + text-align: center; + background-color: #FFEBC1; + border-color: #FDBF3B; + color: #A6750C; +} + +#errorExplanation ul { font-size: 0.9em;} +#errorExplanation h2, #errorExplanation p { display: none; } + +.conflict-details {font-size:80%;} + +/***** Ajax indicator ******/ +#ajax-indicator { +position: absolute; /* fixed not supported by IE */ +background-color:#eee; +border: 1px solid #bbb; +top:35%; +left:40%; +width:20%; +font-weight:bold; +text-align:center; +padding:0.6em; +z-index:100; +opacity: 0.5; +} + +html>body #ajax-indicator { position: fixed; } + +#ajax-indicator span { +background-position: 0% 40%; +background-repeat: no-repeat; +background-image: url(../images/loading.gif); +padding-left: 26px; +vertical-align: bottom; +} + +/***** Calendar *****/ +table.cal {border-collapse: collapse; width: 100%; margin: 0px 0 6px 0;border: 1px solid #d7d7d7;} +table.cal thead th {width: 14%; background-color:#EEEEEE; padding: 4px; } +table.cal thead th.week-number {width: auto;} +table.cal tbody tr {height: 100px;} +table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;} +table.cal td.week-number { background-color:#EEEEEE; padding: 4px; border:none; font-size: 1em;} +table.cal td p.day-num {font-size: 1.1em; text-align:right;} +table.cal td.odd p.day-num {color: #bbb;} +table.cal td.today {background:#ffffdd;} +table.cal td.today p.day-num {font-weight: bold;} +table.cal .starting a, p.cal.legend .starting {background: url(../images/bullet_go.png) no-repeat -1px -2px; padding-left:16px;} +table.cal .ending a, p.cal.legend .ending {background: url(../images/bullet_end.png) no-repeat -1px -2px; padding-left:16px;} +table.cal .starting.ending a, p.cal.legend .starting.ending {background: url(../images/bullet_diamond.png) no-repeat -1px -2px; padding-left:16px;} +p.cal.legend span {display:block;} + +/***** Tooltips ******/ +.tooltip{position:relative;z-index:24;} +.tooltip:hover{z-index:25;color:#000;} +.tooltip span.tip{display: none; text-align:left;} + +div.tooltip:hover span.tip{ +display:block; +position:absolute; +top:12px; left:24px; width:270px; +border:1px solid #555; +background-color:#fff; +padding: 4px; +font-size: 0.8em; +color:#505050; +} + +img.ui-datepicker-trigger { + cursor: pointer; + vertical-align: middle; + margin-left: 4px; +} + +/***** Progress bar *****/ +table.progress { + border-collapse: collapse; + border-spacing: 0pt; + empty-cells: show; + text-align: center; + float:left; + margin: 1px 6px 1px 0px; +} + +table.progress td { height: 1em; } +table.progress td.closed { background: #BAE0BA none repeat scroll 0%; } +table.progress td.done { background: #D3EDD3 none repeat scroll 0%; } +table.progress td.todo { background: #eee none repeat scroll 0%; } +p.percent {font-size: 80%;} +p.progress-info {clear: left; font-size: 80%; margin-top:-4px; color:#777;} + +#roadmap table.progress td { height: 1.2em; } +/***** Tabs *****/ +#content .tabs {height: 2.6em; margin-bottom:1.2em; position:relative; overflow:hidden;} +#content .tabs ul {margin:0; position:absolute; bottom:0; padding-left:0.5em; font-family: 14px; width:2000px; border-bottom: 1px solid #15BCCF;} +#content .tabs ul li { + float:left; + list-style-type:none; + white-space:nowrap; + margin-right:0px; + background:#fff; + position:relative; + margin-bottom:-1px; +} +#content .tabs ul li a{ + display:block; + font-size: 14px; + text-decoration: none; + line-height:1.3em; + padding:2px 6px 2px 6px; + background-color:#fff; + color:#606060; + font-weight:bold; + border-top-left-radius:3px; + border-top-right-radius:3px; +} + +#content .tabs ul li a:hover { + background-color: #fff; + text-decoration:none; +} + +#content .tabs ul li a.selected { + background-color: #fff; + border: 1px solid #15BCCF; + border-bottom: 1px solid #fff; + color:#111; +} + +#content .tabs ul li a.selected:hover {background-color: #E2F4FF;} + +div.tabs-buttons { position:absolute; right: 0; width: 48px; height: 24px; background: white; bottom: 0; border-bottom: 1px solid #bbbbbb; } + +button.tab-left, button.tab-right { + font-size: 0.9em; + cursor: pointer; + height:24px; + border: 1px solid #ccc; + border-bottom: 1px solid #bbbbbb; + position:absolute; + padding:4px; + width: 20px; + bottom: -1px; + +} + +button.tab-left { + right: 20px; + background: #eeeeee url(../images/bullet_arrow_left.png) no-repeat 50% 50%; + border-top-left-radius:3px; +} + +button.tab-right { + right: 0; + background: #eeeeee url(../images/bullet_arrow_right.png) no-repeat 50% 50%; + border-top-right-radius:3px; +} +/*added by young*/ +/***** Settings Tabs *****/ +/*modified by huang*/ +#content .tabs_new {height: 2.6em; margin-bottom:1.2em; margin-top: 0.8em; position:relative; overflow:hidden;} +#content .tabs_new ul {margin:0; position:absolute; bottom:0; padding-left: 0.5em; width: 100%; border-bottom: 1px solid #15BCCF;font-size:14px;} +#content .tabs_new ul li { + width:80px; /*modified by linchun*/ + float:left; + list-style-type:none; + white-space:nowrap; + margin-right:4px; + background:#fff; + position:relative; + margin-bottom:-1px; +} +#content .tabs_new ul li a{ + display:block; + font-size: 15px; + text-decoration:none; + line-height:1.2em; + padding-top: 6px; + padding-bottom: 2px; + text-align: center; + border: 1px solid #15BCCF; + /*border-bottom: 0px solid #15BCCF;*/ + + color:#606060; + font-weight:bold; + border-top-left-radius:4px; + border-top-right-radius:4px; + /*new added*/ + margin-top: 16px; + /*end*/ +} + +#content .tabs_new ul li a:hover { + background-color: #E2F4FF; + text-decoration:none; +} + +#content .tabs_new ul li a.selected { + background-color: rgba(28, 158, 199, 0.68); + border: 1px solid #15BCCF; + border-bottom: 1px solid #fff; + color:#FFF; +} + +#content .tabs_new ul li a.selected:hover {background-color: #15BCCC;} + +div.tabs_new-buttons { position:absolute; right: 0; width: 48px; height: 24px; background: white; bottom: 0; border-bottom: 1px solid #bbbbbb; } + +button.tab_new-left, button.tab_new-right { + font-size: 0.9em; + cursor: pointer; + height:24px; + border: 1px solid #ccc; + border-bottom: 1px solid #bbbbbb; + position:absolute; + padding:4px; + width: 20px; + bottom: -1px; +} + +button.tab_new-left { + right: 20px; + background: #eeeeee url(../images/bullet_arrow_left.png) no-repeat 50% 50%; + border-top-left-radius:3px; +} + +button.tab_new-right { + right: 0; + background: #eeeeee url(../images/bullet_arrow_right.png) no-repeat 50% 50%; + border-top-right-radius:3px; +} + + +/*added by huang*/ +#content .tabs_new_enterprise {height: 2.6em; margin-bottom:1.2em; margin-top: 0.8em; position:relative; overflow:hidden;} +#content .tabs_new_enterprise ul {margin:0; position:absolute; bottom:0; padding-left: 0.5em; width: 2000px; border-bottom: 1px solid #ac344f;font-size:14px;} +#content .tabs_new_enterprise ul li { + width:85px; /*modified by linchun*/ + float:left; + list-style-type:none; + white-space:nowrap; + margin-right:4px; + background:#fff; + position:relative; + margin-bottom:-1px; +} +#content .tabs_new_enterprise ul li a{ + display:block; + font-size: 15px; + text-decoration:none; + line-height:1.2em; + padding-top: 6px; + padding-bottom: 2px; + text-align: center; + + border: 1px solid #b60003; + /*border-bottom: 0px solid #15BCCF;*/ + + color:#606060; + font-weight:bold; + border-top-left-radius:4px; + border-top-right-radius:4px; +} + +#content .tabs_new_enterprise ul li a:hover { + background-color: #cda3ad; + text-decoration:none; +} + +#content .tabs_new_enterprise ul li a.selected { + background-color: #9f4056; + border: 1px solid #ac344f; + border-bottom: 1px solid #fff; + color:#FFF; +} + +#content .tabs_new_enterprise ul li a.selected:hover {background-color: #ac344f;} + +div.tabs_new_enterprise-buttons { position:absolute; right: 0; width: 48px; height: 24px; background: white; bottom: 0; border-bottom: 1px solid #bbbbbb; } + +button.tabs_new_enterprise-left, button.tabs_new_enterprise-right { + font-size: 0.9em; + cursor: pointer; + height:24px; + border: 1px solid #ccc; + border-bottom: 1px solid #bbbbbb; + position:absolute; + padding:4px; + width: 20px; + bottom: -1px; +} + +button.tabs_new_enterprise-left { + right: 20px; + background: #eeeeee url(../images/bullet_arrow_left.png) no-repeat 50% 50%; + border-top-left-radius:3px; +} + +button.tabs_new_enterprise-right { + right: 0; + background: #eeeeee url(../images/bullet_arrow_right.png) no-repeat 50% 50%; + border-top-right-radius:3px; +} +/*end*/ +/*added by huang*/ +#content_ .tabs {height: 3.5em; margin-bottom:1.2em; position:relative; overflow:hidden;} +#content_ .tabs ul {margin:0; position:absolute; bottom:0; padding-left:0.5em; width:2000px; border-bottom: 1px solid #15BCCF;font-size:14px;} +#content_ .tabs ul li { + float:left; + list-style-type:none; + white-space:nowrap; + margin-right:0px; + background:#fff; + position:relative; + margin-bottom:-1px; +} +#content_ .tabs ul li a{ + + display:block; + font-size: 13px; + text-decoration: none; + line-height:1.3em; + padding:4px 6px 4px 6px; + background-color:#fff; + color:#606060; + font-weight:bold; + border-top-left-radius:3px; + border-top-right-radius:3px; +} + +#content_ .tabs ul li a:hover { + background-color: #fff; + text-decoration:none; +} + +#content_ .tabs ul li a.selected { + background-color: #fff; + border: 1px solid #15BCCF; + border-bottom: 1px solid #fff; + color:#111; +} + +#content_ .tabs ul li a.selected:hover {background-color: #E2F4FF;} +/*end*/ +/*added by huang*/ +#content_ .tabs_enterprise {height: 3.5em; margin-bottom:1.2em; position:relative; overflow:hidden;} +#content_ .tabs_enterprise ul {margin:0; position:absolute; bottom:0; padding-left:0.5em; width:2000px; border-bottom: 1px solid #bc7787;font-size:14px;} +#content_ .tabs_enterprise ul li { + float:left; + list-style-type:none; + white-space:nowrap; + margin-right:0px; + background:#fff; + position:relative; + margin-bottom:-1px; +} +#content_ .tabs_enterprise ul li a{ + + display:block; + font-size: 13px; + text-decoration: none; + line-height:1.3em; + padding:4px 6px 4px 6px; + background-color:#fff; + color:#606060; + font-weight:bold; + border-top-left-radius:3px; + border-top-right-radius:3px; +} + +#content_ .tabs_enterprise ul li a:hover { + background-color: #fff; + text-decoration:none; +} + +#content_ .tabs_enterprise ul li a.selected { + background-color: #fff; + border: 1px solid #bc7787; + border-bottom: 1px solid #fff; + color:#111; +} + +#content_ .tabs_enterprise ul li a.selected:hover {background-color: #E2F4FF;} +/*end*/ +/*end*/ +/***** Diff *****/ +.diff_out { background: #fcc; } +.diff_out span { background: #faa; } +.diff_in { background: #cfc; } +.diff_in span { background: #afa; } + +.text-diff { + padding: 1em; + background-color:#f6f6f6; + color:#505050; + border: 1px solid #e4e4e4; +} + +/***** Wiki *****/ +div.wiki table { + border-collapse: collapse; + margin-bottom: 1em; +} + +div.wiki table, div.wiki td, div.wiki th { + border: 1px solid #bbb; + padding: 4px; +} + +div.wiki .noborder, div.wiki .noborder td, div.wiki .noborder th {border:0;} + +div.wiki .external { + background-position: 0% 60%; + background-repeat: no-repeat; + padding-left: 12px; + background-image: url(../images/external.png); +} + +div.wiki a.new {color: #b73535;} + +div.wiki ul, div.wiki ol {margin-bottom:1em;} + +div.wiki pre { + margin: 1em 1em 1em 1.6em; + padding: 8px; + background-color: #fafafa; + border: 1px solid #e2e2e2; + width:auto; + overflow-x: auto; + overflow-y: hidden; +} + +div.wiki ul.toc { + background-color: #ffffdd; + border: 1px solid #e4e4e4; + padding: 4px; + line-height: 1.2em; + margin-bottom: 12px; + margin-right: 12px; + margin-left: 0; + display: table +} +* html div.wiki ul.toc { width: 50%; } /* IE6 doesn't autosize div */ + +div.wiki ul.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; } +div.wiki ul.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; } +div.wiki ul.toc ul { margin: 0; padding: 0; } +div.wiki ul.toc li {list-style-type:none; margin: 0; font-size:12px;} +div.wiki ul.toc li li {margin-left: 1.5em; font-size:10px;} +div.wiki ul.toc a { + font-size: 0.9em; + font-weight: normal; + text-decoration: none; + color: #606060; +} +div.wiki ul.toc a:hover { color: #c61a1a; text-decoration: underline;} + +a.wiki-anchor { display: none; margin-left: 6px; text-decoration: none; } +a.wiki-anchor:hover { color: #aaa !important; text-decoration: none; } +h1:hover a.wiki-anchor, h2:hover a.wiki-anchor, h3:hover a.wiki-anchor { display: inline; color: #ddd; } + +div.wiki img { vertical-align: middle; } + +/***** My page layout *****/ +.block-receiver { + border:1px dashed #c0c0c0; + margin-bottom: 20px; + padding: 15px 0 15px 0; +} + +.mypage-box { + margin:0 0 20px 0; + color:#505050; + line-height:1.5em; +} + +.handle {cursor: move;} + +a.close-icon { + display:block; + margin-top:3px; + overflow:hidden; + width:12px; + height:12px; + background-repeat: no-repeat; + cursor:pointer; + background-image:url('../images/close.png'); +} +a.close-icon:hover {background-image:url('../images/close_hl.png');} + +/***** Gantt chart *****/ +.gantt_hdr { + position:absolute; + top:0; + height:16px; + border-top: 1px solid #c0c0c0; + border-bottom: 1px solid #c0c0c0; + border-right: 1px solid #c0c0c0; + text-align: center; + overflow: hidden; +} + +.gantt_hdr.nwday {background-color:#f1f1f1;} + +.gantt_subjects { font-size: 0.8em; } +.gantt_subjects div { line-height:16px;height:16px;overflow:hidden;white-space:nowrap;text-overflow: ellipsis; } + +.task { + position: absolute; + height:8px; + font-size:0.8em; + color:#888; + padding:0; + margin:0; + line-height:16px; + white-space:nowrap; +} + +.task.label {width:100%;} +.task.label.project, .task.label.version { font-weight: bold; } + +.task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; } +.task_done { background:#00c600 url(../images/task_done.png); border: 1px solid #00c600; } +.task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; } + +.task_todo.parent { background: #888; border: 1px solid #888; height: 3px;} +.task_late.parent, .task_done.parent { height: 3px;} +.task.parent.marker.starting { position: absolute; background: url(../images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-left: -4px; left: 0px; top: -1px;} +.task.parent.marker.ending { position: absolute; background: url(../images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-left: -4px; right: 0px; top: -1px;} + +.version.task_late { background:#f66 url(../images/milestone_late.png); border: 1px solid #f66; height: 2px; margin-top: 3px;} +.version.task_done { background:#00c600 url(../images/milestone_done.png); border: 1px solid #00c600; height: 2px; margin-top: 3px;} +.version.task_todo { background:#fff url(../images/milestone_todo.png); border: 1px solid #fff; height: 2px; margin-top: 3px;} +.version.marker { background-image:url(../images/version_marker.png); background-repeat: no-repeat; border: 0; margin-left: -4px; margin-top: 1px; } + +.project.task_late { background:#f66 url(../images/milestone_late.png); border: 1px solid #f66; height: 2px; margin-top: 3px;} +.project.task_done { background:#00c600 url(../images/milestone_done.png); border: 1px solid #00c600; height: 2px; margin-top: 3px;} +.project.task_todo { background:#fff url(../images/milestone_todo.png); border: 1px solid #fff; height: 2px; margin-top: 3px;} +.project.marker { background-image:url(../images/project_marker.png); background-repeat: no-repeat; border: 0; margin-left: -4px; margin-top: 1px; } + +.version-behind-schedule a, .issue-behind-schedule a {color: #f66914;} +.version-overdue a, .issue-overdue a, .project-overdue a {color: #f00;} + +/***** Icons *****/ +.icon { + background-position: 0% 50%; + background-repeat: no-repeat; + font-family: '微软雅黑'; /*modify by men*/ + padding-left: 20px; + padding-top: 2px; + padding-bottom: 3px; +} +.icon_enterprise { + background-position: 0% 50%; + background-repeat: no-repeat; + font-family: '微软雅黑'; /*modify by men*/ + padding-left: 20px; + padding-top: 2px; + padding-bottom: 3px; +} +.icon_enterprise-add { background-image: url(../images/add_enterprise.png); } +.icon-add { background-image: url(../images/add.png); } +.icon-edit { /*background-image: url(../images/edit.png);*/ } +.icon-copy { background-image: url(../images/copy.png); } +.icon-duplicate { background-image: url(../images/duplicate.png); } +.icon-del { /*background-image: url(../images/delete.png); */} +.icon-move { background-image: url(../images/move.png); } +.icon-save { background-image: url(../images/save.png); } +.icon-cancel { background-image: url(../images/cancel.png); } +.icon-multiple { background-image: url(../images/table_multiple.png); } +.icon-folder { background-image: url(../images/folder.png); } +.open .icon-folder { background-image: url(../images/folder_open.png); } +.icon-package { background-image: url(../images/package.png); } +.icon-user { background-image: url(../images/user.png); } +.icon-projects { background-image: url(../images/projects.png); } +.icon-help { background-image: url(../images/help.png); } +.icon-attachment { background-image: url(../images/attachment.png); } +.icon-history { background-image: url(../images/history.png); } +.icon-time { background-image: url(../images/time.png); } +.icon-time-add { background-image: url(../images/time_add.png); } +.icon-stats { background-image: url(../images/stats.png); } +.icon-warning { background-image: url(../images/warning.png); } +.icon-fav { background-image: url(../images/fav.png); } +.icon-fav-off { background-image: url(../images/fav_off.png); } +.icon-reload { background-image: url(../images/reload.png); } +.icon-lock { background-image: url(../images/locked.png); } +.icon-unlock { background-image: url(../images/unlock.png); } +.icon-checked { background-image: url(../images/true.png); } +.icon-details { background-image: url(../images/zoom_in.png); } +.icon-report { background-image: url(../images/report.png); } +.icon-comment { /*background-image: url(../images/comment.png); */} +.icon-summary { background-image: url(../images/lightning.png); } +.icon-server-authentication { background-image: url(../images/server_key.png); } +.icon-issue { background-image: url(../images/ticket.png); } +.icon-zoom-in { background-image: url(../images/zoom_in.png); } +.icon-zoom-out { background-image: url(../images/zoom_out.png); } +.icon-passwd { background-image: url(../images/textfield_key.png); } +.icon-test { background-image: url(../images/bullet_go.png); } + +.icon-file { background-image: url(../images/files/default.png); } +.icon-file.text-plain { background-image: url(../images/files/text.png); } +.icon-file.text-x-c { background-image: url(../images/files/c.png); } +.icon-file.text-x-csharp { background-image: url(../images/files/csharp.png); } +.icon-file.text-x-java { background-image: url(../images/files/java.png); } +.icon-file.text-x-javascript { background-image: url(../images/files/js.png); } +.icon-file.text-x-php { background-image: url(../images/files/php.png); } +.icon-file.text-x-ruby { background-image: url(../images/files/ruby.png); } +.icon-file.text-xml { background-image: url(../images/files/xml.png); } +.icon-file.text-css { background-image: url(../images/files/css.png); } +.icon-file.text-html { background-image: url(../images/files/html.png); } +.icon-file.image-gif { background-image: url(../images/files/image.png); } +.icon-file.image-jpeg { background-image: url(../images/files/image.png); } +.icon-file.image-png { background-image: url(../images/files/image.png); } +.icon-file.image-tiff { background-image: url(../images/files/image.png); } +.icon-file.application-pdf { background-image: url(../images/files/pdf.png); } +.icon-file.application-zip { background-image: url(../images/files/zip.png); } +.icon-file.application-x-gzip { background-image: url(../images/files/zip.png); } + +img.gravatar { + padding: 2px; + border: solid 1px #d5d5d5; + background: #fff; + vertical-align: middle; +} + +div.issue img.gravatar { + float: left; + margin: 0 6px 0 0; + padding: 5px; +} + +div.issue table img.gravatar { + height: 14px; + width: 14px; + padding: 2px; + float: left; + margin: 0 0.5em 0 0; +} + +h2 img.gravatar {margin: -2px 4px -4px 0;} +h3 img.gravatar {margin: -4px 4px -4px 0;} +h4 img.gravatar {margin: -6px 4px -4px 0;} +td.username img.gravatar {margin: 0 0.5em 0 0; vertical-align: top;} +#activity dt img.gravatar {float: left; margin: 0 1em 1em 0;} +/* Used on 12px Gravatar img tags without the icon background */ +.icon-gravatar {float: left; margin-right: 4px;} + +#activity dt, .journal {clear: left;} + +.journal-link {float: right;} + +h2 img { vertical-align:middle; } + +.hascontextmenu { cursor: context-menu; } + +/************* CodeRay styles *************/ +.syntaxhl div {display: inline;} +.syntaxhl .line-numbers {padding: 2px 4px 2px 4px; background-color: #eee; margin:0px 5px 0px 0px;} +.syntaxhl .code pre { overflow: auto } +.syntaxhl .debug { color: white !important; background: blue !important; } + +.syntaxhl .annotation { color:#007 } +.syntaxhl .attribute-name { color:#b48 } +.syntaxhl .attribute-value { color:#700 } +.syntaxhl .binary { color:#509 } +.syntaxhl .char .content { color:#D20 } +.syntaxhl .char .delimiter { color:#710 } +.syntaxhl .char { color:#D20 } +.syntaxhl .class { color:#258; font-weight:bold } +.syntaxhl .class-variable { color:#369 } +.syntaxhl .color { color:#0A0 } +.syntaxhl .comment { color:#385 } +.syntaxhl .comment .char { color:#385 } +.syntaxhl .comment .delimiter { color:#385 } +.syntaxhl .complex { color:#A08 } +.syntaxhl .constant { color:#258; font-weight:bold } +.syntaxhl .decorator { color:#B0B } +.syntaxhl .definition { color:#099; font-weight:bold } +.syntaxhl .delimiter { color:black } +.syntaxhl .directive { color:#088; font-weight:bold } +.syntaxhl .doc { color:#970 } +.syntaxhl .doc-string { color:#D42; font-weight:bold } +.syntaxhl .doctype { color:#34b } +.syntaxhl .entity { color:#800; font-weight:bold } +.syntaxhl .error { color:#F00; background-color:#FAA } +.syntaxhl .escape { color:#666 } +.syntaxhl .exception { color:#C00; font-weight:bold } +.syntaxhl .float { color:#06D } +.syntaxhl .function { color:#06B; font-weight:bold } +.syntaxhl .global-variable { color:#d70 } +.syntaxhl .hex { color:#02b } +.syntaxhl .imaginary { color:#f00 } +.syntaxhl .include { color:#B44; font-weight:bold } +.syntaxhl .inline { background-color: hsla(0,0%,0%,0.07); color: black } +.syntaxhl .inline-delimiter { font-weight: bold; color: #666 } +.syntaxhl .instance-variable { color:#33B } +.syntaxhl .integer { color:#06D } +.syntaxhl .key .char { color: #60f } +.syntaxhl .key .delimiter { color: #404 } +.syntaxhl .key { color: #606 } +.syntaxhl .keyword { color:#939; font-weight:bold } +.syntaxhl .label { color:#970; font-weight:bold } +.syntaxhl .local-variable { color:#963 } +.syntaxhl .namespace { color:#707; font-weight:bold } +.syntaxhl .octal { color:#40E } +.syntaxhl .operator { } +.syntaxhl .predefined { color:#369; font-weight:bold } +.syntaxhl .predefined-constant { color:#069 } +.syntaxhl .predefined-type { color:#0a5; font-weight:bold } +.syntaxhl .preprocessor { color:#579 } +.syntaxhl .pseudo-class { color:#00C; font-weight:bold } +.syntaxhl .regexp .content { color:#808 } +.syntaxhl .regexp .delimiter { color:#404 } +.syntaxhl .regexp .modifier { color:#C2C } +.syntaxhl .regexp { background-color:hsla(300,100%,50%,0.06); } +.syntaxhl .reserved { color:#080; font-weight:bold } +.syntaxhl .shell .content { color:#2B2 } +.syntaxhl .shell .delimiter { color:#161 } +.syntaxhl .shell { background-color:hsla(120,100%,50%,0.06); } +.syntaxhl .string .char { color: #46a } +.syntaxhl .string .content { color: #46a } +.syntaxhl .string .delimiter { color: #46a } +.syntaxhl .string .modifier { color: #46a } +.syntaxhl .symbol .content { color:#d33 } +.syntaxhl .symbol .delimiter { color:#d33 } +.syntaxhl .symbol { color:#d33 } +.syntaxhl .tag { color:#070 } +.syntaxhl .type { color:#339; font-weight:bold } +.syntaxhl .value { color: #088; } +.syntaxhl .variable { color:#037 } + +.syntaxhl .insert { background: hsla(120,100%,50%,0.12) } +.syntaxhl .delete { background: hsla(0,100%,50%,0.12) } +.syntaxhl .change { color: #bbf; background: #007; } +.syntaxhl .head { color: #f8f; background: #505 } +.syntaxhl .head .filename { color: white; } + +.syntaxhl .delete .eyecatcher { background-color: hsla(0,100%,50%,0.2); border: 1px solid hsla(0,100%,45%,0.5); margin: -1px; border-bottom: none; border-top-left-radius: 5px; border-top-right-radius: 5px; } +.syntaxhl .insert .eyecatcher { background-color: hsla(120,100%,50%,0.2); border: 1px solid hsla(120,100%,25%,0.5); margin: -1px; border-top: none; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; } + +.syntaxhl .insert .insert { color: #0c0; background:transparent; font-weight:bold } +.syntaxhl .delete .delete { color: #c00; background:transparent; font-weight:bold } +.syntaxhl .change .change { color: #88f } +.syntaxhl .head .head { color: #f4f } + +/***** Media print specific styles *****/ +@media print { + #top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; } + #main { background: #fff; } + #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; overflow: visible !important;} + #wiki_add_attachment { display:none; } + .hide-when-print { display: none; } + .autoscroll {overflow-x: visible;} + table.list {margin-top:0.5em;} + table.list th, table.list td {border: 1px solid #aaa;} +} + +/* Accessibility specific styles */ +.hidden-for-sighted { + position:absolute; + left:-10000px; + top:auto; + width:1px; + height:1px; + overflow:hidden; +} + +/*added by william*/ +#tag { + background: url(../images/issue_tag.png) no-repeat right -19px; + border-radius: 3px; + color: #3a587d !important; + padding: 1px 4px 2px 4px; + margin: 3px; + display: inline-block; + font-size: 13px; /*modified by linchun*/ + text-decoration: none; + cursor: pointer; +} + +/*tanxianbo*/ +div.repos_explain{ + word-wrap: normal; + line-height: 8px; + font-size: 13px; + background-color: #f8f8f8; + border: 1px solid #ddd; + overflow: auto; + border-radius: 3px; + padding: 6px 10px; + font-family: Consolas, 'Liberation Mono', Courier, monospace; + color: rgb(51, 51, 51); +} +#admin-index{ + margin-left: -220px; +} + +/* new linchun compitition */ +.contest_underline{ + margin:1; + padding:1; + width:900px; + height:0.5px; + background-color:#aaa; + overflow:hidden +} + +.underline-contests_one{ + margin-bottom: 10px; + border-bottom: 1px dashed rgb(204, 204, 204); + width: 930px; +} +.underline-contests_two{ + margin-bottom: 10px; + border-bottom: 1px dashed rgb(204, 204, 204); + width: 660px; +} +.underline-contests_three{ + margin-bottom: 10px; + border-bottom: 1px dashed rgb(204, 204, 204); + width: 688px; +} +.underline-contests_four{ + margin-bottom: 10px; + border-bottom: 1px dashed rgb(204, 204, 204); + width: 349px; + padding-bottom:5px +} +.contest-star{ + color: #bb0000; +} + +.contes-new-box{ + background: #fcfcfc; + padding-left: 85px; + padding-top: 20px; + padding-bottom: 20px; +} diff --git a/public/stylesheets/welcome.css b/public/stylesheets/welcome.css index c6bdd1ab5..3e333d231 100644 --- a/public/stylesheets/welcome.css +++ b/public/stylesheets/welcome.css @@ -340,7 +340,7 @@ a.attachments_list_color { } #identifier-pannel{ - position:fixed; + position:absolute; left: 50%; bottom:0; z-index:9999;