Description:
add options to allow hall of fame viewing by any user add menu item for normal user
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r424:217b94aa4f76 - - 6 files changed: 40 inserted, 27 deleted

@@ -1,83 +1,87
1 class ApplicationController < ActionController::Base
1 class ApplicationController < ActionController::Base
2 protect_from_forgery
2 protect_from_forgery
3
3
4 SINGLE_USER_MODE_CONF_KEY = 'system.single_user_mode'
4 SINGLE_USER_MODE_CONF_KEY = 'system.single_user_mode'
5
5
6 def admin_authorization
6 def admin_authorization
7 return false unless authenticate
7 return false unless authenticate
8 user = User.find(session[:user_id], :include => ['roles'])
8 user = User.find(session[:user_id], :include => ['roles'])
9 redirect_to :controller => 'main', :action => 'login' unless user.admin?
9 redirect_to :controller => 'main', :action => 'login' unless user.admin?
10 end
10 end
11
11
12 def authorization_by_roles(allowed_roles)
12 def authorization_by_roles(allowed_roles)
13 return false unless authenticate
13 return false unless authenticate
14 user = User.find(session[:user_id])
14 user = User.find(session[:user_id])
15 unless user.roles.detect { |role| allowed_roles.member?(role.name) }
15 unless user.roles.detect { |role| allowed_roles.member?(role.name) }
16 flash[:notice] = 'You are not authorized to view the page you requested'
16 flash[:notice] = 'You are not authorized to view the page you requested'
17 redirect_to :controller => 'main', :action => 'login'
17 redirect_to :controller => 'main', :action => 'login'
18 return false
18 return false
19 end
19 end
20 end
20 end
21
21
22 protected
22 protected
23
23
24 def authenticate
24 def authenticate
25 unless session[:user_id]
25 unless session[:user_id]
26 + flash[:notice] = 'You need to login'
27 + if GraderConfiguration[SINGLE_USER_MODE_CONF_KEY]
28 + flash[:notice] = 'You need to login but you cannot log in at this time'
29 + end
26 redirect_to :controller => 'main', :action => 'login'
30 redirect_to :controller => 'main', :action => 'login'
27 return false
31 return false
28 end
32 end
29
33
30 # check if run in single user mode
34 # check if run in single user mode
31 if GraderConfiguration[SINGLE_USER_MODE_CONF_KEY]
35 if GraderConfiguration[SINGLE_USER_MODE_CONF_KEY]
32 user = User.find(session[:user_id])
36 user = User.find(session[:user_id])
33 if user==nil or (not user.admin?)
37 if user==nil or (not user.admin?)
34 flash[:notice] = 'You cannot log in at this time'
38 flash[:notice] = 'You cannot log in at this time'
35 redirect_to :controller => 'main', :action => 'login'
39 redirect_to :controller => 'main', :action => 'login'
36 return false
40 return false
37 end
41 end
38 return true
42 return true
39 end
43 end
40
44
41 if GraderConfiguration.multicontests?
45 if GraderConfiguration.multicontests?
42 user = User.find(session[:user_id])
46 user = User.find(session[:user_id])
43 return true if user.admin?
47 return true if user.admin?
44 begin
48 begin
45 if user.contest_stat(true).forced_logout
49 if user.contest_stat(true).forced_logout
46 flash[:notice] = 'You have been automatically logged out.'
50 flash[:notice] = 'You have been automatically logged out.'
47 redirect_to :controller => 'main', :action => 'index'
51 redirect_to :controller => 'main', :action => 'index'
48 end
52 end
49 rescue
53 rescue
50 end
54 end
51 end
55 end
52 return true
56 return true
53 end
57 end
54
58
55 def authorization
59 def authorization
56 return false unless authenticate
60 return false unless authenticate
57 user = User.find(session[:user_id])
61 user = User.find(session[:user_id])
58 unless user.roles.detect { |role|
62 unless user.roles.detect { |role|
59 role.rights.detect{ |right|
63 role.rights.detect{ |right|
60 right.controller == self.class.controller_name and
64 right.controller == self.class.controller_name and
61 (right.action == 'all' or right.action == action_name)
65 (right.action == 'all' or right.action == action_name)
62 }
66 }
63 }
67 }
64 flash[:notice] = 'You are not authorized to view the page you requested'
68 flash[:notice] = 'You are not authorized to view the page you requested'
65 #request.env['HTTP_REFERER'] ? (redirect_to :back) : (redirect_to :controller => 'login')
69 #request.env['HTTP_REFERER'] ? (redirect_to :back) : (redirect_to :controller => 'login')
66 redirect_to :controller => 'main', :action => 'login'
70 redirect_to :controller => 'main', :action => 'login'
67 return false
71 return false
68 end
72 end
69 end
73 end
70
74
71 def verify_time_limit
75 def verify_time_limit
72 return true if session[:user_id]==nil
76 return true if session[:user_id]==nil
73 user = User.find(session[:user_id], :include => :site)
77 user = User.find(session[:user_id], :include => :site)
74 return true if user==nil or user.site == nil
78 return true if user==nil or user.site == nil
75 if user.contest_finished?
79 if user.contest_finished?
76 flash[:notice] = 'Error: the contest you are participating is over.'
80 flash[:notice] = 'Error: the contest you are participating is over.'
77 redirect_to :back
81 redirect_to :back
78 return false
82 return false
79 end
83 end
80 return true
84 return true
81 end
85 end
82
86
83 end
87 end
@@ -1,111 +1,107
1 class ReportController < ApplicationController
1 class ReportController < ApplicationController
2
2
3 before_filter :admin_authorization, only: [:login_stat,:submission_stat]
3 before_filter :admin_authorization, only: [:login_stat,:submission_stat]
4 - before_filter(only: :problem_hof) { |c|
4 + before_filter { |c|
5 - user = User.find(session[:user_id]) if session[:user_id]
5 + return false unless authenticate
6 - if user==nil
6 +
7 - flash[:notice] = 'You have to login first'
7 + if GraderConfiguration["system.hall_of_fame_available"]
8 - redirect_to :controller => 'main', :action => 'login'
8 + return true;
9 - return false
10 end
9 end
11 -
10 +
12 - unless GraderConfiguration["hall_of_fame_available"]
11 + admin_authorization
13 - flash[:notice] = 'You are not authorized to view the page you requested'
14 - redirect_to :controller => 'main', :action => 'login' unless GraderConfiguration[ "hall_of_fame_available" ]
15 - end
16 }
12 }
17
13
18 def login_stat
14 def login_stat
19 @logins = Array.new
15 @logins = Array.new
20
16
21 date_and_time = '%Y-%m-%d %H:%M'
17 date_and_time = '%Y-%m-%d %H:%M'
22 begin
18 begin
23 @since_time = DateTime.strptime(params[:since_datetime],date_and_time)
19 @since_time = DateTime.strptime(params[:since_datetime],date_and_time)
24 rescue
20 rescue
25 @since_time = DateTime.new(1000,1,1)
21 @since_time = DateTime.new(1000,1,1)
26 end
22 end
27 begin
23 begin
28 @until_time = DateTime.strptime(params[:until_datetime],date_and_time)
24 @until_time = DateTime.strptime(params[:until_datetime],date_and_time)
29 rescue
25 rescue
30 @until_time = DateTime.new(3000,1,1)
26 @until_time = DateTime.new(3000,1,1)
31 end
27 end
32
28
33 User.all.each do |user|
29 User.all.each do |user|
34 @logins << { login: user.login,
30 @logins << { login: user.login,
35 full_name: user.full_name,
31 full_name: user.full_name,
36 count: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
32 count: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
37 user.id,@since_time,@until_time)
33 user.id,@since_time,@until_time)
38 .count(:id),
34 .count(:id),
39 min: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
35 min: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
40 user.id,@since_time,@until_time)
36 user.id,@since_time,@until_time)
41 .minimum(:created_at),
37 .minimum(:created_at),
42 max: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
38 max: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
43 user.id,@since_time,@until_time)
39 user.id,@since_time,@until_time)
44 .maximum(:created_at)
40 .maximum(:created_at)
45 }
41 }
46 end
42 end
47 end
43 end
48
44
49 def submission_stat
45 def submission_stat
50
46
51 date_and_time = '%Y-%m-%d %H:%M'
47 date_and_time = '%Y-%m-%d %H:%M'
52 begin
48 begin
53 @since_time = DateTime.strptime(params[:since_datetime],date_and_time)
49 @since_time = DateTime.strptime(params[:since_datetime],date_and_time)
54 rescue
50 rescue
55 @since_time = DateTime.new(1000,1,1)
51 @since_time = DateTime.new(1000,1,1)
56 end
52 end
57 begin
53 begin
58 @until_time = DateTime.strptime(params[:until_datetime],date_and_time)
54 @until_time = DateTime.strptime(params[:until_datetime],date_and_time)
59 rescue
55 rescue
60 @until_time = DateTime.new(3000,1,1)
56 @until_time = DateTime.new(3000,1,1)
61 end
57 end
62
58
63 @submissions = {}
59 @submissions = {}
64
60
65 User.find_each do |user|
61 User.find_each do |user|
66 @submissions[user.id] = { login: user.login, full_name: user.full_name, count: 0, sub: { } }
62 @submissions[user.id] = { login: user.login, full_name: user.full_name, count: 0, sub: { } }
67 end
63 end
68
64
69 Submission.where("submitted_at >= ? AND submitted_at <= ?",@since_time,@until_time).find_each do |s|
65 Submission.where("submitted_at >= ? AND submitted_at <= ?",@since_time,@until_time).find_each do |s|
70 if @submissions[s.user_id]
66 if @submissions[s.user_id]
71 if not @submissions[s.user_id][:sub].has_key?(s.problem_id)
67 if not @submissions[s.user_id][:sub].has_key?(s.problem_id)
72 a = nil
68 a = nil
73 begin
69 begin
74 a = Problem.find(s.problem_id)
70 a = Problem.find(s.problem_id)
75 rescue
71 rescue
76 a = nil
72 a = nil
77 end
73 end
78 @submissions[s.user_id][:sub][s.problem_id] =
74 @submissions[s.user_id][:sub][s.problem_id] =
79 { prob_name: (a ? a.full_name : '(NULL)'),
75 { prob_name: (a ? a.full_name : '(NULL)'),
80 sub_ids: [s.id] }
76 sub_ids: [s.id] }
81 else
77 else
82 @submissions[s.user_id][:sub][s.problem_id][:sub_ids] << s.id
78 @submissions[s.user_id][:sub][s.problem_id][:sub_ids] << s.id
83 end
79 end
84 @submissions[s.user_id][:count] += 1
80 @submissions[s.user_id][:count] += 1
85 end
81 end
86 end
82 end
87 end
83 end
88
84
89 def problem_hof
85 def problem_hof
90 # gen problem list
86 # gen problem list
91 @user = User.find(session[:user_id])
87 @user = User.find(session[:user_id])
92 @problems = @user.available_problems
88 @problems = @user.available_problems
93
89
94 # get selected problems or the default
90 # get selected problems or the default
95 if params[:id]
91 if params[:id]
96 begin
92 begin
97 @problem = Problem.available.find(params[:id])
93 @problem = Problem.available.find(params[:id])
98 rescue
94 rescue
99 redirect_to action: :problem_hof
95 redirect_to action: :problem_hof
100 flash[:notice] = 'Error: submissions for that problem are not viewable.'
96 flash[:notice] = 'Error: submissions for that problem are not viewable.'
101 return
97 return
102 end
98 end
103 end
99 end
104
100
105 if @problem
101 if @problem
106 #aggregrate by language
102 #aggregrate by language
107 @by_lang = {}
103 @by_lang = {}
108 Submission.where(problem_id: @problem.id).find_each do |sub|
104 Submission.where(problem_id: @problem.id).find_each do |sub|
109 lang = Language.find_by_id(sub.language_id)
105 lang = Language.find_by_id(sub.language_id)
110 next unless lang
106 next unless lang
111 next unless sub.points >= @problem.full_score
107 next unless sub.points >= @problem.full_score
@@ -1,128 +1,132
1 # Methods added to this helper will be available to all templates in the application.
1 # Methods added to this helper will be available to all templates in the application.
2 module ApplicationHelper
2 module ApplicationHelper
3
3
4 def user_header
4 def user_header
5 menu_items = ''
5 menu_items = ''
6 user = User.find(session[:user_id])
6 user = User.find(session[:user_id])
7
7
8 if (user!=nil) and (session[:admin])
8 if (user!=nil) and (session[:admin])
9 # admin menu
9 # admin menu
10 menu_items << "<b>Administrative task:</b> "
10 menu_items << "<b>Administrative task:</b> "
11 append_to menu_items, '[Announcements]', 'announcements', 'index'
11 append_to menu_items, '[Announcements]', 'announcements', 'index'
12 append_to menu_items, '[Msg console]', 'messages', 'console'
12 append_to menu_items, '[Msg console]', 'messages', 'console'
13 append_to menu_items, '[Problems]', 'problems', 'index'
13 append_to menu_items, '[Problems]', 'problems', 'index'
14 append_to menu_items, '[Users]', 'user_admin', 'index'
14 append_to menu_items, '[Users]', 'user_admin', 'index'
15 append_to menu_items, '[Results]', 'user_admin', 'user_stat'
15 append_to menu_items, '[Results]', 'user_admin', 'user_stat'
16 append_to menu_items, '[Report]', 'report', 'login_stat'
16 append_to menu_items, '[Report]', 'report', 'login_stat'
17 append_to menu_items, '[Graders]', 'graders', 'list'
17 append_to menu_items, '[Graders]', 'graders', 'list'
18 append_to menu_items, '[Contests]', 'contest_management', 'index'
18 append_to menu_items, '[Contests]', 'contest_management', 'index'
19 append_to menu_items, '[Sites]', 'sites', 'index'
19 append_to menu_items, '[Sites]', 'sites', 'index'
20 append_to menu_items, '[System config]', 'configurations', 'index'
20 append_to menu_items, '[System config]', 'configurations', 'index'
21 menu_items << "<br/>"
21 menu_items << "<br/>"
22 end
22 end
23
23
24 # main page
24 # main page
25 append_to menu_items, "[#{I18n.t 'menu.main'}]", 'main', 'list'
25 append_to menu_items, "[#{I18n.t 'menu.main'}]", 'main', 'list'
26 append_to menu_items, "[#{I18n.t 'menu.messages'}]", 'messages', 'list'
26 append_to menu_items, "[#{I18n.t 'menu.messages'}]", 'messages', 'list'
27
27
28 if (user!=nil) and (GraderConfiguration.show_tasks_to?(user))
28 if (user!=nil) and (GraderConfiguration.show_tasks_to?(user))
29 append_to menu_items, "[#{I18n.t 'menu.tasks'}]", 'tasks', 'list'
29 append_to menu_items, "[#{I18n.t 'menu.tasks'}]", 'tasks', 'list'
30 append_to menu_items, "[#{I18n.t 'menu.submissions'}]", 'main', 'submission'
30 append_to menu_items, "[#{I18n.t 'menu.submissions'}]", 'main', 'submission'
31 append_to menu_items, "[#{I18n.t 'menu.test'}]", 'test', 'index'
31 append_to menu_items, "[#{I18n.t 'menu.test'}]", 'test', 'index'
32 end
32 end
33 +
34 + if GraderConfiguration['system.hall_of_fame_available']
35 + append_to menu_items, "[#{I18n.t 'menu.hall_of_fame'}]", 'report', 'problem_hof'
36 + end
33 append_to menu_items, "[#{I18n.t 'menu.help'}]", 'main', 'help'
37 append_to menu_items, "[#{I18n.t 'menu.help'}]", 'main', 'help'
34
38
35 if GraderConfiguration['system.user_setting_enabled']
39 if GraderConfiguration['system.user_setting_enabled']
36 append_to menu_items, "[#{I18n.t 'menu.settings'}]", 'users', 'index'
40 append_to menu_items, "[#{I18n.t 'menu.settings'}]", 'users', 'index'
37 end
41 end
38 append_to menu_items, "[#{I18n.t 'menu.log_out'}]", 'main', 'login'
42 append_to menu_items, "[#{I18n.t 'menu.log_out'}]", 'main', 'login'
39
43
40 menu_items.html_safe
44 menu_items.html_safe
41 end
45 end
42
46
43 def append_to(option,label, controller, action)
47 def append_to(option,label, controller, action)
44 option << ' ' if option!=''
48 option << ' ' if option!=''
45 option << link_to_unless_current(label,
49 option << link_to_unless_current(label,
46 :controller => controller,
50 :controller => controller,
47 :action => action)
51 :action => action)
48 end
52 end
49
53
50 def format_short_time(time)
54 def format_short_time(time)
51 now = Time.now.gmtime
55 now = Time.now.gmtime
52 st = ''
56 st = ''
53 if (time.yday != now.yday) or
57 if (time.yday != now.yday) or
54 (time.year != now.year)
58 (time.year != now.year)
55 st = time.strftime("%x ")
59 st = time.strftime("%x ")
56 end
60 end
57 st + time.strftime("%X")
61 st + time.strftime("%X")
58 end
62 end
59
63
60 def format_short_duration(duration)
64 def format_short_duration(duration)
61 return '' if duration==nil
65 return '' if duration==nil
62 d = duration.to_f
66 d = duration.to_f
63 return Time.at(d).gmtime.strftime("%X")
67 return Time.at(d).gmtime.strftime("%X")
64 end
68 end
65
69
66 def read_textfile(fname,max_size=2048)
70 def read_textfile(fname,max_size=2048)
67 begin
71 begin
68 File.open(fname).read(max_size)
72 File.open(fname).read(max_size)
69 rescue
73 rescue
70 nil
74 nil
71 end
75 end
72 end
76 end
73
77
74 def user_title_bar(user)
78 def user_title_bar(user)
75 header = ''
79 header = ''
76 time_left = ''
80 time_left = ''
77
81
78 #
82 #
79 # if the contest is over
83 # if the contest is over
80 if GraderConfiguration.time_limit_mode?
84 if GraderConfiguration.time_limit_mode?
81 if user.contest_finished?
85 if user.contest_finished?
82 header = <<CONTEST_OVER
86 header = <<CONTEST_OVER
83 <tr><td colspan="2" align="center">
87 <tr><td colspan="2" align="center">
84 <span class="contest-over-msg">THE CONTEST IS OVER</span>
88 <span class="contest-over-msg">THE CONTEST IS OVER</span>
85 </td></tr>
89 </td></tr>
86 CONTEST_OVER
90 CONTEST_OVER
87 end
91 end
88 if !user.contest_started?
92 if !user.contest_started?
89 time_left = "&nbsp;&nbsp;" + (t 'title_bar.contest_not_started')
93 time_left = "&nbsp;&nbsp;" + (t 'title_bar.contest_not_started')
90 else
94 else
91 time_left = "&nbsp;&nbsp;" + (t 'title_bar.remaining_time') +
95 time_left = "&nbsp;&nbsp;" + (t 'title_bar.remaining_time') +
92 " #{format_short_duration(user.contest_time_left)}"
96 " #{format_short_duration(user.contest_time_left)}"
93 end
97 end
94 end
98 end
95
99
96 #
100 #
97 # if the contest is in the anaysis mode
101 # if the contest is in the anaysis mode
98 if GraderConfiguration.analysis_mode?
102 if GraderConfiguration.analysis_mode?
99 header = <<ANALYSISMODE
103 header = <<ANALYSISMODE
100 <tr><td colspan="2" align="center">
104 <tr><td colspan="2" align="center">
101 <span class="contest-over-msg">ANALYSIS MODE</span>
105 <span class="contest-over-msg">ANALYSIS MODE</span>
102 </td></tr>
106 </td></tr>
103 ANALYSISMODE
107 ANALYSISMODE
104 end
108 end
105
109
106 contest_name = GraderConfiguration['contest.name']
110 contest_name = GraderConfiguration['contest.name']
107
111
108 #
112 #
109 # build real title bar
113 # build real title bar
110 result = <<TITLEBAR
114 result = <<TITLEBAR
111 <div class="title">
115 <div class="title">
112 <table>
116 <table>
113 #{header}
117 #{header}
114 <tr>
118 <tr>
115 <td class="left-col">
119 <td class="left-col">
116 #{user.full_name}<br/>
120 #{user.full_name}<br/>
117 #{t 'title_bar.current_time'} #{format_short_time(Time.new)}
121 #{t 'title_bar.current_time'} #{format_short_time(Time.new)}
118 #{time_left}
122 #{time_left}
119 <br/>
123 <br/>
120 </td>
124 </td>
121 <td class="right-col">#{contest_name}</td>
125 <td class="right-col">#{contest_name}</td>
122 </tr>
126 </tr>
123 </table>
127 </table>
124 </div>
128 </div>
125 TITLEBAR
129 TITLEBAR
126 result.html_safe
130 result.html_safe
127 end
131 end
128
132
@@ -1,118 +1,119
1 # Sample localization file for English. Add more files in this directory for other locales.
1 # Sample localization file for English. Add more files in this directory for other locales.
2 # See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
2 # See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
3
4 en:
4 en:
5 cancel: 'Cancel'
5 cancel: 'Cancel'
6
6
7 login_label: 'Login'
7 login_label: 'Login'
8 full_name_label: 'Full name'
8 full_name_label: 'Full name'
9 email_label: 'E-mail'
9 email_label: 'E-mail'
10 password_label: 'Password'
10 password_label: 'Password'
11
11
12 go_ahead_to: "Go ahead to"
12 go_ahead_to: "Go ahead to"
13 go_back_to: "Go back to"
13 go_back_to: "Go back to"
14 login_page: "login page"
14 login_page: "login page"
15 home_page: "home page"
15 home_page: "home page"
16
16
17 menu:
17 menu:
18 main: 'Main'
18 main: 'Main'
19 messages: 'Messages'
19 messages: 'Messages'
20 tasks: 'Tasks'
20 tasks: 'Tasks'
21 submissions: 'Submissions'
21 submissions: 'Submissions'
22 test: 'Test Interface'
22 test: 'Test Interface'
23 + hall_of_fame: 'Hall of Fame'
23 help: 'Help'
24 help: 'Help'
24 settings: 'Settings'
25 settings: 'Settings'
25 log_out: 'Log out'
26 log_out: 'Log out'
26
27
27 title_bar:
28 title_bar:
28 current_time: "Current time is"
29 current_time: "Current time is"
29 remaining_time: "Time left: "
30 remaining_time: "Time left: "
30 contest_not_started: "The contest has not started."
31 contest_not_started: "The contest has not started."
31
32
32 login:
33 login:
33 message: 'Please login to see the problem list'
34 message: 'Please login to see the problem list'
34 login_submit: 'Login'
35 login_submit: 'Login'
35 participation: 'Want to participate?'
36 participation: 'Want to participate?'
36 please: 'Please'
37 please: 'Please'
37 register: 'register'
38 register: 'register'
38 forget_password: 'Forget password?'
39 forget_password: 'Forget password?'
39
40
40 main:
41 main:
41 start_soon: "The contest at your site will start soon. Please wait."
42 start_soon: "The contest at your site will start soon. Please wait."
42 specified_in_header: "Specified in header"
43 specified_in_header: "Specified in header"
43
44
44 problem_desc: "desc"
45 problem_desc: "desc"
45 submitted_at: "Submitted at"
46 submitted_at: "Submitted at"
46 graded_at: "Graded at"
47 graded_at: "Graded at"
47 score: "score: "
48 score: "score: "
48 cmp_msg: "compiler msg"
49 cmp_msg: "compiler msg"
49 src_link: "src"
50 src_link: "src"
50 submissions_link: "submissions"
51 submissions_link: "submissions"
51
52
52 confirm_contest_start:
53 confirm_contest_start:
53 box_title: "Contest confirmation"
54 box_title: "Contest confirmation"
54 contest_list: "You will participate in contest:"
55 contest_list: "You will participate in contest:"
55 timer_starts_after_click: "The timer will start after you click the start button."
56 timer_starts_after_click: "The timer will start after you click the start button."
56 start_button: "Start!"
57 start_button: "Start!"
57 start_button_confirm: "Are you sure?"
58 start_button_confirm: "Are you sure?"
58
59
59 test:
60 test:
60 title: "Test Interface"
61 title: "Test Interface"
61 intro: "You can test your submission with your own test data on the grading environment using this test interface."
62 intro: "You can test your submission with your own test data on the grading environment using this test interface."
62 disabled_at_end_announcement: "<b>Note:</b> Test interface will be disabled in the last 30 minutes of the contest time on your site."
63 disabled_at_end_announcement: "<b>Note:</b> Test interface will be disabled in the last 30 minutes of the contest time on your site."
63
64
64 registration:
65 registration:
65 title: "New user registration"
66 title: "New user registration"
66
67
67 description: "Please enter your information below. Please make sure your e-mail is correct, because you will have to confirm the registration through an e-mail we send to that e-mail address."
68 description: "Please enter your information below. Please make sure your e-mail is correct, because you will have to confirm the registration through an e-mail we send to that e-mail address."
68
69
69 successful_title: "Registration successful"
70 successful_title: "Registration successful"
70
71
71 login_guide: "Only a-z, A-Z, 0-9 and _. Can be at most 20 characters long"
72 login_guide: "Only a-z, A-Z, 0-9 and _. Can be at most 20 characters long"
72 email_guide: "Please make sure that your e-mail is correct.<br/>You'll need to verify your account by email."
73 email_guide: "Please make sure that your e-mail is correct.<br/>You'll need to verify your account by email."
73 register: "Register"
74 register: "Register"
74
75
75 email_body: "Hello %{full_name},
76 email_body: "Hello %{full_name},
76
77
77 You have registered for %{contest_name}
78 You have registered for %{contest_name}
78
79
79 Your login is: %{login}
80 Your login is: %{login}
80
81
81 Your password is: %{password}
82 Your password is: %{password}
82
83
83 Please follow the link:
84 Please follow the link:
84
85
85 %{activation_url}
86 %{activation_url}
86
87
87 to activate your user account.
88 to activate your user account.
88
89
89 If you did not register, please ignore this e-mail
90 If you did not register, please ignore this e-mail
90 and report this event to %{admin_email}.
91 and report this event to %{admin_email}.
91
92
92 Thanks!"
93 Thanks!"
93
94
94 email_sent: "We have sent a confimation message to your e-mail. (Please also check the Junk mail box."
95 email_sent: "We have sent a confimation message to your e-mail. (Please also check the Junk mail box."
95 email_verify_at: "Please check at %{email} and confirm."
96 email_verify_at: "Please check at %{email} and confirm."
96
97
97 activation_sucessful_title: "User activated"
98 activation_sucessful_title: "User activated"
98 account_activated: "Your account has been activated."
99 account_activated: "Your account has been activated."
99
100
100 activation_failed_title: "Activation failed"
101 activation_failed_title: "Activation failed"
101
102
102 errors:
103 errors:
103 header: "Errors occured during registration"
104 header: "Errors occured during registration"
104 email:
105 email:
105 title: "Errors in sending registration confirmation"
106 title: "Errors in sending registration confirmation"
106 expl: "<h2>Your user account has been created, but the system cannot send you the confirmation e-mail.</h2>
107 expl: "<h2>Your user account has been created, but the system cannot send you the confirmation e-mail.</h2>
107 Maybe there's a problem in the configuration. Please report the admin at %{email}.<br/>Thank you!"
108 Maybe there's a problem in the configuration. Please report the admin at %{email}.<br/>Thank you!"
108 activation:
109 activation:
109 email_exists: "A user with this E-mail exists."
110 email_exists: "A user with this E-mail exists."
110 invalid: "Your activation code is invalid. Please check again."
111 invalid: "Your activation code is invalid. Please check again."
111
112
112 password_retrieval:
113 password_retrieval:
113 header: "Password retrieval"
114 header: "Password retrieval"
114 instructions: "Please enter the e-mail address that you used to register."
115 instructions: "Please enter the e-mail address that you used to register."
115 button_label: "Request new password"
116 button_label: "Request new password"
116 no_email: "No user with that e-mail address."
117 no_email: "No user with that e-mail address."
117 email_body: "Hello %{full_name},
118 email_body: "Hello %{full_name},
118
119
@@ -1,118 +1,119
1 # Sample localization file for English. Add more files in this directory for other locales.
1 # Sample localization file for English. Add more files in this directory for other locales.
2 # See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
2 # See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
3
4 th:
4 th:
5 cancel: 'ฒกเΰΈ₯ิก'
5 cancel: 'ฒกเΰΈ₯ิก'
6
6
7 login_label: 'ΰΈŠΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΉƒΰΈŠΰΉ‰ΰΈ£ΰΈ°ΰΈšΰΈš (login)'
7 login_label: 'ΰΈŠΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΉƒΰΈŠΰΉ‰ΰΈ£ΰΈ°ΰΈšΰΈš (login)'
8 full_name_label: 'ΰΈŠΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ•ΰΉ‡ΰΈ‘'
8 full_name_label: 'ΰΈŠΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ•ΰΉ‡ΰΈ‘'
9 email_label: 'E-mail'
9 email_label: 'E-mail'
10 password_label: 'ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™'
10 password_label: 'ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™'
11
11
12 go_ahead_to: "ΰΉ„ΰΈ›ΰΈ’ΰΈ±ΰΈ‡"
12 go_ahead_to: "ΰΉ„ΰΈ›ΰΈ’ΰΈ±ΰΈ‡"
13 go_back_to: "กΰΈ₯ΰΈ±ΰΈšΰΉ„ΰΈ›ΰΈ’ΰΈ±ΰΈ‡"
13 go_back_to: "กΰΈ₯ΰΈ±ΰΈšΰΉ„ΰΈ›ΰΈ’ΰΈ±ΰΈ‡"
14 login_page: "ΰΈ«ΰΈ™ΰΉ‰ΰΈ²ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΉƒΰΈŠΰΉ‰ΰΈ£ΰΈ°ΰΈšΰΈš"
14 login_page: "ΰΈ«ΰΈ™ΰΉ‰ΰΈ²ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΉƒΰΈŠΰΉ‰ΰΈ£ΰΈ°ΰΈšΰΈš"
15 home_page: "หน้าแรก"
15 home_page: "หน้าแรก"
16
16
17 menu:
17 menu:
18 main: 'ΰΈ«ΰΈ™ΰΉ‰ΰΈ²ΰΈ«ΰΈ₯ัก'
18 main: 'ΰΈ«ΰΈ™ΰΉ‰ΰΈ²ΰΈ«ΰΈ₯ัก'
19 messages: 'ΰΈ‚ΰΉ‰ΰΈ­ΰΈ„ΰΈ§ΰΈ²ΰΈ‘'
19 messages: 'ΰΈ‚ΰΉ‰ΰΈ­ΰΈ„ΰΈ§ΰΈ²ΰΈ‘'
20 tasks: 'ΰΉ‚ΰΈˆΰΈ—ΰΈ’ΰΉŒ'
20 tasks: 'ΰΉ‚ΰΈˆΰΈ—ΰΈ’ΰΉŒ'
21 submissions: 'ΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΈ—ΰΈ΅ΰΉˆΰΈͺΰΉˆΰΈ‡'
21 submissions: 'ΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΈ—ΰΈ΅ΰΉˆΰΈͺΰΉˆΰΈ‡'
22 test: 'ΰΈ—ΰΈ”ΰΈͺΰΈ­ΰΈšΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘'
22 test: 'ΰΈ—ΰΈ”ΰΈͺΰΈ­ΰΈšΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘'
23 + hall_of_fame: 'หอเกมฒรติฒศ'
23 help: 'ΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΈŠΰΉˆΰΈ§ΰΈ’ΰΉ€ΰΈ«ΰΈ₯ΰΈ·ΰΈ­'
24 help: 'ΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΈŠΰΉˆΰΈ§ΰΈ’ΰΉ€ΰΈ«ΰΈ₯ΰΈ·ΰΈ­'
24 settings: 'ΰΉ€ΰΈ›ΰΈ₯ΰΈ΅ΰΉˆΰΈ’ΰΈ™ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™'
25 settings: 'ΰΉ€ΰΈ›ΰΈ₯ΰΈ΅ΰΉˆΰΈ’ΰΈ™ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™'
25 log_out: 'ออกจากระบบ'
26 log_out: 'ออกจากระบบ'
26
27
27 title_bar:
28 title_bar:
28 current_time: "ΰΉ€ΰΈ§ΰΈ₯ΰΈ²ΰΈ›ΰΈ±ΰΈˆΰΈˆΰΈΈΰΈšΰΈ±ΰΈ™ΰΈ„ΰΈ·ΰΈ­"
29 current_time: "ΰΉ€ΰΈ§ΰΈ₯ΰΈ²ΰΈ›ΰΈ±ΰΈˆΰΈˆΰΈΈΰΈšΰΈ±ΰΈ™ΰΈ„ΰΈ·ΰΈ­"
29 remaining_time: "ΰΉ€ΰΈ«ΰΈ₯ΰΈ·ΰΈ­ΰΉ€ΰΈ§ΰΈ₯าอมก"
30 remaining_time: "ΰΉ€ΰΈ«ΰΈ₯ΰΈ·ΰΈ­ΰΉ€ΰΈ§ΰΈ₯าอมก"
30 contest_not_started: "ΰΈ’ΰΈ±ΰΈ‡ΰΉ„ΰΈ‘ΰΉˆΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™"
31 contest_not_started: "ΰΈ’ΰΈ±ΰΈ‡ΰΉ„ΰΈ‘ΰΉˆΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™"
31
32
32 login:
33 login:
33 message: 'กรุณา login ΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΈͺู่ระบบ'
34 message: 'กรุณา login ΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΈͺู่ระบบ'
34 login_submit: 'ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΉƒΰΈŠΰΉ‰ΰΈ£ΰΈ°ΰΈšΰΈš'
35 login_submit: 'ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΉƒΰΈŠΰΉ‰ΰΈ£ΰΈ°ΰΈšΰΈš'
35 participation: 'ΰΈ•ΰΉ‰ΰΈ­ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΈ£ΰΉˆΰΈ§ΰΈ‘?'
36 participation: 'ΰΈ•ΰΉ‰ΰΈ­ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΈ£ΰΉˆΰΈ§ΰΈ‘?'
36 please: 'กรุณา'
37 please: 'กรุณา'
37 register: 'ΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™'
38 register: 'ΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™'
38 forget_password: 'ΰΈ₯ΰΈ·ΰΈ‘ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™?'
39 forget_password: 'ΰΈ₯ΰΈ·ΰΈ‘ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™?'
39
40
40 main:
41 main:
41 start_soon: "ΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ΰΈΰΈ³ΰΈ₯ΰΈ±ΰΈ‡ΰΈˆΰΈ°ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ ΰΈΰΈ£ΰΈΈΰΈ“ΰΈ²ΰΈ£ΰΈ­ΰΈΰΉˆΰΈ­ΰΈ™"
42 start_soon: "ΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ΰΈΰΈ³ΰΈ₯ΰΈ±ΰΈ‡ΰΈˆΰΈ°ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ ΰΈΰΈ£ΰΈΈΰΈ“ΰΈ²ΰΈ£ΰΈ­ΰΈΰΉˆΰΈ­ΰΈ™"
42 specified_in_header: "ΰΈ£ΰΈ°ΰΈšΰΈΈΰΈ—ΰΈ΅ΰΉˆΰΈ«ΰΈ±ΰΈ§ΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΉΰΈ₯ΰΉ‰ΰΈ§"
43 specified_in_header: "ΰΈ£ΰΈ°ΰΈšΰΈΈΰΈ—ΰΈ΅ΰΉˆΰΈ«ΰΈ±ΰΈ§ΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΉΰΈ₯ΰΉ‰ΰΈ§"
43
44
44 problem_desc: "ΰΈ­ΰΉˆΰΈ²ΰΈ™"
45 problem_desc: "ΰΈ­ΰΉˆΰΈ²ΰΈ™"
45 submitted_at: "ΰΈͺΰΉˆΰΈ‡ΰΉ€ΰΈ‘ΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ§ΰΈ₯ΰΈ²"
46 submitted_at: "ΰΈͺΰΉˆΰΈ‡ΰΉ€ΰΈ‘ΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ§ΰΈ₯ΰΈ²"
46 graded_at: "ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΉ€ΰΈ‘ΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ§ΰΈ₯ΰΈ²"
47 graded_at: "ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΉ€ΰΈ‘ΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ§ΰΈ₯ΰΈ²"
47 score: "คะแนน: "
48 score: "คะแนน: "
48 cmp_msg: "ผΰΈ₯ΰΈ„ΰΈ­ΰΈ‘ΰΉ„ΰΈžΰΈ₯์"
49 cmp_msg: "ผΰΈ₯ΰΈ„ΰΈ­ΰΈ‘ΰΉ„ΰΈžΰΈ₯์"
49 src_link: "ΰΈ•ΰΉ‰ΰΈ™ΰΈ‰ΰΈšΰΈ±ΰΈš"
50 src_link: "ΰΈ•ΰΉ‰ΰΈ™ΰΈ‰ΰΈšΰΈ±ΰΈš"
50 submissions_link: "การΰΈͺΰΉˆΰΈ‡ΰΈ„ΰΈ£ΰΈ±ΰΉ‰ΰΈ‡ΰΈ­ΰΈ·ΰΉˆΰΈ™ ΰΉ†"
51 submissions_link: "การΰΈͺΰΉˆΰΈ‡ΰΈ„ΰΈ£ΰΈ±ΰΉ‰ΰΈ‡ΰΈ­ΰΈ·ΰΉˆΰΈ™ ΰΉ†"
51
52
52 confirm_contest_start:
53 confirm_contest_start:
53 box_title: "ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈΰΈ²ΰΈ£ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™"
54 box_title: "ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈΰΈ²ΰΈ£ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™"
54 contest_list: "ΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ΰΈ—ΰΈ΅ΰΉˆΰΈ„ΰΈΈΰΈ“ΰΈˆΰΈ°ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΈ£ΰΉˆΰΈ§ΰΈ‘ΰΈ„ΰΈ·ΰΈ­ "
55 contest_list: "ΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ΰΈ—ΰΈ΅ΰΉˆΰΈ„ΰΈΈΰΈ“ΰΈˆΰΈ°ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΈ£ΰΉˆΰΈ§ΰΈ‘ΰΈ„ΰΈ·ΰΈ­ "
55 timer_starts_after_click: "ΰΈΰΈ²ΰΈ£ΰΈˆΰΈ±ΰΈšΰΉ€ΰΈ§ΰΈ₯ΰΈ²ΰΈˆΰΈ°ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ΰΈ‚ΰΈΆΰΉ‰ΰΈ™ΰΉ€ΰΈ‘ΰΈ·ΰΉˆΰΈ­ΰΈ„ΰΈΈΰΈ“ΰΈΰΈ”ΰΈ›ΰΈΈΰΉˆΰΈ‘ΰΈ”ΰΉ‰ΰΈ²ΰΈ™ΰΈ₯ΰΉˆΰΈ²ΰΈ‡"
56 timer_starts_after_click: "ΰΈΰΈ²ΰΈ£ΰΈˆΰΈ±ΰΈšΰΉ€ΰΈ§ΰΈ₯ΰΈ²ΰΈˆΰΈ°ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ΰΈ‚ΰΈΆΰΉ‰ΰΈ™ΰΉ€ΰΈ‘ΰΈ·ΰΉˆΰΈ­ΰΈ„ΰΈΈΰΈ“ΰΈΰΈ”ΰΈ›ΰΈΈΰΉˆΰΈ‘ΰΈ”ΰΉ‰ΰΈ²ΰΈ™ΰΈ₯ΰΉˆΰΈ²ΰΈ‡"
56 start_button: "ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ΰΉΰΈ‚ΰΉˆΰΈ‡!"
57 start_button: "ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ΰΉΰΈ‚ΰΉˆΰΈ‡!"
57 start_button_confirm: "ΰΉΰΈ™ΰΉˆΰΉƒΰΈˆΰΈ—ΰΈ΅ΰΉˆΰΈˆΰΈ°ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ«ΰΈ£ΰΈ·ΰΈ­ΰΉ„ΰΈ‘ΰΉˆ?"
58 start_button_confirm: "ΰΉΰΈ™ΰΉˆΰΉƒΰΈˆΰΈ—ΰΈ΅ΰΉˆΰΈˆΰΈ°ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ«ΰΈ£ΰΈ·ΰΈ­ΰΉ„ΰΈ‘ΰΉˆ?"
58
59
59 test:
60 test:
60 title: "ΰΈ—ΰΈ”ΰΈͺΰΈ­ΰΈšΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΈšΰΈ™ΰΈͺΰΈ ΰΈ²ΰΈžΰΉΰΈ§ΰΈ”ΰΈ₯ΰΉ‰ΰΈ­ΰΈ‘ΰΈ‚ΰΈ­ΰΈ‡ΰΉ€ΰΈ„ΰΈ£ΰΈ·ΰΉˆΰΈ­ΰΈ‡ΰΈ•ΰΈ£ΰΈ§ΰΈˆ"
61 title: "ΰΈ—ΰΈ”ΰΈͺΰΈ­ΰΈšΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΈšΰΈ™ΰΈͺΰΈ ΰΈ²ΰΈžΰΉΰΈ§ΰΈ”ΰΈ₯ΰΉ‰ΰΈ­ΰΈ‘ΰΈ‚ΰΈ­ΰΈ‡ΰΉ€ΰΈ„ΰΈ£ΰΈ·ΰΉˆΰΈ­ΰΈ‡ΰΈ•ΰΈ£ΰΈ§ΰΈˆ"
61 intro: "ΰΈ„ΰΈΈΰΈ“ΰΈͺΰΈ²ΰΈ‘ΰΈ²ΰΈ£ΰΈ–ΰΈ—ΰΈ”ΰΈ₯ΰΈ­ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΈ—ΰΈ³ΰΈ‡ΰΈ²ΰΈ™ΰΈ‚ΰΈ­ΰΈ‡ΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΈ—ΰΈ΅ΰΉˆΰΉ€ΰΈ‚ΰΈ΅ΰΈ’ΰΈ™ΰΈΰΈ±ΰΈšΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΈŠΰΈΈΰΈ”ΰΈ—ΰΈ”ΰΈͺΰΈ­ΰΈšΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“ΰΉ€ΰΈ­ΰΈ‡ΰΉƒΰΈ™ΰΈͺΰΈ ΰΈ²ΰΈžΰΉΰΈ§ΰΈ”ΰΈ₯ΰΉ‰ΰΈ­ΰΈ‘ΰΈˆΰΈ£ΰΈ΄ΰΈ‡ΰΈ‚ΰΈ­ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΉ„ΰΈ”ΰΉ‰ ΰΉ‚ΰΈ”ΰΈ’ΰΉ€ΰΈ₯ือกโปรแกรฑΰΈͺΰΉˆΰΈ‡ΰΉΰΈ₯ΰΉ‰ΰΈ§ΰΈ—ΰΈ΅ΰΉˆΰΈ”ΰΉ‰ΰΈ²ΰΈ™ΰΈ₯ΰΉˆΰΈ²ΰΈ‡ΰΈžΰΈ£ΰΉ‰ΰΈ­ΰΈ‘ΰΈ—ΰΈ±ΰΉ‰ΰΈ‡ΰΈͺΰΉˆΰΈ‡ΰΉΰΈŸΰΉ‰ΰΈ‘ΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΈŠΰΈΈΰΈ”ΰΈ—ΰΈ”ΰΈͺΰΈ­ΰΈšΰΈ—ΰΈ΅ΰΉˆΰΈ•ΰΉ‰ΰΈ­ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΉƒΰΈ«ΰΉ‰ΰΈ—ΰΈ³ΰΈ‡ΰΈ²ΰΈ™ΰΈ”ΰΉ‰ΰΈ§ΰΈ’"
62 intro: "ΰΈ„ΰΈΈΰΈ“ΰΈͺΰΈ²ΰΈ‘ΰΈ²ΰΈ£ΰΈ–ΰΈ—ΰΈ”ΰΈ₯ΰΈ­ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΈ—ΰΈ³ΰΈ‡ΰΈ²ΰΈ™ΰΈ‚ΰΈ­ΰΈ‡ΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΈ—ΰΈ΅ΰΉˆΰΉ€ΰΈ‚ΰΈ΅ΰΈ’ΰΈ™ΰΈΰΈ±ΰΈšΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΈŠΰΈΈΰΈ”ΰΈ—ΰΈ”ΰΈͺΰΈ­ΰΈšΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“ΰΉ€ΰΈ­ΰΈ‡ΰΉƒΰΈ™ΰΈͺΰΈ ΰΈ²ΰΈžΰΉΰΈ§ΰΈ”ΰΈ₯ΰΉ‰ΰΈ­ΰΈ‘ΰΈˆΰΈ£ΰΈ΄ΰΈ‡ΰΈ‚ΰΈ­ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΉ„ΰΈ”ΰΉ‰ ΰΉ‚ΰΈ”ΰΈ’ΰΉ€ΰΈ₯ือกโปรแกรฑΰΈͺΰΉˆΰΈ‡ΰΉΰΈ₯ΰΉ‰ΰΈ§ΰΈ—ΰΈ΅ΰΉˆΰΈ”ΰΉ‰ΰΈ²ΰΈ™ΰΈ₯ΰΉˆΰΈ²ΰΈ‡ΰΈžΰΈ£ΰΉ‰ΰΈ­ΰΈ‘ΰΈ—ΰΈ±ΰΉ‰ΰΈ‡ΰΈͺΰΉˆΰΈ‡ΰΉΰΈŸΰΉ‰ΰΈ‘ΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΈŠΰΈΈΰΈ”ΰΈ—ΰΈ”ΰΈͺΰΈ­ΰΈšΰΈ—ΰΈ΅ΰΉˆΰΈ•ΰΉ‰ΰΈ­ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΉƒΰΈ«ΰΉ‰ΰΈ—ΰΈ³ΰΈ‡ΰΈ²ΰΈ™ΰΈ”ΰΉ‰ΰΈ§ΰΈ’"
62 disabled_at_end_announcement: "<b>ΰΈ«ΰΈ‘ΰΈ²ΰΈ’ΰΉ€ΰΈ«ΰΈ•ΰΈΈ:</b> ΰΈ£ΰΈ°ΰΈšΰΈšΰΈ—ΰΈ”ΰΈͺΰΈ­ΰΈšΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΈˆΰΈ°ΰΈ«ΰΈ’ΰΈΈΰΈ”ΰΈ—ΰΈ³ΰΈ‡ΰΈ²ΰΈ™ΰΉƒΰΈ™ΰΈŠΰΉˆΰΈ§ΰΈ‡ΰΉ€ΰΈ§ΰΈ₯ΰΈ² 30 ΰΈ™ΰΈ²ΰΈ—ΰΈ΅ΰΈͺΰΈΈΰΈ”ΰΈ—ΰΉ‰ΰΈ²ΰΈ’ΰΈ‚ΰΈ­ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™"
63 disabled_at_end_announcement: "<b>ΰΈ«ΰΈ‘ΰΈ²ΰΈ’ΰΉ€ΰΈ«ΰΈ•ΰΈΈ:</b> ΰΈ£ΰΈ°ΰΈšΰΈšΰΈ—ΰΈ”ΰΈͺΰΈ­ΰΈšΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΈˆΰΈ°ΰΈ«ΰΈ’ΰΈΈΰΈ”ΰΈ—ΰΈ³ΰΈ‡ΰΈ²ΰΈ™ΰΉƒΰΈ™ΰΈŠΰΉˆΰΈ§ΰΈ‡ΰΉ€ΰΈ§ΰΈ₯ΰΈ² 30 ΰΈ™ΰΈ²ΰΈ—ΰΈ΅ΰΈͺΰΈΈΰΈ”ΰΈ—ΰΉ‰ΰΈ²ΰΈ’ΰΈ‚ΰΈ­ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™"
63
64
64 registration:
65 registration:
65 title: "ΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΉƒΰΈ«ΰΈ‘ΰΉˆ"
66 title: "ΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΉƒΰΈ«ΰΈ‘ΰΉˆ"
66 description: "ในการΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ ΰΉƒΰΈ«ΰΉ‰ΰΈœΰΈΉΰΉ‰ΰΈͺΰΈ™ΰΉƒΰΈˆΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΈ£ΰΉˆΰΈ§ΰΈ‘ΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ΰΈΰΈ£ΰΈ­ΰΈΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΈ”ΰΉ‰ΰΈ²ΰΈ™ΰΈ₯ΰΉˆΰΈ²ΰΈ‡ ΰΈˆΰΈ²ΰΈΰΈ™ΰΈ±ΰΉ‰ΰΈ™ΰΈ£ΰΈ°ΰΈšΰΈšΰΈˆΰΈ°ΰΈͺΰΉˆΰΈ‡ e-mail ΰΉ„ΰΈ›ΰΈ’ΰΈ±ΰΈ‡ e-mail ΰΈ—ΰΈ΅ΰΉˆΰΈ£ΰΈ°ΰΈšΰΈΈΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΉƒΰΈ«ΰΉ‰ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈ•ΰΈ±ΰΈ§ΰΈ•ΰΈ™ΰΉΰΈ₯ΰΈ°ΰΉ€ΰΈ›ΰΈ΄ΰΈ”ΰΉƒΰΈŠΰΉ‰ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰<br/>ΰΉƒΰΈ™ΰΈΰΈ£ΰΈ“ΰΈ΅ΰΈ—ΰΈ΅ΰΉˆΰΈœΰΈΉΰΉ‰ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ΰΉ€ΰΈ›ΰΉ‡ΰΈ™ΰΈ™ΰΈ±ΰΈΰΉ€ΰΈ£ΰΈ΅ΰΈ’ΰΈ™ ΰΈ£ΰΈšΰΈΰΈ§ΰΈ™ΰΈŠΰΉˆΰΈ§ΰΈ’ΰΉƒΰΈ«ΰΉ‰ΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΉ€ΰΈΰΈ΅ΰΉˆΰΈ’ΰΈ§ΰΈΰΈ±ΰΈšΰΉ‚ΰΈ£ΰΈ‡ΰΉ€ΰΈ£ΰΈ΅ΰΈ’ΰΈ™ΰΉΰΈ₯ΰΈ°ΰΈˆΰΈ±ΰΈ‡ΰΈ«ΰΈ§ΰΈ±ΰΈ”ΰΈ”ΰΉ‰ΰΈ§ΰΈ’"
67 description: "ในการΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ ΰΉƒΰΈ«ΰΉ‰ΰΈœΰΈΉΰΉ‰ΰΈͺΰΈ™ΰΉƒΰΈˆΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΈ£ΰΉˆΰΈ§ΰΈ‘ΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ΰΈΰΈ£ΰΈ­ΰΈΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΈ”ΰΉ‰ΰΈ²ΰΈ™ΰΈ₯ΰΉˆΰΈ²ΰΈ‡ ΰΈˆΰΈ²ΰΈΰΈ™ΰΈ±ΰΉ‰ΰΈ™ΰΈ£ΰΈ°ΰΈšΰΈšΰΈˆΰΈ°ΰΈͺΰΉˆΰΈ‡ e-mail ΰΉ„ΰΈ›ΰΈ’ΰΈ±ΰΈ‡ e-mail ΰΈ—ΰΈ΅ΰΉˆΰΈ£ΰΈ°ΰΈšΰΈΈΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΉƒΰΈ«ΰΉ‰ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈ•ΰΈ±ΰΈ§ΰΈ•ΰΈ™ΰΉΰΈ₯ΰΈ°ΰΉ€ΰΈ›ΰΈ΄ΰΈ”ΰΉƒΰΈŠΰΉ‰ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰<br/>ΰΉƒΰΈ™ΰΈΰΈ£ΰΈ“ΰΈ΅ΰΈ—ΰΈ΅ΰΉˆΰΈœΰΈΉΰΉ‰ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ΰΉ€ΰΈ›ΰΉ‡ΰΈ™ΰΈ™ΰΈ±ΰΈΰΉ€ΰΈ£ΰΈ΅ΰΈ’ΰΈ™ ΰΈ£ΰΈšΰΈΰΈ§ΰΈ™ΰΈŠΰΉˆΰΈ§ΰΈ’ΰΉƒΰΈ«ΰΉ‰ΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΉ€ΰΈΰΈ΅ΰΉˆΰΈ’ΰΈ§ΰΈΰΈ±ΰΈšΰΉ‚ΰΈ£ΰΈ‡ΰΉ€ΰΈ£ΰΈ΅ΰΈ’ΰΈ™ΰΉΰΈ₯ΰΈ°ΰΈˆΰΈ±ΰΈ‡ΰΈ«ΰΈ§ΰΈ±ΰΈ”ΰΈ”ΰΉ‰ΰΈ§ΰΈ’"
67
68
68 successful_title: "การΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ΰΉ€ΰΈͺΰΈ£ΰΉ‡ΰΈˆΰΉ€ΰΈ£ΰΈ΅ΰΈ’ΰΈšΰΈ£ΰΉ‰ΰΈ­ΰΈ’"
69 successful_title: "การΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ΰΉ€ΰΈͺΰΈ£ΰΉ‡ΰΈˆΰΉ€ΰΈ£ΰΈ΅ΰΈ’ΰΈšΰΈ£ΰΉ‰ΰΈ­ΰΈ’"
69
70
70 login_guide: "ΰΉƒΰΈŠΰΉ‰ΰΉ„ΰΈ”ΰΉ‰ΰΉ€ΰΈ‰ΰΈžΰΈ²ΰΈ° a-z, A-Z, 0-9 แΰΈ₯ΰΈ° _ ΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΈ’ΰΈ²ΰΈ§ΰΉ„ΰΈ‘ΰΉˆΰΉ€ΰΈΰΈ΄ΰΈ™ 20 ตัวอักษร"
71 login_guide: "ΰΉƒΰΈŠΰΉ‰ΰΉ„ΰΈ”ΰΉ‰ΰΉ€ΰΈ‰ΰΈžΰΈ²ΰΈ° a-z, A-Z, 0-9 แΰΈ₯ΰΈ° _ ΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΈ’ΰΈ²ΰΈ§ΰΉ„ΰΈ‘ΰΉˆΰΉ€ΰΈΰΈ΄ΰΈ™ 20 ตัวอักษร"
71 email_guide: "ΰΈΰΈ£ΰΈΈΰΈ“ΰΈ²ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈͺอบ e-mail ΰΈ—ΰΈ΅ΰΉˆΰΉƒΰΈͺΰΉˆΰΉƒΰΈ«ΰΉ‰ΰΈ–ΰΈΉΰΈΰΈ•ΰΉ‰ΰΈ­ΰΈ‡<br/>ΰΈ„ΰΈΈΰΈ“ΰΈˆΰΈ°ΰΈ•ΰΉ‰ΰΈ­ΰΈ‡ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈΰΈ²ΰΈ£ΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ΰΈœΰΉˆΰΈ²ΰΈ™ΰΈ—ΰΈ²ΰΈ‡ΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΈ—ΰΈ΅ΰΉˆΰΈˆΰΈ°ΰΈͺΰΉˆΰΈ‡ΰΉƒΰΈ«ΰΉ‰ΰΈ—ΰΈ²ΰΈ‡ e-mail"
72 email_guide: "ΰΈΰΈ£ΰΈΈΰΈ“ΰΈ²ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈͺอบ e-mail ΰΈ—ΰΈ΅ΰΉˆΰΉƒΰΈͺΰΉˆΰΉƒΰΈ«ΰΉ‰ΰΈ–ΰΈΉΰΈΰΈ•ΰΉ‰ΰΈ­ΰΈ‡<br/>ΰΈ„ΰΈΈΰΈ“ΰΈˆΰΈ°ΰΈ•ΰΉ‰ΰΈ­ΰΈ‡ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈΰΈ²ΰΈ£ΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ΰΈœΰΉˆΰΈ²ΰΈ™ΰΈ—ΰΈ²ΰΈ‡ΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΈ—ΰΈ΅ΰΉˆΰΈˆΰΈ°ΰΈͺΰΉˆΰΈ‡ΰΉƒΰΈ«ΰΉ‰ΰΈ—ΰΈ²ΰΈ‡ e-mail"
72 register: "ΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™"
73 register: "ΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™"
73
74
74 email_body: "ΰΈͺΰΈ§ΰΈ±ΰΈͺΰΈ”ΰΈ΅ΰΈ„ΰΈ£ΰΈ±ΰΈš %{full_name},
75 email_body: "ΰΈͺΰΈ§ΰΈ±ΰΈͺΰΈ”ΰΈ΅ΰΈ„ΰΈ£ΰΈ±ΰΈš %{full_name},
75
76
76 ΰΈ„ΰΈΈΰΈ“ΰΉ„ΰΈ”ΰΉ‰ΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΈ£ΰΉˆΰΈ§ΰΈ‘ΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ %{contest_name}
77 ΰΈ„ΰΈΈΰΈ“ΰΉ„ΰΈ”ΰΉ‰ΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΈ£ΰΉˆΰΈ§ΰΈ‘ΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ %{contest_name}
77
78
78 ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΉƒΰΈŠΰΉ‰ΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“ΰΈ„ΰΈ·ΰΈ­: %{login}
79 ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΉƒΰΈŠΰΉ‰ΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“ΰΈ„ΰΈ·ΰΈ­: %{login}
79
80
80 ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™ΰΈ„ΰΈ·ΰΈ­: %{password}
81 ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™ΰΈ„ΰΈ·ΰΈ­: %{password}
81
82
82 กรุณาเข้าΰΈ₯ΰΈ΄ΰΈ‡ΰΈΰΉŒΰΈ•ΰΉˆΰΈ­ΰΉ„ΰΈ›ΰΈ™ΰΈ΅ΰΉ‰:
83 กรุณาเข้าΰΈ₯ΰΈ΄ΰΈ‡ΰΈΰΉŒΰΈ•ΰΉˆΰΈ­ΰΉ„ΰΈ›ΰΈ™ΰΈ΅ΰΉ‰:
83
84
84 %{activation_url}
85 %{activation_url}
85
86
86 ΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ›ΰΈ΄ΰΈ”ΰΉƒΰΈŠΰΉ‰ΰΈ‡ΰΈ²ΰΈ™ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“
87 ΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ›ΰΈ΄ΰΈ”ΰΉƒΰΈŠΰΉ‰ΰΈ‡ΰΈ²ΰΈ™ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“
87
88
88 ΰΈ–ΰΉ‰ΰΈ²ΰΈ„ΰΈΈΰΈ“ΰΉ„ΰΈ‘ΰΉˆΰΉƒΰΈŠΰΉˆΰΈ„ΰΈ™ΰΈ—ΰΈ΅ΰΉˆΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ กรุณาΰΈ₯ΰΈ°ΰΈ—ΰΈ΄ΰΉ‰ΰΈ‡ e-mail ΰΈ‰ΰΈšΰΈ±ΰΈšΰΈ™ΰΈ΅ΰΉ‰
89 ΰΈ–ΰΉ‰ΰΈ²ΰΈ„ΰΈΈΰΈ“ΰΉ„ΰΈ‘ΰΉˆΰΉƒΰΈŠΰΉˆΰΈ„ΰΈ™ΰΈ—ΰΈ΅ΰΉˆΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ กรุณาΰΈ₯ΰΈ°ΰΈ—ΰΈ΄ΰΉ‰ΰΈ‡ e-mail ΰΈ‰ΰΈšΰΈ±ΰΈšΰΈ™ΰΈ΅ΰΉ‰
89 แΰΈ₯ΰΈ°ΰΉΰΈˆΰΉ‰ΰΈ‡ΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ”ΰΈ™ΰΈ΅ΰΉ‰ΰΈΰΈ±ΰΈš %{admin_email} ΰΈ”ΰΉ‰ΰΈ§ΰΈ’
90 แΰΈ₯ΰΈ°ΰΉΰΈˆΰΉ‰ΰΈ‡ΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ”ΰΈ™ΰΈ΅ΰΉ‰ΰΈΰΈ±ΰΈš %{admin_email} ΰΈ”ΰΉ‰ΰΈ§ΰΈ’
90
91
91 ΰΈ‚ΰΈ­ΰΈšΰΈ„ΰΈΈΰΈ“ΰΈ‘ΰΈ²ΰΈ!"
92 ΰΈ‚ΰΈ­ΰΈšΰΈ„ΰΈΈΰΈ“ΰΈ‘ΰΈ²ΰΈ!"
92
93
93 email_sent: "ΰΉ€ΰΈ£ΰΈ²ΰΉ„ΰΈ”ΰΉ‰ΰΈͺΰΉˆΰΈ‡ΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΈͺΰΈ³ΰΈ«ΰΈ£ΰΈ±ΰΈšΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΉ„ΰΈ›ΰΉƒΰΈ«ΰΉ‰ΰΈ„ΰΈΈΰΈ“ΰΉΰΈ₯ΰΉ‰ΰΈ§ (ΰΉ‚ΰΈ›ΰΈ£ΰΈ”ΰΈ­ΰΈ’ΰΉˆΰΈ²ΰΈ₯ΰΈ·ΰΈ‘ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈ”ΰΈΉΰΉƒΰΈ™ΰΈͺΰΉˆΰΈ§ΰΈ™ Junk mail ΰΈ”ΰΉ‰ΰΈ§ΰΈ’)"
94 email_sent: "ΰΉ€ΰΈ£ΰΈ²ΰΉ„ΰΈ”ΰΉ‰ΰΈͺΰΉˆΰΈ‡ΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΈͺΰΈ³ΰΈ«ΰΈ£ΰΈ±ΰΈšΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΉ„ΰΈ›ΰΉƒΰΈ«ΰΉ‰ΰΈ„ΰΈΈΰΈ“ΰΉΰΈ₯ΰΉ‰ΰΈ§ (ΰΉ‚ΰΈ›ΰΈ£ΰΈ”ΰΈ­ΰΈ’ΰΉˆΰΈ²ΰΈ₯ΰΈ·ΰΈ‘ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈ”ΰΈΉΰΉƒΰΈ™ΰΈͺΰΉˆΰΈ§ΰΈ™ Junk mail ΰΈ”ΰΉ‰ΰΈ§ΰΈ’)"
94 email_verify_at: "ΰΈΰΈ£ΰΈΈΰΈ“ΰΈ²ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈͺΰΈ­ΰΈšΰΈ—ΰΈ΅ΰΉˆ %{email} ΰΈžΰΈ£ΰΉ‰ΰΈ­ΰΈ‘ΰΈ—ΰΈ±ΰΉ‰ΰΈ‡ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™"
95 email_verify_at: "ΰΈΰΈ£ΰΈΈΰΈ“ΰΈ²ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈͺΰΈ­ΰΈšΰΈ—ΰΈ΅ΰΉˆ %{email} ΰΈžΰΈ£ΰΉ‰ΰΈ­ΰΈ‘ΰΈ—ΰΈ±ΰΉ‰ΰΈ‡ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™"
95
96
96 activation_sucessful_title: "ΰΈšΰΈ±ΰΈ“ΰΈŠΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΉ„ΰΈ”ΰΉ‰ΰΈ£ΰΈ±ΰΈšΰΈΰΈ²ΰΈ£ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΉΰΈ₯ΰΉ‰ΰΈ§"
97 activation_sucessful_title: "ΰΈšΰΈ±ΰΈ“ΰΈŠΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΉ„ΰΈ”ΰΉ‰ΰΈ£ΰΈ±ΰΈšΰΈΰΈ²ΰΈ£ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΉΰΈ₯ΰΉ‰ΰΈ§"
97 account_activated: "ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“ΰΈžΰΈ£ΰΉ‰ΰΈ­ΰΈ‘ΰΉƒΰΈŠΰΉ‰ΰΈ‡ΰΈ²ΰΈ™ΰΉΰΈ₯ΰΉ‰ΰΈ§"
98 account_activated: "ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“ΰΈžΰΈ£ΰΉ‰ΰΈ­ΰΈ‘ΰΉƒΰΈŠΰΉ‰ΰΈ‡ΰΈ²ΰΈ™ΰΉΰΈ₯ΰΉ‰ΰΈ§"
98
99
99 activation_failed_title: "การฒืนฒันΰΈ₯ΰΉ‰ΰΈ‘ΰΉ€ΰΈ«ΰΈ₯ΰΈ§"
100 activation_failed_title: "การฒืนฒันΰΈ₯ΰΉ‰ΰΈ‘ΰΉ€ΰΈ«ΰΈ₯ΰΈ§"
100
101
101 errors:
102 errors:
102 header: 'การΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ΰΈ‘ΰΈ΅ΰΈ‚ΰΉ‰ΰΈ­ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ”'
103 header: 'การΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ΰΈ‘ΰΈ΅ΰΈ‚ΰΉ‰ΰΈ­ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ”'
103 email:
104 email:
104 title: "ΰΉ€ΰΈΰΈ΄ΰΈ”ΰΈ›ΰΈ±ΰΈΰΈ«ΰΈ²ΰΈ£ΰΈ°ΰΈ«ΰΈ§ΰΉˆΰΈ²ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΈͺΰΉˆΰΈ‡ e-mail ΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈΰΈ²ΰΈ£ΰΈͺΰΈ‘ΰΈ±ΰΈ„ΰΈ£"
105 title: "ΰΉ€ΰΈΰΈ΄ΰΈ”ΰΈ›ΰΈ±ΰΈΰΈ«ΰΈ²ΰΈ£ΰΈ°ΰΈ«ΰΈ§ΰΉˆΰΈ²ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΈͺΰΉˆΰΈ‡ e-mail ΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈΰΈ²ΰΈ£ΰΈͺΰΈ‘ΰΈ±ΰΈ„ΰΈ£"
105 expl: "<h2>ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“ΰΈ–ΰΈΉΰΈΰΈͺร้างขย้นแΰΈ₯ΰΉ‰ΰΈ§ ΰΉΰΈ•ΰΉˆΰΈ£ΰΈ°ΰΈšΰΈšΰΉ„ΰΈ‘ΰΉˆΰΈͺΰΈ²ΰΈ‘ΰΈ²ΰΈ£ΰΈ–ΰΈͺΰΉˆΰΈ‡ e-mail ΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈΰΈ²ΰΈ£ΰΈͺΰΈ‘ΰΈ±ΰΈ„ΰΈ£ΰΉ„ΰΈ”ΰΉ‰</h2>
106 expl: "<h2>ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“ΰΈ–ΰΈΉΰΈΰΈͺร้างขย้นแΰΈ₯ΰΉ‰ΰΈ§ ΰΉΰΈ•ΰΉˆΰΈ£ΰΈ°ΰΈšΰΈšΰΉ„ΰΈ‘ΰΉˆΰΈͺΰΈ²ΰΈ‘ΰΈ²ΰΈ£ΰΈ–ΰΈͺΰΉˆΰΈ‡ e-mail ΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈΰΈ²ΰΈ£ΰΈͺΰΈ‘ΰΈ±ΰΈ„ΰΈ£ΰΉ„ΰΈ”ΰΉ‰</h2>
106 ΰΈ­ΰΈ²ΰΈˆΰΉ€ΰΈΰΈ΄ΰΈ”ΰΈ›ΰΈ±ΰΈΰΈ«ΰΈ²ΰΉƒΰΈ™ΰΈΰΈ²ΰΈ£ΰΈ•ΰΈ±ΰΉ‰ΰΈ‡ΰΈ„ΰΉˆΰΈ²ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ΰΈ•ΰΉ‰ΰΈ™ΰΈ‚ΰΈ­ΰΈ‡ΰΈ£ΰΈ°ΰΈšΰΈš ΰΈΰΈ£ΰΈΈΰΈ“ΰΈ²ΰΈŠΰΉˆΰΈ§ΰΈ’ΰΈ•ΰΈ΄ΰΈ”ΰΈ•ΰΉˆΰΈ­ΰΈœΰΈΉΰΉ‰ΰΈ”ΰΈΉΰΉΰΈ₯ΰΈ£ΰΈ°ΰΈšΰΈšΰΈ”ΰΉ‰ΰΈ§ΰΈ’ΰΈ—ΰΈ΅ΰΉˆ %{email}<br/>ΰΈ‚ΰΈ­ΰΈ‚ΰΈ­ΰΈšΰΈ„ΰΈΈΰΈ“ΰΈˆΰΈ²ΰΈΰΈ—ΰΈ΅ΰΈ‘ΰΈ‡ΰΈ²ΰΈ™"
107 ΰΈ­ΰΈ²ΰΈˆΰΉ€ΰΈΰΈ΄ΰΈ”ΰΈ›ΰΈ±ΰΈΰΈ«ΰΈ²ΰΉƒΰΈ™ΰΈΰΈ²ΰΈ£ΰΈ•ΰΈ±ΰΉ‰ΰΈ‡ΰΈ„ΰΉˆΰΈ²ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ΰΈ•ΰΉ‰ΰΈ™ΰΈ‚ΰΈ­ΰΈ‡ΰΈ£ΰΈ°ΰΈšΰΈš ΰΈΰΈ£ΰΈΈΰΈ“ΰΈ²ΰΈŠΰΉˆΰΈ§ΰΈ’ΰΈ•ΰΈ΄ΰΈ”ΰΈ•ΰΉˆΰΈ­ΰΈœΰΈΉΰΉ‰ΰΈ”ΰΈΉΰΉΰΈ₯ΰΈ£ΰΈ°ΰΈšΰΈšΰΈ”ΰΉ‰ΰΈ§ΰΈ’ΰΈ—ΰΈ΅ΰΉˆ %{email}<br/>ΰΈ‚ΰΈ­ΰΈ‚ΰΈ­ΰΈšΰΈ„ΰΈΈΰΈ“ΰΈˆΰΈ²ΰΈΰΈ—ΰΈ΅ΰΈ‘ΰΈ‡ΰΈ²ΰΈ™"
107 activation:
108 activation:
108 email_exists: "ΰΈ‘ΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΈ—ΰΈ΅ΰΉˆΰΉƒΰΈŠΰΉ‰ e-mail นม้แΰΈ₯ΰΉ‰ΰΈ§"
109 email_exists: "ΰΈ‘ΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΈ—ΰΈ΅ΰΉˆΰΉƒΰΈŠΰΉ‰ e-mail นม้แΰΈ₯ΰΉ‰ΰΈ§"
109 invalid: "ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈͺΰΈ³ΰΈ«ΰΈ£ΰΈ±ΰΈšΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ” ΰΈΰΈ£ΰΈΈΰΈ“ΰΈ²ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈͺΰΈ­ΰΈšΰΈ­ΰΈ΅ΰΈΰΈ„ΰΈ£ΰΈ±ΰΉ‰ΰΈ‡"
110 invalid: "ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈͺΰΈ³ΰΈ«ΰΈ£ΰΈ±ΰΈšΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ” ΰΈΰΈ£ΰΈΈΰΈ“ΰΈ²ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈͺΰΈ­ΰΈšΰΈ­ΰΈ΅ΰΈΰΈ„ΰΈ£ΰΈ±ΰΉ‰ΰΈ‡"
110
111
111 password_retrieval:
112 password_retrieval:
112 header: "การขอรหัΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™ΰΉƒΰΈ«ΰΈ‘ΰΉˆ"
113 header: "การขอรหัΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™ΰΉƒΰΈ«ΰΈ‘ΰΉˆ"
113 instructions: "กรุณากรอก e-mail ΰΈ—ΰΈ΅ΰΉˆΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™"
114 instructions: "กรุณากรอก e-mail ΰΈ—ΰΈ΅ΰΉˆΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™"
114 button_label: "ΰΈ‚ΰΈ­ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™ΰΉƒΰΈ«ΰΈ‘ΰΉˆ"
115 button_label: "ΰΈ‚ΰΈ­ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™ΰΉƒΰΈ«ΰΈ‘ΰΉˆ"
115 no_email: "ΰΉ„ΰΈ‘ΰΉˆΰΈ‘ΰΈ΅ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΈ—ΰΈ΅ΰΉˆΰΉƒΰΈŠΰΉ‰ e-mail ดังกΰΈ₯่าว"
116 no_email: "ΰΉ„ΰΈ‘ΰΉˆΰΈ‘ΰΈ΅ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΈ—ΰΈ΅ΰΉˆΰΉƒΰΈŠΰΉ‰ e-mail ดังกΰΈ₯่าว"
116 email_body: "ΰΈͺΰΈ§ΰΈ±ΰΈͺΰΈ”ΰΈ΅ΰΈ„ΰΈ£ΰΈ±ΰΈš %{full_name},
117 email_body: "ΰΈͺΰΈ§ΰΈ±ΰΈͺΰΈ”ΰΈ΅ΰΈ„ΰΈ£ΰΈ±ΰΈš %{full_name},
117
118
118 ΰΈ„ΰΈΈΰΈ“ΰΉ„ΰΈ”ΰΉ‰ΰΈ£ΰΉ‰ΰΈ­ΰΈ‡ΰΈ‚ΰΈ­ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™ΰΉƒΰΈ«ΰΈ‘ΰΉˆ ΰΈͺΰΈ³ΰΈ«ΰΈ£ΰΈ±ΰΈšΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ %{contest_name} ΰΈ‹ΰΈΆΰΉˆΰΈ‡ΰΉ€ΰΈ£ΰΈ²ΰΉ„ΰΈ”ΰΉ‰ΰΈͺร้างให้คุณแΰΈ₯ΰΉ‰ΰΈ§ ΰΈ”ΰΈ±ΰΈ‡ΰΈ™ΰΈ΅ΰΉ‰
119 ΰΈ„ΰΈΈΰΈ“ΰΉ„ΰΈ”ΰΉ‰ΰΈ£ΰΉ‰ΰΈ­ΰΈ‡ΰΈ‚ΰΈ­ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™ΰΉƒΰΈ«ΰΈ‘ΰΉˆ ΰΈͺΰΈ³ΰΈ«ΰΈ£ΰΈ±ΰΈšΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ %{contest_name} ΰΈ‹ΰΈΆΰΉˆΰΈ‡ΰΉ€ΰΈ£ΰΈ²ΰΉ„ΰΈ”ΰΉ‰ΰΈͺร้างให้คุณแΰΈ₯ΰΉ‰ΰΈ§ ΰΈ”ΰΈ±ΰΈ‡ΰΈ™ΰΈ΅ΰΉ‰
@@ -1,209 +1,216
1 CONFIGURATIONS =
1 CONFIGURATIONS =
2 [
2 [
3 {
3 {
4 :key => 'system.single_user_mode',
4 :key => 'system.single_user_mode',
5 :value_type => 'boolean',
5 :value_type => 'boolean',
6 :default_value => 'false',
6 :default_value => 'false',
7 :description => 'Only admins can log in to the system when running under single user mode.'
7 :description => 'Only admins can log in to the system when running under single user mode.'
8 },
8 },
9 -
9 +
10 {
10 {
11 :key => 'ui.front.title',
11 :key => 'ui.front.title',
12 :value_type => 'string',
12 :value_type => 'string',
13 :default_value => 'Grader'
13 :default_value => 'Grader'
14 },
14 },
15 -
15 +
16 {
16 {
17 :key => 'ui.front.welcome_message',
17 :key => 'ui.front.welcome_message',
18 :value_type => 'string',
18 :value_type => 'string',
19 :default_value => 'Welcome!'
19 :default_value => 'Welcome!'
20 },
20 },
21 -
21 +
22 {
22 {
23 :key => 'ui.show_score',
23 :key => 'ui.show_score',
24 :value_type => 'boolean',
24 :value_type => 'boolean',
25 :default_value => 'true'
25 :default_value => 'true'
26 },
26 },
27 -
27 +
28 {
28 {
29 :key => 'contest.time_limit',
29 :key => 'contest.time_limit',
30 :value_type => 'string',
30 :value_type => 'string',
31 :default_value => 'unlimited',
31 :default_value => 'unlimited',
32 :description => 'Time limit in format hh:mm, or "unlimited" for contests with no time limits. This config is CACHED. Restart the server before the change can take effect.'
32 :description => 'Time limit in format hh:mm, or "unlimited" for contests with no time limits. This config is CACHED. Restart the server before the change can take effect.'
33 },
33 },
34 -
34 +
35 {
35 {
36 :key => 'system.mode',
36 :key => 'system.mode',
37 :value_type => 'string',
37 :value_type => 'string',
38 :default_value => 'standard',
38 :default_value => 'standard',
39 :description => 'Current modes are "standard", "contest", "indv-contest", and "analysis".'
39 :description => 'Current modes are "standard", "contest", "indv-contest", and "analysis".'
40 },
40 },
41 -
41 +
42 {
42 {
43 :key => 'contest.name',
43 :key => 'contest.name',
44 :value_type => 'string',
44 :value_type => 'string',
45 :default_value => 'Grader',
45 :default_value => 'Grader',
46 :description => 'This name will be shown on the user header bar.'
46 :description => 'This name will be shown on the user header bar.'
47 },
47 },
48 -
48 +
49 {
49 {
50 :key => 'contest.multisites',
50 :key => 'contest.multisites',
51 :value_type => 'boolean',
51 :value_type => 'boolean',
52 :default_value => 'false',
52 :default_value => 'false',
53 :description => 'If the server is in contest mode and this option is true, on the log in of the admin a menu for site selections is shown.'
53 :description => 'If the server is in contest mode and this option is true, on the log in of the admin a menu for site selections is shown.'
54 },
54 },
55 -
55 +
56 {
56 {
57 - :key => 'system.online_registration',
57 + :key => 'system.hall_of_fame_available',
58 :value_type => 'boolean',
58 :value_type => 'boolean',
59 :default_value => 'false',
59 :default_value => 'false',
60 - :description => 'This option enables online registration.'
60 + :description => 'If true, any user can access hall of fame page.'
61 },
61 },
62 -
62 +
63 # If Configuration['system.online_registration'] is true, the
63 # If Configuration['system.online_registration'] is true, the
64 # system allows online registration, and will use these
64 # system allows online registration, and will use these
65 # information for sending confirmation emails.
65 # information for sending confirmation emails.
66 {
66 {
67 :key => 'system.online_registration.smtp',
67 :key => 'system.online_registration.smtp',
68 :value_type => 'string',
68 :value_type => 'string',
69 :default_value => 'smtp.somehost.com'
69 :default_value => 'smtp.somehost.com'
70 },
70 },
71 -
71 +
72 {
72 {
73 :key => 'system.online_registration.from',
73 :key => 'system.online_registration.from',
74 :value_type => 'string',
74 :value_type => 'string',
75 :default_value => 'your.email@address'
75 :default_value => 'your.email@address'
76 },
76 },
77 -
77 +
78 {
78 {
79 :key => 'system.admin_email',
79 :key => 'system.admin_email',
80 :value_type => 'string',
80 :value_type => 'string',
81 :default_value => 'admin@admin.email'
81 :default_value => 'admin@admin.email'
82 },
82 },
83 -
83 +
84 {
84 {
85 :key => 'system.user_setting_enabled',
85 :key => 'system.user_setting_enabled',
86 :value_type => 'boolean',
86 :value_type => 'boolean',
87 :default_value => 'true',
87 :default_value => 'true',
88 :description => 'If this option is true, users can change their settings'
88 :description => 'If this option is true, users can change their settings'
89 },
89 },
90 -
90 +
91 + {
92 + :key => 'system.user_setting_enabled',
93 + :value_type => 'boolean',
94 + :default_value => 'true',
95 + :description => 'If this option is true, users can change their settings'
96 + }
97 +
91 # If Configuration['contest.test_request.early_timeout'] is true
98 # If Configuration['contest.test_request.early_timeout'] is true
92 # the user will not be able to use test request at 30 minutes
99 # the user will not be able to use test request at 30 minutes
93 # before the contest ends.
100 # before the contest ends.
94 {
101 {
95 :key => 'contest.test_request.early_timeout',
102 :key => 'contest.test_request.early_timeout',
96 :value_type => 'boolean',
103 :value_type => 'boolean',
97 :default_value => 'false'
104 :default_value => 'false'
98 },
105 },
99
106
100 {
107 {
101 :key => 'system.multicontests',
108 :key => 'system.multicontests',
102 :value_type => 'boolean',
109 :value_type => 'boolean',
103 :default_value => 'false'
110 :default_value => 'false'
104 },
111 },
105
112
106 {
113 {
107 :key => 'contest.confirm_indv_contest_start',
114 :key => 'contest.confirm_indv_contest_start',
108 :value_type => 'boolean',
115 :value_type => 'boolean',
109 :default_value => 'false'
116 :default_value => 'false'
110 },
117 },
111
118
112 {
119 {
113 :key => 'contest.default_contest_name',
120 :key => 'contest.default_contest_name',
114 :value_type => 'string',
121 :value_type => 'string',
115 :default_value => 'none',
122 :default_value => 'none',
116 :description => "New user will be assigned to this contest automatically, if it exists. Set to 'none' if there is no default contest."
123 :description => "New user will be assigned to this contest automatically, if it exists. Set to 'none' if there is no default contest."
117 }
124 }
118 -
125 +
119 ]
126 ]
120
127
121
128
122 def create_configuration_key(key,
129 def create_configuration_key(key,
123 value_type,
130 value_type,
124 default_value,
131 default_value,
125 description='')
132 description='')
126 conf = (GraderConfiguration.find_by_key(key) ||
133 conf = (GraderConfiguration.find_by_key(key) ||
127 GraderConfiguration.new(:key => key,
134 GraderConfiguration.new(:key => key,
128 :value_type => value_type,
135 :value_type => value_type,
129 :value => default_value))
136 :value => default_value))
130 conf.description = description
137 conf.description = description
131 conf.save
138 conf.save
132 end
139 end
133
140
134 def seed_config
141 def seed_config
135 CONFIGURATIONS.each do |conf|
142 CONFIGURATIONS.each do |conf|
136 if conf.has_key? :description
143 if conf.has_key? :description
137 desc = conf[:description]
144 desc = conf[:description]
138 else
145 else
139 desc = ''
146 desc = ''
140 end
147 end
141 create_configuration_key(conf[:key],
148 create_configuration_key(conf[:key],
142 conf[:value_type],
149 conf[:value_type],
143 conf[:default_value],
150 conf[:default_value],
144 desc)
151 desc)
145 end
152 end
146 end
153 end
147
154
148 def seed_roles
155 def seed_roles
149 return if Role.find_by_name('admin')
156 return if Role.find_by_name('admin')
150
157
151 role = Role.create(:name => 'admin')
158 role = Role.create(:name => 'admin')
152 user_admin_right = Right.create(:name => 'user_admin',
159 user_admin_right = Right.create(:name => 'user_admin',
153 :controller => 'user_admin',
160 :controller => 'user_admin',
154 :action => 'all')
161 :action => 'all')
155 problem_admin_right = Right.create(:name=> 'problem_admin',
162 problem_admin_right = Right.create(:name=> 'problem_admin',
156 :controller => 'problems',
163 :controller => 'problems',
157 :action => 'all')
164 :action => 'all')
158
165
159 graders_right = Right.create(:name => 'graders_admin',
166 graders_right = Right.create(:name => 'graders_admin',
160 :controller => 'graders',
167 :controller => 'graders',
161 :action => 'all')
168 :action => 'all')
162
169
163 role.rights << user_admin_right;
170 role.rights << user_admin_right;
164 role.rights << problem_admin_right;
171 role.rights << problem_admin_right;
165 role.rights << graders_right;
172 role.rights << graders_right;
166 role.save
173 role.save
167 end
174 end
168
175
169 def seed_root
176 def seed_root
170 return if User.find_by_login('root')
177 return if User.find_by_login('root')
171
178
172 root = User.new(:login => 'root',
179 root = User.new(:login => 'root',
173 :full_name => 'Administrator',
180 :full_name => 'Administrator',
174 :alias => 'root')
181 :alias => 'root')
175 root.password = 'ioionrails';
182 root.password = 'ioionrails';
176
183
177 class << root
184 class << root
178 public :encrypt_new_password
185 public :encrypt_new_password
179 def valid?(context=nil)
186 def valid?(context=nil)
180 true
187 true
181 end
188 end
182 end
189 end
183
190
184 root.encrypt_new_password
191 root.encrypt_new_password
185
192
186 root.roles << Role.find_by_name('admin')
193 root.roles << Role.find_by_name('admin')
187
194
188 root.activated = true
195 root.activated = true
189 root.save
196 root.save
190 end
197 end
191
198
192 def seed_users_and_roles
199 def seed_users_and_roles
193 seed_roles
200 seed_roles
194 seed_root
201 seed_root
195 end
202 end
196
203
197 def seed_more_languages
204 def seed_more_languages
198 Language.delete_all
205 Language.delete_all
199 Language.create( name: 'c', pretty_name: 'C', ext: 'c', common_ext: 'c' )
206 Language.create( name: 'c', pretty_name: 'C', ext: 'c', common_ext: 'c' )
200 Language.create( name: 'cpp', pretty_name: 'C++', ext: 'cpp', common_ext: 'cpp,cc' )
207 Language.create( name: 'cpp', pretty_name: 'C++', ext: 'cpp', common_ext: 'cpp,cc' )
201 Language.create( name: 'pas', pretty_name: 'Pascal', ext: 'pas', common_ext: 'pas' )
208 Language.create( name: 'pas', pretty_name: 'Pascal', ext: 'pas', common_ext: 'pas' )
202 Language.create( name: 'ruby', pretty_name: 'Ruby', ext: 'rb', common_ext: 'rb' )
209 Language.create( name: 'ruby', pretty_name: 'Ruby', ext: 'rb', common_ext: 'rb' )
203 Language.create( name: 'python', pretty_name: 'Python', ext: 'py', common_ext: 'py' )
210 Language.create( name: 'python', pretty_name: 'Python', ext: 'py', common_ext: 'py' )
204 Language.create( name: 'java', pretty_name: 'Java', ext: 'java', common_ext: 'java' )
211 Language.create( name: 'java', pretty_name: 'Java', ext: 'java', common_ext: 'java' )
205 end
212 end
206
213
207 seed_config
214 seed_config
208 seed_users_and_roles
215 seed_users_and_roles
209 seed_more_languages
216 seed_more_languages
You need to be logged in to leave comments. Login now