##// END OF EJS Templates
* Referencing issues in commit messages: enter * in 'Referencing keywords' to link any issue id without using keywords....
Jean-Philippe Lang -
r905:99f9aea80a2b
parent child
Show More
@@ -0,0 +1,42
1 # redMine - project management software
2 # Copyright (C) 2006-2007 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 require File.dirname(__FILE__) + '/../test_helper'
19
20 class ChangesetTest < Test::Unit::TestCase
21 fixtures :projects, :repositories, :issues, :issue_statuses, :changesets, :changes, :issue_categories, :enumerations, :custom_fields, :custom_values, :users, :members, :trackers
22
23 def setup
24 end
25
26 def test_ref_keywords_any
27 Setting.commit_fix_status_id = IssueStatus.find(:first, :conditions => ["is_closed = ?", true]).id
28 Setting.commit_fix_done_ratio = '90'
29 Setting.commit_ref_keywords = '*'
30 Setting.commit_fix_keywords = 'fixes , closes'
31
32 c = Changeset.new(:repository => Project.find(1).repository,
33 :committed_on => Time.now,
34 :comments => 'New commit (#2). Fixes #1')
35 c.scan_comment_for_issue_ids
36
37 assert_equal [1, 2], c.issue_ids.sort
38 fixed = Issue.find(1)
39 assert fixed.closed?
40 assert_equal 90, fixed.done_ratio
41 end
42 end
@@ -1,403 +1,403
1 1 # redMine - project management software
2 2 # Copyright (C) 2006-2007 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 module ApplicationHelper
19 19 include Redmine::WikiFormatting::Macros::Definitions
20 20
21 21 def current_role
22 22 @current_role ||= User.current.role_for_project(@project)
23 23 end
24 24
25 25 # Return true if user is authorized for controller/action, otherwise false
26 26 def authorize_for(controller, action)
27 27 User.current.allowed_to?({:controller => controller, :action => action}, @project)
28 28 end
29 29
30 30 # Display a link if user is authorized
31 31 def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference)
32 32 link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller] || params[:controller], options[:action])
33 33 end
34 34
35 35 # Display a link to user's account page
36 36 def link_to_user(user)
37 37 link_to user.name, :controller => 'account', :action => 'show', :id => user
38 38 end
39 39
40 40 def link_to_issue(issue)
41 41 link_to "#{issue.tracker.name} ##{issue.id}", :controller => "issues", :action => "show", :id => issue
42 42 end
43 43
44 44 def toggle_link(name, id, options={})
45 45 onclick = "Element.toggle('#{id}'); "
46 46 onclick << (options[:focus] ? "Form.Element.focus('#{options[:focus]}'); " : "this.blur(); ")
47 47 onclick << "return false;"
48 48 link_to(name, "#", :onclick => onclick)
49 49 end
50 50
51 51 def show_and_goto_link(name, id, options={})
52 52 onclick = "Element.show('#{id}'); "
53 53 onclick << (options[:focus] ? "Form.Element.focus('#{options[:focus]}'); " : "this.blur(); ")
54 54 onclick << "location.href='##{id}-anchor'; "
55 55 onclick << "return false;"
56 56 link_to(name, "#", options.merge(:onclick => onclick))
57 57 end
58 58
59 59 def image_to_function(name, function, html_options = {})
60 60 html_options.symbolize_keys!
61 61 tag(:input, html_options.merge({
62 62 :type => "image", :src => image_path(name),
63 63 :onclick => (html_options[:onclick] ? "#{html_options[:onclick]}; " : "") + "#{function};"
64 64 }))
65 65 end
66 66
67 67 def prompt_to_remote(name, text, param, url, html_options = {})
68 68 html_options[:onclick] = "promptToRemote('#{text}', '#{param}', '#{url_for(url)}'); return false;"
69 69 link_to name, {}, html_options
70 70 end
71 71
72 72 def format_date(date)
73 73 return nil unless date
74 74 # "Setting.date_format.size < 2" is a temporary fix (content of date_format setting changed)
75 75 @date_format ||= (Setting.date_format.blank? || Setting.date_format.size < 2 ? l(:general_fmt_date) : Setting.date_format)
76 76 date.strftime(@date_format)
77 77 end
78 78
79 79 def format_time(time, include_date = true)
80 80 return nil unless time
81 81 time = time.to_time if time.is_a?(String)
82 82 zone = User.current.time_zone
83 83 if time.utc?
84 84 local = zone ? zone.adjust(time) : time.getlocal
85 85 else
86 86 local = zone ? zone.adjust(time.getutc) : time
87 87 end
88 88 @date_format ||= (Setting.date_format.blank? || Setting.date_format.size < 2 ? l(:general_fmt_date) : Setting.date_format)
89 89 @time_format ||= (Setting.time_format.blank? ? l(:general_fmt_time) : Setting.time_format)
90 90 include_date ? local.strftime("#{@date_format} #{@time_format}") : local.strftime(@time_format)
91 91 end
92 92
93 93 def authoring(created, author)
94 94 time_tag = content_tag('acronym', distance_of_time_in_words(Time.now, created), :title => format_time(created))
95 95 l(:label_added_time_by, author.name, time_tag)
96 96 end
97 97
98 98 def day_name(day)
99 99 l(:general_day_names).split(',')[day-1]
100 100 end
101 101
102 102 def month_name(month)
103 103 l(:actionview_datehelper_select_month_names).split(',')[month-1]
104 104 end
105 105
106 106 def pagination_links_full(paginator, options={}, html_options={})
107 107 page_param = options.delete(:page_param) || :page
108 108
109 109 html = ''
110 110 html << link_to_remote(('&#171; ' + l(:label_previous)),
111 111 {:update => "content", :url => options.merge(page_param => paginator.current.previous)},
112 112 {:href => url_for(:params => options.merge(page_param => paginator.current.previous))}) + ' ' if paginator.current.previous
113 113
114 114 html << (pagination_links_each(paginator, options) do |n|
115 115 link_to_remote(n.to_s,
116 116 {:url => {:params => options.merge(page_param => n)}, :update => 'content'},
117 117 {:href => url_for(:params => options.merge(page_param => n))})
118 118 end || '')
119 119
120 120 html << ' ' + link_to_remote((l(:label_next) + ' &#187;'),
121 121 {:update => "content", :url => options.merge(page_param => paginator.current.next)},
122 122 {:href => url_for(:params => options.merge(page_param => paginator.current.next))}) if paginator.current.next
123 123 html
124 124 end
125 125
126 126 def set_html_title(text)
127 127 @html_header_title = text
128 128 end
129 129
130 130 def html_title
131 131 title = []
132 132 title << @project.name if @project
133 133 title << @html_header_title
134 134 title << Setting.app_title
135 135 title.compact.join(' - ')
136 136 end
137 137
138 138 ACCESSKEYS = {:edit => 'e',
139 139 :preview => 'r',
140 140 :quick_search => 'f',
141 141 :search => '4',
142 142 }.freeze unless const_defined?(:ACCESSKEYS)
143 143
144 144 def accesskey(s)
145 145 ACCESSKEYS[s]
146 146 end
147 147
148 148 # Formats text according to system settings.
149 149 # 2 ways to call this method:
150 150 # * with a String: textilizable(text, options)
151 151 # * with an object and one of its attribute: textilizable(issue, :description, options)
152 152 def textilizable(*args)
153 153 options = args.last.is_a?(Hash) ? args.pop : {}
154 154 case args.size
155 155 when 1
156 156 obj = nil
157 157 text = args.shift || ''
158 158 when 2
159 159 obj = args.shift
160 160 text = obj.send(args.shift)
161 161 else
162 162 raise ArgumentError, 'invalid arguments to textilizable'
163 163 end
164 164
165 165 # when using an image link, try to use an attachment, if possible
166 166 attachments = options[:attachments]
167 167 if attachments
168 168 text = text.gsub(/!([<>=]*)(\S+\.(gif|jpg|jpeg|png))!/) do |m|
169 169 align = $1
170 170 filename = $2
171 171 rf = Regexp.new(filename, Regexp::IGNORECASE)
172 172 # search for the picture in attachments
173 173 if found = attachments.detect { |att| att.filename =~ rf }
174 174 image_url = url_for :controller => 'attachments', :action => 'download', :id => found.id
175 175 "!#{align}#{image_url}!"
176 176 else
177 177 "!#{align}#{filename}!"
178 178 end
179 179 end
180 180 end
181 181
182 182 text = (Setting.text_formatting == 'textile') ?
183 183 Redmine::WikiFormatting.to_html(text) { |macro, args| exec_macro(macro, obj, args) } :
184 184 simple_format(auto_link(h(text)))
185 185
186 186 # different methods for formatting wiki links
187 187 case options[:wiki_links]
188 188 when :local
189 189 # used for local links to html files
190 190 format_wiki_link = Proc.new {|project, title| "#{title}.html" }
191 191 when :anchor
192 192 # used for single-file wiki export
193 193 format_wiki_link = Proc.new {|project, title| "##{title}" }
194 194 else
195 195 format_wiki_link = Proc.new {|project, title| url_for :controller => 'wiki', :action => 'index', :id => project, :page => title }
196 196 end
197 197
198 198 project = options[:project] || @project
199 199
200 200 # turn wiki links into html links
201 201 # example:
202 202 # [[mypage]]
203 203 # [[mypage|mytext]]
204 204 # wiki links can refer other project wikis, using project name or identifier:
205 205 # [[project:]] -> wiki starting page
206 206 # [[project:|mytext]]
207 207 # [[project:mypage]]
208 208 # [[project:mypage|mytext]]
209 209 text = text.gsub(/\[\[([^\]\|]+)(\|([^\]\|]+))?\]\]/) do |m|
210 210 link_project = project
211 211 page = $1
212 212 title = $3
213 213 if page =~ /^([^\:]+)\:(.*)$/
214 214 link_project = Project.find_by_name($1) || Project.find_by_identifier($1)
215 215 page = title || $2
216 216 title = $1 if page.blank?
217 217 end
218 218
219 219 if link_project && link_project.wiki
220 220 # check if page exists
221 221 wiki_page = link_project.wiki.find_page(page)
222 222 link_to((title || page), format_wiki_link.call(link_project, Wiki.titleize(page)),
223 223 :class => ('wiki-page' + (wiki_page ? '' : ' new')))
224 224 else
225 225 # project or wiki doesn't exist
226 226 title || page
227 227 end
228 228 end
229 229
230 230 # turn issue and revision ids into links
231 231 # example:
232 232 # #52 -> <a href="/issues/show/52">#52</a>
233 233 # r52 -> <a href="/repositories/revision/6?rev=52">r52</a> (project.id is 6)
234 text = text.gsub(%r{([\s,-^])(#|r)(\d+)(?=[[:punct:]]|\s|<|$)}) do |m|
234 text = text.gsub(%r{([\s\(,-^])(#|r)(\d+)(?=[[:punct:]]|\s|<|$)}) do |m|
235 235 leading, otype, oid = $1, $2, $3
236 236 link = nil
237 237 if otype == 'r'
238 238 if project && (changeset = project.changesets.find_by_revision(oid))
239 239 link = link_to("r#{oid}", {:controller => 'repositories', :action => 'revision', :id => project.id, :rev => oid}, :class => 'changeset',
240 240 :title => truncate(changeset.comments, 100))
241 241 end
242 242 else
243 243 if issue = Issue.find_by_id(oid.to_i, :include => [:project, :status], :conditions => Project.visible_by(User.current))
244 244 link = link_to("##{oid}", {:controller => 'issues', :action => 'show', :id => oid}, :class => 'issue',
245 245 :title => "#{truncate(issue.subject, 100)} (#{issue.status.name})")
246 246 link = content_tag('del', link) if issue.closed?
247 247 end
248 248 end
249 249 leading + (link || "#{otype}#{oid}")
250 250 end
251 251
252 252 text
253 253 end
254 254
255 255 # Same as Rails' simple_format helper without using paragraphs
256 256 def simple_format_without_paragraph(text)
257 257 text.to_s.
258 258 gsub(/\r\n?/, "\n"). # \r\n and \r -> \n
259 259 gsub(/\n\n+/, "<br /><br />"). # 2+ newline -> 2 br
260 260 gsub(/([^\n]\n)(?=[^\n])/, '\1<br />') # 1 newline -> br
261 261 end
262 262
263 263 def error_messages_for(object_name, options = {})
264 264 options = options.symbolize_keys
265 265 object = instance_variable_get("@#{object_name}")
266 266 if object && !object.errors.empty?
267 267 # build full_messages here with controller current language
268 268 full_messages = []
269 269 object.errors.each do |attr, msg|
270 270 next if msg.nil?
271 271 msg = msg.first if msg.is_a? Array
272 272 if attr == "base"
273 273 full_messages << l(msg)
274 274 else
275 275 full_messages << "&#171; " + (l_has_string?("field_" + attr) ? l("field_" + attr) : object.class.human_attribute_name(attr)) + " &#187; " + l(msg) unless attr == "custom_values"
276 276 end
277 277 end
278 278 # retrieve custom values error messages
279 279 if object.errors[:custom_values]
280 280 object.custom_values.each do |v|
281 281 v.errors.each do |attr, msg|
282 282 next if msg.nil?
283 283 msg = msg.first if msg.is_a? Array
284 284 full_messages << "&#171; " + v.custom_field.name + " &#187; " + l(msg)
285 285 end
286 286 end
287 287 end
288 288 content_tag("div",
289 289 content_tag(
290 290 options[:header_tag] || "span", lwr(:gui_validation_error, full_messages.length) + ":"
291 291 ) +
292 292 content_tag("ul", full_messages.collect { |msg| content_tag("li", msg) }),
293 293 "id" => options[:id] || "errorExplanation", "class" => options[:class] || "errorExplanation"
294 294 )
295 295 else
296 296 ""
297 297 end
298 298 end
299 299
300 300 def lang_options_for_select(blank=true)
301 301 (blank ? [["(auto)", ""]] : []) +
302 302 GLoc.valid_languages.collect{|lang| [ ll(lang.to_s, :general_lang_name), lang.to_s]}.sort{|x,y| x.first <=> y.first }
303 303 end
304 304
305 305 def label_tag_for(name, option_tags = nil, options = {})
306 306 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
307 307 content_tag("label", label_text)
308 308 end
309 309
310 310 def labelled_tabular_form_for(name, object, options, &proc)
311 311 options[:html] ||= {}
312 312 options[:html].store :class, "tabular"
313 313 form_for(name, object, options.merge({ :builder => TabularFormBuilder, :lang => current_language}), &proc)
314 314 end
315 315
316 316 def check_all_links(form_name)
317 317 link_to_function(l(:button_check_all), "checkAll('#{form_name}', true)") +
318 318 " | " +
319 319 link_to_function(l(:button_uncheck_all), "checkAll('#{form_name}', false)")
320 320 end
321 321
322 322 def progress_bar(pct, options={})
323 323 width = options[:width] || '100px;'
324 324 legend = options[:legend] || ''
325 325 content_tag('table',
326 326 content_tag('tr',
327 327 (pct > 0 ? content_tag('td', '', :width => "#{pct.floor}%;", :class => 'closed') : '') +
328 328 (pct < 100 ? content_tag('td', '', :width => "#{100-pct.floor}%;", :class => 'open') : '')
329 329 ), :class => 'progress', :style => "width: #{width};") +
330 330 content_tag('p', legend, :class => 'pourcent')
331 331 end
332 332
333 333 def context_menu_link(name, url, options={})
334 334 options[:class] ||= ''
335 335 if options.delete(:selected)
336 336 options[:class] << ' icon-checked disabled'
337 337 options[:disabled] = true
338 338 end
339 339 if options.delete(:disabled)
340 340 options.delete(:method)
341 341 options.delete(:confirm)
342 342 options.delete(:onclick)
343 343 options[:class] << ' disabled'
344 344 url = '#'
345 345 end
346 346 link_to name, url, options
347 347 end
348 348
349 349 def calendar_for(field_id)
350 350 image_tag("calendar.png", {:id => "#{field_id}_trigger",:class => "calendar-trigger"}) +
351 351 javascript_tag("Calendar.setup({inputField : '#{field_id}', ifFormat : '%Y-%m-%d', button : '#{field_id}_trigger' });")
352 352 end
353 353
354 354 def wikitoolbar_for(field_id)
355 355 return '' unless Setting.text_formatting == 'textile'
356 356 javascript_include_tag('jstoolbar') + javascript_tag("var toolbar = new jsToolBar($('#{field_id}')); toolbar.draw();")
357 357 end
358 358
359 359 def content_for(name, content = nil, &block)
360 360 @has_content ||= {}
361 361 @has_content[name] = true
362 362 super(name, content, &block)
363 363 end
364 364
365 365 def has_content?(name)
366 366 (@has_content && @has_content[name]) || false
367 367 end
368 368 end
369 369
370 370 class TabularFormBuilder < ActionView::Helpers::FormBuilder
371 371 include GLoc
372 372
373 373 def initialize(object_name, object, template, options, proc)
374 374 set_language_if_valid options.delete(:lang)
375 375 @object_name, @object, @template, @options, @proc = object_name, object, template, options, proc
376 376 end
377 377
378 378 (field_helpers - %w(radio_button hidden_field) + %w(date_select)).each do |selector|
379 379 src = <<-END_SRC
380 380 def #{selector}(field, options = {})
381 381 return super if options.delete :no_label
382 382 label_text = l(options[:label]) if options[:label]
383 383 label_text ||= l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym)
384 384 label_text << @template.content_tag("span", " *", :class => "required") if options.delete(:required)
385 385 label = @template.content_tag("label", label_text,
386 386 :class => (@object && @object.errors[field] ? "error" : nil),
387 387 :for => (@object_name.to_s + "_" + field.to_s))
388 388 label + super
389 389 end
390 390 END_SRC
391 391 class_eval src, __FILE__, __LINE__
392 392 end
393 393
394 394 def select(field, choices, options = {}, html_options = {})
395 395 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
396 396 label = @template.content_tag("label", label_text,
397 397 :class => (@object && @object.errors[field] ? "error" : nil),
398 398 :for => (@object_name.to_s + "_" + field.to_s))
399 399 label + super
400 400 end
401 401
402 402 end
403 403
@@ -1,85 +1,94
1 1 # redMine - project management software
2 2 # Copyright (C) 2006-2007 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class Changeset < ActiveRecord::Base
19 19 belongs_to :repository
20 20 has_many :changes, :dependent => :delete_all
21 21 has_and_belongs_to_many :issues
22 22
23 23 acts_as_event :title => Proc.new {|o| "#{l(:label_revision)} #{o.revision}" + (o.comments.blank? ? '' : (': ' + o.comments))},
24 24 :description => :comments,
25 25 :datetime => :committed_on,
26 26 :author => :committer,
27 27 :url => Proc.new {|o| {:controller => 'repositories', :action => 'revision', :id => o.repository.project_id, :rev => o.revision}}
28 28
29 29 acts_as_searchable :columns => 'comments',
30 30 :include => :repository,
31 31 :project_key => "#{Repository.table_name}.project_id",
32 32 :date_column => 'committed_on'
33 33
34 34 validates_presence_of :repository_id, :revision, :committed_on, :commit_date
35 35 validates_numericality_of :revision, :only_integer => true
36 36 validates_uniqueness_of :revision, :scope => :repository_id
37 37 validates_uniqueness_of :scmid, :scope => :repository_id, :allow_nil => true
38 38
39 39 def comments=(comment)
40 40 write_attribute(:comments, comment.strip)
41 41 end
42 42
43 43 def committed_on=(date)
44 44 self.commit_date = date
45 45 super
46 46 end
47 47
48 48 def after_create
49 49 scan_comment_for_issue_ids
50 50 end
51 51
52 52 def scan_comment_for_issue_ids
53 53 return if comments.blank?
54 54 # keywords used to reference issues
55 55 ref_keywords = Setting.commit_ref_keywords.downcase.split(",").collect(&:strip)
56 56 # keywords used to fix issues
57 57 fix_keywords = Setting.commit_fix_keywords.downcase.split(",").collect(&:strip)
58 58 # status and optional done ratio applied
59 59 fix_status = IssueStatus.find_by_id(Setting.commit_fix_status_id)
60 60 done_ratio = Setting.commit_fix_done_ratio.blank? ? nil : Setting.commit_fix_done_ratio.to_i
61 61
62 62 kw_regexp = (ref_keywords + fix_keywords).collect{|kw| Regexp.escape(kw)}.join("|")
63 63 return if kw_regexp.blank?
64 64
65 65 referenced_issues = []
66
67 if ref_keywords.delete('*')
68 # find any issue ID in the comments
69 target_issue_ids = []
70 comments.scan(%r{([\s\(,-^])#(\d+)(?=[[:punct:]]|\s|<|$)}).each { |m| target_issue_ids << m[1] }
71 referenced_issues += repository.project.issues.find_all_by_id(target_issue_ids)
72 end
73
66 74 comments.scan(Regexp.new("(#{kw_regexp})[\s:]+(([\s,;&]*#?\\d+)+)", Regexp::IGNORECASE)).each do |match|
67 75 action = match[0]
68 76 target_issue_ids = match[1].scan(/\d+/)
69 77 target_issues = repository.project.issues.find_all_by_id(target_issue_ids)
70 78 if fix_status && fix_keywords.include?(action.downcase)
71 79 # update status of issues
72 80 logger.debug "Issues fixed by changeset #{self.revision}: #{issue_ids.join(', ')}." if logger && logger.debug?
73 81 target_issues.each do |issue|
74 82 # don't change the status is the issue is already closed
75 83 next if issue.status.is_closed?
76 84 issue.status = fix_status
77 85 issue.done_ratio = done_ratio if done_ratio
78 86 issue.save
79 87 end
80 88 end
81 89 referenced_issues += target_issues
82 90 end
91
83 92 self.issues = referenced_issues.uniq
84 93 end
85 94 end
@@ -1,547 +1,547
1 1 _gloc_rule_default: '|n| n==1 ? "" : "_plural" '
2 2
3 3 actionview_datehelper_select_day_prefix:
4 4 actionview_datehelper_select_month_names: StyczeΕ„,Luty,Marzec,KwiecieΕ„,Maj,Czerwiec,Lipiec,SierpieΕ„,WrzesieΕ„,PaΕΊdziernik,Listopad,GrudzieΕ„
5 5 actionview_datehelper_select_month_names_abbr: Sty,Lut,Mar,Kwi,Maj,Cze,Lip,Sie,Wrz,PaΕΊ,Lis,Gru
6 6 actionview_datehelper_select_month_prefix:
7 7 actionview_datehelper_select_year_prefix:
8 8 actionview_datehelper_time_in_words_day: 1 dzieΕ„
9 9 actionview_datehelper_time_in_words_day_plural: %d dni
10 10 actionview_datehelper_time_in_words_hour_about: okoΕ‚o godziny
11 11 actionview_datehelper_time_in_words_hour_about_plural: okoΕ‚o %d godzin
12 12 actionview_datehelper_time_in_words_hour_about_single: okoΕ‚o godziny
13 13 actionview_datehelper_time_in_words_minute: 1 minuta
14 14 actionview_datehelper_time_in_words_minute_half: pΓ³Ε‚ minuty
15 15 actionview_datehelper_time_in_words_minute_less_than: mniej niΕΌ minuta
16 16 actionview_datehelper_time_in_words_minute_plural: %d minut
17 17 actionview_datehelper_time_in_words_minute_single: 1 minuta
18 18 actionview_datehelper_time_in_words_second_less_than: mniej niΕΌ sekunda
19 19 actionview_datehelper_time_in_words_second_less_than_plural: mniej niΕΌ %d sekund
20 20 actionview_instancetag_blank_option: ProszΔ™ wybierz
21 21
22 22 activerecord_error_inclusion: nie jest zawarte na liΕ›cie
23 23 activerecord_error_exclusion: jest zarezerwowane
24 24 activerecord_error_invalid: jest nieprawidΕ‚owe
25 25 activerecord_error_confirmation: nie pasuje do potwierdzenia
26 26 activerecord_error_accepted: musi być zaakceptowane
27 27 activerecord_error_empty: nie może być puste
28 28 activerecord_error_blank: nie może być czyste
29 29 activerecord_error_too_long: jest za dΕ‚ugie
30 30 activerecord_error_too_short: jest za krΓ³tkie
31 31 activerecord_error_wrong_length: ma zΕ‚Δ… dΕ‚ugoΕ›Δ‡
32 32 activerecord_error_taken: jest juΕΌ wybrane
33 33 activerecord_error_not_a_number: nie jest numerem
34 34 activerecord_error_not_a_date: nie jest prawidΕ‚owΔ… datΔ…
35 35 activerecord_error_greater_than_start_date: musi być większe niż początkowa data
36 36 activerecord_error_not_same_project: nie naleΕΌy do tego samego projektu
37 37 activerecord_error_circular_dependency: Ta relacja może wytworzyć kołową zależność
38 38
39 39 general_fmt_age: %d lat
40 40 general_fmt_age_plural: %d lat
41 41 general_fmt_date: %%m/%%d/%%Y
42 42 general_fmt_datetime: %%m/%%d/%%Y %%I:%%M %%p
43 43 general_fmt_datetime_short: %%b %%d, %%I:%%M %%p
44 44 general_fmt_time: %%I:%%M %%p
45 45 general_text_No: 'Nie'
46 46 general_text_Yes: 'Tak'
47 47 general_text_no: 'nie'
48 48 general_text_yes: 'tak'
49 49 general_lang_name: 'Polski'
50 50 general_csv_separator: ','
51 51 general_csv_encoding: ISO-8859-2
52 52 general_pdf_encoding: ISO-8859-2
53 53 general_day_names: PoniedziaΕ‚ek,Wtorek,Środa,Czwartek,PiΔ…tek,Sobota,Niedziela
54 54 general_first_day_of_week: '1'
55 55
56 56 notice_account_updated: Konto prawidΕ‚owo zaktualizowane.
57 57 notice_account_invalid_creditentials: ZΕ‚y uΕΌytkownik lub hasΕ‚o
58 58 notice_account_password_updated: HasΕ‚o prawidΕ‚owo zmienione.
59 59 notice_account_wrong_password: ZΕ‚e hasΕ‚o
60 60 notice_account_register_done: Konto prawidΕ‚owo stworzone.
61 61 notice_account_unknown_email: Nieznany uΕΌytkownik.
62 62 notice_can_t_change_password: To konto ma zewnętrzne źródło identyfikacji. Nie możesz zmienić hasła.
63 63 notice_account_lost_email_sent: Email z instrukcjami zmiany hasΕ‚a zostaΕ‚ wysΕ‚any do Ciebie.
64 64 notice_account_activated: Twoje konto zostało aktywowane. Możesz się zalogować.
65 65 notice_successful_create: Udane stworzenie.
66 66 notice_successful_update: Udane poprawienie.
67 67 notice_successful_delete: Udane usuniΔ™cie.
68 68 notice_successful_connection: Udane nawiΔ…zanie poΕ‚Δ…czenia.
69 69 notice_file_not_found: Strona do której próbujesz się dostać nie istnieje lub została usunięta.
70 70 notice_locking_conflict: Dane poprawione przez innego uΕΌytkownika.
71 71 notice_scm_error: WejΕ›cie i/lub zmiana nie istnieje w repozytorium.
72 72 notice_not_authorized: Nie jesteś autoryzowany by zobaczyć stronę.
73 73
74 74 mail_subject_lost_password: Twoje hasΕ‚o do redMine
75 75 mail_body_lost_password: 'W celu zmiany swojego hasΕ‚a uΕΌyj poniΕΌszego odnoΕ›nika:'
76 76 mail_subject_register: Aktywacja konta w redMine
77 77 mail_body_register: 'W celu aktywacji Twojego konta w Redmine, uΕΌyj poniΕΌszego odnoΕ›nika:'
78 78
79 79 gui_validation_error: 1 bΕ‚Δ…d
80 80 gui_validation_error_plural: %d bΕ‚Δ™dΓ³w
81 81
82 82 field_name: Nazwa
83 83 field_description: Opis
84 84 field_summary: Podsumowanie
85 85 field_is_required: Wymagane
86 86 field_firstname: ImiΔ™
87 87 field_lastname: Nazwisko
88 88 field_mail: Email
89 89 field_filename: Plik
90 90 field_filesize: Rozmiar
91 91 field_downloads: PobraΕ„
92 92 field_author: Autor
93 93 field_created_on: Stworzone
94 94 field_updated_on: Zmienione
95 95 field_field_format: Format
96 96 field_is_for_all: Dla wszystkich projektΓ³w
97 97 field_possible_values: MoΕΌliwe wartoΕ›ci
98 98 field_regexp: WyraΕΌenie regularne
99 99 field_min_length: Minimalna dΕ‚ugoΕ›Δ‡
100 100 field_max_length: Maksymalna dΕ‚ugoΕ›Δ‡
101 101 field_value: WartoΕ›Δ‡
102 102 field_category: Kategoria
103 103 field_title: TytuΕ‚
104 104 field_project: Projekt
105 105 field_issue: Zagadnienie
106 106 field_status: Status
107 107 field_notes: Notatki
108 108 field_is_closed: Zagadnienie zamkniΔ™te
109 109 field_is_default: DomyΕ›lny status
110 110 field_tracker: Typ zagadnienia
111 111 field_subject: Temat
112 112 field_due_date: Data oddania
113 113 field_assigned_to: Przydzielony do
114 114 field_priority: Priorytet
115 115 field_fixed_version: Wersja
116 116 field_user: UΕΌytkownik
117 117 field_role: Rola
118 118 field_homepage: Strona www
119 119 field_is_public: Publiczny
120 120 field_parent: Podprojekt
121 121 field_is_in_chlog: Zagadnienie pokazywane w zapisie zmian
122 122 field_is_in_roadmap: Zagadnienie pokazywane na mapie
123 123 field_login: Login
124 124 field_mail_notification: Powiadomienia Email
125 125 field_admin: Administrator
126 126 field_last_login_on: Ostatnie poΕ‚Δ…czenie
127 127 field_language: JΔ™zyk
128 128 field_effective_date: Data
129 129 field_password: HasΕ‚o
130 130 field_new_password: Nowe hasΕ‚o
131 131 field_password_confirmation: Potwierdzenie
132 132 field_version: Wersja
133 133 field_type: Typ
134 134 field_host: Host
135 135 field_port: Port
136 136 field_account: Konto
137 137 field_base_dn: Base DN
138 138 field_attr_login: Login atrybut
139 139 field_attr_firstname: ImiΔ™ atrybut
140 140 field_attr_lastname: Nazwisko atrybut
141 141 field_attr_mail: Email atrybut
142 142 field_onthefly: Tworzenie uΕΌytkownika w locie
143 143 field_start_date: Start
144 144 field_done_ratio: %% Wykonane
145 145 field_auth_source: Tryb identyfikacji
146 146 field_hide_mail: Ukryj mΓ³j adres email
147 147 field_comments: Komentarz
148 148 field_url: URL
149 149 field_start_page: Strona startowa
150 150 field_subproject: Podprojekt
151 151 field_hours: Godzin
152 152 field_activity: AktywnoΕ›Δ‡
153 153 field_spent_on: Data
154 154 field_identifier: Identifikator
155 155 field_is_filter: Atrybut filtrowania
156 156 field_issue_to_id: PowiΔ…zania zagadnienia
157 157 field_delay: OpΓ³ΕΊnienie
158 158
159 159 setting_app_title: TytuΕ‚ aplikacji
160 160 setting_app_subtitle: PodtytuΕ‚ aplikacji
161 161 setting_welcome_text: Tekst powitalny
162 162 setting_default_language: DomyΕ›lny jΔ™zyk
163 163 setting_login_required: Identyfikacja wymagana
164 164 setting_self_registration: WΕ‚asna rejestracja umoΕΌliwiona
165 165 setting_attachment_max_size: Maks. rozm. zaΕ‚Δ…cznika
166 166 setting_issues_export_limit: Limit eksportu zagadnieΕ„
167 167 setting_mail_from: Adres email wysyΕ‚ki
168 168 setting_host_name: Nazwa hosta
169 169 setting_text_formatting: Formatowanie tekstu
170 170 setting_wiki_compression: Kompresja historii Wiki
171 171 setting_feeds_limit: Limit danych RSS
172 172 setting_autofetch_changesets: Auto-odΕ›wieΕΌanie CVS
173 173 setting_sys_api_enabled: WΕ‚Δ…czenie WS do zarzΔ…dzania repozytorium
174 174 setting_commit_ref_keywords: Terminy odnoszΔ…ce (CVS)
175 175 setting_commit_fix_keywords: Terminy ustalajΔ…ce (CVS)
176 176 setting_autologin: Auto logowanie
177 177 setting_date_format: Format daty
178 178
179 179 label_user: UΕΌytkownik
180 180 label_user_plural: UΕΌytkownicy
181 181 label_user_new: Nowy uΕΌytkownik
182 182 label_project: Projekt
183 183 label_project_new: Nowy projekt
184 184 label_project_plural: Projekty
185 185 label_project_all: Wszystkie projekty
186 186 label_project_latest: Ostatnie projekty
187 187 label_issue: Zagadnienie
188 188 label_issue_new: Nowe zagadnienie
189 189 label_issue_plural: Zagadnienia
190 190 label_issue_view_all: Zobacz wszystkie zagadnienia
191 191 label_document: Dokument
192 192 label_document_new: Nowy dokument
193 193 label_document_plural: Dokumenty
194 194 label_role: Rola
195 195 label_role_plural: Role
196 196 label_role_new: Nowa rola
197 197 label_role_and_permissions: Role i Uprawnienia
198 198 label_member: Uczestnik
199 199 label_member_new: Nowy uczestnik
200 200 label_member_plural: Uczestnicy
201 201 label_tracker: Typ zagadnienia
202 202 label_tracker_plural: Typy zagadnieΕ„
203 203 label_tracker_new: Nowy typ zagadnienia
204 204 label_workflow: PrzepΕ‚yw
205 205 label_issue_status: Status zagadnienia
206 206 label_issue_status_plural: Statusy zagadnieΕ„
207 207 label_issue_status_new: Nowy status
208 208 label_issue_category: Kategoria zagadnienia
209 209 label_issue_category_plural: Kategorie zagadnieΕ„
210 210 label_issue_category_new: Nowa kategoria
211 211 label_custom_field: Dowolne pole
212 212 label_custom_field_plural: Dowolne pola
213 213 label_custom_field_new: Nowe dowolne pole
214 214 label_enumerations: Wyliczenia
215 215 label_enumeration_new: Nowa wartoΕ›Δ‡
216 216 label_information: Informacja
217 217 label_information_plural: Informacje
218 218 label_please_login: Zaloguj siΔ™
219 219 label_register: Rejestracja
220 220 label_password_lost: Zapomniane hasΕ‚o
221 221 label_home: GΕ‚Γ³wna
222 222 label_my_page: Moja strona
223 223 label_my_account: Moje konto
224 224 label_my_projects: Moje projekty
225 225 label_administration: Administracja
226 226 label_login: Login
227 227 label_logout: Wylogowanie
228 228 label_help: Pomoc
229 229 label_reported_issues: Wprowadzone zagadnienia
230 230 label_assigned_to_me_issues: Zagadnienia przypisane do mnie
231 231 label_last_login: Ostatnie poΕ‚Δ…czenie
232 232 label_last_updates: Ostatnia zmieniana
233 233 label_last_updates_plural: %d ostatnie zmiany
234 234 label_registered_on: Zarejestrowany
235 235 label_activity: AktywnoΕ›Δ‡
236 236 label_new: Nowy
237 237 label_logged_as: Zalogowany jako
238 238 label_environment: Środowisko
239 239 label_authentication: Identyfikacja
240 240 label_auth_source: Tryb identyfikacji
241 241 label_auth_source_new: Nowy tryb identyfikacji
242 242 label_auth_source_plural: Tryby identyfikacji
243 243 label_subproject_plural: Podprojekty
244 244 label_min_max_length: Min - Maks dΕ‚ugoΕ›Δ‡
245 245 label_list: Lista
246 246 label_date: Data
247 247 label_integer: Liczba caΕ‚kowita
248 248 label_boolean: WartoΕ›Δ‡ logiczna
249 249 label_string: Tekst
250 250 label_text: DΕ‚ugi tekst
251 251 label_attribute: Atrybut
252 252 label_attribute_plural: Atrybuty
253 253 label_download: %d Pobranie
254 254 label_download_plural: %d Pobrania
255 255 label_no_data: Brak danych do pokazania
256 256 label_change_status: Status zmian
257 257 label_history: Historia
258 258 label_attachment: Plik
259 259 label_attachment_new: Nowy plik
260 260 label_attachment_delete: Skasuj plik
261 261 label_attachment_plural: Pliki
262 262 label_report: Raport
263 263 label_report_plural: Raporty
264 label_news: NowoΕ›Δ‡
265 label_news_new: Dodaj nowoΕ›Δ‡
266 label_news_plural: NowoΕ›ci
267 label_news_latest: Ostatnie nowoΕ›ci
268 label_news_view_all: PokaΕΌ wszystkie nowoΕ›ci
264 label_news: WiadomoΕ›Δ‡
265 label_news_new: Dodaj wiadomoΕ›Δ‡
266 label_news_plural: WiadomoΕ›ci
267 label_news_latest: Ostatnie wiadomoΕ›ci
268 label_news_view_all: PokaΕΌ wszystkie wiadomoΕ›ci
269 269 label_change_log: Lista zmian
270 270 label_settings: Ustawienia
271 271 label_overview: PrzeglΔ…d
272 272 label_version: Wersja
273 273 label_version_new: Nowa wersja
274 274 label_version_plural: Wersje
275 275 label_confirmation: Potwierdzenie
276 276 label_export_to: Eksportuj do
277 277 label_read: Czytanie...
278 278 label_public_projects: Projekty publiczne
279 279 label_open_issues: otwarte
280 280 label_open_issues_plural: otwarte
281 281 label_closed_issues: zamkniΔ™te
282 282 label_closed_issues_plural: zamkniΔ™te
283 283 label_total: OgΓ³Ε‚em
284 284 label_permissions: Uprawnienia
285 285 label_current_status: Obecny status
286 286 label_new_statuses_allowed: Uprawnione nowe statusy
287 287 label_all: wszystko
288 288 label_none: brak
289 289 label_next: NastΔ™pne
290 290 label_previous: Poprzednie
291 291 label_used_by: UΕΌywane przez
292 292 label_details: SzczegΓ³Ε‚y
293 293 label_add_note: Dodaj notatkΔ™
294 294 label_per_page: Na stronΔ™
295 295 label_calendar: Kalendarz
296 296 label_months_from: miesiΔ…ce od
297 297 label_gantt: Gantt
298 298 label_internal: WewnΔ™trzny
299 299 label_last_changes: ostatnie %d zmian
300 300 label_change_view_all: PokaΕΌ wszystkie zmiany
301 301 label_personalize_page: Personalizuj tΔ… stronΔ™
302 302 label_comment: Komentarz
303 303 label_comment_plural: Komentarze
304 304 label_comment_add: Dodaj komentarz
305 305 label_comment_added: Komentarz dodany
306 306 label_comment_delete: UsuΕ„ komentarze
307 307 label_query: Dowolne zapytanie
308 308 label_query_plural: Dowolne zapytania
309 309 label_query_new: Nowe zapytanie
310 310 label_filter_add: Dodaj filtr
311 311 label_filter_plural: Filtry
312 312 label_equals: jest
313 313 label_not_equals: nie jest
314 314 label_in_less_than: w mniejszych od
315 315 label_in_more_than: w wiΔ™kszych niΕΌ
316 316 label_in: w
317 317 label_today: dzisiaj
318 318 label_less_than_ago: dni mniej
319 319 label_more_than_ago: dni wiΔ™cej
320 320 label_ago: dni temu
321 321 label_contains: zawiera
322 322 label_not_contains: nie zawiera
323 323 label_day_plural: dni
324 324 label_repository: Repozytorium
325 325 label_browse: PrzeglΔ…d
326 326 label_modification: %d modyfikacja
327 327 label_modification_plural: %d modyfikacja
328 328 label_revision: Zmiana
329 329 label_revision_plural: Zmiany
330 330 label_added: dodane
331 331 label_modified: zmodufikowane
332 332 label_deleted: usuniΔ™te
333 333 label_latest_revision: Ostatnia zmiana
334 334 label_latest_revision_plural: Ostatnie zmiany
335 335 label_view_revisions: PokaΕΌ zmiany
336 336 label_max_size: Maksymalny rozmiar
337 label_on: 'wΕ‚Δ…czone'
337 label_on: 'z'
338 338 label_sort_highest: PrzesuΕ„ na gΓ³rΔ™
339 339 label_sort_higher: Do gΓ³ry
340 340 label_sort_lower: Do doΕ‚u
341 341 label_sort_lowest: PrzesuΕ„ na dΓ³Ε‚
342 342 label_roadmap: Mapa
343 343 label_roadmap_due_in: W czasie
344 344 label_roadmap_no_issues: Brak zagadnieΕ„ do tej wersji
345 345 label_search: Szukaj
346 346 label_result_plural: RezultatΓ³w
347 347 label_all_words: Wszystkie sΕ‚owa
348 348 label_wiki: Wiki
349 349 label_wiki_edit: Edycja wiki
350 350 label_wiki_edit_plural: Edycje wiki
351 351 label_wiki_page: Strona wiki
352 352 label_wiki_page_plural: Strony wiki
353 353 label_index_by_title: Indeks
354 354 label_index_by_date: Index by date
355 355 label_current_version: Obecna wersja
356 356 label_preview: PodglΔ…d
357 357 label_feed_plural: IloΕ›Δ‡ RSS
358 358 label_changes_details: SzczegΓ³Ε‚y wszystkich zmian
359 359 label_issue_tracking: Śledzenie zagadnieΕ„
360 360 label_spent_time: SpΔ™dzony czas
361 361 label_f_hour: %.2f godzina
362 362 label_f_hour_plural: %.2f godzin
363 363 label_time_tracking: Śledzenie czasu
364 364 label_change_plural: Zmiany
365 365 label_statistics: Statystyki
366 366 label_commits_per_month: Wrzutek CVS w miesiΔ…cu
367 367 label_commits_per_author: Wrzutek CVS przez autora
368 368 label_view_diff: PokaΕΌ rΓ³ΕΌnice
369 369 label_diff_inline: w linii
370 370 label_diff_side_by_side: obok siebie
371 371 label_options: Opcje
372 372 label_copy_workflow_from: Kopiuj przepΕ‚yw z
373 373 label_permissions_report: Raport uprawnieΕ„
374 374 label_watched_issues: Obserwowane zagadnienia
375 375 label_related_issues: PowiΔ…zane zagadnienia
376 376 label_applied_status: Stosowany status
377 377 label_loading: Ładowanie...
378 378 label_relation_new: Nowe powiΔ…zanie
379 379 label_relation_delete: UsuΕ„ powiΔ…zanie
380 380 label_relates_to: powiΔ…zane z
381 381 label_duplicates: duplikaty
382 382 label_blocks: blokady
383 383 label_blocked_by: zablokowane przez
384 384 label_precedes: poprzedza
385 385 label_follows: podΔ…ΕΌa
386 386 label_end_to_start: koniec do poczΔ…tku
387 387 label_end_to_end: koniec do koΕ„ca
388 388 label_start_to_start: poczΔ…tek do poczΔ…tku
389 389 label_start_to_end: poczΔ…tek do koΕ„ca
390 390 label_stay_logged_in: PozostaΕ„ zalogowany
391 391 label_disabled: zablokowany
392 392 label_show_completed_versions: PokaΕΌ kompletne wersje
393 393 label_me: ja
394 394 label_board: Forum
395 395 label_board_new: Nowe forum
396 396 label_board_plural: Fora
397 397 label_topic_plural: Tematy
398 398 label_message_plural: WiadomoΕ›ci
399 399 label_message_last: Ostatnia wiadomoΕ›Δ‡
400 400 label_message_new: Nowa wiadomoΕ›Δ‡
401 401 label_reply_plural: Odpowiedzi
402 402 label_send_information: WyΕ›lij informacjΔ™ uΕΌytkownikowi
403 403 label_year: Rok
404 404 label_month: MiesiΔ…c
405 405 label_week: TydzieΕ„
406 406 label_date_from: Z
407 407 label_date_to: Do
408 408 label_language_based: Na podstawie jΔ™zyka
409 409
410 410 button_login: Login
411 411 button_submit: WyΕ›lij
412 412 button_save: Zapisz
413 413 button_check_all: Zaznacz wszystko
414 414 button_uncheck_all: Odznacz wszystko
415 415 button_delete: UsuΕ„
416 416 button_create: StwΓ³rz
417 417 button_test: Testuj
418 418 button_edit: Edytuj
419 419 button_add: Dodaj
420 420 button_change: ZmieΕ„
421 421 button_apply: Ustaw
422 422 button_clear: WyczyΕ›Δ‡
423 423 button_lock: Zablokuj
424 424 button_unlock: Odblokuj
425 425 button_download: Pobierz
426 426 button_list: Lista
427 427 button_view: PokaΕΌ
428 428 button_move: PrzenieΕ›
429 429 button_back: Wstecz
430 430 button_cancel: Anuluj
431 431 button_activate: Aktywuj
432 432 button_sort: Sortuj
433 433 button_log_time: Logowanie czasu
434 434 button_rollback: PrzywrΓ³c do tej wersji
435 435 button_watch: Obserwuj
436 436 button_unwatch: Nie obserwuj
437 437 button_reply: Odpowiedz
438 438 button_archive: Archiwizuj
439 439 button_unarchive: PrzywrΓ³c z archiwum
440 440
441 441 status_active: aktywny
442 442 status_registered: zarejestrowany
443 443 status_locked: zablokowany
444 444
445 445 text_select_mail_notifications: Zaznacz czynności przy których użytkownik powinien być powiadomiony mailem.
446 446 text_regexp_info: np. ^[A-Z0-9]+$
447 447 text_min_max_length_info: 0 oznacza brak restrykcji
448 448 text_project_destroy_confirmation: JesteΕ› pewien, ΕΌe chcesz usunΔ…Δ‡ ten projekt i wszyskie powiΔ…zane dane?
449 449 text_workflow_edit: Zaznacz rolΔ™ i typ zagadnienia do edycji przepΕ‚ywu
450 450 text_are_you_sure: JesteΕ› pewien ?
451 451 text_journal_changed: zmienione %s do %s
452 452 text_journal_set_to: ustawione na %s
453 453 text_journal_deleted: usuniΔ™te
454 454 text_tip_task_begin_day: zadanie zaczynajΔ…ce siΔ™ dzisiaj
455 455 text_tip_task_end_day: zadanie koΕ„czΔ…ce siΔ™ dzisiaj
456 456 text_tip_task_begin_end_day: zadanie zaczynajΔ…ce i koΕ„czΔ…ce siΔ™ dzisiaj
457 457 text_project_identifier_info: 'Małe litery (a-z), liczby i myślniki dozwolone.<br />Raz zapisany, identyfikator nie może być zmieniony.'
458 458 text_caracters_maximum: %d znakΓ³w maksymalnie.
459 459 text_length_between: DΕ‚ugoΕ›Δ‡ pomiΔ™dzy %d i %d znakΓ³w.
460 460 text_tracker_no_workflow: Brak przepΕ‚ywu zefiniowanego dla tego typu zagadnienia
461 461 text_unallowed_characters: Niedozwolone znaki
462 462 text_comma_separated: Wielokrotne wartoΕ›ci dozwolone (rozdzielone przecinkami).
463 463 text_issues_ref_in_commit_messages: Zagadnienia odnoszΔ…ce i ustalajΔ…ce we wrzutkach CVS
464 464
465 465 default_role_manager: Kierownik
466 466 default_role_developper: Programista
467 467 default_role_reporter: Wprowadzajacy
468 468 default_tracker_bug: BΕ‚Δ…d
469 469 default_tracker_feature: Cecha
470 470 default_tracker_support: Wsparcie
471 471 default_issue_status_new: Nowy
472 472 default_issue_status_assigned: Przypisany
473 473 default_issue_status_resolved: RozwiΔ…zany
474 474 default_issue_status_feedback: OdpowiedΕΊ
475 475 default_issue_status_closed: ZamkniΔ™ty
476 476 default_issue_status_rejected: Odrzucony
477 477 default_doc_category_user: Dokumentacja uΕΌytkownika
478 478 default_doc_category_tech: Dokumentacja techniczna
479 479 default_priority_low: Niski
480 480 default_priority_normal: Normalny
481 481 default_priority_high: Wysoki
482 482 default_priority_urgent: Pilny
483 483 default_priority_immediate: Natyczmiastowy
484 484 default_activity_design: Projektowanie
485 485 default_activity_development: RozwΓ³j
486 486
487 487 enumeration_issue_priorities: Priorytety zagadnieΕ„
488 488 enumeration_doc_categories: Kategorie dokumentΓ³w
489 489 enumeration_activities: DziaΕ‚ania (Ε›ledzenie czasu)
490 490 button_rename: ZmieΕ„ nazwΔ™
491 491 text_issue_category_destroy_question: Zagadnienia (%d) są przypisane do tej kategorii. Co chcesz uczynić?
492 492 label_feeds_access_key_created_on: Klucz dostΔ™pu RSS stworzony %s dni temu
493 493 setting_cross_project_issue_relations: ZezwΓ³l na powiΔ…zania zagadnieΕ„ miΔ™dzy projektami
494 494 label_roadmap_overdue: %s spΓ³ΕΊnienia
495 495 label_module_plural: ModuΕ‚y
496 496 label_this_week: ten tydzieΕ„
497 497 label_jump_to_a_project: Skocz do projektu...
498 498 field_assignable: Zagadnienia mogą być przypisane do tej roli
499 499 label_sort_by: Sortuj po %s
500 500 text_issue_updated: Zagadnienie %s zostaΕ‚o zaktualizowane.
501 501 notice_feeds_access_key_reseted: TwΓ³j klucz dostΔ™pu RSS zostaΕ‚ zrestetowany.
502 502 field_redirect_existing_links: Przekierowanie istniejΔ…cych odnoΕ›nikΓ³w
503 503 text_issue_category_reassign_to: Przydziel zagadnienie do tej kategorii
504 504 notice_email_sent: Email zostaΕ‚ wysΕ‚any do %s
505 505 text_issue_added: Zagadnienie %s zostaΕ‚o wprowadzone.
506 506 text_wiki_destroy_confirmation: JesteΕ› pewien, ΕΌe chcesz usunΔ…Δ‡ to wiki i caΕ‚Δ… jego zawartoΕ›Δ‡ ?
507 507 notice_email_error: WystΔ…piΕ‚ bΕ‚Δ…d w trakcie wysyΕ‚ania maila (%s)
508 508 label_updated_time: Zaktualizowane %s temu
509 509 text_issue_category_destroy_assignments: UsuΕ„ przydziaΕ‚y kategorii
510 510 label_send_test_email: WyΕ›lij prΓ³bny email
511 511 button_reset: Resetuj
512 512 label_added_time_by: Dodane przez %s %s temu
513 513 field_estimated_hours: Szacowany czas
514 514 label_file_plural: Pliki
515 515 label_changeset_plural: Zestawienia zmian
516 516 field_column_names: Nazwy kolumn
517 517 label_default_columns: DomyΕ›lne kolumny
518 518 setting_issue_list_default_columns: DomyΕ›lne kolumny wiΕ›wietlane na liΕ›cie zagadnieΕ„
519 519 setting_repositories_encodings: Kodowanie repozytoriΓ³w
520 520 notice_no_issue_selected: "Nie wybrano zagadnienia! Zaznacz zagadnienie, które chcesz edytować."
521 521 label_bulk_edit_selected_issues: Zbiorowa edycja zagadnieΕ„
522 522 label_no_change_option: (Bez zmian)
523 523 notice_failed_to_save_issues: "BΕ‚Δ…d podczas zapisu zagadnieΕ„ %d z %d zaznaczonych: %s."
524 524 label_theme: Temat
525 525 label_default: DomyΕ›lne
526 526 label_search_titles_only: Przeszukuj tylko tytuΕ‚y
527 527 label_nobody: nikt
528 528 button_change_password: ZmieΕ„ hasΕ‚o
529 529 text_user_mail_option: "W przypadku niezaznaczonych projektΓ³w, bΔ™dziesz otrzymywaΕ‚ powiadomienia tylko na temat zagadnien, ktΓ³re obserwujesz, lub w ktΓ³rych bierzesz udziaΕ‚ (np. jesteΕ› autorem lub adresatem)."
530 530 label_user_mail_option_selected: "Tylko dla kaΕΌdego zdarzenia w wybranych projektach..."
531 531 label_user_mail_option_all: "Dla kaΕΌdego zdarzenia w kaΕΌdym moim projekcie"
532 532 label_user_mail_option_none: "Tylko to co obserwuje lub w czym biorΔ™ udziaΕ‚"
533 533 setting_emails_footer: Stopka e-mail
534 534 label_float: Liczba rzeczywista
535 535 button_copy: Kopia
536 536 mail_body_account_information_external: Możesz użyć twojego "%s" konta do zalogowania do Redmine.
537 537 mail_body_account_information: Twoje konto w Redmine
538 538 setting_protocol: ProtokoΕ‚
539 539 label_user_mail_no_self_notified: "Nie chcΔ™ powiadomieΕ„ o zmianach, ktΓ³re sam wprowadzam."
540 540 setting_time_format: Format czasu
541 541 label_registration_activation_by_email: aktywacja konta przez e-mail
542 542 mail_subject_account_activation_request: Zapytanie aktywacyjne konta Redmine
543 543 mail_body_account_activation_request: 'Zarejestrowano nowego uΕΌytkownika: (%s). Konto oczekuje na twoje zatwierdzenie:'
544 544 label_registration_automatic_activation: automatyczna aktywacja kont
545 545 label_registration_manual_activation: manualna aktywacja kont
546 546 notice_account_pending: "Twoje konto zostaΕ‚o utworzone i oczekuje na zatwierdzenie administratora."
547 field_time_zone: Time zone
547 field_time_zone: Strefa czasowa
@@ -1,76 +1,76
1 1 # redMine - project management software
2 2 # Copyright (C) 2006-2007 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require File.dirname(__FILE__) + '/../test_helper'
19 19
20 20 class RepositoryTest < Test::Unit::TestCase
21 21 fixtures :projects, :repositories, :issues, :issue_statuses, :changesets, :changes
22 22
23 23 def setup
24 24 @repository = Project.find(1).repository
25 25 end
26 26
27 27 def test_create
28 28 repository = Repository::Subversion.new(:project => Project.find(2))
29 29 assert !repository.save
30 30
31 31 repository.url = "svn://localhost"
32 32 assert repository.save
33 33 repository.reload
34 34
35 35 project = Project.find(2)
36 36 assert_equal repository, project.repository
37 37 end
38 38
39 39 def test_scan_changesets_for_issue_ids
40 40 # choosing a status to apply to fix issues
41 41 Setting.commit_fix_status_id = IssueStatus.find(:first, :conditions => ["is_closed = ?", true]).id
42 42 Setting.commit_fix_done_ratio = "90"
43 43 Setting.commit_ref_keywords = 'refs , references, IssueID'
44 44 Setting.commit_fix_keywords = 'fixes , closes'
45 45
46 46 # make sure issue 1 is not already closed
47 47 assert !Issue.find(1).status.is_closed?
48 48
49 49 Repository.scan_changesets_for_issue_ids
50 50 assert_equal [101, 102], Issue.find(3).changeset_ids
51 51
52 52 # fixed issues
53 53 fixed_issue = Issue.find(1)
54 54 assert fixed_issue.status.is_closed?
55 55 assert_equal 90, fixed_issue.done_ratio
56 56 assert_equal [101], fixed_issue.changeset_ids
57 57
58 58 # ignoring commits referencing an issue of another project
59 59 assert_equal [], Issue.find(4).changesets
60 60 end
61 61
62 62 def test_for_changeset_comments_strip
63 63 repository = Repository::Mercurial.create( :project => Project.find( 4 ), :url => '/foo/bar/baz' )
64 64 comment = <<-COMMENT
65 65 This is a loooooooooooooooooooooooooooong comment
66 66
67 67
68 68 COMMENT
69 69 changeset = Changeset.new(
70 70 :comments => comment, :commit_date => Time.now, :revision => 0, :scmid => 'f39b7922fb3c',
71 :committer => 'foo <foo@example.com>', :committed_on => Time.now, :repository_id => repository )
71 :committer => 'foo <foo@example.com>', :committed_on => Time.now, :repository => repository )
72 72 assert( changeset.save )
73 73 assert_not_equal( comment, changeset.comments )
74 74 assert_equal( 'This is a loooooooooooooooooooooooooooong comment', changeset.comments )
75 75 end
76 76 end
General Comments 0
You need to be logged in to leave comments. Login now