diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb
index db77283cc..4525176ac 100644
--- a/app/controllers/attachments_controller.rb
+++ b/app/controllers/attachments_controller.rb
@@ -1,372 +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|
- # modify by nwb
- 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/messages_controller.rb b/app/controllers/messages_controller.rb
index 44496c3d7..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{
" << @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/projects_controller.rb b/app/controllers/projects_controller.rb
index c0561bd1c..c1593e320 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -468,8 +468,8 @@ class ProjectsController < ApplicationController
def new
@issue_custom_fields = IssueCustomField.sorted.all
- @trackers = Tracker.sorted.all
- @project = Project.new
+ @trackers = Tracker.sorted.all
+ @project = Project.new
@project.safe_attributes = params[:project]
render :layout => 'base'
end
@@ -836,7 +836,7 @@ class ProjectsController < ApplicationController
format.api { render_api_ok }
end
else
- render :layout => "base"
+ render :layout => "project_base"
end
# hide project in layout
@project = nil
diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb
index ef4c9b061..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
- 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 d15036fa0..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.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 3641e0c61..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_back_or_default 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 641f02af7..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.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 10aa39df2..0393206b7 100644
--- a/app/controllers/zipdown_controller.rb
+++ b/app/controllers/zipdown_controller.rb
@@ -1,170 +1,175 @@
-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_403 :message => :no_file_dowmload ,:layout => "course_base"
- end
- else
- render_403 :message =>:notice_file_not_found ,: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
- # 得到每一个人所有文件打包的zip文件
- # 并将每一个人的zip打包为一个并返回路径
- user_zip_paths = homeattaches.map do |homeattach|
- if homeattach.attachments.count > 0
- zip_homework_by_user homeattach
- end
- 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/models/project.rb b/app/models/project.rb
index 1a2c0504d..ddb92a587 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -1,1152 +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 )
-
- 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 c3d306c58..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
- 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/attachments/_form.html.erb b/app/views/attachments/_form.html.erb
index bb043cd70..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()" %>
-<%= 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 be165ad42..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/contests/_new_softapplication.html.erb b/app/views/contests/_new_softapplication.html.erb
index 11be49fbc..71e5d0568 100644
--- a/app/views/contests/_new_softapplication.html.erb
+++ b/app/views/contests/_new_softapplication.html.erb
@@ -1,232 +1,232 @@
-<%#= error_messages_for 'softapplication' %>
-
-
-
-<%= form_for Softapplication.new, :url => softapplications_path do |f| %>
-
- <%= hidden_field_tag 'contest_id', @contest.id %>
-
- <%= l(:label_work_name) %>
- * :
-
- <%= f.text_field :name,
- :required => true,
- :size => 60,
- :style => "width:320px;",
- :onblur => "regexName();"
- %>
-
- (<%= l(:label_workname_lengthlimit) %>)
-
-
-
-
-
-
- <%= l(:label_running_platform) %>
- * :
-
- <%= f.text_field :android_min_version_available,
- :required => true,
- :size => 60,
- :style => "width:320px;",
- :onblur=>"regexWorkdescription();"
- %>
-
- (<%= l(:label_workdescription_lengthlimit) %>)
-
-
-
-
-
-
- <%= l(:label_work_type) %>
- * :
-
-
- <%#= 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 :other_input, :required => true, :size => 60, :style => "width:100px;" %>
-
-
-
-
-
-
-
-
- <%= l(:label_work_description) %>
- * :
-
- <%= f.text_field :description,
- :required => true,
- :size => 60,
- :style => "width:320px;"
- %>
-
-
-
-
-
-
-
-
- <%= l(:label_softapplication_developers) %>
- * :
-
- <%= f.text_field :application_developers,
- :required => true,
- :size => 60,
- :style => "width:320px;",
- :onblur => 'regexDevelopers();'
- %>
-
-
- (<%= 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'" %>
-
+<%#= error_messages_for 'softapplication' %>
+
+
+
+<%= form_for Softapplication.new, :url => softapplications_path do |f| %>
+
+ <%= hidden_field_tag 'contest_id', @contest.id %>
+
+ <%= l(:label_work_name) %>
+ * :
+
+ <%= f.text_field :name,
+ :required => true,
+ :size => 60,
+ :style => "width:320px;",
+ :onblur => "regexName();"
+ %>
+
+ (<%= l(:label_workname_lengthlimit) %>)
+
+
+
+
+
+
+ <%= l(:label_running_platform) %>
+ * :
+
+ <%= f.text_field :android_min_version_available,
+ :required => true,
+ :size => 60,
+ :style => "width:320px;",
+ :onblur=>"regexWorkdescription();"
+ %>
+
+ (<%= l(:label_workdescription_lengthlimit) %>)
+
+
+
+
+
+
+ <%= l(:label_work_type) %>
+ * :
+
+
+ <%#= 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 :other_input, :required => true, :size => 60, :style => "width:100px;" %>
+
+
+
+
+
+
+
+
+ <%= l(:label_work_description) %>
+ * :
+
+ <%= f.text_field :description,
+ :required => true,
+ :size => 60,
+ :style => "width:320px;"
+ %>
+
+
+
+
+
+
+
+
+ <%= l(:label_softapplication_developers) %>
+ * :
+
+ <%= f.text_field :application_developers,
+ :required => true,
+ :size => 60,
+ :style => "width:320px;",
+ :onblur => 'regexDevelopers();'
+ %>
+
+
+ (<%= 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/courses/_course.html.erb b/app/views/courses/_course.html.erb
index 12eec558f..239f2da26 100644
--- a/app/views/courses/_course.html.erb
+++ b/app/views/courses/_course.html.erb
@@ -11,7 +11,7 @@
<%= content_tag('span',"#{l(:label_bid_show_course_name)}:", :class => "course-font")%>
<% unless @course.is_public == 1 %>
- <%= l(:lable_private) %>
+ <%= l(:label_private) %>
<% end %>
<%= content_tag('span', link_to("#{@course.name}", course_path(@course), :class => "info"))%>
diff --git a/app/views/files/_course_sort_by_attachtypel.html.erb b/app/views/files/_course_sort_by_attachtypel.html.erb
index c13d76620..5a0cdba02 100644
--- a/app/views/files/_course_sort_by_attachtypel.html.erb
+++ b/app/views/files/_course_sort_by_attachtypel.html.erb
@@ -37,7 +37,7 @@
<%= number_to_human_size(file.filesize) %>
- <%= file.attachmentstype.nil? ? l(:lable_unknow_type):file.attachmentstype.typeName %>
+ <%= file.attachmentstype.nil? ? l(:label_unknow_type):file.attachmentstype.typeName %>
<%= render :partial => 'attachments/course_type_edit', :locals => {:attachmenttypes => attachmenttypes,
diff --git a/app/views/files/_sort_by_attachtypel.html.erb b/app/views/files/_sort_by_attachtypel.html.erb
index eb7ffffec..6c6e11791 100644
--- a/app/views/files/_sort_by_attachtypel.html.erb
+++ b/app/views/files/_sort_by_attachtypel.html.erb
@@ -37,7 +37,7 @@
<%= number_to_human_size(file.filesize) %>
- <%= file.attachmentstype.nil? ? l(:lable_unknow_type):file.attachmentstype.typeName %>
+ <%= file.attachmentstype.nil? ? l(:label_unknow_type):file.attachmentstype.typeName %>
<%= render :partial => 'attachments/type_edit', :locals => {:attachmenttypes => attachmenttypes,
diff --git a/app/views/forums/_form.html.erb b/app/views/forums/_form.html.erb
index 993563954..4679420f4 100644
--- a/app/views/forums/_form.html.erb
+++ b/app/views/forums/_form.html.erb
@@ -1,32 +1,32 @@
-
-
-
- <%= labelled_form_for(@forum) do |f| %>
- <% if @forum.errors.any? %>
-
- <% end %>
-
-
- <%= f.text_field :name, :required => true, :style => 'width: 100%;', :class => 'create-share' %>
-
-
-
- <%= f.text_area :description, :required => true, :id => 'editor01' %>
-
-
(<%= l(:lable_forums_max_length) %>)
-
-
- <%= submit_tag l(:button_submit) %>
- <%= link_to l(:button_back), forums_path ,:style => 'font-size: 14px; padding: 0px 3px;' %>
-
-
- <% end %>
-
+
+
+
+ <%= labelled_form_for(@forum) do |f| %>
+ <% if @forum.errors.any? %>
+
+ <% end %>
+
+
+ <%= f.text_field :name, :required => true, :style => 'width: 100%;', :class => 'create-share' %>
+
+
+
+ <%= f.text_area :description, :required => true, :id => 'editor01' %>
+
+
(<%= l(:label_forums_max_length) %>)
+
+
+ <%= submit_tag l(:button_submit) %>
+ <%= link_to l(:button_back), forums_path ,:style => 'font-size: 14px; padding: 0px 3px;' %>
+
+
+ <% end %>
+
diff --git a/app/views/forums/_forum_list.html.erb b/app/views/forums/_forum_list.html.erb
index 2b8f98494..df897151e 100644
--- a/app/views/forums/_forum_list.html.erb
+++ b/app/views/forums/_forum_list.html.erb
@@ -10,7 +10,7 @@
<%= link_to h(forum.name), forum_path(forum) %>
-
<%= forum.description%>
+
<%= textAreailizable forum.description%>
<%= authoring forum.created_at, forum.creator %>
<%= link_to (forum.memo_count), forum_path(forum) %> <%= link_to (forum.topic_count), forum_path(forum) %>
diff --git a/app/views/forums/show.html.erb b/app/views/forums/show.html.erb
index 48913a38d..4cd6631c2 100644
--- a/app/views/forums/show.html.erb
+++ b/app/views/forums/show.html.erb
@@ -1,56 +1,44 @@
-
-
-
<%=l(:label_memo_new)%>
- <% if User.current.logged? %>
- <%= labelled_form_for(@memo, :url => create_memo_forum_path(@forum), :html => {:multipart => true} ) do |f| %>
-
-
-
<%= f.text_field :subject, :required => true%>
-
<%= f.text_area :content, :required => true, :id => 'editor02' %>
-
-
(<%= l(:lable_memos_max_length) %>)
-
-
- <%= l(:label_attachment_plural) %>
- <%= render :partial => 'attachments/form', :locals => {:container => @memo} %>
-
- <%= f.submit :value => l(:label_memo_create) %>
- <%= link_to l(:button_cancel), "#", :onclick => '$("#add-memo").hide(); return false;' %>
-
- <% end %>
-<% end %>
-
-
-<% #= link_to '发布帖子', new_forum_memo_path(@forum), :class => 'icon icon-add' %>
-
- <%= link_to(
- image_tag('edit.png')+l(:label_forum_edit),
- {:action => 'edit', :id => @forum},
- :method => 'get',
- :title => l(:button_edit)
- ) if @forum.editable_by?(User.current) %>
- <%= link_to(
- image_tag('delete.png')+'删除讨论区',
- {:action => 'destroy', :id => @forum},
- :method => :delete,
- :data => {:confirm => l(:text_are_you_sure)},
- :title => l(:button_delete)
- ) if @forum.destroyable_by?(User.current) %>
-
-
- <%= link_to l(:label_memo_new_from_forum), new_forum_memo_path(@forum), :class => 'icon icon-add',
- :onclick => 'showAndScrollTo("add-memo", "memo_subject"); return false;' if User.current.logged? %>
-
-
-
-<%= render :partial => 'forums/show_topics', :locals => {:memos => @memos} %>
+
+
+
<%=l(:label_memo_new)%>
+ <% if User.current.logged? %>
+ <%= labelled_form_for(@memo, :url => create_memo_forum_path(@forum), :html => {:multipart => true} ) do |f| %>
+
+
<%= f.text_field :subject, :required => true%>
+
<%= f.text_area :content, :required => true, :id => 'editor02' %>
+
+
(<%= l(:label_memos_max_length) %>)
+
+ <%= l(:label_attachment_plural) %>
+ <%= render :partial => 'attachments/form', :locals => {:container => @memo} %>
+
+ <%= f.submit :value => l(:label_memo_create) %>
+ <%= link_to l(:button_cancel), "#", :onclick => '$("#add-memo").hide(); return false;' %>
+
+ <% end %>
+<% end %>
+
+
+<% #= link_to '发布帖子', new_forum_memo_path(@forum), :class => 'icon icon-add' %>
+
+ <%= link_to(
+ image_tag('edit.png')+l(:label_forum_edit),
+ {:action => 'edit', :id => @forum},
+ :method => 'get',
+ :title => l(:button_edit)
+ ) if @forum.editable_by?(User.current) %>
+ <%= link_to(
+ image_tag('delete.png')+'删除讨论区',
+ {:action => 'destroy', :id => @forum},
+ :method => :delete,
+ :data => {:confirm => l(:text_are_you_sure)},
+ :title => l(:button_delete)
+ ) if @forum.destroyable_by?(User.current) %>
+
+
+ <%= link_to l(:label_memo_new_from_forum), new_forum_memo_path(@forum), :class => 'icon icon-add',
+ :onclick => 'showAndScrollTo("add-memo", "memo_subject"); return false;' if User.current.logged? %>
+
+
+
+<%= render :partial => 'forums/show_topics', :locals => {:memos => @memos} %>
diff --git a/app/views/layouts/base_contest.html.erb b/app/views/layouts/base_contest.html.erb
index 0f2f4cf96..740016ff8 100644
--- a/app/views/layouts/base_contest.html.erb
+++ b/app/views/layouts/base_contest.html.erb
@@ -1,235 +1,235 @@
-<%
- @nav_dispaly_contest_label = 1
- @nav_dispaly_store_all_label = 1
-%>
-
-
-
-
- <%= h html_title %>
-
-
- <%= csrf_meta_tag %>
- <%= favicon %>
- <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2', 'application', :media => 'all' %>
- <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %>
- <%= javascript_heads %>
- <%= heads_for_theme %>
- <%= call_hook :view_layouts_base_html_head %>
-
- <%= yield :header_tags -%>
-
-
-
-
-
- <%=render :partial => 'layouts/base_header'%>
-
-
-
-
-
- <%=l(:label_contest_innovate_community)%>
- <%= l(:label_user_location) %> :
-
-
- <%= form_tag(:controller => 'bids', :action => 'contest', :method => :get) do %>
- <%= text_field_tag 'name', params[:name], :size => 20 %>
- <%= hidden_field_tag 'reward_type', @bid.reward_type %>
- <%= hidden_field_tag 'project_type', params[:project_type] %>
- <%= submit_tag l(:label_search), :class => "enterprise", :name => nil %>
- <% end %>
-
-
-
-
- <%=link_to request.host()+"/contest", :controller => 'bids', :action => 'contest' %>
- <%=link_to l(:field_homepage), home_path %> > <%=link_to l(:label_contest_innovate), :controller => 'bids', :action => 'contest' %> >
- <%= link_to @bid.name, bid_path %>
-
-
-
-
-
-
-
- <% if display_main_menu?(@bid) %>
-
- <%= render_menu :bid_menu %>
-
- <% end %>
-
- <%= yield %>
- <%= call_hook :view_layouts_base_content %>
-
-
- <%=render :partial => 'layouts/base_footer'%>
-
-
-
-
-
- <%= l(:label_loading) %>
-
-
-
-
- <%= call_hook :view_layouts_base_body_bottom %>
-
-
+<%
+ @nav_dispaly_contest_label = 1
+ @nav_dispaly_store_all_label = 1
+%>
+
+
+
+
+ <%= h html_title %>
+
+
+ <%= csrf_meta_tag %>
+ <%= favicon %>
+ <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2', 'application', :media => 'all' %>
+ <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %>
+ <%= javascript_heads %>
+ <%= heads_for_theme %>
+ <%= call_hook :view_layouts_base_html_head %>
+
+ <%= yield :header_tags -%>
+
+
+
+
+
+ <%=render :partial => 'layouts/base_header'%>
+
+
+
+
+
+ <%=l(:label_contest_innovate_community)%>
+ <%= l(:label_user_location) %> :
+
+
+ <%= form_tag(:controller => 'bids', :action => 'contest', :method => :get) do %>
+ <%= text_field_tag 'name', params[:name], :size => 20 %>
+ <%= hidden_field_tag 'reward_type', @bid.reward_type %>
+ <%= hidden_field_tag 'project_type', params[:project_type] %>
+ <%= submit_tag l(:label_search), :class => "enterprise", :name => nil %>
+ <% end %>
+
+
+
+
+ <%=link_to request.host()+"/contest", :controller => 'bids', :action => 'contest' %>
+ <%=link_to l(:field_homepage), home_path %> > <%=link_to l(:label_contest_innovate), :controller => 'bids', :action => 'contest' %> >
+ <%= link_to @bid.name, bid_path %>
+
+
+
+
+
+
+
+ <% if display_main_menu?(@bid) %>
+
+ <%= render_menu :bid_menu %>
+
+ <% end %>
+
+ <%= yield %>
+ <%= call_hook :view_layouts_base_content %>
+
+
+ <%=render :partial => 'layouts/base_footer'%>
+
+
+
+
+
+ <%= l(:label_loading) %>
+
+
+
+
+ <%= call_hook :view_layouts_base_body_bottom %>
+
+
diff --git a/app/views/layouts/base_forums.html.erb b/app/views/layouts/base_forums.html.erb
index ef376c2ec..d8a0b0a69 100644
--- a/app/views/layouts/base_forums.html.erb
+++ b/app/views/layouts/base_forums.html.erb
@@ -1,97 +1,99 @@
-<% @nav_dispaly_home_path_label = 1
- @nav_dispaly_main_course_label = 1
- @nav_dispaly_main_project_label = 1
- @nav_dispaly_main_contest_label = 1 %>
-<% @nav_dispaly_forum_label = 1%>
-
-
-
-
- <%= 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 %>
- <%= javascript_include_tag "ckeditor/ckeditor.js" %>
- <%= call_hook :view_layouts_base_html_head %>
- <%= yield :header_tags -%>
-
-
-
-
-
- <%=render :partial => 'layouts/base_header'%>
-
-
-
-
- 软件项目托管社区
- <%= l(:label_user_location) %> :
-
-
- <%= form_tag(:controller => 'forums', :action => "search_memo", :id => params[:id], :method => :get) do %>
- <%= text_field_tag 'name', params[:name], :size => 20 %>
- <%= hidden_field_tag 'forum_id', params[:id] %>
- <%= submit_tag l(:label_search), :class => "enterprise", :name => nil %>
- <% end %>
-
-
-
-
- <%= link_to request.host()+"/forums", forums_path %>
- <%=link_to l(:label_home),home_path %> > <%=link_to '公共贴吧', :controller => 'forums', :action => 'index' %> > <%=link_to @forum.name, forum_path(@forum) %>
-
-
-
-
-
-
- <%= render_flash_messages %>
- <%= yield %>
- <%= call_hook :view_layouts_base_content %>
-
-
-
- <%= render :partial => 'layouts/base_footer'%>
-
-
- <%= l(:label_loading) %>
-
-
-
-
-
- <%= call_hook :view_layouts_base_body_bottom %>
-
-
-
+<% @nav_dispaly_home_path_label = 1
+ @nav_dispaly_main_course_label = 1
+ @nav_dispaly_main_project_label = 1
+ @nav_dispaly_main_contest_label = 1 %>
+<% @nav_dispaly_forum_label = 1%>
+
+
+
+
+ <%= 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 %>
+ <%= javascript_include_tag "ckeditor/ckeditor.js" %>
+ <%= call_hook :view_layouts_base_html_head %>
+ <%= yield :header_tags -%>
+
+
+
+
+
+ <%=render :partial => 'layouts/base_header'%>
+
+
+
+
+ 软件项目托管社区
+ <%= l(:label_user_location) %> :
+
+
+ <%= form_tag(:controller => 'forums', :action => "search_memo", :id => params[:id], :method => :get) do %>
+ <%= text_field_tag 'name', params[:name], :size => 20 %>
+ <%= hidden_field_tag 'forum_id', params[:id] %>
+ <%= submit_tag l(:label_search), :class => "enterprise", :name => nil %>
+ <% end %>
+
+
+
+
+ <%= link_to request.host()+"/forums", forums_path %>
+ <%=link_to l(:label_home),home_path %> > <%=link_to '公共贴吧', :controller => 'forums', :action => 'index' %> > <%=link_to @forum.name, forum_path(@forum) %>
+
+
+
+
+
+
+ <%= render_flash_messages %>
+ <%= yield %>
+ <%= call_hook :view_layouts_base_content %>
+
+
+
+ <%= render :partial => 'layouts/base_footer'%>
+
+
+ <%= l(:label_loading) %>
+
+
+
+
+
+ <%= call_hook :view_layouts_base_body_bottom %>
+
+
+
diff --git a/app/views/layouts/base_memos.html.erb b/app/views/layouts/base_memos.html.erb
index 875fbd4fc..fdce1cc83 100644
--- a/app/views/layouts/base_memos.html.erb
+++ b/app/views/layouts/base_memos.html.erb
@@ -63,11 +63,16 @@
<%= image_tag(url_to_avatar(@forum.creator), :class => 'vatar-size') %>
-
<%=link_to @forum.creator.name, user_path(@forum.creator) %>
-
- <%= link_to l(:label_user_watcher)+"("+User.watched_by(@forum.creator.id).count.to_s+")" ,:controller=>"users", :action=>"user_watchlist", :id => @forum.creator.id %>
- <%= link_to l(:label_x_user_fans, :count => User.current.watcher_users(User.current.id).count)+"("+@forum.creator.watcher_users(@forum.creator.id).count.to_s+")", :controller=>"users", :action=>"user_fanslist", :id => @forum.creator.id %>
-
+
+ <% unless @forum.creator.nil? %>
+ <%=link_to @forum.creator.name, user_path(@forum.creator) %>
+
+ <%= link_to l(:label_user_watcher)+"("+User.watched_by(@forum.creator.id).count.to_s+")" ,:controller=>"users", :action=>"user_watchlist", :id => @forum.creator.id %>
+ <%= link_to l(:label_x_user_fans, :count => User.current.watcher_users(User.current.id).count)+"("+@forum.creator.watcher_users(@forum.creator.id).count.to_s+")", :controller=>"users", :action=>"user_fanslist", :id => @forum.creator.id %>
+
+
+ <% end %>
+
<% if User.current.logged? || User.current.admin? %>
diff --git a/app/views/layouts/base_newcontest.html.erb b/app/views/layouts/base_newcontest.html.erb
index 9dfb4a5dd..9fef1e3e6 100644
--- a/app/views/layouts/base_newcontest.html.erb
+++ b/app/views/layouts/base_newcontest.html.erb
@@ -1,245 +1,240 @@
-<%
- @nav_dispaly_contest_label = 1
- @nav_dispaly_store_all_label = 1
-%>
-
-
-
-
- <%= h html_title %>
-
-
- <%= csrf_meta_tag %>
- <%= favicon %>
- <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2', 'application', :media => 'all' %>
- <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %>
-
- <%= javascript_heads %>
- <%= heads_for_theme %>
- <%= call_hook :view_layouts_base_html_head %>
-
- <%= yield :header_tags -%>
-
-
-
-
-
- <%=render :partial => 'layouts/base_header'%>
-
-
-
-
-
- <%=l(:label_contest_innovate_community)%>
- <%= l(:label_user_location) %> :
-
-
- <%= form_tag({controller: 'contests', action: 'index'}, method: :get) do %>
- <%= text_field_tag 'name', params[:name], :size => 20 %>
- <%= hidden_field_tag 'project_type', params[:project_type] %>
- <%= submit_tag l(:label_search), :class => "enterprise", :name => nil %>
- <% 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 @contest.name, show_contest_contest_path(@contest) %>
-
-
-
-
-
-
-
-
-
- <% if display_main_menu?(@contest) %>
-
-
- <%= link_to l(:label_contest_notification), contest_contestnotifications_path(@contest), :class => link_class(:contestnotifications) %>
- <%= link_to l(:label_contest_joincontest), show_attendingcontest_contest_path(@contest), :class => link_class(:attendingcontests) %>
- <%= link_to l(:label_contest_userresponse), show_contest_contest_path(@contest), :class => link_class(:respond) %>
-
-
- <% end %>
-
- <%= yield %>
- <%= call_hook :view_layouts_base_content %>
-
-
- <%=render :partial => 'layouts/base_footer'%>
-
-
-
-
-
- <%= l(:label_loading) %>
-
-
-
-
- <%= call_hook :view_layouts_base_body_bottom %>
-
-
+<%
+ @nav_dispaly_contest_label = 1
+ @nav_dispaly_store_all_label = 1
+%>
+
+
+
+
+ <%= h html_title %>
+
+
+ <%= csrf_meta_tag %>
+ <%= favicon %>
+ <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2', 'application', :media => 'all' %>
+ <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %>
+
+ <%= javascript_heads %>
+ <%= heads_for_theme %>
+ <%= call_hook :view_layouts_base_html_head %>
+
+ <%= yield :header_tags -%>
+
+
+
+
+
+ <%=render :partial => 'layouts/base_header'%>
+
+
+
+
+
+ <%=l(:label_contest_innovate_community)%>
+ <%= l(:label_user_location) %> :
+
+
+ <%= form_tag({controller: 'contests', action: 'index'}, method: :get) do %>
+ <%= text_field_tag 'name', params[:name], :size => 20 %>
+ <%= hidden_field_tag 'project_type', params[:project_type] %>
+ <%= submit_tag l(:label_search), :class => "enterprise", :name => nil %>
+ <% 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 h(truncate(@contest.name, length: 20, omission: '...')), show_contest_contest_path(@contest) %>
+
+
+
+
+
+
+
+
+
+ <% if display_main_menu?(@contest) %>
+
+
+ <%= link_to l(:label_contest_notification), contest_contestnotifications_path(@contest), :class => link_class(:contestnotifications) %>
+ <%= link_to l(:label_contest_joincontest), show_attendingcontest_contest_path(@contest), :class => link_class(:attendingcontests) %>
+ <%= link_to l(:label_contest_userresponse), show_contest_contest_path(@contest), :class => link_class(:respond) %>
+
+
+ <% end %>
+
+ <%= yield %>
+ <%= call_hook :view_layouts_base_content %>
+
+
+ <%=render :partial => 'layouts/base_footer'%>
+
+
+
+
+
+ <%= l(:label_loading) %>
+
+
+
+
+ <%= call_hook :view_layouts_base_body_bottom %>
+
+
diff --git a/app/views/layouts/base_projects.html.erb b/app/views/layouts/base_projects.html.erb
index a3b8e267c..8f6d86f29 100644
--- a/app/views/layouts/base_projects.html.erb
+++ b/app/views/layouts/base_projects.html.erb
@@ -1,165 +1,156 @@
-
-<% @nav_dispaly_project_label = 1
- @nav_dispaly_forum_label = 1 %>
-<% #@nav_dispaly_project_label = 1 %>
-
-
-
-
- <%= 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 -%>
-
-
-
-
-
-
- <%=render :partial => 'layouts/base_header'%>
-
-
-
-
- 软件项目托管社区
- <%= l(:label_user_location) %> :
-
-
- <%= form_tag(projects_search_path, :method => :get) do %>
- <%= text_field_tag 'name', params[:name], :size => 20 %>
- <%= hidden_field_tag 'project_type', params[:project_type] %>
- <%= submit_tag l(:label_search), :class => "enterprise", :name => nil %>
- <% end %>
-
-
-
-
- <%= link_to request.host()+"/projects", :controller => 'projects', :action => 'index', :project_type => 0 %>
- <%=link_to l(:label_home),home_path %> > <%=link_to l(:label_project_deposit),:controller => 'projects', :action => 'index', :project_type => 0 %> > <%=link_to @project, project_path(@project) %>
-
-
-
-
-
-
-
-
-
- <%= render_main_menu(@project) %>
-
- <%= render_flash_messages %>
- <%= yield %>
- <%= call_hook :view_layouts_base_content %>
-
-
- <%= render :partial => 'layouts/base_footer'%>
-
-
-
- <%= l(:label_loading) %>
-
-
-
-
- <%= call_hook :view_layouts_base_body_bottom %>
-
-
-
-
+
+<% @nav_dispaly_project_label = 1
+ @nav_dispaly_forum_label = 1 %>
+<%#@nav_dispaly_project_label = 1 %>
+
+
+
+
+ <%= 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 -%>
+
+
+
+
+
+
+ <%=render :partial => 'layouts/base_header'%>
+
+
+
+
+ 软件项目托管社区
+ <%= l(:label_user_location) %> :
+
+
+ <%= form_tag(projects_search_path, :method => :get) do %>
+ <%= text_field_tag 'name', params[:name], :size => 20 %>
+ <%= hidden_field_tag 'project_type', params[:project_type] %>
+ <%= submit_tag l(:label_search), :class => "enterprise", :name => nil %>
+ <% end %>
+
+
+
+
+ <%= link_to request.host()+"/projects", :controller => 'projects', :action => 'index', :project_type => 0 %>
+ <%=link_to l(:label_home),home_path %> > <%=link_to l(:label_project_deposit),:controller => 'projects', :action => 'index', :project_type => 0 %> > <%=link_to @project, project_path(@project) %>
+
+
+
+
+
+
+ <%= render_main_menu(@project) %>
+
+ <%= render_flash_messages %>
+ <%= yield %>
+ <%= call_hook :view_layouts_base_content %>
+
+
+ <%= render :partial => 'layouts/base_footer'%>
+
+
+
+ <%= l(:label_loading) %>
+
+
+
+
+ <%= call_hook :view_layouts_base_body_bottom %>
+
+
+
+
diff --git a/app/views/layouts/users_base.html.erb b/app/views/layouts/users_base.html.erb
index bad051fc5..d98ef3f46 100644
--- a/app/views/layouts/users_base.html.erb
+++ b/app/views/layouts/users_base.html.erb
@@ -1,50 +1,50 @@
-<% @nav_dispaly_home_path_label = 1
- @nav_dispaly_main_course_label = 1
- @nav_dispaly_main_project_label = 1
- @nav_dispaly_main_contest_label = 1 %>
-<% @nav_dispaly_forum_label = 1%>
-
-
-
-
- <%=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 %>
- <%= javascript_include_tag "jquery.leanModal.min" %>
- <%= javascript_include_tag 'seems_rateable/jRating', 'seems_rateable/rateable'%>
- <%= heads_for_theme %>
- <%= call_hook :view_layouts_base_html_head %>
-
- <%= yield :header_tags -%>
-
-
-
-
-
- <%=render :partial => 'layouts/base_header'%>
-
-
- <%= render_flash_messages %>
- <%= yield %>
- <%= call_hook :view_layouts_base_content %>
-
- <%=render :partial => 'layouts/base_footer'%>
-
-
-
-
-
-
<%= l(:label_loading) %>
-
-
-
-
-
-<%= call_hook :view_layouts_base_body_bottom %>
-
-
+<% @nav_dispaly_home_path_label = 1
+ @nav_dispaly_main_course_label = 1
+ @nav_dispaly_main_project_label = 1
+ @nav_dispaly_main_contest_label = 1 %>
+<% @nav_dispaly_forum_label = 1%>
+
+
+
+
+ <%=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 %>
+ <%= javascript_include_tag "jquery.leanModal.min" %>
+ <%= javascript_include_tag 'seems_rateable/jRating', 'seems_rateable/rateable'%>
+ <%= heads_for_theme %>
+ <%= call_hook :view_layouts_base_html_head %>
+
+ <%= yield :header_tags -%>
+
+
+
+
+
+ <%=render :partial => 'layouts/base_header'%>
+
+
+ <%= render_flash_messages %>
+ <%= yield %>
+ <%= call_hook :view_layouts_base_content %>
+
+ <%=render :partial => 'layouts/base_footer'%>
+
+
+
+
+
+
<%= l(:label_loading) %>
+
+
+
+
+
+
+
+
diff --git a/app/views/messages/_course_show.html.erb b/app/views/messages/_course_show.html.erb
index aba16d620..a11107a9b 100644
--- a/app/views/messages/_course_show.html.erb
+++ b/app/views/messages/_course_show.html.erb
@@ -157,7 +157,7 @@
diff --git a/app/views/messages/_form.html.erb b/app/views/messages/_form.html.erb
index d2eb73225..6581a5b11 100644
--- a/app/views/messages/_form.html.erb
+++ b/app/views/messages/_form.html.erb
@@ -1,39 +1,40 @@
-<%= error_messages_for 'message' %>
-<% replying ||= false %>
-
-
-
- <% unless replying %>
-
<%= l(:field_subject) %> *
- <%= f.text_field :subject, :size => 60, :style => "width: 99%;", :id => "message_subject" %>
-
- <% else %>
-
<%= l(:field_subject) %> *
- <%= f.text_field :subject, :size => 60, :style => "width: 99%;", :id => "message_subject", :readonly => true %>
-
- <% end %>
-
-<% unless replying %>
- <% if @message.safe_attribute? 'sticky' %>
- <%= f.check_box :sticky %> <%= label_tag 'message_sticky', l(:label_board_sticky) %>
- <% end %>
- <% if @message.safe_attribute? 'locked' %>
- <%= f.check_box :locked %> <%= label_tag 'message_locked', l(:label_board_locked) %>
- <% end %>
-<% end %>
-
-
<%= l(:field_description) %> *
- <%= text_area :quote,:quote,:style => 'display:none' %>
-
-
-<%= label_tag "message_content", l(:description_message_content), :class => "hidden-for-sighted" %>
-<%= f.text_area :content, :cols => 80, :rows => 13, :class => 'wiki-edit', :id => 'message_content' %>
-
-
-
-
<%= l(:label_attachment_plural) %>
-<%= render :partial => 'attachments/form_course', :locals => {:container => @message,:isReply => @isReply} %>
-
-
-
+<%= error_messages_for 'message' %>
+<% replying ||= false %>
+
+
+
+ <% unless replying %>
+
<%= l(:field_subject) %> *
+ <%= f.text_field :subject, :size => 60, :style => "width: 99%;", :id => "message_subject" %>
+
+ <% else %>
+
<%= l(:field_subject) %> *
+ <%= f.text_field :subject, :size => 60, :style => "width: 99%;", :id => "message_subject", :readonly => true %>
+
+ <% end %>
+
+<% unless replying %>
+ <% if @message.safe_attribute? 'sticky' %>
+ <%= f.check_box :sticky %> <%= label_tag 'message_sticky', l(:label_board_sticky) %>
+ <% end %>
+ <% if @message.safe_attribute? 'locked' %>
+ <%= f.check_box :locked %> <%= label_tag 'message_locked', l(:label_board_locked) %>
+ <% end %>
+<% end %>
+
+
<%= l(:field_description) %> *
+
+ <%= text_area :quote,:quote,:style => 'display:none' %>
+
+
+<%= label_tag "message_content", l(:description_message_content), :class => "hidden-for-sighted" %>
+<%= f.text_area :content, :cols => 80, :rows => 13, :class => 'wiki-edit', :id => 'message_content' %>
+
+
+
+
<%= l(:label_attachment_plural) %>
+<%= render :partial => 'attachments/form_course', :locals => {:container => @message,:isReply => @isReply} %>
+
+
+
<%#= wikitoolbar_for 'message_content' %>
\ No newline at end of file
diff --git a/app/views/messages/_project_show.html.erb b/app/views/messages/_project_show.html.erb
index ddb23fc95..eff5fa160 100644
--- a/app/views/messages/_project_show.html.erb
+++ b/app/views/messages/_project_show.html.erb
@@ -163,7 +163,7 @@
diff --git a/app/views/news/_course_show.html.erb b/app/views/news/_course_show.html.erb
index b86cea93f..03731373c 100644
--- a/app/views/news/_course_show.html.erb
+++ b/app/views/news/_course_show.html.erb
@@ -69,7 +69,7 @@
:html => { :id => 'news-form', :multipart => true, :method => :put } do |f| %>
<%= render :partial => 'course_form', :locals => { :f => f, :is_new => false } %>
<%#= submit_tag l(:button_save) %>
- <%= link_to l(:button_save), "#", :onclick => 'submitNews();',:class => 'whiteButton m3p10' %>
+ <%= link_to l(:button_save), "#", :onclick => 'submitNews();',:onmouseover => 'this.focus()',:class => 'whiteButton m3p10' %>
<%= preview_link preview_news_path(:course_id => @course, :id => @news), 'news-form',target='preview',{:class => 'whiteButton m3p10'} %> |
<%= link_to l(:button_cancel), "#", :onclick => '$("#edit-news").hide(); return false;',:class => 'whiteButton m3p10' %>
<% end %>
diff --git a/app/views/news/_project_news.html.erb b/app/views/news/_project_news.html.erb
index e9a912c5c..35f76dfaa 100644
--- a/app/views/news/_project_news.html.erb
+++ b/app/views/news/_project_news.html.erb
@@ -49,6 +49,12 @@
$("#news-form").submit();
}
}
+
+ function submitFocus(obj)
+ {
+ $(obj).focus();
+ }
+
<%
@@ -76,7 +82,7 @@
:html => {:id => 'news-form', :multipart => true} do |f| %>
<%= render :partial => 'news/form', :locals => {:f => f} %>
<%#= submit_tag l(:button_create), :class => 'whiteButton m3p10 h30', :name => nil %>
- <%= link_to l(:button_create), "#", :onclick => 'submitNews();', :class => 'whiteButton m3p10' %>
+ <%= link_to l(:button_create), "#", :onclick => 'submitNews();',:onmouseover => 'submitFocus(this);', :class => 'whiteButton m3p10' %>
|
<%= preview_link preview_news_path(:project_id => @project), 'news-form', target='preview', {:class => 'whiteButton m3p10'} %>
|
diff --git a/app/views/news/_project_show.html.erb b/app/views/news/_project_show.html.erb
index ecae672b6..66580ddd5 100644
--- a/app/views/news/_project_show.html.erb
+++ b/app/views/news/_project_show.html.erb
@@ -49,6 +49,7 @@
$("#news-form").submit();
}
}
+
<%= watcher_link(@news, User.current) %>
@@ -68,7 +69,7 @@
:html => { :id => 'news-form', :multipart => true, :method => :put } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %>
<%#= submit_tag l(:button_save) %>
- <%= link_to l(:button_save), "#", :onclick => 'submitNews();',:class => 'whiteButton m3p10' %>
+ <%= link_to l(:button_save), "#", :onclick => 'submitNews();',:onmouseover => 'this.focus()',:class => 'whiteButton m3p10' %>
<%= preview_link preview_news_path(:project_id => @project, :id => @news), 'news-form',target='preview',{:class => 'whiteButton m3p10'} %> |
<%= link_to l(:button_cancel), "#", :onclick => '$("#edit-news").hide(); return false;',:class => 'whiteButton m3p10' %>
<% end %>
diff --git a/app/views/praise_tread/_praise_tread.html.erb b/app/views/praise_tread/_praise_tread.html.erb
index 696b204f9..5bb7addb2 100644
--- a/app/views/praise_tread/_praise_tread.html.erb
+++ b/app/views/praise_tread/_praise_tread.html.erb
@@ -1,157 +1,156 @@
-
- <% if User.current.logged? %>
- <% if horizontal %>
-
-
-
- <% @is_valuate = is_praise_or_tread(obj,user_id)%>
- <% if @is_valuate.size > 0 %>
- <% @flag = @is_valuate.first.praise_or_tread %>
- <% if @flag == 1 %>
-
-
- <%= image_tag "/images/praise_tread/praise_false.png" , weight:"22px", height:"22px",:title => l(:label_issue_praise_over) %>
- <%= get_praise_num(obj)%>
- <%= image_tag "/images/praise_tread/tread_false.png",weight:"22px", height:"22px",:title => l(:label_issue_appraise_over) %>
-
-
-
- <% elsif @flag == 0 %>
-
-
-
- <%= image_tag "/images/praise_tread/praise_false.png",weight:"22px", height:"22px", :title => l(:label_issue_appraise_over) %>
- <%= get_praise_num(obj)%>
- <%= image_tag "/images/praise_tread/tread_false.png",weight:"22px", height:"22px",:title => l(:label_issue_tread_over) %>
-
-
- <% end %>
-
- <% else %>
-
- <% if user_id == obj.author_id %>
-
-
- <%= image_tag "/images/praise_tread/praise_true.png" , weight:"22px", height:"22px",:title => l(:label_issue_not_praise_over) %>
- <%= get_praise_num(obj)%>
- <%= image_tag "/images/praise_tread/tread_true.png",weight:"22px", height:"22px",:title => l(:label_issue_not_treed_over) %>
-
-
- <% else %>
-
- <% if OptionNumber.get_user_option_number(user_id).nil? || OptionNumber.get_user_option_number(user_id).total_score < 2 %>
-
-
- <%= link_to image_tag("/images/praise_tread/praise_true.png",weight:"22px", height:"22px",:title => l(:label_issue_praise)),
- :controller=>"praise_tread",:action=>"praise_plus",:remote=>true,:obj_id => obj.id,:obj_type => obj.class,:horizontal => horizontal %>
- <%= get_praise_num(obj)%>
- <%= image_tag "/images/praise_tread/tread_true.png",weight:"22px", height:"22px",:title => l(:label_issues_score_not_enough) %>
-
-
- <% else %>
-
-
- <%= link_to image_tag("/images/praise_tread/praise_true.png",weight:"22px", height:"22px",:title => l(:label_issue_praise)),
- :controller=>"praise_tread",:action=>"praise_plus",:remote=>true,:obj_id => obj.id,:obj_type => obj.class,:horizontal => horizontal %>
- <%= get_praise_num(obj)%>
- <%= link_to image_tag("/images/praise_tread/tread_true.png",weight:"22px", height:"22px",:title => l(:label_issue_tread)),:controller=>"praise_tread",
- :action=>"tread_plus",:remote=>true,:obj_id => obj.id,:obj_type => obj.class,:horizontal => horizontal %>
-
-
- <% end %>
-
- <% end %>
-
-
- <% end %>
-
-
- <% else %>
-
-
-
- <% @is_valuate = is_praise_or_tread(obj,user_id)%>
- <% if @is_valuate.size > 0 %>
- <% @flag = @is_valuate.first.praise_or_tread %>
- <% if @flag == 1 %>
-
-
- <%= image_tag "/images/praise_tread/praise_false.png" , weight:"22px", height:"22px",:title => l(:label_issue_praise_over) %>
-
-
- <%= get_praise_num(obj)%>
-
-
-
- <%= image_tag "/images/praise_tread/tread_false.png",weight:"22px", height:"22px",:title => l(:label_issue_appraise_over) %>
-
-
-
- <% elsif @flag == 0 %>
-
-
-
- <%= image_tag "/images/praise_tread/praise_false.png",weight:"22px", height:"22px", :title => l(:label_issue_appraise_over) %>
-
-
-
- <%= get_praise_num(obj)%>
-
-
- <%= image_tag "/images/praise_tread/tread_false.png",weight:"22px", height:"22px",:title => l(:label_issue_tread_over) %>
-
-
- <% end %>
-
- <% else %>
- <% if user_id == obj.author_id %>
-
-
- <%= image_tag "/images/praise_tread/praise_true.png",weight:"22px", height:"22px", :title => l(:label_issue_not_praise_over) %>
-
-
-
- <%= get_praise_num(obj)%>
-
-
- <%= image_tag "/images/praise_tread/tread_true.png",weight:"22px", height:"22px",:title => l(:label_issue_not_treed_over) %>
-
-
- <% else %>
- <% if OptionNumber.get_user_option_number(user_id).nil? || OptionNumber.get_user_option_number(user_id).total_score < 2 %>
-
-
- <%= link_to image_tag("/images/praise_tread/praise_true.png",weight:"22px", height:"22px",:title => l(:label_issue_praise)),
- :controller=>"praise_tread",:action=>"praise_plus",:remote=>true,:obj_id => obj.id,:obj_type => obj.class ,:horizontal => horizontal %>
-
-
-
- <%= get_praise_num(obj)%>
-
-
- <%= image_tag "/images/praise_tread/tread_true.png",weight:"22px", height:"22px",:title => l(:label_issues_score_not_enough) %>
-
-
- <% else %>
-
-
- <%= link_to image_tag("/images/praise_tread/praise_true.png",weight:"22px", height:"22px",:title => l(:label_issue_praise)),
- :controller=>"praise_tread",:action=>"praise_plus",:remote=>true,:obj_id => obj.id,:obj_type => obj.class ,:horizontal => horizontal %>
-
-
- <%= get_praise_num(obj)%>
-
-
- <%= link_to image_tag("/images/praise_tread/tread_true.png",weight:"22px", height:"22px",:title => l(:label_issue_tread)),:controller=>"praise_tread",
- :action=>"tread_plus",:remote=>true,:obj_id => obj.id,:obj_type => obj.class ,:horizontal => horizontal %>
-
-
- <% end %>
-
- <% end %>
-
-
- <% end %>
-
- <% end %>
- <% end %>
+
+ <% if User.current.logged? %>
+ <% if horizontal %>
+
+
+
+ <% @is_valuate = is_praise_or_tread(obj,user_id)%>
+ <% if @is_valuate.size > 0 %>
+ <% @flag = @is_valuate.first.praise_or_tread %>
+ <% if @flag == 1 %>
+
+
+ <%= image_tag "/images/praise_tread/praise_false.png" , weight:"22px", height:"22px",:title => l(:label_issue_praise_over) %>
+ <%= get_praise_num(obj)%>
+ <%= image_tag "/images/praise_tread/tread_false.png",weight:"22px", height:"22px",:title => l(:label_issue_appraise_over) %>
+
+
+
+ <% elsif @flag == 0 %>
+
+
+
+ <%= image_tag "/images/praise_tread/praise_false.png",weight:"22px", height:"22px", :title => l(:label_issue_appraise_over) %>
+ <%= get_praise_num(obj)%>
+ <%= image_tag "/images/praise_tread/tread_false.png",weight:"22px", height:"22px",:title => l(:label_issue_tread_over) %>
+
+
+ <% end %>
+
+ <% else %>
+
+ <% if user_id == obj.author_id %>
+
+
+ <%= image_tag "/images/praise_tread/praise_true.png" , weight:"22px", height:"22px",:title => l(:label_issue_not_praise_over) %>
+ <%= get_praise_num(obj)%>
+ <%= image_tag "/images/praise_tread/tread_true.png",weight:"22px", height:"22px",:title => l(:label_issue_not_treed_over) %>
+
+
+ <% else %>
+
+ <% if OptionNumber.get_user_option_number(user_id).nil? || OptionNumber.get_user_option_number(user_id).total_score < 2 %>
+
+
+ <%= link_to image_tag("/images/praise_tread/praise_true.png",weight:"22px", height:"22px",:title => l(:label_issue_praise)),
+ :controller=>"praise_tread",:action=>"praise_plus",:remote=>true,:obj_id => obj.id,:obj_type => obj.class,:horizontal => horizontal %>
+ <%= get_praise_num(obj)%>
+ <%= image_tag "/images/praise_tread/tread_true.png",weight:"22px", height:"22px",:title => l(:label_issues_score_not_enough) %>
+
+
+ <% else %>
+
+
+ <%= link_to image_tag("/images/praise_tread/praise_true.png",weight:"22px", height:"22px",:title => l(:label_issue_praise)),
+ :controller=>"praise_tread",:action=>"praise_plus",:remote=>true,:obj_id => obj.id,:obj_type => obj.class,:horizontal => horizontal %>
+ <%= get_praise_num(obj)%>
+ <%= link_to image_tag("/images/praise_tread/tread_true.png",weight:"22px", height:"22px",:title => l(:label_issue_tread)),:controller=>"praise_tread",
+ :action=>"tread_plus",:remote=>true,:obj_id => obj.id,:obj_type => obj.class,:horizontal => horizontal %>
+
+
+ <% end %>
+
+ <% end %>
+
+
+ <% end %>
+
+
+ <% else %>
+
+
+ <% @is_valuate = is_praise_or_tread(obj,user_id)%>
+ <% if @is_valuate.size > 0 %>
+ <% @flag = @is_valuate.first.praise_or_tread %>
+ <% if @flag == 1 %>
+
+
+ <%= image_tag "/images/praise_tread/praise_false.png" , weight:"22px", height:"22px",:title => l(:label_issue_praise_over) %>
+
+
+ <%= get_praise_num(obj)%>
+
+
+
+ <%= image_tag "/images/praise_tread/tread_false.png",weight:"22px", height:"22px",:title => l(:label_issue_appraise_over) %>
+
+
+
+ <% elsif @flag == 0 %>
+
+
+
+ <%= image_tag "/images/praise_tread/praise_false.png",weight:"22px", height:"22px", :title => l(:label_issue_appraise_over) %>
+
+
+
+ <%= get_praise_num(obj)%>
+
+
+ <%= image_tag "/images/praise_tread/tread_false.png",weight:"22px", height:"22px",:title => l(:label_issue_tread_over) %>
+
+
+ <% end %>
+
+ <% else %>
+ <% if user_id == obj.author_id %>
+
+
+ <%= image_tag "/images/praise_tread/praise_true.png",weight:"22px", height:"22px", :title => l(:label_issue_not_praise_over) %>
+
+
+
+ <%= get_praise_num(obj)%>
+
+
+ <%= image_tag "/images/praise_tread/tread_true.png",weight:"22px", height:"22px",:title => l(:label_issue_not_treed_over) %>
+
+
+ <% else %>
+ <% if OptionNumber.get_user_option_number(user_id).nil? || OptionNumber.get_user_option_number(user_id).total_score < 2 %>
+
+
+ <%= link_to image_tag("/images/praise_tread/praise_true.png",weight:"22px", height:"22px",:title => l(:label_issue_praise)),
+ :controller=>"praise_tread",:action=>"praise_plus",:remote=>true,:obj_id => obj.id,:obj_type => obj.class ,:horizontal => horizontal %>
+
+
+
+ <%= get_praise_num(obj)%>
+
+
+ <%= image_tag "/images/praise_tread/tread_true.png",weight:"22px", height:"22px",:title => l(:label_issues_score_not_enough) %>
+
+
+ <% else %>
+
+
+ <%= link_to image_tag("/images/praise_tread/praise_true.png",weight:"22px", height:"22px",:title => l(:label_issue_praise)),
+ :controller=>"praise_tread",:action=>"praise_plus",:remote=>true,:obj_id => obj.id,:obj_type => obj.class ,:horizontal => horizontal %>
+
+
+ <%= get_praise_num(obj)%>
+
+
+ <%= link_to image_tag("/images/praise_tread/tread_true.png",weight:"22px", height:"22px",:title => l(:label_issue_tread)),:controller=>"praise_tread",
+ :action=>"tread_plus",:remote=>true,:obj_id => obj.id,:obj_type => obj.class ,:horizontal => horizontal %>
+
+
+ <% end %>
+
+ <% end %>
+
+
+ <% end %>
+
+ <% end %>
+ <% end %>
diff --git a/app/views/projects/_project.html.erb b/app/views/projects/_project.html.erb
index 004fb38ac..b9f45356a 100644
--- a/app/views/projects/_project.html.erb
+++ b/app/views/projects/_project.html.erb
@@ -1,154 +1,154 @@
-
-
-
- <% 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) %>
-
-
-
-
- <% end %>
- <% if(@project.project_type==1)%>
-
-
-
- <%= textilizable(project.short_description, :project => project) %>
-
-
-
-
-<% 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 %>
-
-
-
-
-
-
-
-
-
+
+
+
+ <% 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) %>
+
+
+
+
+ <% end %>
+ <% if(@project.project_type==1)%>
+
+
+
+ <%= textilizable(project.short_description, :project => project) %>
+
+
+
+
+<% 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 %>
+
+
+
+
+
+
+
+
+
diff --git a/app/views/projects/settings/_members.html.erb b/app/views/projects/settings/_members.html.erb
index c1d63d03b..25f02da0d 100644
--- a/app/views/projects/settings/_members.html.erb
+++ b/app/views/projects/settings/_members.html.erb
@@ -1,146 +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? %>
-
-
-
- <%= l(:label_user) %>
- <%= l(:label_role_plural) %>
-
- <%= call_hook(:view_projects_settings_members_table_header, :project => @project) %>
-
-
-
- <% members.each do |member| %>
- <% next if member.new_record? %>
-
- <%= 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| %>
- <%= check_box_tag 'membership[role_ids][]', role.id, member.roles.include?(role),
- :disabled => member.member_roles.detect { |mr| mr.role_id == role.id && !mr.inherited_from.nil? } %> <%= h 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 %>
-
-
- <% if @project.project_type == 1 %>
- <% if member.roles.first.to_s == "Manager" %>
-
- <% else %>
-
- <%= 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? %>
-
- <% end %>
- <% else %>
-
- <%= 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? %>
-
- <% end %>
-
- <%= call_hook(:view_projects_settings_members_table_row, {:project => @project, :member => member}) %>
-
- <% end; reset_cycle %>
-
-
- <% 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| %>
-
- <%= check_box_tag 'membership[role_ids][]', role.id %> <%= h 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| %>
-
- <%= check_box_tag 'membership[role_ids][]', role.id %> <%= h 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 94f3dfaf8..7f3f05cce 100644
--- a/app/views/projects/show_projects_score.html.erb
+++ b/app/views/projects/show_projects_score.html.erb
@@ -1,72 +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 -%>
-
-
-<%= 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" , document_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 } %>
-
-
\ No newline at end of file
+
+
+
+ <%= 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 0de0cfee7..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 '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? %>
-
- ID <%= h(@changeset.scmid) %>
-
- <% end %>
- <% if @changeset.parents.present? %>
-
- <%= l(:label_parent_revision) %>
-
- <%= @changeset.parents.collect{
- |p| link_to_revision(p, @repository, :text => format_revision(p))
- }.join(", ").html_safe %>
-
-
- <% end %>
- <% if @changeset.children.present? %>
-
- <%= l(:label_child_revision) %>
-
- <%= @changeset.children.collect{
- |p| link_to_revision(p, @repository, :text => format_revision(p))
- }.join(", ").html_safe %>
-
-
- <% end %>
-
-<% 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? %>
+
+ ID <%= h(@changeset.scmid) %>
+
+ <% end %>
+ <% if @changeset.parents.present? %>
+
+ <%= l(:label_parent_revision) %>
+
+ <%= @changeset.parents.collect{
+ |p| link_to_revision(p, @repository, :text => format_revision(p))
+ }.join(", ").html_safe %>
+
+
+ <% end %>
+ <% if @changeset.children.present? %>
+
+ <%= l(:label_child_revision) %>
+
+ <%= @changeset.children.collect{
+ |p| link_to_revision(p, @repository, :text => format_revision(p))
+ }.join(", ").html_safe %>
+
+
+ <% end %>
+
+<% 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 e89deeb7d..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 '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/school/index.html.erb b/app/views/school/index.html.erb
index 6c1eafd6d..02b934581 100644
--- a/app/views/school/index.html.erb
+++ b/app/views/school/index.html.erb
@@ -3,10 +3,6 @@
@@ -55,7 +51,7 @@
//alert(value);
if(value == "")
{
- alert("搜索条件不能为空");
+ alert("<%= l(:label_search_conditions_not_null) %>");
return;
}
//alert(province);
@@ -82,17 +78,17 @@
- <%= link_to "全部学校",school_index_path %>
+ <%= link_to l(:label_all_schol),school_index_path %>
<% if User.current.logged? %>
- 我的学校
+ <%= l(:label_my_school) %>
<% end %>
diff --git a/app/views/softapplications/_form.html.erb b/app/views/softapplications/_form.html.erb
index 4e38981f8..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 %>
-
-
-
- <%= l(:label_work_name) %>
- * : <%= f.text_field :name, :required => true, :size => 60, :style => "width:400px;" %>
- (<%= l(:label_workname_lengthlimit) %>)
-
-
-
-
-
- <%= l(:label_running_platform) %>
- * : <%= f.text_field :android_min_version_available, :required => true, :size => 60, :style => "width:400px;" %>
- (<%= l(:label_workdescription_lengthlimit) %>)
-
-
-
-
-
-
- <%= l(:label_work_type) %>
- * :
-
- <%#= 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)"} %>
-
- <%#= f.text_field :other_input, :required => true, :size => 60, :style => "width:100px;" %>
-
-
- <% 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 %>
-
-
-
-
-
-
-
- <%= l(:label_work_description) %>
- * : <%= f.text_field :description, :required => true, :size => 60, :style => "width:400px;" %>
-
-
-
-
-
-
-
- <%= l(:label_softapplication_developers) %>
- * : <%= f.text_field :application_developers, :required => true, :size => 60, :style => "width:400px;" %>
- (<%= 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) %>
+ * : <%= f.text_field :name, :required => true, :size => 60, :style => "width:400px;" %>
+ (<%= l(:label_workname_lengthlimit) %>)
+
+
+
+
+
+ <%= l(:label_running_platform) %>
+ * : <%= f.text_field :android_min_version_available, :required => true, :size => 60, :style => "width:400px;" %>
+ (<%= l(:label_workdescription_lengthlimit) %>)
+
+
+
+
+
+
+ <%= l(:label_work_type) %>
+ * :
+
+ <%#= 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)"} %>
+
+ <%#= f.text_field :other_input, :required => true, :size => 60, :style => "width:100px;" %>
+
+
+ <% 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 %>
+
+
+
+
+
+
+
+ <%= l(:label_work_description) %>
+ * : <%= f.text_field :description, :required => true, :size => 60, :style => "width:400px;" %>
+
+
+
+
+
+
+
+ <%= l(:label_softapplication_developers) %>
+ * : <%= f.text_field :application_developers, :required => true, :size => 60, :style => "width:400px;" %>
+ (<%= 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/tags/_show_contests.html.erb b/app/views/tags/_show_contests.html.erb
index bc2682fb8..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",: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 b79a57e71..e50b240fd 100644
--- a/app/views/users/_score_new_index.html.erb
+++ b/app/views/users/_score_new_index.html.erb
@@ -1,14 +1,14 @@
-
-
-<%= 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(:lable_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 068390192..551f7e724 100644
--- a/app/views/users/show.html.erb
+++ b/app/views/users/show.html.erb
@@ -1,424 +1,336 @@
-<% if User.current.id == @user.id %>
-
- <%#= show_activity @state%>
-
-
-
-
-
-
- <%= form_tag(:controller => 'users', :action => "show") do %>
-
-
-
-
-
- <%= text_field_tag 'user', params[:user], :size => 30 %>
- <%= submit_tag l(:label_search_by_user), :class => "small", :name => nil %>
-
-
-
-
-
- <% 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' %>
- <% if User.current.login == e.user.try(:login) %>
- <%# if e.user_id == act.jour.id %>
-
-
- <%= 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) %>
-
-
- <%# else %>
-
- <%# end %>
- <% else %>
-
-
- <%= link_to("#{e.user.name}", 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) %>
-
-
- <% end %>
-
-
- <%= 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 %>
-
-
-
-
- <% when 'Bid' %>
-
- <% if act.reward_type == 3 && @show_course == 1%>
- <% if e.user == User.current %>
-
- <%= 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) %>
-
- <% else %>
-
- <%= link_to(h(e.user), user_path(e.user_id)) %> <%= l(:label_new_activity) %> <%= link_to format_activity_title("#{l(:label_active_homework)}##{act.id}:#{act.name}"), respond_path(e.act_id) %>
-
- <% end %>
- <% else %>
- <% if e.user == User.current %>
-
- <%= 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) %>
-
- <% else %>
-
- <%= link_to(h(e.user), user_path(e.user_id)) %> <%= l(:label_new_activity) %> <%= link_to format_activity_title("#{l(:label_active_call)}##{act.id}:#{act.name}"), respond_path(e.act_id) %>
-
- <% end %>
- <% end %>
-
-
-
- <%=textAreailizable act, :description %>
-
-
-
-
- <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %>
-
-
-
-
- <% when 'Journal' %>
-
- <% if e.user == User.current %>
-
- <%= 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}"} %>
-
- <% else %>
-
- <%= link_to(h(e.user), user_path(e.user_id)) %> <%= l(:label_new_activity) %> <%= link_to(l(:label_activity_project)+act.issue.project.name, project_path(act.issue.project.identifier)) %> <%= 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}"} %>
-
- <% end %>
-
-
- <% if act.notes.nil? %>
- <% desStr = '' %>
- <% else %>
- <% desStr= textAreailizable(act, :notes) %>
- <% end %>
- <%= desStr %>
-
-
-
-
-
- <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %>
-
-
-
-
- <% when 'Changeset' %>
-
- <% if e.user == User.current %>
-
- <%= 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} %>
-
- <% else %>
-
- <%= link_to(h(e.user), user_path(e.user_id)) %> <%= l(:label_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} %>
-
- <% end %>
-
-
-
- <%= textAreailizable act,:long_comments %>
-
-
-
-
- <%= format_time(e.act.committed_on) %>
-
-
-
-
- <% when 'Message' %>
-
- <% if e.user == User.current %>
-
- <%= 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}"}) %>
-
- <% else %>
-
- <%= link_to(h(e.user), user_path(e.user_id)) %> <%= l(:label_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}"}) %>
-
- <% end %>
-
-
-
- <%= textAreailizable(act,:content) %>
-
-
-
-
-
- <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %>
-
-
-
-
- <% when 'Principal' %>
-
- <% if e.user == User.current %>
-
- <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> <%= l(:label_new_user) %>
-
- <% else %>
-
- <%= link_to(h(e.user), user_path(e.user_id)) %> <%= l(:label_new_user) %>
-
- <% end %>
-
-
-
-
-
-
-
- <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %>
-
-
-
-
- <% when 'News' %>
-
- <% if e.user == User.current %>
-
- <%= 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} %>
-
- <% else %>
-
- <%= link_to(h(e.user), user_path(e.user_id)) %> <%= l(:label_new_activity) %> <%= link_to format_activity_title("#{l(:label_news)}: #{act.title}"), {:controller => 'news', :action => 'show', :id => act.id} %>
-
- <% end %>
-
-
-
- <%= textAreailizable act,:description %>
-
-
-
-
- <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %>
-
-
-
-
- <% when 'Issue' %>
-
- <% if e.user == User.current %>
-
-
- <%= 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} %>
-
- <% else %>
-
-
- <%= link_to(h(e.user), user_path(e.user_id)) %>
-
-
- <%= l(:label_new_activity) %>
-
- <%= link_to format_activity_title("#{act.source_from} (#{act.status}): #{act.tracker.name} #{act.subject}"), {:controller => 'issues', :action => 'show', :id => act.id} %>
-
- <% end %>
-
-
-
-
- <%= textAreailizable act, :description %>
-
-
-
-
-
-
- <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %>
-
-
-
-
- <% when 'Contest' %>
-
- <% if e.user == User.current && @show_contest == 1%>
-
- <%= 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} %>
-
- <% else %>
-
- <%= link_to(h(e.user), user_path(e.user_id)) %> <%= l(:label_new_activity) %> <%= link_to format_activity_title("#{l(:label_contest)}: #{act.name}"), {:controller => 'contests', :action => 'show_contest', :id => act.id} %>
-
- <% end %>
-
-
- <%= textAreailizable act, :description %>
-
-
-
-
-
- <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %>
-
-
- <% else %>
- <%# f=1 %>
- <% end %>
-
-
-
-
-
- <% 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 %>
+
+
+
+
+
+ <%= text_field_tag 'user', params[:user], :size => 30 %>
+ <%= submit_tag l(:label_search_by_user), :class => "small", :name => nil %>
+
+
+
+
+
+ <% 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' %>
+
+
+ <%= 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 %>
+
+
+
+
+ <% when 'Bid' %>
+
+ <% if act.reward_type == 3 && @show_course == 1%>
+
+ <%= 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) %>
+
+ <% else %>
+
+ <%= 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) %>
+
+ <% end %>
+
+
+
+ <%=textAreailizable act, :description %>
+
+
+
+
+ <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %>
+
+
+
+
+ <% when 'Journal' %>
+
+
+ <%= 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}"} %>
+
+
+
+ <% if act.notes.nil? %>
+ <% desStr = '' %>
+ <% else %>
+ <% desStr= textAreailizable(act, :notes) %>
+ <% end %>
+ <%= desStr %>
+
+
+
+
+
+ <%= (l(:label_update_time).to_s << ':' << format_time(e.act.created_on)).to_s %>
+
+
+
+
+ <% when 'Changeset' %>
+
+
+ <%= 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) %>
+
+
+
+
+ <% when 'Message' %>
+
+
+ <%= 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 %>
+
+
+
+
+ <% when 'Principal' %>
+
+
+ <%= 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 %>
+
+
+
+
+ <% when 'News' %>
+
+
+ <%= 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 %>
+
+
+
+
+ <% when 'Issue' %>
+
+
+
+ <%= 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 %>
+
+
+
+
+ <% when 'Contest' %>
+
+
+ <%= 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 %>
+
+
+ <% else %>
+ <%# f=1 %>
+ <% end %>
+
+
+
+
+
+ <% 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 0dcf1085a..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(:lable_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
new file mode 100644
index 000000000..54d8ec6ef
--- /dev/null
+++ b/app/views/welcome/_more_course.html.erb
@@ -0,0 +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 %>
+
+<%= link_to "更多>>", {:controller => 'courses', :action => 'index', :school_id => school_id} %>
\ No newline at end of file
diff --git a/app/views/welcome/course.html.erb b/app/views/welcome/course.html.erb
index c46df7777..9ec745f87 100644
--- a/app/views/welcome/course.html.erb
+++ b/app/views/welcome/course.html.erb
@@ -85,14 +85,14 @@
<%school_course=[]%>
<% end %>
<% if (school_course.count == 0) %>
- <%= link_to "更多>>", {:controller => 'courses', :action => 'index', :school_id => nil} %>
+ <%= render :partial => 'more_course', :locals => {:school_id => nil}%>
<% if User.current.logged? %>
- <%= render :partial => 'no_course_title', :locals => {:course_title => l(:lable_school_no_course)} %>
+ <%= render :partial => 'no_course_title', :locals => {:course_title => l(:label_school_no_course)} %>
<%= render :partial => 'course_list', :locals => {:course_list => find_all_new_hot_course(9, @school_id)} %>
<% else %>
@@ -103,11 +103,11 @@
<% else %>
<% if school_course.count < 10 %>
- <%= link_to "更多>>", {:controller => 'courses', :action => 'index', :school_id => nil} %>
+ <%= render :partial => 'more_course', :locals => {:school_id => nil}%>
<% else %>
- <%= link_to "更多>>", {:controller => 'courses', :action => 'index', :school_id => @school_id} %>
+ <%= render :partial => 'more_course', :locals => {:school_id => @school_id}%>
<% end %>
@@ -115,7 +115,7 @@
<%= render :partial => 'course_list', :locals => {:course_list => school_course} %>
<% if school_course.count < 10 %>
- <%= render :partial => 'no_course_title', :locals => {:course_title => l(:lable_school_less_course)} %>
+ <%= render :partial => 'no_course_title', :locals => {:course_title => l(:label_school_less_course)} %>
<%= render :partial => 'course_list', :locals => {:course_list => find_all_new_hot_course(9 - school_course.count, @school_id)} %>
<% end %>
diff --git a/app/views/welcome/index.html.erb b/app/views/welcome/index.html.erb
index fd4a1637e..6745e5abe 100644
--- a/app/views/welcome/index.html.erb
+++ b/app/views/welcome/index.html.erb
@@ -1,164 +1,164 @@
-<% @nav_dispaly_project_label = 1
- @nav_dispaly_forum_label = 1 %>
-<%= stylesheet_link_tag 'welcome' %>
-<%= javascript_include_tag 'welcome' %>
-
-
-
-
- <%= link_to image_tag('/images/qrweixin.jpg', size: '150x150', alt: 'trustie', class: "weixin" ), home_path %>
-
微信扫码
-
-
-
-
- <% if get_avatar?(@first_page) %>
- <%= image_tag(url_to_avatar(@first_page), width:@first_page.image_width,height: @first_page.image_height) %>
- <% else %>
- <%= image_tag '/images/transparent.png', width:@first_page.image_width,height: @first_page.image_height %>
- <% end %>
-
-
-
- <% unless @first_page.nil? %>
-
- <%= @first_page.description.html_safe %>
- <% end %>
-
-
- <%= render :partial => "search_project", :locals => {:project_type => 0}%>
-
-
-
-
-
-
-
-
-
热门项目
-
<%= link_to "更多>>", { :controller => 'projects', :action => 'index', :project_type => 0, :host => Setting.project_domain}, :target => "_blank" %>
-
-
- <% #projects = find_miracle_project(10, 3) %>
- <% @projects.map do |project| %>
-
-
-
- <%= image_tag(get_project_avatar(project), :class => "avatar-4") %>
-
-
-
- <% unless project.is_public %>
- <%= l(:lable_private) %>
- <% end %>
- <%= link_to( project.name, project_path(project.id), :class => "d-g-blue d-p-project-name",:title => "#{project.name}" )%>
- (<%= link_to "#{projectCount(project)}人", project_member_path(project) ,:course =>'0' %>)
-
-
- <%=project.description.truncate(100, omission: '...')%>
-
-
- <%= content_tag "span", l(:label_project_score)+ ":" + red_project_scores(project).to_i.to_s,
- :style => "cursor: pointer; display: inline-block; float: right; color: #ec6300;",
- :title => "项目得分,综合考虑了项目的各项活动,反映了该项目的活跃程度",
- :class => "tooltip",
- :id => "tooltip-#{project.id}" %>
-
-
-
- <% end; reset_cycle %>
-
-
-
-
-
-
-
-
-
-
-
- 贴吧动态
- <%= link_to "我要提问" , newbie_send_path, {:class => 'orangeButton idea_btn', :style => "color: #EEEEEE" }%>
- <%= link_to "我要反馈" , suggestion_send_path, {:class => 'orangeButton idea_btn', :style => "color: #EEEEEE" }%>
- <%= link_to "更多>>", forums_path %>
-
-
-
- <% topics = find_new_forum_topics(7) %>
- <% topics.includes(:forum, :last_reply, :author).each do |topic|%>
-
-
-
- <%= link_to '['+topic.forum.name + ']',forum_path(topic.forum),:class => 'memo_Bar_title' %><%= link_to topic.subject.truncate(30, omission: '...'), topic.event_url,title: topic.subject %>
-
-
-
- <%= "#{l(:label_updated_time, value: time_tag_welcome(topic_last_time topic))}".html_safe %>
-
-
- 楼主: <%= link_to topic.author.login.truncate(10, omission: '...'),user_path(topic.author),title: topic.author.login %>
-
-
- 最后回复:<% unless (topic.last_reply.nil? || topic.last_reply.author.nil?) %><%=link_to topic.last_reply.author.login.truncate(10, omission: '...'),user_path(topic.last_reply.author),title: topic.last_reply.author.login%><% end %>
-
-
- 回复(<%= link_to topic.try(:replies_count), topic.event_url %>)
-
-
-
-
- <% end %>
-
-
-
-
-
-
+<% @nav_dispaly_project_label = 1
+ @nav_dispaly_forum_label = 1 %>
+<%= stylesheet_link_tag 'welcome' %>
+<%= javascript_include_tag 'welcome' %>
+
+
+
+
+ <%= link_to image_tag('/images/qrweixin.jpg', size: '150x150', alt: 'trustie', class: "weixin" ), home_path %>
+
微信扫码
+
+
+
+
+ <% if get_avatar?(@first_page) %>
+ <%= image_tag(url_to_avatar(@first_page), width:@first_page.image_width,height: @first_page.image_height) %>
+ <% else %>
+ <%= image_tag '/images/transparent.png', width:@first_page.image_width,height: @first_page.image_height %>
+ <% end %>
+
+
+
+ <% unless @first_page.nil? %>
+
+ <%= @first_page.description.html_safe %>
+ <% end %>
+
+
+ <%= render :partial => "search_project", :locals => {:project_type => 0}%>
+
+
+
+
+
+
+
+
+
热门项目
+
<%= link_to "更多>>", { :controller => 'projects', :action => 'index', :project_type => 0, :host => Setting.project_domain}, :target => "_blank" %>
+
+
+ <% #projects = find_miracle_project(10, 3) %>
+ <% @projects.map do |project| %>
+
+
+
+ <%= image_tag(get_project_avatar(project), :class => "avatar-4") %>
+
+
+
+ <% unless project.is_public %>
+ <%= l(:label_private) %>
+ <% end %>
+ <%= link_to( project.name, project_path(project.id), :class => "d-g-blue d-p-project-name",:title => "#{project.name}" )%>
+ (<%= link_to "#{projectCount(project)}人", project_member_path(project) ,:course =>'0' %>)
+
+
+ <%=project.description.truncate(100, omission: '...')%>
+
+
+ <%= content_tag "span", l(:label_project_score)+ ":" + red_project_scores(project).to_i.to_s,
+ :style => "cursor: pointer; display: inline-block; float: right; color: #ec6300;",
+ :title => "项目得分,综合考虑了项目的各项活动,反映了该项目的活跃程度",
+ :class => "tooltip",
+ :id => "tooltip-#{project.id}" %>
+
+
+
+ <% end; reset_cycle %>
+
+
+
+
+
+
+
+
+
+
+
+ 贴吧动态
+ <%= link_to "我要提问" , newbie_send_path, {:class => 'orangeButton idea_btn', :style => "color: #EEEEEE" }%>
+ <%= link_to "我要反馈" , suggestion_send_path, {:class => 'orangeButton idea_btn', :style => "color: #EEEEEE" }%>
+ <%= link_to "更多>>", forums_path %>
+
+
+
+ <% topics = find_new_forum_topics(7) %>
+ <% topics.includes(:forum, :last_reply, :author).each do |topic|%>
+
+
+
+ <%= link_to '['+topic.forum.name + ']',forum_path(topic.forum),:class => 'memo_Bar_title' %><%= link_to topic.subject.truncate(30, omission: '...'), topic.event_url,title: topic.subject %>
+
+
+
+ <%= "#{l(:label_updated_time, value: time_tag_welcome(topic_last_time topic))}".html_safe %>
+
+
+ 楼主: <%= link_to topic.author.login.truncate(10, omission: '...'),user_path(topic.author),title: topic.author.login %>
+
+
+ 最后回复:<% unless (topic.last_reply.nil? || topic.last_reply.author.nil?) %><%=link_to topic.last_reply.author.login.truncate(10, omission: '...'),user_path(topic.last_reply.author),title: topic.last_reply.author.login%><% end %>
+
+
+ 回复(<%= link_to topic.try(:replies_count), topic.event_url %>)
+
+
+
+
+ <% end %>
+
+
+
+
+
+
<%= render partial: 'link_to_another' %>
\ No newline at end of file
diff --git a/config/locales/en.yml b/config/locales/en.yml
index ee7e76ed1..8ba8402ed 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -1,1813 +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
- lable_unknow_type: Unknow type
- lable_score_less_than_zero: Score less than 0, revised to 0
- review_assignments: review assignments
- lable_private: private
\ No newline at end of file
+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 a3db5964b..2333ea674 100644
--- a/config/locales/zh.yml
+++ b/config/locales/zh.yml
@@ -1,2121 +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: 漏洞
-
- lable_school_no_course: 该学校未开设任何课程,您可以查看其他学校课程
- lable_school_less_course: 该学校开设课程较少,您可以查看其他学校课程
-
- lable_file_not_found: 对不起,该文件现在不能下载!
- lable_goto_homepage: 返回主页
- lable_trustie_team: Trustie开发团队
-
- lable_memos_max_length: 帖子内容最大长度为65535个字符
- lable_forums_max_length: 贴吧描述最大长度为65535个字符
- lable_unknow_type: 未知类型
- lable_score_less_than_zero: 得分小于0,修正为0
- review_assignments: 评审任务
- lable_private: 私有
+
+# 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/db/schema.rb b/db/schema.rb
index db51ddd37..95c52cca3 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -878,18 +878,18 @@ ActiveRecord::Schema.define(:version => 20140826072838) do
create_table "relative_memos", :force => true do |t|
t.integer "osp_id"
t.integer "parent_id"
- t.string "subject", :null => false
- t.text "content", :limit => 16777215, :null => false
+ t.string "subject", :null => false
+ t.text "content", :null => false
t.integer "author_id"
- t.integer "replies_count", :default => 0
+ t.integer "replies_count", :default => 0
t.integer "last_reply_id"
- t.boolean "lock", :default => false
- t.boolean "sticky", :default => false
- t.boolean "is_quote", :default => false
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.integer "viewed_count_crawl", :default => 0
- t.integer "viewed_count_local", :default => 0
+ t.boolean "lock", :default => false
+ t.boolean "sticky", :default => false
+ t.boolean "is_quote", :default => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "viewed_count_crawl", :default => 0
+ t.integer "viewed_count_local", :default => 0
t.string "url"
t.string "username"
t.string "userhomeurl"
@@ -976,11 +976,10 @@ ActiveRecord::Schema.define(:version => 20140826072838) do
t.string "url"
t.string "title"
t.integer "share_type"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
t.integer "project_id"
t.integer "user_id"
- t.string "description"
end
create_table "softapplications", :force => true do |t|
@@ -1086,8 +1085,8 @@ ActiveRecord::Schema.define(:version => 20140826072838) do
t.integer "zip_code"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
- t.string "technical_title"
t.integer "identity"
+ t.string "technical_title"
t.string "student_id"
t.string "teacher_realname"
t.string "student_realname"
@@ -1145,6 +1144,9 @@ ActiveRecord::Schema.define(:version => 20140826072838) do
t.integer "active"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
+ t.integer "level"
+ t.integer "file"
+ t.integer "issue"
end
create_table "user_statuses", :force => true do |t|
diff --git a/public/file_not_found.html.erb b/public/file_not_found.html.erb
index b3b45203a..fdc21c1a1 100644
--- a/public/file_not_found.html.erb
+++ b/public/file_not_found.html.erb
@@ -1,42 +1,42 @@
-
-
-
-
-
File not found
-
-
-
-
-
-
<%= l(:lable_file_not_found) %>
-
-
-
-
-
<%= l(:lable_trustie_team) %>
-
-
-
- Back
-
-
-
-
+
+
+
+
+
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) %>
+
+
+
+ Back
+
+
+
+
diff --git a/public/no_file_found.html b/public/no_file_found.html
new file mode 100644
index 000000000..1b4f3c798
--- /dev/null
+++ b/public/no_file_found.html
@@ -0,0 +1,42 @@
+
+
+
+
+
File not found
+
+
+
+
+
+
该作业没有任何的附件可以下载
+
+
+
+
+ Back
+
+
+
+
diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css
index 1d785eb9d..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;
- line-height: 1.5em;
-}
-.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; }
-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: 220px;}
-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;
+}