<%= select_tag 'available_columns',
options_for_select((query.available_columns - query.columns).collect {|column| [column.caption, column.name]}),
diff --git a/app/views/queries/_filters.rhtml b/app/views/queries/_filters.rhtml
index bc60bd5eb..c9d612364 100644
--- a/app/views/queries/_filters.rhtml
+++ b/app/views/queries/_filters.rhtml
@@ -56,30 +56,29 @@ function toggle_multi_select(field) {
//]]>
-<%= l(:label_filter_plural) %>
-
+
<% query.available_filters.sort{|a,b| a[1][:order]<=>b[1][:order]}.each do |filter| %>
<% field = filter[0]
options = filter[1] %>
- id="tr_<%= field %>">
-
+ id="tr_<%= field %>" class="filter">
+
<%= check_box_tag 'fields[]', field, query.has_filter?(field), :onclick => "toggle_filter('#{field}');", :id => "cb_#{field}" %>
<%= filter[1][:name] || l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) %>
-
+
<%= select_tag "operators[#{field}]", options_for_select(operators_for_select(options[:type]), query.operator_for(field)), :id => "operators_#{field}", :onchange => "toggle_operator('#{field}');", :class => "select-small", :style => "vertical-align: top;" %>
-
+
<% case options[:type]
- when :list, :list_optional, :list_status, :list_one_or_more %>
+ when :list, :list_optional, :list_status, :list_subprojects %>
1 %> name="values[<%= field %>][]" id="values_<%= field %>" class="select-small" style="vertical-align: top;">
<%= options_for_select options[:values], query.values_for(field) %>
- <%= link_to_function image_tag('expand.png'), "toggle_multi_select('#{field}');" %>
+ <%= link_to_function image_tag('bullet_toggle_plus.png'), "toggle_multi_select('#{field}');", :style => "vertical-align: bottom;" %>
<% when :date, :date_past %>
<%= text_field_tag "values[#{field}][]", query.values_for(field), :id => "values_#{field}", :size => 3, :class => "select-small" %> <%= l(:label_day_plural) %>
<% when :string, :text %>
@@ -94,10 +93,9 @@ function toggle_multi_select(field) {
<% end %>
-
+
<%= l(:label_filter_add) %>:
<%= select_tag 'add_filter_select', options_for_select([["",""]] + query.available_filters.sort{|a,b| a[1][:order]<=>b[1][:order]}.collect{|field| [ field[1][:name] || l(("field_"+field[0].to_s.gsub(/\_id$/, "")).to_sym), field[0]] unless query.has_filter?(field[0])}.compact), :onchange => "add_filter();", :class => "select-small" %>
-
\ No newline at end of file
diff --git a/app/views/queries/_form.rhtml b/app/views/queries/_form.rhtml
index 1620d9b05..8da264032 100644
--- a/app/views/queries/_form.rhtml
+++ b/app/views/queries/_form.rhtml
@@ -6,16 +6,24 @@
<%=l(:field_name)%>
<%= text_field 'query', 'name', :size => 80 %>
-<% if current_role.allowed_to?(:manage_public_queries) %>
- <%=l(:field_is_public)%>
- <%= check_box 'query', 'is_public' %>
+<% if User.current.admin? || (@project && current_role.allowed_to?(:manage_public_queries)) %>
+<%=l(:field_is_public)%>
+<%= check_box 'query', 'is_public',
+ :onchange => (User.current.admin? ? nil : 'if (this.checked) {$("query_is_for_all").checked = false; $("query_is_for_all").disabled = true;} else {$("query_is_for_all").disabled = false;}') %>
<% end %>
+<%=l(:field_is_for_all)%>
+<%= check_box_tag 'query_is_for_all', 1, @query.project.nil?,
+ :disabled => (!@query.new_record? && (@query.project.nil? || (@query.is_public? && !User.current.admin?))) %>
+
<%=l(:label_default_columns)%>
<%= check_box_tag 'default_columns', 1, @query.has_default_columns?, :id => 'query_default_columns',
:onclick => 'if (this.checked) {Element.hide("columns")} else {Element.show("columns")}' %>
+<%= l(:label_filter_plural) %>
<%= render :partial => 'queries/filters', :locals => {:query => query}%>
+
+
<%= render :partial => 'queries/columns', :locals => {:query => query}%>
diff --git a/app/views/reports/issue_report.rhtml b/app/views/reports/issue_report.rhtml
index 0eaba58dc..1ed16ea3b 100644
--- a/app/views/reports/issue_report.rhtml
+++ b/app/views/reports/issue_report.rhtml
@@ -4,8 +4,11 @@
<%=l(:field_tracker)%> <%= link_to image_tag('zoom_in.png'), :detail => 'tracker' %>
<%= render :partial => 'simple', :locals => { :data => @issues_by_tracker, :field_name => "tracker_id", :rows => @trackers } %>
-<%=l(:field_version)%> <%= link_to image_tag('zoom_in.png'), :detail => 'version' %>
-<%= render :partial => 'simple', :locals => { :data => @issues_by_version, :field_name => "fixed_version_id", :rows => @versions } %>
+<%=l(:field_priority)%> <%= link_to image_tag('zoom_in.png'), :detail => 'priority' %>
+<%= render :partial => 'simple', :locals => { :data => @issues_by_priority, :field_name => "priority_id", :rows => @priorities } %>
+
+<%=l(:field_assigned_to)%> <%= link_to image_tag('zoom_in.png'), :detail => 'assigned_to' %>
+<%= render :partial => 'simple', :locals => { :data => @issues_by_assigned_to, :field_name => "assigned_to_id", :rows => @assignees } %>
<%=l(:field_author)%> <%= link_to image_tag('zoom_in.png'), :detail => 'author' %>
<%= render :partial => 'simple', :locals => { :data => @issues_by_author, :field_name => "author_id", :rows => @authors } %>
@@ -13,8 +16,8 @@
-
<%=l(:field_priority)%> <%= link_to image_tag('zoom_in.png'), :detail => 'priority' %>
-<%= render :partial => 'simple', :locals => { :data => @issues_by_priority, :field_name => "priority_id", :rows => @priorities } %>
+
<%=l(:field_version)%> <%= link_to image_tag('zoom_in.png'), :detail => 'version' %>
+<%= render :partial => 'simple', :locals => { :data => @issues_by_version, :field_name => "fixed_version_id", :rows => @versions } %>
<% if @project.children.any? %>
<%=l(:field_subproject)%> <%= link_to image_tag('zoom_in.png'), :detail => 'subproject' %>
diff --git a/app/views/repositories/_dir_list.rhtml b/app/views/repositories/_dir_list.rhtml
index 1ed623ae8..5590652f5 100644
--- a/app/views/repositories/_dir_list.rhtml
+++ b/app/views/repositories/_dir_list.rhtml
@@ -1,10 +1,10 @@
-
+
<%= l(:field_name) %>
<%= l(:field_filesize) %>
<%= l(:label_revision) %>
-<%= l(:label_date) %>
+<%= l(:label_age) %>
<%= l(:field_author) %>
<%= l(:field_comments) %>
diff --git a/app/views/repositories/_dir_list_content.rhtml b/app/views/repositories/_dir_list_content.rhtml
index 0d84da387..20473a264 100644
--- a/app/views/repositories/_dir_list_content.rhtml
+++ b/app/views/repositories/_dir_list_content.rhtml
@@ -1,32 +1,24 @@
<% @entries.each do |entry| %>
<% tr_id = Digest::MD5.hexdigest(entry.path)
depth = params[:depth].to_i %>
-
-
-<%= if entry.is_dir?
- link_to_remote h(entry.name),
- {:url => {:action => 'browse', :id => @project, :path => entry.path, :rev => @rev, :depth => (depth + 1), :parent_id => tr_id},
+
+
+<% if entry.is_dir? %>
+ "scmEntryClick('#{tr_id}')"
- },
- {:href => url_for({:action => 'browse', :id => @project, :path => entry.path, :rev => @rev}),
- :class => ('icon icon-folder'),
- :style => "margin-left: #{18 * depth}px;"
- }
-else
- link_to h(entry.name),
- {:action => (entry.is_dir? ? 'browse' : 'changes'), :id => @project, :path => entry.path, :rev => @rev},
- :class => 'icon icon-file',
- :style => "margin-left: #{18 * depth}px;"
-end %>
+ :condition => "scmEntryClick('#{tr_id}')"%>"> 
+<% end %>
+<%= link_to h(entry.name),
+ {:action => (entry.is_dir? ? 'browse' : 'changes'), :id => @project, :path => to_path_param(entry.path), :rev => @rev},
+ :class => (entry.is_dir? ? 'icon icon-folder' : 'icon icon-file')%>
-<%= (entry.size ? number_to_human_size(entry.size) : "?") unless entry.is_dir? %>
-<%= link_to(entry.lastrev.name, :action => 'revision', :id => @project, :rev => entry.lastrev.identifier) if entry.lastrev && entry.lastrev.identifier %>
-<%= format_time(entry.lastrev.time) if entry.lastrev %>
-<%=h(entry.lastrev.author) if entry.lastrev %>
-<% changeset = @project.repository.changesets.find_by_revision(entry.lastrev.identifier) if entry.lastrev %>
-<%=h truncate(changeset.comments, 50) unless changeset.nil? %>
+<%= (entry.size ? number_to_human_size(entry.size) : "?") unless entry.is_dir? %>
+<%= link_to(format_revision(entry.lastrev.name), :action => 'revision', :id => @project, :rev => entry.lastrev.identifier) if entry.lastrev && entry.lastrev.identifier %>
+<%= distance_of_time_in_words(entry.lastrev.time, Time.now) if entry.lastrev && entry.lastrev.time %>
+<%=h(entry.lastrev.author.to_s.split('<').first) if entry.lastrev %>
+<% changeset = @project.repository.changesets.find_by_revision(entry.lastrev.identifier) if entry.lastrev && entry.lastrev.identifier %>
+
<% end %>
diff --git a/app/views/repositories/_navigation.rhtml b/app/views/repositories/_navigation.rhtml
index 823b4f44f..25a15f496 100644
--- a/app/views/repositories/_navigation.rhtml
+++ b/app/views/repositories/_navigation.rhtml
@@ -10,10 +10,12 @@ dirs.each do |dir|
link_path << '/' unless link_path.empty?
link_path << "#{dir}"
%>
- / <%= link_to h(dir), :action => 'browse', :id => @project, :path => link_path, :rev => @rev %>
+ / <%= link_to h(dir), :action => 'browse', :id => @project, :path => to_path_param(link_path), :rev => @rev %>
<% end %>
<% if filename %>
- / <%= link_to h(filename), :action => 'revisions', :id => @project, :path => "#{link_path}/#{filename}", :rev => @rev %>
+ / <%= link_to h(filename), :action => 'changes', :id => @project, :path => to_path_param("#{link_path}/#{filename}"), :rev => @rev %>
<% end %>
<%= "@ #{revision}" if revision %>
+
+<% html_title(with_leading_slash(path)) -%>
diff --git a/app/views/repositories/_revisions.rhtml b/app/views/repositories/_revisions.rhtml
index d1ef83576..a938fecb8 100644
--- a/app/views/repositories/_revisions.rhtml
+++ b/app/views/repositories/_revisions.rhtml
@@ -1,5 +1,5 @@
-<% form_tag({:controller => 'repositories', :action => 'diff', :id => @project, :path => path}, :method => :get) do %>
-
+<% form_tag({:controller => 'repositories', :action => 'diff', :id => @project, :path => to_path_param(path)}, :method => :get) do %>
+
#
@@ -12,17 +12,17 @@
<% show_diff = entry && entry.is_file? && revisions.size > 1 %>
<% line_num = 1 %>
<% revisions.each do |changeset| %>
-
-<%= link_to changeset.revision, :action => 'revision', :id => project, :rev => changeset.revision %>
+
+<%= link_to format_revision(changeset.revision), :action => 'revision', :id => project, :rev => changeset.revision %>
<%= radio_button_tag('rev', changeset.revision, (line_num==1), :id => "cb-#{line_num}", :onclick => "$('cbto-#{line_num+1}').checked=true;") if show_diff && (line_num < revisions.size) %>
<%= radio_button_tag('rev_to', changeset.revision, (line_num==2), :id => "cbto-#{line_num}", :onclick => "if ($('cb-#{line_num}').checked==true) {$('cb-#{line_num-1}').checked=true;}") if show_diff && (line_num > 1) %>
-<%= format_time(changeset.committed_on) %>
-<%=h changeset.committer %>
-<%= textilizable(changeset.comments) %>
+<%= format_time(changeset.committed_on) %>
+<%=h changeset.committer.to_s.split('<').first %>
+
<% line_num += 1 %>
<% end %>
-<%= submit_tag(l(:label_view_diff), :class => 'small', :name => nil) if show_diff %>
+<%= submit_tag(l(:label_view_diff), :name => nil) if show_diff %>
<% end %>
diff --git a/app/views/repositories/annotate.rhtml b/app/views/repositories/annotate.rhtml
new file mode 100644
index 000000000..b5669ef76
--- /dev/null
+++ b/app/views/repositories/annotate.rhtml
@@ -0,0 +1,28 @@
+<%= render :partial => 'navigation', :locals => { :path => @path, :kind => 'file', :revision => @rev } %>
+
+<% colors = Hash.new {|k,v| k[v] = (k.size % 12) } %>
+
+
+
+<% html_title(l(:button_annotate)) -%>
+
+<% content_for :header_tags do %>
+<%= stylesheet_link_tag 'scm' %>
+<% end %>
diff --git a/app/views/repositories/browse.rhtml b/app/views/repositories/browse.rhtml
index 0ba24fd86..4029a77d2 100644
--- a/app/views/repositories/browse.rhtml
+++ b/app/views/repositories/browse.rhtml
@@ -7,7 +7,8 @@
<%= render :partial => 'navigation', :locals => { :path => @path, :kind => 'dir', :revision => @rev } %>
<%= render :partial => 'dir_list' %>
+<%= render_properties(@properties) %>
<% content_for :header_tags do %>
<%= stylesheet_link_tag "scm" %>
-<% end %>
\ No newline at end of file
+<% end %>
diff --git a/app/views/repositories/changes.rhtml b/app/views/repositories/changes.rhtml
index 5d1db96ba..ca5c58328 100644
--- a/app/views/repositories/changes.rhtml
+++ b/app/views/repositories/changes.rhtml
@@ -1,15 +1,19 @@
<%= render :partial => 'navigation', :locals => { :path => @path, :kind => (@entry ? @entry.kind : nil), :revision => @rev } %>
-<%=h @entry.name %>
-
-<% if @repository.supports_cat? %>
-<% if @entry.is_text? %>
-<%= link_to l(:button_view), {:action => 'entry', :id => @project, :path => @path, :rev => @rev } %> |
+<% if @repository.supports_cat? %>
+ <%= link_to l(:button_view), {:action => 'entry', :id => @project, :path => to_path_param(@path), :rev => @rev } %> |
<% end %>
-<%= link_to l(:button_download), {:action => 'entry', :id => @project, :path => @path, :rev => @rev, :format => 'raw' } %>
+<% if @repository.supports_annotate? %>
+ <%= link_to l(:button_annotate), {:action => 'annotate', :id => @project, :path => to_path_param(@path), :rev => @rev } %> |
+<% end %>
+<%= link_to(l(:button_download), {:action => 'entry', :id => @project, :path => to_path_param(@path), :rev => @rev, :format => 'raw' }) if @repository.supports_cat? %>
<%= "(#{number_to_human_size(@entry.size)})" if @entry.size %>
-<% end %>
-<%= render :partial => 'revisions', :locals => {:project => @project, :path => @path, :revisions => @changesets, :entry => @entry }%>
+<%= render_properties(@properties) %>
+
+<%= render(:partial => 'revisions',
+ :locals => {:project => @project, :path => @path, :revisions => @changesets, :entry => @entry }) unless @changesets.empty? %>
+
+<% html_title(l(:label_change_plural)) -%>
diff --git a/app/views/repositories/diff.rhtml b/app/views/repositories/diff.rhtml
index c1c33a495..52a5d6057 100644
--- a/app/views/repositories/diff.rhtml
+++ b/app/views/repositories/diff.rhtml
@@ -1,4 +1,4 @@
-<%= l(:label_revision) %> <%= @rev %>: <%= @path.gsub(/^.*\//, '') %>
+<%= l(:label_revision) %> <%= format_revision(@rev) %> <%= @path.gsub(/^.*\//, '') %>
<% form_tag({ :controller => 'repositories', :action => 'diff'}, :method => 'get') do %>
@@ -11,82 +11,16 @@
<%= select_tag 'type', options_for_select([[l(:label_diff_inline), "inline"], [l(:label_diff_side_by_side), "sbs"]], @diff_type), :onchange => "if (this.value != '') {this.form.submit()}" %>
<% end %>
-
+
+<%= l(:label_export_to) %>
+<%= link_to 'Unified diff', params.merge(:format => 'diff') %>
+
+
+<% html_title(with_leading_slash(@path), 'Diff') -%>
<% content_for :header_tags do %>
<%= stylesheet_link_tag "scm" %>
diff --git a/app/views/repositories/entry.rhtml b/app/views/repositories/entry.rhtml
index 94db240ab..8e1e1992c 100644
--- a/app/views/repositories/entry.rhtml
+++ b/app/views/repositories/entry.rhtml
@@ -1,24 +1,6 @@
<%= render :partial => 'navigation', :locals => { :path => @path, :kind => 'file', :revision => @rev } %>
-
+<%= render :partial => 'common/file', :locals => {:filename => @path, :content => @content} %>
<% content_for :header_tags do %>
<%= stylesheet_link_tag "scm" %>
diff --git a/app/views/repositories/revision.rhtml b/app/views/repositories/revision.rhtml
index 32f8583a7..80ac3bd1a 100644
--- a/app/views/repositories/revision.rhtml
+++ b/app/views/repositories/revision.rhtml
@@ -1,14 +1,28 @@
-<% form_tag do %>
-<%= l(:label_revision) %>: <%= text_field_tag 'rev', @rev, :size => 5 %>
-<%= submit_tag 'OK' %>
-<% end %>
+ «
+ <% unless @changeset.previous.nil? -%>
+ <%= link_to l(:label_previous), :controller => 'repositories', :action => 'revision', :id => @project, :rev => @changeset.previous.revision %>
+ <% else -%>
+ <%= l(:label_previous) %>
+ <% end -%>
+|
+ <% unless @changeset.next.nil? -%>
+ <%= link_to l(:label_next), :controller => 'repositories', :action => 'revision', :id => @project, :rev => @changeset.next.revision %>
+ <% else -%>
+ <%= l(:label_next) %>
+ <% end -%>
+ »
+
+ <% form_tag({:controller => 'repositories', :action => 'revision', :id => @project, :rev => nil}, :method => :get) do %>
+ <%= text_field_tag 'rev', @rev, :size => 5 %>
+ <%= submit_tag 'OK', :name => nil %>
+ <% end %>
-<%= l(:label_revision) %> <%= @changeset.revision %>
+<%= l(:label_revision) %> <%= format_revision(@changeset.revision) %>
<% if @changeset.scmid %>ID: <%= @changeset.scmid %> <% end %>
-<%= @changeset.committer %>, <%= format_time(@changeset.committed_on) %>
+<%= @changeset.committer.to_s.split('<').first %>, <%= format_time(@changeset.committed_on) %>
<%= textilizable @changeset.comments %>
@@ -32,19 +46,26 @@
<% @changes.each do |change| %>
-
<%= change.path %> <%= "(#{change.revision})" unless change.revision.blank? %>
+
+<% if change.action == "D" -%>
+ <%= change.path -%>
+<% else -%>
+ <%= link_to change.path, :action => 'entry', :id => @project, :path => to_path_param(change.relative_path), :rev => @changeset.revision -%>
+<% end -%>
+<%= "(#{change.revision})" unless change.revision.blank? %>
<% if change.action == "M" %>
-<%= link_to l(:label_view_diff), :action => 'diff', :id => @project, :path => change.path, :rev => @changeset.revision %>
+<%= link_to l(:label_view_diff), :action => 'diff', :id => @project, :path => to_path_param(change.relative_path), :rev => @changeset.revision %>
<% end %>
<% end %>
-<%= pagination_links_full @changes_pages, :rev => @changeset.revision %>
-[ <%= @changes_pages.current.first_item %> - <%= @changes_pages.current.last_item %> / <%= @changes_count %> ]
+
<% content_for :header_tags do %>
<%= stylesheet_link_tag "scm" %>
<% end %>
+
+<% html_title("#{l(:label_revision)} #{@changeset.revision}") -%>
diff --git a/app/views/repositories/revisions.rhtml b/app/views/repositories/revisions.rhtml
index 882d5ea4f..ac5919dd6 100644
--- a/app/views/repositories/revisions.rhtml
+++ b/app/views/repositories/revisions.rhtml
@@ -1,7 +1,7 @@
-<% form_tag do %>
-
<%= l(:label_revision) %>: <%= text_field_tag 'rev', @rev, :size => 5 %>
-<%= submit_tag 'OK' %>
+<% form_tag({:action => 'revision', :id => @project}) do %>
+<%= l(:label_revision) %>: <%= text_field_tag 'rev', @rev, :size => 5 %>
+<%= submit_tag 'OK' %>
<% end %>
@@ -9,10 +9,11 @@
<%= render :partial => 'revisions', :locals => {:project => @project, :path => '', :revisions => @changesets, :entry => nil }%>
-<%= pagination_links_full @changeset_pages %>
-[ <%= @changeset_pages.current.first_item %> - <%= @changeset_pages.current.last_item %> / <%= @changeset_count %> ]
+
<% content_for :header_tags do %>
<%= stylesheet_link_tag "scm" %>
<%= auto_discovery_link_tag(:atom, params.merge({:format => 'atom', :page => nil, :key => User.current.rss_key})) %>
<% end %>
+
+<% html_title(l(:label_revision_plural)) -%>
diff --git a/app/views/repositories/show.rhtml b/app/views/repositories/show.rhtml
index c9f44d575..9a73183e8 100644
--- a/app/views/repositories/show.rhtml
+++ b/app/views/repositories/show.rhtml
@@ -1,11 +1,16 @@
<%= link_to l(:label_statistics), {:action => 'stats', :id => @project}, :class => 'icon icon-stats' %>
+
+<% if !@entries.nil? && authorize_for('repositories', 'browse') -%>
+<% form_tag(:action => 'browse', :id => @project) do -%>
+| <%= l(:label_revision) %>: <%= text_field_tag 'rev', @rev, :size => 5 %>
+<% end -%>
+<% end -%>
<%= l(:label_repository) %> (<%= @repository.scm_name %>)
<% if !@entries.nil? && authorize_for('repositories', 'browse') %>
-<%= l(:label_browse) %>
<%= render :partial => 'dir_list' %>
<% end %>
@@ -21,3 +26,5 @@
<% content_for :header_tags do %>
<%= stylesheet_link_tag "scm" %>
<% end %>
+
+<% html_title(l(:label_repository)) -%>
diff --git a/app/views/repositories/stats.rhtml b/app/views/repositories/stats.rhtml
index 7a9423f8c..1e617577e 100644
--- a/app/views/repositories/stats.rhtml
+++ b/app/views/repositories/stats.rhtml
@@ -1,11 +1,12 @@
<%= l(:label_statistics) %>
-
-
-<%= tag("embed", :width => 500, :height => 300, :type => "image/svg+xml", :src => url_for(:controller => 'repositories', :action => 'graph', :id => @project, :graph => "commits_per_month")) %>
-
-<%= tag("embed", :width => 500, :height => 300, :type => "image/svg+xml", :src => url_for(:controller => 'repositories', :action => 'graph', :id => @project, :graph => "commits_per_author")) %>
-
-
-
-<%= link_to l(:button_back), :action => 'show', :id => @project %>
\ No newline at end of file
+
+<%= tag("embed", :width => 800, :height => 300, :type => "image/svg+xml", :src => url_for(:controller => 'repositories', :action => 'graph', :id => @project, :graph => "commits_per_month")) %>
+
+
+<%= tag("embed", :width => 800, :height => 400, :type => "image/svg+xml", :src => url_for(:controller => 'repositories', :action => 'graph', :id => @project, :graph => "commits_per_author")) %>
+
+
+<%= link_to l(:button_back), :action => 'show', :id => @project %>
+
+<% html_title(l(:label_repository), l(:label_statistics)) -%>
diff --git a/app/views/roles/_form.rhtml b/app/views/roles/_form.rhtml
index b77cbacdf..4aad45471 100644
--- a/app/views/roles/_form.rhtml
+++ b/app/views/roles/_form.rhtml
@@ -4,11 +4,15 @@
<%= f.text_field :name, :required => true %>
<%= f.check_box :assignable %>
+<% if @role.new_record? && @roles.any? %>
+
<%= l(:label_copy_workflow_from) %>
+<%= select_tag(:copy_workflow_from, content_tag("option") + options_from_collection_for_select(@roles, :id, :name)) %>
+<% end %>
<% end %>
<%= l(:label_permissions) %>
-
+
<% perms_by_module = @permissions.group_by {|p| p.project_module.to_s} %>
<% perms_by_module.keys.sort.each do |mod| %>
<%= mod.blank? ? l(:label_project) : mod.humanize %>
@@ -20,6 +24,6 @@
<% end %>
<% end %>
- <%= check_all_links 'role_form' %>
+ <%= check_all_links 'permissions' %>
<%= hidden_field_tag 'role[permissions][]', '' %>
diff --git a/app/views/roles/list.rhtml b/app/views/roles/list.rhtml
index bdea2475f..93b821387 100644
--- a/app/views/roles/list.rhtml
+++ b/app/views/roles/list.rhtml
@@ -24,11 +24,14 @@
<%= button_to(l(:button_delete), { :action => 'destroy', :id => role }, :confirm => l(:text_are_you_sure), :class => "button-small", :disabled => role.builtin? ) %>
+
<% end %>
-<%= pagination_links_full @role_pages %>
+
<%= link_to l(:label_permissions_report), :action => 'report' %>
+
+<% html_title(l(:label_role_plural)) -%>
diff --git a/app/views/roles/report.rhtml b/app/views/roles/report.rhtml
index 98c3b651e..8e254379e 100644
--- a/app/views/roles/report.rhtml
+++ b/app/views/roles/report.rhtml
@@ -1,13 +1,17 @@
<%=l(:label_permissions_report)%>
<% form_tag({:action => 'report'}, :id => 'permissions_form') do %>
-<%= hidden_field_tag 'permissions[0]', '' %>
+<%= hidden_field_tag 'permissions[0]', '', :id => nil %>
<%=l(:label_permissions)%>
<% @roles.each do |role| %>
- <%= content_tag(role.builtin? ? 'em' : 'span', h(role.name)) %>
+
+ <%= content_tag(role.builtin? ? 'em' : 'span', h(role.name)) %>
+ <%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('input.role-#{role.id}')",
+ :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %>
+
<% end %>
@@ -18,12 +22,16 @@
<%= content_tag('th', mod.humanize, :colspan => (@roles.size + 1), :align => 'left') %>
<% end %>
<% perms_by_module[mod].each do |permission| %>
-
- <%= permission.name.to_s.humanize %>
+
+
+ <%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('.permission-#{permission.name} input')",
+ :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %>
+ <%= permission.name.to_s.humanize %>
+
<% @roles.each do |role| %>
<% if role.setable_permissions.include? permission %>
- <%= check_box_tag "permissions[#{role.id}][]", permission.name, (role.permissions.include? permission.name) %>
+ <%= check_box_tag "permissions[#{role.id}][]", permission.name, (role.permissions.include? permission.name), :id => nil, :class => "role-#{role.id}" %>
<% end %>
<% end %>
diff --git a/app/views/roles/workflow.rhtml b/app/views/roles/workflow.rhtml
index 2bc2abd51..0f08b0d22 100644
--- a/app/views/roles/workflow.rhtml
+++ b/app/views/roles/workflow.rhtml
@@ -35,18 +35,16 @@
<% for old_status in @statuses %>
- <%= old_status.name %>
- <% for new_status in @statuses %>
+ <%= old_status.name %>
+ <% new_status_ids_allowed = old_status.find_new_statuses_allowed_to(@role, @tracker).collect(&:id) -%>
+ <% for new_status in @statuses -%>
-
- checked="checked"<%end%>
- >
+ <%= 'checked="checked"' if new_status_ids_allowed.include? new_status.id %>>
- <% end %>
-
+ <% end -%>
<% end %>
@@ -56,3 +54,5 @@
<% end %>
<% end %>
+
+<% html_title(l(:label_workflow)) -%>
diff --git a/app/views/search/index.rhtml b/app/views/search/index.rhtml
index 695107fe8..cb5b70a4c 100644
--- a/app/views/search/index.rhtml
+++ b/app/views/search/index.rhtml
@@ -4,27 +4,33 @@
<% form_tag({}, :method => :get) do %>
<%= text_field_tag 'q', @question, :size => 60, :id => 'search-input' %>
<%= javascript_tag "Field.focus('search-input')" %>
-
-<% @object_types.each do |t| %>
-<%= check_box_tag t, 1, @scope.include?(t) %> <%= l("label_#{t.singularize}_plural")%>
-<% end %>
-
+<%= project_select_tag %>
<%= check_box_tag 'all_words', 1, @all_words %> <%= l(:label_all_words) %>
<%= check_box_tag 'titles_only', 1, @titles_only %> <%= l(:label_search_titles_only) %>
-<%= submit_tag l(:button_submit), :name => 'submit' %>
+
+<% @object_types.each do |t| %>
+<%= check_box_tag t, 1, @scope.include?(t) %> <%= type_label(t) %>
+<% end %>
+
+
+<%= submit_tag l(:button_submit), :name => 'submit' %>
<% end %>
<% if @results %>
- <%= l(:label_result_plural) %>
-
+
+ <%= render_results_by_type(@results_by_type) unless @scope.size == 1 %>
+
+
+ <%= l(:label_result_plural) %> (<%= @results_by_type.values.sum %>)
+
<% @results.each do |e| %>
- <%= link_to highlight_tokens(truncate(e.event_title, 255), @tokens), e.event_url %>
- <%= highlight_tokens(e.event_description, @tokens) %>
- <%= format_time(e.event_datetime) %>
+ <%= content_tag('span', h(e.project), :class => 'project') unless @project == e.project %> <%= link_to highlight_tokens(truncate(e.event_title, 255), @tokens), e.event_url %>
+ <%= highlight_tokens(e.event_description, @tokens) %>
+ <%= format_time(e.event_datetime) %>
<% end %>
-
+
<% end %>
@@ -41,3 +47,5 @@
}, :href => url_for(params.merge(:previous => nil, :offset => @pagination_next_date.strftime("%Y%m%d%H%M%S"))) %>
<% end %>
+
+<% html_title(l(:label_search)) -%>
diff --git a/app/views/settings/_authentication.rhtml b/app/views/settings/_authentication.rhtml
new file mode 100644
index 000000000..6bf20cbce
--- /dev/null
+++ b/app/views/settings/_authentication.rhtml
@@ -0,0 +1,27 @@
+<% form_tag({:action => 'edit', :tab => 'authentication'}) do %>
+
+
+
<%= l(:setting_login_required) %>
+<%= check_box_tag 'settings[login_required]', 1, Setting.login_required? %><%= hidden_field_tag 'settings[login_required]', 0 %>
+
+
<%= l(:setting_autologin) %>
+<%= select_tag 'settings[autologin]', options_for_select( [[l(:label_disabled), "0"]] + [1, 7, 30, 365].collect{|days| [lwr(:actionview_datehelper_time_in_words_day, days), days.to_s]}, Setting.autologin) %>
+
+
<%= l(:setting_self_registration) %>
+<%= select_tag 'settings[self_registration]',
+ options_for_select( [[l(:label_disabled), "0"],
+ [l(:label_registration_activation_by_email), "1"],
+ [l(:label_registration_manual_activation), "2"],
+ [l(:label_registration_automatic_activation), "3"]
+ ], Setting.self_registration ) %>
+
+
<%= l(:label_password_lost) %>
+<%= check_box_tag 'settings[lost_password]', 1, Setting.lost_password? %><%= hidden_field_tag 'settings[lost_password]', 0 %>
+
+
+
+ <%= link_to l(:label_ldap_authentication), :controller => 'auth_sources', :action => 'list' %>
+
+
+<%= submit_tag l(:button_save) %>
+<% end %>
diff --git a/app/views/settings/_general.rhtml b/app/views/settings/_general.rhtml
new file mode 100644
index 000000000..bb56c43db
--- /dev/null
+++ b/app/views/settings/_general.rhtml
@@ -0,0 +1,52 @@
+<% form_tag({:action => 'edit'}) do %>
+
+
+
<%= l(:setting_app_title) %>
+<%= text_field_tag 'settings[app_title]', Setting.app_title, :size => 30 %>
+
+
<%= l(:setting_welcome_text) %>
+<%= text_area_tag 'settings[welcome_text]', Setting.welcome_text, :cols => 60, :rows => 5, :class => 'wiki-edit' %>
+<%= wikitoolbar_for 'settings[welcome_text]' %>
+
+
<%= l(:label_theme) %>
+<%= select_tag 'settings[ui_theme]', options_for_select( ([[l(:label_default), '']] + Redmine::Themes.themes.collect {|t| [t.name, t.id]}), Setting.ui_theme) %>
+
+
<%= l(:setting_default_language) %>
+<%= select_tag 'settings[default_language]', options_for_select( lang_options_for_select(false), Setting.default_language) %>
+
+
<%= l(:setting_date_format) %>
+<%= select_tag 'settings[date_format]', options_for_select( [[l(:label_language_based), '']] + Setting::DATE_FORMATS.collect {|f| [Date.today.strftime(f), f]}, Setting.date_format) %>
+
+
<%= l(:setting_time_format) %>
+<%= select_tag 'settings[time_format]', options_for_select( [[l(:label_language_based), '']] + Setting::TIME_FORMATS.collect {|f| [Time.now.strftime(f), f]}, Setting.time_format) %>
+
+
<%= l(:setting_user_format) %>
+<%= select_tag 'settings[user_format]', options_for_select( @options[:user_format], Setting.user_format.to_s ) %>
+
+
<%= l(:setting_attachment_max_size) %>
+<%= text_field_tag 'settings[attachment_max_size]', Setting.attachment_max_size, :size => 6 %> KB
+
+
<%= l(:setting_per_page_options) %>
+<%= text_field_tag 'settings[per_page_options]', Setting.per_page_options_array.join(', '), :size => 20 %><%= l(:text_comma_separated) %>
+
+
<%= l(:setting_activity_days_default) %>
+<%= text_field_tag 'settings[activity_days_default]', Setting.activity_days_default, :size => 6 %> <%= l(:label_day_plural) %>
+
+
<%= l(:setting_host_name) %>
+<%= text_field_tag 'settings[host_name]', Setting.host_name, :size => 60 %>
+
+
<%= l(:setting_protocol) %>
+<%= select_tag 'settings[protocol]', options_for_select(['http', 'https'], Setting.protocol) %>
+
+
<%= l(:setting_text_formatting) %>
+<%= select_tag 'settings[text_formatting]', options_for_select([[l(:label_none), "0"], ["textile", "textile"]], Setting.text_formatting) %>
+
+
<%= l(:setting_wiki_compression) %>
+<%= select_tag 'settings[wiki_compression]', options_for_select( [[l(:label_none), 0], ["gzip", "gzip"]], Setting.wiki_compression) %>
+
+
<%= l(:setting_feeds_limit) %>
+<%= text_field_tag 'settings[feeds_limit]', Setting.feeds_limit, :size => 6 %>
+
+
+<%= submit_tag l(:button_save) %>
+<% end %>
diff --git a/app/views/settings/_issues.rhtml b/app/views/settings/_issues.rhtml
new file mode 100644
index 000000000..bbd7356fd
--- /dev/null
+++ b/app/views/settings/_issues.rhtml
@@ -0,0 +1,23 @@
+<% form_tag({:action => 'edit', :tab => 'issues'}) do %>
+
+
+
<%= l(:setting_cross_project_issue_relations) %>
+<%= check_box_tag 'settings[cross_project_issue_relations]', 1, Setting.cross_project_issue_relations? %><%= hidden_field_tag 'settings[cross_project_issue_relations]', 0 %>
+
+
<%= l(:setting_display_subprojects_issues) %>
+<%= check_box_tag 'settings[display_subprojects_issues]', 1, Setting.display_subprojects_issues? %><%= hidden_field_tag 'settings[display_subprojects_issues]', 0 %>
+
+
<%= l(:setting_issues_export_limit) %>
+<%= text_field_tag 'settings[issues_export_limit]', Setting.issues_export_limit, :size => 6 %>
+
+
+<%= l(:setting_issue_list_default_columns) %>
+<%= hidden_field_tag 'settings[issue_list_default_columns][]', '' %>
+<% Query.new.available_columns.each do |column| %>
+ <%= check_box_tag 'settings[issue_list_default_columns][]', column.name, Setting.issue_list_default_columns.include?(column.name.to_s) %>
+ <%= column.caption %>
+<% end %>
+
+
+<%= submit_tag l(:button_save) %>
+<% end %>
diff --git a/app/views/settings/_mail_handler.rhtml b/app/views/settings/_mail_handler.rhtml
new file mode 100644
index 000000000..830b1ba4a
--- /dev/null
+++ b/app/views/settings/_mail_handler.rhtml
@@ -0,0 +1,18 @@
+<% form_tag({:action => 'edit', :tab => 'mail_handler'}) do %>
+
+
+
<%= l(:setting_mail_handler_api_enabled) %>
+<%= check_box_tag 'settings[mail_handler_api_enabled]', 1, Setting.mail_handler_api_enabled?,
+ :onclick => "if (this.checked) { Form.Element.enable('settings_mail_handler_api_key'); } else { Form.Element.disable('settings_mail_handler_api_key'); }" %>
+<%= hidden_field_tag 'settings[mail_handler_api_enabled]', 0 %>
+
+
<%= l(:setting_mail_handler_api_key) %>
+<%= text_field_tag 'settings[mail_handler_api_key]', Setting.mail_handler_api_key,
+ :size => 30,
+ :id => 'settings_mail_handler_api_key',
+ :disabled => !Setting.mail_handler_api_enabled? %>
+<%= link_to_function l(:label_generate_key), "if ($('settings_mail_handler_api_key').disabled == false) { $('settings_mail_handler_api_key').value = randomKey(20) }" %>
+
+
+<%= submit_tag l(:button_save) %>
+<% end %>
diff --git a/app/views/settings/_notifications.rhtml b/app/views/settings/_notifications.rhtml
new file mode 100644
index 000000000..36701463a
--- /dev/null
+++ b/app/views/settings/_notifications.rhtml
@@ -0,0 +1,36 @@
+<% if @deliveries %>
+<% form_tag({:action => 'edit', :tab => 'notifications'}) do %>
+
+
+
<%= l(:setting_mail_from) %>
+<%= text_field_tag 'settings[mail_from]', Setting.mail_from, :size => 60 %>
+
+
<%= l(:setting_bcc_recipients) %>
+<%= check_box_tag 'settings[bcc_recipients]', 1, Setting.bcc_recipients? %>
+<%= hidden_field_tag 'settings[bcc_recipients]', 0 %>
+
+
+<%=l(:text_select_mail_notifications)%>
+<% @notifiables.each do |notifiable| %>
+ <%= check_box_tag 'settings[notified_events][]', notifiable, Setting.notified_events.include?(notifiable) %>
+ <%= l_or_humanize(notifiable) %>
+<% end %>
+<%= hidden_field_tag 'settings[notified_events][]', '' %>
+<%= check_all_links('notified_events') %>
+
+
+<%= l(:setting_emails_footer) %>
+<%= text_area_tag 'settings[emails_footer]', Setting.emails_footer, :class => 'wiki-edit', :rows => 5 %>
+
+
+
+<%= link_to l(:label_send_test_email), :controller => 'admin', :action => 'test_email' %>
+
+
+<%= submit_tag l(:button_save) %>
+<% end %>
+<% else %>
+
+<%= simple_format(l(:text_email_delivery_not_configured)) %>
+
+<% end %>
diff --git a/app/views/settings/_projects.rhtml b/app/views/settings/_projects.rhtml
new file mode 100644
index 000000000..1cd4f6e9b
--- /dev/null
+++ b/app/views/settings/_projects.rhtml
@@ -0,0 +1,12 @@
+<% form_tag({:action => 'edit', :tab => 'projects'}) do %>
+
+
+
<%= l(:setting_default_projects_public) %>
+<%= check_box_tag 'settings[default_projects_public]', 1, Setting.default_projects_public? %><%= hidden_field_tag 'settings[default_projects_public]', 0 %>
+
+
<%= l(:setting_sequential_project_identifiers) %>
+<%= check_box_tag 'settings[sequential_project_identifiers]', 1, Setting.sequential_project_identifiers? %><%= hidden_field_tag 'settings[sequential_project_identifiers]', 0 %>
+
+
+<%= submit_tag l(:button_save) %>
+<% end %>
diff --git a/app/views/settings/_repositories.rhtml b/app/views/settings/_repositories.rhtml
new file mode 100644
index 000000000..a8c924430
--- /dev/null
+++ b/app/views/settings/_repositories.rhtml
@@ -0,0 +1,36 @@
+<% form_tag({:action => 'edit', :tab => 'repositories'}) do %>
+
+
+
<%= l(:setting_autofetch_changesets) %>
+<%= check_box_tag 'settings[autofetch_changesets]', 1, Setting.autofetch_changesets? %><%= hidden_field_tag 'settings[autofetch_changesets]', 0 %>
+
+
<%= l(:setting_sys_api_enabled) %>
+<%= check_box_tag 'settings[sys_api_enabled]', 1, Setting.sys_api_enabled? %><%= hidden_field_tag 'settings[sys_api_enabled]', 0 %>
+
+
<%= l(:setting_enabled_scm) %>
+<% REDMINE_SUPPORTED_SCM.each do |scm| -%>
+<%= check_box_tag 'settings[enabled_scm][]', scm, Setting.enabled_scm.include?(scm) %> <%= scm %>
+<% end -%>
+<%= hidden_field_tag 'settings[enabled_scm][]', '' %>
+
+
+
<%= l(:setting_repositories_encodings) %>
+<%= text_field_tag 'settings[repositories_encodings]', Setting.repositories_encodings, :size => 60 %><%= l(:text_comma_separated) %>
+
+
<%= l(:setting_commit_logs_encoding) %>
+<%= select_tag 'settings[commit_logs_encoding]', options_for_select(Setting::ENCODINGS, Setting.commit_logs_encoding) %>
+
+
+<%= l(:text_issues_ref_in_commit_messages) %>
+<%= l(:setting_commit_ref_keywords) %>
+<%= text_field_tag 'settings[commit_ref_keywords]', Setting.commit_ref_keywords, :size => 30 %><%= l(:text_comma_separated) %>
+
+<%= l(:setting_commit_fix_keywords) %>
+<%= text_field_tag 'settings[commit_fix_keywords]', Setting.commit_fix_keywords, :size => 30 %>
+ <%= l(:label_applied_status) %>: <%= select_tag 'settings[commit_fix_status_id]', options_for_select( [["", 0]] + IssueStatus.find(:all).collect{|status| [status.name, status.id.to_s]}, Setting.commit_fix_status_id) %>
+ <%= l(:field_done_ratio) %>: <%= select_tag 'settings[commit_fix_done_ratio]', options_for_select( [[l(:label_no_change_option), '']] + ((0..10).to_a.collect {|r| ["#{r*10} %", "#{r*10}"] }), Setting.commit_fix_done_ratio) %>
+<%= l(:text_comma_separated) %>
+
+
+<%= submit_tag l(:button_save) %>
+<% end %>
diff --git a/app/views/settings/edit.rhtml b/app/views/settings/edit.rhtml
index 9b4cc2d57..c99a13960 100644
--- a/app/views/settings/edit.rhtml
+++ b/app/views/settings/edit.rhtml
@@ -1,105 +1,23 @@
<%= l(:label_settings) %>
-
-<% form_tag({:action => 'edit'}) do %>
-
-
<%= l(:setting_app_title) %>
-<%= text_field_tag 'settings[app_title]', Setting.app_title, :size => 30 %>
+<% selected_tab = params[:tab] ? params[:tab].to_s : administration_settings_tabs.first[:name] %>
-
<%= l(:setting_app_subtitle) %>
-<%= text_field_tag 'settings[app_subtitle]', Setting.app_subtitle, :size => 60 %>
-
-
<%= l(:setting_welcome_text) %>
-<%= text_area_tag 'settings[welcome_text]', Setting.welcome_text, :cols => 60, :rows => 5, :class => 'wiki-edit' %>
-<%= wikitoolbar_for 'settings[welcome_text]' %>
-
-
<%= l(:label_theme) %>
-<%= select_tag 'settings[ui_theme]', options_for_select( ([[l(:label_default), '']] + Redmine::Themes.themes.collect {|t| [t.name, t.id]}), Setting.ui_theme) %>
-
-
<%= l(:setting_default_language) %>
-<%= select_tag 'settings[default_language]', options_for_select( lang_options_for_select(false), Setting.default_language) %>
-
-
<%= l(:setting_date_format) %>
-<%= select_tag 'settings[date_format]', options_for_select( [[l(:label_language_based), '']] + Setting::DATE_FORMATS.collect {|f| [Date.today.strftime(f), f]}, Setting.date_format) %>
-
-
<%= l(:setting_time_format) %>
-<%= select_tag 'settings[time_format]', options_for_select( [[l(:label_language_based), '']] + Setting::TIME_FORMATS.collect {|f| [Time.now.strftime(f), f]}, Setting.time_format) %>
-
-
<%= l(:setting_attachment_max_size) %>
-<%= text_field_tag 'settings[attachment_max_size]', Setting.attachment_max_size, :size => 6 %> KB
-
-
<%= l(:setting_issues_export_limit) %>
-<%= text_field_tag 'settings[issues_export_limit]', Setting.issues_export_limit, :size => 6 %>
-
-
<%= l(:setting_cross_project_issue_relations) %>
-<%= check_box_tag 'settings[cross_project_issue_relations]', 1, Setting.cross_project_issue_relations? %><%= hidden_field_tag 'settings[cross_project_issue_relations]', 0 %>
-
-
<%= l(:setting_mail_from) %>
-<%= text_field_tag 'settings[mail_from]', Setting.mail_from, :size => 60 %>
-
-
<%= l(:setting_host_name) %>
-<%= text_field_tag 'settings[host_name]', Setting.host_name, :size => 60 %>
-
-
<%= l(:setting_protocol) %>
-<%= select_tag 'settings[protocol]', options_for_select(['http', 'https'], Setting.protocol) %>
-
-
<%= l(:setting_text_formatting) %>
-<%= select_tag 'settings[text_formatting]', options_for_select([[l(:label_none), "0"], ["textile", "textile"]], Setting.text_formatting) %>
-
-
<%= l(:setting_wiki_compression) %>
-<%= select_tag 'settings[wiki_compression]', options_for_select( [[l(:label_none), 0], ["gzip", "gzip"]], Setting.wiki_compression) %>
-
-
<%= l(:setting_feeds_limit) %>
-<%= text_field_tag 'settings[feeds_limit]', Setting.feeds_limit, :size => 6 %>
-
-
<%= l(:setting_autofetch_changesets) %>
-<%= check_box_tag 'settings[autofetch_changesets]', 1, Setting.autofetch_changesets? %><%= hidden_field_tag 'settings[autofetch_changesets]', 0 %>
-
-
<%= l(:setting_sys_api_enabled) %>
-<%= check_box_tag 'settings[sys_api_enabled]', 1, Setting.sys_api_enabled? %><%= hidden_field_tag 'settings[sys_api_enabled]', 0 %>
-
-
<%= l(:setting_repositories_encodings) %>
-<%= text_field_tag 'settings[repositories_encodings]', Setting.repositories_encodings, :size => 60 %><%= l(:text_comma_separated) %>
+
+
+<% administration_settings_tabs.each do |tab| -%>
+ <%= link_to l(tab[:label]), { :tab => tab[:name] },
+ :id => "tab-#{tab[:name]}",
+ :class => (tab[:name] != selected_tab ? nil : 'selected'),
+ :onclick => "showTab('#{tab[:name]}'); this.blur(); return false;" %>
+<% end -%>
+
-
<%= l(:setting_issue_list_default_columns) %>
-<%= hidden_field_tag 'settings[issue_list_default_columns][]', '' %>
-<% Query.new.available_columns.each do |column| %>
- <%= check_box_tag 'settings[issue_list_default_columns][]', column.name, Setting.issue_list_default_columns.include?(column.name.to_s) %>
- <%= column.caption %>
-<% end %>
-
+<% administration_settings_tabs.each do |tab| -%>
+<%= content_tag('div', render(:partial => tab[:partial]),
+ :id => "tab-content-#{tab[:name]}",
+ :style => (tab[:name] != selected_tab ? 'display:none' : nil),
+ :class => 'tab-content') %>
+<% end -%>
-
<%= l(:label_authentication) %>
-<%= l(:setting_login_required) %>
-<%= check_box_tag 'settings[login_required]', 1, Setting.login_required? %><%= hidden_field_tag 'settings[login_required]', 0 %>
-
-<%= l(:setting_autologin) %>
-<%= select_tag 'settings[autologin]', options_for_select( [[l(:label_disabled), "0"]] + [1, 7, 30, 365].collect{|days| [lwr(:actionview_datehelper_time_in_words_day, days), days.to_s]}, Setting.autologin) %>
-
-<%= l(:setting_self_registration) %>
-<%= select_tag 'settings[self_registration]',
- options_for_select( [[l(:label_disabled), "0"],
- [l(:label_registration_activation_by_email), "1"],
- [l(:label_registration_manual_activation), "2"],
- [l(:label_registration_automatic_activation), "3"]
- ], Setting.self_registration ) %>
-
-<%= l(:label_password_lost) %>
-<%= check_box_tag 'settings[lost_password]', 1, Setting.lost_password? %><%= hidden_field_tag 'settings[lost_password]', 0 %>
-
-
-
<%= l(:text_issues_ref_in_commit_messages) %>
-<%= l(:setting_commit_ref_keywords) %>
-<%= text_field_tag 'settings[commit_ref_keywords]', Setting.commit_ref_keywords, :size => 30 %><%= l(:text_comma_separated) %>
-
-<%= l(:setting_commit_fix_keywords) %>
-<%= text_field_tag 'settings[commit_fix_keywords]', Setting.commit_fix_keywords, :size => 30 %>
- <%= l(:label_applied_status) %>: <%= select_tag 'settings[commit_fix_status_id]', options_for_select( [["", 0]] + IssueStatus.find(:all).collect{|status| [status.name, status.id.to_s]}, Setting.commit_fix_status_id) %>
- <%= l(:field_done_ratio) %>: <%= select_tag 'settings[commit_fix_done_ratio]', options_for_select( [[l(:label_no_change_option), '']] + ((0..10).to_a.collect {|r| ["#{r*10} %", "#{r*10}"] }), Setting.commit_fix_done_ratio) %>
-<%= l(:text_comma_separated) %>
-
-
-<%= submit_tag l(:button_save) %>
-
-<% end %>
+<% html_title(l(:label_settings), l(:label_administration)) -%>
diff --git a/app/views/timelog/_date_range.rhtml b/app/views/timelog/_date_range.rhtml
new file mode 100644
index 000000000..ed84b16cf
--- /dev/null
+++ b/app/views/timelog/_date_range.rhtml
@@ -0,0 +1,28 @@
+
<%= l(:label_date_range) %>
+
+<%= radio_button_tag 'period_type', '1', !@free_period %>
+<%= select_tag 'period', options_for_period_select(params[:period]),
+ :onchange => 'this.form.onsubmit();',
+ :onfocus => '$("period_type_1").checked = true;' %>
+
+
+<%= radio_button_tag 'period_type', '2', @free_period %>
+
+<%= l(:label_date_from) %>
+<%= text_field_tag 'from', @from, :size => 10 %> <%= calendar_for('from') %>
+<%= l(:label_date_to) %>
+<%= text_field_tag 'to', @to, :size => 10 %> <%= calendar_for('to') %>
+
+<%= submit_tag l(:button_apply), :name => nil %>
+
+
+
+
+<% url_params = @free_period ? { :from => @from, :to => @to } : { :period => params[:period] } %>
+
+ <%= link_to(l(:label_details), url_params.merge({:controller => 'timelog', :action => 'details', :project_id => @project }),
+ :class => (@controller.action_name == 'details' ? 'selected' : nil)) %>
+ <%= link_to(l(:label_report), url_params.merge({:controller => 'timelog', :action => 'report', :project_id => @project}),
+ :class => (@controller.action_name == 'report' ? 'selected' : nil)) %>
+
+
diff --git a/app/views/timelog/_list.rhtml b/app/views/timelog/_list.rhtml
new file mode 100644
index 000000000..8aebd75de
--- /dev/null
+++ b/app/views/timelog/_list.rhtml
@@ -0,0 +1,41 @@
+
+
+
+<%= sort_header_tag('spent_on', :caption => l(:label_date), :default_order => 'desc') %>
+<%= sort_header_tag('user_id', :caption => l(:label_member)) %>
+<%= sort_header_tag('activity_id', :caption => l(:label_activity)) %>
+<%= sort_header_tag("#{Project.table_name}.name", :caption => l(:label_project)) %>
+<%= sort_header_tag('issue_id', :caption => l(:label_issue), :default_order => 'desc') %>
+<%= l(:field_comments) %>
+<%= sort_header_tag('hours', :caption => l(:field_hours)) %>
+
+
+
+
+<% entries.each do |entry| -%>
+">
+<%= format_date(entry.spent_on) %>
+<%=h entry.user %>
+<%=h entry.activity %>
+<%=h entry.project %>
+
+<% if entry.issue -%>
+<%= link_to_issue entry.issue %>: <%= h(truncate(entry.issue.subject, 50)) -%>
+<% end -%>
+
+
+<%= html_hours("%.2f" % entry.hours) %>
+
+<% if entry.editable_by?(User.current) -%>
+ <%= link_to image_tag('edit.png'), {:controller => 'timelog', :action => 'edit', :id => entry, :project_id => nil},
+ :title => l(:button_edit) %>
+ <%= link_to image_tag('delete.png'), {:controller => 'timelog', :action => 'destroy', :id => entry, :project_id => nil},
+ :confirm => l(:text_are_you_sure),
+ :method => :post,
+ :title => l(:button_delete) %>
+<% end -%>
+
+
+<% end -%>
+
+
diff --git a/app/views/timelog/_report_criteria.rhtml b/app/views/timelog/_report_criteria.rhtml
index 0b7e91cfd..c9a1cfb45 100644
--- a/app/views/timelog/_report_criteria.rhtml
+++ b/app/views/timelog/_report_criteria.rhtml
@@ -1,17 +1,19 @@
-<% @available_criterias[criterias[level]][:values].each do |value| %>
-
+<% @hours.collect {|h| h[criterias[level]].to_s}.uniq.each do |value| %>
+<% hours_for_value = select_hours(hours, criterias[level], value) -%>
+<% next if hours_for_value.empty? -%>
+
<%= ' ' * level %>
-<%= value.name %>
-<%= ' ' * (criterias.length - level - 1) %>
-<% hours_for_value = select_hours(hours, criterias[level], value.id) %>
- <% @periods.each do |period| %>
- <% sum = sum_hours(select_hours(hours_for_value, @columns, period.to_s)) %>
- <%= sum > 0 ? "%.2f" % sum : "-" %>
- <% end %>
+<%= h(format_criteria_value(criterias[level], value)) %>
+<%= ' ' * (criterias.length - level - 1) -%>
+ <% total = 0 -%>
+ <% @periods.each do |period| -%>
+ <% sum = sum_hours(select_hours(hours_for_value, @columns, period.to_s)); total += sum -%>
+ <%= html_hours("%.2f" % sum) if sum > 0 %>
+ <% end -%>
+ <%= html_hours("%.2f" % total) if total > 0 %>
-<% if criterias.length > level+1 %>
+<% if criterias.length > level+1 -%>
<%= render(:partial => 'report_criteria', :locals => {:criterias => criterias, :hours => hours_for_value, :level => (level + 1)}) %>
-<% end %>
+<% end -%>
<% end %>
-<% reset_cycle %>
diff --git a/app/views/timelog/details.rhtml b/app/views/timelog/details.rhtml
index ac647c3a5..db62fae66 100644
--- a/app/views/timelog/details.rhtml
+++ b/app/views/timelog/details.rhtml
@@ -2,50 +2,33 @@
<%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'edit', :project_id => @project, :issue_id => @issue}, :class => 'icon icon-time' %>
+<%= render_timelog_breadcrumb %>
+
<%= l(:label_spent_time) %>
-<%= link_to(@project.name, {:action => 'details', :project_id => @project}) if @project %>
-<%= "/ " + link_to_issue(@issue) + h(": #{@issue.subject}") if @issue %>
+<% form_remote_tag( :url => {}, :method => :get, :update => 'content' ) do %>
+<%= hidden_field_tag 'project_id', params[:project_id] %>
+<%= hidden_field_tag 'issue_id', params[:issue_id] if @issue %>
+<%= render :partial => 'date_range' %>
+<% end %>
-<%= l(:label_total) %>: <%= lwr(:label_f_hour, @total_hours) %>
+
+
<%= l(:label_total) %>: <%= html_hours(lwr(:label_f_hour, @total_hours)) %>
+
<% unless @entries.empty? %>
-
-
-<%= sort_header_tag('spent_on', :caption => l(:label_date)) %>
-<%= sort_header_tag('user_id', :caption => l(:label_member)) %>
-<%= sort_header_tag('activity_id', :caption => l(:label_activity)) %>
-<%= sort_header_tag('issue_id', :caption => l(:label_issue)) %>
-<%= l(:field_comments) %>
-<%= sort_header_tag('hours', :caption => l(:field_hours)) %>
-
-
-
-<% @entries.each do |entry| %>
-">
-<%= format_date(entry.spent_on) %>
-<%= entry.user.name %>
-<%= entry.activity.name %>
-
- <% if entry.issue %>
-
- <%= link_to_issue entry.issue %>
-
- <%= render_issue_tooltip entry.issue %>
-
-
- <% end %>
-
-<%=h entry.comments %>
-<%= entry.hours %>
-<%= link_to_if_authorized(l(:button_edit), {:controller => 'timelog', :action => 'edit', :id => entry}, :class => "icon icon-edit") if entry.user_id == @owner_id %>
-
-<% end %>
-
-
+<%= render :partial => 'list', :locals => { :entries => @entries }%>
+
-
+
<%= l(:label_export_to) %>
-<%= link_to 'CSV', params.update(:export => 'csv'), :class => 'icon icon-csv' %>
-
-<% end %>
\ No newline at end of file
+<%= link_to 'Atom', {:issue_id => @issue, :format => 'atom', :key => User.current.rss_key}, :class => 'feed' %>
+<%= link_to 'CSV', params.merge(:format => 'csv'), :class => 'csv' %>
+
+<% end %>
+
+<% html_title l(:label_spent_time), l(:label_details) %>
+
+<% content_for :header_tags do %>
+ <%= auto_discovery_link_tag(:atom, {:issue_id => @issue, :format => 'atom', :key => User.current.rss_key}, :title => l(:label_spent_time)) %>
+<% end %>
diff --git a/app/views/timelog/edit.rhtml b/app/views/timelog/edit.rhtml
index 13d76f1ef..0dd3503ec 100644
--- a/app/views/timelog/edit.rhtml
+++ b/app/views/timelog/edit.rhtml
@@ -2,22 +2,19 @@
<% labelled_tabular_form_for :time_entry, @time_entry, :url => {:action => 'edit', :project_id => @time_entry.project} do |f| %>
<%= error_messages_for 'time_entry' %>
+<%= back_url_hidden_field_tag %>
<%= f.text_field :issue_id, :size => 6 %> <%= h("#{@time_entry.issue.tracker.name} ##{@time_entry.issue.id}: #{@time_entry.issue.subject}") if @time_entry.issue %>
<%= f.text_field :spent_on, :size => 10, :required => true %><%= calendar_for('time_entry_spent_on') %>
<%= f.text_field :hours, :size => 6, :required => true %>
<%= f.text_field :comments, :size => 100 %>
-
<%= f.select :activity_id, (@activities.collect {|p| [p.name, p.id]}), :required => true %>
+
<%= f.select :activity_id, activity_collection_for_select_options, :required => true %>
+<% @time_entry.custom_field_values.each do |value| %>
+
<%= custom_field_tag_with_label :time_entry, value %>
+<% end %>
<%= submit_tag l(:button_save) %>
<% end %>
-
-<% content_for :header_tags do %>
-<%= javascript_include_tag 'calendar/calendar' %>
-<%= javascript_include_tag "calendar/lang/calendar-#{current_language}.js" %>
-<%= javascript_include_tag 'calendar/calendar-setup' %>
-<%= stylesheet_link_tag 'calendar' %>
-<% end %>
\ No newline at end of file
diff --git a/app/views/timelog/report.rhtml b/app/views/timelog/report.rhtml
index 4fabfe3dd..eea0d0fc7 100644
--- a/app/views/timelog/report.rhtml
+++ b/app/views/timelog/report.rhtml
@@ -1,52 +1,74 @@
+
+<%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'edit', :project_id => @project, :issue_id => @issue}, :class => 'icon icon-time' %>
+
+
+<%= render_timelog_breadcrumb %>
+
<%= l(:label_spent_time) %>
-<% form_remote_tag(:url => {:project_id => @project}, :update => 'content') do %>
+<% form_remote_tag(:url => {}, :update => 'content') do %>
<% @criterias.each do |criteria| %>
- <%= hidden_field_tag 'criterias[]', criteria %>
+ <%= hidden_field_tag 'criterias[]', criteria, :id => nil %>
<% end %>
-
- <%= l(:label_date_from) %>: <%= text_field_tag 'date_from', @date_from, :size => 10 %><%= calendar_for('date_from') %>
-
- <%= l(:label_date_to) %>: <%= text_field_tag 'date_to', @date_to, :size => 10 %><%= calendar_for('date_to') %>
-
- <%= l(:label_details) %>:
- <%= select_tag 'period', options_for_select([[l(:label_year), 'year'],
- [l(:label_month), 'month'],
- [l(:label_week), 'week']], @columns) %>
-
- <%= submit_tag l(:button_apply) %>
- <%= link_to_remote l(:button_clear), {:url => {:project_id => @project}, :update => 'content'}, :class => 'icon icon-reload' %>
-
+ <%= hidden_field_tag 'project_id', params[:project_id] %>
+ <%= render :partial => 'date_range' %>
- <% if @criterias.length < 3 %>
- <%= l(:button_add) %>: <%= select_tag('criterias[]', options_for_select([[]] + (@available_criterias.keys - @criterias).collect{|k| [l(@available_criterias[k][:label]), k]}), :onchange => "this.form.onsubmit();") %>
- <% end %>
-
-
+ <%= l(:label_details) %>: <%= select_tag 'columns', options_for_select([[l(:label_year), 'year'],
+ [l(:label_month), 'month'],
+ [l(:label_week), 'week'],
+ [l(:label_day_plural).titleize, 'day']], @columns),
+ :onchange => "this.form.onsubmit();" %>
-<% unless @criterias.empty? %>
-
+ <%= l(:button_add) %>: <%= select_tag('criterias[]', options_for_select([[]] + (@available_criterias.keys - @criterias).collect{|k| [l(@available_criterias[k][:label]), k]}),
+ :onchange => "this.form.onsubmit();",
+ :style => 'width: 200px',
+ :id => nil,
+ :disabled => (@criterias.length >= 3)) %>
+ <%= link_to_remote l(:button_clear), {:url => {:project_id => @project, :period_type => params[:period_type], :period => params[:period], :from => @from, :to => @to, :columns => @columns},
+ :update => 'content'
+ }, :class => 'icon icon-reload' %>
+<% end %>
+
+<% unless @criterias.empty? %>
+
+
<%= l(:label_total) %>: <%= html_hours(lwr(:label_f_hour, @total_hours)) %>
+
+
+<% unless @hours.empty? %>
+
<% @criterias.each do |criteria| %>
- <%= l(@available_criterias[criteria][:label]) %>
+ <%= l(@available_criterias[criteria][:label]) %>
<% end %>
+<% columns_width = (40 / (@periods.length+1)).to_i %>
<% @periods.each do |period| %>
- <%= period %>
+ <%= period %>
<% end %>
+ <%= l(:label_total) %>
-
<%= render :partial => 'report_criteria', :locals => {:criterias => @criterias, :hours => @hours, :level => 0} %>
+
+ <%= l(:label_total) %>
+ <%= ' ' * (@criterias.size - 1) %>
+ <% total = 0 -%>
+ <% @periods.each do |period| -%>
+ <% sum = sum_hours(select_hours(@hours, @columns, period.to_s)); total += sum -%>
+ <%= html_hours("%.2f" % sum) if sum > 0 %>
+ <% end -%>
+ <%= html_hours("%.2f" % total) if total > 0 %>
+
+
+
+<%= l(:label_export_to) %>
+<%= link_to 'CSV', params.merge({:format => 'csv'}), :class => 'csv' %>
+
<% end %>
<% end %>
-<% content_for :header_tags do %>
-<%= javascript_include_tag 'calendar/calendar' %>
-<%= javascript_include_tag "calendar/lang/calendar-#{current_language}.js" %>
-<%= javascript_include_tag 'calendar/calendar-setup' %>
-<%= stylesheet_link_tag 'calendar' %>
-<% end %>
+<% html_title l(:label_spent_time), l(:label_report) %>
+
diff --git a/app/views/trackers/_form.rhtml b/app/views/trackers/_form.rhtml
index 26a34443c..856b70bbc 100644
--- a/app/views/trackers/_form.rhtml
+++ b/app/views/trackers/_form.rhtml
@@ -4,8 +4,9 @@
<%= f.text_field :name, :required => true %>
<%= f.check_box :is_in_chlog %>
<%= f.check_box :is_in_roadmap %>
-<% if @tracker.new_record? %>
-<%= l(:label_copy_workflow_from) %> <%= select_tag(:copy_workflow_from, content_tag("option") + options_from_collection_for_select(@trackers, :id, :name)) %>
+<% if @tracker.new_record? && @trackers.any? %>
+<%= l(:label_copy_workflow_from) %>
+<%= select_tag(:copy_workflow_from, content_tag("option") + options_from_collection_for_select(@trackers, :id, :name)) %>
<% end %>
diff --git a/app/views/trackers/list.rhtml b/app/views/trackers/list.rhtml
index 8517c44d6..9ccfda386 100644
--- a/app/views/trackers/list.rhtml
+++ b/app/views/trackers/list.rhtml
@@ -30,4 +30,6 @@
-<%= pagination_links_full @tracker_pages %>
\ No newline at end of file
+
+
+<% html_title(l(:label_tracker_plural)) -%>
diff --git a/app/views/users/_form.rhtml b/app/views/users/_form.rhtml
index 72cf3c95c..799ebde47 100644
--- a/app/views/users/_form.rhtml
+++ b/app/views/users/_form.rhtml
@@ -2,18 +2,17 @@
-
<%=l(:label_information_plural)%>
<%= f.text_field :login, :required => true, :size => 25 %>
<%= f.text_field :firstname, :required => true %>
<%= f.text_field :lastname, :required => true %>
<%= f.text_field :mail, :required => true %>
<%= f.select :language, lang_options_for_select %>
-<% for @custom_value in @custom_values %>
-
<%= custom_field_tag_with_label @custom_value %>
-<% end if @custom_values%>
+<% @user.custom_field_values.each do |value| %>
+
<%= custom_field_tag_with_label :user, value %>
+<% end %>
-
<%= f.check_box :admin %>
+
<%= f.check_box :admin, :disabled => (@user == User.current) %>
@@ -24,16 +23,9 @@
<%=l(:field_password)%> *
<%= password_field_tag 'password', nil, :size => 25 %>
-<%= l(:text_length_between, 4, 12) %>
+
<%= l(:text_caracters_minimum, 4) %>
<%=l(:field_password_confirmation)%> *
<%= password_field_tag 'password_confirmation', nil, :size => 25 %>
-
-<% content_for :header_tags do %>
-<%= javascript_include_tag 'calendar/calendar' %>
-<%= javascript_include_tag "calendar/lang/calendar-#{current_language}.js" %>
-<%= javascript_include_tag 'calendar/calendar-setup' %>
-<%= stylesheet_link_tag 'calendar' %>
-<% end %>
\ No newline at end of file
diff --git a/app/views/users/_general.rhtml b/app/views/users/_general.rhtml
new file mode 100644
index 000000000..80615ff6c
--- /dev/null
+++ b/app/views/users/_general.rhtml
@@ -0,0 +1,4 @@
+<% labelled_tabular_form_for :user, @user, :url => { :action => "edit" } do |f| %>
+<%= render :partial => 'form', :locals => { :f => f } %>
+<%= submit_tag l(:button_save) %>
+<% end %>
diff --git a/app/views/users/_memberships.rhtml b/app/views/users/_memberships.rhtml
index 2499ba387..94b49159e 100644
--- a/app/views/users/_memberships.rhtml
+++ b/app/views/users/_memberships.rhtml
@@ -1,29 +1,40 @@
-
-
<%= l(:label_project_plural) %>
+<% if @memberships.any? %>
+
+
+ <%= l(:label_project) %>
+ <%= l(:label_role) %>
+
+
+
+ <% @memberships.each do |membership| %>
+ <% next if membership.new_record? %>
+
+ <%=h membership.project %>
+
+ <% form_tag({ :action => 'edit_membership', :id => @user, :membership_id => membership }) do %>
+ <%= select_tag 'membership[role_id]', options_from_collection_for_select(@roles, "id", "name", membership.role_id) %>
+ <%= submit_tag l(:button_change), :class => "small" %>
+ <% end %>
+
+
+ <%= link_to l(:button_delete), {:action => 'destroy_membership', :id => @user, :membership_id => membership }, :method => :post, :class => 'icon icon-del' %>
+
+
+
+<% end; reset_cycle %>
+
+<% else %>
+
<%= l(:label_no_data) %>
+<% end %>
-<% @user.memberships.each do |membership| %>
-<% form_tag({ :action => 'edit_membership', :id => @user, :membership_id => membership }, :class => "tabular") do %>
-
- <%= membership.project.name %>
-
- <%= options_from_collection_for_select @roles, "id", "name", membership.role_id %>
-
- <%= submit_tag l(:button_change), :class => "button-small" %>
- <%= link_to l(:button_delete), {:action => 'destroy_membership', :id => @user, :membership_id => membership }, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %>
-
-<% end %>
-<% end %>
-
+<% if @projects.any? %>
<%=l(:label_project_new)%>
<% form_tag({ :action => 'edit_membership', :id => @user }) do %>
-
-<%= options_from_collection_for_select @projects, "id", "name", @membership.project_id %>
-
-
-<%= options_from_collection_for_select @roles, "id", "name", @membership.role_id %>
-
+<%= select_tag 'membership[project_id]', projects_options_for_select(@projects) %>
+<%= l(:label_role) %>:
+<%= select_tag 'membership[role_id]', options_from_collection_for_select(@roles, "id", "name") %>
<%= submit_tag l(:button_add) %>
<% end %>
-
\ No newline at end of file
+<% end %>
diff --git a/app/views/users/edit.rhtml b/app/views/users/edit.rhtml
index 0da99d0d2..4714bcecb 100644
--- a/app/views/users/edit.rhtml
+++ b/app/views/users/edit.rhtml
@@ -1,8 +1,27 @@
-<%=l(:label_user)%>
+
+<%= change_status_link(@user) %>
+
-<% labelled_tabular_form_for :user, @user, :url => { :action => "edit" } do |f| %>
-<%= render :partial => 'form', :locals => { :f => f } %>
-<%= submit_tag l(:button_save) %>
-<% end %>
+<%=l(:label_user)%>: <%=h @user.login %>
-<%= render :partial => 'memberships' %>
\ No newline at end of file
+<% selected_tab = params[:tab] ? params[:tab].to_s : user_settings_tabs.first[:name] %>
+
+
+
+<% user_settings_tabs.each do |tab| -%>
+ <%= link_to l(tab[:label]), { :tab => tab[:name] },
+ :id => "tab-#{tab[:name]}",
+ :class => (tab[:name] != selected_tab ? nil : 'selected'),
+ :onclick => "showTab('#{tab[:name]}'); this.blur(); return false;" %>
+<% end -%>
+
+
+
+<% user_settings_tabs.each do |tab| -%>
+<%= content_tag('div', render(:partial => tab[:partial]),
+ :id => "tab-content-#{tab[:name]}",
+ :style => (tab[:name] != selected_tab ? 'display:none' : nil),
+ :class => 'tab-content') %>
+<% end -%>
+
+<% html_title(l(:label_user), @user.login, l(:label_administration)) -%>
diff --git a/app/views/users/list.rhtml b/app/views/users/list.rhtml
index 2ffbcd6f6..77d45a6bb 100644
--- a/app/views/users/list.rhtml
+++ b/app/views/users/list.rhtml
@@ -4,11 +4,10 @@
<%=l(:label_user_plural)%>
-<% form_tag() do %>
+<% form_tag({}, :method => :get) do %>
<%= l(:label_filter_plural) %>
<%= l(:field_status) %> :
-<%= select_tag 'status', status_options_for_select(@status), :class => "small", :onchange => "this.form.submit(); return false;" %>
-<%= submit_tag l(:button_apply), :class => "small" %>
+<%= select_tag 'status', users_status_options_for_select(@status), :class => "small", :onchange => "this.form.submit(); return false;" %>
<% end %>
@@ -18,43 +17,28 @@
<%= sort_header_tag('login', :caption => l(:field_login)) %>
<%= sort_header_tag('firstname', :caption => l(:field_firstname)) %>
<%= sort_header_tag('lastname', :caption => l(:field_lastname)) %>
- <%=l(:field_mail)%>
- <%= sort_header_tag('admin', :caption => l(:field_admin)) %>
- <%= sort_header_tag('status', :caption => l(:field_status)) %>
- <%= sort_header_tag('created_on', :caption => l(:field_created_on)) %>
- <%= sort_header_tag('last_login_on', :caption => l(:field_last_login_on)) %>
+ <%= sort_header_tag('mail', :caption => l(:field_mail)) %>
+ <%= sort_header_tag('admin', :caption => l(:field_admin), :default_order => 'desc') %>
+ <%= sort_header_tag('created_on', :caption => l(:field_created_on), :default_order => 'desc') %>
+ <%= sort_header_tag('last_login_on', :caption => l(:field_last_login_on), :default_order => 'desc') %>
-<% for user in @users %>
- ">
- <%= link_to user.login, :action => 'edit', :id => user %>
- <%= user.firstname %>
- <%= user.lastname %>
- <%= user.mail %>
- <%= image_tag 'true.png' if user.admin? %>
- <%= image_tag 'locked.png' if user.locked? %><%= image_tag 'user_new.png' if user.registered? %>
- <%= format_time(user.created_on) %>
- <%= format_time(user.last_login_on) unless user.last_login_on.nil? %>
-
- <% form_tag({:action => 'edit', :id => user}) do %>
- <% if user.locked? %>
- <%= hidden_field_tag 'user[status]', User::STATUS_ACTIVE %>
- <%= submit_tag l(:button_unlock), :class => "button-small" %>
- <% elsif user.registered? %>
- <%= hidden_field_tag 'user[status]', User::STATUS_ACTIVE %>
- <%= submit_tag l(:button_activate), :class => "button-small" %>
- <% else %>
- <%= hidden_field_tag 'user[status]', User::STATUS_LOCKED %>
- <%= submit_tag l(:button_lock), :class => "button-small" %>
- <% end %>
- <% end %>
-
+<% for user in @users -%>
+ <%= %w(anon active registered locked)[user.status] %>">
+ <%= link_to h(user.login), :action => 'edit', :id => user %>
+ <%= h(user.firstname) %>
+ <%= h(user.lastname) %>
+ <%= mail_to(h(user.mail)) %>
+ <%= image_tag('true.png') if user.admin? %>
+ <%= format_time(user.created_on) %>
+ <%= format_time(user.last_login_on) unless user.last_login_on.nil? %>
+ <%= change_status_link(user) %>
-<% end %>
+<% end -%>
-
<%= pagination_links_full @user_pages, :status => @status %>
-[ <%= @user_pages.current.first_item %> - <%= @user_pages.current.last_item %> / <%= @user_count %> ]
-
\ No newline at end of file
+
+
+<% html_title(l(:label_user_plural)) -%>
diff --git a/app/views/versions/_form.rhtml b/app/views/versions/_form.rhtml
index cd3afcccd..adc83b573 100644
--- a/app/views/versions/_form.rhtml
+++ b/app/views/versions/_form.rhtml
@@ -1,15 +1,8 @@
<%= error_messages_for 'version' %>
-
<%= f.text_field :name, :size => 20, :required => true %>
+
<%= f.text_field :name, :size => 60, :required => true %>
<%= f.text_field :description, :size => 60 %>
<%= f.text_field :wiki_page_title, :label => :label_wiki_page, :size => 60, :disabled => @project.wiki.nil? %>
<%= f.text_field :effective_date, :size => 10 %><%= calendar_for('version_effective_date') %>
-
-<% content_for :header_tags do %>
-<%= javascript_include_tag 'calendar/calendar' %>
-<%= javascript_include_tag "calendar/lang/calendar-#{current_language}.js" %>
-<%= javascript_include_tag 'calendar/calendar-setup' %>
-<%= stylesheet_link_tag 'calendar' %>
-<% end %>
diff --git a/app/views/versions/_issue_counts.rhtml b/app/views/versions/_issue_counts.rhtml
new file mode 100644
index 000000000..4bab5c659
--- /dev/null
+++ b/app/views/versions/_issue_counts.rhtml
@@ -0,0 +1,35 @@
+
diff --git a/app/views/versions/_overview.rhtml b/app/views/versions/_overview.rhtml
new file mode 100644
index 000000000..d3aa6b18f
--- /dev/null
+++ b/app/views/versions/_overview.rhtml
@@ -0,0 +1,24 @@
+<% if version.completed? %>
+
<%= format_date(version.effective_date) %>
+<% elsif version.overdue? %>
+
<%= l(:label_roadmap_overdue, distance_of_time_in_words(Time.now, version.effective_date)) %> (<%= format_date(version.effective_date) %>)
+<% elsif version.effective_date %>
+
<%=l(:label_roadmap_due_in)%> <%= distance_of_time_in_words Time.now, version.effective_date %> (<%= format_date(version.effective_date) %>)
+<% end %>
+
+
<%=h version.description %>
+
+<% if version.fixed_issues.count > 0 %>
+ <%= progress_bar([version.closed_pourcent, version.completed_pourcent], :width => '40em', :legend => ('%0.0f%' % version.completed_pourcent)) %>
+
+ <%= link_to(version.closed_issues_count, :controller => 'issues', :action => 'index', :project_id => version.project, :status_id => 'c', :fixed_version_id => version, :set_filter => 1) %>
+ <%= lwr(:label_closed_issues, version.closed_issues_count) %>
+ (<%= '%0.0f' % (version.closed_issues_count.to_f / version.fixed_issues.count * 100) %>%)
+
+ <%= link_to(version.open_issues_count, :controller => 'issues', :action => 'index', :project_id => version.project, :status_id => 'o', :fixed_version_id => version, :set_filter => 1) %>
+ <%= lwr(:label_open_issues, version.open_issues_count)%>
+ (<%= '%0.0f' % (version.open_issues_count.to_f / version.fixed_issues.count * 100) %>%)
+
+<% else %>
+
<%= l(:label_roadmap_no_issues) %>
+<% end %>
diff --git a/app/views/versions/show.rhtml b/app/views/versions/show.rhtml
new file mode 100644
index 000000000..7e5264562
--- /dev/null
+++ b/app/views/versions/show.rhtml
@@ -0,0 +1,50 @@
+
+<%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => @version}, :class => 'icon icon-edit' %>
+
+
+
<%= h(@version.name) %>
+
+
+<% if @version.estimated_hours > 0 || User.current.allowed_to?(:view_time_entries, @project) %>
+
<%= l(:label_time_tracking) %>
+
+
+ <%= l(:field_estimated_hours) %>
+ <%= html_hours(lwr(:label_f_hour, @version.estimated_hours)) %>
+
+<% if User.current.allowed_to?(:view_time_entries, @project) %>
+
+ <%= l(:label_spent_time) %>
+ <%= html_hours(lwr(:label_f_hour, @version.spent_hours)) %>
+
+<% end %>
+
+
+<% end %>
+
+
+<%= render_issue_status_by(@version, params[:status_by]) if @version.fixed_issues.count > 0 %>
+
+
+
+
+<%= render :partial => 'versions/overview', :locals => {:version => @version} %>
+<%= render(:partial => "wiki/content", :locals => {:content => @version.wiki_page.content}) if @version.wiki_page %>
+
+<% issues = @version.fixed_issues.find(:all,
+ :include => [:status, :tracker],
+ :order => "#{Tracker.table_name}.position, #{Issue.table_name}.id") %>
+<% if issues.size > 0 %>
+
<%= l(:label_related_issues) %>
+
+<% issues.each do |issue| -%>
+ <%= link_to_issue(issue) %>: <%=h issue.subject %>
+<% end -%>
+
+
+<% end %>
+
+
+<%= call_hook :view_versions_show_bottom, :version => @version %>
+
+<% html_title @version.name %>
diff --git a/app/views/watchers/_watchers.rhtml b/app/views/watchers/_watchers.rhtml
new file mode 100644
index 000000000..14bb5fc6b
--- /dev/null
+++ b/app/views/watchers/_watchers.rhtml
@@ -0,0 +1,25 @@
+
+<%= link_to_remote l(:button_add),
+ :url => {:controller => 'watchers',
+ :action => 'new',
+ :object_type => watched.class.name.underscore,
+ :object_id => watched} if User.current.allowed_to?(:add_issue_watchers, @project) %>
+
+
+
<%= l(:label_issue_watchers) %>
+<%= watchers_list(watched) %>
+
+<% unless @watcher.nil? %>
+<% remote_form_for(:watcher, @watcher,
+ :url => {:controller => 'watchers',
+ :action => 'new',
+ :object_type => watched.class.name.underscore,
+ :object_id => watched},
+ :method => :post,
+ :html => {:id => 'new-watcher-form'}) do |f| %>
+
<%= f.select :user_id, (watched.addable_watcher_users.collect {|m| [m.name, m.id]}), :prompt => true %>
+
+<%= submit_tag l(:button_add) %>
+<%= toggle_link l(:button_cancel), 'new-watcher-form'%>
+<% end %>
+<% end %>
diff --git a/app/views/welcome/index.rhtml b/app/views/welcome/index.rhtml
index af09eea93..855248c5e 100644
--- a/app/views/welcome/index.rhtml
+++ b/app/views/welcome/index.rhtml
@@ -6,26 +6,30 @@
<%=l(:label_news_latest)%>
<%= render :partial => 'news/news', :collection => @news %>
- <%= link_to l(:label_issue_view_all), :controller => 'news' %>
+ <%= link_to l(:label_news_view_all), :controller => 'news' %>
<% end %>
+ <% if @projects.any? %>
<%=l(:label_project_latest)%>
<% for project in @projects %>
- <%= link_to project.name, :controller => 'projects', :action => 'show', :id => project %> (<%= format_time(project.created_on) %>)
- <%= textilizable project.description, :project => project %>
+ <%= link_to h(project.name), :controller => 'projects', :action => 'show', :id => project %> (<%= format_time(project.created_on) %>)
+ <%= textilizable project.short_description, :project => project %>
<% end %>
-
+
+ <% end %>
<% content_for :header_tags do %>
-<%= auto_discovery_link_tag(:rss, {:controller => 'feeds', :action => 'news', :key => @key}, {:title => l(:label_news_latest)}) %>
-<%= auto_discovery_link_tag(:atom, {:controller => 'feeds', :action => 'news', :key => @key, :format => 'atom'}, {:title => l(:label_news_latest)}) %>
+<%= auto_discovery_link_tag(:atom, {:controller => 'news', :action => 'index', :key => User.current.rss_key, :format => 'atom'},
+ :title => "#{Setting.app_title}: #{l(:label_news_latest)}") %>
+<%= auto_discovery_link_tag(:atom, {:controller => 'projects', :action => 'activity', :key => User.current.rss_key, :format => 'atom'},
+ :title => "#{Setting.app_title}: #{l(:label_activity)}") %>
<% end %>
diff --git a/app/views/wiki/annotate.rhtml b/app/views/wiki/annotate.rhtml
new file mode 100644
index 000000000..1c683404b
--- /dev/null
+++ b/app/views/wiki/annotate.rhtml
@@ -0,0 +1,32 @@
+
+<%= link_to(l(:button_edit), {:action => 'edit', :page => @page.title}, :class => 'icon icon-edit') %>
+<%= link_to(l(:label_history), {:action => 'history', :page => @page.title}, :class => 'icon icon-history') %>
+
+
+<%= @page.pretty_title %>
+
+
+<%= l(:label_version) %> <%= link_to @annotate.content.version, :action => 'index', :page => @page.title, :version => @annotate.content.version %>
+(<%= @annotate.content.author ? @annotate.content.author.name : "anonyme" %>, <%= format_time(@annotate.content.updated_on) %>)
+
+
+<% colors = Hash.new {|k,v| k[v] = (k.size % 12) } %>
+
+
+
+<% line_num = 1 %>
+<% @annotate.lines.each do |line| -%>
+
+ <%= line_num %>
+ <%= link_to line[0], :controller => 'wiki', :action => 'index', :id => @project, :page => @page.title, :version => line[0] %>
+ <%= h(line[1]) %>
+ <%= line[2] %>
+
+<% line_num += 1 %>
+<% end -%>
+
+
+
+<% content_for :header_tags do %>
+<%= stylesheet_link_tag 'scm' %>
+<% end %>
diff --git a/app/views/wiki/edit.rhtml b/app/views/wiki/edit.rhtml
index 96295004a..19f3bd5ae 100644
--- a/app/views/wiki/edit.rhtml
+++ b/app/views/wiki/edit.rhtml
@@ -3,11 +3,7 @@
<% form_for :content, @content, :url => {:action => 'edit', :page => @page.title}, :html => {:id => 'wiki_form'} do |f| %>
<%= f.hidden_field :version %>
<%= error_messages_for 'content' %>
-
-<%= l(:setting_text_formatting) %>:
-<%= link_to l(:label_help), {:controller => 'help', :ctrl => 'wiki', :page => 'syntax' },
- :onclick => "window.open('#{ url_for :controller => 'help', :ctrl => 'wiki', :page => 'syntax' }', '', 'resizable=yes, location=no, width=300, height=500, menubar=no, status=no, scrollbars=yes'); return false;" %>
-
+
<%= f.text_area :text, :cols => 100, :rows => 25, :class => 'wiki-edit', :accesskey => accesskey(:edit) %>
<%= l(:field_comments) %> <%= f.text_field :comments, :size => 120 %>
<%= submit_tag l(:button_save) %>
@@ -16,16 +12,15 @@
:method => 'post',
:update => 'preview',
:with => "Form.serialize('wiki_form')",
- :complete => "location.href='#preview-top'"
+ :complete => "Element.scrollTo('preview')"
}, :accesskey => accesskey(:preview) %>
<%= wikitoolbar_for 'content_text' %>
<% end %>
-
<% content_for :header_tags do %>
<%= stylesheet_link_tag 'scm' %>
<% end %>
-<% set_html_title @page.pretty_title %>
+<% html_title @page.pretty_title %>
diff --git a/app/views/wiki/export.rhtml b/app/views/wiki/export.rhtml
index 1ab5c13e4..94b4e6f0d 100644
--- a/app/views/wiki/export.rhtml
+++ b/app/views/wiki/export.rhtml
@@ -6,6 +6,10 @@
diff --git a/app/views/wiki/history.rhtml b/app/views/wiki/history.rhtml
index b2a467752..7ce78a0f2 100644
--- a/app/views/wiki/history.rhtml
+++ b/app/views/wiki/history.rhtml
@@ -11,24 +11,25 @@
<%= l(:field_updated_on) %>
<%= l(:field_author) %>
<%= l(:field_comments) %>
+
<% show_diff = @versions.size > 1 %>
<% line_num = 1 %>
<% @versions.each do |ver| %>
">
- <%= link_to ver.version, :action => 'index', :page => @page.title, :version => ver.version %>
+ <%= link_to ver.version, :action => 'index', :page => @page.title, :version => ver.version %>
<%= radio_button_tag('version', ver.version, (line_num==1), :id => "cb-#{line_num}", :onclick => "$('cbto-#{line_num+1}').checked=true;") if show_diff && (line_num < @versions.size) %>
<%= radio_button_tag('version_from', ver.version, (line_num==2), :id => "cbto-#{line_num}", :onclick => "if ($('cb-#{line_num}').checked==true || $('version_from').value > #{ver.version}) {$('cb-#{line_num-1}').checked=true;}") if show_diff && (line_num > 1) %>
<%= format_time(ver.updated_on) %>
<%= ver.author ? ver.author.name : "anonyme" %>
<%=h ver.comments %>
+ <%= link_to l(:button_annotate), :action => 'annotate', :page => @page.title, :version => ver.version %>
<% line_num += 1 %>
<% end %>
-<%= submit_tag l(:label_view_diff), :class => 'small' %>
-<%= pagination_links_full @version_pages, :page_param => :p %>
-[ <%= @version_pages.current.first_item %> - <%= @version_pages.current.last_item %> / <%= @version_count %> ]
+<%= submit_tag l(:label_view_diff), :class => 'small' if show_diff %>
+
<% end %>
diff --git a/app/views/wiki/rename.rhtml b/app/views/wiki/rename.rhtml
index 0c069f43d..260f9af8b 100644
--- a/app/views/wiki/rename.rhtml
+++ b/app/views/wiki/rename.rhtml
@@ -4,8 +4,9 @@
<% labelled_tabular_form_for :wiki_page, @page, :url => { :action => 'rename' } do |f| %>
-
<%= f.text_field :title, :required => true, :size => 255 %>
+
<%= f.text_field :title, :required => true, :size => 100 %>
<%= f.check_box :redirect_existing_links %>
+
<%= f.text_field :parent_title, :size => 100 %>
<%= submit_tag l(:button_rename) %>
<% end %>
diff --git a/app/views/wiki/show.rhtml b/app/views/wiki/show.rhtml
index 8def56072..255b904f5 100644
--- a/app/views/wiki/show.rhtml
+++ b/app/views/wiki/show.rhtml
@@ -1,11 +1,17 @@
+<% if @editable %>
<%= link_to_if_authorized(l(:button_edit), {:action => 'edit', :page => @page.title}, :class => 'icon icon-edit', :accesskey => accesskey(:edit)) if @content.version == @page.content.version %>
+<%= link_to_if_authorized(l(:button_lock), {:action => 'protect', :page => @page.title, :protected => 1}, :method => :post, :class => 'icon icon-lock') if !@page.protected? %>
+<%= link_to_if_authorized(l(:button_unlock), {:action => 'protect', :page => @page.title, :protected => 0}, :method => :post, :class => 'icon icon-unlock') if @page.protected? %>
<%= link_to_if_authorized(l(:button_rename), {:action => 'rename', :page => @page.title}, :class => 'icon icon-move') if @content.version == @page.content.version %>
<%= link_to_if_authorized(l(:button_delete), {:action => 'destroy', :page => @page.title}, :method => :post, :confirm => l(:text_are_you_sure), :class => 'icon icon-del') %>
<%= link_to_if_authorized(l(:button_rollback), {:action => 'edit', :page => @page.title, :version => @content.version }, :class => 'icon icon-cancel') if @content.version < @page.content.version %>
+<% end %>
<%= link_to(l(:label_history), {:action => 'history', :page => @page.title}, :class => 'icon icon-history') %>
+<%= breadcrumb(@page.ancestors.reverse.collect {|parent| link_to h(parent.pretty_title), {:page => parent.title}}) %>
+
<% if @content.version != @page.content.version %>
<%= link_to(('« ' + l(:label_previous)), :action => 'index', :page => @page.title, :version => (@content.version - 1)) + " - " if @content.version > 1 %>
@@ -22,22 +28,26 @@
<%= render(:partial => "wiki/content", :locals => {:content => @content}) %>
-<%= link_to_attachments @page.attachments, :delete_url => (authorize_for('wiki', 'destroy_attachment') ? {:controller => 'wiki', :action => 'destroy_attachment', :page => @page.title} : nil) %>
+<%= link_to_attachments @page.attachments, :delete_url => ((@editable && authorize_for('wiki', 'destroy_attachment')) ? {:controller => 'wiki', :action => 'destroy_attachment', :page => @page.title} : nil) %>
-
-<%= l(:label_export_to) %>
-<%= link_to 'HTML', {:page => @page.title, :export => 'html', :version => @content.version}, :class => 'icon icon-html' %>,
-<%= link_to 'TXT', {:page => @page.title, :export => 'txt', :version => @content.version}, :class => 'icon icon-txt' %>
-
-
-<% if authorize_for('wiki', 'add_attachment') %>
-<%= toggle_link l(:label_attachment_new), "add_attachment_form" %>
-<% form_tag({ :controller => 'wiki', :action => 'add_attachment', :page => @page.title }, :multipart => true, :class => "tabular", :id => "add_attachment_form", :style => "display:none;") do %>
- <%= render :partial => 'attachments/form' %>
+<% if @editable && authorize_for('wiki', 'add_attachment') %>
+<%= link_to l(:label_attachment_new), {}, :onclick => "Element.show('add_attachment_form'); Element.hide(this); Element.scrollTo('add_attachment_form'); return false;",
+ :id => 'attach_files_link' %>
+<% form_tag({ :controller => 'wiki', :action => 'add_attachment', :page => @page.title }, :multipart => true, :id => "add_attachment_form", :style => "display:none;") do %>
+
+
<%= render :partial => 'attachments/form' %>
+
<%= submit_tag l(:button_add) %>
+<%= link_to l(:button_cancel), {}, :onclick => "Element.hide('add_attachment_form'); Element.show('attach_files_link'); return false;" %>
<% end %>
<% end %>
+
+<%= l(:label_export_to) %>
+<%= link_to 'HTML', {:page => @page.title, :export => 'html', :version => @content.version}, :class => 'html' %>
+<%= link_to 'TXT', {:page => @page.title, :export => 'txt', :version => @content.version}, :class => 'text' %>
+
+
<% content_for :header_tags do %>
<%= stylesheet_link_tag 'scm' %>
<% end %>
@@ -46,4 +56,4 @@
<%= render :partial => 'sidebar' %>
<% end %>
-<% set_html_title @page.pretty_title %>
+<% html_title @page.pretty_title %>
diff --git a/app/views/wiki/special_date_index.rhtml b/app/views/wiki/special_date_index.rhtml
index ac68f809e..6717ebc85 100644
--- a/app/views/wiki/special_date_index.rhtml
+++ b/app/views/wiki/special_date_index.rhtml
@@ -17,9 +17,14 @@
<%= render :partial => 'sidebar' %>
<% end %>
-
<% unless @pages.empty? %>
-<%= l(:label_export_to) %> <%= link_to 'HTML', {:action => 'special', :page => 'export'}, :class => 'icon icon-html' %>
+
+<%= l(:label_export_to) %>
+<%= link_to 'Atom', {:controller => 'projects', :action => 'activity', :id => @project, :show_wiki_pages => 1, :format => 'atom', :key => User.current.rss_key}, :class => 'feed' %>
+<%= link_to 'HTML', {:action => 'special', :page => 'export'}, :class => 'html' %>
+
+<% end %>
+
+<% content_for :header_tags do %>
+<%= auto_discovery_link_tag(:atom, :controller => 'projects', :action => 'activity', :id => @project, :show_wiki_pages => 1, :format => 'atom', :key => User.current.rss_key) %>
<% end %>
-
-
diff --git a/app/views/wiki/special_page_index.rhtml b/app/views/wiki/special_page_index.rhtml
index db6629de8..72b395ef7 100644
--- a/app/views/wiki/special_page_index.rhtml
+++ b/app/views/wiki/special_page_index.rhtml
@@ -4,19 +4,20 @@
<%= l(:label_no_data) %>
<% end %>
-<% @pages.each do |page| %>
- <%= link_to page.pretty_title, {:action => 'index', :page => page.title},
- :title => l(:label_updated_time, distance_of_time_in_words(Time.now, page.updated_on)) %>
-
-<% end %>
+<%= render_page_hierarchy(@pages_by_parent_id) %>
<% content_for :sidebar do %>
<%= render :partial => 'sidebar' %>
<% end %>
-
<% unless @pages.empty? %>
-<%= l(:label_export_to) %> <%= link_to 'HTML', {:action => 'special', :page => 'export'}, :class => 'icon icon-html' %>
+
+<%= l(:label_export_to) %>
+<%= link_to 'Atom', {:controller => 'projects', :action => 'activity', :id => @project, :show_wiki_pages => 1, :format => 'atom', :key => User.current.rss_key}, :class => 'feed' %>
+<%= link_to 'HTML', {:action => 'special', :page => 'export'} %>
+
+<% end %>
+
+<% content_for :header_tags do %>
+<%= auto_discovery_link_tag(:atom, :controller => 'projects', :action => 'activity', :id => @project, :show_wiki_pages => 1, :format => 'atom', :key => User.current.rss_key) %>
<% end %>
-
-
diff --git a/config/boot.rb b/config/boot.rb
index 9fcd50fe3..cd21fb9ea 100644
--- a/config/boot.rb
+++ b/config/boot.rb
@@ -1,19 +1,109 @@
-# Don't change this file. Configuration is done in config/environment.rb and config/environments/*.rb
+# Don't change this file!
+# Configure your app in config/environment.rb and config/environments/*.rb
-unless defined?(RAILS_ROOT)
- root_path = File.join(File.dirname(__FILE__), '..')
- unless RUBY_PLATFORM =~ /mswin32/
- require 'pathname'
- root_path = Pathname.new(root_path).cleanpath(true).to_s
+RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
+
+module Rails
+ class << self
+ def boot!
+ unless booted?
+ preinitialize
+ pick_boot.run
+ end
+ end
+
+ def booted?
+ defined? Rails::Initializer
+ end
+
+ def pick_boot
+ (vendor_rails? ? VendorBoot : GemBoot).new
+ end
+
+ def vendor_rails?
+ File.exist?("#{RAILS_ROOT}/vendor/rails")
+ end
+
+ def preinitialize
+ load(preinitializer_path) if File.exist?(preinitializer_path)
+ end
+
+ def preinitializer_path
+ "#{RAILS_ROOT}/config/preinitializer.rb"
+ end
+ end
+
+ class Boot
+ def run
+ load_initializer
+ Rails::Initializer.run(:set_load_path)
+ end
+ end
+
+ class VendorBoot < Boot
+ def load_initializer
+ require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
+ Rails::Initializer.run(:install_gem_spec_stubs)
+ end
+ end
+
+ class GemBoot < Boot
+ def load_initializer
+ self.class.load_rubygems
+ load_rails_gem
+ require 'initializer'
+ end
+
+ def load_rails_gem
+ if version = self.class.gem_version
+ gem 'rails', version
+ else
+ gem 'rails'
+ end
+ rescue Gem::LoadError => load_error
+ $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
+ exit 1
+ end
+
+ class << self
+ def rubygems_version
+ Gem::RubyGemsVersion if defined? Gem::RubyGemsVersion
+ end
+
+ def gem_version
+ if defined? RAILS_GEM_VERSION
+ RAILS_GEM_VERSION
+ elsif ENV.include?('RAILS_GEM_VERSION')
+ ENV['RAILS_GEM_VERSION']
+ else
+ parse_gem_version(read_environment_rb)
+ end
+ end
+
+ def load_rubygems
+ require 'rubygems'
+
+ unless rubygems_version >= '0.9.4'
+ $stderr.puts %(Rails requires RubyGems >= 0.9.4 (you have #{rubygems_version}). Please `gem update --system` and try again.)
+ exit 1
+ end
+
+ rescue LoadError
+ $stderr.puts %(Rails requires RubyGems >= 0.9.4. Please install RubyGems and try again: http://rubygems.rubyforge.org)
+ exit 1
+ end
+
+ def parse_gem_version(text)
+ $1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
+ end
+
+ private
+ def read_environment_rb
+ File.read("#{RAILS_ROOT}/config/environment.rb")
+ end
+ end
end
- RAILS_ROOT = root_path
end
-if File.directory?("#{RAILS_ROOT}/vendor/rails")
- require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
-else
- require 'rubygems'
- require 'initializer'
-end
-
-Rails::Initializer.run(:set_load_path)
+# All that for this:
+Rails.boot!
diff --git a/config/database.yml.example b/config/database.yml.example
index 2f38d81ef..1dc678131 100644
--- a/config/database.yml.example
+++ b/config/database.yml.example
@@ -12,6 +12,7 @@ production:
host: localhost
username: root
password:
+ encoding: utf8
development:
adapter: mysql
@@ -19,6 +20,7 @@ development:
host: localhost
username: root
password:
+ encoding: utf8
test:
adapter: mysql
@@ -26,26 +28,20 @@ test:
host: localhost
username: root
password:
+ encoding: utf8
test_pgsql:
adapter: postgresql
- database: redmine
+ database: redmine_test
host: localhost
username: postgres
password: "postgres"
-test_oracle:
- adapter: oci
- host: 192.168.0.14
- username: rails_test
- password: "rails"
-
-test_sqlserver:
- adapter: sqlserver
- host: localhost,1157
- database: redmine_test
+test_sqlite3:
+ adapter: sqlite3
+ dbfile: db/test.db
demo:
adapter: sqlite3
- dbfile: db/redmine_demo.db
+ dbfile: db/demo.db
diff --git a/config/email.yml.example b/config/email.yml.example
new file mode 100644
index 000000000..685096da4
--- /dev/null
+++ b/config/email.yml.example
@@ -0,0 +1,21 @@
+# Outgoing email settings
+
+production:
+ delivery_method: :smtp
+ smtp_settings:
+ address: smtp.example.net
+ port: 25
+ domain: example.net
+ authentication: :login
+ user_name: redmine@example.net
+ password: redmine
+
+development:
+ delivery_method: :smtp
+ smtp_settings:
+ address: 127.0.0.1
+ port: 25
+ domain: example.net
+ authentication: :login
+ user_name: redmine@example.net
+ password: redmine
diff --git a/config/environment.rb b/config/environment.rb
index 447e47e21..9a3bf4b1d 100644
--- a/config/environment.rb
+++ b/config/environment.rb
@@ -4,9 +4,19 @@
# you don't control web/app server and can't set it the proper way
# ENV['RAILS_ENV'] ||= 'production'
+# Specifies gem version of Rails to use when vendor/rails is not present
+RAILS_GEM_VERSION = '2.1.0' unless defined? RAILS_GEM_VERSION
+
# Bootstrap the Rails environment, frameworks, and default configuration
require File.join(File.dirname(__FILE__), 'boot')
+# Load Engine plugin if available
+begin
+ require File.join(File.dirname(__FILE__), '../vendor/plugins/engines/boot')
+rescue LoadError
+ # Not available
+end
+
Rails::Initializer.run do |config|
# Settings in config/environments/* take precedence those specified here
@@ -21,8 +31,9 @@ Rails::Initializer.run do |config|
# config.log_level = :debug
# Use the database for sessions instead of the file system
- # (create the session table with 'rake create_sessions_table')
+ # (create the session table with 'rake db:sessions:create')
# config.action_controller.session_store = :active_record_store
+ config.action_controller.session_store = :PStore
# Enable page/fragment caching by setting a file-based store
# (remember to create the caching directory and make it readable to the application)
@@ -38,54 +49,9 @@ Rails::Initializer.run do |config|
# Use Active Record's schema dumper instead of SQL when creating the test database
# (enables use of different database adapters for development and test environments)
# config.active_record.schema_format = :ruby
-
- # See Rails::Configuration for more options
- # SMTP server configuration
- config.action_mailer.smtp_settings = {
- :address => "127.0.0.1",
- :port => 25,
- :domain => "somenet.foo",
- :authentication => :login,
- :user_name => "redmine",
- :password => "redmine",
- }
-
- config.action_mailer.perform_deliveries = true
-
- # Tell ActionMailer not to deliver emails to the real world.
- # The :test delivery method accumulates sent emails in the
- # ActionMailer::Base.deliveries array.
- #config.action_mailer.delivery_method = :test
- config.action_mailer.delivery_method = :smtp
-
+ # Deliveries are disabled by default. Do NOT modify this section.
+ # Define your email configuration in email.yml instead.
+ # It will automatically turn deliveries on
+ config.action_mailer.perform_deliveries = false
end
-
-ActiveRecord::Errors.default_error_messages = {
- :inclusion => "activerecord_error_inclusion",
- :exclusion => "activerecord_error_exclusion",
- :invalid => "activerecord_error_invalid",
- :confirmation => "activerecord_error_confirmation",
- :accepted => "activerecord_error_accepted",
- :empty => "activerecord_error_empty",
- :blank => "activerecord_error_blank",
- :too_long => "activerecord_error_too_long",
- :too_short => "activerecord_error_too_short",
- :wrong_length => "activerecord_error_wrong_length",
- :taken => "activerecord_error_taken",
- :not_a_number => "activerecord_error_not_a_number"
-}
-
-ActionView::Base.field_error_proc = Proc.new{ |html_tag, instance| "#{html_tag}" }
-
-Mime::SET << Mime::CSV unless Mime::SET.include?(Mime::CSV)
-Mime::Type.register 'application/pdf', :pdf
-
-GLoc.set_config :default_language => :en
-GLoc.clear_strings
-GLoc.set_kcode
-GLoc.load_localized_strings
-GLoc.set_config(:raise_string_not_found_errors => false)
-
-require 'redmine'
-
diff --git a/config/environments/development.rb b/config/environments/development.rb
index 04b779200..c816f03e3 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -8,9 +8,6 @@ config.cache_classes = false
# Log error messages when you accidentally call methods on nil.
config.whiny_nils = true
-# Enable the breakpoint server that script/breakpointer connects to
-config.breakpoint_server = true
-
# Show full error reports and disable caching
config.action_controller.consider_all_requests_local = true
config.action_controller.perform_caching = false
diff --git a/config/environments/test.rb b/config/environments/test.rb
index 9ba9ae0f8..7c821da07 100644
--- a/config/environments/test.rb
+++ b/config/environments/test.rb
@@ -13,4 +13,5 @@ config.whiny_nils = true
config.action_controller.consider_all_requests_local = true
config.action_controller.perform_caching = false
+config.action_mailer.perform_deliveries = true
config.action_mailer.delivery_method = :test
diff --git a/config/environments/test_oracle.rb b/config/environments/test_oracle.rb
deleted file mode 100644
index 0eb1cd6c1..000000000
--- a/config/environments/test_oracle.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# Settings specified here will take precedence over those in config/environment.rb
-
-# The test environment is used exclusively to run your application's
-# test suite. You never need to work with it otherwise. Remember that
-# your test database is "scratch space" for the test suite and is wiped
-# and recreated between test runs. Don't rely on the data there!
-config.cache_classes = false
-
-# Log error messages when you accidentally call methods on nil.
-config.whiny_nils = true
-
-# Show full error reports and disable caching
-config.action_controller.consider_all_requests_local = true
-config.action_controller.perform_caching = false
-
-config.action_mailer.delivery_method = :test
\ No newline at end of file
diff --git a/config/environments/test_pgsql.rb b/config/environments/test_pgsql.rb
index 35bb19bee..7c821da07 100644
--- a/config/environments/test_pgsql.rb
+++ b/config/environments/test_pgsql.rb
@@ -13,4 +13,5 @@ config.whiny_nils = true
config.action_controller.consider_all_requests_local = true
config.action_controller.perform_caching = false
-config.action_mailer.delivery_method = :test
\ No newline at end of file
+config.action_mailer.perform_deliveries = true
+config.action_mailer.delivery_method = :test
diff --git a/config/environments/test_sqlserver.rb b/config/environments/test_sqlite3.rb
similarity index 87%
rename from config/environments/test_sqlserver.rb
rename to config/environments/test_sqlite3.rb
index 35bb19bee..7c821da07 100644
--- a/config/environments/test_sqlserver.rb
+++ b/config/environments/test_sqlite3.rb
@@ -13,4 +13,5 @@ config.whiny_nils = true
config.action_controller.consider_all_requests_local = true
config.action_controller.perform_caching = false
-config.action_mailer.delivery_method = :test
\ No newline at end of file
+config.action_mailer.perform_deliveries = true
+config.action_mailer.delivery_method = :test
diff --git a/config/initializers/10-patches.rb b/config/initializers/10-patches.rb
new file mode 100644
index 000000000..fcc091997
--- /dev/null
+++ b/config/initializers/10-patches.rb
@@ -0,0 +1,17 @@
+
+ActiveRecord::Errors.default_error_messages = {
+ :inclusion => "activerecord_error_inclusion",
+ :exclusion => "activerecord_error_exclusion",
+ :invalid => "activerecord_error_invalid",
+ :confirmation => "activerecord_error_confirmation",
+ :accepted => "activerecord_error_accepted",
+ :empty => "activerecord_error_empty",
+ :blank => "activerecord_error_blank",
+ :too_long => "activerecord_error_too_long",
+ :too_short => "activerecord_error_too_short",
+ :wrong_length => "activerecord_error_wrong_length",
+ :taken => "activerecord_error_taken",
+ :not_a_number => "activerecord_error_not_a_number"
+}
+
+ActionView::Base.field_error_proc = Proc.new{ |html_tag, instance| "#{html_tag}" }
diff --git a/config/initializers/20-mime_types.rb b/config/initializers/20-mime_types.rb
new file mode 100644
index 000000000..269742b16
--- /dev/null
+++ b/config/initializers/20-mime_types.rb
@@ -0,0 +1,4 @@
+# Add new mime types for use in respond_to blocks:
+
+Mime::SET << Mime::CSV unless Mime::SET.include?(Mime::CSV)
+Mime::Type.register 'application/pdf', :pdf
diff --git a/config/initializers/30-redmine.rb b/config/initializers/30-redmine.rb
new file mode 100644
index 000000000..f2a9f6a30
--- /dev/null
+++ b/config/initializers/30-redmine.rb
@@ -0,0 +1,7 @@
+GLoc.set_config :default_language => :en
+GLoc.clear_strings
+GLoc.set_kcode
+GLoc.load_localized_strings
+GLoc.set_config(:raise_string_not_found_errors => false)
+
+require 'redmine'
diff --git a/config/initializers/40-email.rb b/config/initializers/40-email.rb
new file mode 100644
index 000000000..5b388ec59
--- /dev/null
+++ b/config/initializers/40-email.rb
@@ -0,0 +1,17 @@
+# Loads action_mailer settings from email.yml
+# and turns deliveries on if configuration file is found
+
+filename = File.join(File.dirname(__FILE__), '..', 'email.yml')
+if File.file?(filename)
+ mailconfig = YAML::load_file(filename)
+
+ if mailconfig.is_a?(Hash) && mailconfig.has_key?(Rails.env)
+ # Enable deliveries
+ ActionMailer::Base.perform_deliveries = true
+
+ mailconfig[Rails.env].each do |k, v|
+ v.symbolize_keys! if v.respond_to?(:symbolize_keys!)
+ ActionMailer::Base.send("#{k}=", v)
+ end
+ end
+end
diff --git a/config/routes.rb b/config/routes.rb
index c3637304a..913a8020f 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -7,7 +7,9 @@ ActionController::Routing::Routes.draw do |map|
# Keep in mind you can assign values other than :controller and :action
map.home '', :controller => 'welcome'
-
+ map.signin 'login', :controller => 'account', :action => 'login'
+ map.signout 'logout', :controller => 'account', :action => 'logout'
+
map.connect 'wiki/:id/:page/:action', :controller => 'wiki', :page => nil
map.connect 'roles/workflow/:id/:role_id/:tracker_id', :controller => 'roles', :action => 'workflow'
map.connect 'help/:ctrl/:page', :controller => 'help'
@@ -16,7 +18,9 @@ ActionController::Routing::Routes.draw do |map|
map.connect 'issues/:issue_id/relations/:action/:id', :controller => 'issue_relations'
map.connect 'projects/:project_id/issues/:action', :controller => 'issues'
map.connect 'projects/:project_id/news/:action', :controller => 'news'
+ map.connect 'projects/:project_id/documents/:action', :controller => 'documents'
map.connect 'projects/:project_id/boards/:action/:id', :controller => 'boards'
+ map.connect 'projects/:project_id/timelog/:action/:id', :controller => 'timelog', :project_id => /.+/
map.connect 'boards/:board_id/topics/:action/:id', :controller => 'messages'
map.with_options :controller => 'repositories' do |omap|
@@ -24,8 +28,14 @@ ActionController::Routing::Routes.draw do |map|
omap.repositories_changes 'repositories/changes/:id/*path', :action => 'changes'
omap.repositories_diff 'repositories/diff/:id/*path', :action => 'diff'
omap.repositories_entry 'repositories/entry/:id/*path', :action => 'entry'
+ omap.repositories_entry 'repositories/annotate/:id/*path', :action => 'annotate'
+ omap.repositories_revision 'repositories/revision/:id/:rev', :action => 'revision'
end
+ map.connect 'attachments/:id', :controller => 'attachments', :action => 'show', :id => /\d+/
+ map.connect 'attachments/:id/:filename', :controller => 'attachments', :action => 'show', :id => /\d+/, :filename => /.*/
+ map.connect 'attachments/download/:id/:filename', :controller => 'attachments', :action => 'download', :id => /\d+/, :filename => /.*/
+
# Allow downloading Web Service WSDL as a file with an extension
# instead of a file named 'wsdl'
map.connect ':controller/service.wsdl', :action => 'wsdl'
diff --git a/config/settings.yml b/config/settings.yml
index e9b9eebfd..e1ad341de 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -37,8 +37,15 @@ attachment_max_size:
issues_export_limit:
format: int
default: 500
+activity_days_default:
+ format: int
+ default: 30
+per_page_options:
+ default: '25,50,100'
mail_from:
- default: redmine@somenet.foo
+ default: redmine@example.net
+bcc_recipients:
+ default: 1
text_formatting:
default: textile
wiki_compression:
@@ -52,6 +59,15 @@ protocol:
feeds_limit:
format: int
default: 15
+enabled_scm:
+ serialized: true
+ default:
+ - Subversion
+ - Darcs
+ - Mercurial
+ - Cvs
+ - Bazaar
+ - Git
autofetch_changesets:
default: 1
sys_api_enabled:
@@ -75,30 +91,46 @@ date_format:
default: ''
time_format:
default: ''
+user_format:
+ default: :firstname_lastname
+ format: symbol
cross_project_issue_relations:
default: 0
notified_events:
serialized: true
- default: --
+ default:
- issue_added
- issue_updated
+mail_handler_api_enabled:
+ default: 0
+mail_handler_api_key:
+ default:
issue_list_default_columns:
serialized: true
- default: --
+ default:
- tracker
- status
- priority
- subject
- assigned_to
- updated_on
+display_subprojects_issues:
+ default: 1
+default_projects_public:
+ default: 1
+sequential_project_identifiers:
+ default: 0
# encodings used to convert repository files content to UTF-8
# multiple values accepted, comma separated
repositories_encodings:
default: ''
+# encoding used to convert commit logs to UTF-8
+commit_logs_encoding:
+ default: 'UTF-8'
ui_theme:
default: ''
emails_footer:
default: |-
- You have received this notification because you have either subscribed to it, or are involved in.
+ You have received this notification because you have either subscribed to it, or are involved in it.
To change your notification preferences, please click here: http://hostname/my/account
-
\ No newline at end of file
+
diff --git a/db/migrate/001_setup.rb b/db/migrate/001_setup.rb
index 1160dd5ef..d49e0e444 100644
--- a/db/migrate/001_setup.rb
+++ b/db/migrate/001_setup.rb
@@ -16,7 +16,8 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Setup < ActiveRecord::Migration
-
+
+ class User < ActiveRecord::Base; end
# model removed
class Permission < ActiveRecord::Base; end
@@ -284,13 +285,15 @@ class Setup < ActiveRecord::Migration
Permission.create :controller => "versions", :action => "destroy_file", :description => "button_delete", :sort => 1322
# create default administrator account
- user = User.create :firstname => "Redmine", :lastname => "Admin", :mail => "admin@somenet.foo", :mail_notification => true, :language => "en"
- user.login = "admin"
- user.password = "admin"
- user.admin = true
- user.save
-
-
+ user = User.create :login => "admin",
+ :hashed_password => "d033e22ae348aeb5660fc2140aec35850c4da997",
+ :admin => true,
+ :firstname => "Redmine",
+ :lastname => "Admin",
+ :mail => "admin@example.net",
+ :mail_notification => true,
+ :language => "en",
+ :status => 1
end
def self.down
diff --git a/db/migrate/048_allow_null_version_effective_date.rb b/db/migrate/048_allow_null_version_effective_date.rb
index 4b46bfe0e..82d2a33ec 100644
--- a/db/migrate/048_allow_null_version_effective_date.rb
+++ b/db/migrate/048_allow_null_version_effective_date.rb
@@ -1,6 +1,6 @@
class AllowNullVersionEffectiveDate < ActiveRecord::Migration
def self.up
- change_column :versions, :effective_date, :date, :default => nil
+ change_column :versions, :effective_date, :date, :default => nil, :null => true
end
def self.down
diff --git a/db/migrate/060_change_changesets_committer_limit.rb b/db/migrate/060_change_changesets_committer_limit.rb
index 5cc2f0d1d..b05096379 100644
--- a/db/migrate/060_change_changesets_committer_limit.rb
+++ b/db/migrate/060_change_changesets_committer_limit.rb
@@ -1,6 +1,6 @@
class ChangeChangesetsCommitterLimit < ActiveRecord::Migration
def self.up
- change_column :changesets, :committer, :string
+ change_column :changesets, :committer, :string, :limit => nil
end
def self.down
diff --git a/db/migrate/070_change_attachments_content_type_limit.rb b/db/migrate/070_change_attachments_content_type_limit.rb
index e3dfacc3c..ebf6d08c3 100644
--- a/db/migrate/070_change_attachments_content_type_limit.rb
+++ b/db/migrate/070_change_attachments_content_type_limit.rb
@@ -1,6 +1,6 @@
class ChangeAttachmentsContentTypeLimit < ActiveRecord::Migration
def self.up
- change_column :attachments, :content_type, :string
+ change_column :attachments, :content_type, :string, :limit => nil
end
def self.down
diff --git a/db/migrate/072_add_enumerations_position.rb b/db/migrate/072_add_enumerations_position.rb
index e0beaf395..22558a6e9 100644
--- a/db/migrate/072_add_enumerations_position.rb
+++ b/db/migrate/072_add_enumerations_position.rb
@@ -1,7 +1,7 @@
class AddEnumerationsPosition < ActiveRecord::Migration
def self.up
add_column(:enumerations, :position, :integer, :default => 1) unless Enumeration.column_names.include?('position')
- Enumeration.find(:all).group_by(&:opt).each_value do |enums|
+ Enumeration.find(:all).group_by(&:opt).each do |opt, enums|
enums.each_with_index do |enum, i|
# do not call model callbacks
Enumeration.update_all "position = #{i+1}", {:id => enum.id}
diff --git a/db/migrate/076_allow_null_position.rb b/db/migrate/076_allow_null_position.rb
index 45008d653..ece0370db 100644
--- a/db/migrate/076_allow_null_position.rb
+++ b/db/migrate/076_allow_null_position.rb
@@ -1,11 +1,11 @@
class AllowNullPosition < ActiveRecord::Migration
def self.up
# removes the 'not null' constraint on position fields
- change_column :issue_statuses, :position, :integer, :default => 1
- change_column :roles, :position, :integer, :default => 1
- change_column :trackers, :position, :integer, :default => 1
- change_column :boards, :position, :integer, :default => 1
- change_column :enumerations, :position, :integer, :default => 1
+ change_column :issue_statuses, :position, :integer, :default => 1, :null => true
+ change_column :roles, :position, :integer, :default => 1, :null => true
+ change_column :trackers, :position, :integer, :default => 1, :null => true
+ change_column :boards, :position, :integer, :default => 1, :null => true
+ change_column :enumerations, :position, :integer, :default => 1, :null => true
end
def self.down
diff --git a/db/migrate/078_add_custom_fields_position.rb b/db/migrate/078_add_custom_fields_position.rb
index 7ee8abb58..1c42ae732 100644
--- a/db/migrate/078_add_custom_fields_position.rb
+++ b/db/migrate/078_add_custom_fields_position.rb
@@ -1,7 +1,7 @@
class AddCustomFieldsPosition < ActiveRecord::Migration
def self.up
add_column(:custom_fields, :position, :integer, :default => 1)
- CustomField.find(:all).group_by(&:type).each_value do |fields|
+ CustomField.find(:all).group_by(&:type).each do |t, fields|
fields.each_with_index do |field, i|
# do not call model callbacks
CustomField.update_all "position = #{i+1}", {:id => field.id}
diff --git a/db/migrate/079_add_user_preferences_time_zone.rb b/db/migrate/079_add_user_preferences_time_zone.rb
new file mode 100644
index 000000000..9e36790a9
--- /dev/null
+++ b/db/migrate/079_add_user_preferences_time_zone.rb
@@ -0,0 +1,9 @@
+class AddUserPreferencesTimeZone < ActiveRecord::Migration
+ def self.up
+ add_column :user_preferences, :time_zone, :string
+ end
+
+ def self.down
+ remove_column :user_preferences, :time_zone
+ end
+end
diff --git a/db/migrate/080_add_users_type.rb b/db/migrate/080_add_users_type.rb
new file mode 100644
index 000000000..c907b472e
--- /dev/null
+++ b/db/migrate/080_add_users_type.rb
@@ -0,0 +1,10 @@
+class AddUsersType < ActiveRecord::Migration
+ def self.up
+ add_column :users, :type, :string
+ User.update_all "type = 'User'"
+ end
+
+ def self.down
+ remove_column :users, :type
+ end
+end
diff --git a/db/migrate/081_create_projects_trackers.rb b/db/migrate/081_create_projects_trackers.rb
new file mode 100644
index 000000000..70fea188e
--- /dev/null
+++ b/db/migrate/081_create_projects_trackers.rb
@@ -0,0 +1,19 @@
+class CreateProjectsTrackers < ActiveRecord::Migration
+ def self.up
+ create_table :projects_trackers, :id => false do |t|
+ t.column :project_id, :integer, :default => 0, :null => false
+ t.column :tracker_id, :integer, :default => 0, :null => false
+ end
+ add_index :projects_trackers, :project_id, :name => :projects_trackers_project_id
+
+ # Associates all trackers to all projects (as it was before)
+ tracker_ids = Tracker.find(:all).collect(&:id)
+ Project.find(:all).each do |project|
+ project.tracker_ids = tracker_ids
+ end
+ end
+
+ def self.down
+ drop_table :projects_trackers
+ end
+end
diff --git a/db/migrate/082_add_messages_locked.rb b/db/migrate/082_add_messages_locked.rb
new file mode 100644
index 000000000..20a172565
--- /dev/null
+++ b/db/migrate/082_add_messages_locked.rb
@@ -0,0 +1,9 @@
+class AddMessagesLocked < ActiveRecord::Migration
+ def self.up
+ add_column :messages, :locked, :boolean, :default => false
+ end
+
+ def self.down
+ remove_column :messages, :locked
+ end
+end
diff --git a/db/migrate/083_add_messages_sticky.rb b/db/migrate/083_add_messages_sticky.rb
new file mode 100644
index 000000000..8fd5d2ce3
--- /dev/null
+++ b/db/migrate/083_add_messages_sticky.rb
@@ -0,0 +1,9 @@
+class AddMessagesSticky < ActiveRecord::Migration
+ def self.up
+ add_column :messages, :sticky, :integer, :default => 0
+ end
+
+ def self.down
+ remove_column :messages, :sticky
+ end
+end
diff --git a/db/migrate/084_change_auth_sources_account_limit.rb b/db/migrate/084_change_auth_sources_account_limit.rb
new file mode 100644
index 000000000..cc127b439
--- /dev/null
+++ b/db/migrate/084_change_auth_sources_account_limit.rb
@@ -0,0 +1,9 @@
+class ChangeAuthSourcesAccountLimit < ActiveRecord::Migration
+ def self.up
+ change_column :auth_sources, :account, :string, :limit => nil
+ end
+
+ def self.down
+ change_column :auth_sources, :account, :string, :limit => 60
+ end
+end
diff --git a/db/migrate/085_add_role_tracker_old_status_index_to_workflows.rb b/db/migrate/085_add_role_tracker_old_status_index_to_workflows.rb
new file mode 100644
index 000000000..a59135be0
--- /dev/null
+++ b/db/migrate/085_add_role_tracker_old_status_index_to_workflows.rb
@@ -0,0 +1,9 @@
+class AddRoleTrackerOldStatusIndexToWorkflows < ActiveRecord::Migration
+ def self.up
+ add_index :workflows, [:role_id, :tracker_id, :old_status_id], :name => :wkfs_role_tracker_old_status
+ end
+
+ def self.down
+ remove_index(:workflows, :name => :wkfs_role_tracker_old_status); rescue
+ end
+end
diff --git a/db/migrate/086_add_custom_fields_searchable.rb b/db/migrate/086_add_custom_fields_searchable.rb
new file mode 100644
index 000000000..53158d14e
--- /dev/null
+++ b/db/migrate/086_add_custom_fields_searchable.rb
@@ -0,0 +1,9 @@
+class AddCustomFieldsSearchable < ActiveRecord::Migration
+ def self.up
+ add_column :custom_fields, :searchable, :boolean, :default => false
+ end
+
+ def self.down
+ remove_column :custom_fields, :searchable
+ end
+end
diff --git a/db/migrate/087_change_projects_description_to_text.rb b/db/migrate/087_change_projects_description_to_text.rb
new file mode 100644
index 000000000..132e921b3
--- /dev/null
+++ b/db/migrate/087_change_projects_description_to_text.rb
@@ -0,0 +1,8 @@
+class ChangeProjectsDescriptionToText < ActiveRecord::Migration
+ def self.up
+ change_column :projects, :description, :text, :null => true, :default => nil
+ end
+
+ def self.down
+ end
+end
diff --git a/db/migrate/088_add_custom_fields_default_value.rb b/db/migrate/088_add_custom_fields_default_value.rb
new file mode 100644
index 000000000..33a39ec6e
--- /dev/null
+++ b/db/migrate/088_add_custom_fields_default_value.rb
@@ -0,0 +1,9 @@
+class AddCustomFieldsDefaultValue < ActiveRecord::Migration
+ def self.up
+ add_column :custom_fields, :default_value, :text
+ end
+
+ def self.down
+ remove_column :custom_fields, :default_value
+ end
+end
diff --git a/db/migrate/089_add_attachments_description.rb b/db/migrate/089_add_attachments_description.rb
new file mode 100644
index 000000000..411dfe4d6
--- /dev/null
+++ b/db/migrate/089_add_attachments_description.rb
@@ -0,0 +1,9 @@
+class AddAttachmentsDescription < ActiveRecord::Migration
+ def self.up
+ add_column :attachments, :description, :string
+ end
+
+ def self.down
+ remove_column :attachments, :description
+ end
+end
diff --git a/db/migrate/090_change_versions_name_limit.rb b/db/migrate/090_change_versions_name_limit.rb
new file mode 100644
index 000000000..276429727
--- /dev/null
+++ b/db/migrate/090_change_versions_name_limit.rb
@@ -0,0 +1,9 @@
+class ChangeVersionsNameLimit < ActiveRecord::Migration
+ def self.up
+ change_column :versions, :name, :string, :limit => nil
+ end
+
+ def self.down
+ change_column :versions, :name, :string, :limit => 30
+ end
+end
diff --git a/db/migrate/091_change_changesets_revision_to_string.rb b/db/migrate/091_change_changesets_revision_to_string.rb
new file mode 100644
index 000000000..e621a3909
--- /dev/null
+++ b/db/migrate/091_change_changesets_revision_to_string.rb
@@ -0,0 +1,9 @@
+class ChangeChangesetsRevisionToString < ActiveRecord::Migration
+ def self.up
+ change_column :changesets, :revision, :string, :null => false
+ end
+
+ def self.down
+ change_column :changesets, :revision, :integer, :null => false
+ end
+end
diff --git a/db/migrate/092_change_changes_from_revision_to_string.rb b/db/migrate/092_change_changes_from_revision_to_string.rb
new file mode 100644
index 000000000..b298a3f45
--- /dev/null
+++ b/db/migrate/092_change_changes_from_revision_to_string.rb
@@ -0,0 +1,9 @@
+class ChangeChangesFromRevisionToString < ActiveRecord::Migration
+ def self.up
+ change_column :changes, :from_revision, :string
+ end
+
+ def self.down
+ change_column :changes, :from_revision, :integer
+ end
+end
diff --git a/db/migrate/093_add_wiki_pages_protected.rb b/db/migrate/093_add_wiki_pages_protected.rb
new file mode 100644
index 000000000..49720fbb7
--- /dev/null
+++ b/db/migrate/093_add_wiki_pages_protected.rb
@@ -0,0 +1,9 @@
+class AddWikiPagesProtected < ActiveRecord::Migration
+ def self.up
+ add_column :wiki_pages, :protected, :boolean, :default => false, :null => false
+ end
+
+ def self.down
+ remove_column :wiki_pages, :protected
+ end
+end
diff --git a/db/migrate/094_change_projects_homepage_limit.rb b/db/migrate/094_change_projects_homepage_limit.rb
new file mode 100644
index 000000000..98374aa4e
--- /dev/null
+++ b/db/migrate/094_change_projects_homepage_limit.rb
@@ -0,0 +1,9 @@
+class ChangeProjectsHomepageLimit < ActiveRecord::Migration
+ def self.up
+ change_column :projects, :homepage, :string, :limit => nil, :default => ''
+ end
+
+ def self.down
+ change_column :projects, :homepage, :string, :limit => 60, :default => ''
+ end
+end
diff --git a/db/migrate/095_add_wiki_pages_parent_id.rb b/db/migrate/095_add_wiki_pages_parent_id.rb
new file mode 100644
index 000000000..36b922ec1
--- /dev/null
+++ b/db/migrate/095_add_wiki_pages_parent_id.rb
@@ -0,0 +1,9 @@
+class AddWikiPagesParentId < ActiveRecord::Migration
+ def self.up
+ add_column :wiki_pages, :parent_id, :integer, :default => nil
+ end
+
+ def self.down
+ remove_column :wiki_pages, :parent_id
+ end
+end
diff --git a/doc/CHANGELOG b/doc/CHANGELOG
index 1d7e0f6a0..ac8cb6673 100644
--- a/doc/CHANGELOG
+++ b/doc/CHANGELOG
@@ -1,10 +1,343 @@
== Redmine changelog
Redmine - project management software
-Copyright (C) 2006-2007 Jean-Philippe Lang
+Copyright (C) 2006-2008 Jean-Philippe Lang
http://www.redmine.org/
+== 2008-07-06 v0.7.3
+
+* Allow dot in firstnames and lastnames
+* Add project name to cross-project Atom feeds
+* Encoding set to utf8 in example database.yml
+* HTML titles on forums related views
+* Fixed: various XSS vulnerabilities
+* Fixed: Entourage (and some old client) fails to correctly render notification styles
+* Fixed: Fixed: timelog redirects inappropriately when :back_url is blank
+* Fixed: wrong relative paths to images in wiki_syntax.html
+
+
+== 2008-06-15 v0.7.2
+
+* "New Project" link on Projects page
+* Links to repository directories on the repo browser
+* Move status to front in Activity View
+* Remove edit step from Status context menu
+* Fixed: No way to do textile horizontal rule
+* Fixed: Repository: View differences doesn't work
+* Fixed: attachement's name maybe invalid.
+* Fixed: Error when creating a new issue
+* Fixed: NoMethodError on @available_filters.has_key?
+* Fixed: Check All / Uncheck All in Email Settings
+* Fixed: "View differences" of one file at /repositories/revision/ fails
+* Fixed: Column width in "my page"
+* Fixed: private subprojects are listed on Issues view
+* Fixed: Textile: bold, italics, underline, etc... not working after parentheses
+* Fixed: Update issue form: comment field from log time end out of screen
+* Fixed: Editing role: "issue can be assigned to this role" out of box
+* Fixed: Unable use angular braces after include word
+* Fixed: Using '*' as keyword for repository referencing keywords doesn't work
+* Fixed: Subversion repository "View differences" on each file rise ERROR
+* Fixed: View differences for individual file of a changeset fails if the repository URL doesn't point to the repository root
+* Fixed: It is possible to lock out the last admin account
+* Fixed: Wikis are viewable for anonymous users on public projects, despite not granting access
+* Fixed: Issue number display clipped on 'my issues'
+* Fixed: Roadmap version list links not carrying state
+* Fixed: Log Time fieldset in IssueController#edit doesn't set default Activity as default
+* Fixed: git's "get_rev" API should use repo's current branch instead of hardwiring "master"
+* Fixed: browser's language subcodes ignored
+* Fixed: Error on project selection with numeric (only) identifier.
+* Fixed: Link to PDF doesn't work after creating new issue
+* Fixed: "Replies" should not be shown on forum threads that are locked
+* Fixed: SVN errors lead to svn username/password being displayed to end users (security issue)
+* Fixed: http links containing hashes don't display correct
+* Fixed: Allow ampersands in Enumeration names
+* Fixed: Atom link on saved query does not include query_id
+* Fixed: Logtime info lost when there's an error updating an issue
+* Fixed: TOC does not parse colorization markups
+* Fixed: CVS: add support for modules names with spaces
+* Fixed: Bad rendering on projects/add
+* Fixed: exception when viewing differences on cvs
+* Fixed: export issue to pdf will messup when use Chinese language
+* Fixed: Redmine::Scm::Adapters::GitAdapter#get_rev ignored GIT_BIN constant
+* Fixed: Adding non-ASCII new issue type in the New Issue page have encoding error using IE
+* Fixed: Importing from trac : some wiki links are messed
+* Fixed: Incorrect weekend definition in Hebrew calendar locale
+* Fixed: Atom feeds don't provide author section for repository revisions
+* Fixed: In Activity views, changesets titles can be multiline while they should not
+* Fixed: Ignore unreadable subversion directories (read disabled using authz)
+* Fixed: lib/SVG/Graph/Graph.rb can't externalize stylesheets
+* Fixed: Close statement handler in Redmine.pm
+
+
+== 2008-05-04 v0.7.1
+
+* Thai translation added (Gampol Thitinilnithi)
+* Translations updates
+* Escape HTML comment tags
+* Prevent "can't convert nil into String" error when :sort_order param is not present
+* Fixed: Updating tickets add a time log with zero hours
+* Fixed: private subprojects names are revealed on the project overview
+* Fixed: Search for target version of "none" fails with postgres 8.3
+* Fixed: Home, Logout, Login links shouldn't be absolute links
+* Fixed: 'Latest projects' box on the welcome screen should be hidden if there are no projects
+* Fixed: error when using upcase language name in coderay
+* Fixed: error on Trac import when :due attribute is nil
+
+
+== 2008-04-28 v0.7.0
+
+* Forces Redmine to use rails 2.0.2 gem when vendor/rails is not present
+* Queries can be marked as 'For all projects'. Such queries will be available on all projects and on the global issue list.
+* Add predefined date ranges to the time report
+* Time report can be done at issue level
+* Various timelog report enhancements
+* Accept the following formats for "hours" field: 1h, 1 h, 1 hour, 2 hours, 30m, 30min, 1h30, 1h30m, 1:30
+* Display the context menu above and/or to the left of the click if needed
+* Make the admin project files list sortable
+* Mercurial: display working directory files sizes unless browsing a specific revision
+* Preserve status filter and page number when using lock/unlock/activate links on the users list
+* Redmine.pm support for LDAP authentication
+* Better error message and AR errors in log for failed LDAP on-the-fly user creation
+* Redirected user to where he is coming from after logging hours
+* Warn user that subprojects are also deleted when deleting a project
+* Include subprojects versions on calendar and gantt
+* Notify project members when a message is posted if they want to receive notifications
+* Fixed: Feed content limit setting has no effect
+* Fixed: Priorities not ordered when displayed as a filter in issue list
+* Fixed: can not display attached images inline in message replies
+* Fixed: Boards are not deleted when project is deleted
+* Fixed: trying to preview a new issue raises an exception with postgresql
+* Fixed: single file 'View difference' links do not work because of duplicate slashes in url
+* Fixed: inline image not displayed when including a wiki page
+* Fixed: CVS duplicate key violation
+* Fixed: ActiveRecord::StaleObjectError exception on closing a set of circular duplicate issues
+* Fixed: custom field filters behaviour
+* Fixed: Postgresql 8.3 compatibility
+* Fixed: Links to repository directories don't work
+
+
+== 2008-03-29 v0.7.0-rc1
+
+* Overall activity view and feed added, link is available on the project list
+* Git VCS support
+* Rails 2.0 sessions cookie store compatibility
+* Use project identifiers in urls instead of ids
+* Default configuration data can now be loaded from the administration screen
+* Administration settings screen split to tabs (email notifications options moved to 'Settings')
+* Project description is now unlimited and optional
+* Wiki annotate view
+* Escape HTML tag in textile content
+* Add Redmine links to documents, versions, attachments and repository files
+* New setting to specify how many objects should be displayed on paginated lists. There are 2 ways to select a set of issues on the issue list:
+ * by using checkbox and/or the little pencil that will select/unselect all issues
+ * by clicking on the rows (but not on the links), Ctrl and Shift keys can be used to select multiple issues
+* Context menu disabled on links so that the default context menu of the browser is displayed when right-clicking on a link (click anywhere else on the row to display the context menu)
+* User display format is now configurable in administration settings
+* Issue list now supports bulk edit/move/delete (for a set of issues that belong to the same project)
+* Merged 'change status', 'edit issue' and 'add note' actions:
+ * Users with 'edit issues' permission can now update any property including custom fields when adding a note or changing the status
+ * 'Change issue status' permission removed. To change an issue status, a user just needs to have either 'Edit' or 'Add note' permissions and some workflow transitions allowed
+* Details by assignees on issue summary view
+* 'New issue' link in the main menu (accesskey 7). The drop-down lists to add an issue on the project overview and the issue list are removed
+* Change status select box default to current status
+* Preview for issue notes, news and messages
+* Optional description for attachments
+* 'Fixed version' label changed to 'Target version'
+* Let the user choose when deleting issues with reported hours to:
+ * delete the hours
+ * assign the hours to the project
+ * reassign the hours to another issue
+* Date range filter and pagination on time entries detail view
+* Propagate time tracking to the parent project
+* Switch added on the project activity view to include subprojects
+* Display total estimated and spent hours on the version detail view
+* Weekly time tracking block for 'My page'
+* Permissions to edit time entries
+* Include subprojects on the issue list, calendar, gantt and timelog by default (can be turned off is administration settings)
+* Roadmap enhancements (separate related issues from wiki contents, leading h1 in version wiki pages is hidden, smaller wiki headings)
+* Make versions with same date sorted by name
+* Allow issue list to be sorted by target version
+* Related changesets messages displayed on the issue details view
+* Create a journal and send an email when an issue is closed by commit
+* Add 'Author' to the available columns for the issue list
+* More appropriate default sort order on sortable columns
+* Add issue subject to the time entries view and issue subject, description and tracker to the csv export
+* Permissions to edit issue notes
+* Display date/time instead of date on files list
+* Do not show Roadmap menu item if the project doesn't define any versions
+* Allow longer version names (60 chars)
+* Ability to copy an existing workflow when creating a new role
+* Display custom fields in two columns on the issue form
+* Added 'estimated time' in the csv export of the issue list
+* Display the last 30 days on the activity view rather than the current month (number of days can be configured in the application settings)
+* Setting for whether new projects should be public by default
+* User preference to choose how comments/replies are displayed: in chronological or reverse chronological order
+* Added default value for custom fields
+* Added tabindex property on wiki toolbar buttons (to easily move from field to field using the tab key)
+* Redirect to issue page after creating a new issue
+* Wiki toolbar improvements (mainly for Firefox)
+* Display wiki syntax quick ref link on all wiki textareas
+* Display links to Atom feeds
+* Breadcrumb nav for the forums
+* Show replies when choosing to display messages in the activity
+* Added 'include' macro to include another wiki page
+* RedmineWikiFormatting page available as a static HTML file locally
+* Wrap diff content
+* Strip out email address from authors in repository screens
+* Highlight the current item of the main menu
+* Added simple syntax highlighters for php and java languages
+* Do not show empty diffs
+* Show explicit error message when the scm command failed (eg. when svn binary is not available)
+* Lithuanian translation added (Sergej Jegorov)
+* Ukrainan translation added (Natalia Konovka & Mykhaylo Sorochan)
+* Danish translation added (Mads Vestergaard)
+* Added i18n support to the jstoolbar and various settings screen
+* RedCloth's glyphs no longer user
+* New icons for the wiki toolbar (from http://www.famfamfam.com/lab/icons/silk/)
+* The following menus can now be extended by plugins: top_menu, account_menu, application_menu
+* Added a simple rake task to fetch changesets from the repositories: rake redmine:fetch_changesets
+* Remove hardcoded "Redmine" strings in account related emails and use application title instead
+* Mantis importer preserve bug ids
+* Trac importer: Trac guide wiki pages skipped
+* Trac importer: wiki attachments migration added
+* Trac importer: support database schema for Trac migration
+* Trac importer: support CamelCase links
+* Removes the Redmine version from the footer (can be viewed on admin -> info)
+* Rescue and display an error message when trying to delete a role that is in use
+* Add various 'X-Redmine' headers to email notifications: X-Redmine-Host, X-Redmine-Site, X-Redmine-Project, X-Redmine-Issue-Id, -Author, -Assignee, X-Redmine-Topic-Id
+* Add "--encoding utf8" option to the Mercurial "hg log" command in order to get utf8 encoded commit logs
+* Fixed: Gantt and calendar not properly refreshed (fragment caching removed)
+* Fixed: Textile image with style attribute cause internal server error
+* Fixed: wiki TOC not rendered properly when used in an issue or document description
+* Fixed: 'has already been taken' error message on username and email fields if left empty
+* Fixed: non-ascii attachement filename with IE
+* Fixed: wrong url for wiki syntax pop-up when Redmine urls are prefixed
+* Fixed: search for all words doesn't work
+* Fixed: Do not show sticky and locked checkboxes when replying to a message
+* Fixed: Mantis importer: do not duplicate Mantis username in firstname and lastname if realname is blank
+* Fixed: Date custom fields not displayed as specified in application settings
+* Fixed: titles not escaped in the activity view
+* Fixed: issue queries can not use custom fields marked as 'for all projects' in a project context
+* Fixed: on calendar, gantt and in the tracker filter on the issue list, only active trackers of the project (and its sub projects) should be available
+* Fixed: locked users should not receive email notifications
+* Fixed: custom field selection is not saved when unchecking them all on project settings
+* Fixed: can not lock a topic when creating it
+* Fixed: Incorrect filtering for unset values when using 'is not' filter
+* Fixed: PostgreSQL issues_seq_id not updated when using Trac importer
+* Fixed: ajax pagination does not scroll up
+* Fixed: error when uploading a file with no content-type specified by the browser
+* Fixed: wiki and changeset links not displayed when previewing issue description or notes
+* Fixed: 'LdapError: no bind result' error when authenticating
+* Fixed: 'LdapError: invalid binding information' when no username/password are set on the LDAP account
+* Fixed: CVS repository doesn't work if port is used in the url
+* Fixed: Email notifications: host name is missing in generated links
+* Fixed: Email notifications: referenced changesets, wiki pages, attachments... are not turned into links
+* Fixed: Do not clear issue relations when moving an issue to another project if cross-project issue relations are allowed
+* Fixed: "undefined method 'textilizable'" error on email notification when running Repository#fetch_changesets from the console
+* Fixed: Do not send an email with no recipient, cc or bcc
+* Fixed: fetch_changesets fails on commit comments that close 2 duplicates issues.
+* Fixed: Mercurial browsing under unix-like os and for directory depth > 2
+* Fixed: Wiki links with pipe can not be used in wiki tables
+* Fixed: migrate_from_trac doesn't import timestamps of wiki and tickets
+* Fixed: when bulk editing, setting "Assigned to" to "nobody" causes an sql error with Postgresql
+
+
+== 2008-03-12 v0.6.4
+
+* Fixed: private projects name are displayed on account/show even if the current user doesn't have access to these private projects
+* Fixed: potential LDAP authentication security flaw
+* Fixed: context submenus on the issue list don't show up with IE6.
+* Fixed: Themes are not applied with Rails 2.0
+* Fixed: crash when fetching Mercurial changesets if changeset[:files] is nil
+* Fixed: Mercurial repository browsing
+* Fixed: undefined local variable or method 'log' in CvsAdapter when a cvs command fails
+* Fixed: not null constraints not removed with Postgresql
+* Doctype set to transitional
+
+
+== 2007-12-18 v0.6.3
+
+* Fixed: upload doesn't work in 'Files' section
+
+
+== 2007-12-16 v0.6.2
+
+* Search engine: issue custom fields can now be searched
+* News comments are now textilized
+* Updated Japanese translation (Satoru Kurashiki)
+* Updated Chinese translation (Shortie Lo)
+* Fixed Rails 2.0 compatibility bugs:
+ * Unable to create a wiki
+ * Gantt and calendar error
+ * Trac importer error (readonly? is defined by ActiveRecord)
+* Fixed: 'assigned to me' filter broken
+* Fixed: crash when validation fails on issue edition with no custom fields
+* Fixed: reposman "can't find group" error
+* Fixed: 'LDAP account password is too long' error when leaving the field empty on creation
+* Fixed: empty lines when displaying repository files with Windows style eol
+* Fixed: missing body closing tag in repository annotate and entry views
+
+
+== 2007-12-10 v0.6.1
+
+* Rails 2.0 compatibility
+* Custom fields can now be displayed as columns on the issue list
+* Added version details view (accessible from the roadmap)
+* Roadmap: more accurate completion percentage calculation (done ratio of open issues is now taken into account)
+* Added per-project tracker selection. Trackers can be selected on project settings
+* Anonymous users can now be allowed to create, edit, comment issues, comment news and post messages in the forums
+* Forums: messages can now be edited/deleted (explicit permissions need to be given)
+* Forums: topics can be locked so that no reply can be added
+* Forums: topics can be marked as sticky so that they always appear at the top of the list
+* Forums: attachments can now be added to replies
+* Added time zone support
+* Added a setting to choose the account activation strategy (available in application settings)
+* Added 'Classic' theme (inspired from the v0.51 design)
+* Added an alternate theme which provides issue list colorization based on issues priority
+* Added Bazaar SCM adapter
+* Added Annotate/Blame view in the repository browser (except for Darcs SCM)
+* Diff style (inline or side by side) automatically saved as a user preference
+* Added issues status changes on the activity view (by Cyril Mougel)
+* Added forums topics on the activity view (disabled by default)
+* Added an option on 'My account' for users who don't want to be notified of changes that they make
+* Trac importer now supports mysql and postgresql databases
+* Trac importer improvements (by Mat Trudel)
+* 'fixed version' field can now be displayed on the issue list
+* Added a couple of new formats for the 'date format' setting
+* Added Traditional Chinese translation (by Shortie Lo)
+* Added Russian translation (iGor kMeta)
+* Project name format limitation removed (name can now contain any character)
+* Project identifier maximum length changed from 12 to 20
+* Changed the maximum length of LDAP account to 255 characters
+* Removed the 12 characters limit on passwords
+* Added wiki macros support
+* Performance improvement on workflow setup screen
+* More detailed html title on several views
+* Custom fields can now be reordered
+* Search engine: search can be restricted to an exact phrase by using quotation marks
+* Added custom fields marked as 'For all projects' to the csv export of the cross project issue list
+* Email notifications are now sent as Blind carbon copy by default
+* Fixed: all members (including non active) should be deleted when deleting a project
+* Fixed: Error on wiki syntax link (accessible from wiki/edit)
+* Fixed: 'quick jump to a revision' form on the revisions list
+* Fixed: error on admin/info if there's more than 1 plugin installed
+* Fixed: svn or ldap password can be found in clear text in the html source in editing mode
+* Fixed: 'Assigned to' drop down list is not sorted
+* Fixed: 'View all issues' link doesn't work on issues/show
+* Fixed: error on account/register when validation fails
+* Fixed: Error when displaying the issue list if a float custom field is marked as 'used as filter'
+* Fixed: Mercurial adapter breaks on missing :files entry in changeset hash (James Britt)
+* Fixed: Wrong feed URLs on the home page
+* Fixed: Update of time entry fails when the issue has been moved to an other project
+* Fixed: Error when moving an issue without changing its tracker (Postgresql)
+* Fixed: Changes not recorded when using :pserver string (CVS adapter)
+* Fixed: admin should be able to move issues to any project
+* Fixed: adding an attachment is not possible when changing the status of an issue
+* Fixed: No mime-types in documents/files downloading
+* Fixed: error when sorting the messages if there's only one board for the project
+* Fixed: 'me' doesn't appear in the drop down filters on a project issue list.
+
== 2007-11-04 v0.6.0
* Permission model refactoring.
diff --git a/doc/INSTALL b/doc/INSTALL
index 4da5daef9..13502f8d0 100644
--- a/doc/INSTALL
+++ b/doc/INSTALL
@@ -1,25 +1,22 @@
== Redmine installation
Redmine - project management software
-Copyright (C) 2006-2007 Jean-Philippe Lang
+Copyright (C) 2006-2008 Jean-Philippe Lang
http://www.redmine.org/
== Requirements
-* Ruby on Rails 1.2.2 or higher (this release won't work with Rails 2.0)
-* A database (see compatibility below)
+* Ruby on Rails 2.1
+* A database:
+ * MySQL (tested with MySQL 5)
+ * PostgreSQL (tested with PostgreSQL 8.1)
+ * SQLite (tested with SQLite 3)
Optional:
* SVN binaries >= 1.3 (needed for repository browsing, must be available in PATH)
* RMagick (gantt export to png)
-Supported databases:
-* MySQL (tested with MySQL 5)
-* PostgreSQL (tested with PostgreSQL 8.1)
-* SQLite (tested with SQLite 3)
-
-
== Installation
1. Uncompress the program archive
@@ -33,10 +30,14 @@ Supported databases:
rake db:migrate RAILS_ENV="production"
It will create tables and an administrator account.
-5. Insert default configuration data in the database:
- rake redmine:load_default_data RAILS_ENV="production"
- It will load default roles, trackers, statuses, workflows and enumerations.
- This step is optional but *highly recommended*
+5. Setting up permissions
+ The user who runs Redmine must have write permission on the following
+ subdirectories: files, log, tmp (create the last one if not present).
+
+ Assuming you run Redmine with a user named redmine:
+ mkdir tmp
+ sudo chown -R redmine:redmine files log tmp
+ sudo chmod -R 755 files log tmp
6. Test the installation by running WEBrick web server:
ruby script/server -e production
@@ -48,15 +49,14 @@ Supported databases:
login: admin
password: admin
-8. You can go to "Admin -> Settings" to modify application settings.
-
-9. Setup Apache or Lighttpd with fastcgi for best performance.
+ Go to "Administration" to load the default configuration data (roles,
+ trackers, statuses, workflow) and adjust application settings
-== SMTP server Configuration
-
-In config/environment.rb, you can set parameters for your SMTP server:
-config.action_mailer.smtp_settings: SMTP server configuration
-config.action_mailer.perform_deliveries: set to false to disable mail delivering
+== Email delivery Configuration
+Copy config/email.yml.example to config/email.yml and edit this file
+to adjust your SMTP settings.
Don't forget to restart the application after any change to this file.
+
+Please do not enter your SMTP settings in environment.rb.
diff --git a/doc/README_FOR_APP b/doc/README_FOR_APP
new file mode 100644
index 000000000..fb70acaac
--- /dev/null
+++ b/doc/README_FOR_APP
@@ -0,0 +1,5 @@
+= Redmine
+
+Redmine is a flexible project management web application written using Ruby on Rails framework.
+
+More details can be found at http://www.redmine.org
diff --git a/doc/RUNNING_TESTS b/doc/RUNNING_TESTS
new file mode 100644
index 000000000..6ee977811
--- /dev/null
+++ b/doc/RUNNING_TESTS
@@ -0,0 +1,45 @@
+Creating test repositories
+===================
+
+mkdir tmp/test
+
+Subversion
+----------
+svnadmin create tmp/test/subversion_repository
+gunzip < test/fixtures/repositories/subversion_repository.dump.gz | svnadmin load tmp/test/subversion_repository
+
+CVS
+---
+gunzip < test/fixtures/repositories/cvs_repository.tar.gz | tar -xv -C tmp/test
+
+Bazaar
+------
+gunzip < test/fixtures/repositories/bazaar_repository.tar.gz | tar -xv -C tmp/test
+
+Mercurial
+---------
+gunzip < test/fixtures/repositories/mercurial_repository.tar.gz | tar -xv -C tmp/test
+
+Git
+---
+gunzip < test/fixtures/repositories/git_repository.tar.gz | tar -xv -C tmp/test
+
+Darcs (2.0+ required)
+---------------------
+gunzip < test/fixtures/repositories/darcs_repository.tar.gz | tar -xv -C tmp/test
+
+FileSystem
+----------
+gunzip < test/fixtures/repositories/filesystem_repository.tar.gz | tar -xv -C tmp/test
+
+
+Running Tests
+=============
+
+Run
+
+ rake --tasks | grep test
+
+to see available tests.
+
+RAILS_ENV=test rake test will run tests.
diff --git a/doc/UPGRADING b/doc/UPGRADING
index 5ccffedf7..1dd901171 100644
--- a/doc/UPGRADING
+++ b/doc/UPGRADING
@@ -1,36 +1,28 @@
== Redmine upgrade procedure
Redmine - project management software
-Copyright (C) 2006-2007 Jean-Philippe Lang
+Copyright (C) 2006-2008 Jean-Philippe Lang
http://www.redmine.org/
-== Upgrading from 0.3.0 and above
+== Upgrading
1. Uncompress the program archive in a new directory
3. Copy your database settings (RAILS_ROOT/config/database.yml)
+ and SMTP settings (RAILS_ROOT/config/email.yml)
into the new config directory
-4. Enter your SMTP settings in config/environment.rb
- Do not replace this file with the old one
-
-5. Migrate your database (please make a backup before doing this):
+4. Migrate your database (please make a backup before doing this):
rake db:migrate RAILS_ENV="production"
-6. Copy the RAILS_ROOT/files directory content into your new installation
+5. Copy the RAILS_ROOT/files directory content into your new installation
+ This directory contains all the attached files
-Note 1: Rails 1.2.2 or higher is required for version 0.4.2 and later.
-This release won't work with Rails 2.0
-Note 2: when upgrading your code with svn update, don't forget to clear
-the application cache (RAILS_ROOT/tmp/cache) before restarting.
+== Notes
-Note 3: settings previously defined in custom_config.rb are now stored
-in database, as of version 0.4.2. Go to "Admin -> Settings" to edit them.
+1. Rails 2.0.2 is required for version 0.7 and later.
-
-== From 0.2.x and below
-
-Due to major database changes since 0.2.x, there is no migration support
-from 0.2.x and previous versions.
+2. When upgrading your code with svn update, don't forget to clear
+ the application cache (RAILS_ROOT/tmp/cache) before restarting.
diff --git a/extra/mail_handler/rdm-mailhandler.rb b/extra/mail_handler/rdm-mailhandler.rb
new file mode 100644
index 000000000..96e975187
--- /dev/null
+++ b/extra/mail_handler/rdm-mailhandler.rb
@@ -0,0 +1,125 @@
+#!/usr/bin/ruby
+
+# rdm-mailhandler
+# Reads an email from standard input and forward it to a Redmine server
+# Can be used from a remote mail server
+
+require 'net/http'
+require 'net/https'
+require 'uri'
+require 'getoptlong'
+
+module Net
+ class HTTPS < HTTP
+ def self.post_form(url, params)
+ request = Post.new(url.path)
+ request.form_data = params
+ request.basic_auth url.user, url.password if url.user
+ http = new(url.host, url.port)
+ http.use_ssl = (url.scheme == 'https')
+ http.start {|h| h.request(request) }
+ end
+ end
+end
+
+class RedmineMailHandler
+ VERSION = '0.1'
+
+ attr_accessor :verbose, :issue_attributes, :allow_override, :url, :key
+
+ def initialize
+ self.issue_attributes = {}
+
+ opts = GetoptLong.new(
+ [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
+ [ '--version', '-V', GetoptLong::NO_ARGUMENT ],
+ [ '--verbose', '-v', GetoptLong::NO_ARGUMENT ],
+ [ '--url', '-u', GetoptLong::REQUIRED_ARGUMENT ],
+ [ '--key', '-k', GetoptLong::REQUIRED_ARGUMENT],
+ [ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ],
+ [ '--tracker', '-t', GetoptLong::REQUIRED_ARGUMENT],
+ [ '--category', GetoptLong::REQUIRED_ARGUMENT],
+ [ '--priority', GetoptLong::REQUIRED_ARGUMENT],
+ [ '--allow-override', '-o', GetoptLong::REQUIRED_ARGUMENT]
+ )
+
+ opts.each do |opt, arg|
+ case opt
+ when '--url'
+ self.url = arg.dup
+ when '--key'
+ self.key = arg.dup
+ when '--help'
+ usage
+ when '--verbose'
+ self.verbose = true
+ when '--version'
+ puts VERSION; exit
+ when '--project', '--tracker', '--category', '--priority'
+ self.issue_attributes[opt.gsub(%r{^\-\-}, '')] = arg.dup
+ when '--allow-override'
+ self.allow_override = arg.dup
+ end
+ end
+
+ usage if url.nil?
+ end
+
+ def submit(email)
+ uri = url.gsub(%r{/*$}, '') + '/mail_handler'
+
+ data = { 'key' => key, 'email' => email, 'allow_override' => allow_override }
+ issue_attributes.each { |attr, value| data["issue[#{attr}]"] = value }
+
+ debug "Posting to #{uri}..."
+ response = Net::HTTPS.post_form(URI.parse(uri), data)
+ debug "Response received: #{response.code}"
+ response.code == 201 ? 0 : 1
+ end
+
+ private
+
+ def usage
+ puts <<-USAGE
+Usage: rdm-mailhandler [options] --url= --key=
+Reads an email from standard input and forward it to a Redmine server
+
+Required:
+ -u, --url URL of the Redmine server
+ -k, --key Redmine API key
+
+General options:
+ -h, --help show this help
+ -v, --verbose show extra information
+ -V, --version show version information and exit
+
+Issue attributes control options:
+ -p, --project=PROJECT identifier of the target project
+ -t, --tracker=TRACKER name of the target tracker
+ --category=CATEGORY name of the target category
+ --priority=PRIORITY name of the target priority
+ -o, --allow-override=ATTRS allow email content to override attributes
+ specified by previous options
+ ATTRS is a comma separated list of attributes
+
+Examples:
+ # No project specified. Emails MUST contain the 'Project' keyword:
+ rdm-mailhandler --url http://redmine.domain.foo --key secret
+
+ # Fixed project and default tracker specified, but emails can override
+ # both tracker and priority attributes:
+ rdm-mailhandler --url https://domain.foo/redmine --key secret \\
+ --project foo \\
+ --tracker bug \\
+ --allow-override tracker,priority
+USAGE
+ exit
+ end
+
+ def debug(msg)
+ puts msg if verbose
+ end
+end
+
+handler = RedmineMailHandler.new
+handler.submit(STDIN.read)
diff --git a/extra/sample_plugin/app/controllers/example_controller.rb b/extra/sample_plugin/app/controllers/example_controller.rb
index 9bdaf448e..0c6cd5b91 100644
--- a/extra/sample_plugin/app/controllers/example_controller.rb
+++ b/extra/sample_plugin/app/controllers/example_controller.rb
@@ -1,5 +1,7 @@
# Sample plugin controller
class ExampleController < ApplicationController
+ unloadable
+
layout 'base'
before_filter :find_project, :authorize
diff --git a/extra/sample_plugin/app/models/meeting.rb b/extra/sample_plugin/app/models/meeting.rb
new file mode 100644
index 000000000..c1bb64a93
--- /dev/null
+++ b/extra/sample_plugin/app/models/meeting.rb
@@ -0,0 +1,11 @@
+class Meeting < ActiveRecord::Base
+ belongs_to :project
+
+ acts_as_event :title => Proc.new {|o| "#{o.scheduled_on} Meeting"},
+ :datetime => :scheduled_on,
+ :author => nil,
+ :url => Proc.new {|o| {:controller => 'meetings', :action => 'show', :id => o.id}}
+
+ acts_as_activity_provider :timestamp => 'scheduled_on',
+ :find_options => { :include => :project }
+end
diff --git a/extra/sample_plugin/db/migrate/001_create_meetings.rb b/extra/sample_plugin/db/migrate/001_create_meetings.rb
new file mode 100644
index 000000000..fec9c8bd1
--- /dev/null
+++ b/extra/sample_plugin/db/migrate/001_create_meetings.rb
@@ -0,0 +1,15 @@
+# Sample plugin migration
+# Use rake db:migrate_plugins to migrate installed plugins
+class CreateMeetings < ActiveRecord::Migration
+ def self.up
+ create_table :meetings do |t|
+ t.column :project_id, :integer, :null => false
+ t.column :description, :string
+ t.column :scheduled_on, :datetime
+ end
+ end
+
+ def self.down
+ drop_table :meetings
+ end
+end
diff --git a/extra/sample_plugin/db/migrate/001_create_some_models.rb b/extra/sample_plugin/db/migrate/001_create_some_models.rb
deleted file mode 100644
index 39d58a649..000000000
--- a/extra/sample_plugin/db/migrate/001_create_some_models.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# Sample plugin migration
-# Use rake db:migrate_plugins to migrate installed plugins
-class CreateSomeModels < ActiveRecord::Migration
- def self.up
- create_table :example_plugin_model, :force => true do |t|
- t.column "example_attribute", :integer
- end
- end
-
- def self.down
- drop_table :example_plugin_model
- end
-end
diff --git a/extra/sample_plugin/init.rb b/extra/sample_plugin/init.rb
index 48a5d935c..5c543338c 100644
--- a/extra/sample_plugin/init.rb
+++ b/extra/sample_plugin/init.rb
@@ -18,8 +18,13 @@ Redmine::Plugin.register :sample_plugin do
# This permission has to be explicitly given
# It will be listed on the permissions screen
permission :example_say_goodbye, {:example => [:say_goodbye]}
+ # This permission can be given to project members only
+ permission :view_meetings, {:meetings => [:index, :show]}, :require => :member
end
# A new item is added to the project menu
- menu :project_menu, :label_plugin_example, :controller => 'example', :action => 'say_hello'
+ menu :project_menu, :sample_plugin, { :controller => 'example', :action => 'say_hello' }, :caption => 'Sample'
+
+ # Meetings are added to the activity view
+ activity_provider :meetings
end
diff --git a/extra/sample_plugin/lang/en.yml b/extra/sample_plugin/lang/en.yml
index bf62bc344..c4005a764 100644
--- a/extra/sample_plugin/lang/en.yml
+++ b/extra/sample_plugin/lang/en.yml
@@ -1,4 +1,5 @@
# Sample plugin
label_plugin_example: Sample Plugin
+label_meeting_plural: Meetings
text_say_hello: Plugin say 'Hello'
text_say_goodbye: Plugin say 'Good bye'
diff --git a/extra/sample_plugin/lang/fr.yml b/extra/sample_plugin/lang/fr.yml
index 2c0829c32..135050a5a 100644
--- a/extra/sample_plugin/lang/fr.yml
+++ b/extra/sample_plugin/lang/fr.yml
@@ -1,4 +1,5 @@
# Sample plugin
label_plugin_example: Plugin exemple
+label_meeting_plural: Meetings
text_say_hello: Plugin dit 'Bonjour'
text_say_goodbye: Plugin dit 'Au revoir'
diff --git a/extra/svn/Redmine.pm b/extra/svn/Redmine.pm
index 7505b71cb..2619196c7 100644
--- a/extra/svn/Redmine.pm
+++ b/extra/svn/Redmine.pm
@@ -8,8 +8,8 @@ against redmine database
=head1 SYNOPSIS
This module allow anonymous users to browse public project and
-registred users to browse and commit their project. authentication is
-done on the redmine database.
+registred users to browse and commit their project. Authentication is
+done against the redmine database or the LDAP configured in redmine.
This method is far simpler than the one with pam_* and works with all
database without an hassle but you need to have apache/mod_perl on the
@@ -29,12 +29,16 @@ On debian/ubuntu you must do :
aptitude install libapache-dbi-perl libapache2-mod-perl2 libdbd-mysql-perl
+If your Redmine users use LDAP authentication, you will also need
+Authen::Simple::LDAP (and IO::Socket::SSL if LDAPS is used):
+
+ aptitude install libauthen-simple-ldap-perl libio-socket-ssl-perl
+
=head1 CONFIGURATION
- ## if the module isn't in your perl path
- PerlRequire /usr/local/apache/Redmine.pm
- ## else
- # PerlModule Apache::Authn::Redmine
+ ## This module has to be in your perl path
+ ## eg: /usr/lib/perl5/Apache/Authn/Redmine.pm
+ PerlLoadModule Apache::Authn::Redmine
DAV svn
SVNParentPath "/var/svn"
@@ -47,12 +51,17 @@ On debian/ubuntu you must do :
PerlAuthenHandler Apache::Authn::Redmine::authen_handler
## for mysql
- PerlSetVar dsn DBI:mysql:database=databasename;host=my.db.server
+ RedmineDSN "DBI:mysql:database=databasename;host=my.db.server"
## for postgres
- # PerlSetVar dsn DBI:Pg:dbname=databasename;host=my.db.server
+ # RedmineDSN "DBI:Pg:dbname=databasename;host=my.db.server"
- PerlSetVar db_user redmine
- PerlSetVar db_pass password
+ RedmineDbUser "redmine"
+ RedmineDbPass "password"
+ ## Optional where clause (fulltext search would be slow and
+ ## database dependant).
+ # RedmineDbWhereClause "and members.role_id IN (1,2)"
+ ## Optional credentials cache size
+ # RedmineCacheCredsMax 50
To be able to browse repository inside redmine, you must add something
@@ -87,18 +96,99 @@ And you need to upgrade at least reposman.rb (after r860).
=cut
use strict;
+use warnings FATAL => 'all', NONFATAL => 'redefine';
use DBI;
use Digest::SHA1;
+# optional module for LDAP authentication
+my $CanUseLDAPAuth = eval("use Authen::Simple::LDAP; 1");
use Apache2::Module;
use Apache2::Access;
use Apache2::ServerRec qw();
use Apache2::RequestRec qw();
use Apache2::RequestUtil qw();
-use Apache2::Const qw(:common);
+use Apache2::Const qw(:common :override :cmd_how);
+use APR::Pool ();
+use APR::Table ();
+
# use Apache2::Directive qw();
+my @directives = (
+ {
+ name => 'RedmineDSN',
+ req_override => OR_AUTHCFG,
+ args_how => TAKE1,
+ errmsg => 'Dsn in format used by Perl DBI. eg: "DBI:Pg:dbname=databasename;host=my.db.server"',
+ },
+ {
+ name => 'RedmineDbUser',
+ req_override => OR_AUTHCFG,
+ args_how => TAKE1,
+ },
+ {
+ name => 'RedmineDbPass',
+ req_override => OR_AUTHCFG,
+ args_how => TAKE1,
+ },
+ {
+ name => 'RedmineDbWhereClause',
+ req_override => OR_AUTHCFG,
+ args_how => TAKE1,
+ },
+ {
+ name => 'RedmineCacheCredsMax',
+ req_override => OR_AUTHCFG,
+ args_how => TAKE1,
+ errmsg => 'RedmineCacheCredsMax must be decimal number',
+ },
+);
+
+sub RedmineDSN {
+ my ($self, $parms, $arg) = @_;
+ $self->{RedmineDSN} = $arg;
+ my $query = "SELECT
+ hashed_password, auth_source_id
+ FROM members, projects, users
+ WHERE
+ projects.id=members.project_id
+ AND users.id=members.user_id
+ AND users.status=1
+ AND login=?
+ AND identifier=? ";
+ $self->{RedmineQuery} = trim($query);
+}
+sub RedmineDbUser { set_val('RedmineDbUser', @_); }
+sub RedmineDbPass { set_val('RedmineDbPass', @_); }
+sub RedmineDbWhereClause {
+ my ($self, $parms, $arg) = @_;
+ $self->{RedmineQuery} = trim($self->{RedmineQuery}.($arg ? $arg : "")." ");
+}
+
+sub RedmineCacheCredsMax {
+ my ($self, $parms, $arg) = @_;
+ if ($arg) {
+ $self->{RedmineCachePool} = APR::Pool->new;
+ $self->{RedmineCacheCreds} = APR::Table::make($self->{RedmineCachePool}, $arg);
+ $self->{RedmineCacheCredsCount} = 0;
+ $self->{RedmineCacheCredsMax} = $arg;
+ }
+}
+
+sub trim {
+ my $string = shift;
+ $string =~ s/\s{2,}/ /g;
+ return $string;
+}
+
+sub set_val {
+ my ($key, $self, $parms, $arg) = @_;
+ $self->{$key} = $arg;
+}
+
+Apache2::Module::add(__PACKAGE__, \@directives);
+
+
my %read_only_methods = map { $_ => 1 } qw/GET PROPFIND REPORT OPTIONS/;
sub access_handler {
@@ -110,7 +200,7 @@ sub access_handler {
}
my $method = $r->method;
- return OK unless 1 == $read_only_methods{$method};
+ return OK unless defined $read_only_methods{$method};
my $project_id = get_project_identifier($r);
@@ -140,11 +230,12 @@ sub is_public_project {
my $dbh = connect_database($r);
my $sth = $dbh->prepare(
- "SELECT * FROM projects WHERE projects.identifier=? and projects.is_public=true;"
+ "SELECT * FROM projects WHERE projects.identifier=? and projects.is_public=true;"
);
$sth->execute($project_id);
my $ret = $sth->fetchrow_array ? 1 : 0;
+ $sth->finish();
$dbh->disconnect();
$ret;
@@ -175,20 +266,59 @@ sub is_member {
my $pass_digest = Digest::SHA1::sha1_hex($redmine_pass);
- my $sth = $dbh->prepare(
- "SELECT hashed_password FROM members, projects, users WHERE projects.id=members.project_id AND users.id=members.user_id AND login=? AND identifier=?;"
- );
+ my $cfg = Apache2::Module::get_config(__PACKAGE__, $r->server, $r->per_dir_config);
+ my $usrprojpass;
+ if ($cfg->{RedmineCacheCredsMax}) {
+ $usrprojpass = $cfg->{RedmineCacheCreds}->get($redmine_user.":".$project_id);
+ return 1 if (defined $usrprojpass and ($usrprojpass eq $pass_digest));
+ }
+ my $query = $cfg->{RedmineQuery};
+ my $sth = $dbh->prepare($query);
$sth->execute($redmine_user, $project_id);
my $ret;
while (my @row = $sth->fetchrow_array) {
- if ($row[0] eq $pass_digest) {
- $ret = 1;
- last;
+ unless ($row[1]) {
+ if ($row[0] eq $pass_digest) {
+ $ret = 1;
+ last;
+ }
+ } elsif ($CanUseLDAPAuth) {
+ my $sthldap = $dbh->prepare(
+ "SELECT host,port,tls,account,account_password,base_dn,attr_login from auth_sources WHERE id = ?;"
+ );
+ $sthldap->execute($row[1]);
+ while (my @rowldap = $sthldap->fetchrow_array) {
+ my $ldap = Authen::Simple::LDAP->new(
+ host => ($rowldap[2] == 1 || $rowldap[2] eq "t") ? "ldaps://$rowldap[0]" : $rowldap[0],
+ port => $rowldap[1],
+ basedn => $rowldap[5],
+ binddn => $rowldap[3] ? $rowldap[3] : "",
+ bindpw => $rowldap[4] ? $rowldap[4] : "",
+ filter => "(".$rowldap[6]."=%s)"
+ );
+ $ret = 1 if ($ldap->authenticate($redmine_user, $redmine_pass));
+ }
+ $sthldap->finish();
}
}
+ $sth->finish();
$dbh->disconnect();
+ if ($cfg->{RedmineCacheCredsMax} and $ret) {
+ if (defined $usrprojpass) {
+ $cfg->{RedmineCacheCreds}->set($redmine_user.":".$project_id, $pass_digest);
+ } else {
+ if ($cfg->{RedmineCacheCredsCount} < $cfg->{RedmineCacheCredsMax}) {
+ $cfg->{RedmineCacheCreds}->set($redmine_user.":".$project_id, $pass_digest);
+ $cfg->{RedmineCacheCredsCount}++;
+ } else {
+ $cfg->{RedmineCacheCreds}->clear();
+ $cfg->{RedmineCacheCredsCount} = 0;
+ }
+ }
+ }
+
$ret;
}
@@ -202,9 +332,9 @@ sub get_project_identifier {
sub connect_database {
my $r = shift;
-
- my ($dsn, $db_user, $db_pass) = map { $r->dir_config($_) } qw/dsn db_user db_pass/;
- return DBI->connect($dsn, $db_user, $db_pass);
+
+ my $cfg = Apache2::Module::get_config(__PACKAGE__, $r->server, $r->per_dir_config);
+ return DBI->connect($cfg->{RedmineDSN}, $cfg->{RedmineDbUser}, $cfg->{RedmineDbPass});
}
1;
diff --git a/extra/svn/reposman.rb b/extra/svn/reposman.rb
index 729970406..0b476cdc4 100755
--- a/extra/svn/reposman.rb
+++ b/extra/svn/reposman.rb
@@ -78,6 +78,7 @@ $quiet = false
$redmine_host = ''
$repos_base = ''
$svn_owner = 'root'
+$use_groupid = true
$svn_url = false
$test = false
@@ -92,7 +93,7 @@ begin
case opt
when '--svn-dir'; $repos_base = arg.dup
when '--redmine-host'; $redmine_host = arg.dup
- when '--owner'; $svn_owner = arg.dup
+ when '--owner'; $svn_owner = arg.dup; $use_groupid = false;
when '--url'; $svn_url = arg.dup
when '--verbose'; $verbose += 1
when '--test'; $test = true
@@ -144,7 +145,7 @@ def set_owner_and_rights(project, repos_path, &block)
if RUBY_PLATFORM =~ /mswin/
yield if block_given?
else
- uid, gid = Etc.getpwnam($svn_owner).uid, Etc.getgrnam(project.identifier).gid
+ uid, gid = Etc.getpwnam($svn_owner).uid, ($use_groupid ? Etc.getgrnam(project.identifier).gid : 0)
right = project.is_public ? 0775 : 0770
yield if block_given?
Find.find(repos_path) do |f|
diff --git a/lang/bg.yml b/lang/bg.yml
index b60173ae1..ddc3368ef 100644
--- a/lang/bg.yml
+++ b/lang/bg.yml
@@ -48,8 +48,9 @@ general_text_no: 'не'
general_text_yes: 'да'
general_lang_name: 'Bulgarian'
general_csv_separator: ','
-general_csv_encoding: cp1251
-general_pdf_encoding: cp1251
+general_csv_decimal_separator: '.'
+general_csv_encoding: UTF-8
+general_pdf_encoding: UTF-8
general_day_names: Понеделник,Вторник,СрÑда,Четвъртък,Петък,Събота,ÐеделÑ
general_first_day_of_week: '1'
@@ -57,27 +58,29 @@ notice_account_updated: Профилът е обновен уÑпешно.
notice_account_invalid_creditentials: Ðевалиден потребител или парола.
notice_account_password_updated: Паролата е уÑпешно променена.
notice_account_wrong_password: Грешна парола
-notice_account_register_done: Ðкаунтът е Ñъздаден уÑпешно.
-notice_account_unknown_email: Ðепознат потребител.
-notice_can_t_change_password: Този акаунт е Ñ Ð²ÑŠÐ½ÑˆÐµÐ½ метод за оторизациÑ. Ðевъзможна ÑмÑна на паролата.
+notice_account_register_done: Профилът е Ñъздаден уÑпешно.
+notice_account_unknown_email: Ðепознат e-mail.
+notice_can_t_change_password: Този профил е Ñ Ð²ÑŠÐ½ÑˆÐµÐ½ метод за оторизациÑ. Ðевъзможна ÑмÑна на паролата.
notice_account_lost_email_sent: Изпратен ви е e-mail Ñ Ð¸Ð½Ñтрукции за избор на нова парола.
-notice_account_activated: Ðкаунтът ви е активиран. Вече може да влезете.
+notice_account_activated: Профилът ви е активиран. Вече може да влезете в ÑиÑтемата.
notice_successful_create: УÑпешно Ñъздаване.
notice_successful_update: УÑпешно обновÑване.
notice_successful_delete: УÑпешно изтриване.
notice_successful_connection: УÑпешно Ñвързване.
notice_file_not_found: ÐеÑъщеÑтвуваща или премеÑтена Ñтраница.
notice_locking_conflict: Друг потребител Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ñ Ñ‚ÐµÐ·Ð¸ данни в момента.
-notice_scm_error: ÐеÑъщеÑтвуващ обект в Ñклада.
notice_not_authorized: ÐÑмате право на доÑтъп до тази Ñтраница.
notice_email_sent: Изпратен e-mail на %s
notice_email_error: Грешка при изпращане на e-mail (%s)
notice_feeds_access_key_reseted: Ð’Ð°ÑˆÐ¸Ñ ÐºÐ»ÑŽÑ‡ за RSS доÑтъп беше променен.
-mail_subject_lost_password: Вашата парола
+error_scm_not_found: ÐеÑъщеÑтвуващ обект в хранилището.
+error_scm_command_failed: "Грешка при опит за ÐºÐ¾Ð¼ÑƒÐ½Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ðµ: %s"
+
+mail_subject_lost_password: Вашата парола (%s)
mail_body_lost_password: 'За да Ñмените паролата Ñи, използвайте ÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð»Ð¸Ð½Ðº:'
-mail_subject_register: ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ Ð½Ð° акаунт
-mail_body_register: 'За да активирате акаунта Ñи използвайте ÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð»Ð¸Ð½Ðº:'
+mail_subject_register: ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ Ð½Ð° профил (%s)
+mail_body_register: 'За да активирате профила Ñи използвайте ÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð»Ð¸Ð½Ðº:'
gui_validation_error: 1 грешка
gui_validation_error_plural: %d грешки
@@ -93,9 +96,9 @@ field_filename: Файл
field_filesize: Големина
field_downloads: Downloads
field_author: Ðвтор
-field_created_on: Създадена
+field_created_on: От дата
field_updated_on: Обновена
-field_field_format: Формат
+field_field_format: Тип
field_is_for_all: За вÑички проекти
field_possible_values: Възможни ÑтойноÑти
field_regexp: РегулÑрен израз
@@ -111,11 +114,11 @@ field_notes: Бележка
field_is_closed: Затворена задача
field_is_default: Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿Ð¾ подразбиране
field_tracker: Тракер
-field_subject: Тема
+field_subject: ОтноÑно
field_due_date: Крайна дата
field_assigned_to: Възложена на
field_priority: Приоритет
-field_fixed_version: ВерÑиÑ
+field_fixed_version: Планувана верÑиÑ
field_user: Потребител
field_role: РолÑ
field_homepage: Ðачална Ñтраница
@@ -136,7 +139,7 @@ field_version: ВерÑиÑ
field_type: Тип
field_host: ХоÑÑ‚
field_port: Порт
-field_account: Ðкаунт
+field_account: Профил
field_base_dn: Base DN
field_attr_login: Login attribute
field_attr_firstname: Firstname attribute
@@ -161,6 +164,7 @@ field_delay: ОтмеÑтване
field_assignable: Възможно е възлагане на задачи за тази ролÑ
field_redirect_existing_links: ПренаÑочване на ÑъщеÑтвуващи линкове
field_estimated_hours: ИзчиÑлено време
+field_default_value: СтойноÑÑ‚ по подразбиране
setting_app_title: Заглавие
setting_app_subtitle: ОпиÑание
@@ -168,15 +172,15 @@ setting_welcome_text: Допълнителен текÑÑ‚
setting_default_language: Език по подразбиране
setting_login_required: ИзиÑкване за вход в ÑиÑтемата
setting_self_registration: РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ потребители
-setting_attachment_max_size: МакÑимално голÑм приложен файл
+setting_attachment_max_size: МакÑимална големина на прикачен файл
setting_issues_export_limit: Лимит за екÑпорт на задачи
setting_mail_from: E-mail Ð°Ð´Ñ€ÐµÑ Ð·Ð° емиÑии
setting_host_name: ХоÑÑ‚
setting_text_formatting: Форматиране на текÑта
setting_wiki_compression: Wiki компреÑиране на иÑториÑта
setting_feeds_limit: Лимит на Feeds
-setting_autofetch_changesets: Ðвтоматично обработване на commits в Ñклада
-setting_sys_api_enabled: Разрешаване на WS за управление на Ñклада
+setting_autofetch_changesets: Ðвтоматично обработване на ревизиите
+setting_sys_api_enabled: Разрешаване на WS за управление
setting_commit_ref_keywords: ОтбелÑзващи ключови думи
setting_commit_fix_keywords: Приключващи ключови думи
setting_autologin: Ðвтоматичен вход
@@ -228,7 +232,7 @@ label_password_lost: Забравена парола
label_home: Ðачало
label_my_page: Лична Ñтраница
label_my_account: Профил
-label_my_projects: Моите проекти
+label_my_projects: Проекти, в които учаÑтвам
label_administration: ÐдминиÑтрациÑ
label_login: Вход
label_logout: Изход
@@ -251,7 +255,7 @@ label_subproject_plural: Подпроекти
label_min_max_length: Мин. - МакÑ. дължина
label_list: СпиÑък
label_date: Дата
-label_integer: ЧиÑло
+label_integer: ЦелочиÑлен
label_boolean: ЧекбокÑ
label_string: ТекÑÑ‚
label_text: Дълъг текÑÑ‚
@@ -329,7 +333,7 @@ label_ago: преди
label_contains: Ñъдържа
label_not_contains: не Ñъдържа
label_day_plural: дни
-label_repository: Склад
+label_repository: Хранилище
label_browse: Разглеждане
label_modification: %d промÑна
label_modification_plural: %d промени
@@ -372,8 +376,8 @@ label_f_hour_plural: %.2f чаÑа
label_time_tracking: ОтделÑне на време
label_change_plural: Промени
label_statistics: СтатиÑтики
-label_commits_per_month: Commits за меÑец
-label_commits_per_author: Commits за автор
+label_commits_per_month: Ревизии по меÑеци
+label_commits_per_author: Ревизии по автор
label_view_diff: Виж разликите
label_diff_inline: хоризонтално
label_diff_side_by_side: вертикално
@@ -386,7 +390,7 @@ label_applied_status: Промени ÑтатуÑа на
label_loading: Зареждане...
label_relation_new: Ðова релациÑ
label_relation_delete: Изтриване на релациÑ
-label_relates_to: Свързана ÑÑŠÑ
+label_relates_to: Ñвързана ÑÑŠÑ
label_duplicates: дублира
label_blocks: блокира
label_blocked_by: блокирана от
@@ -415,7 +419,7 @@ label_week: Седмица
label_date_from: От
label_date_to: До
label_language_based: Ð’ завиÑимоÑÑ‚ от езика
-label_sort_by: Sort by %s
+label_sort_by: Сортиране по %s
label_send_test_email: Изпращане на теÑтов e-mail
label_feeds_access_key_created_on: %s от Ñъздаването на RSS ключа
label_module_plural: Модули
@@ -424,10 +428,10 @@ label_updated_time: Обновена преди %s
label_jump_to_a_project: Проект...
button_login: Вход
-button_submit: Приложи
+button_submit: Прикачване
button_save: ЗапиÑ
-button_check_all: Маркирай вÑички
-button_uncheck_all: ИзчиÑти вÑички
+button_check_all: Избор на вÑички
+button_uncheck_all: ИзчиÑтване на вÑички
button_delete: Изтриване
button_create: Създаване
button_test: ТеÑÑ‚
@@ -478,9 +482,9 @@ text_length_between: От %d до %d Ñимвола.
text_tracker_no_workflow: ÐÑма дефиниран работен Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð° този тракер
text_unallowed_characters: Ðепозволени Ñимволи
text_comma_separated: Позволено е изброÑване (Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ» запетаÑ).
-text_issues_ref_in_commit_messages: ОтбелÑзване и приключване на задачи от commit ÑъобщениÑ
-text_issue_added: Публикувана е нова задача Ñ Ð½Ð¾Ð¼ÐµÑ€ %s.
-text_issue_updated: Задача %s е обновена.
+text_issues_ref_in_commit_messages: ОтбелÑзване и приключване на задачи от ревизии
+text_issue_added: Публикувана е нова задача Ñ Ð½Ð¾Ð¼ÐµÑ€ %s (от %s).
+text_issue_updated: Задача %s е обновена (от %s).
text_wiki_destroy_confirmation: Сигурни ли Ñте, че иÑкате да изтриете това Wiki и цÑлото му Ñъдържание?
text_issue_category_destroy_question: Има задачи (%d) обвързани Ñ Ñ‚Ð°Ð·Ð¸ категориÑ. Какво ще изберете?
text_issue_category_destroy_assignments: Премахване на връзките Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñта
@@ -511,12 +515,12 @@ default_activity_development: Разработка
enumeration_issue_priorities: Приоритети на задачи
enumeration_doc_categories: Категории документи
enumeration_activities: ДейноÑти (time tracking)
-label_file_plural: Files
-label_changeset_plural: Changesets
+label_file_plural: Файлове
+label_changeset_plural: Ревизии
field_column_names: Колони
label_default_columns: По подразбиране
setting_issue_list_default_columns: Показвани колони по подразбиране
-setting_repositories_encodings: Encodings на Ñкладовете
+setting_repositories_encodings: Кодови таблици
notice_no_issue_selected: "ÐÑма избрани задачи."
label_bulk_edit_selected_issues: Редактиране на задачи
label_no_change_option: (Без промÑна)
@@ -524,23 +528,112 @@ notice_failed_to_save_issues: "ÐеуÑпешен Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° %d задач
label_theme: Тема
label_default: По подразбиране
label_search_titles_only: Само в заглавиÑта
-label_nobody: nobody
-button_change_password: Change password
-text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)."
-label_user_mail_option_selected: "For any event on the selected projects only..."
-label_user_mail_option_all: "For any event on all my projects"
-label_user_mail_option_none: "Only for things I watch or I'm involved in"
-setting_emails_footer: Emails footer
-label_float: Float
-button_copy: Copy
-mail_body_account_information_external: You can use your "%s" account to log into Redmine.
-mail_body_account_information: Your Redmine account information
-setting_protocol: Protocol
-label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
-setting_time_format: Time format
-label_registration_activation_by_email: account activation by email
-mail_subject_account_activation_request: Redmine account activation request
-mail_body_account_activation_request: 'A new user (%s) has registered. His account his pending your approval:'
-label_registration_automatic_activation: automatic account activation
-label_registration_manual_activation: manual account activation
-notice_account_pending: "Your account was created and is now pending administrator approval."
+label_nobody: никой
+button_change_password: ПромÑна на парола
+text_user_mail_option: "За неизбраните проекти, ще получавате извеÑÑ‚Ð¸Ñ Ñамо за наблюдавани дейноÑти или в които учаÑтвате (Ñ‚.е. автор или назначени на мен)."
+label_user_mail_option_selected: "За вÑички ÑÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ñамо в избраните проекти..."
+label_user_mail_option_all: "За вÑÑко Ñъбитие в проектите, в които учаÑтвам"
+label_user_mail_option_none: "Само за наблюдавани или в които учаÑтвам (автор или назначени на мен)"
+setting_emails_footer: ПодтекÑÑ‚ за e-mail
+label_float: Дробно
+button_copy: Копиране
+mail_body_account_information_external: Можете да използвате Ð²Ð°ÑˆÐ¸Ñ "%s" профил за вход.
+mail_body_account_information: ИнформациÑта за профила ви
+setting_protocol: Протокол
+label_user_mail_no_self_notified: "Ðе иÑкам извеÑÑ‚Ð¸Ñ Ð·Ð° извършени от мен промени"
+setting_time_format: Формат на чаÑа
+label_registration_activation_by_email: активиране на профила по email
+mail_subject_account_activation_request: ЗаÑвка за активиране на профил в %s
+mail_body_account_activation_request: 'Има новорегиÑтриран потребител (%s), очакващ вашето одобрение:'
+label_registration_automatic_activation: автоматично активиране
+label_registration_manual_activation: ръчно активиране
+notice_account_pending: "Профилът Ви е Ñъздаден и очаква одобрение от админиÑтратор."
+field_time_zone: ЧаÑова зона
+text_caracters_minimum: Минимум %d Ñимвола.
+setting_bcc_recipients: Получатели на Ñкрито копие (bcc)
+button_annotate: ÐнотациÑ
+label_issues_by: Задачи по %s
+field_searchable: С възможноÑÑ‚ за търÑене
+label_display_per_page: 'Ðа Ñтраница по: %s'
+setting_per_page_options: Опции за Ñтраниране
+label_age: ВъзраÑÑ‚
+notice_default_data_loaded: Примерната информациÑта е уÑпешно заредена.
+text_load_default_configuration: Зареждане на примерна информациÑ
+text_no_configuration_data: "Ð’Ñе още не Ñа конфигурирани Роли, тракери, ÑтатуÑи на задачи и работен процеÑ.\nСтрого Ñе препоръчва зареждането на примерната информациÑ. Веднъж заредена ще имате възможноÑÑ‚ да Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð°Ñ‚Ðµ."
+error_can_t_load_default_data: "Грешка при зареждане на примерната информациÑ: %s"
+button_update: ОбновÑване
+label_change_properties: ПромÑна на наÑтройки
+label_general: ОÑновни
+label_repository_plural: Хранилища
+label_associated_revisions: ÐÑоциирани ревизии
+setting_user_format: ПотребителÑки формат
+text_status_changed_by_changeset: Приложено Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %s.
+label_more: Още
+text_issues_destroy_confirmation: 'Сигурни ли Ñте, че иÑкате да изтриете избраните задачи?'
+label_scm: SCM (СиÑтема за контрол на кода)
+text_select_project_modules: 'Изберете активните модули за този проект:'
+label_issue_added: Добавена задача
+label_issue_updated: Обновена задача
+label_document_added: Добавен документ
+label_message_posted: Добавено Ñъобщение
+label_file_added: Добавен файл
+label_news_added: Добавена новина
+project_module_boards: Форуми
+project_module_issue_tracking: Тракинг
+project_module_wiki: Wiki
+project_module_files: Файлове
+project_module_documents: Документи
+project_module_repository: Хранилище
+project_module_news: Ðовини
+project_module_time_tracking: ОтделÑне на време
+text_file_repository_writable: ВъзможноÑÑ‚ за пиÑане в хранилището Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²Ðµ
+text_default_administrator_account_changed: Сменен Ñ„Ð°Ð±Ñ€Ð¸Ñ‡Ð½Ð¸Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸ÑтраторÑки профил
+text_rmagick_available: Ðаличен RMagick (по избор)
+button_configure: Конфигуриране
+label_plugins: Плъгини
+label_ldap_authentication: LDAP оторизациÑ
+label_downloads_abbr: D/L
+label_this_month: Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ Ð¼ÐµÑец
+label_last_n_days: поÑледните %d дни
+label_all_time: вÑички
+label_this_year: текущата година
+label_date_range: Период
+label_last_week: поÑледната Ñедмица
+label_yesterday: вчера
+label_last_month: поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð¼ÐµÑец
+label_add_another_file: ДобавÑне на друг файл
+label_optional_description: Ðезадължително опиÑание
+text_destroy_time_entries_question: %.02f чаÑа Ñа отделени на задачите, които иÑкате да изтриете. Какво избирате?
+error_issue_not_found_in_project: 'Задачата не е намерена или не принадлежи на този проект'
+text_assign_time_entries_to_project: ПрехвърлÑне на отделеното време към проект
+text_destroy_time_entries: Изтриване на отделеното време
+text_reassign_time_entries: 'ПрехвърлÑне на отделеното време към задача:'
+setting_activity_days_default: Брой дни показвани на таб ДейноÑÑ‚
+label_chronological_order: Хронологичен ред
+field_comments_sorting: Сортиране на коментарите
+label_reverse_chronological_order: Обратен хронологичен ред
+label_preferences: ПредпочитаниÑ
+setting_display_subprojects_issues: Показване на подпроектите в проектите по подразбиране
+label_overall_activity: ЦÑлоÑтна дейноÑÑ‚
+setting_default_projects_public: Ðовите проекти Ñа публични по подразбиране
+error_scm_annotate: "Обектът не ÑъщеÑтвува или не може да бъде анотиран."
+label_planning: Планиране
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
+label_and_its_subprojects: %s and its subprojects
+mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
+mail_subject_reminder: "%d issue(s) due in the next days"
+text_user_wrote: '%s wrote:'
+label_duplicated_by: duplicated by
+setting_enabled_scm: Enabled SCM
+text_enumeration_category_reassign_to: 'Reassign them to this value:'
+text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
+text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/cs.yml b/lang/cs.yml
index 487ec967a..767fcdbde 100644
--- a/lang/cs.yml
+++ b/lang/cs.yml
@@ -1,37 +1,40 @@
+# CZ translation by Maxim Krušina | Massimo Filippi, s.r.o. | maxim@mxm.cz
+# Based on original CZ translation by Jan KadleÄek
+
_gloc_rule_default: '|n| n==1 ? "" : "_plural" '
-actionview_datehelper_select_day_prefix:
+actionview_datehelper_select_day_prefix:
actionview_datehelper_select_month_names: Leden,Únor,BÅ™ezen,Duben,KvÄ›ten,ÄŒerven,ÄŒervenec,Srpen,ZářÃ,ŘÃjen,Listopad,Prosinec
actionview_datehelper_select_month_names_abbr: Led,Úno,BÅ™e,Dub,KvÄ›,ÄŒer,ÄŒvc,Srp,Zář,ŘÃj,Lis,Pro
-actionview_datehelper_select_month_prefix:
-actionview_datehelper_select_year_prefix:
+actionview_datehelper_select_month_prefix:
+actionview_datehelper_select_year_prefix:
actionview_datehelper_time_in_words_day: 1 den
actionview_datehelper_time_in_words_day_plural: %d dny
-actionview_datehelper_time_in_words_hour_about: asi hodinu
-actionview_datehelper_time_in_words_hour_about_plural: asi %d hodin
-actionview_datehelper_time_in_words_hour_about_single: asi hodinu
-actionview_datehelper_time_in_words_minute: 1 minuta
-actionview_datehelper_time_in_words_minute_half: půl minuty
-actionview_datehelper_time_in_words_minute_less_than: méně než minutu
-actionview_datehelper_time_in_words_minute_plural: %d minut
-actionview_datehelper_time_in_words_minute_single: 1 minuta
-actionview_datehelper_time_in_words_second_less_than: méně než sekunda
-actionview_datehelper_time_in_words_second_less_than_plural: méně než %d sekund
+actionview_datehelper_time_in_words_hour_about: asi hodinou
+actionview_datehelper_time_in_words_hour_about_plural: asi %d hodinami
+actionview_datehelper_time_in_words_hour_about_single: asi hodinou
+actionview_datehelper_time_in_words_minute: 1 minutou
+actionview_datehelper_time_in_words_minute_half: půl minutou
+actionview_datehelper_time_in_words_minute_less_than: méně než minutou
+actionview_datehelper_time_in_words_minute_plural: %d minutami
+actionview_datehelper_time_in_words_minute_single: 1 minutou
+actionview_datehelper_time_in_words_second_less_than: méně než sekundou
+actionview_datehelper_time_in_words_second_less_than_plural: méně než %d sekundami
actionview_instancetag_blank_option: ProsÃm vyberte
activerecord_error_inclusion: nenà zahrnuto v seznamu
activerecord_error_exclusion: je rezervováno
activerecord_error_invalid: je neplatné
-activerecord_error_confirmation: doesn't match confirmation
-activerecord_error_accepted: must be accepted
+activerecord_error_confirmation: se neshoduje s potvrzenÃm
+activerecord_error_accepted: musà být akceptováno
activerecord_error_empty: nemůže být prázdný
activerecord_error_blank: nemůže být prázdný
activerecord_error_too_long: je pÅ™ÃliÅ¡ dlouhý
activerecord_error_too_short: je pÅ™ÃliÅ¡ krátký
activerecord_error_wrong_length: má chybnou délku
-activerecord_error_taken: has already been taken
+activerecord_error_taken: je již použito
activerecord_error_not_a_number: nenà ÄÃslo
-activerecord_error_not_a_date: nenà platný datum
+activerecord_error_not_a_date: nenà platné datum
activerecord_error_greater_than_start_date: musà být vÄ›tšà než poÄáteÄnà datum
activerecord_error_not_same_project: nepatřà stejnému projektu
activerecord_error_circular_dependency: Tento vztah by vytvořil cyklickou závislost
@@ -45,9 +48,10 @@ general_fmt_time: %%I:%%M %%p
general_text_No: 'Ne'
general_text_Yes: 'Ano'
general_text_no: 'ne'
-general_text_yes: 'Ano'
+general_text_yes: 'ano'
general_lang_name: 'Čeština'
general_csv_separator: ','
+general_csv_decimal_separator: '.'
general_csv_encoding: UTF-8
general_pdf_encoding: UTF-8
general_day_names: PondÄ›lÃ,Úterý,StÅ™eda,ÄŒtvrtek,Pátek,Sobota,NedÄ›le
@@ -62,9 +66,9 @@ notice_account_unknown_email: Neznámý uživatel.
notice_can_t_change_password: Tento úÄet použÃvá externà autentifikaci. Zde heslo zmÄ›nit nemůžete.
notice_account_lost_email_sent: Byl vám zaslán email s intrukcemi jak si nastavÃte nové heslo.
notice_account_activated: Váš úÄet byl aktivován. Nynà se můžete pÅ™ihlásit.
-notice_successful_create: Úspěšné vytvoÅ™enÃ.
-notice_successful_update: Úspěšná aktualizace.
-notice_successful_delete: Úspěšné smazánÃ.
+notice_successful_create: Úspěšně vytvořeno.
+notice_successful_update: Úspěšně aktualizováno.
+notice_successful_delete: Úspěšně odstraněno.
notice_successful_connection: Úspěšné pÅ™ipojenÃ.
notice_file_not_found: Stránka na kterou se snažÃte zobrazit neexistuje nebo byla smazána.
notice_locking_conflict: Údaje byly změněny jiným uživatelem.
@@ -73,19 +77,32 @@ notice_not_authorized: Nemáte dostateÄná práva pro zobrazenà této stránky
notice_email_sent: Na adresu %s byl odeslán email
notice_email_error: PÅ™i odesÃlánà emailu nastala chyba (%s)
notice_feeds_access_key_reseted: Váš klÃÄ pro pÅ™Ãstup k RSS byl resetován.
+notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s."
+notice_no_issue_selected: "Nebyl zvolen žádný úkol. ProsÃm, zvolte úkoly, které chcete editovat"
+notice_account_pending: "Váš úÄet byl vytvoÅ™en, nynà Äeká na schválenà administrátorem."
+notice_default_data_loaded: Výchozà konfigurace úspěšně nahrána.
-mail_subject_lost_password: Vaše heslo
-mail_body_lost_password: 'To change your Redmine password, click on the following link:'
-mail_subject_register: aktivace úÄtu
-mail_body_register: 'To activate your Redmine account, click on the following link:'
+error_can_t_load_default_data: "Výchozà konfigurace nebyla nahrána: %s"
+error_scm_not_found: "Položka a/nebo revize neexistujà v repository."
+error_scm_command_failed: "PÅ™i pokusu o pÅ™Ãstup k repository doÅ¡lo k chybÄ›: %s"
+error_issue_not_found_in_project: 'Úkol nebyl nalezen nebo nepatřà k tomuto projektu'
+
+mail_subject_lost_password: Vaše heslo (%s)
+mail_body_lost_password: 'Pro zmÄ›nu vaÅ¡eho hesla kliknÄ›te na následujÃcà odkaz:'
+mail_subject_register: Aktivace úÄtu (%s)
+mail_body_register: 'Pro aktivaci vaÅ¡eho úÄtu kliknÄ›te na následujÃcà odkaz:'
+mail_body_account_information_external: Pomocà vaÅ¡eho úÄtu "%s" se můžete pÅ™ihlásit.
+mail_body_account_information: Informace o vaÅ¡em úÄtu
+mail_subject_account_activation_request: Aktivace %s úÄtu
+mail_body_account_activation_request: Byl zaregistrován nový uživatel "%s". Aktivace jeho úÄtu závisà na vaÅ¡em potvrzenÃ.
gui_validation_error: 1 chyba
gui_validation_error_plural: %d chyb(y)
-field_name: Jméno
+field_name: Název
field_description: Popis
-field_summary: ShrnutÃ
-field_is_required: Požadovaný
+field_summary: Přehled
+field_is_required: Povinné pole
field_firstname: Jméno
field_lastname: PÅ™ÃjmenÃ
field_mail: Email
@@ -103,30 +120,30 @@ field_min_length: Minimálnà délka
field_max_length: Maximálnà délka
field_value: Hodnota
field_category: Kategorie
-field_title: Titulek
+field_title: Název
field_project: Projekt
-field_issue: Požadavek
+field_issue: Úkol
field_status: Stav
field_notes: Poznámka
-field_is_closed: Požadavek uzavřen
+field_is_closed: Úkol uzavřen
field_is_default: Výchozà stav
field_tracker: Fronta
field_subject: Předmět
-field_due_date: Po lhůtě
+field_due_date: UzavÅ™Ãt do
field_assigned_to: Přiřazeno
field_priority: Priorita
-field_fixed_version: Pevná verze
+field_fixed_version: Přiřazeno k verzi
field_user: Uživatel
field_role: Role
-field_homepage: ÚvodnÃ
+field_homepage: Homepage
field_is_public: Veřejný
-field_parent: Podprojekt
-field_is_in_chlog: Požadavky zobrazené v změnovém logu
-field_is_in_roadmap: Požadavky zobrazené v roadmapě
+field_parent: Nadřazený projekt
+field_is_in_chlog: Úkoly zobrazené v změnovém logu
+field_is_in_roadmap: Úkoly zobrazené v plánu
field_login: PÅ™ihlášenÃ
-field_mail_notification: Emailové oznámenÃ
+field_mail_notification: Emailová oznámenÃ
field_admin: Administrátor
-field_last_login_on: Poslednà pÅ™ipojenÃ
+field_last_login_on: Poslednà pÅ™ihlášenÃ
field_language: Jazyk
field_effective_date: Datum
field_password: Heslo
@@ -138,12 +155,12 @@ field_host: Host
field_port: Port
field_account: ÚÄet
field_base_dn: Base DN
-field_attr_login: Login attribute
-field_attr_firstname: Firstname attribute
-field_attr_lastname: Lastname attribute
-field_attr_mail: Email attribute
+field_attr_login: Přihlášenà (atribut)
+field_attr_firstname: Jméno (atribut)
+field_attr_lastname: PÅ™Ãjemnà (atribut)
+field_attr_mail: Email (atribut)
field_onthefly: Automatické vytvářenà uživatelů
-field_start_date: Start
+field_start_date: ZaÄátek
field_done_ratio: %% Hotovo
field_auth_source: AutentifikaÄnà mód
field_hide_mail: Nezobrazovat můj email
@@ -155,31 +172,58 @@ field_hours: Hodiny
field_activity: Aktivita
field_spent_on: Datum
field_identifier: Identifikátor
-field_is_filter: Used as a filter
-field_issue_to_id: Vztažený požadavek
+field_is_filter: PoužÃt jako filtr
+field_issue_to_id: SouvisejÃcà úkol
field_delay: ZpoždÄ›nÃ
-field_assignable: Požadavky mohou být přiřazeny této roli
+field_assignable: Úkoly mohou být přiřazeny této roli
+field_redirect_existing_links: PÅ™esmÄ›rovat stvávajÃcà odkazy
+field_estimated_hours: Odhadovaná doba
+field_column_names: Sloupce
+field_time_zone: Časové pásmo
+field_searchable: Umožnit vyhledávánÃ
+field_default_value: Výchozà hodnota
+field_comments_sorting: Zobrazit komentáře
-setting_app_title: Titulek aplikace
+setting_app_title: Název aplikace
setting_app_subtitle: Podtitulek aplikace
setting_welcome_text: UvÃtacà text
setting_default_language: Výchozà jazyk
setting_login_required: Auten. vyžadována
setting_self_registration: Povolena automatická registrace
setting_attachment_max_size: Maximálnà velikost pÅ™Ãlohy
-setting_issues_export_limit: Limit pro export požadavků
-setting_mail_from: Emission mail adresa
+setting_issues_export_limit: Limit pro export úkolů
+setting_mail_from: OdesÃlat emaily z adresy
+setting_bcc_recipients: PÅ™Ãjemci skryté kopie (bcc)
setting_host_name: Host name
setting_text_formatting: Formátovánà textu
setting_wiki_compression: Komperese historie Wiki
setting_feeds_limit: Feed content limit
+setting_default_projects_public: Nové projekty nastavovat jako veřejné
setting_autofetch_changesets: Autofetch commits
setting_sys_api_enabled: Povolit WS pro správu repozitory
-setting_commit_ref_keywords: Referencing keywords
-setting_commit_fix_keywords: Fixing keywords
+setting_commit_ref_keywords: KlÃÄová slova pro odkazy
+setting_commit_fix_keywords: KlÃÄová slova pro uzavÅ™enÃ
setting_autologin: Automatické pÅ™ihlaÅ¡ovánÃ
-setting_date_format: Formát datumu
-setting_cross_project_issue_relations: Povolit vztahy požadavků mezi projekty
+setting_date_format: Formát data
+setting_time_format: Formát Äasu
+setting_cross_project_issue_relations: Povolit vazby úkolů napÅ™ÃÄ projekty
+setting_issue_list_default_columns: Výchozà sloupce zobrazené v seznamu úkolů
+setting_repositories_encodings: KódovánÃ
+setting_emails_footer: PatiÄka emailů
+setting_protocol: Protokol
+setting_per_page_options: Povolené poÄty řádků na stránce
+setting_user_format: Formát zobrazenà uživatele
+setting_activity_days_default: Days displayed on project activity
+setting_display_subprojects_issues: Display subprojects issues on main projects by default
+
+project_module_issue_tracking: Sledovánà úkolů
+project_module_time_tracking: Sledovánà Äasu
+project_module_news: Novinky
+project_module_documents: Dokumenty
+project_module_files: Soubory
+project_module_wiki: Wiki
+project_module_repository: Repository
+project_module_boards: Diskuse
label_user: Uživatel
label_user_plural: Uživatelé
@@ -189,13 +233,17 @@ label_project_new: Nový projekt
label_project_plural: Projekty
label_project_all: Všechny projekty
label_project_latest: Poslednà projekty
-label_issue: Požadavek
-label_issue_new: Nový požadavek
-label_issue_plural: Požadavky
-label_issue_view_all: Všechny požadavky
+label_issue: Úkol
+label_issue_new: Nový úkol
+label_issue_plural: Úkoly
+label_issue_view_all: Všechny úkoly
+label_issues_by: Úkoly od uživatele %s
+label_issue_added: Úkol přidán
+label_issue_updated: Úkol aktualizován
label_document: Dokument
label_document_new: Nový dokument
label_document_plural: Dokumenty
+label_document_added: Dokument přidán
label_role: Role
label_role_plural: Role
label_role_new: Nová role
@@ -207,16 +255,16 @@ label_tracker: Fronta
label_tracker_plural: Fronty
label_tracker_new: Nová fronta
label_workflow: Workflow
-label_issue_status: Stav požadavku
-label_issue_status_plural: Stavy požadavku
+label_issue_status: Stav úkolu
+label_issue_status_plural: Stavy úkolů
label_issue_status_new: Nový stav
-label_issue_category: Kategorie požadavku
-label_issue_category_plural: Kategorie požadavku
+label_issue_category: Kategorie úkolu
+label_issue_category_plural: Kategorie úkolů
label_issue_category_new: Nová kategorie
label_custom_field: Uživatelské pole
-label_custom_field_plural: Uživatelské pole
+label_custom_field_plural: Uživatelská pole
label_custom_field_new: Nové uživatelské pole
-label_enumerations: ÄŒÃselnÃky
+label_enumerations: Seznamy
label_enumeration_new: Nová hodnota
label_information: Informace
label_information_plural: Informace
@@ -231,13 +279,14 @@ label_administration: Administrace
label_login: PÅ™ihlášenÃ
label_logout: OdhlášenÃ
label_help: Nápověda
-label_reported_issues: Nahlášené požadavky
-label_assigned_to_me_issues: Moje požadavky
+label_reported_issues: Nahlášené úkoly
+label_assigned_to_me_issues: Mé úkoly
label_last_login: Poslednà pÅ™ihlášenÃ
label_last_updates: Poslednà změna
label_last_updates_plural: %d poslednà změny
-label_registered_on: Registered on
+label_registered_on: Registrován
label_activity: Aktivita
+label_overall_activity: Celková aktivita
label_new: Nový
label_logged_as: Přihlášen jako
label_environment: ProstÅ™edÃ
@@ -249,36 +298,39 @@ label_subproject_plural: Podprojekty
label_min_max_length: Min - Max délka
label_list: Seznam
label_date: Datum
-label_integer: Integer
-label_boolean: Boolean
+label_integer: Celé ÄÃslo
+label_float: Desetiné ÄÃslo
+label_boolean: Ano/Ne
label_string: Text
label_text: Dlouhý text
label_attribute: Atribut
label_attribute_plural: Atributy
label_download: %d Download
label_download_plural: %d Downloads
-label_no_data: Žádná data k zobrazenÃ
+label_no_data: Žádné položky
label_change_status: Změnit stav
label_history: Historie
label_attachment: Soubor
label_attachment_new: Nový soubor
-label_attachment_delete: Smazat soubor
+label_attachment_delete: Odstranit soubor
label_attachment_plural: Soubory
-label_report: Report
-label_report_plural: Reporty
+label_file_added: Soubor přidán
+label_report: Přeheled
+label_report_plural: Přehledy
label_news: Novinky
label_news_new: Přidat novinku
label_news_plural: Novinky
label_news_latest: Poslednà novinky
label_news_view_all: Zobrazit všechny novinky
-label_change_log: Change log
+label_news_added: Novinka přidána
+label_change_log: Protokol změn
label_settings: NastavenÃ
label_overview: Přehled
label_version: Verze
label_version_new: Nová verze
label_version_plural: Verze
label_confirmation: PotvrzenÃ
-label_export_to: Exportovat do
+label_export_to: 'Také k dispozici:'
label_read: NaÄÃtá se...
label_public_projects: Veřejné projekty
label_open_issues: otevřený
@@ -291,15 +343,16 @@ label_current_status: Aktuálnà stav
label_new_statuses_allowed: Nové povolené stavy
label_all: vše
label_none: nic
-label_next: DalÅ¡Ã
+label_nobody: nikdo
+label_next: DalÅ¡Ã
label_previous: PÅ™edchozÃ
label_used_by: Použito
label_details: Detaily
-label_add_note: Přidat poznánku
+label_add_note: Přidat poznámku
label_per_page: Na stránku
label_calendar: Kalendář
label_months_from: mÄ›sÃců od
-label_gantt: Gantův graf
+label_gantt: Ganttův graf
label_internal: InternÃ
label_last_changes: poslednÃch %d zmÄ›n
label_change_view_all: Zobrazit všechny změny
@@ -308,7 +361,7 @@ label_comment: Komentář
label_comment_plural: Komentáře
label_comment_add: Přidat komentáře
label_comment_added: Komentář přidán
-label_comment_delete: Smazat komentář
+label_comment_delete: Odstranit komentář
label_query: Uživatelský dotaz
label_query_plural: Uživatelské dotazy
label_query_new: Nový dotaz
@@ -320,7 +373,15 @@ label_in_less_than: je měšà než
label_in_more_than: je většà než
label_in: v
label_today: dnes
+label_all_time: vše
+label_yesterday: vÄera
label_this_week: tento týden
+label_last_week: minulý týden
+label_last_n_days: poslednÃch %d dnů
+label_this_month: tento mÄ›sÃc
+label_last_month: minulý mÄ›sÃc
+label_this_year: tento rok
+label_date_range: Časový rozsah
label_less_than_ago: před méně jak (dny)
label_more_than_ago: pÅ™ed vÃce jak (dny)
label_ago: před (dny)
@@ -328,28 +389,30 @@ label_contains: obsahuje
label_not_contains: neobsahuje
label_day_plural: dny
label_repository: Repository
+label_repository_plural: Repository
label_browse: Procházet
label_modification: %d změna
label_modification_plural: %d změn
label_revision: Revize
label_revision_plural: RevizÃ
+label_associated_revisions: SouvisejÃcà verze
label_added: přidáno
label_modified: změněno
-label_deleted: smazáno
+label_deleted: odstraněno
label_latest_revision: Poslednà revize
label_latest_revision_plural: Poslednà revize
label_view_revisions: Zobrazit revize
label_max_size: Maximálnà velikost
-label_on: 'on'
-label_sort_highest: Posunout na vrchol
-label_sort_higher: Posunout nahoru
-label_sort_lower: Posunout dolů
-label_sort_lowest: Posunout dospod
+label_on: 'zapnuto'
+label_sort_highest: PÅ™esunout na zaÄátek
+label_sort_higher: Přesunout nahoru
+label_sort_lower: Přesunout dolů
+label_sort_lowest: Přesunout na konec
label_roadmap: Plán
-label_roadmap_due_in: Due in
+label_roadmap_due_in: Zbývá
label_roadmap_overdue: %s pozdÄ›
-label_roadmap_no_issues: Pro tuto verzi nejsou žádné požadavky
-label_search: Hledej
+label_roadmap_no_issues: Pro tuto verzi nejsou žádné úkoly
+label_search: Hledat
label_result_plural: Výsledky
label_all_words: Všechna slova
label_wiki: Wiki
@@ -357,37 +420,37 @@ label_wiki_edit: Wiki úprava
label_wiki_edit_plural: Wiki úpravy
label_wiki_page: Wiki stránka
label_wiki_page_plural: Wiki stránky
-label_index_by_title: RejstÅ™Ãk
-label_index_by_date: Index by date
+label_index_by_title: Index dle názvu
+label_index_by_date: Index dle data
label_current_version: Aktuálnà verze
label_preview: Náhled
-label_feed_plural: Feeds
+label_feed_plural: PÅ™ÃspÄ›vky
label_changes_details: Detail všech změn
-label_issue_tracking: Sledovánà požadavků
+label_issue_tracking: Sledovánà úkolů
label_spent_time: Strávený Äas
label_f_hour: %.2f hodina
label_f_hour_plural: %.2f hodin
label_time_tracking: Sledovánà Äasu
label_change_plural: Změny
-label_statistics: Statistika
-label_commits_per_month: PoÅ™Ãzenà za mÄ›sÃc
-label_commits_per_author: PoÅ™Ãzenà za autora
+label_statistics: Statistiky
+label_commits_per_month: Commitů za mÄ›sÃc
+label_commits_per_author: Commitů za autora
label_view_diff: Zobrazit rozdÃly
label_diff_inline: uvnitÅ™
label_diff_side_by_side: vedle sebe
label_options: NastavenÃ
label_copy_workflow_from: KopÃrovat workflow z
-label_permissions_report: Opis práv
-label_watched_issues: Prohlédnuté požadavky
-label_related_issues: Vztažené požadavky
+label_permissions_report: Přehled práv
+label_watched_issues: Sledované úkoly
+label_related_issues: SouvisejÃcà úkoly
label_applied_status: Použitý stav
label_loading: Nahrávám...
-label_relation_new: Nový vztah
-label_relation_delete: Smazat vztah
-label_relates_to: vztažený k
+label_relation_new: Nová souvislost
+label_relation_delete: Odstranit souvislost
+label_relates_to: souvisejÃcà s
label_duplicates: duplicity
-label_blocks: zámků
-label_blocked_by: zamÄeno
+label_blocks: bloků
+label_blocked_by: zablokován
label_precedes: pÅ™edcházÃ
label_follows: následuje
label_end_to_start: od konce do zaÄátku
@@ -395,16 +458,17 @@ label_end_to_end: od konce do konce
label_start_to_start: od zaÄátku do zaÄátku
label_start_to_end: od zaÄátku do konce
label_stay_logged_in: Zůstat přihlášený
-label_disabled: zakázáno
-label_show_completed_versions: Ukaž dokonÄené verze
-label_me: já
+label_disabled: zakázán
+label_show_completed_versions: Ukázat dokonÄené verze
+label_me: mÄ›
label_board: Fórum
label_board_new: Nové fórum
-label_board_plural: Fora
+label_board_plural: Fóra
label_topic_plural: Témata
label_message_plural: Zprávy
label_message_last: Poslednà zpráva
-label_message_new: Nové zprávy
+label_message_new: Nová zpráva
+label_message_posted: Zpráva přidána
label_reply_plural: Odpovědi
label_send_information: Zaslat informace o úÄtu uživateli
label_year: Rok
@@ -412,24 +476,57 @@ label_month: MÄ›sÃc
label_week: Týden
label_date_from: Od
label_date_to: Do
-label_language_based: Language based
+label_language_based: Podle výchozÃho jazyku
label_sort_by: Seřadit podle %s
label_send_test_email: Poslat testovacà email
label_feeds_access_key_created_on: PÅ™Ãstupový klÃÄ pro RSS byl vytvoÅ™en pÅ™ed %s
+label_module_plural: Moduly
+label_added_time_by: 'Přidáno uživatelem %s před %s'
+label_updated_time: 'Aktualizováno před %s'
+label_jump_to_a_project: Zvolit projekt...
+label_file_plural: Soubory
+label_changeset_plural: Changesety
+label_default_columns: Výchozà sloupce
+label_no_change_option: (beze změny)
+label_bulk_edit_selected_issues: Bulk edit selected issues
+label_theme: Téma
+label_default: VýchozÃ
+label_search_titles_only: Vyhledávat pouze v názvech
+label_user_mail_option_all: "Pro všechny události všech mých projektů"
+label_user_mail_option_selected: "Pro všechny události vybraných projektů..."
+label_user_mail_option_none: "Pouze pro události které sleduji nebo které se mne týkajÃ"
+label_user_mail_no_self_notified: "NezasÃlat informace o mnou vytvoÅ™ených zmÄ›nách"
+label_registration_activation_by_email: aktivace úÄtu emailem
+label_registration_manual_activation: manuálnà aktivace úÄtu
+label_registration_automatic_activation: automatická aktivace úÄtu
+label_display_per_page: '%s na stránku'
+label_age: Věk
+label_change_properties: Změnit vlastnosti
+label_general: Obecné
+label_more: VÃce
+label_scm: SCM
+label_plugins: Doplňky
+label_ldap_authentication: Autentifikace LDAP
+label_downloads_abbr: D/L
+label_optional_description: Volitelný popis
+label_add_another_file: Přidat dalšà soubor
+label_preferences: NastavenÃ
+label_chronological_order: V chronologickém poÅ™adÃ
+label_reverse_chronological_order: V obrácaném chronologickém poÅ™adÃ
button_login: Přihlásit
button_submit: Potvrdit
button_save: Uložit
button_check_all: Zašrtnout vše
button_uncheck_all: Odšrtnout vše
-button_delete: Smazat
+button_delete: Odstranit
button_create: Vytvořit
button_test: Test
button_edit: Upravit
button_add: Přidat
button_change: Změnit
button_apply: PoužÃt
-button_clear: Odstranit
+button_clear: Smazat
button_lock: Zamknout
button_unlock: Odemknout
button_download: Stáhnout
@@ -438,16 +535,22 @@ button_view: Zobrazit
button_move: Přesunout
button_back: Zpět
button_cancel: Storno
-button_activate: Activovat
+button_activate: Aktivovat
button_sort: Seřadit
-button_log_time: ÄŒas pÅ™ihlášenÃ
+button_log_time: PÅ™idat Äas
button_rollback: Zpět k této verzi
button_watch: Sledovat
-button_unwatch: Unwatch
+button_unwatch: Nesledovat
button_reply: Odpovědět
button_archive: Archivovat
button_unarchive: Odarchivovat
button_reset: Reset
+button_rename: Přejmenovat
+button_change_password: Změnit heslo
+button_copy: KopÃrovat
+button_annotate: Komentovat
+button_update: Aktualizovat
+button_configure: Konfigurovat
status_active: aktivnÃ
status_registered: registrovaný
@@ -456,29 +559,49 @@ status_locked: uzamÄený
text_select_mail_notifications: Vyberte akci při které bude zasláno upozorněnà emailem.
text_regexp_info: napÅ™. ^[A-Z0-9]+$
text_min_max_length_info: 0 znamená bez limitu
-text_project_destroy_confirmation: Jste si jistÃ, že chcete smazat tento projekt a vÅ¡echna souvisejÃcà data ?
+text_project_destroy_confirmation: Jste si jisti, že chcete odstranit tento projekt a vÅ¡echna souvisejÃcà data ?
text_workflow_edit: Vyberte roli a frontu k editaci workflow
-text_are_you_sure: Jste si jist ?
+text_are_you_sure: Jste si jisti?
text_journal_changed: změněno z %s na %s
text_journal_set_to: nastaveno na %s
-text_journal_deleted: smazáno
+text_journal_deleted: odstraněno
text_tip_task_begin_day: úkol zaÄÃná v tento den
text_tip_task_end_day: úkol konÄà v tento den
text_tip_task_begin_end_day: úkol zaÄÃná a konÄà v tento den
text_project_identifier_info: 'Jsou povolena malá pÃsmena (a-z), ÄÃsla a pomlÄky. Po uloženà již nenà možné identifikátor zmÄ›nit.'
text_caracters_maximum: %d znaků maximálně.
+text_caracters_minimum: Musà být alespoň %d znaků dlouhé.
text_length_between: Délka mezi %d a %d znaky.
-text_tracker_no_workflow: Pro tuto frontu nenà definováno žádné workflow
+text_tracker_no_workflow: Pro tuto frontu nenà definován žádný workflow
text_unallowed_characters: Nepovolené znaky
text_comma_separated: Povoleno vÃce hodnot (oddÄ›lÄ›né Äárkou).
text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages
+text_issue_added: Úkol %s byl vytvořen uživatelem %s.
+text_issue_updated: Úkol %s byl aktualizován uživatelem %s.
+text_wiki_destroy_confirmation: Opravdu si přejete odstranit tuto WIKI a celý jejà obsah?
+text_issue_category_destroy_question: Některé úkoly (%d) jsou přiřazeny k této kategorii. Co s nimi chtete udělat?
+text_issue_category_destroy_assignments: Zrušit přiřazenà ke kategorii
+text_issue_category_reassign_to: Přiřadit úkoly do této kategorie
+text_user_mail_option: "U projektů, které nebyly vybrány, budete dostávat oznámenà pouze o vaÅ¡ich Äi o sledovaných položkách (napÅ™. o položkách jejichž jste autor nebo ke kterým jste pÅ™iÅ™azen(a))."
+text_no_configuration_data: "Role, fronty, stavy úkolů ani workflow nebyly zatÃm nakonfigurovány.\nVelice doporuÄujeme nahrát výchozà konfiguraci.Po té si můžete vÅ¡e upravit"
+text_load_default_configuration: Nahrát výchozà konfiguraci
+text_status_changed_by_changeset: Použito v changesetu %s.
+text_issues_destroy_confirmation: 'Opravdu si přejete odstranit všechny zvolené úkoly?'
+text_select_project_modules: 'Aktivnà moduly v tomto projektu:'
+text_default_administrator_account_changed: Výchozà nastavenà administrátorského úÄtu zmÄ›nÄ›no
+text_file_repository_writable: Povolen zápis do repository
+text_rmagick_available: RMagick k dispozici (volitelné)
+text_destroy_time_entries_question: U úkolů, které chcete odstranit je evidováno %.02f práce. Co chete udělat?
+text_destroy_time_entries: Odstranit evidované hodiny.
+text_assign_time_entries_to_project: Přiřadit evidované hodiny projektu
+text_reassign_time_entries: 'Přeřadit evidované hodiny k tomuto úkolu:'
default_role_manager: Manažer
-default_role_developper: Agent
-default_role_reporter: Reporter
-default_tracker_bug: Reklamace
-default_tracker_feature: Vlastnost
-default_tracker_support: Požadavek
+default_role_developper: Vývojář
+default_role_reporter: Reportér
+default_tracker_bug: Chyba
+default_tracker_feature: Požadavek
+default_tracker_support: Podpora
default_issue_status_new: Nový
default_issue_status_assigned: Přiřazený
default_issue_status_resolved: Vyřešený
@@ -491,56 +614,31 @@ default_priority_low: NÃzká
default_priority_normal: NormálnÃ
default_priority_high: Vysoká
default_priority_urgent: UrgentnÃ
-default_priority_immediate: Bezodkladné
-default_activity_design: Návrh
+default_priority_immediate: Okamžitá
+default_activity_design: Design
default_activity_development: Vývoj
-enumeration_issue_priorities: Priority požadavků
+enumeration_issue_priorities: Priority úkolů
enumeration_doc_categories: Kategorie dokumentů
enumeration_activities: Aktivity (sledovánà Äasu)
-button_rename: Rename
-text_issue_category_destroy_question: Some issues (%d) are assigned to this category. What do you want to do ?
-label_module_plural: Modules
-label_jump_to_a_project: Jump to a project...
-text_issue_updated: Issue %s has been updated.
-field_redirect_existing_links: Redirect existing links
-text_issue_category_reassign_to: Reassing issues to this category
-text_issue_added: Issue %s has been reported.
-label_file_plural: Files
-text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content ?
-label_updated_time: Updated %s ago
-text_issue_category_destroy_assignments: Remove category assignments
-label_added_time_by: Added by %s %s ago
-field_estimated_hours: Estimated time
-label_changeset_plural: Changesets
-field_column_names: Columns
-label_default_columns: Default columns
-setting_issue_list_default_columns: Default columns displayed on the issue list
-setting_repositories_encodings: Repositories encodings
-notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit."
-label_bulk_edit_selected_issues: Bulk edit selected issues
-label_no_change_option: (No change)
-notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s."
-label_theme: Theme
-label_default: Default
-label_search_titles_only: Search titles only
-label_nobody: nobody
-button_change_password: Change password
-text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)."
-label_user_mail_option_selected: "For any event on the selected projects only..."
-label_user_mail_option_all: "For any event on all my projects"
-label_user_mail_option_none: "Only for things I watch or I'm involved in"
-setting_emails_footer: Emails footer
-label_float: Float
-button_copy: Copy
-mail_body_account_information_external: You can use your "%s" account to log into Redmine.
-mail_body_account_information: Your Redmine account information
-setting_protocol: Protocol
-label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
-setting_time_format: Time format
-label_registration_activation_by_email: account activation by email
-mail_subject_account_activation_request: Redmine account activation request
-mail_body_account_activation_request: 'A new user (%s) has registered. His account his pending your approval:'
-label_registration_automatic_activation: automatic account activation
-label_registration_manual_activation: manual account activation
-notice_account_pending: "Your account was created and is now pending administrator approval."
+error_scm_annotate: "Položka neexistuje nebo nemůže být komentována."
+label_planning: PlánovánÃ
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
+label_and_its_subprojects: %s and its subprojects
+mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
+mail_subject_reminder: "%d issue(s) due in the next days"
+text_user_wrote: '%s wrote:'
+label_duplicated_by: duplicated by
+setting_enabled_scm: Enabled SCM
+text_enumeration_category_reassign_to: 'Reassign them to this value:'
+text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
+text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/da.yml b/lang/da.yml
new file mode 100644
index 000000000..8f8905f32
--- /dev/null
+++ b/lang/da.yml
@@ -0,0 +1,641 @@
+_gloc_rule_default: '|n| n==1 ? "" : "_plural" '
+
+actionview_datehelper_select_day_prefix:
+actionview_datehelper_select_month_names: Januar,Februar,Marts,April,Maj,Juni,Juli,August,September,Oktober,November,December
+actionview_datehelper_select_month_names_abbr: Jan,Feb,Mar,Apr,Maj,Jun,Jul,Aug,Sep,Okt,Nov,Dec
+actionview_datehelper_select_month_prefix:
+actionview_datehelper_select_year_prefix:
+actionview_datehelper_time_in_words_day: 1 dag
+actionview_datehelper_time_in_words_day_plural: %d dage
+actionview_datehelper_time_in_words_hour_about: cirka en time
+actionview_datehelper_time_in_words_hour_about_plural: cirka %d timer
+actionview_datehelper_time_in_words_hour_about_single: cirka en time
+actionview_datehelper_time_in_words_minute: 1 minut
+actionview_datehelper_time_in_words_minute_half: et halvt minut
+actionview_datehelper_time_in_words_minute_less_than: mindre end et minut
+actionview_datehelper_time_in_words_minute_plural: %d minutter
+actionview_datehelper_time_in_words_minute_single: 1 minut
+actionview_datehelper_time_in_words_second_less_than: mindre end et sekund
+actionview_datehelper_time_in_words_second_less_than_plural: mindre end %d sekunder
+actionview_instancetag_blank_option: Vælg venligst
+
+activerecord_error_inclusion: er ikke i listen
+activerecord_error_exclusion: er reserveret
+activerecord_error_invalid: er ugyldig
+activerecord_error_confirmation: passer ikke bekræftelsen
+activerecord_error_accepted: skal accepteres
+activerecord_error_empty: kan ikke være tom
+activerecord_error_blank: kan ikke være blank
+activerecord_error_too_long: er for lang
+activerecord_error_too_short: er for kort
+activerecord_error_wrong_length: har den forkerte længde
+activerecord_error_taken: er allerede valgt
+activerecord_error_not_a_number: er ikke et nummer
+activerecord_error_not_a_date: er en ugyldig dato
+activerecord_error_greater_than_start_date: skal være senere end start datoen
+activerecord_error_not_same_project: høre ikke til samme projekt
+activerecord_error_circular_dependency: Denne relation vil skabe et afhængigheds forhold
+
+general_fmt_age: %d år
+general_fmt_age_plural: %d år
+general_fmt_date: %%m/%%d/%%Y
+general_fmt_datetime: %%m/%%d/%%Y %%I:%%M %%p
+general_fmt_datetime_short: %%b %%d, %%I:%%M %%p
+general_fmt_time: %%I:%%M %%p
+general_text_No: 'Nej'
+general_text_Yes: 'Ja'
+general_text_no: 'nej'
+general_text_yes: 'ja'
+general_lang_name: 'Danish (Dansk)'
+general_csv_separator: ','
+general_csv_decimal_separator: '.'
+general_csv_encoding: ISO-8859-1
+general_pdf_encoding: ISO-8859-1
+general_day_names: Mandag,Tirsdag,Onsdag,Torsdag,Fredag,Lørdag,Søndag
+general_first_day_of_week: '1'
+
+notice_account_updated: Kontoen er opdateret.
+notice_account_invalid_creditentials: Ugyldig bruger og kodeord
+notice_account_password_updated: Kodeordet er opdateret.
+notice_account_wrong_password: Forkert kodeord
+notice_account_register_done: Kontoen er oprettet. For at aktivere kontoen, ska du klikke på linket i den tilsendte email.
+notice_account_unknown_email: Ukendt bruger.
+notice_can_t_change_password: Denne konto benytter en ekstern sikkerheds godkendelse. Det er ikke muligt at skifte kodeord.
+notice_account_lost_email_sent: En email med instruktioner til at vælge et nyt kodeord er afsendt til dig.
+notice_account_activated: Din konto er aktiveret. Du kan nu logge ind.
+notice_successful_create: Succesfuld oprettelsen.
+notice_successful_update: Succesfuld opdatering.
+notice_successful_delete: Succesfuld sletning.
+notice_successful_connection: Succesfuld forbindelse.
+notice_file_not_found: Siden du forsøger at tilgå, eksisterer ikke eller er blevet fjernet.
+notice_locking_conflict: Data er opdateret af en anden bruger.
+notice_not_authorized: Du har ike adgang til denne side.
+notice_email_sent: En email er sendt til %s
+notice_email_error: En fejl opstod under afsendelse af email (%s)
+notice_feeds_access_key_reseted: Din RSS adgangs nøgle er nulstillet.
+notice_failed_to_save_issues: "Det mislykkedes at gemme %d sage(r) på %d valgt: %s."
+notice_no_issue_selected: "Ingen sag er valgt! vælg venligst hvilke emner du vil rette."
+notice_account_pending: "Din konto er oprettet, og afventer administratorens godkendelse."
+notice_default_data_loaded: Default konfiguration er indlæst.
+
+error_can_t_load_default_data: "Standard konfiguration kunne ikke indlæses: %s"
+error_scm_not_found: "Adgang og/eller revision blev ikke fundet i det valgte repository."
+error_scm_command_failed: "En fejl opstod under fobindelsen til det valgte repository: %s"
+
+mail_subject_lost_password: Dit %s kodeord
+mail_body_lost_password: 'For at ændre dit kodeord, klik på dette link:'
+mail_subject_register: %s konto aktivering
+mail_body_register: 'For at aktivere din konto, klik på dette link:'
+mail_body_account_information_external: Du kan bruge din "%s" konto til at logge ind.
+mail_body_account_information: Din konto information
+mail_subject_account_activation_request: %s konto aktivering
+mail_body_account_activation_request: 'En ny bruger (%s) er registreret. Godkend venligst kontoen:'
+
+gui_validation_error: 1 fejl
+gui_validation_error_plural: %d fejl
+
+field_name: Navn
+field_description: Beskrivelse
+field_summary: Sammenfatning
+field_is_required: Skal udfyldes
+field_firstname: Fornavn
+field_lastname: Efternavn
+field_mail: Email
+field_filename: Fil
+field_filesize: Størrelse
+field_downloads: Downloads
+field_author: Forfatter
+field_created_on: Oprettet
+field_updated_on: Opdateret
+field_field_format: Format
+field_is_for_all: For alle projekter
+field_possible_values: Mulige værdier
+field_regexp: Regulære udtryk
+field_min_length: Minimum længde
+field_max_length: Maximal længde
+field_value: Værdi
+field_category: Kategori
+field_title: Titel
+field_project: Projekt
+field_issue: Sag
+field_status: Status
+field_notes: Noter
+field_is_closed: Sagen er lukket
+field_is_default: Standard værdi
+field_tracker: Type
+field_subject: Emne
+field_due_date: Deadline
+field_assigned_to: Tildelt til
+field_priority: Prioritet
+field_fixed_version: Target version
+field_user: Bruger
+field_role: Rolle
+field_homepage: Hjemmeside
+field_is_public: Offentlig
+field_parent: Underprojekt af
+field_is_in_chlog: Sager vist i ændringer
+field_is_in_roadmap: Sager vist i roadmap
+field_login: Login
+field_mail_notification: Email notifikationer
+field_admin: Administrator
+field_last_login_on: Sidste forbindelse
+field_language: Sprog
+field_effective_date: Dato
+field_password: Kodeord
+field_new_password: Nyt kodeord
+field_password_confirmation: Bekræft
+field_version: Version
+field_type: Type
+field_host: Vært
+field_port: Port
+field_account: Kode
+field_base_dn: Base DN
+field_attr_login: Login attribut
+field_attr_firstname: Fornavn attribut
+field_attr_lastname: Efternavn attribut
+field_attr_mail: Email attribut
+field_onthefly: løbende bruger oprettelse
+field_start_date: Start
+field_done_ratio: %% Færdig
+field_auth_source: Sikkerheds metode
+field_hide_mail: Skjul min email
+field_comments: Kommentar
+field_url: URL
+field_start_page: Start side
+field_subproject: Underprojekt
+field_hours: Timer
+field_activity: Aktivitet
+field_spent_on: Dato
+field_identifier: Identificering
+field_is_filter: Brugt som et filter
+field_issue_to_id: Beslægtede sag
+field_delay: Udsættelse
+field_assignable: Sager kan tildeles denne rolle
+field_redirect_existing_links: Videresend eksisterende links
+field_estimated_hours: Estimeret tid
+field_column_names: Kolonner
+field_time_zone: Tids zone
+field_searchable: Søgbar
+field_default_value: Standard værdi
+
+setting_app_title: Applikations titel
+setting_app_subtitle: Applikations undertekst
+setting_welcome_text: Velkomst tekst
+setting_default_language: Standard sporg
+setting_login_required: Sikkerhed påkrævet
+setting_self_registration: Bruger oprettelse
+setting_attachment_max_size: Vedhæftede filers max størrelse
+setting_issues_export_limit: Sags eksporterings begrænsning
+setting_mail_from: Afsender email
+setting_bcc_recipients: Blind carbon copy modtager (bcc)
+setting_host_name: Værts navn
+setting_text_formatting: Tekst formattering
+setting_wiki_compression: Wiki historik komprimering
+setting_feeds_limit: Feed indholds begrænsning
+setting_autofetch_changesets: Automatisk hent commits
+setting_sys_api_enabled: Aktiver web service for automatisk repository administration
+setting_commit_ref_keywords: Reference nøgleord
+setting_commit_fix_keywords: Afslutnings nøgleord
+setting_autologin: Autologin
+setting_date_format: Dato format
+setting_time_format: Tids format
+setting_cross_project_issue_relations: Tillad sags relationer på tværs af projekter
+setting_issue_list_default_columns: Standard kolonner på sags listen
+setting_repositories_encodings: Repository tegnsæt
+setting_emails_footer: Email fodnote
+setting_protocol: Protokol
+setting_per_page_options: Objekter pr. side indstillinger
+setting_user_format: Bruger visnings format
+
+project_module_issue_tracking: Sags søgning
+project_module_time_tracking: Tids styring
+project_module_news: Nyheder
+project_module_documents: Dokumenter
+project_module_files: Filer
+project_module_wiki: Wiki
+project_module_repository: Repository
+project_module_boards: Opslagstavle
+
+label_user: Bruger
+label_user_plural: Brugere
+label_user_new: Ny bruger
+label_project: Projekt
+label_project_new: Nyt projekt
+label_project_plural: Projekter
+label_project_all: Alle projekter
+label_project_latest: Seneste projekter
+label_issue: Sag
+label_issue_new: Opret sag
+label_issue_plural: Sager
+label_issue_view_all: Vis alle sager
+label_issues_by: Sager fra %s
+label_issue_added: Sagen er oprettet
+label_issue_updated: Sagen er opdateret
+label_document: Dokument
+label_document_new: Nyt dokument
+label_document_plural: Dokumenter
+label_document_added: Dokument tilføjet
+label_role: Rolle
+label_role_plural: Roller
+label_role_new: Ny rolle
+label_role_and_permissions: Roller og rettigheder
+label_member: Medlem
+label_member_new: Nyt medlem
+label_member_plural: Medlemmer
+label_tracker: Type
+label_tracker_plural: Typer
+label_tracker_new: Ny type
+label_workflow: Arbejdsgang
+label_issue_status: Sags status
+label_issue_status_plural: Sags statuser
+label_issue_status_new: Ny status
+label_issue_category: Sags kategori
+label_issue_category_plural: Sags kategorier
+label_issue_category_new: Ny kategori
+label_custom_field: Brugerdefineret felt
+label_custom_field_plural: Brugerdefineret felt
+label_custom_field_new: Nyt brugerdefineret felt
+label_enumerations: Værdier
+label_enumeration_new: Ny værdi
+label_information: Information
+label_information_plural: Information
+label_please_login: Login
+label_register: Registrer
+label_password_lost: Glemt kodeord
+label_home: Forside
+label_my_page: Min side
+label_my_account: Min konto
+label_my_projects: Mine projekter
+label_administration: Administration
+label_login: Log ind
+label_logout: Log ud
+label_help: Hjælp
+label_reported_issues: Rapporterede sager
+label_assigned_to_me_issues: Sager tildelt til mig
+label_last_login: Sidste forbindelse
+label_last_updates: Sidst opdateret
+label_last_updates_plural: %d sidst opdateret
+label_registered_on: Registeret den
+label_activity: Aktivitet
+label_new: Ny
+label_logged_as: Registreret som
+label_environment: Miljø
+label_authentication: Sikkerhed
+label_auth_source: Sikkerheds metode
+label_auth_source_new: Ny sikkerheds metode
+label_auth_source_plural: Sikkerheds metoder
+label_subproject_plural: Underprojekter
+label_min_max_length: Min - Max længde
+label_list: Liste
+label_date: Dato
+label_integer: Heltal
+label_float: Kommatal
+label_boolean: Sand/falsk
+label_string: Tekst
+label_text: Lang tekst
+label_attribute: Attribut
+label_attribute_plural: Attributter
+label_download: %d Download
+label_download_plural: %d Downloads
+label_no_data: Ingen data at vise
+label_change_status: Ændrings status
+label_history: Historik
+label_attachment: Fil
+label_attachment_new: Ny fil
+label_attachment_delete: Slet fil
+label_attachment_plural: Filer
+label_file_added: Fil tilføjet
+label_report: Rapport
+label_report_plural: Rapporter
+label_news: Nyheder
+label_news_new: Tilføj nyheder
+label_news_plural: Nyheder
+label_news_latest: Seneste nyheder
+label_news_view_all: Vis alle nyheder
+label_news_added: Nyhed tilføjet
+label_change_log: Ændringer
+label_settings: Indstillinger
+label_overview: Oversigt
+label_version: Version
+label_version_new: Ny version
+label_version_plural: Versioner
+label_confirmation: Bekræftigelser
+label_export_to: Eksporter til
+label_read: Læs...
+label_public_projects: Offentlige projekter
+label_open_issues: åben
+label_open_issues_plural: åbne
+label_closed_issues: lukket
+label_closed_issues_plural: lukkede
+label_total: Total
+label_permissions: Rettigheder
+label_current_status: Nuværende status
+label_new_statuses_allowed: Ny status tilladt
+label_all: alle
+label_none: intet
+label_nobody: ingen
+label_next: Næste
+label_previous: Forrig
+label_used_by: Brugt af
+label_details: Detaljer
+label_add_note: Tilføj en note
+label_per_page: Pr. side
+label_calendar: Kalender
+label_months_from: måneder frem
+label_gantt: Gantt
+label_internal: Intern
+label_last_changes: sidste %d ændringer
+label_change_view_all: Vis alle ændringer
+label_personalize_page: Tilret denne side
+label_comment: Kommentar
+label_comment_plural: Kommentarer
+label_comment_add: Tilføj en kommentar
+label_comment_added: Kommentaren er tilføjet
+label_comment_delete: Slet kommentar
+label_query: Brugerdefineret forespørgsel
+label_query_plural: Brugerdefinerede forespørgsler
+label_query_new: Ny forespørgsel
+label_filter_add: Tilføj filter
+label_filter_plural: Filtre
+label_equals: er
+label_not_equals: er ikke
+label_in_less_than: er mindre end
+label_in_more_than: er større end
+label_in: indeholdt i
+label_today: idag
+label_all_time: altid
+label_yesterday: igår
+label_this_week: denne uge
+label_last_week: sidste uge
+label_last_n_days: sidste %d dage
+label_this_month: denne måned
+label_last_month: sidste måned
+label_this_year: dette år
+label_date_range: Dato interval
+label_less_than_ago: mindre end dage siden
+label_more_than_ago: mere end dage siden
+label_ago: days siden
+label_contains: indeholder
+label_not_contains: ikke indeholder
+label_day_plural: dage
+label_repository: Repository
+label_repository_plural: Repositories
+label_browse: Gennemse
+label_modification: %d ændring
+label_modification_plural: %d ændringer
+label_revision: Revision
+label_revision_plural: Revisioner
+label_associated_revisions: Tilnyttede revisioner
+label_added: tilføjet
+label_modified: ændret
+label_deleted: slettet
+label_latest_revision: Seneste revision
+label_latest_revision_plural: Seneste revisioner
+label_view_revisions: Se revisioner
+label_max_size: Maximal størrelse
+label_on: 'til'
+label_sort_highest: Flyt til toppen
+label_sort_higher: Flyt op
+label_sort_lower: Flyt ned
+label_sort_lowest: Flyt til bunden
+label_roadmap: Roadmap
+label_roadmap_due_in: Deadline
+label_roadmap_overdue: %s forsinket
+label_roadmap_no_issues: Ingen sager til denne version
+label_search: Søg
+label_result_plural: Resultater
+label_all_words: Alle ord
+label_wiki: Wiki
+label_wiki_edit: Wiki ændring
+label_wiki_edit_plural: Wiki ændringer
+label_wiki_page: Wiki side
+label_wiki_page_plural: Wiki sider
+label_index_by_title: Indhold efter titel
+label_index_by_date: Indhold efter dato
+label_current_version: Nuværende version
+label_preview: Forhåndsvisning
+label_feed_plural: Feeds
+label_changes_details: Detaljer for alle ænringer
+label_issue_tracking: Sags søgning
+label_spent_time: Brugt tid
+label_f_hour: %.2f time
+label_f_hour_plural: %.2f timer
+label_time_tracking: Tids styring
+label_change_plural: Ændringer
+label_statistics: Statistik
+label_commits_per_month: Commits pr. måned
+label_commits_per_author: Commits pr. bruger
+label_view_diff: Vis forskellighed
+label_diff_inline: inline
+label_diff_side_by_side: side ved side
+label_options: Optioner
+label_copy_workflow_from: Kopier arbejdsgang fra
+label_permissions_report: Godkendelses rapport
+label_watched_issues: Overvågede sager
+label_related_issues: Relaterede sager
+label_applied_status: Anvendte statuser
+label_loading: Indlæser...
+label_relation_new: Ny relation
+label_relation_delete: Slet relation
+label_relates_to: relaterer til
+label_duplicates: kopierer
+label_blocks: blokerer
+label_blocked_by: blokeret af
+label_precedes: kommer før
+label_follows: følger
+label_end_to_start: slut til start
+label_end_to_end: slut til slut
+label_start_to_start: start til start
+label_start_to_end: start til slut
+label_stay_logged_in: Forblin indlogget
+label_disabled: deaktiveret
+label_show_completed_versions: Vis færdige versioner
+label_me: mig
+label_board: Forum
+label_board_new: Nyt forum
+label_board_plural: Fora
+label_topic_plural: Emner
+label_message_plural: Beskeder
+label_message_last: Sidste besked
+label_message_new: Ny besked
+label_message_posted: Besked tilføjet
+label_reply_plural: Besvarer
+label_send_information: Send konto information til bruger
+label_year: Ã…r
+label_month: MÃ¥ned
+label_week: Uge
+label_date_from: Fra
+label_date_to: Til
+label_language_based: Baseret på brugerens sprog
+label_sort_by: Sorter efter %s
+label_send_test_email: Send en test email
+label_feeds_access_key_created_on: RSS adgangsnøgle genereret %s siden
+label_module_plural: Moduler
+label_added_time_by: Tilføjet af %s for %s siden
+label_updated_time: Opdateret for %s siden
+label_jump_to_a_project: Skift til projekt...
+label_file_plural: Filer
+label_changeset_plural: Ændringer
+label_default_columns: Standard kolonner
+label_no_change_option: (Ingen ændringer)
+label_bulk_edit_selected_issues: Masse ret de valgte sager
+label_theme: Tema
+label_default: standard
+label_search_titles_only: Søg kun i titler
+label_user_mail_option_all: "For alle hændelser på mine projekter"
+label_user_mail_option_selected: "For alle hændelser, kun på de valgte projekter..."
+label_user_mail_option_none: "Kun for ting jeg overvåger, eller jeg er involveret i"
+label_user_mail_no_self_notified: "Jeg ønsker ikke besked, om ændring foretaget af mig selv"
+label_registration_activation_by_email: konto aktivering på email
+label_registration_manual_activation: manuel konto aktivering
+label_registration_automatic_activation: automatisk konto aktivering
+label_display_per_page: 'Per side: %s'
+label_age: Alder
+label_change_properties: Ændre indstillinger
+label_general: Generalt
+label_more: Mere
+label_scm: SCM
+label_plugins: Plugins
+label_ldap_authentication: LDAP godkendelse
+label_downloads_abbr: D/L
+
+button_login: Login
+button_submit: Send
+button_save: Gem
+button_check_all: Vælg alt
+button_uncheck_all: Fravælg alt
+button_delete: Slet
+button_create: Opret
+button_test: Test
+button_edit: Ret
+button_add: Tilføj
+button_change: Ændre
+button_apply: Anvend
+button_clear: Nulstil
+button_lock: LÃ¥s
+button_unlock: LÃ¥s op
+button_download: Download
+button_list: List
+button_view: Vis
+button_move: Flyt
+button_back: Tilbage
+button_cancel: Annuller
+button_activate: Aktiver
+button_sort: Sorter
+button_log_time: Log tid
+button_rollback: Tilbagefør til denne version
+button_watch: Overvåg
+button_unwatch: Stop overvågning
+button_reply: Besvar
+button_archive: Arkiver
+button_unarchive: Fjern fra arkiv
+button_reset: Nulstil
+button_rename: Omdøb
+button_change_password: Skift kodeord
+button_copy: Kopier
+button_annotate: Annotere
+button_update: Opdater
+button_configure: Konfigurer
+
+status_active: aktiv
+status_registered: registreret
+status_locked: låst
+
+text_select_mail_notifications: Vælg handlinger for hvilke, der skal sendes en email besked.
+text_regexp_info: f.eks. ^[A-ZÆØÅ0-9]+$
+text_min_max_length_info: 0 betyder ingen begrænsninger
+text_project_destroy_confirmation: Er du sikker på di vil slette dette projekt og alle relaterede data ?
+text_workflow_edit: Vælg en rolle samt en type, for at redigere arbejdsgangen
+text_are_you_sure: Er du sikker ?
+text_journal_changed: ændret fra %s til %s
+text_journal_set_to: sat til %s
+text_journal_deleted: slettet
+text_tip_task_begin_day: opgaven begynder denne dag
+text_tip_task_end_day: opaven slutter denne dag
+text_tip_task_begin_end_day: opgaven begynder og slutter denne dag
+text_project_identifier_info: 'Små bogstaver (a-z), numre og bindestreg er tilladt. Når den er gemt, kan indifikatoren ikke rettes.'
+text_caracters_maximum: max %d karakterer.
+text_caracters_minimum: Skal være mindst %d karakterer lang.
+text_length_between: Længde skal være mellem %d og %d karakterer.
+text_tracker_no_workflow: Ingen arbejdsgang defineret for denne type
+text_unallowed_characters: Ikke tilladte karakterer
+text_comma_separated: Adskillige værdier tilladt (komma separeret).
+text_issues_ref_in_commit_messages: Referer og løser sager i commit beskeder
+text_issue_added: Sag %s er rapporteret af %s.
+text_issue_updated: Sag %s er blevet opdateret af %s.
+text_wiki_destroy_confirmation: Er du sikker på at du vil slette debbe wiki, og alt indholdet ?
+text_issue_category_destroy_question: Nogle sgaer (%d) er tildelt denne kategori. Hvad ønsker du at gøre ?
+text_issue_category_destroy_assignments: Slet kategori tildelinger
+text_issue_category_reassign_to: Tildel sager til denne kategori
+text_user_mail_option: "For ikke valgte projekter, vil du kun modtage beskeder omhandlende ting, du er involveret i, eller overvåger (f.eks. sager du ahr indberettet eller ejer)."
+text_no_configuration_data: "Roller, typer, sags statuser og arbejdsgange er endnu ikek konfigureret.\nDet er anbefalet at indlæse standard konfigurationen. Du vil kunne ændre denne når den er indlæst."
+text_load_default_configuration: Indlæs standard konfiguration
+text_status_changed_by_changeset: Anvendt i ændring %s.
+text_issues_destroy_confirmation: 'Er du sikker på du ønsker at slette den/de valgte sag(er) ?'
+text_select_project_modules: 'Vælg moduler er skal være aktiveret for dette projekt:'
+text_default_administrator_account_changed: Standard administrator konto ændret
+text_file_repository_writable: Filarkiv er skrivbar
+text_rmagick_available: RMagick tilgængelig (valgfri)
+
+default_role_manager: Leder
+default_role_developper: Udvikler
+default_role_reporter: Rapportør
+default_tracker_bug: Bug
+default_tracker_feature: Feature
+default_tracker_support: Support
+default_issue_status_new: Ny
+default_issue_status_assigned: Tildelt
+default_issue_status_resolved: Løst
+default_issue_status_feedback: Feedback
+default_issue_status_closed: Lukket
+default_issue_status_rejected: Afvist
+default_doc_category_user: Bruger dokumentation
+default_doc_category_tech: Teknisk dokumentation
+default_priority_low: Lav
+default_priority_normal: Normal
+default_priority_high: Høj
+default_priority_urgent: Akut
+default_priority_immediate: Omgående
+default_activity_design: Design
+default_activity_development: Udvikling
+
+enumeration_issue_priorities: Sags prioriteter
+enumeration_doc_categories: Dokument kategorier
+enumeration_activities: Aktiviteter (tids styring)
+
+label_add_another_file: Tilføj endnu en fil
+label_chronological_order: I kronologisk rækkefølge
+setting_activity_days_default: Antal dage der vises under projekt aktivitet
+text_destroy_time_entries_question: %.02f timer er reporteret på denne sag, som du er ved at slette. Hvad vil du gøre ?
+error_issue_not_found_in_project: 'Sagen blev ikke fundet eller tilhører ikke dette projekt'
+text_assign_time_entries_to_project: Tildel raporterede timer til projektet
+setting_display_subprojects_issues: Vis sager for underprojekter på hovedprojektet som default
+label_optional_description: Optionel beskrivelse
+text_destroy_time_entries: Slet raportede timer
+field_comments_sorting: Vis kommentar
+text_reassign_time_entries: 'Tildel raportede timer til denne sag igen'
+label_reverse_chronological_order: I omvendt kronologisk rækkefølge
+label_preferences: Preferences
+label_overall_activity: Overordnet aktivitet
+setting_default_projects_public: Nye projekter er offentlige som default
+error_scm_annotate: "The entry does not exist or can not be annotated."
+label_planning: Planlægning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
+label_and_its_subprojects: %s and its subprojects
+mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
+mail_subject_reminder: "%d issue(s) due in the next days"
+text_user_wrote: '%s wrote:'
+label_duplicated_by: duplicated by
+setting_enabled_scm: Enabled SCM
+text_enumeration_category_reassign_to: 'Reassign them to this value:'
+text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
+text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/de.yml b/lang/de.yml
index fc00753b3..1f6c6291d 100644
--- a/lang/de.yml
+++ b/lang/de.yml
@@ -6,16 +6,16 @@ actionview_datehelper_select_month_names_abbr: Jan,Feb,Mär,Apr,Mai,Jun,Jul,Aug,
actionview_datehelper_select_month_prefix:
actionview_datehelper_select_year_prefix:
actionview_datehelper_time_in_words_day: 1 Tag
-actionview_datehelper_time_in_words_day_plural: %d Tage
-actionview_datehelper_time_in_words_hour_about: ungefähr eine Stunde
+actionview_datehelper_time_in_words_day_plural: %d Tagen
+actionview_datehelper_time_in_words_hour_about: ungefähr einer Stunde
actionview_datehelper_time_in_words_hour_about_plural: ungefähr %d Stunden
-actionview_datehelper_time_in_words_hour_about_single: ungefähr eine Stunde
+actionview_datehelper_time_in_words_hour_about_single: ungefähr einer Stunde
actionview_datehelper_time_in_words_minute: 1 Minute
-actionview_datehelper_time_in_words_minute_half: halbe Minute
-actionview_datehelper_time_in_words_minute_less_than: weniger als eine Minute
+actionview_datehelper_time_in_words_minute_half: einer halben Minute
+actionview_datehelper_time_in_words_minute_less_than: weniger als einer Minute
actionview_datehelper_time_in_words_minute_plural: %d Minuten
actionview_datehelper_time_in_words_minute_single: 1 Minute
-actionview_datehelper_time_in_words_second_less_than: Weniger als eine Sekunde
+actionview_datehelper_time_in_words_second_less_than: weniger als einer Sekunde
actionview_datehelper_time_in_words_second_less_than_plural: weniger als %d Sekunden
actionview_instancetag_blank_option: Bitte auswählen
@@ -48,6 +48,7 @@ general_text_no: 'nein'
general_text_yes: 'ja'
general_lang_name: 'Deutsch'
general_csv_separator: ';'
+general_csv_decimal_separator: ','
general_csv_encoding: ISO-8859-1
general_pdf_encoding: ISO-8859-1
general_day_names: Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag,Sonntag
@@ -68,16 +69,29 @@ notice_successful_delete: Erfolgreich gelöscht.
notice_successful_connection: Verbindung erfolgreich.
notice_file_not_found: Anhang besteht nicht oder ist gelöscht worden.
notice_locking_conflict: Datum wurde von einem anderen Benutzer geändert.
-notice_scm_error: Eintrag und/oder Revision besteht nicht im Projektarchiv.
notice_not_authorized: Sie sind nicht berechtigt, auf diese Seite zuzugreifen.
notice_email_sent: Eine E-Mail wurde an %s gesendet.
notice_email_error: Beim Senden einer E-Mail ist ein Fehler aufgetreten (%s).
-notice_feeds_access_key_reseted: Ihr RSS-Zugriffsschlüssel wurde zurückgesetzt.
+notice_feeds_access_key_reseted: Ihr Atom-Zugriffsschlüssel wurde zurückgesetzt.
+notice_failed_to_save_issues: "%d von %d ausgewählten Tickets konnte(n) nicht gespeichert werden: %s."
+notice_no_issue_selected: "Kein Ticket ausgewählt! Bitte wählen Sie die Tickets, die Sie bearbeiten möchten."
+notice_account_pending: "Ihr Konto wurde erstellt und wartet jetzt auf die Genehmigung des Administrators."
+notice_default_data_loaded: Die Standard-Konfiguration wurde erfolgreich geladen.
-mail_subject_lost_password: Ihr Redmine Kennwort
-mail_body_lost_password: 'Benutzen Sie folgenden Link, um das Password zu Ãndern:'
-mail_subject_register: Redmine Kontoaktivierung
-mail_body_register: 'Um Ihren Account zu aktivieren, benutzen Sie folgenden Link:'
+error_can_t_load_default_data: "Die Standard-Konfiguration konnte nicht geladen werden: %s"
+error_scm_not_found: Eintrag und/oder Revision besteht nicht im Projektarchiv.
+error_scm_command_failed: "Beim Zugriff auf das Projektarchiv ist ein Fehler aufgetreten: %s"
+error_scm_annotate: "Der Eintrag existiert nicht oder kann nicht annotiert werden."
+error_issue_not_found_in_project: 'Das Ticket wurde nicht gefunden oder gehört nicht zu diesem Projekt.'
+
+mail_subject_lost_password: Ihr %s Kennwort
+mail_body_lost_password: 'Benutzen Sie den folgenden Link, um Ihr Kennwort zu ändern:'
+mail_subject_register: %s Kontoaktivierung
+mail_body_register: 'Um Ihr Konto zu aktivieren, benutzen Sie folgenden Link:'
+mail_body_account_information_external: Sie können sich mit Ihrem Konto "%s" an anmelden.
+mail_body_account_information: Ihre Konto-Informationen
+mail_subject_account_activation_request: Antrag auf %s Kontoaktivierung
+mail_body_account_activation_request: 'Ein neuer Benutzer (%s) hat sich registriert. Sein Konto wartet auf Ihre Genehmigung:'
gui_validation_error: 1 Fehler
gui_validation_error_plural: %d Fehler
@@ -88,7 +102,7 @@ field_summary: Zusammenfassung
field_is_required: Erforderlich
field_firstname: Vorname
field_lastname: Nachname
-field_mail: Email
+field_mail: E-Mail
field_filename: Datei
field_filesize: Größe
field_downloads: Downloads
@@ -108,21 +122,21 @@ field_project: Projekt
field_issue: Ticket
field_status: Status
field_notes: Kommentare
-field_is_closed: Problem erledigt
-field_is_default: Default
+field_is_closed: Ticket geschlossen
+field_is_default: Standardeinstellung
field_tracker: Tracker
field_subject: Thema
field_due_date: Abgabedatum
field_assigned_to: Zugewiesen an
field_priority: Priorität
-field_fixed_version: Erledigt in Version
+field_fixed_version: Zielversion
field_user: Benutzer
field_role: Rolle
-field_homepage: Startseite
+field_homepage: Projekt-Homepage
field_is_public: Öffentlich
field_parent: Unterprojekt von
-field_is_in_chlog: Ansicht im Change-Log
-field_is_in_roadmap: Ansicht in der Roadmap
+field_is_in_chlog: Im Change-Log anzeigen
+field_is_in_roadmap: In der Roadmap anzeigen
field_login: Mitgliedsname
field_mail_notification: Mailbenachrichtigung
field_admin: Administrator
@@ -146,7 +160,7 @@ field_onthefly: On-the-fly-Benutzererstellung
field_start_date: Beginn
field_done_ratio: %% erledigt
field_auth_source: Authentifizierungs-Modus
-field_hide_mail: Email-Adresse nicht anzeigen
+field_hide_mail: E-Mail-Adresse nicht anzeigen
field_comments: Kommentar
field_url: URL
field_start_page: Hauptseite
@@ -155,12 +169,17 @@ field_hours: Stunden
field_activity: Aktivität
field_spent_on: Datum
field_identifier: Kennung
-field_is_filter: Als Fiter benutzen
+field_is_filter: Als Filter benutzen
field_issue_to_id: Zugehöriges Ticket
field_delay: Pufferzeit
field_assignable: Tickets können dieser Rolle zugewiesen werden
field_redirect_existing_links: Existierende Links umleiten
field_estimated_hours: Geschätzter Aufwand
+field_column_names: Spalten
+field_time_zone: Zeitzone
+field_searchable: Durchsuchbar
+field_default_value: Standardwert
+field_comments_sorting: Kommentare anzeigen
setting_app_title: Applikations-Titel
setting_app_subtitle: Applikations-Untertitel
@@ -171,17 +190,37 @@ setting_self_registration: Anmeldung ermöglicht
setting_attachment_max_size: Max. Dateigröße
setting_issues_export_limit: Max. Anzahl Tickets bei CSV/PDF-Export
setting_mail_from: E-Mail-Absender
+setting_bcc_recipients: E-Mails als Blindkopie (BCC) senden
setting_host_name: Hostname
setting_text_formatting: Textformatierung
setting_wiki_compression: Wiki-Historie komprimieren
-setting_feeds_limit: Feed-Inhalt begrenzen
-setting_autofetch_changesets: Commits automatisch abrufen
-setting_sys_api_enabled: Webservice für Repository-Verwaltung benutzen
+setting_feeds_limit: Max. Anzahl Einträge pro Atom-Feed
+setting_default_projects_public: Neue Projekte sind standardmäßig öffentlich
+setting_autofetch_changesets: Changesets automatisch abrufen
+setting_sys_api_enabled: Webservice zur Verwaltung der Projektarchive benutzen
setting_commit_ref_keywords: Schlüsselwörter (Beziehungen)
setting_commit_fix_keywords: Schlüsselwörter (Status)
setting_autologin: Automatische Anmeldung
setting_date_format: Datumsformat
+setting_time_format: Zeitformat
setting_cross_project_issue_relations: Ticket-Beziehungen zwischen Projekten erlauben
+setting_issue_list_default_columns: Default-Spalten in der Ticket-Auflistung
+setting_repositories_encodings: Kodierungen der Projektarchive
+setting_emails_footer: E-Mail-Fußzeile
+setting_protocol: Protokoll
+setting_per_page_options: Objekte pro Seite
+setting_user_format: Benutzer-Anzeigeformat
+setting_activity_days_default: Anzahl Tage pro Seite der Projekt-Aktivität
+setting_display_subprojects_issues: Tickets von Unterprojekten im Hauptprojekt anzeigen
+
+project_module_issue_tracking: Ticket-Verfolgung
+project_module_time_tracking: Zeiterfassung
+project_module_news: News
+project_module_documents: Dokumente
+project_module_files: Dateien
+project_module_wiki: Wiki
+project_module_repository: Projektarchiv
+project_module_boards: Foren
label_user: Benutzer
label_user_plural: Benutzer
@@ -194,10 +233,14 @@ label_project_latest: Neueste Projekte
label_issue: Ticket
label_issue_new: Neues Ticket
label_issue_plural: Tickets
-label_issue_view_all: Alle Tickets ansehen
+label_issue_view_all: Alle Tickets anzeigen
+label_issues_by: Tickets von %s
+label_issue_added: Ticket hinzugefügt
+label_issue_updated: Ticket aktualisiert
label_document: Dokument
label_document_new: Neues Dokument
label_document_plural: Dokumente
+label_document_added: Dokument hinzugefügt
label_role: Rolle
label_role_plural: Rollen
label_role_new: Neue Rolle
@@ -240,6 +283,7 @@ label_last_updates: zuletzt aktualisiert
label_last_updates_plural: %d zuletzt aktualisierten
label_registered_on: Angemeldet am
label_activity: Aktivität
+label_overall_activity: Aktivität aller Projekte anzeigen
label_new: Neu
label_logged_as: Angemeldet als
label_environment: Environment
@@ -252,6 +296,7 @@ label_min_max_length: Länge (Min. - Max.)
label_list: Liste
label_date: Datum
label_integer: Zahl
+label_float: Fließkommazahl
label_boolean: Boolean
label_string: Text
label_text: Langer Text
@@ -266,6 +311,7 @@ label_attachment: Datei
label_attachment_new: Neue Datei
label_attachment_delete: Anhang löschen
label_attachment_plural: Dateien
+label_file_added: Datei hinzugefügt
label_report: Bericht
label_report_plural: Berichte
label_news: News
@@ -273,6 +319,7 @@ label_news_new: News hinzufügen
label_news_plural: News
label_news_latest: Letzte News
label_news_view_all: Alle News anzeigen
+label_news_added: News hinzugefügt
label_change_log: Change-Log
label_settings: Konfiguration
label_overview: Übersicht
@@ -280,7 +327,7 @@ label_version: Version
label_version_new: Neue Version
label_version_plural: Versionen
label_confirmation: Bestätigung
-label_export_to: Export zu
+label_export_to: "Auch abrufbar als:"
label_read: Lesen...
label_public_projects: Öffentliche Projekte
label_open_issues: offen
@@ -293,6 +340,7 @@ label_current_status: Gegenwärtiger Status
label_new_statuses_allowed: Neue Berechtigungen
label_all: alle
label_none: kein
+label_nobody: Niemand
label_next: Weiter
label_previous: Zurück
label_used_by: Benutzt von
@@ -304,7 +352,7 @@ label_months_from: Monate ab
label_gantt: Gantt
label_internal: Intern
label_last_changes: %d letzte Änderungen
-label_change_view_all: Alle Änderungen ansehen
+label_change_view_all: Alle Änderungen anzeigen
label_personalize_page: Diese Seite anpassen
label_comment: Kommentar
label_comment_plural: Kommentare
@@ -322,7 +370,15 @@ label_in_less_than: in weniger als
label_in_more_than: in mehr als
label_in: an
label_today: heute
-label_this_week: diese Woche
+label_all_time: gesamter Zeitraum
+label_yesterday: gestern
+label_this_week: aktuelle Woche
+label_last_week: vorige Woche
+label_last_n_days: die letzten %d Tage
+label_this_month: aktueller Monat
+label_last_month: voriger Monat
+label_this_year: aktuelles Jahr
+label_date_range: Zeitraum
label_less_than_ago: vor weniger als
label_more_than_ago: vor mehr als
label_ago: vor
@@ -330,11 +386,13 @@ label_contains: enthält
label_not_contains: enthält nicht
label_day_plural: Tage
label_repository: Projektarchiv
+label_repository_plural: Projektarchive
label_browse: Codebrowser
label_modification: %d Änderung
label_modification_plural: %d Änderungen
label_revision: Revision
label_revision_plural: Revisionen
+label_associated_revisions: Zugehörige Revisionen
label_added: hinzugefügt
label_modified: geändert
label_deleted: gelöscht
@@ -343,10 +401,10 @@ label_latest_revision_plural: Aktuellste Revisionen
label_view_revisions: Revisionen anzeigen
label_max_size: Maximale Größe
label_on: von
-label_sort_highest: Anfang
-label_sort_higher: eins höher
-label_sort_lower: eins tiefer
-label_sort_lowest: Ende
+label_sort_highest: An den Anfang
+label_sort_higher: Eins höher
+label_sort_lower: Eins tiefer
+label_sort_lowest: Ans Ende
label_roadmap: Roadmap
label_roadmap_due_in: Fällig in
label_roadmap_overdue: %s verspätet
@@ -359,8 +417,8 @@ label_wiki_edit: Wiki-Bearbeitung
label_wiki_edit_plural: Wiki-Bearbeitungen
label_wiki_page: Wiki-Seite
label_wiki_page_plural: Wiki-Seiten
-label_index_by_title: Index by title
-label_index_by_date: Index by date
+label_index_by_title: Seiten nach Titel sortiert
+label_index_by_date: Seiten nach Datum sortiert
label_current_version: Gegenwärtige Version
label_preview: Vorschau
label_feed_plural: Feeds
@@ -407,6 +465,7 @@ label_topic_plural: Themen
label_message_plural: Nachrichten
label_message_last: Letzte Nachricht
label_message_new: Neue Nachricht
+label_message_posted: Forums-Beitrag hinzugefügt
label_reply_plural: Antworten
label_send_information: Sende Kontoinformationen zum Benutzer
label_year: Jahr
@@ -417,11 +476,41 @@ label_date_to: Bis
label_language_based: Sprachabhängig
label_sort_by: Sortiert nach %s
label_send_test_email: Test-E-Mail senden
-label_feeds_access_key_created_on: RSS-Zugriffsschlüssel vor %s erstellt
+label_feeds_access_key_created_on: Atom-Zugriffsschlüssel vor %s erstellt
label_module_plural: Module
label_added_time_by: Von %s vor %s hinzugefügt
label_updated_time: Vor %s aktualisiert
-label_jump_to_a_project: Jump to a project...
+label_jump_to_a_project: Zu einem Projekt springen...
+label_file_plural: Dateien
+label_changeset_plural: Changesets
+label_default_columns: Default-Spalten
+label_no_change_option: (Keine Änderung)
+label_bulk_edit_selected_issues: Alle ausgewählten Tickets bearbeiten
+label_theme: Stil
+label_default: Default
+label_search_titles_only: Nur Titel durchsuchen
+label_user_mail_option_all: "Für alle Ereignisse in all meinen Projekten"
+label_user_mail_option_selected: "Für alle Ereignisse in den ausgewählten Projekten..."
+label_user_mail_option_none: "Nur für Dinge, die ich beobachte oder an denen ich beteiligt bin"
+label_user_mail_no_self_notified: "Ich möchte nicht über Änderungen benachrichtigt werden, die ich selbst durchführe."
+label_registration_activation_by_email: Kontoaktivierung durch E-Mail
+label_registration_manual_activation: Manuelle Kontoaktivierung
+label_registration_automatic_activation: Automatische Kontoaktivierung
+label_display_per_page: 'Pro Seite: %s'
+label_age: Geändert vor
+label_change_properties: Eigenschaften ändern
+label_general: Allgemein
+label_more: Mehr
+label_scm: Versionskontrollsystem
+label_plugins: Plugins
+label_ldap_authentication: LDAP-Authentifizierung
+label_downloads_abbr: D/L
+label_optional_description: Beschreibung (optional)
+label_add_another_file: Eine weitere Datei hinzufügen
+label_preferences: Präferenzen
+label_chronological_order: in zeitlicher Reihenfolge
+label_reverse_chronological_order: in umgekehrter zeitlicher Reihenfolge
+label_planning: Terminplanung
button_login: Anmelden
button_submit: OK
@@ -440,7 +529,7 @@ button_lock: Sperren
button_unlock: Entsperren
button_download: Download
button_list: Liste
-button_view: Siehe
+button_view: Anzeigen
button_move: Verschieben
button_back: Zurück
button_cancel: Abbrechen
@@ -455,12 +544,17 @@ button_archive: Archivieren
button_unarchive: Entarchivieren
button_reset: Zurücksetzen
button_rename: Umbenennen
+button_change_password: Kennwort ändern
+button_copy: Kopieren
+button_annotate: Annotieren
+button_update: Aktualisieren
+button_configure: Konfigurieren
status_active: aktiv
status_registered: angemeldet
status_locked: gesperrt
-text_select_mail_notifications: Aktionen, für die Mailbenachrichtigung aktiviert werden soll.
+text_select_mail_notifications: Bitte wählen Sie die Aktionen aus, für die eine Mailbenachrichtigung gesendet werden soll
text_regexp_info: z. B. ^[A-Z0-9]+$
text_min_max_length_info: 0 heißt keine Beschränkung
text_project_destroy_confirmation: Sind Sie sicher, dass sie das Projekt löschen wollen?
@@ -470,28 +564,42 @@ text_journal_changed: geändert von %s zu %s
text_journal_set_to: gestellt zu %s
text_journal_deleted: gelöscht
text_tip_task_begin_day: Aufgabe, die an diesem Tag beginnt
-text_tip_task_end_day: Aufgabe, die an diesem Tag beendet
-text_tip_task_begin_end_day: Aufgabe, die an diesem Tag beginnt und beendet
+text_tip_task_end_day: Aufgabe, die an diesem Tag endet
+text_tip_task_begin_end_day: Aufgabe, die an diesem Tag beginnt und endet
text_project_identifier_info: 'Kleinbuchstaben (a-z), Ziffern und Bindestriche erlaubt. Einmal gespeichert, kann die Kennung nicht mehr geändert werden.'
text_caracters_maximum: Max. %d Zeichen.
+text_caracters_minimum: Muss mindestens %d Zeichen lang sein.
text_length_between: Länge zwischen %d und %d Zeichen.
text_tracker_no_workflow: Kein Workflow für diesen Tracker definiert.
text_unallowed_characters: Nicht erlaubte Zeichen
text_comma_separated: Mehrere Werte erlaubt (durch Komma getrennt).
text_issues_ref_in_commit_messages: Ticket-Beziehungen und -Status in Commit-Log-Meldungen
-text_issue_added: Ticket %s wurde erstellt.
-text_issue_updated: Ticket %s wurde aktualisiert.
+text_issue_added: Ticket %s wurde erstellt by %s.
+text_issue_updated: Ticket %s wurde aktualisiert by %s.
text_wiki_destroy_confirmation: Sind Sie sicher, dass Sie dieses Wiki mit sämtlichem Inhalt löschen möchten?
-text_issue_category_destroy_question: Some issues (%d) are assigned to this category. What do you want to do ?
-text_issue_category_destroy_assignments: Remove category assignments
-text_issue_category_reassign_to: Reassing issues to this category
+text_issue_category_destroy_question: Einige Tickets (%d) sind dieser Kategorie zugeodnet. Was möchten Sie tun?
+text_issue_category_destroy_assignments: Kategorie-Zuordnung entfernen
+text_issue_category_reassign_to: Tickets dieser Kategorie zuordnen
+text_user_mail_option: "Für nicht ausgewählte Projekte werden Sie nur Benachrichtigungen für Dinge erhalten, die Sie beobachten oder an denen Sie beteiligt sind (z. B. Tickets, deren Autor Sie sind oder die Ihnen zugewiesen sind)."
+text_no_configuration_data: "Rollen, Tracker, Ticket-Status und Workflows wurden noch nicht konfiguriert.\nEs ist sehr zu empfehlen, die Standard-Konfiguration zu laden. Sobald sie geladen ist, können Sie sie abändern."
+text_load_default_configuration: Standard-Konfiguration laden
+text_status_changed_by_changeset: Status geändert durch Changeset %s.
+text_issues_destroy_confirmation: 'Sind Sie sicher, dass Sie die ausgewählten Tickets löschen möchten?'
+text_select_project_modules: 'Bitte wählen Sie die Module aus, die in diesem Projekt aktiviert sein sollen:'
+text_default_administrator_account_changed: Administrator-Kennwort geändert
+text_file_repository_writable: Verzeichnis für Dateien beschreibbar
+text_rmagick_available: RMagick verfügbar (optional)
+text_destroy_time_entries_question: Es wurden bereits %.02f Stunden auf dieses Ticket gebucht. Was soll mit den Aufwänden geschehen?
+text_destroy_time_entries: Gebuchte Aufwände löschen
+text_assign_time_entries_to_project: Gebuchte Aufwände dem Projekt zuweisen
+text_reassign_time_entries: 'Gebuchte Aufwände diesem Ticket zuweisen:'
default_role_manager: Manager
-default_role_developper: Developer
+default_role_developper: Entwickler
default_role_reporter: Reporter
default_tracker_bug: Fehler
default_tracker_feature: Feature
-default_tracker_support: Support
+default_tracker_support: Unterstützung
default_issue_status_new: Neu
default_issue_status_assigned: Zugewiesen
default_issue_status_resolved: Gelöst
@@ -506,41 +614,27 @@ default_priority_high: Hoch
default_priority_urgent: Dringend
default_priority_immediate: Sofort
default_activity_design: Design
-default_activity_development: Development
+default_activity_development: Entwicklung
enumeration_issue_priorities: Ticket-Prioritäten
enumeration_doc_categories: Dokumentenkategorien
enumeration_activities: Aktivitäten (Zeiterfassung)
-label_file_plural: Files
-label_changeset_plural: Changesets
-field_column_names: Columns
-label_default_columns: Default columns
-setting_issue_list_default_columns: Default columns displayed on the issue list
-setting_repositories_encodings: Repositories encodings
-notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit."
-label_bulk_edit_selected_issues: Bulk edit selected issues
-label_no_change_option: (No change)
-notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s."
-label_theme: Theme
-label_default: Default
-label_search_titles_only: Search titles only
-label_nobody: nobody
-button_change_password: Change password
-text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)."
-label_user_mail_option_selected: "For any event on the selected projects only..."
-label_user_mail_option_all: "For any event on all my projects"
-label_user_mail_option_none: "Only for things I watch or I'm involved in"
-setting_emails_footer: Emails footer
-label_float: Float
-button_copy: Copy
-mail_body_account_information_external: You can use your "%s" account to log into Redmine.
-mail_body_account_information: Your Redmine account information
-setting_protocol: Protocol
-label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
-setting_time_format: Time format
-label_registration_activation_by_email: account activation by email
-mail_subject_account_activation_request: Redmine account activation request
-mail_body_account_activation_request: 'A new user (%s) has registered. His account his pending your approval:'
-label_registration_automatic_activation: automatic account activation
-label_registration_manual_activation: manual account activation
-notice_account_pending: "Your account was created and is now pending administrator approval."
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
+label_and_its_subprojects: %s and its subprojects
+mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
+mail_subject_reminder: "%d issue(s) due in the next days"
+text_user_wrote: '%s wrote:'
+label_duplicated_by: duplicated by
+setting_enabled_scm: Enabled SCM
+text_enumeration_category_reassign_to: 'Reassign them to this value:'
+text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
+text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/en.yml b/lang/en.yml
index 1df0cf7c9..c9dddf9cc 100644
--- a/lang/en.yml
+++ b/lang/en.yml
@@ -48,6 +48,7 @@ general_text_no: 'no'
general_text_yes: 'yes'
general_lang_name: 'English'
general_csv_separator: ','
+general_csv_decimal_separator: '.'
general_csv_encoding: ISO-8859-1
general_pdf_encoding: ISO-8859-1
general_day_names: Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
@@ -67,24 +68,32 @@ notice_successful_update: Successful update.
notice_successful_delete: Successful deletion.
notice_successful_connection: Successful connection.
notice_file_not_found: The page you were trying to access doesn't exist or has been removed.
-notice_locking_conflict: Data have been updated by another user.
-notice_scm_error: Entry and/or revision doesn't exist in the repository.
+notice_locking_conflict: Data has been updated by another user.
notice_not_authorized: You are not authorized to access this page.
notice_email_sent: An email was sent to %s
notice_email_error: An error occurred while sending mail (%s)
-notice_feeds_access_key_reseted: Your RSS access key was reseted.
+notice_feeds_access_key_reseted: Your RSS access key was reset.
notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s."
notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit."
notice_account_pending: "Your account was created and is now pending administrator approval."
+notice_default_data_loaded: Default configuration successfully loaded.
-mail_subject_lost_password: Your Redmine password
-mail_body_lost_password: 'To change your Redmine password, click on the following link:'
-mail_subject_register: Redmine account activation
-mail_body_register: 'To activate your Redmine account, click on the following link:'
-mail_body_account_information_external: You can use your "%s" account to log into Redmine.
-mail_body_account_information: Your Redmine account information
-mail_subject_account_activation_request: Redmine account activation request
-mail_body_account_activation_request: 'A new user (%s) has registered. His account his pending your approval:'
+error_can_t_load_default_data: "Default configuration could not be loaded: %s"
+error_scm_not_found: "The entry or revision was not found in the repository."
+error_scm_command_failed: "An error occurred when trying to access the repository: %s"
+error_scm_annotate: "The entry does not exist or can not be annotated."
+error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
+
+mail_subject_lost_password: Your %s password
+mail_body_lost_password: 'To change your password, click on the following link:'
+mail_subject_register: Your %s account activation
+mail_body_register: 'To activate your account, click on the following link:'
+mail_body_account_information_external: You can use your "%s" account to log in.
+mail_body_account_information: Your account information
+mail_subject_account_activation_request: %s account activation request
+mail_body_account_activation_request: 'A new user (%s) has registered. His account is pending your approval:'
+mail_subject_reminder: "%d issue(s) due in the next days"
+mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
gui_validation_error: 1 error
gui_validation_error_plural: %d errors
@@ -122,7 +131,7 @@ field_subject: Subject
field_due_date: Due date
field_assigned_to: Assigned to
field_priority: Priority
-field_fixed_version: Fixed version
+field_fixed_version: Target version
field_user: User
field_role: Role
field_homepage: Homepage
@@ -169,6 +178,11 @@ field_assignable: Issues can be assigned to this role
field_redirect_existing_links: Redirect existing links
field_estimated_hours: Estimated time
field_column_names: Columns
+field_time_zone: Time zone
+field_searchable: Searchable
+field_default_value: Default value
+field_comments_sorting: Display comments
+field_parent_title: Parent page
setting_app_title: Application title
setting_app_subtitle: Application subtitle
@@ -179,10 +193,12 @@ setting_self_registration: Self-registration
setting_attachment_max_size: Attachment max. size
setting_issues_export_limit: Issues export limit
setting_mail_from: Emission email address
+setting_bcc_recipients: Blind carbon copy recipients (bcc)
setting_host_name: Host name
setting_text_formatting: Text formatting
setting_wiki_compression: Wiki history compression
setting_feeds_limit: Feed content limit
+setting_default_projects_public: New projects are public by default
setting_autofetch_changesets: Autofetch commits
setting_sys_api_enabled: Enable WS for repository management
setting_commit_ref_keywords: Referencing keywords
@@ -193,8 +209,26 @@ setting_time_format: Time format
setting_cross_project_issue_relations: Allow cross-project issue relations
setting_issue_list_default_columns: Default columns displayed on the issue list
setting_repositories_encodings: Repositories encodings
+setting_commit_logs_encoding: Commit messages encoding
setting_emails_footer: Emails footer
setting_protocol: Protocol
+setting_per_page_options: Objects per page options
+setting_user_format: Users display format
+setting_activity_days_default: Days displayed on project activity
+setting_display_subprojects_issues: Display subprojects issues on main projects by default
+setting_enabled_scm: Enabled SCM
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
+setting_sequential_project_identifiers: Generate sequential project identifiers
+
+project_module_issue_tracking: Issue tracking
+project_module_time_tracking: Time tracking
+project_module_news: News
+project_module_documents: Documents
+project_module_files: Files
+project_module_wiki: Wiki
+project_module_repository: Repository
+project_module_boards: Boards
label_user: User
label_user_plural: Users
@@ -208,9 +242,13 @@ label_issue: Issue
label_issue_new: New issue
label_issue_plural: Issues
label_issue_view_all: View all issues
+label_issues_by: Issues by %s
+label_issue_added: Issue added
+label_issue_updated: Issue updated
label_document: Document
label_document_new: New document
label_document_plural: Documents
+label_document_added: Document added
label_role: Role
label_role_plural: Roles
label_role_new: New role
@@ -235,7 +273,7 @@ label_enumerations: Enumerations
label_enumeration_new: New value
label_information: Information
label_information_plural: Information
-label_please_login: Please login
+label_please_login: Please log in
label_register: Register
label_password_lost: Lost password
label_home: Home
@@ -253,14 +291,16 @@ label_last_updates: Last updated
label_last_updates_plural: %d last updated
label_registered_on: Registered on
label_activity: Activity
+label_overall_activity: Overall activity
label_new: New
-label_logged_as: Logged as
+label_logged_as: Logged in as
label_environment: Environment
label_authentication: Authentication
label_auth_source: Authentication mode
label_auth_source_new: New authentication mode
label_auth_source_plural: Authentication modes
label_subproject_plural: Subprojects
+label_and_its_subprojects: %s and its subprojects
label_min_max_length: Min - Max length
label_list: List
label_date: Date
@@ -280,6 +320,7 @@ label_attachment: File
label_attachment_new: New file
label_attachment_delete: Delete file
label_attachment_plural: Files
+label_file_added: File added
label_report: Report
label_report_plural: Reports
label_news: News
@@ -287,6 +328,7 @@ label_news_new: Add news
label_news_plural: News
label_news_latest: Latest news
label_news_view_all: View all news
+label_news_added: News added
label_change_log: Change log
label_settings: Settings
label_overview: Overview
@@ -294,7 +336,7 @@ label_version: Version
label_version_new: New version
label_version_plural: Versions
label_confirmation: Confirmation
-label_export_to: Export to
+label_export_to: 'Also available in:'
label_read: Read...
label_public_projects: Public projects
label_open_issues: open
@@ -337,7 +379,15 @@ label_in_less_than: in less than
label_in_more_than: in more than
label_in: in
label_today: today
+label_all_time: all time
+label_yesterday: yesterday
label_this_week: this week
+label_last_week: last week
+label_last_n_days: last %d days
+label_this_month: this month
+label_last_month: last month
+label_this_year: this year
+label_date_range: Date range
label_less_than_ago: less than days ago
label_more_than_ago: more than days ago
label_ago: days ago
@@ -345,11 +395,13 @@ label_contains: contains
label_not_contains: doesn't contain
label_day_plural: days
label_repository: Repository
+label_repository_plural: Repositories
label_browse: Browse
label_modification: %d change
label_modification_plural: %d changes
label_revision: Revision
label_revision_plural: Revisions
+label_associated_revisions: Associated revisions
label_added: added
label_modified: modified
label_deleted: deleted
@@ -403,6 +455,7 @@ label_relation_new: New relation
label_relation_delete: Delete relation
label_relates_to: related to
label_duplicates: duplicates
+label_duplicated_by: duplicated by
label_blocks: blocks
label_blocked_by: blocked by
label_precedes: precedes
@@ -422,6 +475,7 @@ label_topic_plural: Topics
label_message_plural: Messages
label_message_last: Last message
label_message_new: New message
+label_message_posted: Message added
label_reply_plural: Replies
label_send_information: Send account information to the user
label_year: Year
@@ -452,6 +506,24 @@ label_user_mail_no_self_notified: "I don't want to be notified of changes that I
label_registration_activation_by_email: account activation by email
label_registration_manual_activation: manual account activation
label_registration_automatic_activation: automatic account activation
+label_display_per_page: 'Per page: %s'
+label_age: Age
+label_change_properties: Change properties
+label_general: General
+label_more: More
+label_scm: SCM
+label_plugins: Plugins
+label_ldap_authentication: LDAP authentication
+label_downloads_abbr: D/L
+label_optional_description: Optional description
+label_add_another_file: Add another file
+label_preferences: Preferences
+label_chronological_order: In chronological order
+label_reverse_chronological_order: In reverse chronological order
+label_planning: Planning
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+label_issue_watchers: Watchers
button_login: Login
button_submit: Submit
@@ -487,6 +559,10 @@ button_reset: Reset
button_rename: Rename
button_change_password: Change password
button_copy: Copy
+button_annotate: Annotate
+button_update: Update
+button_configure: Configure
+button_quote: Quote
status_active: active
status_registered: registered
@@ -495,7 +571,8 @@ status_locked: locked
text_select_mail_notifications: Select actions for which email notifications should be sent.
text_regexp_info: eg. ^[A-Z0-9]+$
text_min_max_length_info: 0 means no restriction
-text_project_destroy_confirmation: Are you sure you want to delete this project and all related data ?
+text_project_destroy_confirmation: Are you sure you want to delete this project and related data ?
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
text_workflow_edit: Select a role and a tracker to edit the workflow
text_are_you_sure: Are you sure ?
text_journal_changed: changed from %s to %s
@@ -504,20 +581,37 @@ text_journal_deleted: deleted
text_tip_task_begin_day: task beginning this day
text_tip_task_end_day: task ending this day
text_tip_task_begin_end_day: task beginning and ending this day
-text_project_identifier_info: 'Lower case letters (a-z), numbers and dashes allowed. Once saved, the identifier can not be changed.'
+text_project_identifier_info: 'Only lower case letters (a-z), numbers and dashes are allowed. Once saved, the identifier can not be changed.'
text_caracters_maximum: %d characters maximum.
+text_caracters_minimum: Must be at least %d characters long.
text_length_between: Length between %d and %d characters.
text_tracker_no_workflow: No workflow defined for this tracker
text_unallowed_characters: Unallowed characters
text_comma_separated: Multiple values allowed (comma separated).
text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages
-text_issue_added: Issue %s has been reported.
-text_issue_updated: Issue %s has been updated.
+text_issue_added: Issue %s has been reported by %s.
+text_issue_updated: Issue %s has been updated by %s.
text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content ?
text_issue_category_destroy_question: Some issues (%d) are assigned to this category. What do you want to do ?
text_issue_category_destroy_assignments: Remove category assignments
text_issue_category_reassign_to: Reassign issues to this category
text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)."
+text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
+text_load_default_configuration: Load the default configuration
+text_status_changed_by_changeset: Applied in changeset %s.
+text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s) ?'
+text_select_project_modules: 'Select modules to enable for this project:'
+text_default_administrator_account_changed: Default administrator account changed
+text_file_repository_writable: File repository writable
+text_rmagick_available: RMagick available (optional)
+text_destroy_time_entries_question: %.02f hours were reported on the issues you are about to delete. What do you want to do ?
+text_destroy_time_entries: Delete reported hours
+text_assign_time_entries_to_project: Assign reported hours to the project
+text_reassign_time_entries: 'Reassign reported hours to this issue:'
+text_user_wrote: '%s wrote:'
+text_enumeration_destroy_question: '%d objects are assigned to this value.'
+text_enumeration_category_reassign_to: 'Reassign them to this value:'
+text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
default_role_manager: Manager
default_role_developper: Developer
diff --git a/lang/es.yml b/lang/es.yml
index 5175e6c19..e4b4f0668 100644
--- a/lang/es.yml
+++ b/lang/es.yml
@@ -5,8 +5,8 @@ actionview_datehelper_select_month_names: Enero,Febrero,Marzo,Abril,Mayo,Junio,J
actionview_datehelper_select_month_names_abbr: Ene,Feb,Mar,Abr,Mayo,Jun,Jul,Ago,Sep,Oct,Nov,Dic
actionview_datehelper_select_month_prefix:
actionview_datehelper_select_year_prefix:
-actionview_datehelper_time_in_words_day: 1 day
-actionview_datehelper_time_in_words_day_plural: %d days
+actionview_datehelper_time_in_words_day: 1 dÃa
+actionview_datehelper_time_in_words_day_plural: %d dÃas
actionview_datehelper_time_in_words_hour_about: una hora aproximadamente
actionview_datehelper_time_in_words_hour_about_plural: aproximadamente %d horas
actionview_datehelper_time_in_words_hour_about_single: una hora aproximadamente
@@ -17,19 +17,19 @@ actionview_datehelper_time_in_words_minute_plural: %d minutos
actionview_datehelper_time_in_words_minute_single: 1 minuto
actionview_datehelper_time_in_words_second_less_than: menos de un segundo
actionview_datehelper_time_in_words_second_less_than_plural: menos de %d segundos
-actionview_instancetag_blank_option: Por favor selecciona
+actionview_instancetag_blank_option: Por favor seleccione
-activerecord_error_inclusion: is not included in the list
-activerecord_error_exclusion: is reserved
-activerecord_error_invalid: is invalid
-activerecord_error_confirmation: doesn't match confirmation
-activerecord_error_accepted: must be accepted
-activerecord_error_empty: can't be empty
-activerecord_error_blank: can't be blank
+activerecord_error_inclusion: no está incluÃdo en la lista
+activerecord_error_exclusion: está reservado
+activerecord_error_invalid: no es válido
+activerecord_error_confirmation: la confirmación no coincide
+activerecord_error_accepted: debe ser aceptado
+activerecord_error_empty: no puede estar vacÃo
+activerecord_error_blank: no puede estar en blanco
activerecord_error_too_long: es demasiado largo
activerecord_error_too_short: es demasiado corto
activerecord_error_wrong_length: la longitud es incorrecta
-activerecord_error_taken: has already been taken
+activerecord_error_taken: ya está siendo usado
activerecord_error_not_a_number: no es un número
activerecord_error_not_a_date: no es una fecha válida
activerecord_error_greater_than_start_date: debe ser la fecha mayor que del comienzo
@@ -48,33 +48,36 @@ general_text_no: 'no'
general_text_yes: 'sÃ'
general_lang_name: 'Español'
general_csv_separator: ';'
+general_csv_decimal_separator: ','
general_csv_encoding: ISO-8859-15
general_pdf_encoding: ISO-8859-15
general_day_names: Lunes,Martes,Miércoles,Jueves,Viernes,Sábado,Domingo
general_first_day_of_week: '1'
-notice_account_updated: Cuenta creada correctamente.
-notice_account_invalid_creditentials: Inválido usuario o contraseña
+notice_account_updated: Cuenta actualizada correctamente.
+notice_account_invalid_creditentials: Usuario o contraseña inválido.
notice_account_password_updated: Contraseña modificada correctamente.
-notice_account_wrong_password: Contraseña incorrecta
+notice_account_wrong_password: Contraseña incorrecta.
notice_account_register_done: Cuenta creada correctamente.
notice_account_unknown_email: Usuario desconocido.
-notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password.
-notice_account_lost_email_sent: Un correo con instrucciones para elegir una nueva contraseña le ha sido enviado.
-notice_account_activated: Tu cuenta ha sido activada. Ahora se encuentra conectado.
+notice_can_t_change_password: Esta cuenta utiliza una fuente de autenticación externa. No es posible cambiar la contraseña.
+notice_account_lost_email_sent: Se le ha enviado un correo con instrucciones para elegir una nueva contraseña.
+notice_account_activated: Su cuenta ha sido activada. Ahora se encuentra conectado.
notice_successful_create: Creación correcta.
notice_successful_update: Modificación correcta.
notice_successful_delete: Borrado correcto.
notice_successful_connection: Conexión correcta.
-notice_file_not_found: La página que intentabas tener acceso no existe ni se ha quitado.
+notice_file_not_found: La página a la que intentas acceder no existe.
notice_locking_conflict: Los datos han sido modificados por otro usuario.
-notice_scm_error: La entrada y/o la revisión no existe en el depósito.
notice_not_authorized: No tiene autorización para acceder a esta página.
-mail_subject_lost_password: Tu contraseña del CIYAT - Gestor de Solicitudes
-mail_body_lost_password: 'To change your Redmine password, click on the following link:'
-mail_subject_register: Activación de la cuenta del CIYAT - Gestor de Solicitudes
-mail_body_register: 'To activate your Redmine account, click on the following link:'
+error_scm_not_found: "La entrada y/o la revisión no existe en el repositorio."
+error_scm_command_failed: "An error occurred when trying to access the repository: %s"
+
+mail_subject_lost_password: Tu contraseña del %s
+mail_body_lost_password: 'Para cambiar su contraseña, haga click en el siguiente enlace:'
+mail_subject_register: Activación de la cuenta del %s
+mail_body_register: 'Para activar su cuenta, haga click en el siguiente enlace:'
gui_validation_error: 1 error
gui_validation_error_plural: %d errores
@@ -85,7 +88,7 @@ field_summary: Resumen
field_is_required: Obligatorio
field_firstname: Nombre
field_lastname: Apellido
-field_mail: Email
+field_mail: Correo electrónico
field_filename: Fichero
field_filesize: Tamaño
field_downloads: Descargas
@@ -109,19 +112,19 @@ field_is_closed: Petición resuelta
field_is_default: Estado por defecto
field_tracker: Tracker
field_subject: Tema
-field_due_date: Fecha debida
+field_due_date: Fecha fin
field_assigned_to: Asignado a
field_priority: Prioridad
-field_fixed_version: Versión corregida
+field_fixed_version: Target version
field_user: Usuario
field_role: Perfil
field_homepage: Sitio web
field_is_public: Público
-field_parent: Proyecto secundario de
+field_parent: Proyecto padre
field_is_in_chlog: Consultar las peticiones en el histórico
field_is_in_roadmap: Consultar las peticiones en el roadmap
field_login: Identificador
-field_mail_notification: Notificación por mail
+field_mail_notification: Notificaciones por correo
field_admin: Administrador
field_last_login_on: Última conexión
field_language: Idioma
@@ -134,16 +137,16 @@ field_type: Tipo
field_host: Anfitrión
field_port: Puerto
field_account: Cuenta
-field_base_dn: Base DN
+field_base_dn: DN base
field_attr_login: Cualidad del identificador
field_attr_firstname: Cualidad del nombre
field_attr_lastname: Cualidad del apellido
field_attr_mail: Cualidad del Email
-field_onthefly: Creación del usuario On-the-fly
-field_start_date: Comienzo
+field_onthefly: Creación del usuario "al vuelo"
+field_start_date: Fecha de inicio
field_done_ratio: %% Realizado
-field_auth_source: Modo de la autentificación
-field_hide_mail: Ocultar mi dirección de email
+field_auth_source: Modo de identificación
+field_hide_mail: Ocultar mi dirección de correo
field_comment: Comentario
field_url: URL
field_start_page: Página principal
@@ -155,25 +158,26 @@ field_identifier: Identificador
field_is_filter: Usado como filtro
field_issue_to_id: Petición Relacionada
field_delay: Retraso
+field_default_value: Estado por defecto
-setting_app_title: TÃtulo del aplicación
-setting_app_subtitle: SubtÃtulo del aplicación
-setting_welcome_text: Texto bienvenida
+setting_app_title: TÃtulo de la aplicación
+setting_app_subtitle: SubtÃtulo de la aplicación
+setting_welcome_text: Texto de bienvenida
setting_default_language: Idioma por defecto
-setting_login_required: Autentif. requerida
+setting_login_required: Se requiere identificación
setting_self_registration: Registro permitido
setting_attachment_max_size: Tamaño máximo del fichero
-setting_issues_export_limit: Issues export limit
-setting_mail_from: Email de la emisión
-setting_host_name: Nombre de anfitrión
+setting_issues_export_limit: LÃmite de exportación de peticiones
+setting_mail_from: Correo desde el que enviar mensajes
+setting_host_name: Nombre de host
setting_text_formatting: Formato de texto
-setting_wiki_compression: Compresión de la historia de Wiki
-setting_feeds_limit: Feed content limit
-setting_autofetch_changesets: Autofetch SVN commits
-setting_sys_api_enabled: Enable WS for repository management
-setting_commit_ref_keywords: Referencing keywords
-setting_commit_fix_keywords: Fixing keywords
-setting_autologin: Autologin
+setting_wiki_compression: Compresión del historial de Wiki
+setting_feeds_limit: LÃmite de contenido para sindicación
+setting_autofetch_changesets: Autorellenar los commits del repositorio
+setting_sys_api_enabled: Habilitar WS para la gestión del repositorio
+setting_commit_ref_keywords: Palabras clave para la referencia
+setting_commit_fix_keywords: Palabras clave para la corrección
+setting_autologin: Conexión automática
setting_date_format: Formato de la fecha
label_user: Usuario
@@ -183,7 +187,7 @@ label_project: Proyecto
label_project_new: Nuevo proyecto
label_project_plural: Proyectos
label_project_all: Todos los proyectos
-label_project_latest: Los proyectos más últimos
+label_project_latest: Últimos proyectos
label_issue: Petición
label_issue_new: Nueva petición
label_issue_plural: Peticiones
@@ -201,7 +205,7 @@ label_member_plural: Miembros
label_tracker: Tracker
label_tracker_plural: Trackers
label_tracker_new: Nuevo tracker
-label_workflow: Workflow
+label_workflow: Flujo de trabajo
label_issue_status: Estado de petición
label_issue_status_plural: Estados de las peticiones
label_issue_status_new: Nuevo estado
@@ -213,12 +217,12 @@ label_custom_field_plural: Campos personalizados
label_custom_field_new: Nuevo campo personalizado
label_enumerations: Listas de valores
label_enumeration_new: Nuevo valor
-label_information: Informacion
-label_information_plural: Informaciones
+label_information: Información
+label_information_plural: Información
label_please_login: Conexión
label_register: Registrar
label_password_lost: ¿Olvidaste la contraseña?
-label_home: Principal
+label_home: Inicio
label_my_page: Mi página
label_my_account: Mi cuenta
label_my_projects: Mis proyectos
@@ -226,7 +230,7 @@ label_administration: Administración
label_login: Conexión
label_logout: Desconexión
label_help: Ayuda
-label_reported_issues: Peticiones registradas
+label_reported_issues: Peticiones registradas por mÃ
label_assigned_to_me_issues: Peticiones que me están asignadas
label_last_login: Última conexión
label_last_updates: Actualizado
@@ -236,10 +240,10 @@ label_activity: Actividad
label_new: Nuevo
label_logged_as: Conectado como
label_environment: Entorno
-label_authentication: Autentificación
-label_auth_source: Modo de la autentificación
-label_auth_source_new: Nuevo modo de la autentificación
-label_auth_source_plural: Modos de la autentificación
+label_authentication: Autenticación
+label_auth_source: Modo de autenticación
+label_auth_source_new: Nuevo modo de autenticación
+label_auth_source_plural: Modos de autenticación
label_subproject_plural: Proyectos secundarios
label_min_max_length: Longitud mÃn - máx
label_list: Lista
@@ -257,7 +261,7 @@ label_change_status: Cambiar el estado
label_history: Histórico
label_attachment: Fichero
label_attachment_new: Nuevo fichero
-label_attachment_delete: Suprimir el fichero
+label_attachment_delete: Borrar el fichero
label_attachment_plural: Ficheros
label_report: Informe
label_report_plural: Informes
@@ -290,7 +294,7 @@ label_next: Próximo
label_previous: Anterior
label_used_by: Utilizado por
label_details: Detalles
-label_add_note: Agregar una nota
+label_add_note: Añadir una nota
label_per_page: Por la página
label_calendar: Calendario
label_months_from: meses de
@@ -303,11 +307,11 @@ label_comment: Comentario
label_comment_plural: Comentarios
label_comment_add: Añadir un comentario
label_comment_added: Comentario añadido
-label_comment_delete: Suprimir comentarios
-label_query: Pregunta personalizada
-label_query_plural: Preguntas personalizadas
-label_query_new: Nueva pregunta
-label_filter_add: Agregar el filtro
+label_comment_delete: Borrar comentarios
+label_query: Consulta personalizada
+label_query_plural: Consultas personalizadas
+label_query_new: Nueva consulta
+label_filter_add: Añadir el filtro
label_filter_plural: Filtros
label_equals: igual
label_not_equals: no igual
@@ -321,7 +325,7 @@ label_ago: hace
label_contains: contiene
label_not_contains: no contiene
label_day_plural: dÃas
-label_repository: Depósito SVN
+label_repository: Repositorio
label_browse: Hojear
label_modification: %d modificación
label_modification_plural: %d modificaciones
@@ -330,21 +334,21 @@ label_revision_plural: Revisiones
label_added: añadido
label_modified: modificado
label_deleted: suprimido
-label_latest_revision: La revisión más actual
-label_latest_revision_plural: Las revisiones más actuales
+label_latest_revision: Última revisión
+label_latest_revision_plural: Últimas revisiones
label_view_revisions: Ver las revisiones
label_max_size: Tamaño máximo
-label_on: en
+label_on: de
label_sort_highest: Primero
label_sort_higher: Subir
label_sort_lower: Bajar
label_sort_lowest: Último
label_roadmap: Roadmap
-label_roadmap_due_in: Realizado en
+label_roadmap_due_in: Finaliza en
label_roadmap_no_issues: No hay peticiones para esta versión
label_search: Búsqueda
label_result: %d resultado
-label_result_plural: %d resultados
+label_result_plural: Resultados
label_all_words: Todas las palabras
label_wiki: Wiki
label_wiki_edit: Wiki edicción
@@ -353,10 +357,10 @@ label_wiki_page: Wiki página
label_wiki_page_plural: Wiki páginas
label_page_index: Ãndice
label_current_version: Versión actual
-label_preview: Previo
+label_preview: Previsualizar
label_feed_plural: Feeds
label_changes_details: Detalles de todos los cambios
-label_issue_tracking: Petición tracking
+label_issue_tracking: Peticiones
label_spent_time: Tiempo dedicado
label_f_hour: %.2f hora
label_f_hour_plural: %.2f horas
@@ -366,10 +370,10 @@ label_statistics: EstadÃsticas
label_commits_per_month: Commits por mes
label_commits_per_author: Commits por autor
label_view_diff: Ver diferencias
-label_diff_inline: inline
-label_diff_side_by_side: side by side
+label_diff_inline: en lÃnea
+label_diff_side_by_side: cara a cara
label_options: Opciones
-label_copy_workflow_from: Copiar workflow desde
+label_copy_workflow_from: Copiar flujo de trabajo desde
label_permissions_report: Informe de permisos
label_watched_issues: Peticiones monitorizadas
label_related_issues: Peticiones relacionadas
@@ -377,44 +381,44 @@ label_applied_status: Aplicar estado
label_loading: Cargando...
label_relation_new: Nueva relación
label_relation_delete: Eliminar relación
-label_relates_to: relacionado a
-label_duplicates: duplicados
-label_blocks: bloques
+label_relates_to: relacionada con
+label_duplicates: duplicada de
+label_blocks: bloquea a
label_blocked_by: bloqueado por
-label_precedes: anteriores
-label_follows: siguientes
+label_precedes: anterior a
+label_follows: posterior a
label_end_to_start: fin a principio
label_end_to_end: fin a fin
label_start_to_start: principio a principio
label_start_to_end: principio a fin
-label_stay_logged_in: Stay logged in
+label_stay_logged_in: Recordar conexión
label_disabled: deshabilitado
label_show_completed_versions: Muestra las versiones completas
-label_me: me
-label_board: Forum
-label_board_new: Nuevo forum
-label_board_plural: Forums
-label_topic_plural: Topics
+label_me: yo mismo
+label_board: Foro
+label_board_new: Nuevo foro
+label_board_plural: Foros
+label_topic_plural: Temas
label_message_plural: Mensajes
label_message_last: Último mensaje
label_message_new: Nuevo mensaje
label_reply_plural: Respuestas
-label_send_information: Enviada información de la cuenta al usuario
+label_send_information: Enviar información de la cuenta al usuario
label_year: Año
label_month: Mes
label_week: Semana
label_date_from: Desde
label_date_to: Hasta
-label_language_based: Idioma basado
+label_language_based: Badado en el idioma
button_login: Conexión
button_submit: Aceptar
-button_save: Validar
+button_save: Guardar
button_check_all: Seleccionar todo
button_uncheck_all: No seleccionar nada
-button_delete: Suprimir
+button_delete: Borrar
button_create: Crear
-button_test: Testar
+button_test: Probar
button_edit: Modificar
button_add: Añadir
button_change: Cambiar
@@ -429,7 +433,7 @@ button_move: Mover
button_back: Atrás
button_cancel: Cancelar
button_activate: Activar
-button_sort: Clasificar
+button_sort: Ordenar
button_log_time: Tiempo dedicado
button_rollback: Volver a esta versión
button_watch: Monitorizar
@@ -442,11 +446,11 @@ status_active: activo
status_registered: registrado
status_locked: bloqueado
-text_select_mail_notifications: Seleccionar las actividades que necesitan la activación de la notificación por mail.
+text_select_mail_notifications: Seleccionar los eventos a notificar
text_regexp_info: eg. ^[A-Z0-9]+$
text_min_max_length_info: 0 para ninguna restricción
-text_project_destroy_confirmation: ¿ Estás seguro de querer eliminar el proyecto ?
-text_workflow_edit: Seleccionar un workflow para actualizar
+text_project_destroy_confirmation: ¿Estás seguro de querer eliminar el proyecto?
+text_workflow_edit: Seleccionar un flujo de trabajo para actualizar
text_are_you_sure: ¿ Estás seguro ?
text_journal_changed: cambiado de %s a %s
text_journal_set_to: fijado a %s
@@ -455,30 +459,30 @@ text_tip_task_begin_day: tarea que comienza este dÃa
text_tip_task_end_day: tarea que termina este dÃa
text_tip_task_begin_end_day: tarea que comienza y termina este dÃa
text_project_identifier_info: 'Letras minúsculas (a-z), números y signos de puntuación permitidos. Una vez guardado, el identificador no puede modificarse.'
-text_caracters_maximum: %d caracteres máximo.
-text_length_between: Longitud entre %d y %d caracteres.
-text_tracker_no_workflow: No hay ningún workflow definido para este tracker
-text_unallowed_characters: Caracteres no permitidos
+text_caracters_maximum: %d carácteres como máximo.
+text_length_between: Longitud entre %d y %d carácteres.
+text_tracker_no_workflow: No hay ningún flujo de trabajo definido para este tracker
+text_unallowed_characters: Carácteres no permitidos
text_comma_separated: Múltiples valores permitidos (separados por coma).
text_issues_ref_in_commit_messages: Referencia y petición de corrección en los mensajes
-default_role_manager: Manager
+default_role_manager: Jefe de proyecto
default_role_developper: Desarrollador
default_role_reporter: Informador
-default_tracker_bug: AnomalÃa
-default_tracker_feature: Evolución
-default_tracker_support: Asistencia
-default_issue_status_new: Nuevo
+default_tracker_bug: Errores
+default_tracker_feature: Tareas
+default_tracker_support: Soporte
+default_issue_status_new: Nueva
default_issue_status_assigned: Asignada
default_issue_status_resolved: Resuelta
-default_issue_status_feedback: Comentario
+default_issue_status_feedback: Comentarios
default_issue_status_closed: Cerrada
default_issue_status_rejected: Rechazada
-default_doc_category_user: Documentación del usuario
-default_doc_category_tech: Documentación tecnica
-default_priority_low: Bajo
+default_doc_category_user: Documentación de usuario
+default_doc_category_tech: Documentación técnica
+default_priority_low: Baja
default_priority_normal: Normal
-default_priority_high: Alto
+default_priority_high: Alta
default_priority_urgent: Urgente
default_priority_immediate: Inmediata
default_activity_design: Diseño
@@ -487,63 +491,152 @@ default_activity_development: Desarrollo
enumeration_issue_priorities: Prioridad de las peticiones
enumeration_doc_categories: CategorÃas del documento
enumeration_activities: Actividades (tiempo dedicado)
-label_index_by_date: Index by date
-field_column_names: Columns
-button_rename: Rename
-text_issue_category_destroy_question: Some issues (%d) are assigned to this category. What do you want to do ?
-label_feeds_access_key_created_on: RSS access key created %s ago
-label_default_columns: Default columns
-setting_cross_project_issue_relations: Allow cross-project issue relations
-label_roadmap_overdue: %s late
-label_module_plural: Modules
-label_this_week: this week
-label_index_by_title: Index by title
-label_jump_to_a_project: Jump to a project...
-field_assignable: Issues can be assigned to this role
-label_sort_by: Sort by %s
-setting_issue_list_default_columns: Default columns displayed on the issue list
-text_issue_updated: Issue %s has been updated.
-notice_feeds_access_key_reseted: Your RSS access key was reseted.
-field_redirect_existing_links: Redirect existing links
-text_issue_category_reassign_to: Reassign issues to this category
-notice_email_sent: An email was sent to %s
-text_issue_added: Issue %s has been reported.
-field_comments: Comment
-label_file_plural: Files
-text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content ?
-notice_email_error: An error occurred while sending mail (%s)
-label_updated_time: Updated %s ago
-text_issue_category_destroy_assignments: Remove category assignments
-label_send_test_email: Send a test email
-button_reset: Reset
-label_added_time_by: Added by %s %s ago
-field_estimated_hours: Estimated time
-label_changeset_plural: Changesets
-setting_repositories_encodings: Repositories encodings
-notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit."
-label_bulk_edit_selected_issues: Bulk edit selected issues
-label_no_change_option: (No change)
-notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s."
-label_theme: Theme
-label_default: Default
-label_search_titles_only: Search titles only
-label_nobody: nobody
-button_change_password: Change password
-text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)."
-label_user_mail_option_selected: "For any event on the selected projects only..."
-label_user_mail_option_all: "For any event on all my projects"
-label_user_mail_option_none: "Only for things I watch or I'm involved in"
-setting_emails_footer: Emails footer
-label_float: Float
-button_copy: Copy
-mail_body_account_information_external: You can use your "%s" account to log into Redmine.
-mail_body_account_information: Your Redmine account information
-setting_protocol: Protocol
-label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
-setting_time_format: Time format
-label_registration_activation_by_email: account activation by email
-mail_subject_account_activation_request: Redmine account activation request
-mail_body_account_activation_request: 'A new user (%s) has registered. His account his pending your approval:'
-label_registration_automatic_activation: automatic account activation
-label_registration_manual_activation: manual account activation
-notice_account_pending: "Your account was created and is now pending administrator approval."
+label_index_by_date: Ãndice por fecha
+field_column_names: Columnas
+button_rename: Renombrar
+text_issue_category_destroy_question: Algunas peticiones (%d) están asignadas a esta categorÃa. ¿Qué desea hacer?
+label_feeds_access_key_created_on: Clave de acceso por RSS creada hace %s
+label_default_columns: Columnas por defecto
+setting_cross_project_issue_relations: Permitir relacionar peticiones de distintos proyectos
+label_roadmap_overdue: %s tarde
+label_module_plural: Módulos
+label_this_week: esta semana
+label_index_by_title: Ãndice por tÃtulo
+label_jump_to_a_project: Ir al proyecto...
+field_assignable: Se pueden asignar peticiones a este perfil
+label_sort_by: Ordenar por %s
+setting_issue_list_default_columns: Columnas por defecto para la lista de peticiones
+text_issue_updated: La petición %s ha sido actualizada por %s.
+notice_feeds_access_key_reseted: Su clave de acceso para RSS ha sido reiniciada
+field_redirect_existing_links: Redireccionar enlaces existentes
+text_issue_category_reassign_to: Reasignar las peticiones a la categorÃa
+notice_email_sent: Se ha enviado un correo a %s
+text_issue_added: Petición añadida por %s.
+field_comments: Comentario
+label_file_plural: Archivos
+text_wiki_destroy_confirmation: ¿Seguro que quiere borrar el wiki y todo su contenido?
+notice_email_error: Ha ocurrido un error mientras enviando el correo (%s)
+label_updated_time: Actualizado hace %s
+text_issue_category_destroy_assignments: Dejar las peticiones sin categorÃa
+label_send_test_email: Enviar un correo de prueba
+button_reset: Reestablecer
+label_added_time_by: Añadido por %s hace %s
+field_estimated_hours: Tiempo estimado
+label_changeset_plural: Cambios
+setting_repositories_encodings: Codificaciones del repositorio
+notice_no_issue_selected: "Ninguna petición seleccionada. Por favor, compruebe la petición que quiere modificar"
+label_bulk_edit_selected_issues: Editar las peticiones seleccionadas
+label_no_change_option: (Sin cambios)
+notice_failed_to_save_issues: "Imposible salvar %s peticion(es) en %d seleccionado: %s."
+label_theme: Tema
+label_default: Por defecto
+label_search_titles_only: Buscar sólo en tÃtulos
+label_nobody: nadie
+button_change_password: Cambiar contraseña
+text_user_mail_option: "En los proyectos no seleccionados, sólo recibirá notificaciones sobre elementos monitorizados o elementos en los que esté involucrado (por ejemplo, peticiones de las que usted sea autor o asignadas a usted)."
+label_user_mail_option_selected: "Para cualquier evento del proyecto seleccionado..."
+label_user_mail_option_all: "Para cualquier evento en todos mis proyectos"
+label_user_mail_option_none: "Sólo para elementos monitorizados o relacionados conmigo"
+setting_emails_footer: Pie de mensajes
+label_float: Flotante
+button_copy: Copiar
+mail_body_account_information_external: Puede usar su cuenta "%s" para conectarse.
+mail_body_account_information: Información sobre su cuenta
+setting_protocol: Protocolo
+text_caracters_minimum: %d carácteres como mÃnimo
+field_time_zone: Zona horaria
+label_registration_activation_by_email: activación de cuenta por correo
+label_user_mail_no_self_notified: "No quiero ser avisado de cambios hechos por mÃ"
+mail_subject_account_activation_request: Petición de activación de cuenta %s
+mail_body_account_activation_request: "Un nuevo usuario (%s) ha sido registrado. Esta cuenta está pendiende de aprobación"
+label_registration_automatic_activation: activación automática de cuenta
+label_registration_manual_activation: activación manual de cuenta
+notice_account_pending: "Su cuenta ha sido creada y está pendiende de la aprobación por parte de administrador"
+setting_time_format: Formato de hora
+setting_bcc_recipients: Ocultar las copias de carbon (bcc)
+button_annotate: Anotar
+label_issues_by: Peticiones por %s
+field_searchable: Incluir en las búsquedas
+label_display_per_page: 'Por página: %s'
+setting_per_page_options: Objetos por página
+label_age: Edad
+notice_default_data_loaded: Configuración por defecto cargada correctamente.
+text_load_default_configuration: Cargar la configuración por defecto
+text_no_configuration_data: "TodavÃa no se han configurado roles, ni trackers, ni estados y flujo de trabajo asociado a peticiones. Se recomiendo encarecidamente cargar la configuración por defecto. Una vez cargada, podrá modificarla."
+error_can_t_load_default_data: "No se ha podido cargar la configuración por defecto: %s"
+button_update: Actualizar
+label_change_properties: Cambiar propiedades
+label_general: General
+label_repository_plural: Repositorios
+label_associated_revisions: Revisiones asociadas
+setting_user_format: Formato de nombre de usuario
+text_status_changed_by_changeset: Aplicado en los cambios %s
+label_more: Más
+text_issues_destroy_confirmation: '¿Seguro que quiere borrar las peticiones seleccionadas?'
+label_scm: SCM
+text_select_project_modules: 'Seleccione los módulos a activar para este proyecto:'
+label_issue_added: Petición añadida
+label_issue_updated: Petición actualizada
+label_document_added: Documento añadido
+label_message_posted: Mensaje añadido
+label_file_added: Fichero añadido
+label_news_added: Noticia añadida
+project_module_boards: Foros
+project_module_issue_tracking: Peticiones
+project_module_wiki: Wiki
+project_module_files: Ficheros
+project_module_documents: Documentos
+project_module_repository: Repositorio
+project_module_news: Noticias
+project_module_time_tracking: Control de tiempo
+text_file_repository_writable: Se puede escribir en el repositorio
+text_default_administrator_account_changed: Cuenta de administrador por defecto modificada
+text_rmagick_available: RMagick disponible (opcional)
+button_configure: Configurar
+label_plugins: Plugins
+label_ldap_authentication: Autenticación LDAP
+label_downloads_abbr: D/L
+label_this_month: este mes
+label_last_n_days: últimos %d dÃas
+label_all_time: todo el tiempo
+label_this_year: este año
+label_date_range: Rango de fechas
+label_last_week: última semana
+label_yesterday: ayer
+label_last_month: último mes
+label_add_another_file: Añadir otro fichero
+label_optional_description: Descripción opcional
+text_destroy_time_entries_question: Existen %.02f horas asignadas a la petición que quiere borrar. ¿Qué quiere hacer ?
+error_issue_not_found_in_project: 'La petición no se encuentra o no está asociada a este proyecto'
+text_assign_time_entries_to_project: Asignar las horas al proyecto
+text_destroy_time_entries: Borrar las horas
+text_reassign_time_entries: 'Reasignar las horas a esta petición:'
+setting_activity_days_default: DÃas a mostrar en la actividad de proyecto
+label_chronological_order: En orden cronológico
+field_comments_sorting: Mostrar comentarios
+label_reverse_chronological_order: En orden cronológico inverso
+label_preferences: Preferencias
+setting_display_subprojects_issues: Mostrar peticiones de un subproyecto en el proyecto padre por defecto
+label_overall_activity: Actividad global
+setting_default_projects_public: Los proyectos nuevos son públicos por defecto
+error_scm_annotate: "No existe la entrada o no ha podido ser anotada"
+label_planning: Planificación
+text_subprojects_destroy_warning: 'Sus subprojectos: %s también se eliminarán'
+label_and_its_subprojects: %s and its subprojects
+mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
+mail_subject_reminder: "%d issue(s) due in the next days"
+text_user_wrote: '%s wrote:'
+label_duplicated_by: duplicated by
+setting_enabled_scm: Enabled SCM
+text_enumeration_category_reassign_to: 'Reassign them to this value:'
+text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
+text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/fi.yml b/lang/fi.yml
new file mode 100644
index 000000000..3ec7a6b50
--- /dev/null
+++ b/lang/fi.yml
@@ -0,0 +1,639 @@
+_gloc_rule_default: '|n| n==1 ? "" : "_plural" '
+
+actionview_datehelper_select_day_prefix:
+actionview_datehelper_select_month_names: Tammikuu,Helmikuu,Maaliskuu,Huhtikuu,Toukokuu,Kesäkuu,Heinäkuu,Elokuu,Syyskuu,Lokakuu,Marraskuu,Joulukuu
+actionview_datehelper_select_month_names_abbr: Tammi,Helmi,Maalis,Huhti,Touko,Kesä,Heinä,Elo,Syys,Loka,Marras,Joulu
+actionview_datehelper_select_month_prefix:
+actionview_datehelper_select_year_prefix:
+actionview_datehelper_time_in_words_day: 1 päivä
+actionview_datehelper_time_in_words_day_plural: %d päivää
+actionview_datehelper_time_in_words_hour_about: noin tunti
+actionview_datehelper_time_in_words_hour_about_plural: noin %d tuntia
+actionview_datehelper_time_in_words_hour_about_single: noin tunnin
+actionview_datehelper_time_in_words_minute: 1 minuutti
+actionview_datehelper_time_in_words_minute_half: puoli minuuttia
+actionview_datehelper_time_in_words_minute_less_than: vähemmän kuin minuuttia
+actionview_datehelper_time_in_words_minute_plural: %d minuuttia
+actionview_datehelper_time_in_words_minute_single: 1 minuutti
+actionview_datehelper_time_in_words_second_less_than: vähemmän kuin sekuntin
+actionview_datehelper_time_in_words_second_less_than_plural: vähemmän kuin %d sekuntia
+actionview_instancetag_blank_option: Valitse, ole hyvä
+
+activerecord_error_inclusion: ei ole listalla
+activerecord_error_exclusion: on varattu
+activerecord_error_invalid: ei ole kelpaava
+activerecord_error_confirmation: ei vastaa vahvistusta
+activerecord_error_accepted: tulee hyväksyä
+activerecord_error_empty: ei voi olla tyhjä
+activerecord_error_blank: ei voi olla tyhjä
+activerecord_error_too_long: on liian pitkä
+activerecord_error_too_short: on liian lyhyt
+activerecord_error_wrong_length: on väärän pituinen
+activerecord_error_taken: on jo varattu
+activerecord_error_not_a_number: ei ole numero
+activerecord_error_not_a_date: ei ole oikea päivä
+activerecord_error_greater_than_start_date: tulee olla aloituspäivän jälkeinen
+activerecord_error_not_same_project: ei kuulu samaan projektiin
+activerecord_error_circular_dependency: Tämä suhde loisi kehän.
+
+general_fmt_age: %d v.
+general_fmt_age_plural: %d vuotta
+general_fmt_date: %%d.%%m.%%Y
+general_fmt_datetime: %%d.%%m.%%Y %%I:%%M %%p
+general_fmt_datetime_short: %%b %%d, %%I:%%M %%p
+general_fmt_time: %%I:%%M %%p
+general_text_No: 'Ei'
+general_text_Yes: 'Kyllä'
+general_text_no: 'ei'
+general_text_yes: 'kyllä'
+general_lang_name: 'Finnish (Suomi)'
+general_csv_separator: ','
+general_csv_decimal_separator: '.'
+general_csv_encoding: ISO-8859-15
+general_pdf_encoding: ISO-8859-15
+general_day_names: Maanantai,Tiistai,Keskiviikko,Torstai,Perjantai,Lauantai,Sunnuntai
+general_first_day_of_week: '1'
+
+notice_account_updated: Tilin päivitys onnistui.
+notice_account_invalid_creditentials: Virheellinen käyttäjätunnus tai salasana
+notice_account_password_updated: Salasanan päivitys onnistui.
+notice_account_wrong_password: Väärä salasana
+notice_account_register_done: Tilin luonti onnistui. Aktivoidaksesi tilin seuraa linkkiä joka välitettiin sähköpostiisi.
+notice_account_unknown_email: Tuntematon käyttäjä.
+notice_can_t_change_password: Tämä tili käyttää ulkoista tunnistautumisjärjestelmää. Salasanaa ei voi muuttaa.
+notice_account_lost_email_sent: Sinulle on lähetetty sähköposti jossa on ohje kuinka vaihdat salasanasi.
+notice_account_activated: Tilisi on nyt aktivoitu, voit kirjautua sisälle.
+notice_successful_create: Luonti onnistui.
+notice_successful_update: Päivitys onnistui.
+notice_successful_delete: Poisto onnistui.
+notice_successful_connection: Yhteyden muodostus onnistui.
+notice_file_not_found: Hakemaasi sivua ei löytynyt tai se on poistettu.
+notice_locking_conflict: Toinen käyttäjä on päivittänyt tiedot.
+notice_not_authorized: Sinulla ei ole oikeutta näyttää tätä sivua.
+notice_email_sent: Sähköposti on lähetty osoitteeseen %s
+notice_email_error: Sähköpostilähetyksessä tapahtui virhe (%s)
+notice_feeds_access_key_reseted: RSS salasana on nollaantunut.
+notice_failed_to_save_issues: "%d Tapahtum(an/ien) tallennus epäonnistui %d valitut: %s."
+notice_no_issue_selected: "Tapahtumia ei ole valittu! Valitse tapahtumat joita haluat muokata."
+notice_account_pending: "Tilisi on luotu ja odottaa ylläpitäjän hyväksyntää."
+notice_default_data_loaded: Vakioasetusten palautus onnistui.
+
+error_can_t_load_default_data: "Vakioasetuksia ei voitu ladata: %s"
+error_scm_not_found: "Syötettä ja/tai versiota ei löydy tietovarastosta."
+error_scm_command_failed: "Tietovarastoon pääsyssä tapahtui virhe: %s"
+
+mail_subject_lost_password: Sinun %s salasanasi
+mail_body_lost_password: 'Vaihtaaksesi salasanasi, napsauta seuraavaa linkkiä:'
+mail_subject_register: %s tilin aktivointi
+mail_body_register: 'Aktivoidaksesi tilisi, napsauta seuraavaa linkkiä:'
+mail_body_account_information_external: Voit nyt käyttää "%s" tiliäsi kirjautuaksesi järjestelmään.
+mail_body_account_information: Sinun tilin tiedot
+mail_subject_account_activation_request: %s tilin aktivointi pyyntö
+mail_body_account_activation_request: 'Uusi käyttäjä (%s) on rekisteröitynyt. Hänen tili odottaa hyväksyntääsi:'
+
+gui_validation_error: 1 virhe
+gui_validation_error_plural: %d virhettä
+
+field_name: Nimi
+field_description: Kuvaus
+field_summary: Yhteenveto
+field_is_required: Vaaditaan
+field_firstname: Etunimi
+field_lastname: Sukunimi
+field_mail: Sähköposti
+field_filename: Tiedosto
+field_filesize: Koko
+field_downloads: Latausta
+field_author: Tekijä
+field_created_on: Luotu
+field_updated_on: Päivitetty
+field_field_format: Muoto
+field_is_for_all: Kaikille projekteille
+field_possible_values: Mahdolliset arvot
+field_regexp: Säännöllinen lauseke (reg exp)
+field_min_length: Minimipituus
+field_max_length: Maksimipituus
+field_value: Arvo
+field_category: Luokka
+field_title: Otsikko
+field_project: Projekti
+field_issue: Tapahtuma
+field_status: Tila
+field_notes: Muistiinpanot
+field_is_closed: Tapahtuma suljettu
+field_is_default: Vakioarvo
+field_tracker: Tapahtuma
+field_subject: Aihe
+field_due_date: Määräaika
+field_assigned_to: Nimetty
+field_priority: Prioriteetti
+field_fixed_version: Kohdeversio
+field_user: Käyttäjä
+field_role: Rooli
+field_homepage: Kotisivu
+field_is_public: Julkinen
+field_parent: Aliprojekti
+field_is_in_chlog: Tapahtumat näytetään muutoslokissa
+field_is_in_roadmap: Tapahtumat näytetään roadmap näkymässä
+field_login: Kirjautuminen
+field_mail_notification: Sähköposti muistutukset
+field_admin: Ylläpitäjä
+field_last_login_on: Viimeinen yhteys
+field_language: Kieli
+field_effective_date: Päivä
+field_password: Salasana
+field_new_password: Uusi salasana
+field_password_confirmation: Vahvistus
+field_version: Versio
+field_type: Tyyppi
+field_host: Verkko-osoite
+field_port: Portti
+field_account: Tili
+field_base_dn: Base DN
+field_attr_login: Kirjautumismääre
+field_attr_firstname: Etuminenmääre
+field_attr_lastname: Sukunimenmääre
+field_attr_mail: Sähköpostinmääre
+field_onthefly: Automaattinen käyttäjien luonti
+field_start_date: Alku
+field_done_ratio: %% Tehty
+field_auth_source: Varmennusmuoto
+field_hide_mail: Piiloita sähköpostiosoitteeni
+field_comments: Kommentti
+field_url: URL
+field_start_page: Aloitussivu
+field_subproject: Aliprojekti
+field_hours: Tuntia
+field_activity: Historia
+field_spent_on: Päivä
+field_identifier: Tunniste
+field_is_filter: Käytetään suodattimena
+field_issue_to_id: Liittyvä tapahtuma
+field_delay: Viive
+field_assignable: Tapahtumia voidaan nimetä tälle roolille
+field_redirect_existing_links: Uudelleenohjaa olemassa olevat linkit
+field_estimated_hours: Arvioitu aika
+field_column_names: Saraketta
+field_time_zone: Aikavyöhyke
+field_searchable: Haettava
+field_default_value: Vakioarvo
+
+setting_app_title: Ohjelman otsikko
+setting_app_subtitle: Ohjelman alaotsikko
+setting_welcome_text: Tervehdysteksti
+setting_default_language: Vakiokieli
+setting_login_required: Pakollinen kirjautuminen
+setting_self_registration: Itserekisteröinti
+setting_attachment_max_size: Liitteen maksimikoko
+setting_issues_export_limit: Tapahtumien vientirajoite
+setting_mail_from: Lähettäjän sähköpostiosoite
+setting_bcc_recipients: Vastaanottajat piilokopiona (bcc)
+setting_host_name: Verkko-osoite
+setting_text_formatting: Tekstin muotoilu
+setting_wiki_compression: Wiki historian pakkaus
+setting_feeds_limit: Syötteen sisällön raja
+setting_autofetch_changesets: Automaattisten muutosjoukkojen haku
+setting_sys_api_enabled: Salli WS tietovaraston hallintaan
+setting_commit_ref_keywords: Viittaavat hakusanat
+setting_commit_fix_keywords: Korjaavat hakusanat
+setting_autologin: Automaatinen kirjautuminen
+setting_date_format: Päivän muoto
+setting_time_format: Ajan muoto
+setting_cross_project_issue_relations: Salli projektien väliset tapahtuminen suhteet
+setting_issue_list_default_columns: Vakiosarakkeiden näyttö tapahtumalistauksessa
+setting_repositories_encodings: Tietovaraston koodaus
+setting_emails_footer: Sähköpostin alatunniste
+setting_protocol: Protokolla
+setting_per_page_options: Sivun objektien määrän asetukset
+
+label_user: Käyttäjä
+label_user_plural: Käyttäjät
+label_user_new: Uusi käyttäjä
+label_project: Projekti
+label_project_new: Uusi projekti
+label_project_plural: Projektit
+label_project_all: Kaikki projektit
+label_project_latest: Uusimmat projektit
+label_issue: Tapahtuma
+label_issue_new: Uusi tapahtuma
+label_issue_plural: Tapahtumat
+label_issue_view_all: Näytä kaikki tapahtumat
+label_issues_by: Tapahtumat %s
+label_document: Dokumentti
+label_document_new: Uusi dokumentti
+label_document_plural: Dokumentit
+label_role: Rooli
+label_role_plural: Roolit
+label_role_new: Uusi rooli
+label_role_and_permissions: Roolit ja oikeudet
+label_member: Jäsen
+label_member_new: Uusi jäsen
+label_member_plural: Jäsenet
+label_tracker: Tapahtuma
+label_tracker_plural: Tapahtumat
+label_tracker_new: Uusi tapahtuma
+label_workflow: Työnkulku
+label_issue_status: Tapahtuman tila
+label_issue_status_plural: Tapahtumien tilat
+label_issue_status_new: Uusi tila
+label_issue_category: Tapahtumaluokka
+label_issue_category_plural: Tapahtumaluokat
+label_issue_category_new: Uusi luokka
+label_custom_field: Räätälöity kenttä
+label_custom_field_plural: Räätälöidyt kentät
+label_custom_field_new: Uusi räätälöity kenttä
+label_enumerations: Lista
+label_enumeration_new: Uusi arvo
+label_information: Tieto
+label_information_plural: Tiedot
+label_please_login: Kirjaudu ole hyvä
+label_register: Rekisteröidy
+label_password_lost: Hukattu salasana
+label_home: Koti
+label_my_page: Omasivu
+label_my_account: Oma tili
+label_my_projects: Omat projektit
+label_administration: Ylläpito
+label_login: Kirjaudu sisään
+label_logout: Kirjaudu ulos
+label_help: Ohjeet
+label_reported_issues: Raportoidut tapahtumat
+label_assigned_to_me_issues: Minulle nimetyt tapahtumat
+label_last_login: Viimeinen yhteys
+label_last_updates: Viimeinen päivitys
+label_last_updates_plural: %d päivitetty viimeksi
+label_registered_on: Rekisteröity
+label_activity: Historia
+label_new: Uusi
+label_logged_as: Kirjauduttu nimellä
+label_environment: Ympäristö
+label_authentication: Varmennus
+label_auth_source: Varmennustapa
+label_auth_source_new: Uusi varmennustapa
+label_auth_source_plural: Varmennustavat
+label_subproject_plural: Aliprojektit
+label_min_max_length: Min - Max pituudet
+label_list: Lista
+label_date: Päivä
+label_integer: Kokonaisluku
+label_float: Liukuluku
+label_boolean: Totuusarvomuuttuja
+label_string: Merkkijono
+label_text: Pitkä merkkijono
+label_attribute: Määre
+label_attribute_plural: Määreet
+label_download: %d Lataus
+label_download_plural: %d Lataukset
+label_no_data: Ei tietoa näytettäväksi
+label_change_status: Muutos tila
+label_history: Historia
+label_attachment: Tiedosto
+label_attachment_new: Uusi tiedosto
+label_attachment_delete: Poista tiedosto
+label_attachment_plural: Tiedostot
+label_report: Raportti
+label_report_plural: Raportit
+label_news: Uutinen
+label_news_new: Lisää uutinen
+label_news_plural: Uutiset
+label_news_latest: Viimeisimmät uutiset
+label_news_view_all: Näytä kaikki uutiset
+label_change_log: Muutosloki
+label_settings: Asetukset
+label_overview: Yleiskatsaus
+label_version: Versio
+label_version_new: Uusi versio
+label_version_plural: Versiot
+label_confirmation: Vahvistus
+label_export_to: Vie
+label_read: Lukee...
+label_public_projects: Julkiset projektit
+label_open_issues: avoin, yhteensä
+label_open_issues_plural: avointa, yhteensä
+label_closed_issues: suljettu
+label_closed_issues_plural: suljettua
+label_total: Yhteensä
+label_permissions: Oikeudet
+label_current_status: Nykyinen tila
+label_new_statuses_allowed: Uudet tilat sallittu
+label_all: kaikki
+label_none: ei mitään
+label_nobody: ei kukaan
+label_next: Seuraava
+label_previous: Edellinen
+label_used_by: Käytetty
+label_details: Yksityiskohdat
+label_add_note: Lisää muistiinpano
+label_per_page: Per sivu
+label_calendar: Kalenteri
+label_months_from: kuukauden päässä
+label_gantt: Gantt
+label_internal: Sisäinen
+label_last_changes: viimeiset %d muutokset
+label_change_view_all: Näytä kaikki muutokset
+label_personalize_page: Personoi tämä sivu
+label_comment: Kommentti
+label_comment_plural: Kommentit
+label_comment_add: Lisää kommentti
+label_comment_added: Kommentti lisätty
+label_comment_delete: Poista kommentti
+label_query: Räätälöity haku
+label_query_plural: Räätälöidyt haut
+label_query_new: Uusi haku
+label_filter_add: Lisää suodatin
+label_filter_plural: Suodattimet
+label_equals: sama kuin
+label_not_equals: eri kuin
+label_in_less_than: pienempi kuin
+label_in_more_than: suurempi kuin
+label_today: tänään
+label_this_week: tällä viikolla
+label_less_than_ago: vähemmän kuin päivää sitten
+label_more_than_ago: enemän kuin päivää sitten
+label_ago: päiviä sitten
+label_contains: sisältää
+label_not_contains: ei sisällä
+label_day_plural: päivää
+label_repository: Tietovarasto
+label_repository_plural: Tietovarastot
+label_browse: Selaus
+label_modification: %d muutos
+label_modification_plural: %d muutettu
+label_revision: Versio
+label_revision_plural: Versiot
+label_added: lisätty
+label_modified: muokattu
+label_deleted: poistettu
+label_latest_revision: Viimeisin versio
+label_latest_revision_plural: Viimeisimmät versiot
+label_view_revisions: Näytä versiot
+label_max_size: Suurin koko
+label_sort_highest: Siirrä ylimmäiseksi
+label_sort_higher: Siirrä ylös
+label_sort_lower: Siirrä alas
+label_sort_lowest: Siirrä alimmaiseksi
+label_roadmap: Roadmap
+label_roadmap_due_in: Määräaika
+label_roadmap_overdue: %s myöhässä
+label_roadmap_no_issues: Ei tapahtumia tälle versiolle
+label_search: Haku
+label_result_plural: Tulokset
+label_all_words: kaikki sanat
+label_wiki: Wiki
+label_wiki_edit: Wiki muokkaus
+label_wiki_edit_plural: Wiki muokkaukset
+label_wiki_page: Wiki sivu
+label_wiki_page_plural: Wiki sivut
+label_index_by_title: Hakemisto otsikoittain
+label_index_by_date: Hakemisto päivittäin
+label_current_version: Nykyinen versio
+label_preview: Esikatselu
+label_feed_plural: Syötteet
+label_changes_details: Kaikkien muutosten yksityiskohdat
+label_issue_tracking: Tapahtumien seuranta
+label_spent_time: Käytetty aika
+label_f_hour: %.2f tunti
+label_f_hour_plural: %.2f tuntia
+label_time_tracking: Ajan seuranta
+label_change_plural: Muutokset
+label_statistics: Tilastot
+label_commits_per_month: Tapahtumaa per kuukausi
+label_commits_per_author: Tapahtumaa per tekijä
+label_view_diff: Näytä erot
+label_diff_inline: sisällössä
+label_diff_side_by_side: vierekkäin
+label_options: Valinnat
+label_copy_workflow_from: Kopioi työnkulku
+label_permissions_report: Oikeuksien raportti
+label_watched_issues: Seurattavat tapahtumat
+label_related_issues: Liittyvät tapahtumat
+label_applied_status: Lisätty tila
+label_loading: Lataa...
+label_relation_new: Uusi suhde
+label_relation_delete: Poista suhde
+label_relates_to: liittyy
+label_duplicates: kopio
+label_blocks: estää
+label_blocked_by: estetty
+label_precedes: edeltää
+label_follows: seuraa
+label_end_to_start: lopusta alkuun
+label_end_to_end: lopusta loppuun
+label_start_to_start: alusta alkuun
+label_start_to_end: alusta loppuun
+label_stay_logged_in: Pysy kirjautuneena
+label_disabled: poistettu käytöstä
+label_show_completed_versions: Näytä valmiit versiot
+label_me: minä
+label_board: Keskustelupalsta
+label_board_new: Uusi keskustelupalsta
+label_board_plural: Keskustelupalstat
+label_topic_plural: Aiheet
+label_message_plural: Viestit
+label_message_last: Viimeisin viesti
+label_message_new: Uusi viesti
+label_reply_plural: Vastaukset
+label_send_information: Lähetä tilin tiedot käyttäjälle
+label_year: Vuosi
+label_month: Kuukausi
+label_week: Viikko
+label_language_based: Pohjautuen käyttäjän kieleen
+label_sort_by: Lajittele %s
+label_send_test_email: Lähetä testi sähköposti
+label_feeds_access_key_created_on: RSS salasana luotiin %s sitten
+label_module_plural: Moduulit
+label_added_time_by: Lisännyt %s %s sitten
+label_updated_time: Päivitetty %s sitten
+label_jump_to_a_project: Siirry projektiin...
+label_file_plural: Tiedostot
+label_changeset_plural: Muutosryhmät
+label_default_columns: Vakiosarakkeet
+label_no_change_option: (Ei muutosta)
+label_bulk_edit_selected_issues: Perusmuotoile valitut tapahtumat
+label_theme: Teema
+label_default: Vakio
+label_search_titles_only: Hae vain otsikot
+label_user_mail_option_all: "Kaikista tapahtumista kaikissa projekteistani"
+label_user_mail_option_selected: "Kaikista tapahtumista vain valitsemistani projekteista..."
+label_user_mail_option_none: "Vain tapahtumista joita valvon tai olen mukana"
+label_user_mail_no_self_notified: "En halua muistutusta muutoksista joita itse teen"
+label_registration_activation_by_email: tilin aktivointi sähköpostitse
+label_registration_manual_activation: tilin aktivointi käsin
+label_registration_automatic_activation: tilin aktivointi automaattisesti
+label_display_per_page: 'Per sivu: %s'
+label_age: Ikä
+label_change_properties: Vaihda asetuksia
+label_general: Yleinen
+
+button_login: Kirjaudu
+button_submit: Lähetä
+button_save: Tallenna
+button_check_all: Valitse kaikki
+button_uncheck_all: Poista valinnat
+button_delete: Poista
+button_create: Luo
+button_test: Testaa
+button_edit: Muokkaa
+button_add: Lisää
+button_change: Muuta
+button_apply: Ota käyttöön
+button_clear: Tyhjää
+button_lock: Lukitse
+button_unlock: Vapauta
+button_download: Lataa
+button_list: Lista
+button_view: Näytä
+button_move: Siirrä
+button_back: Takaisin
+button_cancel: Peruuta
+button_activate: Aktivoi
+button_sort: Järjestä
+button_log_time: Seuraa aikaa
+button_rollback: Siirry takaisin tähän versioon
+button_watch: Seuraa
+button_unwatch: Älä seuraa
+button_reply: Vastaa
+button_archive: Arkistoi
+button_unarchive: Palauta
+button_reset: Nollaus
+button_rename: Uudelleen nimeä
+button_change_password: Vaihda salasana
+button_copy: Kopioi
+button_annotate: Lisää selitys
+button_update: Päivitä
+
+status_active: aktiivinen
+status_registered: rekisteröity
+status_locked: lukittu
+
+text_select_mail_notifications: Valitse tapahtumat joista tulisi lähettää sähköpostimuistutus.
+text_regexp_info: esim. ^[A-Z0-9]+$
+text_min_max_length_info: 0 tarkoittaa, ei rajoitusta
+text_project_destroy_confirmation: Oletko varma että haluat poistaa tämän projektin ja kaikki siihen kuuluvat tiedot?
+text_workflow_edit: Valitse rooli ja tapahtuma muokataksesi työnkulkua
+text_are_you_sure: Oletko varma?
+text_journal_changed: %s muutettu arvoksi %s
+text_journal_set_to: muutettu %s
+text_journal_deleted: poistettu
+text_tip_task_begin_day: tehtävä joka alkaa tänä päivänä
+text_tip_task_end_day: tehtävä joka loppuu tänä päivänä
+text_tip_task_begin_end_day: tehtävä joka alkaa ja loppuu tänä päivänä
+text_project_identifier_info: 'Pienet kirjaimet (a-z), numerot ja viivat ovat sallittu. Tallentamisen jälkeen tunnistetta ei voi muuttaa.'
+text_caracters_maximum: %d merkkiä enintään.
+text_caracters_minimum: Täytyy olla vähintään %d merkkiä pitkä.
+text_length_between: Pituus välillä %d ja %d merkkiä.
+text_tracker_no_workflow: Työnkulkua ei määritelty tälle tapahtumalle
+text_unallowed_characters: Kiellettyjä merkkejä
+text_comma_separated: Useat arvot sallittu (pilkku eroteltuna).
+text_issues_ref_in_commit_messages: Liitän ja korjaan ongelmia syötetyssä viestissä
+text_issue_added: Tapahtuma %s on kirjattu.
+text_issue_updated: Tapahtuma %s on päivitetty.
+text_wiki_destroy_confirmation: Oletko varma että haluat poistaa tämän wiki:n ja kaikki sen sisältämän tiedon?
+text_issue_category_destroy_question: Jotkut tapahtumat (%d) ovat nimetty tälle luokalle. Mitä haluat tehdä?
+text_issue_category_destroy_assignments: Poista luokan tehtävät
+text_issue_category_reassign_to: Vaihda tapahtuma tähän luokkaan
+text_user_mail_option: "Valitsemattomille projekteille, saat vain muistutuksen asioista joita seuraat tai olet mukana (esim. tapahtumat joissa olet tekijä tai nimettynä)."
+text_no_configuration_data: "Rooleja, tapahtumien tiloja ja työnkulkua ei vielä olla määritelty.\nOn erittäin suotavaa ladata vakioasetukset. Voit muuttaa sitä latauksen jälkeen."
+text_load_default_configuration: Lataa vakioasetukset
+
+default_role_manager: Päälikkö
+default_role_developper: Kehittäjä
+default_role_reporter: Tarkastelija
+default_tracker_bug: Ohjelmointivirhe
+default_tracker_feature: Ominaisuus
+default_tracker_support: Tuki
+default_issue_status_new: Uusi
+default_issue_status_assigned: Nimetty
+default_issue_status_resolved: Hyväksytty
+default_issue_status_feedback: Palaute
+default_issue_status_closed: Suljettu
+default_issue_status_rejected: Hylätty
+default_doc_category_user: Käyttäjä dokumentaatio
+default_doc_category_tech: Tekninen dokumentaatio
+default_priority_low: Matala
+default_priority_normal: Normaali
+default_priority_high: Korkea
+default_priority_urgent: Kiireellinen
+default_priority_immediate: Valitön
+default_activity_design: Suunnittelu
+default_activity_development: Kehitys
+
+enumeration_issue_priorities: Tapahtuman tärkeysjärjestys
+enumeration_doc_categories: Dokumentin luokat
+enumeration_activities: Historia (ajan seuranta)
+label_associated_revisions: Liittyvät versiot
+setting_user_format: Käyttäjien esitysmuoto
+text_status_changed_by_changeset: Päivitetty muutosversioon %s.
+text_issues_destroy_confirmation: 'Oletko varma että haluat poistaa valitut tapahtumat ?'
+label_more: Lisää
+label_issue_added: Tapahtuma lisätty
+label_issue_updated: Tapahtuma päivitetty
+label_document_added: Dokumentti lisätty
+label_message_posted: Viesti lisätty
+label_file_added: Tiedosto lisätty
+label_scm: SCM
+text_select_project_modules: 'Valitse modulit jotka haluat käyttöön tähän projektiin:'
+label_news_added: Uutinen lisätty
+project_module_boards: Keskustelupalsta
+project_module_issue_tracking: Tapahtuman seuranta
+project_module_wiki: Wiki
+project_module_files: Tiedostot
+project_module_documents: Dokumentit
+project_module_repository: Tietovarasto
+project_module_news: Uutiset
+project_module_time_tracking: Ajan seuranta
+text_file_repository_writable: Kirjoitettava tiedostovarasto
+text_default_administrator_account_changed: Vakio hallinoijan tunnus muutettu
+text_rmagick_available: RMagick saatavilla (valinnainen)
+button_configure: Asetukset
+label_plugins: Lisäosat
+label_ldap_authentication: LDAP tunnistautuminen
+label_downloads_abbr: D/L
+label_add_another_file: Lisää uusi tiedosto
+label_this_month: tässä kuussa
+text_destroy_time_entries_question: %.02f tuntia on raportoitu tapahtumasta jonka aiot poistaa. Mitä haluat tehdä ?
+label_last_n_days: viimeiset %d päivää
+label_all_time: koko ajalta
+error_issue_not_found_in_project: 'Tapahtumaa ei löytynyt tai se ei kuulu tähän projektiin'
+label_this_year: tänä vuonna
+text_assign_time_entries_to_project: Määritä tunnit projektille
+label_date_range: Aikaväli
+label_last_week: viime viikolla
+label_yesterday: eilen
+label_optional_description: Lisäkuvaus
+label_last_month: viime kuussa
+text_destroy_time_entries: Poista raportoidut tunnit
+text_reassign_time_entries: 'Siirrä raportoidut tunnit tälle tapahtumalle:'
+label_on: ''
+label_chronological_order: Aikajärjestyksessä
+label_date_to: ''
+setting_activity_days_default: Päivien esittäminen projektien historiassa
+label_date_from: ''
+label_in: ''
+setting_display_subprojects_issues: Näytä aliprojektien tapahtumat pääprojektissa oletusarvoisesti
+field_comments_sorting: Näytä kommentit
+label_reverse_chronological_order: Käänteisessä aikajärjestyksessä
+label_preferences: Asetukset
+setting_default_projects_public: Uudet projektit ovat oletuksena julkisia
+label_overall_activity: Kokonaishistoria
+error_scm_annotate: "Merkintää ei ole tai siihen ei voi lisätä selityksiä."
+label_planning: Suunnittelu
+text_subprojects_destroy_warning: 'Tämän aliprojekti(t): %s tullaan myös poistamaan.'
+label_and_its_subprojects: %s ja aliprojektit
+mail_body_reminder: "%d sinulle nimettyä tapahtuma(a) erääntyy %d päivä sisään:"
+mail_subject_reminder: "%d tapahtuma(a) erääntyy lähipäivinä"
+text_user_wrote: '%s kirjoitti:'
+label_duplicated_by: kopioinut
+setting_enabled_scm: Versionhallinta käytettävissä
+text_enumeration_category_reassign_to: 'Siirrä täksi arvoksi:'
+text_enumeration_destroy_question: '%d kohdetta on sijoitettu tälle arvolle.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
+text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/fr.yml b/lang/fr.yml
index 8e1af9a4f..f40a3f3d1 100644
--- a/lang/fr.yml
+++ b/lang/fr.yml
@@ -48,6 +48,7 @@ general_text_no: 'non'
general_text_yes: 'oui'
general_lang_name: 'Français'
general_csv_separator: ';'
+general_csv_decimal_separator: ','
general_csv_encoding: ISO-8859-1
general_pdf_encoding: ISO-8859-1
general_day_names: Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi,Dimanche
@@ -68,23 +69,31 @@ notice_successful_delete: Suppression effectuée avec succès.
notice_successful_connection: Connection réussie.
notice_file_not_found: "La page à laquelle vous souhaitez accéder n'existe pas ou a été supprimée."
notice_locking_conflict: Les données ont été mises à jour par un autre utilisateur. Mise à jour impossible.
-notice_scm_error: "L'entrée et/ou la révision demandée n'existe pas dans le dépôt."
notice_not_authorized: "Vous n'êtes pas autorisés à accéder à cette page."
notice_email_sent: "Un email a été envoyé à %s"
notice_email_error: "Erreur lors de l'envoi de l'email (%s)"
-notice_feeds_access_key_reseted: Votre clé d'accès aux flux RSS a été réinitialisée.
+notice_feeds_access_key_reseted: "Votre clé d'accès aux flux RSS a été réinitialisée."
notice_failed_to_save_issues: "%d demande(s) sur les %d sélectionnées n'ont pas pu être mise(s) à jour: %s."
notice_no_issue_selected: "Aucune demande sélectionnée ! Cochez les demandes que vous voulez mettre à jour."
notice_account_pending: "Votre compte a été créé et attend l'approbation de l'administrateur."
+notice_default_data_loaded: Paramétrage par défaut chargé avec succès.
-mail_subject_lost_password: Votre mot de passe redMine
-mail_body_lost_password: 'Pour changer votre mot de passe Redmine, cliquez sur le lien suivant:'
-mail_subject_register: Activation de votre compte redMine
-mail_body_register: 'Pour activer votre compte Redmine, cliquez sur le lien suivant:'
-mail_body_account_information_external: Vous pouvez utiliser votre compte "%s" pour vous connecter à Redmine.
-mail_body_account_information: Paramètres de connexion de votre compte Redmine
-mail_subject_account_activation_request: "Demande d'activation d'un compte Redmine"
+error_can_t_load_default_data: "Une erreur s'est produite lors du chargement du paramétrage: %s"
+error_scm_not_found: "L'entrée et/ou la révision demandée n'existe pas dans le dépôt."
+error_scm_command_failed: "Une erreur s'est produite lors de l'accès au dépôt: %s"
+error_scm_annotate: "L'entrée n'existe pas ou ne peut pas être annotée."
+error_issue_not_found_in_project: "La demande n'existe pas ou n'appartient pas à ce projet"
+
+mail_subject_lost_password: Votre mot de passe %s
+mail_body_lost_password: 'Pour changer votre mot de passe, cliquez sur le lien suivant:'
+mail_subject_register: Activation de votre compte %s
+mail_body_register: 'Pour activer votre compte, cliquez sur le lien suivant:'
+mail_body_account_information_external: Vous pouvez utiliser votre compte "%s" pour vous connecter.
+mail_body_account_information: Paramètres de connexion de votre compte
+mail_subject_account_activation_request: "Demande d'activation d'un compte %s"
mail_body_account_activation_request: "Un nouvel utilisateur (%s) s'est inscrit. Son compte nécessite votre approbation:"
+mail_subject_reminder: "%d demande(s) arrivent à échéance"
+mail_body_reminder: "%d demande(s) qui vous sont assignées arrivent à échéance dans les %d prochains jours:"
gui_validation_error: 1 erreur
gui_validation_error_plural: %d erreurs
@@ -122,7 +131,7 @@ field_subject: Sujet
field_due_date: Date d'échéance
field_assigned_to: Assigné Ã
field_priority: Priorité
-field_fixed_version: Version corrigée
+field_fixed_version: Version cible
field_user: Utilisateur
field_role: Rôle
field_homepage: Site web
@@ -160,6 +169,7 @@ field_start_page: Page de démarrage
field_subproject: Sous-projet
field_hours: Heures
field_activity: Activité
+label_overall_activity: Activité globale
field_spent_on: Date
field_identifier: Identifiant
field_is_filter: Utilisé comme filtre
@@ -169,6 +179,11 @@ field_assignable: Demandes assignables à ce rôle
field_redirect_existing_links: Rediriger les liens existants
field_estimated_hours: Temps estimé
field_column_names: Colonnes
+field_time_zone: Fuseau horaire
+field_searchable: Utilisé pour les recherches
+field_default_value: Valeur par défaut
+field_comments_sorting: Afficher les commentaires
+field_parent_title: Page parent
setting_app_title: Titre de l'application
setting_app_subtitle: Sous-titre de l'application
@@ -179,10 +194,12 @@ setting_self_registration: Inscription des nouveaux utilisateurs
setting_attachment_max_size: Taille max des fichiers
setting_issues_export_limit: Limite export demandes
setting_mail_from: Adresse d'émission
+setting_bcc_recipients: Destinataires en copie cachée (cci)
setting_host_name: Nom d'hôte
setting_text_formatting: Formatage du texte
setting_wiki_compression: Compression historique wiki
setting_feeds_limit: Limite du contenu des flux RSS
+setting_default_projects_public: Définir les nouveaux projects comme publics par défaut
setting_autofetch_changesets: Récupération auto. des commits
setting_sys_api_enabled: Activer les WS pour la gestion des dépôts
setting_commit_ref_keywords: Mot-clés de référencement
@@ -193,8 +210,26 @@ setting_time_format: Format d'heure
setting_cross_project_issue_relations: Autoriser les relations entre demandes de différents projets
setting_issue_list_default_columns: Colonnes affichées par défaut sur la liste des demandes
setting_repositories_encodings: Encodages des dépôts
+setting_commit_logs_encoding: Encodage des messages de commit
setting_emails_footer: Pied-de-page des emails
setting_protocol: Protocole
+setting_per_page_options: Options d'objets affichés par page
+setting_user_format: Format d'affichage des utilisateurs
+setting_activity_days_default: Nombre de jours affichés sur l'activité des projets
+setting_display_subprojects_issues: Afficher par défaut les demandes des sous-projets sur les projets principaux
+setting_enabled_scm: SCM activés
+setting_mail_handler_api_enabled: "Activer le WS pour la réception d'emails"
+setting_mail_handler_api_key: Clé de protection de l'API
+setting_sequential_project_identifiers: Générer des identifiants de projet séquentiels
+
+project_module_issue_tracking: Suivi des demandes
+project_module_time_tracking: Suivi du temps passé
+project_module_news: Publication d'annonces
+project_module_documents: Publication de documents
+project_module_files: Publication de fichiers
+project_module_wiki: Wiki
+project_module_repository: Dépôt de sources
+project_module_boards: Forums de discussion
label_user: Utilisateur
label_user_plural: Utilisateurs
@@ -208,9 +243,13 @@ label_issue: Demande
label_issue_new: Nouvelle demande
label_issue_plural: Demandes
label_issue_view_all: Voir toutes les demandes
+label_issue_added: Demande ajoutée
+label_issue_updated: Demande mise à jour
+label_issues_by: Demandes par %s
label_document: Document
label_document_new: Nouveau document
label_document_plural: Documents
+label_document_added: Document ajouté
label_role: Rôle
label_role_plural: Rôles
label_role_new: Nouveau rôle
@@ -261,6 +300,7 @@ label_auth_source: Mode d'authentification
label_auth_source_new: Nouveau mode d'authentification
label_auth_source_plural: Modes d'authentification
label_subproject_plural: Sous-projets
+label_and_its_subprojects: %s et ses sous-projets
label_min_max_length: Longueurs mini - maxi
label_list: Liste
label_date: Date
@@ -280,6 +320,7 @@ label_attachment: Fichier
label_attachment_new: Nouveau fichier
label_attachment_delete: Supprimer le fichier
label_attachment_plural: Fichiers
+label_file_added: Fichier ajouté
label_report: Rapport
label_report_plural: Rapports
label_news: Annonce
@@ -287,6 +328,7 @@ label_news_new: Nouvelle annonce
label_news_plural: Annonces
label_news_latest: Dernières annonces
label_news_view_all: Voir toutes les annonces
+label_news_added: Annonce ajoutée
label_change_log: Historique
label_settings: Configuration
label_overview: Aperçu
@@ -294,7 +336,7 @@ label_version: Version
label_version_new: Nouvelle version
label_version_plural: Versions
label_confirmation: Confirmation
-label_export_to: Exporter en
+label_export_to: 'Formats disponibles:'
label_read: Lire...
label_public_projects: Projets publics
label_open_issues: ouvert
@@ -337,7 +379,15 @@ label_in_less_than: dans moins de
label_in_more_than: dans plus de
label_in: dans
label_today: aujourd'hui
+label_all_time: toute la période
+label_yesterday: hier
label_this_week: cette semaine
+label_last_week: la semaine dernière
+label_last_n_days: les %d derniers jours
+label_this_month: ce mois-ci
+label_last_month: le mois dernier
+label_this_year: cette année
+label_date_range: Période
label_less_than_ago: il y a moins de
label_more_than_ago: il y a plus de
label_ago: il y a
@@ -345,11 +395,13 @@ label_contains: contient
label_not_contains: ne contient pas
label_day_plural: jours
label_repository: Dépôt
+label_repository_plural: Dépôts
label_browse: Parcourir
label_modification: %d modification
label_modification_plural: %d modifications
label_revision: Révision
label_revision_plural: Révisions
+label_associated_revisions: Révisions associées
label_added: ajouté
label_modified: modifié
label_deleted: supprimé
@@ -402,7 +454,8 @@ label_loading: Chargement...
label_relation_new: Nouvelle relation
label_relation_delete: Supprimer la relation
label_relates_to: lié Ã
-label_duplicates: doublon de
+label_duplicates: duplique
+label_duplicated_by: dupliqué par
label_blocks: bloque
label_blocked_by: bloqué par
label_precedes: précède
@@ -413,7 +466,7 @@ label_start_to_start: début à début
label_start_to_end: début à fin
label_stay_logged_in: Rester connecté
label_disabled: désactivé
-label_show_completed_versions: Voire les versions passées
+label_show_completed_versions: Voir les versions passées
label_me: moi
label_board: Forum
label_board_new: Nouveau forum
@@ -422,6 +475,7 @@ label_topic_plural: Discussions
label_message_plural: Messages
label_message_last: Dernier message
label_message_new: Nouveau message
+label_message_posted: Message ajouté
label_reply_plural: Réponses
label_send_information: Envoyer les informations à l'utilisateur
label_year: Année
@@ -452,6 +506,24 @@ label_user_mail_no_self_notified: "Je ne veux pas être notifié des changements
label_registration_activation_by_email: activation du compte par email
label_registration_manual_activation: activation manuelle du compte
label_registration_automatic_activation: activation automatique du compte
+label_display_per_page: 'Par page: %s'
+label_age: Age
+label_change_properties: Changer les propriétés
+label_general: Général
+label_more: Plus
+label_scm: SCM
+label_plugins: Plugins
+label_ldap_authentication: Authentification LDAP
+label_downloads_abbr: D/L
+label_optional_description: Description facultative
+label_add_another_file: Ajouter un autre fichier
+label_preferences: Préférences
+label_chronological_order: Dans l'ordre chronologique
+label_reverse_chronological_order: Dans l'ordre chronologique inverse
+label_planning: Planning
+label_incoming_emails: Emails entrants
+label_generate_key: Générer une clé
+label_issue_watchers: Utilisateurs surveillant cette demande
button_login: Connexion
button_submit: Soumettre
@@ -487,15 +559,20 @@ button_reset: Réinitialiser
button_rename: Renommer
button_change_password: Changer de mot de passe
button_copy: Copier
+button_annotate: Annoter
+button_update: Mettre à jour
+button_configure: Configurer
+button_quote: Citer
status_active: actif
status_registered: enregistré
status_locked: vérouillé
-text_select_mail_notifications: Sélectionner les actions pour lesquelles la notification par mail doit être activée.
+text_select_mail_notifications: Actions pour lesquelles une notification par e-mail est envoyée
text_regexp_info: ex. ^[A-Z0-9]+$
text_min_max_length_info: 0 pour aucune restriction
-text_project_destroy_confirmation: Etes-vous sûr de vouloir supprimer ce projet et tout ce qui lui est rattaché ?
+text_project_destroy_confirmation: Etes-vous sûr de vouloir supprimer ce projet et toutes ses données ?
+text_subprojects_destroy_warning: 'Ses sous-projets: %s seront également supprimés.'
text_workflow_edit: Sélectionner un tracker et un rôle pour éditer le workflow
text_are_you_sure: Etes-vous sûr ?
text_journal_changed: changé de %s à %s
@@ -504,20 +581,37 @@ text_journal_deleted: supprimé
text_tip_task_begin_day: tâche commençant ce jour
text_tip_task_end_day: tâche finissant ce jour
text_tip_task_begin_end_day: tâche commençant et finissant ce jour
-text_project_identifier_info: 'Lettres minuscules (a-z), chiffres et tirets autorisés. Un fois sauvegardé, l''identifiant ne pourra plus être modifié.'
+text_project_identifier_info: 'Seuls les lettres minuscules (a-z), chiffres et tirets sont autorisés. Un fois sauvegardé, l''identifiant ne pourra plus être modifié.'
text_caracters_maximum: %d caractères maximum.
+text_caracters_minimum: %d caractères minimum.
text_length_between: Longueur comprise entre %d et %d caractères.
text_tracker_no_workflow: Aucun worflow n'est défini pour ce tracker
text_unallowed_characters: Caractères non autorisés
text_comma_separated: Plusieurs valeurs possibles (séparées par des virgules).
text_issues_ref_in_commit_messages: Référencement et résolution des demandes dans les commentaires de commits
-text_issue_added: La demande %s a été soumise.
-text_issue_updated: La demande %s a été mise à jour.
+text_issue_added: La demande %s a été soumise par %s.
+text_issue_updated: La demande %s a été mise à jour par %s.
text_wiki_destroy_confirmation: Etes-vous sûr de vouloir supprimer ce wiki et tout son contenu ?
-text_issue_category_destroy_question: Des demandes (%d) sont affectées à cette catégories. Que voulez-vous faire ?
+text_issue_category_destroy_question: %d demandes sont affectées à cette catégories. Que voulez-vous faire ?
text_issue_category_destroy_assignments: N'affecter les demandes à aucune autre catégorie
text_issue_category_reassign_to: Réaffecter les demandes à cette catégorie
text_user_mail_option: "Pour les projets non sélectionnés, vous recevrez seulement des notifications pour ce que vous surveillez ou à quoi vous participez (exemple: demandes dont vous êtes l'auteur ou la personne assignée)."
+text_no_configuration_data: "Les rôles, trackers, statuts et le workflow ne sont pas encore paramétrés.\nIl est vivement recommandé de charger le paramétrage par defaut. Vous pourrez le modifier une fois chargé."
+text_load_default_configuration: Charger le paramétrage par défaut
+text_status_changed_by_changeset: Appliqué par commit %s.
+text_issues_destroy_confirmation: 'Etes-vous sûr de vouloir supprimer le(s) demandes(s) selectionnée(s) ?'
+text_select_project_modules: 'Selectionner les modules à activer pour ce project:'
+text_default_administrator_account_changed: Compte administrateur par défaut changé
+text_file_repository_writable: Répertoire de stockage des fichiers accessible en écriture
+text_rmagick_available: Bibliothèque RMagick présente (optionnelle)
+text_destroy_time_entries_question: %.02f heures ont été enregistrées sur les demandes à supprimer. Que voulez-vous faire ?
+text_destroy_time_entries: Supprimer les heures
+text_assign_time_entries_to_project: Reporter les heures sur le projet
+text_reassign_time_entries: 'Reporter les heures sur cette demande:'
+text_user_wrote: '%s a écrit:'
+text_enumeration_destroy_question: 'Cette valeur est affectée à %d objets.'
+text_enumeration_category_reassign_to: 'Réaffecter les objets à cette valeur:'
+text_email_delivery_not_configured: "L'envoi de mail n'est pas configuré, les notifications sont désactivées.\nConfigurez votre serveur SMTP dans config/email.yml et redémarrez l'application pour les activer."
default_role_manager: Manager
default_role_developper: Développeur
diff --git a/lang/he.yml b/lang/he.yml
index 26e808e00..e89e65c61 100644
--- a/lang/he.yml
+++ b/lang/he.yml
@@ -48,6 +48,7 @@ general_text_no: 'ל×'
general_text_yes: 'כן'
general_lang_name: 'Hebrew (עברית)'
general_csv_separator: ','
+general_csv_decimal_separator: '.'
general_csv_encoding: ISO-8859-8-I
general_pdf_encoding: ISO-8859-8-I
general_day_names: ×©× ×™,שלישי,רביעי,חמישי,שישי,שבת,ר×שון
@@ -68,7 +69,6 @@ notice_successful_delete: מחיקה מוצלחת.
notice_successful_connection: חיבור מוצלח.
notice_file_not_found: הדף ש×ת\×” ×ž× ×¡×” לגשת ×ליו ××™× ×• ×§×™×™× ×ו שהוסר.
notice_locking_conflict: המידע עודכן על ידי משתמש ×חר.
-notice_scm_error: ×›× ×™×¡×” ו\×ו ×’×™×¨×¡× ××™× × ×§×™×™×ž×™× ×‘×ž×גר.
notice_not_authorized: ××™× ×š מורשה לר×ות דף ×–×”.
notice_email_sent: דו×"ל × ×©×œ×— לכתובת %s
notice_email_error: ×רעה שגי××” בעט שליחת הדו×"ל (%s)
@@ -76,9 +76,12 @@ notice_feeds_access_key_reseted: מפתח ×”-RSS שלך ×ופס.
notice_failed_to_save_issues: "× ×›×©×¨×ª בשמירת %d × ×•×©×\×™× ×‘ %d × ×‘×—×¨×•: %s."
notice_no_issue_selected: "×œ× × ×‘×—×¨ ××£ × ×•×©×! בחר בבקשה ×ת ×”× ×•×©××™× ×©×‘×¨×¦×•× ×š לערוך."
-mail_subject_lost_password: סיסמת ה-Redmine שלך
+error_scm_not_found: ×›× ×™×¡×” ו\×ו ×’×™×¨×¡× ××™× × ×§×™×™×ž×™× ×‘×ž×גר.
+error_scm_command_failed: "×רעה שגי××” בעת × ×™×¡×•×Ÿ גישה למ×גר: %s"
+
+mail_subject_lost_password: סיסמת ה-%s שלך
mail_body_lost_password: '×œ×©×™× ×• סיסמת ×”-Redmine שלך,לחץ על הקישור הב×:'
-mail_subject_register: הפעלת חשבון Redmine
+mail_subject_register: הפעלת חשבון %s
mail_body_register: 'להפעלת חשבון ×”-Redmine שלך, לחץ על הקישור הב×:'
gui_validation_error: שגי××” 1
@@ -96,7 +99,7 @@ field_filesize: גודל
field_downloads: הורדות
field_author: כותב
field_created_on: × ×•×¦×¨
-field_updated_on: עודגן
+field_updated_on: עודכן
field_field_format: פורמט
field_is_for_all: לכל הפרויקטי×
field_possible_values: ×¢×¨×›×™× ×פשריי×
@@ -117,7 +120,7 @@ field_subject: ×©× × ×•×©×
field_due_date: ת×ריך סיו×
field_assigned_to: מוצב ל
field_priority: עדיפות
-field_fixed_version: ×’×™×¨×¡× ×ž×§×•×‘×¢×ª
+field_fixed_version: גירס×ת יעד
field_user: מתשמש
field_role: תפקיד
field_homepage: דף הבית
@@ -138,7 +141,7 @@ field_version: גירס×
field_type: סוג
field_host: שרת
field_port: פורט
-field_account: חשבו×
+field_account: חשבון
field_base_dn: בסיס DN
field_attr_login: ×ª×›×•× ×ª התחברות
field_attr_firstname: ×ª×›×•× ×ª ×©× ×¤×¨×˜×™×
@@ -164,6 +167,7 @@ field_assignable: × ×™×ª×Ÿ להקצות × ×•×©××™× ×œ×ª×¤×§×™×“ ×–×”
field_redirect_existing_links: העבר ×§×™×©×•×¨×™× ×§×™×™×ž×™×
field_estimated_hours: זמן משוער
field_column_names: עמודות
+field_default_value: ערך ברירת מחדל
setting_app_title: כותרת ישו×
setting_app_subtitle: תת-כותרת ישו×
@@ -179,7 +183,7 @@ setting_text_formatting: עיצוב טקסט
setting_wiki_compression: כיווץ היסטורית WIKI
setting_feeds_limit: גבול תוכן ×”×–× ×•×ª
setting_autofetch_changesets: משיכה ×וטומתי של ×¢×™×“×›×•× ×™×
-setting_sys_api_enabled: Enable WS for repository management
+setting_sys_api_enabled: ×פשר WS ×œ× ×™×”×•×œ המ×גר
setting_commit_ref_keywords: מילות מפתח מקשרות
setting_commit_fix_keywords: מילות מפתח ×ž×ª×§× ×•×ª
setting_autologin: חיבור ×וטומטי
@@ -230,7 +234,7 @@ label_information_plural: מידע
label_please_login: התחבר בבקשה
label_register: הרשמה
label_password_lost: ×בדה הסיסמה?
-label_home: דך הבית
+label_home: דף הבית
label_my_page: הדף שלי
label_my_account: השבון שלי
label_my_projects: ×”×¤×¨×•×™×§×˜×™× ×©×œ×™
@@ -256,7 +260,7 @@ label_subproject_plural: תת-פרויקטי×
label_min_max_length: ×ורך ×ž×™× ×™×ž×לי - מקסימ×לי
label_list: רשימה
label_date: ת×ריך
-label_integer: מספר שלי×
+label_integer: מספר של×
label_boolean: ערך בולי×× ×™
label_string: טקסט
label_text: טקסט ×רוך
@@ -266,7 +270,7 @@ label_download: הורדה %d
label_download_plural: %d הורדות
label_no_data: ×ין מידע להציג
label_change_status: ×©× ×” מצב
-label_history: הידטוריה
+label_history: היסטוריה
label_attachment: קובץ
label_attachment_new: קובץ חדש
label_attachment_delete: מחק קובץ
@@ -276,7 +280,7 @@ label_report_plural: דו"חות
label_news: חדשות
label_news_new: הוסף חדשות
label_news_plural: חדשות
-label_news_latest: חדשות חדשות
+label_news_latest: חדשות ××—×¨×•× ×•×ª
label_news_view_all: צפה בכל החדשות
label_change_log: דו"×— ×©×™× ×•×™×™×
label_settings: הגדרות
@@ -416,7 +420,7 @@ label_reply_plural: השבות
label_send_information: שלח מידע על חשבון למשתמש
label_year: ×©× ×”
label_month: חודש
-label_week: שבו
+label_week: שבוע
label_date_from: מ×ת
label_date_to: ×ל
label_language_based: מבוסס שפה
@@ -441,7 +445,7 @@ button_save: שמור
button_check_all: בחר הכל
button_uncheck_all: בחר כלו×
button_delete: מחק
-button_create: צוק
+button_create: צור
button_test: בדוק
button_edit: ערוך
button_add: הוסף
@@ -451,13 +455,13 @@ button_clear: × ×§×”
button_lock: × ×¢×œ
button_unlock: בטל × ×¢×™×œ×”
button_download: הורד
-button_list: קשימה
+button_list: רשימה
button_view: צפה
button_move: ×”×–×–
button_back: הקוד×
button_cancel: בטח
button_activate: הפעל
-button_sort: מין
+button_sort: מיין
button_log_time: זמן לוג
button_rollback: חזור ×œ×’×™×¨×¡× ×–×•
button_watch: צפה
@@ -491,8 +495,8 @@ text_tracker_no_workflow: זרימת עבודה ×œ× ×”×•×’×“×¨×” עבור עו
text_unallowed_characters: ×ª×•×•×™× ×œ× ×ž×•×¨×©×™×
text_comma_separated: ×”×›× ×¡×ª ×¢×¨×›×™× ×ž×¨×•×‘×™× ×ž×•×ª×¨×ª (×ž×•×¤×¨×“×™× ×‘×¤×¡×™×§×™×).
text_issues_ref_in_commit_messages: קישור ×•×ª×™×§×•× × ×•×©××™× ×‘×”×•×“×¢×•×ª הפקדות
-text_issue_added: ×”× ×•×©× %s דווח.
-text_issue_updated: ×”× ×•×©× %s עודכן.
+text_issue_added: ×”× ×•×©× %s דווח (by %s).
+text_issue_updated: ×”× ×•×©× %s עודכן (by %s).
text_wiki_destroy_confirmation: ×”×× ×תה בטוח ×©×‘×¨×¦×•× ×š למחוק ×ת ×”WIKI ×”×–×” ו×ת כל ×ª×•×›× ×•?
text_issue_category_destroy_question: כמה × ×•×©××™× (%d) ×ž×•×¦×‘×™× ×œ×§×˜×’×•×¨×™×” הזו. מה ×‘×¨×¦×•× ×š לעשות?
text_issue_category_destroy_assignments: הסר הצבת קטגוריה
@@ -523,24 +527,113 @@ default_activity_development: פיתוח
enumeration_issue_priorities: עדיפות × ×•×©××™×
enumeration_doc_categories: קטגוריות מסמכי×
enumeration_activities: פעילויות (מעקב ×חר ×–×ž× ×™×)
-label_search_titles_only: Search titles only
-label_nobody: nobody
-button_change_password: Change password
-text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)."
-label_user_mail_option_selected: "For any event on the selected projects only..."
-label_user_mail_option_all: "For any event on all my projects"
-label_user_mail_option_none: "Only for things I watch or I'm involved in"
-setting_emails_footer: Emails footer
-label_float: Float
-button_copy: Copy
-mail_body_account_information_external: You can use your "%s" account to log into Redmine.
-mail_body_account_information: Your Redmine account information
-setting_protocol: Protocol
-label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
-setting_time_format: Time format
-label_registration_activation_by_email: account activation by email
-mail_subject_account_activation_request: Redmine account activation request
-mail_body_account_activation_request: 'A new user (%s) has registered. His account his pending your approval:'
-label_registration_automatic_activation: automatic account activation
-label_registration_manual_activation: manual account activation
-notice_account_pending: "Your account was created and is now pending administrator approval."
+label_search_titles_only: חפש בכותרות בלבד
+label_nobody: ××£ ×חד
+button_change_password: ×©× ×” סיסמ×
+text_user_mail_option: "×‘×¤×¨×•×™×§×˜×™× ×©×œ× ×‘×—×¨×ª, ×תה רק תקבל התרעות על ש×תה צופה ×ו קשור ××œ×™×”× (לדוגמ×:× ×•×©××™× ×©×תה היוצר ×©×œ×”× ×ו ×ž×•×¦×‘×™× ×ליך)."
+label_user_mail_option_selected: "לכל ×ירוע ×‘×¤×¨×•×™×§×˜×™× ×©×‘×—×¨×ª×™ בלבד..."
+label_user_mail_option_all: "לכל ×ירוע בכל ×”×¤×¨×•×™×§×˜×™× ×©×œ×™"
+label_user_mail_option_none: "רק ×œ× ×•×©××™× ×©×× ×™ צופה ×ו קשור ×ליה×"
+setting_emails_footer: תחתית דו×"ל
+label_float: צף
+button_copy: העתק
+mail_body_account_information_external: ×תה יכול להשתמש בחשבון "%s" כדי להתחבר
+mail_body_account_information: פרטי החשבון שלך
+setting_protocol: פרוטוקול
+label_user_mail_no_self_notified: "×× ×™ ×œ× ×¨×•×¦×” שיודיעו לי על ×©×™× ×•×™×™× ×©×× ×™ מבצע"
+setting_time_format: פורמט זמן
+label_registration_activation_by_email: הפעל חשבון ב×מצעות דו×"ל
+mail_subject_account_activation_request: בקשת הפעלה לחשבון %s
+mail_body_account_activation_request: 'משתמש חדש (%s) × ×¨×©×. החשבון שלו מחכה ל×ישור שלך:'
+label_registration_automatic_activation: הפעלת חשבון ×וטומטית
+label_registration_manual_activation: הפעלת חשבון ×™×“× ×™×ª
+notice_account_pending: "החשבון שלך × ×•×¦×¨ ועתה מחכה ל×ישור ×ž× ×”×œ המערכת."
+field_time_zone: ×יזור זמן
+text_caracters_minimum: חייב להיות לפחות ב×ורך של %d תווי×.
+setting_bcc_recipients: מוסתר (bcc)
+button_annotate: הוסף תי×ור מסגרת
+label_issues_by: × ×•×©××™× ×©×œ %s
+field_searchable: × ×™×ª×Ÿ לחיפוש
+label_display_per_page: 'לכל דף: %s'
+setting_per_page_options: ×פשרויות ××•×‘×™×§×˜×™× ×œ×¤×™ דף
+label_age: גיל
+notice_default_data_loaded: ×פשרויות ברירת מחדל מופעלות.
+text_load_default_configuration: טען ×ת ×פשרויות ברירת המחדל
+text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. ×™×”×™×” ב×פשרותך ×œ×©× ×•×ª×• ל×חר שיטען."
+error_can_t_load_default_data: "×פשרויות ברירת המחדל ×œ× ×”×¦×œ×™×—×• להיטען: %s"
+button_update: עדכן
+label_change_properties: ×©× ×” מ××¤×™×™× ×™×
+label_general: כללי
+label_repository_plural: מ×גרי×
+label_associated_revisions: ×©×™× ×•×™×™× ×§×©×•×¨×™×
+setting_user_format: פורמט הצגת משתמשי×
+text_status_changed_by_changeset: הוחל בסדרת ×”×©×™× ×•×™×™× %s.
+label_more: עוד
+text_issues_destroy_confirmation: '×”×× ×ת\×” בטוח ×©×‘×¨×¦×•× ×š למחוק ×ת ×”× ×•×©×\×™× ?'
+label_scm: SCM
+text_select_project_modules: 'בחר ×ž×•×“×•×œ×™× ×œ×”×—×™×œ על פקרויקט ×–×”:'
+label_issue_added: × ×•×©× ×”×•×¡×£
+label_issue_updated: × ×•×©× ×¢×•×“×›×Ÿ
+label_document_added: מוסמך הוסף
+label_message_posted: הודעה הוספה
+label_file_added: קובץ הוסף
+label_news_added: חדשות הוספו
+project_module_boards: לוחות
+project_module_issue_tracking: מעקב × ×•×©××™×
+project_module_wiki: Wiki
+project_module_files: קבצי×
+project_module_documents: מסמכי×
+project_module_repository: מ×גר
+project_module_news: חדשות
+project_module_time_tracking: מעקב ×חר ×–×ž× ×™×
+text_file_repository_writable: מ×גר ×”×§×‘×¦×™× × ×™×ª×Ÿ לכתיבה
+text_default_administrator_account_changed: ×ž× ×”×œ המערכת ברירת המחדל ×©×•× ×”
+text_rmagick_available: RMagick available (optional)
+button_configure: ×פשרויות
+label_plugins: פל××’×™× ×™×
+label_ldap_authentication: ×ימות LDAP
+label_downloads_abbr: D/L
+label_this_month: החודש
+label_last_n_days: ב-%d ×™×ž×™× ××—×¨×•× ×™×
+label_all_time: תמיד
+label_this_year: ×”×©× ×”
+label_date_range: טווח ת×ריכי×
+label_last_week: שבוע שעבר
+label_yesterday: ×תמול
+label_last_month: חודש שעבר
+label_add_another_file: הוסף עוד קובץ
+label_optional_description: תי×ור רשות
+text_destroy_time_entries_question: %.02f שעות דווחו על ×”× ×•×©×™× ×©×ת\×” עומד\ת למחוק. מה ×‘×¨×¦×•× ×š לעשות ?
+error_issue_not_found_in_project: '×”× ×•×©××™× ×œ× × ×ž×¦×ו ×ו ××™× × ×©×™×›×™× ×œ×¤×¨×•×™×§×˜'
+text_assign_time_entries_to_project: הצב שעות שדווחו לפרויקט הזה
+text_destroy_time_entries: מחק שעות שדווחו
+text_reassign_time_entries: 'הצב מחדש שעות שדווחו לפרויקט הזה:'
+setting_activity_days_default: ×™×ž×™× ×”×ž×•×¦×’×™× ×¢×œ פעילות הפרויקט
+label_chronological_order: בסדר ×›×¨×•× ×•×œ×•×’×™
+field_comments_sorting: הצג הערות
+label_reverse_chronological_order: בסדר ×›×¨×•× ×•×œ×•×’×™ הפוך
+label_preferences: העדפות
+setting_display_subprojects_issues: הצג × ×•×©××™× ×©×œ תת ×¤×¨×•×™×§×˜×™× ×›×‘×¨×™×¨×ª מחדל
+label_overall_activity: פעילות כוללת
+setting_default_projects_public: ×¤×¨×•×™×§×˜×™× ×—×“×©×™× ×”×™× × ×¤×•×ž×‘×™×™× ×›×‘×¨×™×¨×ª מחדל
+error_scm_annotate: "×”×›× ×™×¡×” ×œ× ×§×™×™×ž×ª ×ו ×©×œ× × ×™×ª×Ÿ לת×ר ×ותה."
+label_planning: ×ª×›× ×•×Ÿ
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
+label_and_its_subprojects: %s and its subprojects
+mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
+mail_subject_reminder: "%d issue(s) due in the next days"
+text_user_wrote: '%s wrote:'
+label_duplicated_by: duplicated by
+setting_enabled_scm: Enabled SCM
+text_enumeration_category_reassign_to: 'Reassign them to this value:'
+text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
+text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/hu.yml b/lang/hu.yml
new file mode 100644
index 000000000..f8bfb93e8
--- /dev/null
+++ b/lang/hu.yml
@@ -0,0 +1,640 @@
+_gloc_rule_default: '|n| n==1 ? "" : "_plural" '
+
+actionview_datehelper_select_day_prefix:
+actionview_datehelper_select_month_names: Január,Február,Március,Ãprilis,Május,Június,Július,Augusztus,Szeptember,Október,November,December
+actionview_datehelper_select_month_names_abbr: Jan,Feb,Már,Ãpr,Máj,Jún,Júl,Aug,Szept,Okt,Nov,Dec
+actionview_datehelper_select_month_prefix:
+actionview_datehelper_select_year_prefix:
+actionview_datehelper_time_in_words_day: 1 nap
+actionview_datehelper_time_in_words_day_plural: %d nap
+actionview_datehelper_time_in_words_hour_about: kb. 1 óra
+actionview_datehelper_time_in_words_hour_about_plural: kb. %d óra
+actionview_datehelper_time_in_words_hour_about_single: kb. 1 óra
+actionview_datehelper_time_in_words_minute: 1 perc
+actionview_datehelper_time_in_words_minute_half: fél perc
+actionview_datehelper_time_in_words_minute_less_than: kevesebb, mint 1 perc
+actionview_datehelper_time_in_words_minute_plural: %d perc
+actionview_datehelper_time_in_words_minute_single: 1 perc
+actionview_datehelper_time_in_words_second_less_than: kevesebb, mint 1 másodperc
+actionview_datehelper_time_in_words_second_less_than_plural: kevesebb, mint %d másodperc
+actionview_instancetag_blank_option: Kérem válasszon
+
+activerecord_error_inclusion: nem található a listában
+activerecord_error_exclusion: foglalt
+activerecord_error_invalid: érvénytelen
+activerecord_error_confirmation: jóváhagyás szükséges
+activerecord_error_accepted: ell kell fogadni
+activerecord_error_empty: nem lehet üres
+activerecord_error_blank: nem lehet üres
+activerecord_error_too_long: túl hosszú
+activerecord_error_too_short: túl rövid
+activerecord_error_wrong_length: hibás a hossza
+activerecord_error_taken: már foglalt
+activerecord_error_not_a_number: nem egy szám
+activerecord_error_not_a_date: nem érvényes dátum
+activerecord_error_greater_than_start_date: nagyobbnak kell lennie, mint az indÃtás dátuma
+activerecord_error_not_same_project: nem azonos projekthez tartozik
+activerecord_error_circular_dependency: Ez a kapcsolat egy körkörös függőséget eredményez
+
+general_fmt_age: %d év
+general_fmt_age_plural: %d év
+general_fmt_date: %%Y.%%m.%%d
+general_fmt_datetime: %%Y.%%m.%%d %%H:%%M:%%S
+general_fmt_datetime_short: %%b %%d, %%H:%%M:%%S
+general_fmt_time: %%H:%%M:%%S
+general_text_No: 'Nem'
+general_text_Yes: 'Igen'
+general_text_no: 'nem'
+general_text_yes: 'igen'
+general_lang_name: 'Magyar'
+general_csv_separator: ','
+general_csv_decimal_separator: '.'
+general_csv_encoding: ISO-8859-2
+general_pdf_encoding: ISO-8859-2
+general_day_names: Hétfő,Kedd,Szerda,Csütörtök,Péntek,Szombat,Vasárnap
+general_first_day_of_week: '1'
+
+notice_account_updated: A fiók adatai sikeresen frissÃtve.
+notice_account_invalid_creditentials: Hibás felhasználói név, vagy jelszó
+notice_account_password_updated: A jelszó módosÃtása megtörtént.
+notice_account_wrong_password: Hibás jelszó
+notice_account_register_done: A fiók sikeresen létrehozva. Aktiválásához kattints az e-mailben kapott linkre
+notice_account_unknown_email: Ismeretlen felhasználó.
+notice_can_t_change_password: A fiók külsÅ‘ azonosÃtási forrást használ. A jelszó megváltoztatása nem lehetséges.
+notice_account_lost_email_sent: Egy e-mail üzenetben postáztunk Önnek egy leÃrást az új jelszó beállÃtásáról.
+notice_account_activated: Fiókját aktiváltuk. Most már be tud jelentkezni a rendszerbe.
+notice_successful_create: Sikeres létrehozás.
+notice_successful_update: Sikeres módosÃtás.
+notice_successful_delete: Sikeres törlés.
+notice_successful_connection: Sikeres bejelentkezés.
+notice_file_not_found: Az oldal, amit meg szeretne nézni nem található, vagy átkerült egy másik helyre.
+notice_locking_conflict: Az adatot egy másik felhasználó idÅ‘ közben módosÃtotta.
+notice_not_authorized: Nincs hozzáférési engedélye ehhez az oldalhoz.
+notice_email_sent: Egy e-mail üzenetet küldtünk a következÅ‘ cÃmre %s
+notice_email_error: Hiba történt a levél küldése közben (%s)
+notice_feeds_access_key_reseted: Az RSS hozzáférési kulcsát újra generáltuk.
+notice_failed_to_save_issues: "Nem sikerült a %d feladat(ok) mentése a %d -ban kiválasztva: %s."
+notice_no_issue_selected: "Nincs feladat kiválasztva! Kérem jelölje meg melyik feladatot szeretné szerkeszteni!"
+notice_account_pending: "A fiókja létrejött, és adminisztrátori jóváhagyásra vár."
+notice_default_data_loaded: Az alapértelmezett konfiguráció betöltése sikeresen megtörtént.
+
+error_can_t_load_default_data: "Az alapértelmezett konfiguráció betöltése nem lehetséges: %s"
+error_scm_not_found: "A bejegyzés, vagy revÃzió nem található a tárolóban."
+error_scm_command_failed: "A tároló elérése közben hiba lépett fel: %s"
+error_scm_annotate: "A bejegyzés nem létezik, vagy nics jegyzetekkel ellátva."
+error_issue_not_found_in_project: 'A feladat nem található, vagy nem ehhez a projekthez tartozik'
+
+mail_subject_lost_password: Az Ön Redmine jelszava
+mail_body_lost_password: 'A Redmine jelszó megváltoztatásához, kattintson a következő linkre:'
+mail_subject_register: Redmine azonosÃtó aktiválása
+mail_body_register: 'A Redmine azonosÃtója aktiválásához, kattintson a következÅ‘ linkre:'
+mail_body_account_information_external: A "%s" azonosÃtó használatával bejelentkezhet a Redmineba.
+mail_body_account_information: Az Ön Redmine azonosÃtójának információi
+mail_subject_account_activation_request: Redmine azonosÃtó aktiválási kérelem
+mail_body_account_activation_request: 'Egy új felhasználó (%s) regisztrált, azonosÃtója jóváhasgyásra várakozik:'
+
+gui_validation_error: 1 hiba
+gui_validation_error_plural: %d hiba
+
+field_name: Név
+field_description: LeÃrás
+field_summary: Összegzés
+field_is_required: Kötelező
+field_firstname: Keresztnév
+field_lastname: Vezetéknév
+field_mail: E-mail
+field_filename: Fájl
+field_filesize: Méret
+field_downloads: Letöltések
+field_author: Szerző
+field_created_on: Létrehozva
+field_updated_on: MódosÃtva
+field_field_format: Formátum
+field_is_for_all: Minden projekthez
+field_possible_values: Lehetséges értékek
+field_regexp: Reguláris kifejezés
+field_min_length: Minimum hossz
+field_max_length: Maximum hossz
+field_value: Érték
+field_category: Kategória
+field_title: CÃm
+field_project: Projekt
+field_issue: Feladat
+field_status: Státusz
+field_notes: Feljegyzések
+field_is_closed: Feladat lezárva
+field_is_default: Alapértelmezett érték
+field_tracker: TÃpus
+field_subject: Tárgy
+field_due_date: Befejezés dátuma
+field_assigned_to: Felelős
+field_priority: Prioritás
+field_fixed_version: Cél verzió
+field_user: Felhasználó
+field_role: Szerepkör
+field_homepage: Weboldal
+field_is_public: Nyilvános
+field_parent: Szülő projekt
+field_is_in_chlog: Feladatok látszanak a változás naplóban
+field_is_in_roadmap: Feladatok látszanak az életútban
+field_login: AzonosÃtó
+field_mail_notification: E-mail értesÃtések
+field_admin: Adminisztrátor
+field_last_login_on: Utolsó bejelentkezés
+field_language: Nyelv
+field_effective_date: Dátum
+field_password: Jelszó
+field_new_password: Új jelszó
+field_password_confirmation: MegerÅ‘sÃtés
+field_version: Verzió
+field_type: TÃpus
+field_host: Kiszolgáló
+field_port: Port
+field_account: Felhasználói fiók
+field_base_dn: Base DN
+field_attr_login: Bejelentkezési tulajdonság
+field_attr_firstname: Családnév
+field_attr_lastname: Utónév
+field_attr_mail: E-mail
+field_onthefly: On-the-fly felhasználó létrehozás
+field_start_date: Kezdés dátuma
+field_done_ratio: Elkészült (%%)
+field_auth_source: AzonosÃtási mód
+field_hide_mail: Rejtse el az e-mail cÃmem
+field_comments: Megjegyzés
+field_url: URL
+field_start_page: Kezdőlap
+field_subproject: Alprojekt
+field_hours: Óra
+field_activity: Aktivitás
+field_spent_on: Dátum
+field_identifier: AzonosÃtó
+field_is_filter: Szűrőként használható
+field_issue_to_id: Kapcsolódó feladat
+field_delay: Késés
+field_assignable: Feladat rendelhető ehhez a szerepkörhöz
+field_redirect_existing_links: LétezÅ‘ linkek átirányÃtása
+field_estimated_hours: Becsült idő
+field_column_names: Oszlopok
+field_time_zone: Időzóna
+field_searchable: Kereshető
+field_default_value: Alapértelmezett érték
+field_comments_sorting: Feljegyzések megjelenÃtése
+
+setting_app_title: Alkalmazás cÃme
+setting_app_subtitle: Alkalmazás alcÃme
+setting_welcome_text: Üdvözlő üzenet
+setting_default_language: Alapértelmezett nyelv
+setting_login_required: AzonosÃtás szükséges
+setting_self_registration: Regisztráció
+setting_attachment_max_size: Melléklet max. mérete
+setting_issues_export_limit: Feladatok exportálásának korlátja
+setting_mail_from: Kibocsátó e-mail cÃme
+setting_bcc_recipients: Titkos másolat cÃmzet (bcc)
+setting_host_name: Kiszolgáló neve
+setting_text_formatting: Szöveg formázás
+setting_wiki_compression: Wiki történet tömörÃtés
+setting_feeds_limit: RSS tartalom korlát
+setting_default_projects_public: Az új projektek alapértelmezés szerint nyilvánosak
+setting_autofetch_changesets: Commitok automatikus lehúzása
+setting_sys_api_enabled: WS engedélyezése a tárolók kezeléséhez
+setting_commit_ref_keywords: Hivatkozó kulcsszavak
+setting_commit_fix_keywords: JavÃtások kulcsszavai
+setting_autologin: Automatikus bejelentkezés
+setting_date_format: Dátum formátum
+setting_time_format: Idő formátum
+setting_cross_project_issue_relations: Kereszt-projekt feladat hivatkozások engedélyezése
+setting_issue_list_default_columns: Az alapértelmezésként megjelenÃtett oszlopok a feladat listában
+setting_repositories_encodings: Tárolók kódolása
+setting_emails_footer: E-mail lábléc
+setting_protocol: Protokol
+setting_per_page_options: Objektum / oldal opciók
+setting_user_format: Felhasználók megjelenÃtésének formája
+setting_activity_days_default: Napok megjelenÃtése a project aktivitásnál
+setting_display_subprojects_issues: Alapértelmezettként mutassa az alprojektek feladatait is a projekteken
+
+project_module_issue_tracking: Feladat követés
+project_module_time_tracking: IdÅ‘ rögzÃtés
+project_module_news: HÃrek
+project_module_documents: Dokumentumok
+project_module_files: Fájlok
+project_module_wiki: Wiki
+project_module_repository: Tároló
+project_module_boards: Fórumok
+
+label_user: Felhasználó
+label_user_plural: Felhasználók
+label_user_new: Új felhasználó
+label_project: Projekt
+label_project_new: Új projekt
+label_project_plural: Projektek
+label_project_all: Az összes projekt
+label_project_latest: Legutóbbi projektek
+label_issue: Feladat
+label_issue_new: Új feladat
+label_issue_plural: Feladatok
+label_issue_view_all: Minden feladat megtekintése
+label_issues_by: %s feladatai
+label_issue_added: Feladat hozzáadva
+label_issue_updated: Feladat frissÃtve
+label_document: Dokumentum
+label_document_new: Új dokumentum
+label_document_plural: Dokumentumok
+label_document_added: Dokumentum hozzáadva
+label_role: Szerepkör
+label_role_plural: Szerepkörök
+label_role_new: Új szerepkör
+label_role_and_permissions: Szerepkörök, és jogosultságok
+label_member: Résztvevő
+label_member_new: Új résztvevő
+label_member_plural: Résztvevők
+label_tracker: Feladat tÃpus
+label_tracker_plural: Feladat tÃpusok
+label_tracker_new: Új feladat tÃpus
+label_workflow: Workflow
+label_issue_status: Feladat státusz
+label_issue_status_plural: Feladat státuszok
+label_issue_status_new: Új státusz
+label_issue_category: Feladat kategória
+label_issue_category_plural: Feladat kategóriák
+label_issue_category_new: Új kategória
+label_custom_field: Egyéni mező
+label_custom_field_plural: Egyéni mezők
+label_custom_field_new: Új egyéni mező
+label_enumerations: Felsorolások
+label_enumeration_new: Új érték
+label_information: Információ
+label_information_plural: Információk
+label_please_login: Jelentkezzen be
+label_register: Regisztráljon
+label_password_lost: Elfelejtett jelszó
+label_home: Kezdőlap
+label_my_page: Saját kezdőlapom
+label_my_account: Fiókom adatai
+label_my_projects: Saját projektem
+label_administration: Adminisztráció
+label_login: Bejelentkezés
+label_logout: Kijelentkezés
+label_help: Súgó
+label_reported_issues: Bejelentett feladatok
+label_assigned_to_me_issues: A nekem kiosztott feladatok
+label_last_login: Utolsó bejelentkezés
+label_last_updates: Utoljára frissÃtve
+label_last_updates_plural: Utoljára módosÃtva %d
+label_registered_on: Regisztrált
+label_activity: Tevékenységek
+label_overall_activity: Teljes aktivitás
+label_new: Új
+label_logged_as: Bejelentkezve, mint
+label_environment: Környezet
+label_authentication: AzonosÃtás
+label_auth_source: AzonosÃtás módja
+label_auth_source_new: Új azonosÃtási mód
+label_auth_source_plural: AzonosÃtási módok
+label_subproject_plural: Alprojektek
+label_and_its_subprojects: %s és alprojektjei
+label_min_max_length: Min - Max hossz
+label_list: Lista
+label_date: Dátum
+label_integer: Egész
+label_float: Lebegőpontos
+label_boolean: Logikai
+label_string: Szöveg
+label_text: Hosszú szöveg
+label_attribute: Tulajdonság
+label_attribute_plural: Tulajdonságok
+label_download: %d Letöltés
+label_download_plural: %d Letöltések
+label_no_data: Nincs megjelenÃthetÅ‘ adat
+label_change_status: Státusz módosÃtása
+label_history: Történet
+label_attachment: Fájl
+label_attachment_new: Új fájl
+label_attachment_delete: Fájl törlése
+label_attachment_plural: Fájlok
+label_file_added: Fájl hozzáadva
+label_report: Jelentés
+label_report_plural: Jelentések
+label_news: HÃrek
+label_news_new: HÃr hozzáadása
+label_news_plural: HÃrek
+label_news_latest: Legutóbbi hÃrek
+label_news_view_all: Minden hÃr megtekintése
+label_news_added: HÃr hozzáadva
+label_change_log: Változás napló
+label_settings: BeállÃtások
+label_overview: Ãttekintés
+label_version: Verzió
+label_version_new: Új verzió
+label_version_plural: Verziók
+label_confirmation: Jóváhagyás
+label_export_to: Exportálás
+label_read: Olvas...
+label_public_projects: Nyilvános projektek
+label_open_issues: nyitott
+label_open_issues_plural: nyitott
+label_closed_issues: lezárt
+label_closed_issues_plural: lezárt
+label_total: Összesen
+label_permissions: Jogosultságok
+label_current_status: Jelenlegi státusz
+label_new_statuses_allowed: Státusz változtatások engedélyei
+label_all: mind
+label_none: nincs
+label_nobody: senki
+label_next: Következő
+label_previous: Előző
+label_used_by: Használja
+label_details: Részletek
+label_add_note: Jegyzet hozzáadása
+label_per_page: Oldalanként
+label_calendar: Naptár
+label_months_from: hónap, kezdve
+label_gantt: Gantt
+label_internal: Belső
+label_last_changes: utolsó %d változás
+label_change_view_all: Minden változás megtekintése
+label_personalize_page: Az oldal testreszabása
+label_comment: Megjegyzés
+label_comment_plural: Megjegyzés
+label_comment_add: Megjegyzés hozzáadása
+label_comment_added: Megjegyzés hozzáadva
+label_comment_delete: Megjegyzések törlése
+label_query: Egyéni lekérdezés
+label_query_plural: Egyéni lekérdezések
+label_query_new: Új lekérdezés
+label_filter_add: Szűrő hozzáadása
+label_filter_plural: Szűrők
+label_equals: egyenlő
+label_not_equals: nem egyenlő
+label_in_less_than: kevesebb, mint
+label_in_more_than: több, mint
+label_in: in
+label_today: ma
+label_all_time: mindenkor
+label_yesterday: tegnap
+label_this_week: aktuális hét
+label_last_week: múlt hét
+label_last_n_days: az elmúlt %d nap
+label_this_month: aktuális hónap
+label_last_month: múlt hónap
+label_this_year: aktuális év
+label_date_range: Dátum intervallum
+label_less_than_ago: kevesebb, mint nappal ezelőtt
+label_more_than_ago: több, mint nappal ezelőtt
+label_ago: nappal ezelőtt
+label_contains: tartalmazza
+label_not_contains: nem tartalmazza
+label_day_plural: nap
+label_repository: Tároló
+label_repository_plural: Tárolók
+label_browse: Tallóz
+label_modification: %d változás
+label_modification_plural: %d változások
+label_revision: RevÃzió
+label_revision_plural: RevÃziók
+label_associated_revisions: Kapcsolt revÃziók
+label_added: hozzáadva
+label_modified: módosÃtva
+label_deleted: törölve
+label_latest_revision: Legutolsó revÃzió
+label_latest_revision_plural: Legutolsó revÃziók
+label_view_revisions: RevÃziók megtekintése
+label_max_size: Maximális méret
+label_on: 'összesen'
+label_sort_highest: Az elejére
+label_sort_higher: Eggyel feljebb
+label_sort_lower: Eggyel lejjebb
+label_sort_lowest: Az aljára
+label_roadmap: Életút
+label_roadmap_due_in: Elkészültéig várhatóan még
+label_roadmap_overdue: %s késésben
+label_roadmap_no_issues: Nincsenek feladatok ehhez a verzióhoz
+label_search: Keresés
+label_result_plural: Találatok
+label_all_words: Minden szó
+label_wiki: Wiki
+label_wiki_edit: Wiki szerkesztés
+label_wiki_edit_plural: Wiki szerkesztések
+label_wiki_page: Wiki oldal
+label_wiki_page_plural: Wiki oldalak
+label_index_by_title: CÃm szerint indexelve
+label_index_by_date: Dátum szerint indexelve
+label_current_version: Jelenlegi verzió
+label_preview: Előnézet
+label_feed_plural: Visszajelzések
+label_changes_details: Változások részletei
+label_issue_tracking: Feladat követés
+label_spent_time: RáfordÃtott idÅ‘
+label_f_hour: %.2f óra
+label_f_hour_plural: %.2f óra
+label_time_tracking: Idő követés
+label_change_plural: Változások
+label_statistics: Statisztikák
+label_commits_per_month: Commits havonta
+label_commits_per_author: Commits szerzőnként
+label_view_diff: Különbségek megtekintése
+label_diff_inline: inline
+label_diff_side_by_side: side by side
+label_options: Opciók
+label_copy_workflow_from: Workflow másolása innen
+label_permissions_report: Jogosultsági riport
+label_watched_issues: Megfigyelt feladatok
+label_related_issues: Kapcsolódó feladatok
+label_applied_status: Alkalmazandó státusz
+label_loading: Betöltés...
+label_relation_new: Új kapcsolat
+label_relation_delete: Kapcsolat törlése
+label_relates_to: kapcsolódik
+label_duplicates: duplikálja
+label_blocks: zárolja
+label_blocked_by: zárolta
+label_precedes: megelőzi
+label_follows: követi
+label_end_to_start: végétől indulásig
+label_end_to_end: végétől végéig
+label_start_to_start: indulástól indulásig
+label_start_to_end: indulástól végéig
+label_stay_logged_in: Emlékezzen rám
+label_disabled: kikapcsolva
+label_show_completed_versions: A kész verziók mutatása
+label_me: én
+label_board: Fórum
+label_board_new: Új fórum
+label_board_plural: Fórumok
+label_topic_plural: Témák
+label_message_plural: Üzenetek
+label_message_last: Utolsó üzenet
+label_message_new: Új üzenet
+label_message_posted: Üzenet hozzáadva
+label_reply_plural: Válaszok
+label_send_information: Fiók infomációk küldése a felhasználónak
+label_year: Év
+label_month: Hónap
+label_week: Hét
+label_date_from: 'Kezdet:'
+label_date_to: 'Vége:'
+label_language_based: A felhasználó nyelve alapján
+label_sort_by: %s szerint rendezve
+label_send_test_email: Teszt e-mail küldése
+label_feeds_access_key_created_on: 'RSS hozzáférési kulcs létrehozva ennyivel ezelőtt: %s'
+label_module_plural: Modulok
+label_added_time_by: '%s adta hozzá ennyivel ezelőtt: %s'
+label_updated_time: 'Utolsó módosÃtás ennyivel ezelÅ‘tt: %s'
+label_jump_to_a_project: Ugrás projekthez...
+label_file_plural: Fájlok
+label_changeset_plural: Changesets
+label_default_columns: Alapértelmezett oszlopok
+label_no_change_option: (Nincs változás)
+label_bulk_edit_selected_issues: A kiválasztott feladatok kötegelt szerkesztése
+label_theme: Téma
+label_default: Alapértelmezett
+label_search_titles_only: Keresés csak a cÃmekben
+label_user_mail_option_all: "Minden eseményről minden saját projektemben"
+label_user_mail_option_selected: "Minden eseményről a kiválasztott projektekben..."
+label_user_mail_option_none: "Csak a megfigyelt dolgokról, vagy, amiben részt veszek"
+label_user_mail_no_self_notified: "Nem kérek értesÃtést az általam végzett módosÃtásokról"
+label_registration_activation_by_email: Fiók aktiválása e-mailben
+label_registration_manual_activation: Manuális fiók aktiválás
+label_registration_automatic_activation: Automatikus fiók aktiválás
+label_display_per_page: 'Oldalanként: %s'
+label_age: Kor
+label_change_properties: Tulajdonságok változtatása
+label_general: Ãltalános
+label_more: továbbiak
+label_scm: SCM
+label_plugins: Pluginek
+label_ldap_authentication: LDAP azonosÃtás
+label_downloads_abbr: D/L
+label_optional_description: Opcionális leÃrás
+label_add_another_file: Újabb fájl hozzáadása
+label_preferences: Tulajdonságok
+label_chronological_order: Időrendben
+label_reverse_chronological_order: FordÃtott idÅ‘rendben
+label_planning: Tervezés
+
+button_login: Bejelentkezés
+button_submit: Elfogad
+button_save: Mentés
+button_check_all: Mindent kijelöl
+button_uncheck_all: Kijelölés törlése
+button_delete: Töröl
+button_create: Létrehoz
+button_test: Teszt
+button_edit: Szerkeszt
+button_add: Hozzáad
+button_change: Változtat
+button_apply: Alkalmaz
+button_clear: Töröl
+button_lock: Zárol
+button_unlock: Felold
+button_download: Letöltés
+button_list: Lista
+button_view: Megnéz
+button_move: Mozgat
+button_back: Vissza
+button_cancel: Mégse
+button_activate: Aktivál
+button_sort: Rendezés
+button_log_time: IdÅ‘ rögzÃtés
+button_rollback: Visszaáll erre a verzióra
+button_watch: Megfigyel
+button_unwatch: Megfigyelés törlése
+button_reply: Válasz
+button_archive: Archivál
+button_unarchive: Dearchivál
+button_reset: Reset
+button_rename: Ãtnevez
+button_change_password: Jelszó megváltoztatása
+button_copy: Másol
+button_annotate: Jegyzetel
+button_update: MódosÃt
+button_configure: Konfigurál
+
+status_active: aktÃv
+status_registered: regisztrált
+status_locked: zárolt
+
+text_select_mail_notifications: Válasszon eseményeket, amelyekrÅ‘l e-mail értesÃtést kell küldeni.
+text_regexp_info: eg. ^[A-Z0-9]+$
+text_min_max_length_info: 0 = nincs korlátozás
+text_project_destroy_confirmation: Biztosan törölni szeretné a projektet és vele együtt minden kapcsolódó adatot ?
+text_subprojects_destroy_warning: 'Az alprojekt(ek): %s szintén törlésre kerülnek.'
+text_workflow_edit: Válasszon egy szerepkört, és egy trackert a workflow szerkesztéséhez
+text_are_you_sure: Biztos benne ?
+text_journal_changed: "változás: %s volt, %s lett"
+text_journal_set_to: "beállÃtva: %s"
+text_journal_deleted: törölve
+text_tip_task_begin_day: a feladat ezen a napon kezdődik
+text_tip_task_end_day: a feladat ezen a napon ér véget
+text_tip_task_begin_end_day: a feladat ezen a napon kezdődik és ér véget
+text_project_identifier_info: 'Kis betűk (a-z), számok és kötÅ‘jel megengedett. Mentés után az azonosÃtót megváltoztatni nem lehet.'
+text_caracters_maximum: maximum %d karakter.
+text_caracters_minimum: Legkevesebb %d karakter hosszúnek kell lennie.
+text_length_between: Legalább %d és legfeljebb %d hosszú karakter.
+text_tracker_no_workflow: Nincs workflow definiálva ehhez a tracker-hez
+text_unallowed_characters: Tiltott karakterek
+text_comma_separated: Több érték megengedett (vesszővel elválasztva)
+text_issues_ref_in_commit_messages: Hivatkozás feladatokra, feladatok javÃtása a commit üzenetekben
+text_issue_added: %s feladat bejelentve.
+text_issue_updated: %s feladat frissÃtve.
+text_wiki_destroy_confirmation: Biztosan törölni szeretné ezt a wiki-t minden tartalmával együtt ?
+text_issue_category_destroy_question: Néhány feladat (%d) hozzá van rendelve ehhez a kategóriához. Mit szeretne tenni ?
+text_issue_category_destroy_assignments: Kategória hozzárendelés megszűntetése
+text_issue_category_reassign_to: Feladatok újra hozzárendelése a kategóriához
+text_user_mail_option: "A nem kiválasztott projektekrÅ‘l csak akkor kap értesÃtést, ha figyelést kér rá, vagy részt vesz benne (pl. Ön a létrehozó, vagy a hozzárendelÅ‘)"
+text_no_configuration_data: "Szerepkörök, trackerek, feladat státuszok, és workflow adatok még nincsenek konfigurálva.\nErÅ‘sen ajánlott, az alapértelmezett konfiguráció betöltése, és utána módosÃthatja azt."
+text_load_default_configuration: Alapértelmezett konfiguráció betöltése
+text_status_changed_by_changeset: Applied in changeset %s.
+text_issues_destroy_confirmation: 'Biztos benne, hogy törölni szeretné a kijelölt feladato(ka)t ?'
+text_select_project_modules: 'Válassza ki az engedélyezett modulokat ehhez a projekthez:'
+text_default_administrator_account_changed: Alapértelmezett adminisztrátor fiók megváltoztatva
+text_file_repository_writable: Fájl tároló Ãrható
+text_rmagick_available: RMagick elérhető (opcionális)
+text_destroy_time_entries_question: %.02f órányi munka van rögzÃtve a feladatokon, amiket törölni szeretne. Mit szeretne tenni ?
+text_destroy_time_entries: A rögzÃtett órák törlése
+text_assign_time_entries_to_project: A rögzÃtett órák hozzárendelése a projekthez
+text_reassign_time_entries: 'A rögzÃtett órák újra hozzárendelése ehhez a feladathoz:'
+
+default_role_manager: Vezető
+default_role_developper: Fejlesztő
+default_role_reporter: Bejelentő
+default_tracker_bug: Hiba
+default_tracker_feature: Fejlesztés
+default_tracker_support: Support
+default_issue_status_new: Új
+default_issue_status_assigned: Kiosztva
+default_issue_status_resolved: Megoldva
+default_issue_status_feedback: Visszajelzés
+default_issue_status_closed: Lezárt
+default_issue_status_rejected: ElutasÃtott
+default_doc_category_user: Felhasználói dokumentáció
+default_doc_category_tech: Technikai dokumentáció
+default_priority_low: Alacsony
+default_priority_normal: Normál
+default_priority_high: Magas
+default_priority_urgent: Sürgős
+default_priority_immediate: Azonnal
+default_activity_design: Tervezés
+default_activity_development: Fejlesztés
+
+enumeration_issue_priorities: Feladat prioritások
+enumeration_doc_categories: Dokumentum kategóriák
+enumeration_activities: Tevékenységek (idÅ‘ rögzÃtés)
+mail_body_reminder: "%d neked kiosztott feladat határidős az elkövetkező %d napban:"
+mail_subject_reminder: "%d feladat határidős az elkövetkező napokban"
+text_user_wrote: '%s Ãrta:'
+label_duplicated_by: duplikálta
+setting_enabled_scm: Forráskódkezelő (SCM) engedélyezése
+text_enumeration_category_reassign_to: 'Újra hozzárendelés ehhez:'
+text_enumeration_destroy_question: '%d objektum van hozzárendelve ehhez az értékhez.'
+label_incoming_emails: Beérkezett levelek
+label_generate_key: Kulcs generálása
+setting_mail_handler_api_enabled: Web Service engedélyezése a beérkezett levelekhez
+setting_mail_handler_api_key: API kulcs
+text_email_delivery_not_configured: "Az E-mail küldés nincs konfigurálva, és az értesÃtések ki vannak kapcsolva.\nÃllÃtsd be az SMTP szervert a config/email.yml fájlban és indÃtsd újra az alkalmazást, hogy érvénybe lépjen."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/it.yml b/lang/it.yml
index a80070894..e1ef6f8fe 100644
--- a/lang/it.yml
+++ b/lang/it.yml
@@ -20,24 +20,24 @@ actionview_datehelper_time_in_words_second_less_than_plural: meno di %d secondi
actionview_instancetag_blank_option: Scegli
activerecord_error_inclusion: non è incluso nella lista
-activerecord_error_exclusion: e' riservato
-activerecord_error_invalid: non e' valido
+activerecord_error_exclusion: è riservato
+activerecord_error_invalid: non è valido
activerecord_error_confirmation: non coincide con la conferma
activerecord_error_accepted: deve essere accettato
activerecord_error_empty: non puo' essere vuoto
activerecord_error_blank: non puo' essere blank
-activerecord_error_too_long: e' troppo lungo/a
-activerecord_error_too_short: e' troppo corto/a
-activerecord_error_wrong_length: e' della lunghezza sbagliata
-activerecord_error_taken: e' gia' stato/a preso/a
-activerecord_error_not_a_number: non e' un numero
-activerecord_error_not_a_date: non e' una data valida
+activerecord_error_too_long: è troppo lungo/a
+activerecord_error_too_short: è troppo corto/a
+activerecord_error_wrong_length: è della lunghezza sbagliata
+activerecord_error_taken: è già stato/a preso/a
+activerecord_error_not_a_number: non è un numero
+activerecord_error_not_a_date: non è una data valida
activerecord_error_greater_than_start_date: deve essere maggiore della data di partenza
-activerecord_error_not_same_project: doesn't belong to the same project
-activerecord_error_circular_dependency: This relation would create a circular dependency
+activerecord_error_not_same_project: non appartiene allo stesso progetto
+activerecord_error_circular_dependency: Questa relazione creerebbe una dipendenza circolare
-general_fmt_age: %d yr
-general_fmt_age_plural: %d yrs
+general_fmt_age: %d anno
+general_fmt_age_plural: %d anni
general_fmt_date: %%d/%%m/%%Y
general_fmt_datetime: %%d/%%m/%%Y %%I:%%M %%p
general_fmt_datetime_short: %%b %%d, %%I:%%M %%p
@@ -48,6 +48,7 @@ general_text_no: 'no'
general_text_yes: 'si'
general_lang_name: 'Italiano'
general_csv_separator: ','
+general_csv_decimal_separator: '.'
general_csv_encoding: ISO-8859-1
general_pdf_encoding: ISO-8859-1
general_day_names: Lunedì,Martedì,Mercoledì,Giovedì,Venerdì,Sabato,Domenica
@@ -68,16 +69,18 @@ notice_successful_delete: Eliminazione effettuata.
notice_successful_connection: Connessione effettuata.
notice_file_not_found: La pagina desiderata non esiste o è stata rimossa.
notice_locking_conflict: Le informazioni sono state modificate da un altro utente.
-notice_scm_error: La risorsa e/o la versione non esistono nel repository.
-notice_not_authorized: You are not authorized to access this page.
-notice_email_sent: An email was sent to %s
-notice_email_error: An error occurred while sending mail (%s)
-notice_feeds_access_key_reseted: Your RSS access key was reseted.
+notice_not_authorized: Non sei autorizzato ad accedere a questa pagina.
+notice_email_sent: Una e-mail è stata spedita a %s
+notice_email_error: Si è verificato un errore durante l'invio di una e-mail (%s)
+notice_feeds_access_key_reseted: La tua chiave di accesso RSS è stata reimpostata.
-mail_subject_lost_password: Password redMine
+error_scm_not_found: "La risorsa e/o la versione non esistono nel repository."
+error_scm_command_failed: "Si è verificato un errore durante l'accesso al repository: %s"
+
+mail_subject_lost_password: Password %s
mail_body_lost_password: 'Per cambiare la password, usate il seguente collegamento:'
-mail_subject_register: Attivazione utenza redMine
-mail_body_register: 'Per attivare la vostra utenza Redmine, usate il seguente collegamento:'
+mail_subject_register: Attivazione utenza %s
+mail_body_register: 'Per attivare la vostra utenza, usate il seguente collegamento:'
gui_validation_error: 1 errore
gui_validation_error_plural: %d errori
@@ -108,21 +111,21 @@ field_project: Progetto
field_issue: Issue
field_status: Stato
field_notes: Note
-field_is_closed: Chiude il contesto
+field_is_closed: Chiude la segnalazione
field_is_default: Stato predefinito
field_tracker: Tracker
field_subject: Oggetto
field_due_date: Data ultima
field_assigned_to: Assegnato a
field_priority: Priorita'
-field_fixed_version: Versione di fix
+field_fixed_version: Versione prevista
field_user: Utente
field_role: Ruolo
field_homepage: Homepage
field_is_public: Pubblico
field_parent: Sottoprogetto di
-field_is_in_chlog: Contesti mostrati nel changelog
-field_is_in_roadmap: Contesti mostrati nel roadmap
+field_is_in_chlog: Segnalazioni mostrate nel changelog
+field_is_in_roadmap: Segnalazioni mostrate nel roadmap
field_login: Login
field_mail_notification: Notifiche via e-mail
field_admin: Amministratore
@@ -151,16 +154,17 @@ field_comments: Commento
field_url: URL
field_start_page: Pagina principale
field_subproject: Sottoprogetto
-field_hours: Hours
-field_activity: Activity
+field_hours: Ore
+field_activity: AttivitÃ
field_spent_on: Data
-field_identifier: Identifier
-field_is_filter: Used as a filter
-field_issue_to_id: Related issue
-field_delay: Delay
-field_assignable: Issues can be assigned to this role
-field_redirect_existing_links: Redirect existing links
-field_estimated_hours: Estimated time
+field_identifier: Identificativo
+field_is_filter: Usato come filtro
+field_issue_to_id: Segnalazioni correlate
+field_delay: Ritardo
+field_assignable: E' possibile assegnare segnalazioni a questo ruolo
+field_redirect_existing_links: Redirige i collegamenti esistenti
+field_estimated_hours: Tempo stimato
+field_default_value: Stato predefinito
setting_app_title: Titolo applicazione
setting_app_subtitle: Sottotitolo applicazione
@@ -169,7 +173,7 @@ setting_default_language: Lingua di default
setting_login_required: Autenticazione richiesta
setting_self_registration: Auto-registrazione abilitata
setting_attachment_max_size: Massima dimensione allegati
-setting_issues_export_limit: Limite esportazione contesti
+setting_issues_export_limit: Limite esportazione segnalazioni
setting_mail_from: Indirizzo sorgente e-mail
setting_host_name: Nome host
setting_text_formatting: Formattazione testo
@@ -179,9 +183,9 @@ setting_autofetch_changesets: Acquisisci automaticamente le commit
setting_sys_api_enabled: Abilita WS per la gestione del repository
setting_commit_ref_keywords: Referencing keywords
setting_commit_fix_keywords: Fixing keywords
-setting_autologin: Autologin
-setting_date_format: Date format
-setting_cross_project_issue_relations: Allow cross-project issue relations
+setting_autologin: Login automatico
+setting_date_format: Formato data
+setting_cross_project_issue_relations: Consenti la creazione di relazioni tra segnalazioni in progetti differenti
label_user: Utente
label_user_plural: Utenti
@@ -189,12 +193,12 @@ label_user_new: Nuovo utente
label_project: Progetto
label_project_new: Nuovo progetto
label_project_plural: Progetti
-label_project_all: All Projects
+label_project_all: Tutti i progetti
label_project_latest: Ultimi progetti registrati
-label_issue: Contesto
-label_issue_new: Nuovo contesto
-label_issue_plural: Contesti
-label_issue_view_all: Mostra tutti i contesti
+label_issue: Segnalazione
+label_issue_new: Nuova segnalazione
+label_issue_plural: Segnalazioni
+label_issue_view_all: Mostra tutte le segnalazioni
label_document: Documento
label_document_new: Nuovo documento
label_document_plural: Documenti
@@ -209,11 +213,11 @@ label_tracker: Tracker
label_tracker_plural: Tracker
label_tracker_new: Nuovo tracker
label_workflow: Workflow
-label_issue_status: Stato contesti
-label_issue_status_plural: Stati contesto
+label_issue_status: Stato segnalazioni
+label_issue_status_plural: Stati segnalazione
label_issue_status_new: Nuovo stato
-label_issue_category: Categorie contesti
-label_issue_category_plural: Categorie contesto
+label_issue_category: Categorie segnalazioni
+label_issue_category_plural: Categorie segnalazioni
label_issue_category_new: Nuova categoria
label_custom_field: Campo personalizzato
label_custom_field_plural: Campi personalizzati
@@ -233,8 +237,8 @@ label_administration: Amministrazione
label_login: Login
label_logout: Logout
label_help: Aiuto
-label_reported_issues: Contesti segnalati
-label_assigned_to_me_issues: I miei contesti
+label_reported_issues: Segnalazioni
+label_assigned_to_me_issues: Le mie segnalazioni
label_last_login: Ultimo collegamento
label_last_updates: Ultimo aggiornamento
label_last_updates_plural: %d ultimo aggiornamento
@@ -273,7 +277,7 @@ label_news_new: Aggiungi notizia
label_news_plural: Notizie
label_news_latest: Utime notizie
label_news_view_all: Tutte le notizie
-label_change_log: Change log
+label_change_log: Elenco modifiche
label_settings: Impostazioni
label_overview: Panoramica
label_version: Versione
@@ -311,7 +315,7 @@ label_comment_plural: Commenti
label_comment_add: Aggiungi un commento
label_comment_added: Commento aggiunto
label_comment_delete: Elimina commenti
-label_query: Custom query
+label_query: Query personalizzata
label_query_plural: Query personalizzate
label_query_new: Nuova query
label_filter_add: Aggiungi filtro
@@ -322,7 +326,7 @@ label_in_less_than: è minore di
label_in_more_than: è maggiore di
label_in: in
label_today: oggi
-label_this_week: this week
+label_this_week: questa settimana
label_less_than_ago: meno di giorni fa
label_more_than_ago: più di giorni fa
label_ago: giorni fa
@@ -330,7 +334,7 @@ label_contains: contiene
label_not_contains: non contiene
label_day_plural: giorni
label_repository: Repository
-label_browse: Browse
+label_browse: Sfoglia
label_modification: %d modifica
label_modification_plural: %d modifiche
label_revision: Versione
@@ -350,7 +354,7 @@ label_sort_lowest: Sposta in fondo
label_roadmap: Roadmap
label_roadmap_due_in: Da ultimare in
label_roadmap_overdue: %s late
-label_roadmap_no_issues: Nessun contesto per questa versione
+label_roadmap_no_issues: Nessuna segnalazione per questa versione
label_search: Ricerca
label_result_plural: Risultati
label_all_words: Tutte le parole
@@ -365,7 +369,7 @@ label_current_version: Versione corrente
label_preview: Anteprima
label_feed_plural: Feed
label_changes_details: Particolari di tutti i cambiamenti
-label_issue_tracking: tracking dei contesti
+label_issue_tracking: tracking delle segnalazioni
label_spent_time: Tempo impiegato
label_f_hour: %.2f ora
label_f_hour_plural: %.2f ore
@@ -375,53 +379,53 @@ label_statistics: Statistiche
label_commits_per_month: Commit per mese
label_commits_per_author: Commit per autore
label_view_diff: mostra differenze
-label_diff_inline: inline
-label_diff_side_by_side: side by side
+label_diff_inline: in linea
+label_diff_side_by_side: fianco a fianco
label_options: Opzioni
label_copy_workflow_from: Copia workflow da
label_permissions_report: Report permessi
-label_watched_issues: Watched issues
-label_related_issues: Related issues
-label_applied_status: Applied status
-label_loading: Loading...
-label_relation_new: New relation
-label_relation_delete: Delete relation
-label_relates_to: related to
-label_duplicates: duplicates
-label_blocks: blocks
-label_blocked_by: blocked by
-label_precedes: precedes
-label_follows: follows
+label_watched_issues: Segnalazioni osservate
+label_related_issues: Segnalazioni correlate
+label_applied_status: Stato applicato
+label_loading: Caricamento...
+label_relation_new: Nuova relazione
+label_relation_delete: Elimina relazione
+label_relates_to: correlato a
+label_duplicates: duplicati
+label_blocks: blocchi
+label_blocked_by: bloccato da
+label_precedes: precede
+label_follows: segue
label_end_to_start: end to start
label_end_to_end: end to end
label_start_to_start: start to start
label_start_to_end: start to end
-label_stay_logged_in: Stay logged in
-label_disabled: disabled
-label_show_completed_versions: Show completed versions
-label_me: me
+label_stay_logged_in: Rimani collegato
+label_disabled: disabilitato
+label_show_completed_versions: Mostra versioni completate
+label_me: io
label_board: Forum
-label_board_new: New forum
-label_board_plural: Forums
-label_topic_plural: Topics
-label_message_plural: Messages
-label_message_last: Last message
-label_message_new: New message
-label_reply_plural: Replies
-label_send_information: Send account information to the user
-label_year: Year
-label_month: Month
-label_week: Week
-label_date_from: From
-label_date_to: To
-label_language_based: Language based
-label_sort_by: Sort by %s
-label_send_test_email: Send a test email
-label_feeds_access_key_created_on: RSS access key created %s ago
-label_module_plural: Modules
-label_added_time_by: Added by %s %s ago
-label_updated_time: Updated %s ago
-label_jump_to_a_project: Jump to a project...
+label_board_new: Nuovo forum
+label_board_plural: Forum
+label_topic_plural: Argomenti
+label_message_plural: Messaggi
+label_message_last: Ultimo messaggio
+label_message_new: Nuovo messaggio
+label_reply_plural: Risposte
+label_send_information: Invia all'utente le informazioni relative all'account
+label_year: Anno
+label_month: Mese
+label_week: Settimana
+label_date_from: Da
+label_date_to: A
+label_language_based: Basato sul linguaggio
+label_sort_by: Ordina per %s
+label_send_test_email: Invia una e-mail di test
+label_feeds_access_key_created_on: chiave di accesso RSS creata %s fa
+label_module_plural: Moduli
+label_added_time_by: Aggiunto da %s %s fa
+label_updated_time: Aggiornato %s fa
+label_jump_to_a_project: Vai al progetto...
button_login: Login
button_submit: Invia
@@ -448,13 +452,13 @@ button_activate: Attiva
button_sort: Ordina
button_log_time: Registra tempo
button_rollback: Ripristina questa versione
-button_watch: Watch
-button_unwatch: Unwatch
-button_reply: Reply
-button_archive: Archive
-button_unarchive: Unarchive
+button_watch: Osserva
+button_unwatch: Dimentica
+button_reply: Rispondi
+button_archive: Archivia
+button_unarchive: Ripristina
button_reset: Reset
-button_rename: Rename
+button_rename: Rinomina
status_active: attivo
status_registered: registrato
@@ -472,32 +476,32 @@ text_journal_deleted: cancellato
text_tip_task_begin_day: attività che iniziano in questa giornata
text_tip_task_end_day: attività che terminano in questa giornata
text_tip_task_begin_end_day: attività che iniziano e terminano in questa giornata
-text_project_identifier_info: 'Lower case letters (a-z), numbers and dashes allowed. Once saved, the identifier can not be changed.'
+text_project_identifier_info: "Lettere minuscole (a-z), numeri e trattini permessi. Una volta salvato, l'identificativo non può essere modificato."
text_caracters_maximum: massimo %d caratteri.
text_length_between: Lunghezza compresa tra %d e %d caratteri.
text_tracker_no_workflow: Nessun workflow definito per questo tracker
-text_unallowed_characters: Unallowed characters
-text_comma_separated: Multiple values allowed (comma separated).
+text_unallowed_characters: Caratteri non permessi
+text_comma_separated: Valori multipli permessi (separati da virgola).
text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages
-text_issue_added: "E' stata segnalata l'anomalia %s."
-text_issue_updated: "L'anomalia %s e' stata aggiornata."
+text_issue_added: "E' stata segnalata l'anomalia %s da %s."
+text_issue_updated: "L'anomalia %s e' stata aggiornata da %s."
text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content ?
-text_issue_category_destroy_question: Some issues (%d) are assigned to this category. What do you want to do ?
-text_issue_category_destroy_assignments: Remove category assignments
-text_issue_category_reassign_to: Reassing issues to this category
+text_issue_category_destroy_question: Alcune segnalazioni (%d) risultano assegnate a questa categoria. Cosa vuoi fare ?
+text_issue_category_destroy_assignments: Rimuovi gli assegnamenti a questa categoria
+text_issue_category_reassign_to: Riassegna segnalazioni a questa categoria
default_role_manager: Manager
default_role_developper: Sviluppatore
default_role_reporter: Reporter
-default_tracker_bug: Contesto
+default_tracker_bug: Segnalazione
default_tracker_feature: Funzione
default_tracker_support: Supporto
-default_issue_status_new: Nuovo/a
-default_issue_status_assigned: Assegnato/a
-default_issue_status_resolved: Risolto/a
+default_issue_status_new: Nuovo
+default_issue_status_assigned: Assegnato
+default_issue_status_resolved: Risolto
default_issue_status_feedback: Feedback
-default_issue_status_closed: Chiuso/a
-default_issue_status_rejected: Rifiutato/a
+default_issue_status_closed: Chiuso
+default_issue_status_rejected: Rifiutato
default_doc_category_user: Documentazione utente
default_doc_category_tech: Documentazione tecnica
default_priority_low: Bassa
@@ -505,42 +509,131 @@ default_priority_normal: Normale
default_priority_high: Alta
default_priority_urgent: Urgente
default_priority_immediate: Immediata
-default_activity_design: Design
-default_activity_development: Development
+default_activity_design: Progettazione
+default_activity_development: Sviluppo
-enumeration_issue_priorities: Priorità contesti
+enumeration_issue_priorities: Priorità segnalazioni
enumeration_doc_categories: Categorie di documenti
enumeration_activities: Attività (time tracking)
-label_file_plural: Files
-label_changeset_plural: Changesets
-field_column_names: Columns
-label_default_columns: Default columns
-setting_issue_list_default_columns: Default columns displayed on the issue list
-setting_repositories_encodings: Repositories encodings
-notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit."
-label_bulk_edit_selected_issues: Bulk edit selected issues
-label_no_change_option: (No change)
-notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s."
-label_theme: Theme
-label_default: Default
-label_search_titles_only: Search titles only
-label_nobody: nobody
-button_change_password: Change password
+label_file_plural: File
+label_changeset_plural: Changeset
+field_column_names: Colonne
+label_default_columns: Colonne predefinite
+setting_issue_list_default_columns: Colonne predefinite mostrate nell'elenco segnalazioni
+setting_repositories_encodings: Codifiche dei repository
+notice_no_issue_selected: "Nessuna segnalazione selezionata! Seleziona le segnalazioni che intendi modificare."
+label_bulk_edit_selected_issues: Modifica massiva delle segnalazioni selezionate
+label_no_change_option: (Nessuna modifica)
+notice_failed_to_save_issues: "Impossibile salvare %d segnalazioni su %d selezionate: %s."
+label_theme: Tema
+label_default: Predefinito
+label_search_titles_only: Cerca solo nei titoli
+label_nobody: nessuno
+button_change_password: Modifica password
text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)."
-label_user_mail_option_selected: "For any event on the selected projects only..."
-label_user_mail_option_all: "For any event on all my projects"
-label_user_mail_option_none: "Only for things I watch or I'm involved in"
-setting_emails_footer: Emails footer
+label_user_mail_option_selected: "Solo per gli eventi relativi ai progetti selezionati..."
+label_user_mail_option_all: "Per ogni evento relativo ad uno dei miei progetti"
+label_user_mail_option_none: "Solo per argomenti che osservo o che mi riguardano"
+setting_emails_footer: Piè di pagina e-mail
label_float: Float
-button_copy: Copy
-mail_body_account_information_external: You can use your "%s" account to log into Redmine.
-mail_body_account_information: Your Redmine account information
-setting_protocol: Protocol
-label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
-setting_time_format: Time format
-label_registration_activation_by_email: account activation by email
-mail_subject_account_activation_request: Redmine account activation request
-mail_body_account_activation_request: 'A new user (%s) has registered. His account his pending your approval:'
-label_registration_automatic_activation: automatic account activation
-label_registration_manual_activation: manual account activation
-notice_account_pending: "Your account was created and is now pending administrator approval."
+button_copy: Copia
+mail_body_account_information_external: Puoi utilizzare il tuo account "%s" per accedere al sistema.
+mail_body_account_information: Le informazioni riguardanti il tuo account
+setting_protocol: Protocollo
+label_user_mail_no_self_notified: "Non voglio notifiche riguardanti modifiche da me apportate"
+setting_time_format: Formato ora
+label_registration_activation_by_email: attivazione account via e-mail
+mail_subject_account_activation_request: %s richiesta attivazione account
+mail_body_account_activation_request: 'Un nuovo utente (%s) ha effettuato la registrazione. Il suo account è in attesa di abilitazione da parte tua:'
+label_registration_automatic_activation: attivazione account automatica
+label_registration_manual_activation: attivazione account manuale
+notice_account_pending: "Il tuo account è stato creato ed è in attesa di attivazione da parte dell'amministratore."
+field_time_zone: Time zone
+text_caracters_minimum: Deve essere lungo almeno %d caratteri.
+setting_bcc_recipients: Destinatari in copia nascosta (bcc)
+button_annotate: Annota
+label_issues_by: Segnalazioni di %s
+field_searchable: Ricercabile
+label_display_per_page: 'Per pagina: %s'
+setting_per_page_options: Opzioni oggetti per pagina
+label_age: EtÃ
+notice_default_data_loaded: Configurazione di default caricata con successo.
+text_load_default_configuration: Carica la configurazione di default
+text_no_configuration_data: "Ruoli, tracker, stati delle segnalazioni e workflow non sono stati ancora configurati.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
+error_can_t_load_default_data: "Non è stato possibile caricare la configurazione di default : %s"
+button_update: Aggiorna
+label_change_properties: Modifica le proprietÃ
+label_general: Generale
+label_repository_plural: Repository
+label_associated_revisions: Revisioni associate
+setting_user_format: Formato visualizzazione utenti
+text_status_changed_by_changeset: Applicata nel changeset %s.
+label_more: Altro
+text_issues_destroy_confirmation: 'Sei sicuro di voler eliminare le segnalazioni selezionate?'
+label_scm: SCM
+text_select_project_modules: 'Seleziona i moduli abilitati per questo progetto:'
+label_issue_added: Segnalazioni aggiunte
+label_issue_updated: Segnalazioni aggiornate
+label_document_added: Documenti aggiunti
+label_message_posted: Messaggi aggiunti
+label_file_added: File aggiunti
+label_news_added: Notizie aggiunte
+project_module_boards: Boards
+project_module_issue_tracking: Tracking delle segnalazioni
+project_module_wiki: Wiki
+project_module_files: File
+project_module_documents: Documenti
+project_module_repository: Repository
+project_module_news: Notizie
+project_module_time_tracking: Time tracking
+text_file_repository_writable: Repository dei file scrivibile
+text_default_administrator_account_changed: L'account amministrativo di default è stato modificato
+text_rmagick_available: RMagick disponibile (opzionale)
+button_configure: Configura
+label_plugins: Plugin
+label_ldap_authentication: Autenticazione LDAP
+label_downloads_abbr: D/L
+label_this_month: questo mese
+label_last_n_days: ultimi %d giorni
+label_all_time: sempre
+label_this_year: quest'anno
+label_date_range: Intervallo di date
+label_last_week: ultima settimana
+label_yesterday: ieri
+label_last_month: ultimo mese
+label_add_another_file: Aggiungi un altro file
+label_optional_description: Descrizione opzionale
+text_destroy_time_entries_question: %.02f ore risultano spese sulle segnalazioni che stai per cancellare. Cosa vuoi fare ?
+error_issue_not_found_in_project: 'La segnalazione non è stata trovata o non appartiene al progetto'
+text_assign_time_entries_to_project: Assegna le ore segnalate al progetto
+text_destroy_time_entries: Elimina le ore segnalate
+text_reassign_time_entries: 'Riassegna le ore a questa segnalazione:'
+setting_activity_days_default: Giorni mostrati sulle attività di progetto
+label_chronological_order: In ordine cronologico
+field_comments_sorting: Mostra commenti
+label_reverse_chronological_order: In ordine cronologico inverso
+label_preferences: Preferenze
+setting_display_subprojects_issues: Mostra le segnalazioni dei sottoprogetti nel progetto principale per default
+label_overall_activity: Attività generale
+setting_default_projects_public: I nuovi progetti sono pubblici per default
+error_scm_annotate: "L'oggetto non esiste o non può essere annotato."
+label_planning: Pianificazione
+text_subprojects_destroy_warning: 'Anche i suoi sottoprogetti: %s verranno eliminati.'
+label_and_its_subprojects: %s ed i suoi sottoprogetti
+mail_body_reminder: "%d segnalazioni che ti sono state assegnate scadranno nei prossimi %d giorni:"
+mail_subject_reminder: "%d segnalazioni in scadenza nei prossimi giorni"
+text_user_wrote: '%s ha scritto:'
+label_duplicated_by: duplicato da
+setting_enabled_scm: SCM abilitato
+text_enumeration_category_reassign_to: 'Riassegnale a questo valore:'
+text_enumeration_destroy_question: '%d oggetti hanno un assegnamento su questo valore.'
+label_incoming_emails: E-mail in arrivo
+label_generate_key: Genera una chiave
+setting_mail_handler_api_enabled: Abilita WS per le e-mail in arrivo
+setting_mail_handler_api_key: chiave API
+text_email_delivery_not_configured: "La consegna via e-mail non è configurata e le notifiche sono disabilitate.\nConfigura il tuo server SMTP in config/email.yml e riavvia l'applicazione per abilitarle."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/ja.yml b/lang/ja.yml
index 86a104d15..dda73dc26 100644
--- a/lang/ja.yml
+++ b/lang/ja.yml
@@ -7,7 +7,7 @@ actionview_datehelper_select_month_prefix:
actionview_datehelper_select_year_prefix:
actionview_datehelper_select_year_suffix: 月
actionview_datehelper_time_in_words_day: 1æ—¥
-actionview_datehelper_time_in_words_day_plural: %d日間
+actionview_datehelper_time_in_words_day_plural: %dæ—¥
actionview_datehelper_time_in_words_hour_about: 約1時間
actionview_datehelper_time_in_words_hour_about_plural: 約%d時間
actionview_datehelper_time_in_words_hour_about_single: 約1時間
@@ -49,8 +49,9 @@ general_text_no: 'ã„ã„ãˆ'
general_text_yes: 'ã¯ã„'
general_lang_name: 'Japanese (日本語)'
general_csv_separator: ','
+general_csv_decimal_separator: '.'
general_csv_encoding: SJIS
-general_pdf_encoding: SJIS
+general_pdf_encoding: UTF-8
general_day_names: 月曜日,ç«æ›œæ—¥,水曜日,木曜日,金曜日,土曜日,日曜日
general_first_day_of_week: '7'
@@ -69,16 +70,18 @@ notice_successful_delete: 削除ã—ã¾ã—ãŸã€‚
notice_successful_connection: 接続ã—ã¾ã—ãŸã€‚
notice_file_not_found: アクセスã—よã†ã¨ã—ãŸãƒšãƒ¼ã‚¸ã¯å˜åœ¨ã—ãªã„ã‹å‰Šé™¤ã•れã¦ã„ã¾ã™ã€‚
notice_locking_conflict: 別ã®ãƒ¦ãƒ¼ã‚¶ãŒãƒ‡ãƒ¼ã‚¿ã‚’æ›´æ–°ã—ã¦ã„ã¾ã™ã€‚
-notice_scm_error: リãƒã‚¸ãƒˆãƒªã«ã€ã‚¨ãƒ³ãƒˆãƒª/リビジョンãŒå˜åœ¨ã—ã¾ã›ã‚“。
notice_not_authorized: ã“ã®ãƒšãƒ¼ã‚¸ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯èªè¨¼ãŒå¿…è¦ã§ã™ã€‚
notice_email_sent: %så®›ã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ã¾ã—ãŸã€‚
-notice_email_error: メールé€ä¿¡ä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—㟠(%s)
+notice_email_error: メールé€ä¿¡ä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ(%s)
notice_feeds_access_key_reseted: RSSアクセスã‚ãƒ¼ã‚’åˆæœŸåŒ–ã—ã¾ã—ãŸã€‚
-mail_subject_lost_password: redMineパスワード
+error_scm_not_found: リãƒã‚¸ãƒˆãƒªã«ã€ã‚¨ãƒ³ãƒˆãƒª/リビジョンãŒå˜åœ¨ã—ã¾ã›ã‚“。
+error_scm_command_failed: "リãƒã‚¸ãƒˆãƒªã¸ã‚¢ã‚¯ã‚»ã‚¹ã—よã†ã¨ã—ã¦ã‚¨ãƒ©ãƒ¼ã«ãªã‚Šã¾ã—ãŸ: %s"
+
+mail_subject_lost_password: %sパスワード
mail_body_lost_password: 'パスワードを変更ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ãƒªãƒ³ã‚¯ã‚’ãŸã©ã£ã¦ãã ã•ã„:'
-mail_subject_register: redMineã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒæœ‰åйã«ãªã‚Šã¾ã—ãŸ
-mail_body_register: 'Redmine アカウントをアクティブã«ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ãƒªãƒ³ã‚¯ã‚’ãŸã©ã£ã¦ãã ã•ã„:'
+mail_subject_register: %sアカウントã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–化
+mail_body_register: 'アカウントをアクティブã«ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ãƒªãƒ³ã‚¯ã‚’ãŸã©ã£ã¦ãã ã•ã„:'
gui_validation_error: 1ä»¶ã®ã‚¨ãƒ©ãƒ¼
gui_validation_error_plural: %dä»¶ã®ã‚¨ãƒ©ãƒ¼
@@ -106,24 +109,24 @@ field_value: 値
field_category: カテゴリ
field_title: タイトル
field_project: プãƒã‚¸ã‚§ã‚¯ãƒˆ
-field_issue: å•題
+field_issue: ãƒã‚±ãƒƒãƒˆ
field_status: ステータス
field_notes: 注記
-field_is_closed: 終了ã—ãŸå•題
+field_is_closed: 終了ã—ãŸãƒã‚±ãƒƒãƒˆ
field_is_default: デフォルトã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹
field_tracker: トラッカー
field_subject: 題å
field_due_date: æœŸé™æ—¥
field_assigned_to: 担当者
field_priority: 優先度
-field_fixed_version: ä¿®æ£ã•れãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³
+field_fixed_version: Target version
field_user: ユーザ
field_role: 役割
field_homepage: ホームページ
field_is_public: 公開
field_parent: 親プãƒã‚¸ã‚§ã‚¯ãƒˆå
-field_is_in_chlog: 変更記録ã«è¡¨ç¤ºã•れã¦ã„ã‚‹å•題
-field_is_in_roadmap: ãƒãƒ¼ãƒ‰ãƒžãƒƒãƒ—ã«è¡¨ç¤ºã•れã¦ã„ã‚‹å•題
+field_is_in_chlog: 変更記録ã«è¡¨ç¤ºã•れã¦ã„ã‚‹ãƒã‚±ãƒƒãƒˆ
+field_is_in_roadmap: ãƒãƒ¼ãƒ‰ãƒžãƒƒãƒ—ã«è¡¨ç¤ºã•れã¦ã„ã‚‹ãƒã‚±ãƒƒãƒˆ
field_login: ãƒã‚°ã‚¤ãƒ³
field_mail_notification: メール通知
field_admin: 管ç†è€…
@@ -157,11 +160,12 @@ field_activity: 活動
field_spent_on: 日付
field_identifier: è˜åˆ¥å
field_is_filter: フィルタã¨ã—ã¦ä½¿ã†
-field_issue_to_id: 関連ã™ã‚‹å•題
+field_issue_to_id: 関連ã™ã‚‹ãƒã‚±ãƒƒãƒˆ
field_delay: é…å»¶
-field_assignable: Issues can be assigned to this role
-field_redirect_existing_links: Redirect existing links
+field_assignable: ãƒã‚±ãƒƒãƒˆã¯ã“ã®ãƒãƒ¼ãƒ«ã«å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™
+field_redirect_existing_links: æ—¢å˜ã®ãƒªãƒ³ã‚¯ã‚’リダイレクトã™ã‚‹
field_estimated_hours: 予定工数
+field_default_value: デフォルトã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹
setting_app_title: アプリケーションã®ã‚¿ã‚¤ãƒˆãƒ«
setting_app_subtitle: アプリケーションã®ã‚µãƒ–タイトル
@@ -170,7 +174,7 @@ setting_default_language: 既定ã®è¨€èªž
setting_login_required: èªè¨¼ãŒå¿…è¦
setting_self_registration: ユーザã¯è‡ªåˆ†ã§ç™»éŒ²ã§ãã‚‹
setting_attachment_max_size: æ·»ä»˜ã®æœ€å¤§ã‚µã‚¤ã‚º
-setting_issues_export_limit: 出力ã™ã‚‹å•題数ã®ä¸Šé™
+setting_issues_export_limit: 出力ã™ã‚‹ãƒã‚±ãƒƒãƒˆæ•°ã®ä¸Šé™
setting_mail_from: é€ä¿¡å…ƒãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹
setting_host_name: ホストå
setting_text_formatting: テã‚ã‚¹ãƒˆã®æ›¸å¼
@@ -182,7 +186,7 @@ setting_commit_ref_keywords: å‚照用ã‚ーワード
setting_commit_fix_keywords: ä¿®æ£ç”¨ã‚ーワード
setting_autologin: 自動ãƒã‚°ã‚¤ãƒ³
setting_date_format: 日付ã®å½¢å¼
-setting_cross_project_issue_relations: ç•°ãªã‚‹ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã®å•題間ã§é–¢ä¿‚ã®è¨å®šã‚’許å¯
+setting_cross_project_issue_relations: ç•°ãªã‚‹ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã®ãƒã‚±ãƒƒãƒˆé–“ã§é–¢ä¿‚ã®è¨å®šã‚’許å¯
label_user: ユーザ
label_user_plural: ユーザ
@@ -192,10 +196,10 @@ label_project_new: æ–°ã—ã„プãƒã‚¸ã‚§ã‚¯ãƒˆ
label_project_plural: プãƒã‚¸ã‚§ã‚¯ãƒˆ
label_project_all: 全プãƒã‚¸ã‚§ã‚¯ãƒˆ
label_project_latest: 最近ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆ
-label_issue: å•題
-label_issue_new: æ–°ã—ã„å•題
-label_issue_plural: å•題
-label_issue_view_all: å•題を全ã¦è¦‹ã‚‹
+label_issue: ãƒã‚±ãƒƒãƒˆ
+label_issue_new: æ–°ã—ã„ãƒã‚±ãƒƒãƒˆ
+label_issue_plural: ãƒã‚±ãƒƒãƒˆ
+label_issue_view_all: ãƒã‚±ãƒƒãƒˆã‚’å…¨ã¦è¦‹ã‚‹
label_document: 文書
label_document_new: æ–°ã—ã„æ–‡æ›¸
label_document_plural: 文書
@@ -210,11 +214,11 @@ label_tracker: トラッカー
label_tracker_plural: トラッカー
label_tracker_new: æ–°ã—ã„トラッカーを作æˆ
label_workflow: ワークフãƒãƒ¼
-label_issue_status: å•題ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹
-label_issue_status_plural: å•題ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹
+label_issue_status: ãƒã‚±ãƒƒãƒˆã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹
+label_issue_status_plural: ãƒã‚±ãƒƒãƒˆã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹
label_issue_status_new: æ–°ã—ã„ステータス
-label_issue_category: å•題ã®ã‚«ãƒ†ã‚´ãƒª
-label_issue_category_plural: å•題ã®ã‚«ãƒ†ã‚´ãƒª
+label_issue_category: ãƒã‚±ãƒƒãƒˆã®ã‚«ãƒ†ã‚´ãƒª
+label_issue_category_plural: ãƒã‚±ãƒƒãƒˆã®ã‚«ãƒ†ã‚´ãƒª
label_issue_category_new: æ–°ã—ã„カテゴリ
label_custom_field: カスタムフィールド
label_custom_field_plural: カスタムフィールド
@@ -234,8 +238,8 @@ label_administration: 管ç†
label_login: ãƒã‚°ã‚¤ãƒ³
label_logout: ãƒã‚°ã‚¢ã‚¦ãƒˆ
label_help: ヘルプ
-label_reported_issues: å ±å‘Šã—ãŸå•題
-label_assigned_to_me_issues: 担当ã—ã¦ã„ã‚‹å•題
+label_reported_issues: å ±å‘Šã—ãŸãƒã‚±ãƒƒãƒˆ
+label_assigned_to_me_issues: 担当ã—ã¦ã„ã‚‹ãƒã‚±ãƒƒãƒˆ
label_last_login: æœ€è¿‘ã®æŽ¥ç¶š
label_last_updates: æœ€è¿‘ã®æ›´æ–°1ä»¶
label_last_updates_plural: æœ€è¿‘ã®æ›´æ–°%dä»¶
@@ -323,7 +327,7 @@ label_in_less_than: 残日数ãŒã“れより多ã„
label_in_more_than: 残日数ãŒã“れより少ãªã„
label_in: 残日数
label_today: 今日
-label_this_week: this week
+label_this_week: ã“ã®é€±
label_less_than_ago: çµŒéŽæ—¥æ•°ãŒã“れより少ãªã„
label_more_than_ago: çµŒéŽæ—¥æ•°ãŒã“れより多ã„
label_ago: æ—¥å‰
@@ -351,7 +355,7 @@ label_sort_lowest: 一番下ã¸
label_roadmap: ãƒãƒ¼ãƒ‰ãƒžãƒƒãƒ—
label_roadmap_due_in: 期日ã¾ã§
label_roadmap_overdue: %s late
-label_roadmap_no_issues: ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«å‘ã‘ã¦ã®å•題ã¯ã‚りã¾ã›ã‚“
+label_roadmap_no_issues: ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«å‘ã‘ã¦ã®ãƒã‚±ãƒƒãƒˆã¯ã‚りã¾ã›ã‚“
label_search: 検索
label_result_plural: çµæžœ
label_all_words: ã™ã¹ã¦ã®å˜èªž
@@ -360,13 +364,13 @@ label_wiki_edit: Wiki編集
label_wiki_edit_plural: Wiki編集
label_wiki_page: Wiki page
label_wiki_page_plural: Wikiページ
-label_index_by_title: 索引
-label_index_by_date: Index by date
+label_index_by_title: 索引(åå‰é †)
+label_index_by_date: 索引(æ—¥ä»˜é †)
label_current_version: 最新版
label_preview: プレビュー
label_feed_plural: フィード
label_changes_details: 全変更ã®è©³ç´°
-label_issue_tracking: å•題トラッã‚ング
+label_issue_tracking: ãƒã‚±ãƒƒãƒˆãƒˆãƒ©ãƒƒã‚ング
label_spent_time: çµŒéŽæ™‚é–“
label_f_hour: %.2f 時間
label_f_hour_plural: %.2f 時間
@@ -381,8 +385,8 @@ label_diff_side_by_side: 横ã«ä¸¦ã¹ã‚‹
label_options: オプション
label_copy_workflow_from: ワークフãƒãƒ¼ã‚’ã“ã“ã‹ã‚‰ã‚³ãƒ”ー
label_permissions_report: 権é™ãƒ¬ãƒãƒ¼ãƒˆ
-label_watched_issues: ウォッãƒä¸ã®å•題
-label_related_issues: 関連ã™ã‚‹å•題
+label_watched_issues: ウォッãƒä¸ã®ãƒã‚±ãƒƒãƒˆ
+label_related_issues: 関連ã™ã‚‹ãƒã‚±ãƒƒãƒˆ
label_applied_status: é©ç”¨ã•れãŸã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹
label_loading: ãƒãƒ¼ãƒ‰ä¸...
label_relation_new: æ–°ã—ã„関連
@@ -410,18 +414,18 @@ label_message_last: 最新ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸
label_message_new: æ–°ã—ã„メッセージ
label_reply_plural: è¿”ç”
label_send_information: ã‚¢ã‚«ã‚¦ãƒ³ãƒˆæƒ…å ±ã‚’ãƒ¦ãƒ¼ã‚¶ã«é€ä¿¡
-label_year: Year
-label_month: Month
-label_week: Week
-label_date_from: From
-label_date_to: To
+label_year: å¹´
+label_month: 月
+label_week: 週
+label_date_from: "日付指定: "
+label_date_to: ã‹ã‚‰
label_language_based: 既定ã®è¨€èªžã®è¨å®šã«å¾“ã†
-label_sort_by: Sort by %s
+label_sort_by: %sã§ä¸¦ã³æ›¿ãˆ
label_send_test_email: テストメールをé€ä¿¡
-label_feeds_access_key_created_on: RSS access key created %s ago
-label_module_plural: Modules
-label_added_time_by: Added by %s %s ago
-label_updated_time: Updated %s ago
+label_feeds_access_key_created_on: RSSアクセスã‚ーã¯%så‰ã«ä½œæˆã•れã¾ã—ãŸ
+label_module_plural: モジュール
+label_added_time_by: %sãŒ%så‰ã«è¿½åŠ ã—ã¾ã—ãŸ
+label_updated_time: %så‰ã«æ›´æ–°ã•れã¾ã—ãŸ
label_jump_to_a_project: プãƒã‚¸ã‚§ã‚¯ãƒˆã¸ç§»å‹•...
button_login: ãƒã‚°ã‚¤ãƒ³
@@ -454,8 +458,8 @@ button_unwatch: ウォッãƒã‚’ã‚„ã‚ã‚‹
button_reply: è¿”ç”
button_archive: 書庫ã«ä¿å˜
button_unarchive: 書庫ã‹ã‚‰æˆ»ã™
-button_reset: Reset
-button_rename: Rename
+button_reset: リセット
+button_rename: åå‰å¤‰æ›´
status_active: 有効
status_registered: 登録
@@ -479,13 +483,13 @@ text_length_between: é•·ã•㯠%d ã‹ã‚‰ %d æ–‡å—ã¾ã§ã§ã™ã€‚
text_tracker_no_workflow: ã“ã®ãƒˆãƒ©ãƒƒã‚«ãƒ¼ã«ãƒ¯ãƒ¼ã‚¯ãƒ•ãƒãƒ¼ãŒå®šç¾©ã•れã¦ã„ã¾ã›ã‚“
text_unallowed_characters: 使ãˆãªã„æ–‡å—ã§ã™
text_comma_separated: (カンマã§åŒºåˆ‡ã£ãŸ)複数ã®å€¤ãŒä½¿ãˆã¾ã™
-text_issues_ref_in_commit_messages: コミットメッセージ内ã§å•題ã®å‚ç…§/ä¿®æ£
-text_issue_added: å•題 %s ãŒå ±å‘Šã•れã¾ã—ãŸã€‚
-text_issue_updated: å•題 %s ãŒæ›´æ–°ã•れã¾ã—ãŸã€‚
-text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content ?
-text_issue_category_destroy_question: Some issues (%d) are assigned to this category. What do you want to do ?
-text_issue_category_destroy_assignments: Remove category assignments
-text_issue_category_reassign_to: Reassing issues to this category
+text_issues_ref_in_commit_messages: コミットメッセージ内ã§ãƒã‚±ãƒƒãƒˆã®å‚ç…§/ä¿®æ£
+text_issue_added: ãƒã‚±ãƒƒãƒˆ %s ãŒå ±å‘Šã•れã¾ã—ãŸã€‚ (by %s)
+text_issue_updated: ãƒã‚±ãƒƒãƒˆ %s ãŒæ›´æ–°ã•れã¾ã—ãŸã€‚ (by %s)
+text_wiki_destroy_confirmation: 本当ã«ã“ã®wikiã¨ãã®å†…容ã®å…¨ã¦ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ
+text_issue_category_destroy_question: ã“ã®ã‚«ãƒ†ã‚´ãƒªã«å‰²ã‚Šå½“ã¦æ¸ˆã¿ã®ãƒã‚±ãƒƒãƒˆ(%d)ãŒã‚りã¾ã™ã€‚何をã—よã†ã¨ã—ã¦ã„ã¾ã™ã‹ï¼Ÿ
+text_issue_category_destroy_assignments: カテゴリã®å‰²ã‚Šå½“ã¦ã‚’削除ã™ã‚‹
+text_issue_category_reassign_to: ãƒã‚±ãƒƒãƒˆã‚’ã“ã®ã‚«ãƒ†ã‚´ãƒªã«å†å‰²ã‚Šå½“ã¦ã™ã‚‹
default_role_manager: 管ç†è€…
default_role_developper: 開発者
@@ -509,39 +513,128 @@ default_priority_immediate: 今ã™ã
default_activity_design: デザイン作æ¥
default_activity_development: 開発作æ¥
-enumeration_issue_priorities: å•題ã®å„ªå…ˆåº¦
+enumeration_issue_priorities: ãƒã‚±ãƒƒãƒˆã®å„ªå…ˆåº¦
enumeration_doc_categories: 文書カテゴリ
enumeration_activities: 作æ¥åˆ†é¡ž (時間トラッã‚ング)
-label_file_plural: Files
-label_changeset_plural: Changesets
+label_file_plural: ファイル
+label_changeset_plural: ãƒã‚§ãƒ³ã‚¸ã‚»ãƒƒãƒˆ
field_column_names: é …ç›®
label_default_columns: 既定ã®é …ç›®
-setting_issue_list_default_columns: å•題ã®ä¸€è¦§ã§è¡¨ç¤ºã™ã‚‹é …ç›®
+setting_issue_list_default_columns: ãƒã‚±ãƒƒãƒˆã®ä¸€è¦§ã§è¡¨ç¤ºã™ã‚‹é …ç›®
setting_repositories_encodings: リãƒã‚¸ãƒˆãƒªã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°
-notice_no_issue_selected: "å•題ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“! 更新対象ã®å•é¡Œã‚’é¸æŠžã—ã¦ãã ã•ã„。"
-label_bulk_edit_selected_issues: å•題ã®ä¸€æ‹¬ç·¨é›†
+notice_no_issue_selected: "ãƒã‚±ãƒƒãƒˆãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“! 更新対象ã®ãƒã‚±ãƒƒãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。"
+label_bulk_edit_selected_issues: ãƒã‚±ãƒƒãƒˆã®ä¸€æ‹¬ç·¨é›†
label_no_change_option: (変更無ã—)
-notice_failed_to_save_issues: "%dä»¶ã®å•題ãŒä¿å˜ã§ãã¾ã›ã‚“ã§ã—ãŸ(%dä»¶é¸æŠžã®ã†ã¡) : %s."
+notice_failed_to_save_issues: "%dä»¶ã®ãƒã‚±ãƒƒãƒˆãŒä¿å˜ã§ãã¾ã›ã‚“ã§ã—ãŸ(%dä»¶é¸æŠžã®ã†ã¡) : %s."
label_theme: テーマ
label_default: 既定
label_search_titles_only: タイトルã®ã¿
label_nobody: nobody
button_change_password: パスワード変更
-text_user_mail_option: "æœªé¸æŠžã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã§ã¯ã€ã‚¦ã‚©ãƒƒãƒã¾ãŸã¯é–¢ä¿‚ã—ã¦ã„ã‚‹å•題(例: 自分ãŒå ±å‘Šè€…ã‚‚ã—ãã¯æ‹…当者ã§ã‚ã‚‹å•題)ã®ã¿ãƒ¡ãƒ¼ãƒ«ãŒé€ä¿¡ã•れã¾ã™ã€‚"
+text_user_mail_option: "æœªé¸æŠžã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã§ã¯ã€ã‚¦ã‚©ãƒƒãƒã¾ãŸã¯é–¢ä¿‚ã—ã¦ã„ã‚‹ãƒã‚±ãƒƒãƒˆ(例: 自分ãŒå ±å‘Šè€…ã‚‚ã—ãã¯æ‹…当者ã§ã‚ã‚‹ãƒã‚±ãƒƒãƒˆ)ã®ã¿ãƒ¡ãƒ¼ãƒ«ãŒé€ä¿¡ã•れã¾ã™ã€‚"
label_user_mail_option_selected: "é¸æŠžã—ãŸãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆ..."
-label_user_mail_option_all: "å‚åŠ ã—ã¦ã„るプãƒã‚¸ã‚§ã‚¯ãƒˆã®å…¨ã¦ã®å•題"
-label_user_mail_option_none: "ウォッãƒã¾ãŸã¯é–¢ä¿‚ã—ã¦ã„ã‚‹å•題ã®ã¿"
+label_user_mail_option_all: "å‚åŠ ã—ã¦ã„るプãƒã‚¸ã‚§ã‚¯ãƒˆã®å…¨ã¦ã®ãƒã‚±ãƒƒãƒˆ"
+label_user_mail_option_none: "ウォッãƒã¾ãŸã¯é–¢ä¿‚ã—ã¦ã„ã‚‹ãƒã‚±ãƒƒãƒˆã®ã¿"
setting_emails_footer: メールã®ãƒ•ッタ
label_float: å°æ•°
button_copy: コピー
-mail_body_account_information_external: You can use your "%s" account to log into Redmine.
-mail_body_account_information: Your Redmine account information
-setting_protocol: Protocol
-label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
-setting_time_format: Time format
-label_registration_activation_by_email: account activation by email
-mail_subject_account_activation_request: Redmine account activation request
-mail_body_account_activation_request: 'A new user (%s) has registered. His account his pending your approval:'
-label_registration_automatic_activation: automatic account activation
-label_registration_manual_activation: manual account activation
-notice_account_pending: "Your account was created and is now pending administrator approval."
+mail_body_account_information_external: 「%sã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’使ã£ã¦ã«ãƒã‚°ã‚¤ãƒ³ã§ãã¾ã™ã€‚
+mail_body_account_information: ã‚¢ã‚«ã‚¦ãƒ³ãƒˆæƒ…å ±
+setting_protocol: プãƒãƒˆã‚³ãƒ«
+label_user_mail_no_self_notified: 自分自身ã«ã‚ˆã‚‹å¤‰æ›´ã®é€šçŸ¥ã¯ä¸è¦ã§ã™
+setting_time_format: 時刻ã®å½¢å¼
+label_registration_activation_by_email: メールã§ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’有効化
+mail_subject_account_activation_request: %sã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®æœ‰åŠ¹åŒ–è¦æ±‚
+mail_body_account_activation_request: æ–°ã—ã„ユーザ(%s)ãŒç™»éŒ²ã—ã¦ã„ã¾ã™ã€‚ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯ã‚ãªãŸã®æ‰¿èªå¾…ã¡ã§ã™ï¼š
+label_registration_automatic_activation: 自動ã§ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’有効化
+label_registration_manual_activation: 手動ã§ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’有効化
+notice_account_pending: アカウントã¯ä½œæˆæ¸ˆã¿ã§ã€ç®¡ç†è€…ã®æ‰¿èªå¾…ã¡ã§ã™ã€‚
+field_time_zone: タイムゾーン
+text_caracters_minimum: 最低%dæ–‡å—ã®é•·ã•ãŒå¿…è¦ã§ã™
+setting_bcc_recipients: ブラインドカーボンコピーã§å—ä¿¡(bcc)
+button_annotate: 注釈
+label_issues_by: %s別ã®ãƒã‚±ãƒƒãƒˆ
+field_searchable: Searchable
+label_display_per_page: '1ページã«: %s'
+setting_per_page_options: ページ毎ã®è¡¨ç¤ºä»¶æ•°
+label_age: å¹´é½¢
+notice_default_data_loaded: デフォルトè¨å®šã‚’ãƒãƒ¼ãƒ‰ã—ã¾ã—ãŸã€‚
+text_load_default_configuration: デフォルトè¨å®šã‚’ãƒãƒ¼ãƒ‰
+text_no_configuration_data: "ãƒãƒ¼ãƒ«ã€ãƒˆãƒ©ãƒƒã‚«ãƒ¼ã€ãƒã‚±ãƒƒãƒˆã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã€ãƒ¯ãƒ¼ã‚¯ãƒ•ãƒãƒ¼ãŒã¾ã è¨å®šã•れã¦ã„ã¾ã›ã‚“。\nデフォルトè¨å®šã®ãƒãƒ¼ãƒ‰ã‚’å¼·ããŠå‹§ã‚ã—ã¾ã™ã€‚ãƒãƒ¼ãƒ‰ã—ãŸå¾Œã€ãれを修æ£ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
+error_can_t_load_default_data: "デフォルトè¨å®šãŒãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+button_update: æ›´æ–°
+label_change_properties: プãƒãƒ‘ティã®å¤‰æ›´
+label_general: 全般
+label_repository_plural: リãƒã‚¸ãƒˆãƒª
+label_associated_revisions: 関係ã—ã¦ã„るリビジョン
+setting_user_format: ユーザåã®è¡¨ç¤ºæ›¸å¼
+text_status_changed_by_changeset: ãƒã‚§ãƒ³ã‚¸ã‚»ãƒƒãƒˆ%sã§é©ç”¨ã•れã¾ã—ãŸã€‚
+label_more: ç¶šã
+text_issues_destroy_confirmation: '本当ã«é¸æŠžã—ãŸãƒã‚±ãƒƒãƒˆã‚’削除ã—ã¾ã™ã‹ï¼Ÿ'
+label_scm: SCM
+text_select_project_modules: 'ã“ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã§ä½¿ç”¨ã™ã‚‹ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„:'
+label_issue_added: ãƒã‚±ãƒƒãƒˆãŒè¿½åŠ ã•れã¾ã—ãŸ
+label_issue_updated: ãƒã‚±ãƒƒãƒˆãŒæ›´æ–°ã•れã¾ã—ãŸ
+label_document_added: 文書ãŒè¿½åŠ ã•れã¾ã—ãŸ
+label_message_posted: メッセージãŒè¿½åŠ ã•れã¾ã—ãŸ
+label_file_added: ファイルãŒè¿½åŠ ã•れã¾ã—ãŸ
+label_news_added: ニュースãŒè¿½åŠ ã•れã¾ã—ãŸ
+project_module_boards: フォーラãƒ
+project_module_issue_tracking: ãƒã‚±ãƒƒãƒˆãƒˆãƒ©ãƒƒã‚ング
+project_module_wiki: Wiki
+project_module_files: ファイル
+project_module_documents: 文書
+project_module_repository: リãƒã‚¸ãƒˆãƒª
+project_module_news: ニュース
+project_module_time_tracking: 時間トラッã‚ング
+text_file_repository_writable: ファイルリãƒã‚¸ãƒˆãƒªã«æ›¸ãè¾¼ã¿å¯èƒ½
+text_default_administrator_account_changed: デフォルト管ç†ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¤‰æ›´æ¸ˆ
+text_rmagick_available: RMagickãŒä½¿ç”¨å¯èƒ½ (オプション)
+button_configure: è¨å®š
+label_plugins: プラグイン
+label_ldap_authentication: LDAPèªè¨¼
+label_downloads_abbr: DL
+label_this_month: 今月
+label_last_n_days: 最後ã®%d日間
+label_all_time: 全期間
+label_this_year: 今年
+label_date_range: 日付ã®ç¯„囲
+label_last_week: 先週
+label_yesterday: 昨日
+label_last_month: 先月
+label_add_another_file: 別ã®ãƒ•ァイルを追åŠ
+text_destroy_time_entries_question: ãƒã‚±ãƒƒãƒˆã«è¨˜éŒ²ã•れãŸ%.02f時間を削除ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚何ãŒã—ãŸã„ã®ã§ã™ã‹ï¼Ÿ
+error_issue_not_found_in_project: 'ãƒã‚±ãƒƒãƒˆãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€ã‚‚ã—ãã¯ã“ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã«å±žã—ã¦ã„ã¾ã›ã‚“'
+text_assign_time_entries_to_project: 記録ã•ã‚ŒãŸæ™‚間をプãƒã‚¸ã‚§ã‚¯ãƒˆã«å‰²ã‚Šå½“ã¦
+label_optional_description: ä»»æ„ã®ã‚³ãƒ¡ãƒ³ãƒˆ
+text_destroy_time_entries: 記録ã•ã‚ŒãŸæ™‚間を削除
+text_reassign_time_entries: '記録ã•ã‚ŒãŸæ™‚é–“ã‚’ã“ã®ãƒã‚±ãƒƒãƒˆã«å†å‰²ã‚Šå½“ã¦ï¼š'
+setting_activity_days_default: プãƒã‚¸ã‚§ã‚¯ãƒˆã®æ´»å‹•ページã«è¡¨ç¤ºã•れる日数
+label_chronological_order: å¤ã„é †
+field_comments_sorting: コメントを表示
+label_reverse_chronological_order: æ–°ã—ã„é †
+label_preferences: è¨å®š
+setting_display_subprojects_issues: デフォルトã§ã‚µãƒ–プãƒã‚¸ã‚§ã‚¯ãƒˆã®ãƒã‚±ãƒƒãƒˆã‚’メインプãƒã‚¸ã‚§ã‚¯ãƒˆã«è¡¨ç¤ºã™ã‚‹
+label_overall_activity: å…¨ã¦ã®æ´»å‹•
+setting_default_projects_public: ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§æ–°ã—ã„プãƒã‚¸ã‚§ã‚¯ãƒˆã¯å…¬é–‹ã«ã™ã‚‹
+error_scm_annotate: "エントリãŒå˜åœ¨ã—ãªã„ã€ã‚‚ã—ãã¯ã‚¢ãƒŽãƒ†ãƒ¼ãƒˆã§ãã¾ã›ã‚“。"
+label_planning: 計画
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
+label_and_its_subprojects: %s and its subprojects
+mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
+mail_subject_reminder: "%d issue(s) due in the next days"
+text_user_wrote: '%s wrote:'
+label_duplicated_by: duplicated by
+setting_enabled_scm: Enabled SCM
+text_enumeration_category_reassign_to: 'Reassign them to this value:'
+text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
+text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/ko.yml b/lang/ko.yml
index e46a63959..be7eab1fb 100644
--- a/lang/ko.yml
+++ b/lang/ko.yml
@@ -19,22 +19,22 @@ actionview_datehelper_time_in_words_second_less_than: 1ì´ˆ ì´ë‚´
actionview_datehelper_time_in_words_second_less_than_plural: %d ì´ˆ ì´ì „
actionview_instancetag_blank_option: ì„ íƒí•˜ì„¸ìš”
-activerecord_error_inclusion: is not included in the list
-activerecord_error_exclusion: is reserved
-activerecord_error_invalid: is invalid
-activerecord_error_confirmation: doesn't match confirmation
+activerecord_error_inclusion: ì€(는) 목ë¡ì— í¬í•¨ë˜ì–´ 있지 않습니다.
+activerecord_error_exclusion: ì€(는) 예약ë˜ì–´ 있습니다.
+activerecord_error_invalid: ì€(는) ìœ íš¨í•˜ì§€ 않습니다.
+activerecord_error_confirmation: 는 ì œì•½ì¡°ê±´(confirmation)ì— ë§žì§€ 않습니다.
activerecord_error_accepted: must be accepted
-activerecord_error_empty: can't be empty
-activerecord_error_blank: can't be blank
-activerecord_error_too_long: is too long
-activerecord_error_too_short: is too short
-activerecord_error_wrong_length: is the wrong length
-activerecord_error_taken: has already been taken
-activerecord_error_not_a_number: is not a number
-activerecord_error_not_a_date: is not a valid date
-activerecord_error_greater_than_start_date: must be greater than start date
-activerecord_error_not_same_project: doesn't belong to the same project
-activerecord_error_circular_dependency: This relation would create a circular dependency
+activerecord_error_empty: 는 길ì´ê°€ 0ì¼ ìˆ˜ê°€ 없습니다.
+activerecord_error_blank: 는 빈 ê°’ì´ì–´ì„œëŠ” 안ë©ë‹ˆë‹¤.
+activerecord_error_too_long: 는 너무 ê¹ë‹ˆë‹¤.
+activerecord_error_too_short: 는 너무 짧습니다.
+activerecord_error_wrong_length: 는 ìž˜ëª»ëœ ê¸¸ì´ìž…니다.
+activerecord_error_taken: ê°€ ì´ë¯¸ ê°’ì„ ê°€ì§€ê³ ìžˆìŠµë‹ˆë‹¤.
+activerecord_error_not_a_number: 는 숫ìžê°€ 아닙니다.
+activerecord_error_not_a_date: 는 ìž˜ëª»ëœ ë‚ ì§œ 값입니다.
+activerecord_error_greater_than_start_date: 는 ì‹œìž‘ë‚ ì§œë³´ë‹¤ 커야 합니다.
+activerecord_error_not_same_project: 는 ê°™ì€ í”„ë¡œì íŠ¸ì— ì†í•´ 있지 않습니다.
+activerecord_error_circular_dependency: ì´ ê´€ê³„ëŠ” 순환 ì˜ì¡´ê´€ê³„를 만들 수있습니다.
general_fmt_age: %d ë…„
general_fmt_age_plural: %d ë…„
@@ -48,8 +48,9 @@ general_text_no: '아니오'
general_text_yes: '예'
general_lang_name: 'Korean (한êµì–´)'
general_csv_separator: ','
+general_csv_decimal_separator: '.'
general_csv_encoding: CP949
-general_pdf_encoding: UHC
+general_pdf_encoding: CP949
general_day_names: 월요ì¼,화요ì¼,수요ì¼,목요ì¼,금요ì¼,í† ìš”ì¼,ì¼ìš”ì¼
general_first_day_of_week: '7'
@@ -68,17 +69,19 @@ notice_successful_delete: ì‚ì œ 성공.
notice_successful_connection: 연결 성공.
notice_file_not_found: ìš”ì²í•˜ì‹ 페ì´ì§€ëŠ” ì‚ì œë˜ì—ˆê±°ë‚˜ 옮겨졌습니다.
notice_locking_conflict: 다른 사용ìžì— ì˜í•´ì„œ ë°ì´í„°ê°€ 변경ë˜ì—ˆìŠµë‹ˆë‹¤.
-notice_scm_error: 소스 ì €ìž¥ì†Œì— í•´ë‹¹ ë‚´ìš©ì´ ì¡´ìž¬í•˜ì§€ 않습니다.
notice_not_authorized: ì´ íŽ˜ì´ì§€ì— ì ‘ê·¼í• ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤.
notice_email_sent: %s 님ì—게 Emailì´ ë°œì†¡ë˜ì—ˆìŠµë‹ˆë‹¤.
-notice_email_error: Emailì„ ì „ì†¡í•˜ëŠ” ê³¼ì •ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤. (%s)
+notice_email_error: ë©”ì¼ì„ ì „ì†¡í•˜ëŠ” ê³¼ì •ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤. (%s)
notice_feeds_access_key_reseted: RSSì— ì ‘ê·¼ê°€ëŠ¥í•œ ì—´ì‡ (key)ê°€ ìƒì„±ë˜ì—ˆìŠµë‹ˆë‹¤.
notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s."
-notice_no_issue_selected: "ë¬¸ì œê°€ ì„ íƒë˜ì§€ 않았습니다. ìˆ˜ì •í•˜ê¸° ì›í•˜ëŠ” ë¬¸ì œë¥¼ ì„ íƒí•˜ì„¸ìš”"
+notice_no_issue_selected: "ì´ìŠˆê°€ ì„ íƒë˜ì§€ 않았습니다. ìˆ˜ì •í•˜ê¸° ì›í•˜ëŠ” ì´ìŠˆë¥¼ ì„ íƒí•˜ì„¸ìš”"
-mail_subject_lost_password: ë‹¹ì‹ ì˜ ë¹„ë°€ë²ˆí˜¸
+error_scm_not_found: 소스 ì €ìž¥ì†Œì— í•´ë‹¹ ë‚´ìš©ì´ ì¡´ìž¬í•˜ì§€ 않습니다.
+error_scm_command_failed: "An error occurred when trying to access the repository: %s"
+
+mail_subject_lost_password: ë‹¹ì‹ ì˜ ë¹„ë°€ë²ˆí˜¸ (%s)
mail_body_lost_password: '비밀번호를 변경하기 위해서 ë§í¬ë¥¼ ì´ìš©í•˜ì„¸ìš”'
-mail_subject_register: ë‹¹ì‹ ì˜ ê³„ì • 활성화
+mail_subject_register: ë‹¹ì‹ ì˜ ê³„ì • 활성화 (%s)
mail_body_register: 'ê³„ì •ì„ í™œì„±í™” 하기 위해서 ë§í¬ë¥¼ ì´ìš©í•˜ì„¸ìš” :'
gui_validation_error: 1 ì—러
@@ -88,9 +91,9 @@ field_name: ì´ë¦„
field_description: 설명
field_summary: 요약
field_is_required: 필수
-field_firstname: 성
-field_lastname: ì´ë¦„
-field_mail: Email
+field_firstname: ì´ë¦„
+field_lastname: 성
+field_mail: ë©”ì¼
field_filename: 파ì¼
field_filesize: í¬ê¸°
field_downloads: 다운로드
@@ -107,24 +110,24 @@ field_value: ê°’
field_category: ì¹´í…Œê³ ë¦¬
field_title: ì œëª©
field_project: 프로ì 트
-field_issue: ë¬¸ì œ
+field_issue: ì´ìŠˆ
field_status: ìƒíƒœ
field_notes: 노트
-field_is_closed: ì™„ë£Œëœ ë¬¸ì œ
+field_is_closed: ì™„ë£Œëœ ì´ìŠˆ
field_is_default: 기본값
field_tracker: 구분
field_subject: ì œëª©
field_due_date: 완료 기한
field_assigned_to: 담당ìž
-field_priority: 심ê°ë„
-field_fixed_version: ê³ ì³ì§„ ë²„ì „
+field_priority: ìš°ì„ ìˆœìœ„
+field_fixed_version: Target version
field_user: ìœ ì €
field_role: ì—í•
field_homepage: 홈페ì´ì§€
field_is_public: 공개
field_parent: ìƒìœ„ 프로ì 트
-field_is_in_chlog: 변화목ë¡(changelog)ì—서 보여지는 ë¬¸ì œë“¤
-field_is_in_roadmap: 로드맵ì—서 보여지는 ë¬¸ì œë“¤
+field_is_in_chlog: 변경ì´ë ¥(changelog)ì—서 보여지는 ì´ìŠˆë“¤
+field_is_in_roadmap: 로드맵ì—서 보여지는 ì´ìŠˆë“¤
field_login: 로그ì¸
field_mail_notification: ë©”ì¼ ì•Œë¦¼
field_admin: 관리ìž
@@ -136,58 +139,59 @@ field_new_password: ì‹ ê·œ 비밀번호
field_password_confirmation: 비밀번호 확ì¸
field_version: ë²„ì „
field_type: 타입
-field_host: Host
-field_port: Port
+field_host: 호스트
+field_port: í¬íЏ
field_account: ê³„ì •
field_base_dn: Base DN
-field_attr_login: Login attribute
-field_attr_firstname: Firstname attribute
-field_attr_lastname: Lastname attribute
-field_attr_mail: Email attribute
+field_attr_login: ë¡œê·¸ì¸ ì†ì„±
+field_attr_firstname: ì´ë¦„ ì†ì„±
+field_attr_lastname: 성 ì†ì„±
+field_attr_mail: ë©”ì¼ ì†ì„±
field_onthefly: On-the-fly user creation
field_start_date: 시작시간
field_done_ratio: 완료 %%
field_auth_source: ì¸ì¦ 방법
-field_hide_mail: 내 Email주소 숨기기
+field_hide_mail: ë‚´ ë©”ì¼ ì£¼ì†Œ 숨기기
field_comments: 코멘트
field_url: URL
field_start_page: 시작 페ì´ì§€
field_subproject: 서브 프로ì 트
field_hours: 시간
-field_activity: Activity
-field_spent_on: Date
+field_activity: 작업종류
+field_spent_on: 작업시간
field_identifier: ì‹ë³„ìž
-field_is_filter: Used as a filter
-field_issue_to_id: ì—°ê´€ëœ ë¬¸ì œ
+field_is_filter: 필터로 사용ë¨
+field_issue_to_id: ì—°ê´€ëœ ì´ìŠˆ
field_delay: 지연
-field_assignable: ì´ ì—í• ì— í• ë‹¹ë 수 있는 ë¬¸ì œ
+field_assignable: ì´ ì—í• ì— í• ë‹¹ë 수 있는 ì´ìŠˆ
field_redirect_existing_links: Redirect existing links
field_estimated_hours: ì¶”ì •ì‹œê°„
field_column_names: 컬럼
+field_default_value: 기본값
-setting_app_title: Application title
-setting_app_subtitle: Application subtitle
-setting_welcome_text: Welcome text
-setting_default_language: Default language
-setting_login_required: Authent. required
+setting_app_title: ë ˆë“œë§ˆì¸ ì œëª©
+setting_app_subtitle: ë ˆë“œë§ˆì¸ ë¶€ì œëª©
+setting_welcome_text: í™˜ì˜ ë©”ì‹œì§€
+setting_default_language: 기본 언어
+setting_login_required: ì¸ì¦ì´ 필요함.
setting_self_registration: Self-registration
-setting_attachment_max_size: Attachment max. size
+setting_attachment_max_size: 최대 ì²¨ë¶€íŒŒì¼ í¬ê¸°
setting_issues_export_limit: Issues export limit
setting_mail_from: Emission mail address
-setting_host_name: Host name
-setting_text_formatting: Text formatting
-setting_wiki_compression: Wiki history compression
+setting_host_name: 호스트 ì´ë¦„
+setting_text_formatting: í…스트 형ì‹
+setting_wiki_compression: 위키 기ë¡(history) ì••ì¶•
setting_feeds_limit: Feed content limit
setting_autofetch_changesets: Autofetch commits
setting_sys_api_enabled: Enable WS for repository management
-setting_commit_ref_keywords: Referencing keywords
-setting_commit_fix_keywords: Fixing keywords
-setting_autologin: Autologin
-setting_date_format: Date format
-setting_cross_project_issue_relations: Allow cross-project issue relations
-setting_issue_list_default_columns: Default columns displayed on the issue list
-setting_repositories_encodings: Repositories encodings
-setting_emails_footer: Emails footer
+setting_commit_ref_keywords: ì´ìŠˆ ì°¸ì¡°ì— ì‚¬ìš©í• í‚¤ì›Œë“œë“¤
+setting_commit_fix_keywords: ì´ìŠˆ í•´ê²°ì— ì‚¬ìš©í• í‚¤ì›Œë“œë“¤
+setting_autologin: ìžë™ 로그ì¸
+setting_date_format: ë‚ ì§œ 형ì‹
+setting_cross_project_issue_relations: 프로ì 트간 ì´ìŠˆì— ê´€ë ¨ì„ ë§ºëŠ” ê²ƒì„ í—ˆìš©
+setting_issue_list_default_columns: ì´ìŠˆ 목ë¡ì— 보여줄 기본 컬럼들
+setting_repositories_encodings: ì €ìž¥ì†Œ ì¸ì½”딩
+setting_emails_footer: ë©”ì¼ ê¼¬ë¦¬
label_user: 사용ìž
label_user_plural: 사용ìžê´€ë¦¬
@@ -197,10 +201,10 @@ label_project_new: ì‹ ê·œ 프로ì 트
label_project_plural: 프로ì 트
label_project_all: ëª¨ë“ í”„ë¡œì 트
label_project_latest: 최근 프로ì 트
-label_issue: ë¬¸ì œ 보기
-label_issue_new: 새로운 ë¬¸ì œ
-label_issue_plural: ë¬¸ì œ 보기
-label_issue_view_all: ëª¨ë“ ë¬¸ì œ 보기
+label_issue: ì´ìŠˆ 보기
+label_issue_new: 새 ì´ìŠˆë§Œë“¤ê¸°
+label_issue_plural: ì´ìŠˆ 보기
+label_issue_view_all: ëª¨ë“ ì´ìŠˆ 보기
label_document: 문서
label_document_new: 새로운 문서
label_document_plural: 문서
@@ -211,13 +215,13 @@ label_role_and_permissions: 권한관리
label_member: 담당ìž
label_member_new: 새로운 담당ìž
label_member_plural: 담당ìž
-label_tracker: ë¬¸ì œ ìœ í˜•
-label_tracker_plural: ë¬¸ì œ ìœ í˜•
-label_tracker_new: 새로운 ë¬¸ì œ ìœ í˜•
+label_tracker: ì´ìŠˆ ìœ í˜•
+label_tracker_plural: ì´ìŠˆ ìœ í˜•
+label_tracker_new: 새로운 ì´ìŠˆ ìœ í˜•
label_workflow: 워í¬í”Œë¡œ(Workflow)
-label_issue_status: ë¬¸ì œ ìƒíƒœ
-label_issue_status_plural: ë¬¸ì œ ìƒíƒœ
-label_issue_status_new: 새로운 ë¬¸ì œ ìƒíƒœ
+label_issue_status: ì´ìŠˆ ìƒíƒœ
+label_issue_status_plural: ì´ìŠˆ ìƒíƒœ
+label_issue_status_new: 새로운 ì´ìŠˆ ìƒíƒœ
label_issue_category: ì¹´í…Œê³ ë¦¬
label_issue_category_plural: ì¹´í…Œê³ ë¦¬
label_issue_category_new: 새 ì¹´í…Œê³ ë¦¬
@@ -230,7 +234,7 @@ label_information: ì •ë³´
label_information_plural: ì •ë³´
label_please_login: 로그ì¸í•˜ì„¸ìš”.
label_register: 등ë¡
-label_password_lost: Lost password
+label_password_lost: 비밀번호 찾기
label_home: 초기화면
label_my_page: 내페ì´ì§€
label_my_account: ë‚´ê³„ì •
@@ -239,8 +243,8 @@ label_administration: 관리ìž
label_login: 로그ì¸
label_logout: 로그아웃
label_help: ë„움ë§
-label_reported_issues: ë³´ê³ ëœ ë¬¸ì œ
-label_assigned_to_me_issues: 나ì—게 í• ë‹¹ëœ ë¬¸ì œ
+label_reported_issues: ë³´ê³ ëœ ì´ìŠˆ
+label_assigned_to_me_issues: 나ì—게 í• ë‹¹ëœ ì´ìŠˆ
label_last_login: 최종 ì ‘ì†
label_last_updates: 최종 변경 ë‚´ì—
label_last_updates_plural: 최종변경 %d
@@ -257,11 +261,11 @@ label_subproject_plural: 서브 프로ì 트
label_min_max_length: 최소 - 최대 길ì´
label_list: 리스트
label_date: ë‚ ì§œ
-label_integer: Integer
-label_float: Float
-label_boolean: Boolean
-label_string: Text
-label_text: Long text
+label_integer: ì •ìˆ˜
+label_float: ë¶€ë™ìƒìˆ˜
+label_boolean: 부울린
+label_string: 문ìžì—´
+label_text: í…스트
label_attribute: ì†ì„±
label_attribute_plural: ì†ì„±
label_download: %d 다운로드
@@ -292,25 +296,25 @@ label_read: ì½ê¸°...
label_public_projects: ê³µê°œëœ í”„ë¡œì 트
label_open_issues: 진행중
label_open_issues_plural: 진행중
-label_closed_issues: í•´ê²°ë¨
-label_closed_issues_plural: í•´ê²°ë¨
+label_closed_issues: 완료ë¨
+label_closed_issues_plural: 완료ë¨
label_total: Total
label_permissions: 허가권한
-label_current_status: ë¬¸ì œ ìƒíƒœ
-label_new_statuses_allowed: 허용ë˜ëŠ” ë¬¸ì œ ìƒíƒœ
+label_current_status: ì´ìŠˆ ìƒíƒœ
+label_new_statuses_allowed: 허용ë˜ëŠ” ì´ìŠˆ ìƒíƒœ
label_all: 모ë‘
label_none: ì—†ìŒ
label_next: 다ìŒ
label_previous: ì´ì „
label_used_by: 사용ë¨
label_details: ìƒì„¸
-label_add_note: ë¬¸ì œë…¸íŠ¸ 추가
+label_add_note: ì´ìŠˆë…¸íŠ¸ 추가
label_per_page: 페ì´ì§€ë³„
label_calendar: ë‹¬ë ¥
label_months_from: 개월 ë™ì•ˆ | 다ìŒë¶€í„°
label_gantt: Gantt ì± íŠ¸
label_internal: Internal
-label_last_changes: last %d changes
+label_last_changes: 지난 ë³€ê²½ì‚¬í• %d ê±´
label_change_view_all: ëª¨ë“ ë³€ê²½ ë‚´ì— ë³´ê¸°
label_personalize_page: 입맛대로 구성하기(Drag & Drop)
label_comment: 댓글
@@ -318,9 +322,9 @@ label_comment_plural: 댓글
label_comment_add: 댓글 추가
label_comment_added: ëŒ“ê¸€ì´ ì¶”ê°€ë˜ì—ˆìŠµë‹ˆë‹¤.
label_comment_delete: 댓글 ì‚ì œ
-label_query: 커스텀 쿼리(custom query)
-label_query_plural: 커스텀 쿼리
-label_query_new: 새로운 커스텀 쿼리
+label_query: ì‚¬ìš©ìž ê²€ìƒ‰ì¡°ê±´
+label_query_plural: ì‚¬ìš©ìž ê²€ìƒ‰ì¡°ê±´
+label_query_new: 새로운 ì‚¬ìš©ìž ê²€ìƒ‰ì¡°ê±´
label_filter_add: 필터 추가
label_filter_plural: í•„í„°
label_equals: ì´ë‹¤
@@ -357,7 +361,7 @@ label_sort_lowest: 최하단으로
label_roadmap: 로드맵
label_roadmap_due_in: 기한
label_roadmap_overdue: %s 지연
-label_roadmap_no_issues: ì´ë²„ì „ì— í•´ë‹¹í•˜ëŠ” ë¬¸ì œ ì—†ìŒ
+label_roadmap_no_issues: ì´ë²„ì „ì— í•´ë‹¹í•˜ëŠ” ì´ìŠˆ ì—†ìŒ
label_search: 검색
label_result_plural: ê²°ê³¼
label_all_words: ëª¨ë“ ë‹¨ì–´
@@ -372,39 +376,39 @@ label_current_version: 현재 ë²„ì „
label_preview: 미리보기
label_feed_plural: 피드(Feeds)
label_changes_details: ëª¨ë“ ìƒì„¸ 변경 ë‚´ì—
-label_issue_tracking: ë¬¸ì œ ì¶”ì
+label_issue_tracking: ì´ìŠˆ ì¶”ì
label_spent_time: 작업 시간
label_f_hour: %.2f 시간
label_f_hour_plural: %.2f 시간
-label_time_tracking: Time tracking
-label_change_plural: Changes
+label_time_tracking: 시간추ì
+label_change_plural: 변경사í•들
label_statistics: 통계
-label_commits_per_month: 월별 commit ë‚´ì—
-label_commits_per_author: ì•„ì´ë””별 commit ë‚´ì—
+label_commits_per_month: 월별 커밋 ë‚´ì—
+label_commits_per_author: ì•„ì´ë””별 커밋 ë‚´ì—
label_view_diff: diff 보기
-label_diff_inline: inline
-label_diff_side_by_side: side by side
+label_diff_inline: 한줄로
+label_diff_side_by_side: ë‘줄로
label_options: Options
label_copy_workflow_from: Copy workflow from
-label_permissions_report: Permissions report
-label_watched_issues: ê°ì‹œì¤‘ì¸ ë¬¸ì œ
-label_related_issues: ì—°ê²°ëœ ë¬¸ì œ
+label_permissions_report: 권한 ë³´ê³ ì„œ
+label_watched_issues: ê°ì‹œì¤‘ì¸ ì´ìŠˆ
+label_related_issues: ì—°ê²°ëœ ì´ìŠˆ
label_applied_status: Applied status
-label_loading: Loading...
+label_loading: ì½ëŠ” 중...
label_relation_new: New relation
label_relation_delete: Delete relation
-label_relates_to: related to
-label_duplicates: duplicates
-label_blocks: blocks
-label_blocked_by: blocked by
-label_precedes: precedes
-label_follows: follows
+label_relates_to: ë‹¤ìŒ ì´ìŠˆì™€ ê´€ë ¨ë˜ì–´ 있ìŒ
+label_duplicates: ë‹¤ìŒ ì´ìŠˆì™€ 중복ë¨.
+label_blocks: ë‹¤ìŒ ì´ìŠˆê°€ í•´ê²°ì„ ë§‰ê³ ìžˆìŒ.
+label_blocked_by: ë§‰ê³ ìžˆëŠ” ì´ìŠˆ
+label_precedes: ë‹¤ìŒ ì´ìŠˆë³´ë‹¤ 앞서서 처리해야 함.
+label_follows: ì„ ì²˜ë¦¬ ì´ìŠˆ
label_end_to_start: end to start
label_end_to_end: end to end
label_start_to_start: start to start
label_start_to_end: start to end
label_stay_logged_in: ë¡œê·¸ì¸ ìœ ì§€
-label_disabled: disabled
+label_disabled: 비활성화
label_show_completed_versions: ì™„ë£Œëœ ë²„ì „ 보기
label_me: 나
label_board: 게시íŒ
@@ -419,27 +423,27 @@ label_send_information: 사용ìžì—게 ê³„ì •ì •ë³´ë¥¼ 보냄
label_year: ë…„
label_month: ì›”
label_week: 주
-label_date_from: From
-label_date_to: To
+label_date_from: ì—서
+label_date_to: (으)로
label_language_based: Language based
-label_sort_by: Sort by %s
-label_send_test_email: Send a test email
+label_sort_by: ì •ë ¬ë°©ë²•(%s)
+label_send_test_email: 테스트 ë©”ì¼ ë³´ë‚´ê¸°
label_feeds_access_key_created_on: RSS access key created %s ago
-label_module_plural: Modules
-label_added_time_by: Added by %s %s ago
-label_updated_time: Updated %s ago
-label_jump_to_a_project: Jump to a project...
-label_file_plural: Files
-label_changeset_plural: Changesets
-label_default_columns: Default columns
-label_no_change_option: (No change)
-label_bulk_edit_selected_issues: Bulk edit selected issues
-label_theme: Theme
-label_default: Default
-label_search_titles_only: Search titles only
-label_user_mail_option_all: "For any event on all my projects"
-label_user_mail_option_selected: "For any event on the selected projects only..."
-label_user_mail_option_none: "Only for things I watch or I'm involved in"
+label_module_plural: 모듈
+label_added_time_by: %sì´(ê°€) %s ì „ì— ì¶”ê°€í•¨
+label_updated_time: %s ì „ì— ìˆ˜ì •ë¨
+label_jump_to_a_project: 다른 프로ì 트로 ì´ë™í•˜ê¸°
+label_file_plural: 파ì¼
+label_changeset_plural: 변경사í•
+label_default_columns: 기본 컬럼
+label_no_change_option: (ìˆ˜ì • 안함)
+label_bulk_edit_selected_issues: ì„ íƒëœ ì´ìŠˆë“¤ì„ í•œêº¼ë²ˆì— ìˆ˜ì •í•˜ê¸°
+label_theme: 테마
+label_default: 기본
+label_search_titles_only: ì œëª©ì—서만 찾기
+label_user_mail_option_all: "ë‚´ê°€ ì†í•œ 프로ì 트로들부터 ëª¨ë“ ë©”ì¼ ë°›ê¸°"
+label_user_mail_option_selected: "ì„ íƒí•œ 프로ì 트들로부터 ëª¨ë“ ë©”ì¼ ë°›ê¸°.."
+label_user_mail_option_none: "ë‚´ê°€ ì†í•˜ê±°ë‚˜ ê°ì‹œ ì¤‘ì¸ ì‚¬í•ì— ëŒ€í•´ì„œë§Œ"
button_login: 로그ì¸
button_submit: 확ì¸
@@ -449,7 +453,7 @@ button_uncheck_all: ì„ íƒí•´ì œ
button_delete: ì‚ì œ
button_create: 완료
button_test: 테스트
-button_edit: ìˆ˜ì •
+button_edit: 편집
button_add: 추가
button_change: 변경
button_apply: ì ìš©
@@ -478,14 +482,14 @@ status_active: 사용중
status_registered: 등ë¡ëŒ€ê¸°
status_locked: ìž ê¹€
-text_select_mail_notifications: ë©”ì¼í†µì§€ê°€ 필요한 ìž‘ì—…ì„ ì„ íƒí•˜ì„¸ìš”.
+text_select_mail_notifications: 알림메ì¼ì´ 필요한 ìž‘ì—…ì„ ì„ íƒí•˜ì„¸ìš”.
text_regexp_info: 예) ^[A-Z0-9]+$
text_min_max_length_info: 0 는 ì œí•œì´ ì—†ìŒì„ ì˜ë¯¸í•¨
text_project_destroy_confirmation: ì´ í”„ë¡œì 트를 ì‚ì œí•˜ê³ ëª¨ë“ ë°ì´í„°ë¥¼ ì§€ìš°ì‹œê² ìŠµë‹ˆê¹Œ?
-text_workflow_edit: 워í¬í”Œë¡œë¥¼ ìˆ˜ì •í•˜ê¸° 위해서 ì—í• ê³¼ ë¬¸ì œìœ í˜•ì„ ì„ íƒí•˜ì„¸ìš”.
+text_workflow_edit: 워í¬í”Œë¡œë¥¼ ìˆ˜ì •í•˜ê¸° 위해서 ì—í• ê³¼ ì´ìŠˆìœ í˜•ì„ ì„ íƒí•˜ì„¸ìš”.
text_are_you_sure: ê³„ì† ì§„í–‰ í•˜ì‹œê² ìŠµë‹ˆê¹Œ?
-text_journal_changed: ë³€ê²½ë¨ from %s to %s
-text_journal_set_to: set to %s
+text_journal_changed: %sì—서 %s(으)로 변경
+text_journal_set_to: %s로 ì„¤ì •
text_journal_deleted: ì‚ì œë¨
text_tip_task_begin_day: 오늘 시작하는 업무(task)
text_tip_task_end_day: 오늘 종료하는 업무(task)
@@ -493,54 +497,143 @@ text_tip_task_begin_end_day: 오늘 ì‹œìž‘í•˜ê³ ì¢…ë£Œí•˜ëŠ” 업무(task)
text_project_identifier_info: 'ì˜ë¬¸ ì†Œë¬¸ìž (a-z), ë° ìˆ«ìž ëŒ€ì‰¬(-) 가능. ì €ìž¥ëœí›„ì—는 ì‹ë³„ìž ë³€ê²½ 불가능.'
text_caracters_maximum: 최대 %d ê¸€ìž ê°€ëŠ¥.
text_length_between: %d ì—서 %d 글ìž
-text_tracker_no_workflow: No workflow defined for this tracker
-text_unallowed_characters: Unallowed characters
-text_comma_separated: Multiple values allowed (comma separated).
-text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages
-text_issue_added: Issue %s has been reported.
-text_issue_updated: Issue %s has been updated.
-text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content ?
-text_issue_category_destroy_question: Some issues (%d) are assigned to this category. What do you want to do ?
-text_issue_category_destroy_assignments: Remove category assignments
-text_issue_category_reassign_to: Reassign issues to this category
-text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)."
+text_tracker_no_workflow: ì´ ì¶”ì 타입(tracker)ì— ì›Œí¬í”Œë¡œìš°ê°€ ì •ì˜ë˜ì§€ 않았습니다.
+text_unallowed_characters: 허용ë˜ì§€ 않는 문ìžì—´
+text_comma_separated: ë³µìˆ˜ì˜ ê°’ë“¤ì´ í—ˆìš©ë©ë‹ˆë‹¤.(êµ¬ë¶„ìž ,)
+text_issues_ref_in_commit_messages: 커밋메시지ì—서 ì´ìŠˆë¥¼ 참조하거나 해결하기
+text_issue_added: ì´ìŠˆ[%s]ê°€ ë³´ê³ ë˜ì—ˆìŠµë‹ˆë‹¤.
+text_issue_updated: ì´ìŠˆ[%s]ê°€ ìˆ˜ì •ë˜ì—ˆìŠµë‹ˆë‹¤.
+text_wiki_destroy_confirmation: ì´ ìœ„í‚¤ì™€ ëª¨ë“ ë‚´ìš©ì„ ì§€ìš°ì‹œê² ìŠµë‹ˆê¹Œ?
+text_issue_category_destroy_question: ì¼ë¶€ ì´ìŠˆë“¤(%dê°œ)ì´ ì´ ì¹´í…Œê³ ë¦¬ì— í• ë‹¹ë˜ì–´ 있습니다. 어떻게 í•˜ì‹œê² ìŠµë‹ˆê¹Œ?
+text_issue_category_destroy_assignments: ì¹´í…Œê³ ë¦¬ í• ë‹¹ 지우기
+text_issue_category_reassign_to: ì´ìŠˆë¥¼ ì´ ì¹´í…Œê³ ë¦¬ì— ë‹¤ì‹œ í• ë‹¹í•˜ê¸°
+text_user_mail_option: "ì„ íƒí•˜ì§€ ì•Šì€ í”„ë¡œì 트ì—서ë„, ëª¨ë‹ˆí„°ë§ ì¤‘ì´ê±°ë‚˜ ì†í•´ìžˆëŠ” 사í•(ì´ìŠˆë¥¼ 발행했거나 í• ë‹¹ëœ ê²½ìš°)ì´ ìžˆìœ¼ë©´ 알림메ì¼ì„ 받게 ë©ë‹ˆë‹¤."
-default_role_manager: Manager
-default_role_developper: Developer
-default_role_reporter: Reporter
+default_role_manager: 관리ìž
+default_role_developper: 개발ìž
+default_role_reporter: ë³´ê³ ìž
default_tracker_bug: 버그
default_tracker_feature: 새기능
-default_tracker_support: ìœ ì§€ë³´ìˆ˜
-default_issue_status_new: ìƒˆë¡œìš´ë¬¸ì œ
-default_issue_status_assigned: ë¬¸ì œí™•ì¸
-default_issue_status_resolved: ë¬¸ì œìˆ˜ì •
+default_tracker_support: ì§€ì›
+default_issue_status_new: ì‹ ê·œ
+default_issue_status_assigned: 확ì¸
+default_issue_status_resolved: í•´ê²°
default_issue_status_feedback: 피드백
-default_issue_status_closed: ë¬¸ì œí•´ê²°
-default_issue_status_rejected: ìž¬ìˆ˜ì •ìš”ì²
+default_issue_status_closed: 완료
+default_issue_status_rejected: 재처리
default_doc_category_user: ì‚¬ìš©ìž ë¬¸ì„œ
default_doc_category_tech: ê¸°ìˆ ë¬¸ì„œ
-default_priority_low: 사소
+default_priority_low: ë‚®ìŒ
default_priority_normal: 보통
-default_priority_high: 심ê°
+default_priority_high: 높ìŒ
default_priority_urgent: 긴급
-default_priority_immediate: 지금즉시
-default_activity_design: Design
-default_activity_development: Development
+default_priority_immediate: 즉시
+default_activity_design: 설계
+default_activity_development: 개발
-enumeration_issue_priorities: Issue priorities
-enumeration_doc_categories: Document categories
-enumeration_activities: Activities (time tracking)
-button_copy: Copy
-mail_body_account_information_external: You can use your "%s" account to log into Redmine.
-button_change_password: Change password
+enumeration_issue_priorities: ì´ìŠˆ ìš°ì„ ìˆœìœ„
+enumeration_doc_categories: 문서 ì¹´í…Œê³ ë¦¬
+enumeration_activities: 진행활ë™(시간 ì¶”ì )
+button_copy: 복사
+mail_body_account_information_external: ë ˆë“œë§ˆì¸ì— 로그ì¸í• 때 "%s" ê³„ì •ì„ ì‚¬ìš©í•˜ì‹¤ 수 있습니다.
+button_change_password: 비밀번호 변경
label_nobody: nobody
-setting_protocol: Protocol
-mail_body_account_information: Your Redmine account information
-label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
-setting_time_format: Time format
-label_registration_activation_by_email: account activation by email
-mail_subject_account_activation_request: Redmine account activation request
-mail_body_account_activation_request: 'A new user (%s) has registered. His account his pending your approval:'
-label_registration_automatic_activation: automatic account activation
-label_registration_manual_activation: manual account activation
-notice_account_pending: "Your account was created and is now pending administrator approval."
+setting_protocol: í”„ë¡œí† ì½œ
+mail_body_account_information: ê³„ì • ì •ë³´
+label_user_mail_no_self_notified: "ë‚´ê°€ ë§Œë“ ë³€ê²½ì‚¬í•ë“¤ì— ëŒ€í•´ì„œëŠ” 알림메ì¼ì„ 받지 않습니다."
+setting_time_format: 시간 형ì‹
+label_registration_activation_by_email: ë©”ì¼ë¡œ ê³„ì •ì„ í™œì„±í™”í•˜ê¸°
+mail_subject_account_activation_request: ë ˆë“œë§ˆì¸ ê³„ì • 활성화 ìš”ì² (%s)
+mail_body_account_activation_request: '새 ê³„ì •(%s)ì´ ë“±ë¡ë˜ì—ˆìŠµë‹ˆë‹¤. 관리ìžë‹˜ì˜ 승ì¸ì„ ê¸°ë‹¤ë¦¬ê³ ìžˆìŠµë‹ˆë‹¤.:'
+label_registration_automatic_activation: ìžë™ ê³„ì • 활성화
+label_registration_manual_activation: ìˆ˜ë™ ê³„ì • 활성화
+notice_account_pending: "ê³„ì •ì´ ë§Œë“¤ì–´ 졌습니다. 관리ìžì˜ 승ì¸ì´ ìžˆì„ ë•Œê¹Œì§€ ê¸°ë‹¤ë ¤ì•¼ 합니다."
+field_time_zone: 타임존
+text_caracters_minimum: 최소한 %d ê¸€ìž ì´ìƒì´ì–´ì•¼ 합니다.
+setting_bcc_recipients: 참조ìžë“¤ì„ bcc로 숨기기
+button_annotate: Annotate
+label_issues_by: Issues by %s
+field_searchable: 검색가능
+label_display_per_page: 'Per page: %s'
+setting_per_page_options: Objects per page options
+label_age: Age
+notice_default_data_loaded: 기본 ì„¤ì •ì„ ì„±ê³µì 으로 로드하였습니다.
+text_load_default_configuration: 기본 ì„¤ì •ì„ ë¡œë”©í•˜ê¸°
+text_no_configuration_data: "ì—í• , ì´ìŠˆ 타입, ì´ìŠˆ ìƒíƒœë“¤ê³¼ 워í¬í”Œë¡œê°€ ì•„ì§ ì„¤ì •ë˜ì§€ 않았습니다.\n기본 ì„¤ì •ì„ ë¡œë”©í•˜ëŠ” ê²ƒì„ ê¶Œìž¥í•©ë‹ˆë‹¤. ë¡œë“œëœ í›„ì— ìˆ˜ì •í• ìˆ˜ 있습니다."
+error_can_t_load_default_data: "기본 ì„¤ì •ì„ ë¡œë“œí• ìˆ˜ 없습니다.: %s"
+button_update: 변경사í•기ë¡
+label_change_properties: ì†ì„± 변경
+label_general: ì¼ë°˜
+label_repository_plural: ì €ìž¥ì†Œë“¤
+label_associated_revisions: Associated revisions
+setting_user_format: Users display format
+text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
+text_issues_destroy_confirmation: 'ì„ íƒí•œ ì´ìŠˆë¥¼ ì •ë§ë¡œ ì‚ì œí•˜ì‹œê² ìŠµë‹ˆê¹Œ?'
+label_scm: SCM
+text_select_project_modules: 'ì´ í”„ë¡œì 트ì—서 활성화시킬 ëª¨ë“ˆì„ ì„ íƒí•˜ì„¸ìš”:'
+label_issue_added: Issue added
+label_issue_updated: Issue updated
+label_document_added: Document added
+label_message_posted: Message added
+label_file_added: File added
+label_news_added: News added
+project_module_boards: 게시íŒ
+project_module_issue_tracking: ì´ìŠˆê´€ë¦¬
+project_module_wiki: 위키
+project_module_files: ê´€ë ¨íŒŒì¼
+project_module_documents: 문서
+project_module_repository: ì €ìž¥ì†Œ
+project_module_news: 뉴스
+project_module_time_tracking: Time tracking
+text_file_repository_writable: File repository writable
+text_default_administrator_account_changed: 기본 ê´€ë¦¬ìž ê³„ì •ì´ ë³€ê²½ë˜ì—ˆìŠµë‹ˆë‹¤.
+text_rmagick_available: RMagick available (optional)
+button_configure: ì„¤ì •
+label_plugins: 플러그ì¸
+label_ldap_authentication: LDAP ì¸ì¦
+label_downloads_abbr: D/L
+label_add_another_file: Add another file
+label_this_month: this month
+text_destroy_time_entries_question: %.02f hours were reported on the issues you are about to delete. What do you want to do ?
+label_last_n_days: last %d days
+label_all_time: all time
+error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
+label_this_year: this year
+text_assign_time_entries_to_project: Assign reported hours to the project
+label_date_range: Date range
+label_last_week: last week
+label_yesterday: yesterday
+label_optional_description: Optional description
+label_last_month: last month
+text_destroy_time_entries: Delete reported hours
+text_reassign_time_entries: 'Reassign reported hours to this issue:'
+setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Display comments
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
+setting_display_subprojects_issues: Display subprojects issues on main projects by default
+label_overall_activity: Overall activity
+setting_default_projects_public: New projects are public by default
+error_scm_annotate: "The entry does not exist or can not be annotated."
+label_planning: Planning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
+label_and_its_subprojects: %s and its subprojects
+mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
+mail_subject_reminder: "%d issue(s) due in the next days"
+text_user_wrote: '%s wrote:'
+label_duplicated_by: duplicated by
+setting_enabled_scm: Enabled SCM
+text_enumeration_category_reassign_to: 'Reassign them to this value:'
+text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
+text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/lt.yml b/lang/lt.yml
new file mode 100644
index 000000000..da581d678
--- /dev/null
+++ b/lang/lt.yml
@@ -0,0 +1,642 @@
+_gloc_rule_default: '|n| n==1 ? "" : "_plural" '
+
+actionview_datehelper_select_day_prefix:
+actionview_datehelper_select_month_names: sausis,vasaris,kovas,balandis,gegužė,birželis,liepa,rugpjūtis,rugsėjis,spalis,lapkritis,gruodis
+actionview_datehelper_select_month_names_abbr: Sau,Vas,Kov,Bal,Geg,Brž,Lie,Rgp,Rgs,Spl,Lap,Grd
+actionview_datehelper_select_month_prefix:
+actionview_datehelper_select_year_prefix:
+actionview_datehelper_time_in_words_day: 1 diena
+actionview_datehelper_time_in_words_day_plural: %d dienų
+actionview_datehelper_time_in_words_hour_about: apytiksliai valanda
+actionview_datehelper_time_in_words_hour_about_plural: apie %d valandas
+actionview_datehelper_time_in_words_hour_about_single: apytiksliai valanda
+actionview_datehelper_time_in_words_minute: 1 minutÄ—
+actionview_datehelper_time_in_words_minute_half: pusÄ— minutÄ—s
+actionview_datehelper_time_in_words_minute_less_than: mažiau kaip minutė
+actionview_datehelper_time_in_words_minute_plural: %d minutÄ—s
+actionview_datehelper_time_in_words_minute_single: 1 minutÄ—
+actionview_datehelper_time_in_words_second_less_than: mažiau kaip sekundė
+actionview_datehelper_time_in_words_second_less_than_plural: mažiau, negu %d sekundės
+actionview_instancetag_blank_option: prašom išrinkti
+
+activerecord_error_inclusion: nėra įtrauktas į sąrašą
+activerecord_error_exclusion: yra rezervuota(as)
+activerecord_error_invalid: yra negaliojanti(is)
+activerecord_error_confirmation: neatitinka patvirtinimo
+activerecord_error_accepted: turi būti priimtas
+activerecord_error_empty: negali bÅ«ti tuÅ¡Äiu
+activerecord_error_blank: negali bÅ«ti tuÅ¡Äiu
+activerecord_error_too_long: yra per ilgas
+activerecord_error_too_short: yra per trumpas
+activerecord_error_wrong_length: neteisingas ilgis
+activerecord_error_taken: buvo jau paimtas
+activerecord_error_not_a_number: nÄ—ra skaiÄius
+activerecord_error_not_a_date: data nÄ—ra galiojanti
+activerecord_error_greater_than_start_date: turi būti didesnė negu pradžios data
+activerecord_error_not_same_project: nepriklauso tam paÄiam projektui
+activerecord_error_circular_dependency: Šis ryšys sukurtų ciklinę priklausomybę
+
+general_fmt_age: %d m.
+general_fmt_age_plural: %d metų(ai)
+general_fmt_date: %%Y-%%m-%%d
+general_fmt_datetime: %%Y-%%m-%%d %%I:%%M %%p
+general_fmt_datetime_short: %%b %%d, %%I:%%M %%p
+general_fmt_time: %%I:%%M %%p
+general_text_No: 'Ne'
+general_text_Yes: 'Taip'
+general_text_no: 'ne'
+general_text_yes: 'taip'
+general_lang_name: 'Lithuanian (lietuvių)'
+general_csv_separator: ','
+general_csv_decimal_separator: '.'
+general_csv_encoding: UTF-8
+general_pdf_encoding: UTF-8
+general_day_names: pirmadienis,antradienis,treÄiadienis,ketvirtadienis,penktadienis,Å¡eÅ¡tadienis,sekmadienis
+general_first_day_of_week: '1'
+
+notice_account_updated: Paskyra buvo sÄ—kmingai atnaujinta.
+notice_account_invalid_creditentials: Negaliojantis vartotojo vardas ar slaptažodis
+notice_account_password_updated: Slaptažodis buvo sėkmingai atnaujintas.
+notice_account_wrong_password: Neteisingas slaptažodis
+notice_account_register_done: Paskyra buvo sėkmingai sukurta. Kad aktyvintumėte savo paskyrą, paspauskite sąsają, kuri jums buvo siųsta elektroniniu paštu.
+notice_account_unknown_email: Nežinomas vartotojas.
+notice_can_t_change_password: Šis pranešimas naudoja išorinį autentiškumo nustatymo šaltinį. Neįmanoma pakeisti slaptažodį.
+notice_account_lost_email_sent: Į Jūsų pašą išsiūstas laiškas su naujo slaptažodžio pasirinkimo instrukcija.
+notice_account_activated: Jūsų paskyra aktyvuota. Galite prisijungti.
+notice_successful_create: Sėkmingas sukūrimas.
+notice_successful_update: SÄ—kmingas atnaujinimas.
+notice_successful_delete: SÄ—kmingas panaikinimas.
+notice_successful_connection: SÄ—kmingas susijungimas.
+notice_file_not_found: Puslapis, į kurį ketinate įeiti, neegzistuoja arba pašalintas.
+notice_locking_conflict: Duomenys atnaujinti kito vartotojo.
+notice_scm_error: Duomenys ir/ar pakeitimai saugykloje(repozitorojoje) neegzistuoja.
+notice_not_authorized: Jūs neturite teisių gauti prieigą prie šio puslapio.
+notice_email_sent: Laiškas išsiųstas %s
+notice_email_error: Laiško siųntimo metu įvyko klaida (%s)
+notice_feeds_access_key_reseted: Jūsų RSS raktas buvo atnaujintas.
+notice_failed_to_save_issues: "Nepavyko išsaugoti %d problemos(ų) iš %d pasirinkto: %s."
+notice_no_issue_selected: "Nepasirinkta nė viena problema! Prašom pažymėti problemą, kurią norite redaguoti."
+notice_account_pending: "Jūsų paskyra buvo sukūrta ir dabar laukiama administratoriaus patvirtinimo."
+
+error_scm_not_found: "Duomenys ir/ar pakeitimai saugykloje(repozitorojoje) neegzistuoja."
+error_scm_command_failed: "Įvyko klaida jungiantis prie saugyklos: %s"
+
+mail_subject_lost_password: Jūsų %s slaptažodis
+mail_body_lost_password: 'Norėdami pakeisti slaptažodį, spauskite nuorodą:'
+mail_subject_register: '%s paskyros aktyvavymas'
+mail_body_register: 'NorÄ—dami aktyvuoti paskyrÄ…, spauskite nuorodÄ…:'
+mail_body_account_information_external: Jūs galite naudoti Jūsų "%s" paskyrą, norėdami prisijungti.
+mail_body_account_information: Informacija apie Jūsų paskyrą
+mail_subject_account_activation_request: %s paskyros aktyvavimo prašymas
+mail_body_account_activation_request: 'Užsiregistravo naujas vartotojas (%s). Jo paskyra laukia jūsų patvirtinimo:'
+
+gui_validation_error: 1 klaida
+gui_validation_error_plural: %d klaidų(os)
+
+field_name: Pavadinimas
+field_description: Aprašas
+field_summary: Santrauka
+field_is_required: Reikalaujama
+field_firstname: Vardas
+field_lastname: PavardÄ—
+field_mail: Email
+field_filename: Byla
+field_filesize: Dydis
+field_downloads: Atsiuntimai
+field_author: Autorius
+field_created_on: Sukūrta
+field_updated_on: Atnaujinta
+field_field_format: Formatas
+field_is_for_all: Visiems projektams
+field_possible_values: Galimos reikšmės
+field_regexp: Pastovi išraiška
+field_min_length: Minimalus ilgis
+field_max_length: Maksimalus ilgis
+field_value: VertÄ—
+field_category: Kategorija
+field_title: Pavadinimas
+field_project: Projektas
+field_issue: Darbas
+field_status: Būsena
+field_notes: Pastabos
+field_is_closed: Darbas uždarytas
+field_is_default: Numatytoji vertÄ—
+field_tracker: PÄ—dsekys
+field_subject: Tema
+field_due_date: Užbaigimo data
+field_assigned_to: Paskirtas
+field_priority: Prioritetas
+field_fixed_version: Target version
+field_user: Vartotojas
+field_role: Vaidmuo
+field_homepage: Pagrindinis puslapis
+field_is_public: Viešas
+field_parent: Priklauso projektui
+field_is_in_chlog: Darbai rodomi pokyÄių žurnale
+field_is_in_roadmap: Darbai rodomi veiklos grafike
+field_login: Registracijos vardas
+field_mail_notification: Elektroninio pašto pranešimai
+field_admin: Administratorius
+field_last_login_on: Paskutinis ryšys
+field_language: Kalba
+field_effective_date: Data
+field_password: Slaptažodis
+field_new_password: Naujas slaptažodis
+field_password_confirmation: Patvirtinimas
+field_version: Versija
+field_type: Tipas
+field_host: Pagrindinis kompiuteris
+field_port: Jungtis
+field_account: Paskyra
+field_base_dn: Bazinis skiriamasis vardas
+field_attr_login: Registracijos vardo požymis
+field_attr_firstname: Vardo priskiria
+field_attr_lastname: PavardÄ—s priskiria
+field_attr_mail: Elektroninio pašto požymis
+field_onthefly: Vartotojų sukūrimas paskubomis
+field_start_date: PradÄ—ti
+field_done_ratio: %% Atlikta
+field_auth_source: Autentiškumo nustatymo būdas
+field_hide_mail: Paslėpkite mano elektroninio pašto adresą
+field_comments: Komentaras
+field_url: URL
+field_start_page: Pradžios puslapis
+field_subproject: Subprojektas
+field_hours: Valandos
+field_activity: Veikla
+field_spent_on: Data
+field_identifier: Identifikuotojas
+field_is_filter: Panaudotas kaip filtras
+field_issue_to_id: Susijęs darbas
+field_delay: Užlaikymas
+field_assignable: Darbai gali būti paskirti šiam vaidmeniui
+field_redirect_existing_links: Peradresuokite egzistuojanÄias sÄ…sajas
+field_estimated_hours: Numatyta trukmÄ—
+field_column_names: Skiltys
+field_time_zone: Laiko juosta
+field_searchable: Randamas
+field_default_value: Numatytoji vertÄ—
+setting_app_title: Programos pavadinimas
+setting_app_subtitle: Programos paantraštė
+setting_welcome_text: Pasveikinimas
+setting_default_language: Numatytoji kalba
+setting_login_required: Reikalingas autentiškumo nustatymas
+setting_self_registration: Saviregistracija
+setting_attachment_max_size: Priedo maks. dydis
+setting_issues_export_limit pagal dydį: Darbų eksportavimo riba
+setting_mail_from: Emisijos elektroninio pašto adresas
+setting_bcc_recipients: Akli tikslios kopijos gavÄ—jai (bcc)
+setting_host_name: Pagrindinio kompiuterio vardas
+setting_text_formatting: Teksto apipavidalinimas
+setting_wiki_compression: Wiki istorijos suspaudimas
+setting_feeds_limit: Perdavimo turinio riba
+setting_autofetch_changesets: Automatinis pakeitimų siuntimas
+setting_sys_api_enabled: Įgalinkite WS sandėlio vadybai
+setting_commit_ref_keywords: Nurodymo reikšminiai žodžiai
+setting_commit_fix_keywords: Fiksavimo reikšminiai žodžiai
+setting_autologin: Autoregistracija
+setting_date_format: Datos formatas
+setting_time_format: Laiko formatas
+setting_cross_project_issue_relations: Leisti tarprojektinius darbų ryšius
+setting_issue_list_default_columns: Numatytosios skiltys darbų sąraše
+setting_repositories_encodings: Saugyklos enkodingas
+setting_emails_footer: elektroninio pašto puslapinė poraštė
+setting_protocol: Protokolas
+
+label_user: Vartotojas
+label_user_plural: Vartotojai
+label_user_new: Naujas vartotojas
+label_project: Projektas
+label_project_new: Naujas projektas
+label_project_plural: Projektai
+label_project_all: Visi Projektai
+label_project_latest: Paskutiniai projektai
+label_issue: Darbas
+label_issue_new: Naujas darbas
+label_issue_plural: Darbai
+label_issue_view_all: Peržiūrėti visus darbus
+label_issues_by: Darbai pagal %s
+label_document: Dokumentas
+label_document_new: Naujas dokumentas
+label_document_plural: Dokumentai
+label_role: Vaidmuo
+label_role_plural: Vaidmenys
+label_role_new: Naujas vaidmuo
+label_role_and_permissions: Vaidmenys ir leidimai
+label_member: Narys
+label_member_new: Naujas narys
+label_member_plural: Nariai
+label_tracker: PÄ—dsekys
+label_tracker_plural: PÄ—dsekiai
+label_tracker_new: Naujas pÄ—dsekys
+label_workflow: Darbų eiga
+label_issue_status: Darbo padÄ—tis
+label_issue_status_plural: Darbų padėtys
+label_issue_status_new: Nauja padÄ—tis
+label_issue_category: Darbo kategorija
+label_issue_category_plural: Darbo kategorijos
+label_issue_category_new: Nauja kategorija
+label_custom_field: Kliento laukas
+label_custom_field_plural: Kliento laukai
+label_custom_field_new: Naujas kliento laukas
+label_enumerations: Išvardinimai
+label_enumeration_new: Nauja vertÄ—
+label_information: Informacija
+label_information_plural: Informacija
+label_please_login: Prašom prisijungti
+label_register: Užsiregistruoti
+label_password_lost: Prarastas slaptažodis
+label_home: Pagrindinis
+label_my_page: Mano puslapis
+label_my_account: Mano paskyra
+label_my_projects: Mano projektai
+label_administration: Administravimas
+label_login: Prisijungti
+label_logout: Atsijungti
+label_help: Pagalba
+label_reported_issues: Pranešti darbai
+label_assigned_to_me_issues: Darbai, priskirti man
+label_last_login: Paskutinis ryšys
+label_last_updates: Paskutinis atnaujinimas
+label_last_updates_plural: %d paskutinis atnaujinimas
+label_registered_on: Užregistruota
+label_activity: Veikla
+label_new: Naujas
+label_logged_as: Prisijungęs kaip
+label_environment: Aplinka
+label_authentication: Autentiškumo nustatymas
+label_auth_source: Autentiškumo nustatymo būdas
+label_auth_source_new: Naujas autentiškumo nustatymo būdas
+label_auth_source_plural: Autentiškumo nustatymo būdai
+label_subproject_plural: Subprojektai
+label_min_max_length: Min - Maks ilgis
+label_list: Sąrašas
+label_date: Data
+label_integer: Sveikasis skaiÄius
+label_float: Float
+label_boolean: Boolean
+label_string: Tekstas
+label_text: Ilgas tekstas
+label_attribute: Požymis
+label_attribute_plural: Požymiai
+label_download: %d Persiuntimas
+label_download_plural: %d Persiuntimai
+label_no_data: NÄ—ra kÄ… atvaizduoti
+label_change_status: Pakeitimo padÄ—tis
+label_history: Istorija
+label_attachment: Rinkmena
+label_attachment_new: Nauja rinkmena
+label_attachment_delete: Pašalinkite rinkmeną
+label_attachment_plural: Rinkmenos
+label_report: Ataskaita
+label_report_plural: Ataskaitos
+label_news: Žinia
+label_news_new: Pridėkite žinią
+label_news_plural: Žinios
+label_news_latest: PaskutinÄ—s naujienos
+label_news_view_all: Peržiūrėti visas žinias
+label_change_log: Pakeitimų žurnalas
+label_settings: Nustatymai
+label_overview: Apžvalga
+label_version: Versija
+label_version_new: Nauja versija
+label_version_plural: Versijos
+label_confirmation: Patvirtinimas
+label_export_to: Eksportuoti į
+label_read: Skaitykite...
+label_public_projects: Vieši projektai
+label_open_issues: atidaryta
+label_open_issues_plural: atidarytos
+label_closed_issues: uždaryta
+label_closed_issues_plural: uždarytos
+label_total: Bendra suma
+label_permissions: Leidimai
+label_current_status: Einamoji padÄ—tis
+label_new_statuses_allowed: Naujos padÄ—tys galimos
+label_all: visi
+label_none: niekas
+label_nobody: niekas
+label_next: Kitas
+label_previous: Ankstesnis
+label_used_by: Naudotas
+label_details: DetalÄ—s
+label_add_note: PridÄ—kite pastabÄ…
+label_per_page: Per puslapį
+label_calendar: Kalendorius
+label_months_from: mÄ—nesiai nuo
+label_gantt: Gantt
+label_internal: Vidinis
+label_last_changes: paskutiniai %d, pokyÄiai
+label_change_view_all: Peržiūrėti visus pakeitimus
+label_personalize_page: Suasmeninti šį puslapį
+label_comment: Komentaras
+label_comment_plural: Komentarai
+label_comment_add: PridÄ—kite komentarÄ…
+label_comment_added: Komentaras pridÄ—tas
+label_comment_delete: Pašalinkite komentarus
+label_query: Užklausa
+label_query_plural: Užklausos
+label_query_new: Nauja užklausa
+label_filter_add: PridÄ—ti filtrÄ…
+label_filter_plural: Filtrai
+label_equals: yra
+label_not_equals: nÄ—ra
+label_in_less_than: mažiau negu
+label_in_more_than: daugiau negu
+label_in: in
+label_today: šiandien
+label_this_week: šią savaitę
+label_less_than_ago: mažiau negu dienomis prieš
+label_more_than_ago: daugiau negu dienomis prieš
+label_ago: dienomis prieš
+label_contains: turi savyje
+label_not_contains: neturi savyje
+label_day_plural: dienos
+label_repository: Saugykla
+label_browse: Naršyti
+label_modification: %d pakeitimas
+label_modification_plural: %d pakeitimai
+label_revision: Revizija
+label_revision_plural: Revizijos
+label_added: pridÄ—tas
+label_modified: pakeistas
+label_deleted: pašalintas
+label_latest_revision: PaskutinÄ— revizija
+label_latest_revision_plural: PaskutinÄ—s revizijos
+label_view_revisions: Pežiūrėti revizijas
+label_max_size: Maksimalus dydis
+label_on: 'iš'
+label_sort_highest: Perkelti į viršūnę
+label_sort_higher: Perkelti į viršų
+label_sort_lower: Perkelti žemyn
+label_sort_lowest: Perkelti į apaÄiÄ…
+label_roadmap: Veiklos grafikas
+label_roadmap_due_in: Baigiasi po
+label_roadmap_overdue: %s vÄ—luojama
+label_roadmap_no_issues: Jokio darbo šiai versijai nėra
+label_search: Ieškoti
+label_result_plural: Rezultatai
+label_all_words: Visi žodžiai
+label_wiki: Wiki
+label_wiki_edit: Wiki redakcija
+label_wiki_edit_plural: Wiki redakcijos
+label_wiki_page: Wiki puslapis
+label_wiki_page_plural: Wiki puslapiai
+label_index_by_title: Indeksas prie pavadinimo
+label_index_by_date: Indeksas prie datos
+label_current_version: Einamoji versija
+label_preview: Peržiūra
+label_feed_plural: Įeitys(Feeds)
+label_changes_details: Visų pakeitimų detalės
+label_issue_tracking: Darbų sekimas
+label_spent_time: Sugaištas laikas
+label_f_hour: %.2f valanda
+label_f_hour_plural: %.2f valandų
+label_time_tracking: Laiko sekimas
+label_change_plural: Pakeitimai
+label_statistics: Statistika
+label_commits_per_month: Paveda(commit) per mėnesį
+label_commits_per_author: Autoriaus pavedos(commit)
+label_view_diff: Skirtumų peržiūra
+label_diff_inline: įterptas
+label_diff_side_by_side: šalia
+label_options: Pasirinkimai
+label_copy_workflow_from: Kopijuoti darbų eiga iš
+label_permissions_report: Leidimų pranešimas
+label_watched_issues: Stebimi darbai
+label_related_issues: SusijÄ™ darbai
+label_applied_status: Taikomoji padÄ—tis
+label_loading: Kraunama...
+label_relation_new: Naujas ryšys
+label_relation_delete: Pašalinkite ryšį
+label_relates_to: susietas su
+label_duplicates: dublikatai
+label_blocks: blokai
+label_blocked_by: blokuotas
+label_precedes: įvyksta pirma
+label_follows: seka
+label_end_to_start: užbaigti, kad pradėti
+label_end_to_end: užbaigti, kad pabaigti
+label_start_to_start: pradÄ—kite pradÄ—ti
+label_start_to_end: pradėkite užbaigti
+label_stay_logged_in: Likti prisijungus
+label_disabled: išjungta(as)
+label_show_completed_versions: Parodyti užbaigtas versijas
+label_me: aš
+label_board: Forumas
+label_board_new: Naujas forumas
+label_board_plural: Forumai
+label_topic_plural: Temos
+label_message_plural: Pranešimai
+label_message_last: Paskutinis pranešimas
+label_message_new: Naujas pranešimas
+label_reply_plural: Atsakymai
+label_send_information: Nusiųsti paskyros informaciją vartotojui
+label_year: Metai
+label_month: MÄ—nuo
+label_week: SavaitÄ—
+label_date_from: Nuo
+label_date_to: Iki
+label_language_based: Pagrįsta vartotojo kalba
+label_sort_by: Rūšiuoti pagal %s
+label_send_test_email: Nusiųsti bandomąjį elektroninį laišką
+label_feeds_access_key_created_on: RSS prieigos raktas sukūrtas prieš %s
+label_module_plural: Moduliai
+label_added_time_by: Pridėjo %s prieš %s
+label_updated_time: Atnaujinta prieš %s
+label_jump_to_a_project: Šuolis į projektą...
+label_file_plural: Bylos
+label_changeset_plural: Changesets
+label_default_columns: Numatytosios skiltys
+label_no_change_option: (Jokio pakeitimo)
+label_bulk_edit_selected_issues: Masinis pasirinktų darbų(issues) redagavimas
+label_theme: Tema
+label_default: Numatyta(as)
+label_search_titles_only: Ieškoti pavadinimų tiktai
+label_user_mail_option_all: "Bet kokiam įvykiui visuose mano projektuose"
+label_user_mail_option_selected: "Bet kokiam įvykiui tiktai pasirinktuose projektuose ..."
+label_user_mail_option_none: "Tiktai dalykai kuriuos aš stebiu ar aš esu įtrauktas į"
+label_user_mail_no_self_notified: "Nenoriu būti informuotas apie pakeitimus, kuriuos pats atlieku"
+label_registration_activation_by_email: "paskyros aktyvacija per e-paštą"
+label_registration_manual_activation: "rankinÄ— paskyros aktyvacija"
+label_registration_automatic_activation: "automatinÄ— paskyros aktyvacija"
+
+button_login: Registruotis
+button_submit: Pateikti
+button_save: Išsaugoti
+button_check_all: Žymėti visus
+button_uncheck_all: Atžymėti visus
+button_delete: Trinti
+button_create: Sukurti
+button_test: Testas
+button_edit: Redaguoti
+button_add: PridÄ—ti
+button_change: Keisti
+button_apply: Pritaikyti
+button_clear: Išvalyti
+button_lock: Rakinti
+button_unlock: Atrakinti
+button_download: Atsisiųsti
+button_list: Sąrašas
+button_view: Žiūrėti
+button_move: Perkelti
+button_back: Atgal
+button_cancel: Atšaukti
+button_activate: Aktyvinti
+button_sort: Rūšiuoti
+button_log_time: Praleistas laikas
+button_rollback: Grįžti į šią versiją
+button_watch: StebÄ—ti
+button_unwatch: NestebÄ—ti
+button_reply: Atsakyti
+button_archive: Archyvuoti
+button_unarchive: Išpakuoti
+button_reset: Reset
+button_rename: Pervadinti
+button_change_password: Pakeisti slaptažodį
+button_copy: Kopijuoti
+button_annotate: Rašyti pastabą
+
+status_active: aktyvus
+status_registered: užregistruotas
+status_locked: užrakintas
+
+text_select_mail_notifications: Išrinkite veiksmus, apie kuriuos būtų pranešta elektroniniu paštu.
+text_regexp_info: pvz. ^[A-Z0-9]+$
+text_min_max_length_info: 0 reiškia jokių apribojimų
+text_project_destroy_confirmation: Ar esate įsitikinęs, kad jūs norite pašalinti šį projektą ir visus susijusius duomenis?
+text_workflow_edit: Išrinkite vaidmenį ir pėdsekį, kad redaguotumėte darbų eigą
+text_are_you_sure: Ar esate įsitikinęs?
+text_journal_changed: pakeistas iš %s į %s
+text_journal_set_to: nustatyta į %s
+text_journal_deleted: ištrintas
+text_tip_task_begin_day: užduotis, prasidedanti šią dieną
+text_tip_task_end_day: užduotis, pasibaigianti šią dieną
+text_tip_task_begin_end_day: užduotis, prasidedanti ir pasibaigianti šią dieną
+text_project_identifier_info: 'Mažosios raidÄ—s (a-z), skaiÄiai ir brÅ«kÅ¡niai galimi. IÅ¡saugojus, identifikuotojas negali bÅ«ti keiÄiamas.'
+text_caracters_maximum: %d simbolių maksimumas.
+text_caracters_minimum: Turi būti mažiausiai %d simbolių ilgio.
+text_length_between: Ilgis tarp %d ir %d simbolių.
+text_tracker_no_workflow: Jokia darbų eiga neapibrėžta šiam pėdsekiui
+text_unallowed_characters: Neleistini simboliai
+text_comma_separated: Leistinos kelios reikšmės (atskirtos kableliu).
+text_issues_ref_in_commit_messages: Darbų pavedimų(commit) nurodymas ir fiksavimas pranešimuose
+text_issue_added: Darbas %s buvo praneštas (by %s).
+text_issue_updated: Darbas %s buvo atnaujintas (by %s).
+text_wiki_destroy_confirmation: Ar esate įsitikinęs, kad jūs norite pašalinti wiki ir visą jos turinį?
+text_issue_category_destroy_question: Kai kurie darbai (%d) yra paskirti šiai kategorijai. Ką jūs norite daryti?
+text_issue_category_destroy_assignments: Pašalinti kategorijos užduotis
+text_issue_category_reassign_to: Iš naujo priskirti darbus šiai kategorijai
+text_user_mail_option: "neišrinktiems projektams, jūs tiktai gausite pranešimus apie įvykius, kuriuos jūs stebite, arba į kuriuos esate įtrauktas (pvz. darbai, jūs esate autorius ar įgaliotinis)."
+
+default_role_manager: Vadovas
+default_role_developper: Projektuotojas
+default_role_reporter: Pranešėjas
+default_tracker_bug: Klaida
+default_tracker_feature: YpatybÄ—
+default_tracker_support: Palaikymas
+default_issue_status_new: Nauja
+default_issue_status_assigned: Priskirta
+default_issue_status_resolved: Išspręsta
+default_issue_status_feedback: Grįžtamasis ryšys
+default_issue_status_closed: Uždaryta
+default_issue_status_rejected: Atmesta
+default_doc_category_user: Vartotojo dokumentacija
+default_doc_category_tech: Techniniai dokumentacija
+default_priority_low: Žemas
+default_priority_normal: Normalus
+default_priority_high: Aukštas
+default_priority_urgent: Skubus
+default_priority_immediate: NeatidÄ—liotinas
+default_activity_design: Projektavimas
+default_activity_development: Vystymas
+
+enumeration_issue_priorities: Darbo prioritetai
+enumeration_doc_categories: Dokumento kategorijos
+enumeration_activities: Veiklos (laiko sekimas)
+label_display_per_page: '%s įrašų puslapyje'
+setting_per_page_options: Įrašų puslapyje nustatimas
+notice_default_data_loaded: Numatytoji konfiguracija sėkmingai užkrauta.
+label_age: Amžius
+label_general: Bendri
+button_update: Atnaujinti
+setting_issues_export_limit: Darbų eksportavimo limitas
+label_change_properties: Pakeisti nustatymus
+text_load_default_configuration: Užkrauti numatytąj konfiguraciją
+text_no_configuration_data: "Vaidmenys, pėdsekiai, darbų būsenos ir darbų eiga dar nebuvo konfigūruoti.\nGriežtai rekomenduojam užkrauti numatytąją(default)konfiguraciją. Užkrovus, galėsite ją modifikuoti."
+label_repository_plural: Saugiklos
+error_can_t_load_default_data: "Numatytoji konfiguracija negali būti užkrauta: %s"
+label_associated_revisions: susijusios revizijos
+setting_user_format: Vartotojo atvaizdavimo formatas
+text_status_changed_by_changeset: Pakeista %s revizijoi.
+label_more: Daugiau
+text_issues_destroy_confirmation: 'Ar jūs tikrai norite panaikinti pažimėtą(us) darbą(us)?'
+label_scm: SCM
+text_select_project_modules: 'Parinkite modulius, kuriuos norite naudoti šiame projekte:'
+label_issue_added: Darbas pridÄ—tas
+label_issue_updated: Darbas atnaujintas
+label_document_added: Dokumentas pridÄ—tas
+label_message_posted: Pranešimas pridėtas
+label_file_added: Byla pridÄ—ta
+label_news_added: Naujiena pridÄ—ta
+project_module_boards: Forumai
+project_module_issue_tracking: Darbu pÄ—dsekys
+project_module_wiki: Wiki
+project_module_files: Rinkmenos
+project_module_documents: Dokumentai
+project_module_repository: Saugykla
+project_module_news: Žinios
+project_module_time_tracking: Laiko pÄ—dsekys
+text_file_repository_writable: Ä® rinkmenu saugyklÄ… galima saugoti (RW)
+text_default_administrator_account_changed: Administratoriaus numatyta paskyra pakeista
+text_rmagick_available: RMagick pasiekiamas (pasirinktinai)
+button_configure: Konfiguruoti
+label_plugins: Plugins
+label_ldap_authentication: LDAP autentifikacija
+label_downloads_abbr: siunt.
+label_this_month: šis menuo
+label_last_n_days: paskutinių %d dienų
+label_all_time: visas laikas
+label_this_year: šiemet
+label_date_range: Dienų diapazonas
+label_last_week: paskutinÄ— savaitÄ—
+label_yesterday: vakar
+label_last_month: paskutinis menuo
+label_add_another_file: PridÄ—ti kitÄ… bylÄ…
+label_optional_description: Apibūdinimas (laisvai pasirenkamas)
+text_destroy_time_entries_question: Naikinamam darbui paskelbta %.02f valandų. Ką jūs noryte su jomis daryti?
+error_issue_not_found_in_project: 'Darbas nerastas arba nesurištas su šiuo projektu'
+text_assign_time_entries_to_project: Priskirti valandas prie projekto
+text_destroy_time_entries: Ištrinti paskelbtas valandas
+text_reassign_time_entries: 'Priskirti paskelbtas valandas šiam darbui:'
+setting_activity_days_default: Atvaizduojamos dienos projekto veikloje
+label_chronological_order: Chronologine tvarka
+field_comments_sorting: rodyti komentarus
+label_reverse_chronological_order: Atbuline chronologine tvarka
+label_preferences: SavybÄ—s
+setting_display_subprojects_issues: Pagal nutylėjimą rodyti subprojektų darbus pagrindiniame projekte
+label_overall_activity: Visa veikla
+setting_default_projects_public: Naujas projektas viešas pagal nutylėjimą
+error_scm_annotate: "Įrašas neegzituoja arba negalima jo atvaizduoti."
+label_planning: Planavimas
+text_subprojects_destroy_warning: 'Šis(ie) subprojektas(ai): %s taip pat bus ištrintas(i).'
+label_and_its_subprojects: %s projektas ir jo subprojektai
+
+mail_body_reminder: "%d darbas(ai), kurie yra jums priskirti, baigiasi po %d dienų(os):"
+mail_subject_reminder: "%d darbas(ai) po kelių dienų"
+text_user_wrote: '%s parašė:'
+label_duplicated_by: susiejo
+setting_enabled_scm: Įgalintas SCM
+text_enumeration_category_reassign_to: 'Priskirti juos šiai reikšmei:'
+text_enumeration_destroy_question: '%d objektai priskirti šiai reikšmei.'
+label_incoming_emails: Įeinantys laiškai
+label_generate_key: Generuoti raktÄ…
+setting_mail_handler_api_enabled: Įgalinti WS įeinantiems laiškams
+setting_mail_handler_api_key: API raktas
+
+text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/nl.yml b/lang/nl.yml
index 1758514a8..b1c5756be 100644
--- a/lang/nl.yml
+++ b/lang/nl.yml
@@ -48,6 +48,7 @@ general_text_no: 'nee'
general_text_yes: 'ja'
general_lang_name: 'Nederlands'
general_csv_separator: ','
+general_csv_decimal_separator: '.'
general_csv_encoding: ISO-8859-1
general_pdf_encoding: ISO-8859-1
general_day_names: Maandag, Dinsdag, Woensdag, Donderdag, Vrijdag, Zaterdag, Zondag
@@ -68,16 +69,18 @@ notice_successful_delete: Verwijderen succesvol.
notice_successful_connection: Verbinding succesvol.
notice_file_not_found: De pagina die U probeerde te benaderen bestaat niet of is verwijderd.
notice_locking_conflict: De gegevens zijn gewijzigd door een andere gebruiker.
-notice_scm_error: Deze ingang of revisie bestaat niet in de repository.
notice_not_authorized: Het is U niet toegestaan om deze pagina te raadplegen.
notice_email_sent: An email was sent to %s
notice_email_error: An error occurred while sending mail (%s)
notice_feeds_access_key_reseted: Your RSS access key was reseted.
-mail_subject_lost_password: Uw redMine wachtwoord
+error_scm_not_found: "Deze ingang of revisie bestaat niet in de repository."
+error_scm_command_failed: "An error occurred when trying to access the repository: %s"
+
+mail_subject_lost_password: Uw %s wachtwoord
mail_body_lost_password: 'Gebruik de volgende link om Uw wachtwoord te wijzigen:'
-mail_subject_register: redMine account activatie
-mail_body_register: 'Gebruik de volgende link om Uw Redmine account te activeren:'
+mail_subject_register: Uw %s account activatie
+mail_body_register: 'Gebruik de volgende link om Uw account te activeren:'
gui_validation_error: 1 fout
gui_validation_error_plural: %d fouten
@@ -109,13 +112,13 @@ field_issue: Issue
field_status: Status
field_notes: Notities
field_is_closed: Issue gesloten
-field_is_default: Default status
+field_is_default: Default
field_tracker: Tracker
field_subject: Onderwerp
field_due_date: Verwachte datum gereed
field_assigned_to: Toegewezen aan
field_priority: Prioriteit
-field_fixed_version: Opgeloste versie
+field_fixed_version: Target version
field_user: Gebruiker
field_role: Rol
field_homepage: Homepage
@@ -161,6 +164,7 @@ field_delay: Vertraging
field_assignable: Issues can be assigned to this role
field_redirect_existing_links: Redirect existing links
field_estimated_hours: Estimated time
+field_default_value: Default value
setting_app_title: Applicatie titel
setting_app_subtitle: Applicatie ondertitel
@@ -479,8 +483,8 @@ text_tracker_no_workflow: Geen workflow gedefinieerd voor deze tracker
text_unallowed_characters: Niet toegestane tekens
text_coma_separated: Meerdere waarden toegestaan (door komma's gescheiden).
text_issues_ref_in_commit_messages: Opzoeken en aanpassen van issues in commit berichten
-text_issue_added: Issue %s is gerapporteerd.
-text_issue_updated: Issue %s is gewijzigd.
+text_issue_added: Issue %s is gerapporteerd (by %s).
+text_issue_updated: Issue %s is gewijzigd (by %s).
text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content ?
text_issue_category_destroy_question: Some issues (%d) are assigned to this category. What do you want to do ?
text_issue_category_destroy_assignments: Remove category assignments
@@ -534,14 +538,103 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in"
setting_emails_footer: Emails footer
label_float: Float
button_copy: Copy
-mail_body_account_information_external: You can use your "%s" account to log into Redmine.
-mail_body_account_information: Your Redmine account information
+mail_body_account_information_external: You can use your "%s" account to log in.
+mail_body_account_information: Your account information
setting_protocol: Protocol
label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
setting_time_format: Time format
label_registration_activation_by_email: account activation by email
-mail_subject_account_activation_request: Redmine account activation request
+mail_subject_account_activation_request: %s account activation request
mail_body_account_activation_request: 'A new user (%s) has registered. His account his pending your approval:'
label_registration_automatic_activation: automatic account activation
label_registration_manual_activation: manual account activation
notice_account_pending: "Your account was created and is now pending administrator approval."
+field_time_zone: Time zone
+text_caracters_minimum: Must be at least %d characters long.
+setting_bcc_recipients: Blind carbon copy recipients (bcc)
+button_annotate: Annotate
+label_issues_by: Issues by %s
+field_searchable: Searchable
+label_display_per_page: 'Per page: %s'
+setting_per_page_options: Objects per page options
+label_age: Age
+notice_default_data_loaded: Default configuration successfully loaded.
+text_load_default_configuration: Load the default configuration
+text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
+error_can_t_load_default_data: "Default configuration could not be loaded: %s"
+button_update: Update
+label_change_properties: Change properties
+label_general: General
+label_repository_plural: Repositories
+label_associated_revisions: Associated revisions
+setting_user_format: Users display format
+text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
+text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s) ?'
+label_scm: SCM
+text_select_project_modules: 'Select modules to enable for this project:'
+label_issue_added: Issue added
+label_issue_updated: Issue updated
+label_document_added: Document added
+label_message_posted: Message added
+label_file_added: File added
+label_news_added: News added
+project_module_boards: Boards
+project_module_issue_tracking: Issue tracking
+project_module_wiki: Wiki
+project_module_files: Files
+project_module_documents: Documents
+project_module_repository: Repository
+project_module_news: News
+project_module_time_tracking: Time tracking
+text_file_repository_writable: File repository writable
+text_default_administrator_account_changed: Default administrator account changed
+text_rmagick_available: RMagick available (optional)
+button_configure: Configure
+label_plugins: Plugins
+label_ldap_authentication: LDAP authentication
+label_downloads_abbr: D/L
+label_this_month: this month
+label_last_n_days: last %d days
+label_all_time: all time
+label_this_year: this year
+label_date_range: Date range
+label_last_week: last week
+label_yesterday: yesterday
+label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
+text_destroy_time_entries_question: %.02f hours were reported on the issues you are about to delete. What do you want to do ?
+error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
+text_assign_time_entries_to_project: Assign reported hours to the project
+text_destroy_time_entries: Delete reported hours
+text_reassign_time_entries: 'Reassign reported hours to this issue:'
+setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Display comments
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
+setting_display_subprojects_issues: Display subprojects issues on main projects by default
+label_overall_activity: Overall activity
+setting_default_projects_public: New projects are public by default
+error_scm_annotate: "The entry does not exist or can not be annotated."
+label_planning: Planning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
+label_and_its_subprojects: %s and its subprojects
+mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
+mail_subject_reminder: "%d issue(s) due in the next days"
+text_user_wrote: '%s wrote:'
+label_duplicated_by: duplicated by
+setting_enabled_scm: Enabled SCM
+text_enumeration_category_reassign_to: 'Reassign them to this value:'
+text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
+text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/no.yml b/lang/no.yml
new file mode 100644
index 000000000..7113b416a
--- /dev/null
+++ b/lang/no.yml
@@ -0,0 +1,640 @@
+_gloc_rule_default: '|n| n==1 ? "" : "_plural" '
+
+actionview_datehelper_select_day_prefix:
+actionview_datehelper_select_month_names: Januar,Februar,Mars,April,Mai,Juni,Juli,August,September,Oktober,November,Desember
+actionview_datehelper_select_month_names_abbr: Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Des
+actionview_datehelper_select_month_prefix:
+actionview_datehelper_select_year_prefix:
+actionview_datehelper_time_in_words_day: 1 dag
+actionview_datehelper_time_in_words_day_plural: %d dager
+actionview_datehelper_time_in_words_hour_about: ca. en time
+actionview_datehelper_time_in_words_hour_about_plural: ca. %d timer
+actionview_datehelper_time_in_words_hour_about_single: ca. en time
+actionview_datehelper_time_in_words_minute: 1 minutt
+actionview_datehelper_time_in_words_minute_half: et halvt minutt
+actionview_datehelper_time_in_words_minute_less_than: mindre enn et minutt
+actionview_datehelper_time_in_words_minute_plural: %d minutter
+actionview_datehelper_time_in_words_minute_single: 1 minutt
+actionview_datehelper_time_in_words_second_less_than: mindre enn et sekund
+actionview_datehelper_time_in_words_second_less_than_plural: mindre enn %d sekunder
+actionview_instancetag_blank_option: Vennligst velg
+
+activerecord_error_inclusion: finnes ikke i listen
+activerecord_error_exclusion: er reservert
+activerecord_error_invalid: er ugyldig
+activerecord_error_confirmation: stemmer ikke med bekreftelsen
+activerecord_error_accepted: må aksepteres
+activerecord_error_empty: kan ikke være tom
+activerecord_error_blank: kan ikke være blank
+activerecord_error_too_long: er for langt
+activerecord_error_too_short: er for kort
+activerecord_error_wrong_length: har feil lengde
+activerecord_error_taken: er opptatt
+activerecord_error_not_a_number: er ikke et nummer
+activerecord_error_not_a_date: er ikke en gyldig dato
+activerecord_error_greater_than_start_date: må være større enn startdato
+activerecord_error_not_same_project: hører ikke til samme prosjekt
+activerecord_error_circular_dependency: Denne relasjonen ville lagd en sirkulær avhengighet
+
+general_fmt_age: %d år
+general_fmt_age_plural: %d år
+general_fmt_date: %%d. %%B %%Y
+general_fmt_datetime: %%d. %%B %%H:%%M
+general_fmt_datetime_short: %%d.%%m.%%Y, %%H:%%M
+general_fmt_time: %%H:%%M
+general_text_No: 'Nei'
+general_text_Yes: 'Ja'
+general_text_no: 'nei'
+general_text_yes: 'ja'
+general_lang_name: 'Norwegian (Norsk bokmål)'
+general_csv_separator: ','
+general_csv_decimal_separator: '.'
+general_csv_encoding: ISO-8859-1
+general_pdf_encoding: ISO-8859-1
+general_day_names: Mandag,Tirsdag,Onsdag,Torsdag,Fredag,Lørdag,Søndag
+general_first_day_of_week: '1'
+
+notice_account_updated: Kontoen er oppdatert.
+notice_account_invalid_creditentials: Feil brukernavn eller passord
+notice_account_password_updated: Passordet er oppdatert.
+notice_account_wrong_password: Feil passord
+notice_account_register_done: Kontoen er opprettet. Klikk lenken som er sendt deg i e-post for å aktivere kontoen.
+notice_account_unknown_email: Ukjent bruker.
+notice_can_t_change_password: Denne kontoen bruker ekstern godkjenning. Passordet kan ikke endres.
+notice_account_lost_email_sent: En e-post med instruksjoner for å velge et nytt passord er sendt til deg.
+notice_account_activated: Din konto er aktivert. Du kan nå logge inn.
+notice_successful_create: Opprettet.
+notice_successful_update: Oppdatert.
+notice_successful_delete: Slettet.
+notice_successful_connection: Koblet opp.
+notice_file_not_found: Siden du forsøkte å vise eksisterer ikke, eller er slettet.
+notice_locking_conflict: Data har blitt oppdatert av en annen bruker.
+notice_not_authorized: Du har ikke adgang til denne siden.
+notice_email_sent: En e-post er sendt til %s
+notice_email_error: En feil oppstod under sending av e-post (%s)
+notice_feeds_access_key_reseted: Din RSS-tilgangsnøkkel er nullstilt.
+notice_failed_to_save_issues: "Lykkes ikke å lagre %d sak(er) på %d valgt: %s."
+notice_no_issue_selected: "Ingen sak valgt! Vennligst merk sakene du vil endre."
+notice_account_pending: "Din konto ble opprettet og avventer nå administrativ godkjenning."
+notice_default_data_loaded: Standardkonfigurasjonen lastet inn.
+
+error_can_t_load_default_data: "Standardkonfigurasjonen kunne ikke lastes inn: %s"
+error_scm_not_found: "Elementet og/eller revisjonen eksisterer ikke i depoet."
+error_scm_command_failed: "En feil oppstod under tilkobling til depoet: %s"
+error_scm_annotate: "Elementet eksisterer ikke, eller kan ikke noteres."
+error_issue_not_found_in_project: 'Saken eksisterer ikke, eller hører ikke til dette prosjektet'
+
+mail_subject_lost_password: Ditt %s passord
+mail_body_lost_password: 'Klikk følgende lenke for å endre ditt passord:'
+mail_subject_register: %s kontoaktivering
+mail_body_register: 'Klikk følgende lenke for å aktivere din konto:'
+mail_body_account_information_external: Du kan bruke din "%s"-konto for å logge inn.
+mail_body_account_information: Informasjon om din konto
+mail_subject_account_activation_request: %s kontoaktivering
+mail_body_account_activation_request: 'En ny bruker (%s) er registrert, og avventer din godkjenning:'
+mail_subject_reminder: "%d sak(er) har frist de kommende dagene"
+mail_body_reminder: "%d sak(er) som er tildelt deg har frist de kommende %d dager:"
+
+gui_validation_error: 1 feil
+gui_validation_error_plural: %d feil
+
+field_name: Navn
+field_description: Beskrivelse
+field_summary: Oppsummering
+field_is_required: Kreves
+field_firstname: Fornavn
+field_lastname: Etternavn
+field_mail: E-post
+field_filename: Fil
+field_filesize: Størrelse
+field_downloads: Nedlastinger
+field_author: Forfatter
+field_created_on: Opprettet
+field_updated_on: Oppdatert
+field_field_format: Format
+field_is_for_all: For alle prosjekter
+field_possible_values: Lovlige verdier
+field_regexp: Regular expression
+field_min_length: Minimum lengde
+field_max_length: Maksimum lengde
+field_value: Verdi
+field_category: Kategori
+field_title: Tittel
+field_project: Prosjekt
+field_issue: Sak
+field_status: Status
+field_notes: Notater
+field_is_closed: Lukker saken
+field_is_default: Standardverdi
+field_tracker: Sakstype
+field_subject: Emne
+field_due_date: Frist
+field_assigned_to: Tildelt til
+field_priority: Prioritet
+field_fixed_version: MÃ¥l-versjon
+field_user: Bruker
+field_role: Rolle
+field_homepage: Hjemmeside
+field_is_public: Offentlig
+field_parent: Underprosjekt til
+field_is_in_chlog: Vises i endringslogg
+field_is_in_roadmap: Vises i veikart
+field_login: Brukernavn
+field_mail_notification: E-post-varsling
+field_admin: Administrator
+field_last_login_on: Sist innlogget
+field_language: Språk
+field_effective_date: Dato
+field_password: Passord
+field_new_password: Nytt passord
+field_password_confirmation: Bekreft passord
+field_version: Versjon
+field_type: Type
+field_host: Vert
+field_port: Port
+field_account: Konto
+field_base_dn: Base DN
+field_attr_login: Brukernavnsattributt
+field_attr_firstname: Fornavnsattributt
+field_attr_lastname: Etternavnsattributt
+field_attr_mail: E-post-attributt
+field_onthefly: On-the-fly brukeropprettelse
+field_start_date: Start
+field_done_ratio: %% Ferdig
+field_auth_source: Autentifikasjonsmodus
+field_hide_mail: Skjul min e-post-adresse
+field_comments: Kommentarer
+field_url: URL
+field_start_page: Startside
+field_subproject: Underprosjekt
+field_hours: Timer
+field_activity: Aktivitet
+field_spent_on: Dato
+field_identifier: Identifikasjon
+field_is_filter: Brukes som filter
+field_issue_to_id: Relatert saker
+field_delay: Forsinkelse
+field_assignable: Saker kan tildeles denne rollen
+field_redirect_existing_links: Viderekoble eksisterende lenker
+field_estimated_hours: Estimert tid
+field_column_names: Kolonner
+field_time_zone: Tidssone
+field_searchable: Søkbar
+field_default_value: Standardverdi
+field_comments_sorting: Vis kommentarer
+
+setting_app_title: Applikasjonstittel
+setting_app_subtitle: Applikasjonens undertittel
+setting_welcome_text: Velkomsttekst
+setting_default_language: Standardspråk
+setting_login_required: Krever innlogging
+setting_self_registration: Selvregistrering
+setting_attachment_max_size: Maks. størrelse vedlegg
+setting_issues_export_limit: Eksportgrense for saker
+setting_mail_from: Avsenders e-post
+setting_bcc_recipients: Blindkopi (bcc) til mottakere
+setting_host_name: Vertsnavn
+setting_text_formatting: Tekstformattering
+setting_wiki_compression: Komprimering av Wiki-historikk
+setting_feeds_limit: Innholdsgrense for Feed
+setting_default_projects_public: Nye prosjekter er offentlige som standard
+setting_autofetch_changesets: Autohenting av innsendinger
+setting_sys_api_enabled: Aktiver webservice for depot-administrasjon
+setting_commit_ref_keywords: Nøkkelord for referanse
+setting_commit_fix_keywords: Nøkkelord for retting
+setting_autologin: Autoinnlogging
+setting_date_format: Datoformat
+setting_time_format: Tidsformat
+setting_cross_project_issue_relations: Tillat saksrelasjoner mellom prosjekter
+setting_issue_list_default_columns: Standardkolonner vist i sakslisten
+setting_repositories_encodings: Depot-tegnsett
+setting_emails_footer: E-post-signatur
+setting_protocol: Protokoll
+setting_per_page_options: Alternativer, objekter pr. side
+setting_user_format: Visningsformat, brukere
+setting_activity_days_default: Dager vist på prosjektaktivitet
+setting_display_subprojects_issues: Vis saker fra underprosjekter på hovedprosjekt som standard
+setting_enabled_scm: Aktiviserte SCM
+
+project_module_issue_tracking: Sakssporing
+project_module_time_tracking: Tidssporing
+project_module_news: Nyheter
+project_module_documents: Dokumenter
+project_module_files: Filer
+project_module_wiki: Wiki
+project_module_repository: Depot
+project_module_boards: Forumer
+
+label_user: Bruker
+label_user_plural: Brukere
+label_user_new: Ny bruker
+label_project: Prosjekt
+label_project_new: Nytt prosjekt
+label_project_plural: Prosjekter
+label_project_all: Alle prosjekter
+label_project_latest: Siste prosjekter
+label_issue: Sak
+label_issue_new: Ny sak
+label_issue_plural: Saker
+label_issue_view_all: Vis alle saker
+label_issues_by: Saker etter %s
+label_issue_added: Sak lagt til
+label_issue_updated: Sak oppdatert
+label_document: Dokument
+label_document_new: Nytt dokument
+label_document_plural: Dokumenter
+label_document_added: Dokument lagt til
+label_role: Rolle
+label_role_plural: Roller
+label_role_new: Ny rolle
+label_role_and_permissions: Roller og tillatelser
+label_member: Medlem
+label_member_new: Nytt medlem
+label_member_plural: Medlemmer
+label_tracker: Sakstype
+label_tracker_plural: Sakstyper
+label_tracker_new: Ny sakstype
+label_workflow: Arbeidsflyt
+label_issue_status: Saksstatus
+label_issue_status_plural: Saksstatuser
+label_issue_status_new: Ny status
+label_issue_category: Sakskategori
+label_issue_category_plural: Sakskategorier
+label_issue_category_new: Ny kategori
+label_custom_field: Eget felt
+label_custom_field_plural: Egne felt
+label_custom_field_new: Nytt eget felt
+label_enumerations: Kodelister
+label_enumeration_new: Ny verdi
+label_information: Informasjon
+label_information_plural: Informasjon
+label_please_login: Vennlist logg inn
+label_register: Registrer
+label_password_lost: Mistet passord
+label_home: Hjem
+label_my_page: Min side
+label_my_account: Min konto
+label_my_projects: Mine prosjekter
+label_administration: Administrasjon
+label_login: Logg inn
+label_logout: Logg ut
+label_help: Hjelp
+label_reported_issues: Rapporterte saker
+label_assigned_to_me_issues: Saker tildelt meg
+label_last_login: Sist innlogget
+label_last_updates: Sist oppdatert
+label_last_updates_plural: %d siste oppdaterte
+label_registered_on: Registrert
+label_activity: Aktivitet
+label_overall_activity: All aktivitet
+label_new: Ny
+label_logged_as: Innlogget som
+label_environment: Miljø
+label_authentication: Autentifikasjon
+label_auth_source: Autentifikasjonsmodus
+label_auth_source_new: Ny autentifikasjonmodus
+label_auth_source_plural: Autentifikasjonsmoduser
+label_subproject_plural: Underprosjekter
+label_and_its_subprojects: %s og dets underprosjekter
+label_min_max_length: Min.-maks. lengde
+label_list: Liste
+label_date: Dato
+label_integer: Heltall
+label_float: Kommatall
+label_boolean: Sann/usann
+label_string: Tekst
+label_text: Lang tekst
+label_attribute: Attributt
+label_attribute_plural: Attributter
+label_download: %d Nedlasting
+label_download_plural: %d Nedlastinger
+label_no_data: Ingen data å vise
+label_change_status: Endre status
+label_history: Historikk
+label_attachment: Fil
+label_attachment_new: Ny fil
+label_attachment_delete: Slett fil
+label_attachment_plural: Filer
+label_file_added: Fil lagt til
+label_report: Rapport
+label_report_plural: Rapporter
+label_news: Nyheter
+label_news_new: Legg til nyhet
+label_news_plural: Nyheter
+label_news_latest: Siste nyheter
+label_news_view_all: Vis alle nyheter
+label_news_added: Nyhet lagt til
+label_change_log: Endringslogg
+label_settings: Innstillinger
+label_overview: Oversikt
+label_version: Versjon
+label_version_new: Ny versjon
+label_version_plural: Versjoner
+label_confirmation: Bekreftelse
+label_export_to: Eksporter til
+label_read: Leser...
+label_public_projects: Offentlige prosjekt
+label_open_issues: åpen
+label_open_issues_plural: åpne
+label_closed_issues: lukket
+label_closed_issues_plural: lukkede
+label_total: Total
+label_permissions: Godkjenninger
+label_current_status: Nåværende status
+label_new_statuses_allowed: Tillatte nye statuser
+label_all: alle
+label_none: ingen
+label_nobody: ingen
+label_next: Neste
+label_previous: Forrige
+label_used_by: Brukt av
+label_details: Detaljer
+label_add_note: Legg til notis
+label_per_page: Pr. side
+label_calendar: Kalender
+label_months_from: måneder fra
+label_gantt: Gantt
+label_internal: Intern
+label_last_changes: siste %d endringer
+label_change_view_all: Vis alle endringer
+label_personalize_page: Tilpass denne siden
+label_comment: Kommentar
+label_comment_plural: Kommentarer
+label_comment_add: Legg til kommentar
+label_comment_added: Kommentar lagt til
+label_comment_delete: Slett kommentar
+label_query: Egen spørring
+label_query_plural: Egne spørringer
+label_query_new: Ny spørring
+label_filter_add: Legg til filter
+label_filter_plural: Filtre
+label_equals: er
+label_not_equals: er ikke
+label_in_less_than: er mindre enn
+label_in_more_than: in mer enn
+label_in: i
+label_today: idag
+label_all_time: all tid
+label_yesterday: i går
+label_this_week: denne uken
+label_last_week: sist uke
+label_last_n_days: siste %d dager
+label_this_month: denne måneden
+label_last_month: siste måned
+label_this_year: dette året
+label_date_range: Dato-spenn
+label_less_than_ago: mindre enn dager siden
+label_more_than_ago: mer enn dager siden
+label_ago: dager siden
+label_contains: inneholder
+label_not_contains: ikke inneholder
+label_day_plural: dager
+label_repository: Depot
+label_repository_plural: Depoter
+label_browse: Utforsk
+label_modification: %d endring
+label_modification_plural: %d endringer
+label_revision: Revisjon
+label_revision_plural: Revisjoner
+label_associated_revisions: Assosierte revisjoner
+label_added: lagt til
+label_modified: endret
+label_deleted: slettet
+label_latest_revision: Siste revisjon
+label_latest_revision_plural: Siste revisjoner
+label_view_revisions: Vis revisjoner
+label_max_size: Maksimum størrelse
+label_on: 'av'
+label_sort_highest: Flytt til toppen
+label_sort_higher: Flytt opp
+label_sort_lower: Flytt ned
+label_sort_lowest: Flytt til bunnen
+label_roadmap: Veikart
+label_roadmap_due_in: Frist om
+label_roadmap_overdue: %s over fristen
+label_roadmap_no_issues: Ingen saker for denne versjonen
+label_search: Søk
+label_result_plural: Resultater
+label_all_words: Alle ord
+label_wiki: Wiki
+label_wiki_edit: Wiki endring
+label_wiki_edit_plural: Wiki endringer
+label_wiki_page: Wiki-side
+label_wiki_page_plural: Wiki-sider
+label_index_by_title: Indekser etter tittel
+label_index_by_date: Indekser etter dato
+label_current_version: Gjeldende versjon
+label_preview: Forhåndsvis
+label_feed_plural: Feeder
+label_changes_details: Detaljer om alle endringer
+label_issue_tracking: Sakssporing
+label_spent_time: Brukt tid
+label_f_hour: %.2f time
+label_f_hour_plural: %.2f timer
+label_time_tracking: Tidssporing
+label_change_plural: Endringer
+label_statistics: Statistikk
+label_commits_per_month: Innsendinger pr. måned
+label_commits_per_author: Innsendinger pr. forfatter
+label_view_diff: Vis forskjeller
+label_diff_inline: i teksten
+label_diff_side_by_side: side ved side
+label_options: Alternativer
+label_copy_workflow_from: Kopier arbeidsflyt fra
+label_permissions_report: Godkjenningsrapport
+label_watched_issues: Overvåkede saker
+label_related_issues: Relaterte saker
+label_applied_status: Gitt status
+label_loading: Laster...
+label_relation_new: Ny relasjon
+label_relation_delete: Slett relasjon
+label_relates_to: relatert til
+label_duplicates: dupliserer
+label_duplicated_by: duplisert av
+label_blocks: blokkerer
+label_blocked_by: blokkert av
+label_precedes: kommer før
+label_follows: følger
+label_end_to_start: slutt til start
+label_end_to_end: slutt til slutt
+label_start_to_start: start til start
+label_start_to_end: start til slutt
+label_stay_logged_in: Hold meg innlogget
+label_disabled: avslått
+label_show_completed_versions: Vis ferdige versjoner
+label_me: meg
+label_board: Forum
+label_board_new: Nytt forum
+label_board_plural: Forumer
+label_topic_plural: Emner
+label_message_plural: Meldinger
+label_message_last: Siste melding
+label_message_new: Ny melding
+label_message_posted: Melding lagt til
+label_reply_plural: Svar
+label_send_information: Send kontoinformasjon til brukeren
+label_year: Ã…r
+label_month: MÃ¥ned
+label_week: Uke
+label_date_from: Fra
+label_date_to: Til
+label_language_based: Basert på brukerens språk
+label_sort_by: Sorter etter %s
+label_send_test_email: Send en e-post-test
+label_feeds_access_key_created_on: RSS tilgangsnøkkel opprettet for %s siden
+label_module_plural: Moduler
+label_added_time_by: Lagt til av %s for %s siden
+label_updated_time: Oppdatert for %s siden
+label_jump_to_a_project: GÃ¥ til et prosjekt...
+label_file_plural: Filer
+label_changeset_plural: Endringssett
+label_default_columns: Standardkolonner
+label_no_change_option: (Ingen endring)
+label_bulk_edit_selected_issues: Samlet endring av valgte saker
+label_theme: Tema
+label_default: Standard
+label_search_titles_only: Søk bare i titler
+label_user_mail_option_all: "For alle hendelser på mine prosjekter"
+label_user_mail_option_selected: "For alle hendelser på valgte prosjekt..."
+label_user_mail_option_none: "Bare for ting jeg overvåker eller er involvert i"
+label_user_mail_no_self_notified: "Jeg vil ikke bli varslet om endringer jeg selv gjør"
+label_registration_activation_by_email: kontoaktivering pr. e-post
+label_registration_manual_activation: manuell kontoaktivering
+label_registration_automatic_activation: automatisk kontoaktivering
+label_display_per_page: 'Pr. side: %s'
+label_age: Alder
+label_change_properties: Endre egenskaper
+label_general: Generell
+label_more: Mer
+label_scm: SCM
+label_plugins: Tillegg
+label_ldap_authentication: LDAP-autentifikasjon
+label_downloads_abbr: Nedl.
+label_optional_description: Valgfri beskrivelse
+label_add_another_file: Legg til en fil til
+label_preferences: Brukerinnstillinger
+label_chronological_order: I kronologisk rekkefølge
+label_reverse_chronological_order: I omvendt kronologisk rekkefølge
+label_planning: Planlegging
+
+button_login: Logg inn
+button_submit: Send
+button_save: Lagre
+button_check_all: Merk alle
+button_uncheck_all: Avmerk alle
+button_delete: Slett
+button_create: Opprett
+button_test: Test
+button_edit: Endre
+button_add: Legg til
+button_change: Endre
+button_apply: Bruk
+button_clear: Nullstill
+button_lock: LÃ¥s
+button_unlock: LÃ¥s opp
+button_download: Last ned
+button_list: Liste
+button_view: Vis
+button_move: Flytt
+button_back: Tilbake
+button_cancel: Avbryt
+button_activate: Aktiver
+button_sort: Sorter
+button_log_time: Logg tid
+button_rollback: Rull tilbake til denne versjonen
+button_watch: Overvåk
+button_unwatch: Stopp overvåkning
+button_reply: Svar
+button_archive: Arkiver
+button_unarchive: Gjør om arkivering
+button_reset: Nullstill
+button_rename: Endre navn
+button_change_password: Endre passord
+button_copy: Kopier
+button_annotate: Notér
+button_update: Oppdater
+button_configure: Konfigurer
+
+status_active: aktiv
+status_registered: registrert
+status_locked: låst
+
+text_select_mail_notifications: Velg hendelser som skal varsles med e-post.
+text_regexp_info: eg. ^[A-Z0-9]+$
+text_min_max_length_info: 0 betyr ingen begrensning
+text_project_destroy_confirmation: Er du sikker på at du vil slette dette prosjekter og alle relatert data ?
+text_subprojects_destroy_warning: 'Underprojekt(ene): %s vil også bli slettet.'
+text_workflow_edit: Velg en rolle og en sakstype for å endre arbeidsflyten
+text_are_you_sure: Er du sikker ?
+text_journal_changed: endret fra %s til %s
+text_journal_set_to: satt til %s
+text_journal_deleted: slettet
+text_tip_task_begin_day: oppgaven starter denne dagen
+text_tip_task_end_day: oppgaven avsluttes denne dagen
+text_tip_task_begin_end_day: oppgaven starter og avsluttes denne dagen
+text_project_identifier_info: 'Små bokstaver (a-z), nummer og bindestrek tillatt. Identifikatoren kan ikke endres etter den er lagret.'
+text_caracters_maximum: %d tegn maksimum.
+text_caracters_minimum: Må være minst %d tegn langt.
+text_length_between: Lengde mellom %d og %d tegn.
+text_tracker_no_workflow: Ingen arbeidsflyt definert for denne sakstypen
+text_unallowed_characters: Ugyldige tegn
+text_comma_separated: Flere verdier tillat (kommaseparert).
+text_issues_ref_in_commit_messages: Referering og retting av saker i innsendingsmelding
+text_issue_added: Sak %s er rapportert.
+text_issue_updated: Sak %s er oppdatert.
+text_wiki_destroy_confirmation: Er du sikker på at du vil slette denne wikien og alt innholdet ?
+text_issue_category_destroy_question: Noen saker (%d) er lagt til i denne kategorien. Hva vil du gjøre ?
+text_issue_category_destroy_assignments: Fjern bruk av kategorier
+text_issue_category_reassign_to: Overfør sakene til denne kategorien
+text_user_mail_option: "For ikke-valgte prosjekter vil du bare motta varsling om ting du overvåker eller er involveret i (eks. saker du er forfatter av eller er tildelt)."
+text_no_configuration_data: "Roller, arbeidsflyt, sakstyper og -statuser er ikke konfigurert enda.\nDet anbefales sterkt å laste inn standardkonfigurasjonen. Du vil kunne endre denne etter den er innlastet."
+text_load_default_configuration: Last inn standardkonfigurasjonen
+text_status_changed_by_changeset: Brukt i endringssett %s.
+text_issues_destroy_confirmation: 'Er du sikker på at du vil slette valgte sak(er) ?'
+text_select_project_modules: 'Velg moduler du vil aktivere for dette prosjektet:'
+text_default_administrator_account_changed: Standard administrator-konto er endret
+text_file_repository_writable: Fil-arkivet er skrivbart
+text_rmagick_available: RMagick er tilgjengelig (valgfritt)
+text_destroy_time_entries_question: %.02f timer er ført på sakene du er i ferd med å slette. Hva vil du gjøre ?
+text_destroy_time_entries: Slett førte timer
+text_assign_time_entries_to_project: Overfør førte timer til prosjektet
+text_reassign_time_entries: 'Overfør førte timer til denne saken:'
+text_user_wrote: '%s skrev:'
+
+default_role_manager: Leder
+default_role_developper: Utvikler
+default_role_reporter: Rapportør
+default_tracker_bug: Feil
+default_tracker_feature: Funksjon
+default_tracker_support: Support
+default_issue_status_new: Ny
+default_issue_status_assigned: Tildelt
+default_issue_status_resolved: Avklart
+default_issue_status_feedback: Tilbakemelding
+default_issue_status_closed: Lukket
+default_issue_status_rejected: Avvist
+default_doc_category_user: Bruker-dokumentasjon
+default_doc_category_tech: Teknisk dokumentasjon
+default_priority_low: Lav
+default_priority_normal: Normal
+default_priority_high: Høy
+default_priority_urgent: Haster
+default_priority_immediate: Omgående
+default_activity_design: Design
+default_activity_development: Utvikling
+
+enumeration_issue_priorities: Sakssprioriteringer
+enumeration_doc_categories: Dokument-kategorier
+enumeration_activities: Aktiviteter (tidssporing)
+text_enumeration_category_reassign_to: 'Reassign them to this value:'
+text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
+text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/pl.yml b/lang/pl.yml
index e2d90de74..e9ffcda2c 100644
--- a/lang/pl.yml
+++ b/lang/pl.yml
@@ -48,6 +48,7 @@ general_text_no: 'nie'
general_text_yes: 'tak'
general_lang_name: 'Polski'
general_csv_separator: ','
+general_csv_decimal_separator: '.'
general_csv_encoding: ISO-8859-2
general_pdf_encoding: ISO-8859-2
general_day_names: Poniedziałek,Wtorek,Środa,Czwartek,Piątek,Sobota,Niedziela
@@ -68,13 +69,15 @@ notice_successful_delete: Udane usunięcie.
notice_successful_connection: Udane nawiązanie połączenia.
notice_file_not_found: Strona do której próbujesz się dostać nie istnieje lub została usunięta.
notice_locking_conflict: Dane poprawione przez innego użytkownika.
-notice_scm_error: Wejście i/lub zmiana nie istnieje w repozytorium.
notice_not_authorized: Nie jesteś autoryzowany by zobaczyć stronę.
-mail_subject_lost_password: Twoje hasło do redMine
+error_scm_not_found: "Obiekt lub wersja nie zostały znalezione w repozytorium."
+error_scm_command_failed: "An error occurred when trying to access the repository: %s"
+
+mail_subject_lost_password: Twoje hasło do %s
mail_body_lost_password: 'W celu zmiany swojego hasła użyj poniższego odnośnika:'
-mail_subject_register: Aktywacja konta w redMine
-mail_body_register: 'W celu aktywacji Twojego konta w Redmine, użyj poniższego odnośnika:'
+mail_subject_register: Aktywacja konta w %s
+mail_body_register: 'W celu aktywacji Twojego konta, użyj poniższego odnośnika:'
gui_validation_error: 1 błąd
gui_validation_error_plural: %d błędów
@@ -102,24 +105,24 @@ field_value: Wartość
field_category: Kategoria
field_title: Tytuł
field_project: Projekt
-field_issue: Zgłoszenie
+field_issue: Zagadnienie
field_status: Status
field_notes: Notatki
-field_is_closed: Zgłoszenie zamknięte
+field_is_closed: Zagadnienie zamknięte
field_is_default: Domyślny status
-field_tracker: Typ zgłoszenia
+field_tracker: Typ zagadnienia
field_subject: Temat
field_due_date: Data oddania
field_assigned_to: Przydzielony do
field_priority: Priorytet
-field_fixed_version: Wersja
+field_fixed_version: Wersja docelowa
field_user: Użytkownik
field_role: Rola
field_homepage: Strona www
field_is_public: Publiczny
-field_parent: Subprojekt
-field_is_in_chlog: Zgłoszenia pokazane w zapisie zmian
-field_is_in_roadmap: Zgłoszenia pokazane na mapie
+field_parent: Nadprojekt
+field_is_in_chlog: Zagadnienie pokazywane w zapisie zmian
+field_is_in_roadmap: Zagadnienie pokazywane na mapie
field_login: Login
field_mail_notification: Powiadomienia Email
field_admin: Administrator
@@ -152,9 +155,10 @@ field_hours: Godzin
field_activity: Aktywność
field_spent_on: Data
field_identifier: Identifikator
-field_is_filter: Używane jako filter
-field_issue_to_id: Powiązane zgłoszenie
+field_is_filter: Atrybut filtrowania
+field_issue_to_id: PowiÄ…zania zagadnienia
field_delay: Opóźnienie
+field_default_value: Domyślny
setting_app_title: Tytuł aplikacji
setting_app_subtitle: Podtytuł aplikacji
@@ -163,16 +167,16 @@ setting_default_language: Domyślny język
setting_login_required: Identyfikacja wymagana
setting_self_registration: Własna rejestracja umożliwiona
setting_attachment_max_size: Maks. rozm. załącznika
-setting_issues_export_limit: Limit eksportu zgłoszeń
+setting_issues_export_limit: Limit eksportu zagadnień
setting_mail_from: Adres email wysyłki
setting_host_name: Nazwa hosta
setting_text_formatting: Formatowanie tekstu
setting_wiki_compression: Kompresja historii Wiki
setting_feeds_limit: Limit danych RSS
-setting_autofetch_changesets: Auto-odświeżanie CVS
+setting_autofetch_changesets: Automatyczne pobieranie zmian
setting_sys_api_enabled: Włączenie WS do zarządzania repozytorium
-setting_commit_ref_keywords: Terminy odnoszÄ…ce (CVS)
-setting_commit_fix_keywords: Terminy ustalajÄ…ce (CVS)
+setting_commit_ref_keywords: Słowa tworzące powiązania
+setting_commit_fix_keywords: Słowa zmieniające status
setting_autologin: Auto logowanie
setting_date_format: Format daty
@@ -184,10 +188,10 @@ label_project_new: Nowy projekt
label_project_plural: Projekty
label_project_all: Wszystkie projekty
label_project_latest: Ostatnie projekty
-label_issue: Zgłoszenie
-label_issue_new: Nowe zgłoszenie
-label_issue_plural: Zgłoszenia
-label_issue_view_all: Zobacz wszystkie zgłoszenia
+label_issue: Zagadnienie
+label_issue_new: Nowe zagadnienie
+label_issue_plural: Zagadnienia
+label_issue_view_all: Zobacz wszystkie zagadnienia
label_document: Dokument
label_document_new: Nowy dokument
label_document_plural: Dokumenty
@@ -198,15 +202,15 @@ label_role_and_permissions: Role i Uprawnienia
label_member: Uczestnik
label_member_new: Nowy uczestnik
label_member_plural: Uczestnicy
-label_tracker: Typ zgłoszenia
-label_tracker_plural: Typy zgłoszeń
-label_tracker_new: Nowy typ zgłoszenia
+label_tracker: Typ zagadnienia
+label_tracker_plural: Typy zagadnień
+label_tracker_new: Nowy typ zagadnienia
label_workflow: Przepływ
-label_issue_status: Status zgłoszenia
-label_issue_status_plural: Statusy zgłoszeń
+label_issue_status: Status zagadnienia
+label_issue_status_plural: Statusy zagadnień
label_issue_status_new: Nowy status
-label_issue_category: Kategoria zgłoszenia
-label_issue_category_plural: Kategorie zgłoszeń
+label_issue_category: Kategoria zagadnienia
+label_issue_category_plural: Kategorie zagadnień
label_issue_category_new: Nowa kategoria
label_custom_field: Dowolne pole
label_custom_field_plural: Dowolne pola
@@ -226,8 +230,8 @@ label_administration: Administracja
label_login: Login
label_logout: Wylogowanie
label_help: Pomoc
-label_reported_issues: Zaraportowane zgłoszenia
-label_assigned_to_me_issues: Zgłoszenia przypisane do mnie
+label_reported_issues: Wprowadzone zagadnienia
+label_assigned_to_me_issues: Zagadnienia przypisane do mnie
label_last_login: Ostatnie połączenie
label_last_updates: Ostatnia zmieniana
label_last_updates_plural: %d ostatnie zmiany
@@ -244,8 +248,8 @@ label_subproject_plural: Podprojekty
label_min_max_length: Min - Maks długość
label_list: Lista
label_date: Data
-label_integer: L. pojedyńcza
-label_boolean: Wart. logiczna
+label_integer: Liczba całkowita
+label_boolean: Wartość logiczna
label_string: Tekst
label_text: Długi tekst
label_attribute: Atrybut
@@ -261,11 +265,11 @@ label_attachment_delete: Skasuj plik
label_attachment_plural: Pliki
label_report: Raport
label_report_plural: Raporty
-label_news: Nowość
-label_news_new: Dodaj nowość
-label_news_plural: Nowości
-label_news_latest: Ostatnie nowości
-label_news_view_all: Pokaż wszystkie nowości
+label_news: Wiadomość
+label_news_new: Dodaj wiadomość
+label_news_plural: Wiadomości
+label_news_latest: Ostatnie wiadomości
+label_news_view_all: Pokaż wszystkie wiadomości
label_change_log: Lista zmian
label_settings: Ustawienia
label_overview: PrzeglÄ…d
@@ -325,23 +329,23 @@ label_repository: Repozytorium
label_browse: PrzeglÄ…d
label_modification: %d modyfikacja
label_modification_plural: %d modyfikacja
-label_revision: Zmiana
-label_revision_plural: Zmiany
+label_revision: Rewizja
+label_revision_plural: Rewizje
label_added: dodane
-label_modified: zmodufikowane
+label_modified: zmodyfikowane
label_deleted: usunięte
-label_latest_revision: Ostatnia zmiana
-label_latest_revision_plural: Ostatnie zmiany
-label_view_revisions: Pokaż zmiany
-label_max_size: Kamsymalny rozmiar
-label_on: 'włączone'
+label_latest_revision: Najnowsza rewizja
+label_latest_revision_plural: Najnowsze rewizje
+label_view_revisions: Pokaż rewizje
+label_max_size: Maksymalny rozmiar
+label_on: 'z'
label_sort_highest: Przesuń na górę
label_sort_higher: Do góry
label_sort_lower: Do dołu
label_sort_lowest: Przesuń na dół
label_roadmap: Mapa
label_roadmap_due_in: W czasie
-label_roadmap_no_issues: Brak zgłoszeń do tej wersji
+label_roadmap_no_issues: Brak zagadnień do tej wersji
label_search: Szukaj
label_result_plural: Rezultatów
label_all_words: Wszystkie słowa
@@ -356,23 +360,23 @@ label_current_version: Obecna wersja
label_preview: PodglÄ…d
label_feed_plural: Ilość RSS
label_changes_details: Szczegóły wszystkich zmian
-label_issue_tracking: Śledzenie zgłoszeń
+label_issue_tracking: Śledzenie zagadnień
label_spent_time: Spędzony czas
label_f_hour: %.2f godzina
label_f_hour_plural: %.2f godzin
label_time_tracking: Åšledzenie czasu
label_change_plural: Zmiany
label_statistics: Statystyki
-label_commits_per_month: Wrzutek CVS w miesiÄ…cu
-label_commits_per_author: Wrzutek CVS przez autora
+label_commits_per_month: Zatwierdzenia według miesięcy
+label_commits_per_author: Zatwierdzenia według autorów
label_view_diff: Pokaż różnice
label_diff_inline: w linii
label_diff_side_by_side: obok siebie
label_options: Opcje
label_copy_workflow_from: Kopiuj przepływ z
label_permissions_report: Raport uprawnień
-label_watched_issues: Obserwowane zgłoszenia
-label_related_issues: Powiązane zgłoszenia
+label_watched_issues: Obserwowane zagadnienia
+label_related_issues: PowiÄ…zane zagadnienia
label_applied_status: Stosowany status
label_loading: Åadowanie...
label_relation_new: Nowe powiÄ…zanie
@@ -430,7 +434,7 @@ button_back: Wstecz
button_cancel: Anuluj
button_activate: Aktywuj
button_sort: Sortuj
-button_log_time: Logowanie czasu
+button_log_time: Log czasu
button_rollback: Przywróc do tej wersji
button_watch: Obserwuj
button_unwatch: Nie obserwuj
@@ -446,7 +450,7 @@ text_select_mail_notifications: Zaznacz czynności przy których użytkownik pow
text_regexp_info: np. ^[A-Z0-9]+$
text_min_max_length_info: 0 oznacza brak restrykcji
text_project_destroy_confirmation: Jesteś pewien, że chcesz usunąć ten projekt i wszyskie powiązane dane?
-text_workflow_edit: Zaznacz rolę i typ zgłoszenia do edycji przepływu
+text_workflow_edit: Zaznacz rolę i typ zagadnienia do edycji przepływu
text_are_you_sure: JesteÅ› pewien ?
text_journal_changed: zmienione %s do %s
text_journal_set_to: ustawione na %s
@@ -457,16 +461,16 @@ text_tip_task_begin_end_day: zadanie zaczynające i kończące się dzisiaj
text_project_identifier_info: 'Małe litery (a-z), liczby i myślniki dozwolone. Raz zapisany, identyfikator nie może być zmieniony.'
text_caracters_maximum: %d znaków maksymalnie.
text_length_between: Długość pomiędzy %d i %d znaków.
-text_tracker_no_workflow: Brak przepływu zefiniowanego dla tego typu zgłoszenia
+text_tracker_no_workflow: Brak przepływu zefiniowanego dla tego typu zagadnienia
text_unallowed_characters: Niedozwolone znaki
text_comma_separated: Wielokrotne wartości dozwolone (rozdzielone przecinkami).
-text_issues_ref_in_commit_messages: Zgłoszenia odnoszące i ustalające we wrzutkach CVS
+text_issues_ref_in_commit_messages: Odwołania do zagadnień w komentarzach zatwierdzeń
default_role_manager: Kierownik
default_role_developper: Programista
-default_role_reporter: RaportujÄ…cy
+default_role_reporter: Wprowadzajacy
default_tracker_bug: Błąd
-default_tracker_feature: Cecha
+default_tracker_feature: Zadanie
default_tracker_support: Wsparcie
default_issue_status_new: Nowy
default_issue_status_assigned: Przypisany
@@ -480,29 +484,29 @@ default_priority_low: Niski
default_priority_normal: Normalny
default_priority_high: Wysoki
default_priority_urgent: Pilny
-default_priority_immediate: Natyczmiastowy
+default_priority_immediate: Natychmiastowy
default_activity_design: Projektowanie
default_activity_development: Rozwój
-enumeration_issue_priorities: Priorytety zgłoszeń
+enumeration_issue_priorities: Priorytety zagadnień
enumeration_doc_categories: Kategorie dokumentów
enumeration_activities: Działania (śledzenie czasu)
button_rename: Zmień nazwę
-text_issue_category_destroy_question: Zgłoszenia (%d) są przypisane do tej kategorii. Co chcesz uczynić?
+text_issue_category_destroy_question: Zagadnienia (%d) są przypisane do tej kategorii. Co chcesz uczynić?
label_feeds_access_key_created_on: Klucz dostępu RSS stworzony %s dni temu
-setting_cross_project_issue_relations: Zezwól na powiązania zgłoszeń między projektami
+setting_cross_project_issue_relations: Zezwól na powiązania zagadnień między projektami
label_roadmap_overdue: %s spóźnienia
label_module_plural: Moduły
label_this_week: ten tydzień
label_jump_to_a_project: Skocz do projektu...
-field_assignable: Zgłoszenia mogą być przypisane do tej roli
+field_assignable: Zagadnienia mogą być przypisane do tej roli
label_sort_by: Sortuj po %s
-text_issue_updated: Zgłoszenie %s zostało zaktualizowane.
+text_issue_updated: Zagadnienie %s zostało zaktualizowane (by %s).
notice_feeds_access_key_reseted: Twój klucz dostępu RSS został zrestetowany.
field_redirect_existing_links: Przekierowanie istniejących odnośników
-text_issue_category_reassign_to: Przywróć zgłoszenia do tej kategorii
+text_issue_category_reassign_to: Przydziel zagadnienie do tej kategorii
notice_email_sent: Email został wysłany do %s
-text_issue_added: Zgłoszenie %s zostało zaraportowane.
+text_issue_added: Zagadnienie %s zostało wprowadzone (by %s).
text_wiki_destroy_confirmation: Jesteś pewien, że chcesz usunąć to wiki i całą jego zawartość ?
notice_email_error: Wystąpił błąd w trakcie wysyłania maila (%s)
label_updated_time: Zaktualizowane %s temu
@@ -518,29 +522,118 @@ label_default_columns: Domyślne kolumny
setting_issue_list_default_columns: Domyślne kolumny wiświetlane na liście zagadnień
setting_repositories_encodings: Kodowanie repozytoriów
notice_no_issue_selected: "Nie wybrano zagadnienia! Zaznacz zagadnienie, które chcesz edytować."
-label_bulk_edit_selected_issues: Bulk edit selected issues
+label_bulk_edit_selected_issues: Zbiorowa edycja zagadnień
label_no_change_option: (Bez zmian)
notice_failed_to_save_issues: "Błąd podczas zapisu zagadnień %d z %d zaznaczonych: %s."
label_theme: Temat
label_default: Domyślne
label_search_titles_only: Przeszukuj tylko tytuły
-label_nobody: nobody
-button_change_password: Change password
-text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)."
-label_user_mail_option_selected: "For any event on the selected projects only..."
-label_user_mail_option_all: "For any event on all my projects"
-label_user_mail_option_none: "Only for things I watch or I'm involved in"
-setting_emails_footer: Emails footer
-label_float: Float
-button_copy: Copy
-mail_body_account_information_external: Możesz użyć twojego "%s" konta do zalogowania do Redmine.
-mail_body_account_information: Twoje konto w Redmine
-setting_protocol: Protocol
-label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
-setting_time_format: Time format
-label_registration_activation_by_email: account activation by email
-mail_subject_account_activation_request: Redmine account activation request
-mail_body_account_activation_request: 'A new user (%s) has registered. His account his pending your approval:'
-label_registration_automatic_activation: automatic account activation
-label_registration_manual_activation: manual account activation
-notice_account_pending: "Your account was created and is now pending administrator approval."
+label_nobody: nikt
+button_change_password: Zmień hasło
+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)."
+label_user_mail_option_selected: "Tylko dla każdego zdarzenia w wybranych projektach..."
+label_user_mail_option_all: "Dla każdego zdarzenia w każdym moim projekcie"
+label_user_mail_option_none: "Tylko to co obserwuje lub w czym biorę udział"
+setting_emails_footer: Stopka e-mail
+label_float: Liczba rzeczywista
+button_copy: Kopia
+mail_body_account_information_external: Możesz użyć twojego "%s" konta do zalogowania.
+mail_body_account_information: Twoje konto
+setting_protocol: Protokoł
+label_user_mail_no_self_notified: "Nie chcę powiadomień o zmianach, które sam wprowadzam."
+setting_time_format: Format czasu
+label_registration_activation_by_email: aktywacja konta przez e-mail
+mail_subject_account_activation_request: Zapytanie aktywacyjne konta %s
+mail_body_account_activation_request: 'Zarejestrowano nowego użytkownika: (%s). Konto oczekuje na twoje zatwierdzenie:'
+label_registration_automatic_activation: automatyczna aktywacja kont
+label_registration_manual_activation: manualna aktywacja kont
+notice_account_pending: "Twoje konto zostało utworzone i oczekuje na zatwierdzenie administratora."
+field_time_zone: Strefa czasowa
+text_caracters_minimum: Musi być nie krótsze niż %d znaków.
+setting_bcc_recipients: Odbiorcy kopii tajnej (kt/bcc)
+button_annotate: Adnotuj
+label_issues_by: Zagadnienia wprowadzone przez %s
+field_searchable: Przeszukiwalne
+label_display_per_page: 'Na stronÄ™: %s'
+setting_per_page_options: Opcje ilości obiektów na stronie
+label_age: Wiek
+notice_default_data_loaded: Domyślna konfiguracja została pomyślnie załadowana.
+text_load_default_configuration: Załaduj domyślną konfigurację
+text_no_configuration_data: "Role użytkowników, typy zagadnień, statusy zagadnień oraz przepływ pracy nie zostały jeszcze skonfigurowane.\nJest wysoce rekomendowane by załadować domyślną konfigurację. Po załadowaniu będzie możliwość edycji tych danych."
+error_can_t_load_default_data: "Domyślna konfiguracja nie może być załadowana: %s"
+button_update: Uaktualnij
+label_change_properties: Zmień właściwości
+label_general: Ogólne
+label_repository_plural: Repozytoria
+label_associated_revisions: Skojarzone rewizje
+setting_user_format: Personalny format wyświetlania
+text_status_changed_by_changeset: Zastosowane w zmianach %s.
+label_more: Więcej
+text_issues_destroy_confirmation: 'Czy jestes pewien, że chcesz usunąć wskazane zagadnienia?'
+label_scm: SCM
+text_select_project_modules: 'Wybierz moduły do aktywacji w tym projekcie:'
+label_issue_added: Dodano zagadnienie
+label_issue_updated: Uaktualniono zagadnienie
+label_document_added: Dodano dokument
+label_message_posted: Dodano wiadomość
+label_file_added: Dodano plik
+label_news_added: Dodano wiadomość
+project_module_boards: Fora
+project_module_issue_tracking: Śledzenie zagadnień
+project_module_wiki: Wiki
+project_module_files: Pliki
+project_module_documents: Dokumenty
+project_module_repository: Repozytorium
+project_module_news: Wiadomości
+project_module_time_tracking: Åšledzenie czasu
+text_file_repository_writable: Zapisywalne repozytorium plików
+text_default_administrator_account_changed: Zmieniono domyślne hasło administratora
+text_rmagick_available: RMagick dostępne (opcjonalnie)
+button_configure: Konfiguruj
+label_plugins: Wtyczki
+label_ldap_authentication: Autoryzacja LDAP
+label_downloads_abbr: Pobieranie
+label_this_month: ten miesiÄ…c
+label_last_n_days: ostatnie %d dni
+label_all_time: cały czas
+label_this_year: ten rok
+label_date_range: Zakres datowy
+label_last_week: ostatni tydzień
+label_yesterday: wczoraj
+label_last_month: ostatni miesiÄ…c
+label_add_another_file: Dodaj kolejny plik
+label_optional_description: Opcjonalny opis
+text_destroy_time_entries_question: Zalogowano %.02f godzin przy zagadnieniu, które chcesz usunąć. Co chcesz zrobić?
+error_issue_not_found_in_project: 'Zaganienie nie zostało znalezione lub nie należy do tego projektu'
+text_assign_time_entries_to_project: Przypisz logowany czas do projektu
+text_destroy_time_entries: Usuń zalogowany czas
+text_reassign_time_entries: 'Przepnij zalogowany czas do tego zagadnienia:'
+label_chronological_order: W kolejności chronologicznej
+setting_activity_days_default: Dni wyświetlane w aktywności projektu
+setting_display_subprojects_issues: Domyślnie pokazuj zagadnienia podprojektów w głównym projekcie
+field_comments_sorting: Pokazuj komentarze
+label_reverse_chronological_order: W kolejności odwrotnej do chronologicznej
+label_preferences: Preferencje
+label_overall_activity: Ogólna aktywność
+setting_default_projects_public: Nowe projekty są domyślnie publiczne
+error_scm_annotate: "Wpis nie istnieje lub nie można do niego dodawać adnotacji."
+label_planning: Planning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
+label_and_its_subprojects: %s and its subprojects
+mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
+mail_subject_reminder: "%d issue(s) due in the next days"
+text_user_wrote: '%s wrote:'
+label_duplicated_by: duplicated by
+setting_enabled_scm: Enabled SCM
+text_enumeration_category_reassign_to: 'Reassign them to this value:'
+text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
+text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/pt-br.yml b/lang/pt-br.yml
index 80c57d3f4..b4064bf58 100644
--- a/lang/pt-br.yml
+++ b/lang/pt-br.yml
@@ -1,138 +1,141 @@
_gloc_rule_default: '|n| n==1 ? "" : "_plural" '
actionview_datehelper_select_day_prefix:
-actionview_datehelper_select_month_names: Janeiro,Fevereiro,Marco,Abrill,Maio,Junho,Julho,Agosto,Setembro,Outubro,Novembro,Dezembro
+actionview_datehelper_select_month_names: Janeiro,Fevereiro,Março,Abrill,Maio,Junho,Julho,Agosto,Setembro,Outubro,Novembro,Dezembro
actionview_datehelper_select_month_names_abbr: Jan,Fev,Mar,Abr,Mai,Jun,Jul,Ago,Set,Out,Nov,Dez
actionview_datehelper_select_month_prefix:
actionview_datehelper_select_year_prefix:
actionview_datehelper_time_in_words_day: 1 dia
actionview_datehelper_time_in_words_day_plural: %d dias
-actionview_datehelper_time_in_words_hour_about: sobre uma hora
-actionview_datehelper_time_in_words_hour_about_plural: sobra %d horas
-actionview_datehelper_time_in_words_hour_about_single: sobre uma hora
+actionview_datehelper_time_in_words_hour_about: aproximadamente uma hora
+actionview_datehelper_time_in_words_hour_about_plural: aproximadamente %d horas
+actionview_datehelper_time_in_words_hour_about_single: aproximadamente uma hora
actionview_datehelper_time_in_words_minute: 1 minuto
actionview_datehelper_time_in_words_minute_half: meio minuto
-actionview_datehelper_time_in_words_minute_less_than: menos que um minuto
+actionview_datehelper_time_in_words_minute_less_than: menos de um minuto
actionview_datehelper_time_in_words_minute_plural: %d minutos
actionview_datehelper_time_in_words_minute_single: 1 minuto
-actionview_datehelper_time_in_words_second_less_than: menos que um segundo
-actionview_datehelper_time_in_words_second_less_than_plural: menos que %d segundos
+actionview_datehelper_time_in_words_second_less_than: menos de um segundo
+actionview_datehelper_time_in_words_second_less_than_plural: menos de %d segundos
actionview_instancetag_blank_option: Selecione
-activerecord_error_inclusion: nao esta incluido na lista
-activerecord_error_exclusion: esta reservado
-activerecord_error_invalid: e invalido
-activerecord_error_confirmation: confirmacao nao confere
+activerecord_error_inclusion: não está incluso na lista
+activerecord_error_exclusion: está reservado
+activerecord_error_invalid: é inválido
+activerecord_error_confirmation: confirmação não confere
activerecord_error_accepted: deve ser aceito
-activerecord_error_empty: nao pode ser vazio
-activerecord_error_blank: nao pode estar em branco
-activerecord_error_too_long: e muito longo
-activerecord_error_too_short: e muito comprido
-activerecord_error_wrong_length: esta com o comprimento errado
-activerecord_error_taken: ja esta examinado
-activerecord_error_not_a_number: nao e um numero
-activerecord_error_not_a_date: nao e uma data valida
+activerecord_error_empty: não pode ser vazio
+activerecord_error_blank: não pode estar em branco
+activerecord_error_too_long: é muito longo
+activerecord_error_too_short: é muito curto
+activerecord_error_wrong_length: esta com o tamanho errado
+activerecord_error_taken: já foi obtido
+activerecord_error_not_a_number: não é um numero
+activerecord_error_not_a_date: não é uma data valida
activerecord_error_greater_than_start_date: deve ser maior que a data inicial
-activerecord_error_not_same_project: doesn't belong to the same project
-activerecord_error_circular_dependency: This relation would create a circular dependency
+activerecord_error_not_same_project: não pode pertencer ao mesmo projeto
+activerecord_error_circular_dependency: Esta relação geraria uma dependência circular
-general_fmt_age: %d yr
-general_fmt_age_plural: %d yrs
-general_fmt_date: %%m/%%d/%%Y
-general_fmt_datetime: %%m/%%d/%%Y %%I:%%M %%p
+general_fmt_age: %d ano
+general_fmt_age_plural: %d anos
+general_fmt_date: %%d/%%m/%%Y
+general_fmt_datetime: %%d/%%m/%%Y %%I:%%M %%p
general_fmt_datetime_short: %%b %%d, %%I:%%M %%p
general_fmt_time: %%I:%%M %%p
-general_text_No: 'Nao'
+general_text_No: 'Não'
general_text_Yes: 'Sim'
-general_text_no: 'nao'
+general_text_no: 'não'
general_text_yes: 'sim'
-general_lang_name: 'Portugues Brasileiro'
+general_lang_name: 'Português(Brasil)'
general_csv_separator: ','
+general_csv_decimal_separator: '.'
general_csv_encoding: ISO-8859-1
general_pdf_encoding: ISO-8859-1
-general_day_names: Segunda,Terca,Quarta,Quinta,Sexta,Sabado,Domingo
+general_day_names: Segunda,Terça,Quarta,Quinta,Sexta,Sabado,Domingo
general_first_day_of_week: '1'
notice_account_updated: Conta foi alterada com sucesso.
-notice_account_invalid_creditentials: Usuario ou senha invalido.
-notice_account_password_updated: Senha foi alterada com sucesso.
-notice_account_wrong_password: Senha errada.
-notice_account_register_done: Conta foi criada com sucesso.
-notice_account_unknown_email: Usuario desconhecido.
-notice_can_t_change_password: Esta conta usa autenticacao externa. E impossivel trocar a senha.
-notice_account_lost_email_sent: Um email com instrucoes para escolher uma nova senha foi enviado para voce.
-notice_account_activated: Sua conta foi ativada. Voce pode logar agora
+notice_account_invalid_creditentials: Usuário ou senha inválido.
+notice_account_password_updated: Senha alterada com sucesso.
+notice_account_wrong_password: Senha inválida.
+notice_account_register_done: Conta criada com sucesso.
+notice_account_unknown_email: Usuário desconhecido.
+notice_can_t_change_password: Esta conta usa autenticação externa. E impossÃvel alterar a senha.
+notice_account_lost_email_sent: Um email com instruções para escolher uma nova senha foi enviado para você.
+notice_account_activated: Sua conta foi ativada. Você pode acessá-la agora.
notice_successful_create: Criado com sucesso.
notice_successful_update: Alterado com sucesso.
-notice_successful_delete: Apagado com sucesso.
+notice_successful_delete: ExcluÃdo com sucesso.
notice_successful_connection: Conectado com sucesso.
-notice_file_not_found: A pagina que voce esta tentando acessar nao existe ou foi excluida.
-notice_locking_conflict: Os dados foram atualizados por um outro usuario.
-notice_scm_error: A entrada e/ou a revisao nao existem no repositorio.
-notice_not_authorized: You are not authorized to access this page.
-notice_email_sent: An email was sent to %s
-notice_email_error: An error occurred while sending mail (%s)
-notice_feeds_access_key_reseted: Your RSS access key was reseted.
+notice_file_not_found: A página que você está tentando acessar não existe ou foi excluÃda.
+notice_locking_conflict: Os dados foram atualizados por outro usuário.
+notice_not_authorized: Você não está autorizado a acessar esta página.
+notice_email_sent: Um email foi enviado para %s
+notice_email_error: Um erro ocorreu ao enviar o email (%s)
+notice_feeds_access_key_reseted: Sua chave RSS foi reconfigurada.
-mail_subject_lost_password: Sua senha do redMine.
+error_scm_not_found: "A entrada e/ou a revisão não existe no repositório."
+error_scm_command_failed: "Ocorreu um erro ao tentar acessar o repositório: %s"
+
+mail_subject_lost_password: Sua senha do %s.
mail_body_lost_password: 'Para mudar sua senha, clique no link abaixo:'
-mail_subject_register: Ativacao de conta do redMine.
-mail_body_register: 'Para ativar sua conta do Redmine, clique no link abaixo:'
+mail_subject_register: Ativação de conta do %s.
+mail_body_register: 'Para ativar sua conta, clique no link abaixo:'
gui_validation_error: 1 erro
gui_validation_error_plural: %d erros
field_name: Nome
-field_description: Descricao
-field_summary: Sumario
-field_is_required: Obrigatorio
+field_description: Descrição
+field_summary: Resumo
+field_is_required: Obrigatório
field_firstname: Primeiro nome
-field_lastname: Ultimo nome
+field_lastname: Último nome
field_mail: Email
field_filename: Arquivo
field_filesize: Tamanho
field_downloads: Downloads
field_author: Autor
-field_created_on: Criado
-field_updated_on: Alterado
+field_created_on: Criado em
+field_updated_on: Alterado em
field_field_format: Formato
field_is_for_all: Para todos os projetos
-field_possible_values: Possiveis valores
-field_regexp: Expressao regular
-field_min_length: Tamanho minimo
-field_max_length: Tamanho maximo
+field_possible_values: PossÃveis valores
+field_regexp: Expressão regular
+field_min_length: Tamanho mÃnimo
+field_max_length: Tamanho máximo
field_value: Valor
field_category: Categoria
-field_title: Titulo
+field_title: TÃtulo
field_project: Projeto
-field_issue: Tarefa
+field_issue: Ticket
field_status: Status
field_notes: Notas
-field_is_closed: Tarefa fechada
-field_is_default: Status padrao
+field_is_closed: Ticket fechado
+field_is_default: Status padrão
field_tracker: Tipo
-field_subject: Titulo
-field_due_date: Data devida
-field_assigned_to: Atribuido para
+field_subject: TÃtulo
+field_due_date: Data prevista
+field_assigned_to: AtribuÃdo para
field_priority: Prioridade
-field_fixed_version: Versao corrigida
-field_user: Usuario
-field_role: Regra
-field_homepage: Pagina inicial
-field_is_public: Publico
+field_fixed_version: Versão
+field_user: Usuário
+field_role: Papel
+field_homepage: Página inicial
+field_is_public: Público
field_parent: Sub-projeto de
-field_is_in_chlog: Tarefas mostradas no changelog
-field_is_in_roadmap: Tarefas mostradas no roadmap
+field_is_in_chlog: Tarefas exibidas no registro de alterações
+field_is_in_roadmap: Tarefas exibidas no planejamento
field_login: Login
-field_mail_notification: Notificacoes por email
+field_mail_notification: Notificações por email
field_admin: Administrador
-field_last_login_on: Ultima conexao
-field_language: Lingua
+field_last_login_on: Última conexão
+field_language: Idioma
field_effective_date: Data
field_password: Senha
field_new_password: Nova senha
-field_password_confirmation: Confirmacao
-field_version: Versao
+field_password_confirmation: Confirmação
+field_version: Versão
field_type: Tipo
field_host: Servidor
field_port: Porta
@@ -140,115 +143,116 @@ field_account: Conta
field_base_dn: Base DN
field_attr_login: Atributo login
field_attr_firstname: Atributo primeiro nome
-field_attr_lastname: Atributo ultimo nome
+field_attr_lastname: Atributo último nome
field_attr_mail: Atributo email
-field_onthefly: Criacao de usuario on-the-fly
-field_start_date: Inicio
+field_onthefly: Criação automática de usuário
+field_start_date: InÃcio
field_done_ratio: %% Terminado
-field_auth_source: Modo de autenticacao
-field_hide_mail: Esconder meu email
-field_comments: Comentario
+field_auth_source: Modo de autenticação
+field_hide_mail: Ocultar meu email
+field_comments: Comentário
field_url: URL
-field_start_page: Pagina inicial
+field_start_page: Página inicial
field_subproject: Sub-projeto
field_hours: Horas
field_activity: Atividade
field_spent_on: Data
field_identifier: Identificador
-field_is_filter: Used as a filter
-field_issue_to_id: Related issue
-field_delay: Delay
-field_assignable: Issues can be assigned to this role
-field_redirect_existing_links: Redirect existing links
-field_estimated_hours: Estimated time
+field_is_filter: É um filtro
+field_issue_to_id: Ticket relacionado
+field_delay: Espera
+field_assignable: Tickets podem ser atribuÃdos para este papel
+field_redirect_existing_links: Redirecionar links existentes
+field_estimated_hours: Tempo estimado
+field_default_value: Padrão
-setting_app_title: Titulo da aplicacao
-setting_app_subtitle: Sub-titulo da aplicacao
-setting_welcome_text: Texto de boa-vinda
-setting_default_language: Lingua padrao
-setting_login_required: Autenticacao obrigatoria
-setting_self_registration: Registro de si mesmo permitido
-setting_attachment_max_size: Tamanho maximo do anexo
-setting_issues_export_limit: Limite de exportacao das tarefas
+setting_app_title: TÃtulo da aplicação
+setting_app_subtitle: Sub-tÃtulo da aplicação
+setting_welcome_text: Texto de boas-vindas
+setting_default_language: Idioma padrão
+setting_login_required: Autenticação obrigatória
+setting_self_registration: Permitido Auto-registro
+setting_attachment_max_size: Tamanho máximo do anexo
+setting_issues_export_limit: Limite de exportação das tarefas
setting_mail_from: Email enviado de
setting_host_name: Servidor
setting_text_formatting: Formato do texto
-setting_wiki_compression: Compactacao do historio do Wiki
+setting_wiki_compression: Compactação de histórico do Wiki
setting_feeds_limit: Limite do Feed
-setting_autofetch_changesets: Autofetch commits
-setting_sys_api_enabled: Ativa WS para gerenciamento do repositorio
-setting_commit_ref_keywords: Referencing keywords
-setting_commit_fix_keywords: Fixing keywords
-setting_autologin: Autologin
-setting_date_format: Date format
-setting_cross_project_issue_relations: Allow cross-project issue relations
+setting_autofetch_changesets: Auto-obter commits
+setting_sys_api_enabled: Ativa WS para gerenciamento do repositório
+setting_commit_ref_keywords: Palavras de referência
+setting_commit_fix_keywords: Palavras de fechamento
+setting_autologin: Auto-login
+setting_date_format: Formato da data
+setting_cross_project_issue_relations: Permitir relacionar tickets entre projetos
-label_user: Usuario
-label_user_plural: Usuarios
-label_user_new: Novo usuario
+label_user: Usuário
+label_user_plural: Usuários
+label_user_new: Novo usuário
label_project: Projeto
label_project_new: Novo projeto
label_project_plural: Projetos
-label_project_all: All Projects
-label_project_latest: Ultimos projetos
-label_issue: Tarefa
-label_issue_new: Nova tarefa
-label_issue_plural: Tarefas
-label_issue_view_all: Ver todas as tarefas
+label_project_all: Todos os projetos
+label_project_latest: Últimos projetos
+label_issue: Ticket
+label_issue_new: Novo ticket
+label_issue_plural: Tickets
+label_issue_view_all: Ver todos os tickets
label_document: Documento
label_document_new: Novo documento
label_document_plural: Documentos
-label_role: Regra
-label_role_plural: Regras
-label_role_new: Nova regra
-label_role_and_permissions: Regras e permissoes
+label_role: Papel
+label_role_plural: Papéis
+label_role_new: Novo papel
+label_role_and_permissions: Papéis e permissões
label_member: Membro
label_member_new: Novo membro
label_member_plural: Membros
-label_tracker: Tipo
-label_tracker_plural: Tipos
+label_tracker: Tipo de ticket
+label_tracker_plural: Tipos de ticket
label_tracker_new: Novo tipo
label_workflow: Workflow
-label_issue_status: Status da tarefa
-label_issue_status_plural: Status das tarefas
+label_issue_status: Status do ticket
+label_issue_status_plural: Status dos tickets
label_issue_status_new: Novo status
-label_issue_category: Categoria de tarefa
-label_issue_category_plural: Categorias de tarefa
+label_issue_category: Categoria de ticket
+label_issue_category_plural: Categorias de tickets
label_issue_category_new: Nova categoria
label_custom_field: Campo personalizado
-label_custom_field_plural: Campos personalizado
+label_custom_field_plural: Campos personalizados
label_custom_field_new: Novo campo personalizado
-label_enumerations: Enumeracao
-label_enumeration_new: Novo valor
-label_information: Informacao
-label_information_plural: Informacoes
-label_please_login: Efetue login
+label_enumerations: 'Tipos & Categorias'
+label_enumeration_new: Novo
+label_information: Informação
+label_information_plural: Informações
+label_please_login: Efetue o login
label_register: Registre-se
-label_password_lost: Perdi a senha
-label_home: Pagina inicial
-label_my_page: Minha pagina
+label_password_lost: Perdi minha senha
+label_home: Página inicial
+label_my_page: Minha página
label_my_account: Minha conta
label_my_projects: Meus projetos
-label_administration: Administracao
-label_login: Login
-label_logout: Logout
+label_administration: Administração
+label_login: Entrar
+label_logout: Sair
label_help: Ajuda
-label_reported_issues: Tarefas reportadas
-label_assigned_to_me_issues: Tarefas atribuidas a mim
-label_last_login: Utima conexao
-label_last_updates: Ultima alteracao
-label_last_updates_plural: %d Ultimas alteracoes
+label_reported_issues: Tickets reportados
+label_assigned_to_me_issues: Meus tickets
+label_last_login: Última conexao
+label_last_updates: Última alteração
+label_last_updates_plural: %d Últimas alterações
label_registered_on: Registrado em
label_activity: Atividade
label_new: Novo
-label_logged_as: Logado como
+label_logged_as: "Acessando como:"
label_environment: Ambiente
-label_authentication: Autenticacao
-label_auth_source: Modo de autenticacao
-label_auth_source_new: Novo modo de autenticacao
-label_auth_source_plural: Modos de autenticacao
+label_authentication: Autenticação
+label_auth_source: Modo de autenticação
+label_auth_source_new: Novo modo de autenticação
+label_auth_source_plural: Modos de autenticação
label_subproject_plural: Sub-projetos
-label_min_max_length: Tamanho min-max
+label_min_max_length: Tamanho mÃn-máx
label_list: Lista
label_date: Data
label_integer: Inteiro
@@ -259,169 +263,169 @@ label_attribute: Atributo
label_attribute_plural: Atributos
label_download: %d Download
label_download_plural: %d Downloads
-label_no_data: Sem dados para mostrar
-label_change_status: Mudar status
-label_history: Historico
+label_no_data: Nenhuma informação disponÃvel
+label_change_status: Alterar status
+label_history: Histórico
label_attachment: Arquivo
label_attachment_new: Novo arquivo
label_attachment_delete: Apagar arquivo
label_attachment_plural: Arquivos
-label_report: Relatorio
-label_report_plural: Relatorio
-label_news: Noticias
-label_news_new: Adicionar noticias
-label_news_plural: Noticias
-label_news_latest: Ultimas noticias
-label_news_view_all: Ver todas as noticias
-label_change_log: Change log
-label_settings: Ajustes
-label_overview: Visao geral
-label_version: Versao
-label_version_new: Nova versao
-label_version_plural: Versoes
-label_confirmation: Confirmacao
+label_report: Relatório
+label_report_plural: Relatório
+label_news: NotÃcia
+label_news_new: Adicionar notÃcias
+label_news_plural: NotÃcias
+label_news_latest: Últimas notÃcias
+label_news_view_all: Ver todas as notÃcias
+label_change_log: Registro de alterações
+label_settings: Configurações
+label_overview: Visão geral
+label_version: Versão
+label_version_new: Nova versão
+label_version_plural: Versões
+label_confirmation: Confirmação
label_export_to: Exportar para
label_read: Ler...
-label_public_projects: Projetos publicos
+label_public_projects: Projetos públicos
label_open_issues: Aberto
-label_open_issues_plural: Abertos
+label_open_issues_plural: Abertos
label_closed_issues: Fechado
label_closed_issues_plural: Fechados
label_total: Total
-label_permissions: Permissoes
+label_permissions: Permissões
label_current_status: Status atual
label_new_statuses_allowed: Novo status permitido
label_all: todos
label_none: nenhum
-label_next: Proximo
+label_next: Próximo
label_previous: Anterior
label_used_by: Usado por
label_details: Detalhes
label_add_note: Adicionar nota
-label_per_page: Por pagina
-label_calendar: Calendario
-label_months_from: Meses de
+label_per_page: Por página
+label_calendar: Calendário
+label_months_from: meses a partir de
label_gantt: Gantt
label_internal: Interno
-label_last_changes: utlimas %d mudancas
-label_change_view_all: Mostrar todas as mudancas
-label_personalize_page: Personalizar esta pagina
-label_comment: Comentario
-label_comment_plural: Comentarios
-label_comment_add: Adicionar comentario
-label_comment_added: Comentario adicionado
-label_comment_delete: Apagar comentario
+label_last_changes: últimas %d alteraçoes
+label_change_view_all: Mostrar todas as alteraçoes
+label_personalize_page: Personalizar esta página
+label_comment: Comentário
+label_comment_plural: Comentários
+label_comment_add: Adicionar comentário
+label_comment_added: Comentário adicionado
+label_comment_delete: Apagar comentário
label_query: Consulta personalizada
label_query_plural: Consultas personalizadas
label_query_new: Nova consulta
label_filter_add: Adicionar filtro
label_filter_plural: Filtros
-label_equals: e
-label_not_equals: nao e
-label_in_less_than: e maior que
-label_in_more_than: e menor que
+label_equals: é
+label_not_equals: não é
+label_in_less_than: é maior que
+label_in_more_than: é menor que
label_in: em
label_today: hoje
-label_this_week: this week
+label_this_week: esta semana
label_less_than_ago: faz menos de
label_more_than_ago: faz mais de
-label_ago: dias atras
-label_contains: contem
-label_not_contains: nao contem
+label_ago: dias atrás
+label_contains: contém
+label_not_contains: não contem
label_day_plural: dias
-label_repository: Repository
-label_browse: Browse
-label_modification: %d change
-label_modification_plural: %d changes
-label_revision: Revision
-label_revision_plural: Revisions
-label_added: added
-label_modified: modified
-label_deleted: deleted
-label_latest_revision: Latest revision
-label_latest_revision_plural: Latest revisions
-label_view_revisions: View revisions
-label_max_size: Maximum size
+label_repository: Repositório
+label_browse: Procurar
+label_modification: %d alteração
+label_modification_plural: %d alterações
+label_revision: Revisão
+label_revision_plural: Revisões
+label_added: adicionado
+label_modified: modificado
+label_deleted: excluÃdo
+label_latest_revision: Última revisão
+label_latest_revision_plural: Últimas revisões
+label_view_revisions: Visualizar revisões
+label_max_size: Tamanho máximo
label_on: 'em'
-label_sort_highest: Mover para o inicio
+label_sort_highest: Mover para o inÃcio
label_sort_higher: Mover para cima
label_sort_lower: Mover para baixo
label_sort_lowest: Mover para o fim
-label_roadmap: Roadmap
-label_roadmap_due_in: Due in
-label_roadmap_overdue: %s late
-label_roadmap_no_issues: Sem tarefas para essa versao
+label_roadmap: Planejamento
+label_roadmap_due_in: Previsão em
+label_roadmap_overdue: %s atrasado
+label_roadmap_no_issues: Sem tickets para esta versão
label_search: Busca
label_result_plural: Resultados
label_all_words: Todas as palavras
label_wiki: Wiki
-label_wiki_edit: Wiki edit
-label_wiki_edit_plural: Wiki edits
-label_wiki_page: Wiki page
-label_wiki_page_plural: Wiki pages
-label_index_by_title: Index by title
-label_index_by_date: Index by date
-label_current_version: Versao atual
-label_preview: Previa
+label_wiki_edit: Editar Wiki
+label_wiki_edit_plural: Edições Wiki
+label_wiki_page: Página Wiki
+label_wiki_page_plural: Páginas Wiki
+label_index_by_title: Ãndice por tÃtulo
+label_index_by_date: Ãndice por data
+label_current_version: Versão atual
+label_preview: Pré-visualizar
label_feed_plural: Feeds
-label_changes_details: Detalhes de todas as mudancas
-label_issue_tracking: Tarefas
+label_changes_details: Detalhes de todas as alterações
+label_issue_tracking: Tickets
label_spent_time: Tempo gasto
label_f_hour: %.2f hora
label_f_hour_plural: %.2f horas
label_time_tracking: Tempo trabalhado
-label_change_plural: Mudancas
-label_statistics: Estatisticas
-label_commits_per_month: Commits por mes
+label_change_plural: Mudanças
+label_statistics: EstatÃsticas
+label_commits_per_month: Commits por mês
label_commits_per_author: Commits por autor
-label_view_diff: Ver diferencas
+label_view_diff: Ver diferenças
label_diff_inline: inline
-label_diff_side_by_side: side by side
-label_options: Opcoes
+label_diff_side_by_side: lado a lado
+label_options: Opções
label_copy_workflow_from: Copiar workflow de
-label_permissions_report: Relatorio de permissoes
-label_watched_issues: Watched issues
-label_related_issues: Related issues
-label_applied_status: Applied status
-label_loading: Loading...
-label_relation_new: New relation
-label_relation_delete: Delete relation
-label_relates_to: related to
-label_duplicates: duplicates
-label_blocks: blocks
-label_blocked_by: blocked by
-label_precedes: precedes
-label_follows: follows
-label_end_to_start: end to start
-label_end_to_end: end to end
-label_start_to_start: start to start
-label_start_to_end: start to end
-label_stay_logged_in: Stay logged in
-label_disabled: disabled
-label_show_completed_versions: Show completed versions
-label_me: me
-label_board: Forum
-label_board_new: New forum
-label_board_plural: Forums
-label_topic_plural: Topics
-label_message_plural: Messages
-label_message_last: Last message
-label_message_new: New message
-label_reply_plural: Replies
-label_send_information: Send account information to the user
-label_year: Year
-label_month: Month
-label_week: Week
-label_date_from: From
-label_date_to: To
-label_language_based: Language based
-label_sort_by: Sort by %s
-label_send_test_email: Send a test email
-label_feeds_access_key_created_on: RSS access key created %s ago
-label_module_plural: Modules
-label_added_time_by: Added by %s %s ago
-label_updated_time: Updated %s ago
-label_jump_to_a_project: Jump to a project...
+label_permissions_report: Relatório de permissões
+label_watched_issues: Tickes acompanhados
+label_related_issues: Tickets relacionados
+label_applied_status: Status aplicado
+label_loading: Carregando...
+label_relation_new: Nova relação
+label_relation_delete: Excluir relação
+label_relates_to: relacionado a
+label_duplicates: duplicado de
+label_blocks: bloqueia
+label_blocked_by: bloqueado por
+label_precedes: precede
+label_follows: segue
+label_end_to_start: fim para o inÃcio
+label_end_to_end: fim para fim
+label_start_to_start: inÃcio para inÃcio
+label_start_to_end: inÃcio para fim
+label_stay_logged_in: Permanecer logado
+label_disabled: desabilitado
+label_show_completed_versions: Exibir versões completas
+label_me: eu
+label_board: Fórum
+label_board_new: Novo fórum
+label_board_plural: Fóruns
+label_topic_plural: Tópicos
+label_message_plural: Mensagens
+label_message_last: Última mensagem
+label_message_new: Nova mensagem
+label_reply_plural: Respostas
+label_send_information: Enviar informação de conta para o usuário
+label_year: Ano
+label_month: Mês
+label_week: Semana
+label_date_from: De
+label_date_to: Para
+label_language_based: Com base no idioma
+label_sort_by: Ordenar por %s
+label_send_test_email: Enviar um email de teste
+label_feeds_access_key_created_on: chave de acesso RSS criada %s atrás
+label_module_plural: Módulos
+label_added_time_by: Adicionado por %s %s atrás
+label_updated_time: Atualizado %s atrás
+label_jump_to_a_project: Ir para o projeto...
button_login: Login
button_submit: Enviar
@@ -433,7 +437,7 @@ button_create: Criar
button_test: Testar
button_edit: Editar
button_add: Adicionar
-button_change: Mudar
+button_change: Alterar
button_apply: Aplicar
button_clear: Limpar
button_lock: Bloquear
@@ -447,59 +451,59 @@ button_cancel: Cancelar
button_activate: Ativar
button_sort: Ordenar
button_log_time: Tempo de trabalho
-button_rollback: Voltar para esta versao
-button_watch: Watch
-button_unwatch: Unwatch
-button_reply: Reply
-button_archive: Archive
-button_unarchive: Unarchive
-button_reset: Reset
-button_rename: Rename
+button_rollback: Voltar para esta versão
+button_watch: Acompanhar
+button_unwatch: Não Acompanhar
+button_reply: Responder
+button_archive: Arquivar
+button_unarchive: Desarquivar
+button_reset: Redefinir
+button_rename: Renomear
status_active: ativo
status_registered: registrado
status_locked: bloqueado
-text_select_mail_notifications: Selecionar acoes para ser enviado uma notificacao por email
-text_regexp_info: eg. ^[A-Z0-9]+$
-text_min_max_length_info: 0 siginifica sem restricao
-text_project_destroy_confirmation: Voce tem certeza que deseja deletar este projeto e todas os dados relacionados?
+text_select_mail_notifications: Selecionar ações para ser enviado uma notificação por email
+text_regexp_info: ex. ^[A-Z0-9]+$
+text_min_max_length_info: 0 siginifica sem restrição
+text_project_destroy_confirmation: Você tem certeza que deseja excluir este projeto e todos os dados relacionados?
text_workflow_edit: Selecione uma regra e um tipo de tarefa para editar o workflow
-text_are_you_sure: Voce tem certeza ?
+text_are_you_sure: Você tem certeza?
text_journal_changed: alterado de %s para %s
text_journal_set_to: setar para %s
text_journal_deleted: apagado
-text_tip_task_begin_day: tarefa comeca neste dia
+text_tip_task_begin_day: tarefa inicia neste dia
text_tip_task_end_day: tarefa termina neste dia
-text_tip_task_begin_end_day: tarefa comeca e termina neste dia
-text_project_identifier_info: 'Letras minusculas (a-z), numeros e tracos permitido. Uma vez salvo, o identificador nao pode ser mudado.'
-text_caracters_maximum: %d maximo de caracteres
+text_tip_task_begin_end_day: tarefa inicia e termina neste dia
+text_project_identifier_info: 'Letras minúsculas (a-z), números e traços permitidos. Uma vez salvo, o identificador não pode ser alterado.'
+text_caracters_maximum: máximo %d caracteres
text_length_between: Tamanho entre %d e %d caracteres.
text_tracker_no_workflow: Sem workflow definido para este tipo.
-text_unallowed_characters: Unallowed characters
-text_comma_separated: Multiple values allowed (comma separated).
-text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages
-text_issue_added: Tarefa %s foi incluÃda.
-text_issue_updated: Tarefa %s foi alterada.
-text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content ?
-text_issue_category_destroy_question: Some issues (%d) are assigned to this category. What do you want to do ?
-text_issue_category_destroy_assignments: Remove category assignments
-text_issue_category_reassign_to: Reassing issues to this category
+text_unallowed_characters: Caracteres não permitidos
+text_comma_separated: Múltiplos valores são permitidos (separados por vÃrgula).
+text_issues_ref_in_commit_messages: Referenciando e fixando tickets nas mensagens de commit
+text_issue_added: Tarefa %s foi incluÃda (por %s).
+text_issue_updated: Tarefa %s foi alterada (por %s).
+text_wiki_destroy_confirmation: Você tem certeza que deseja excluir este wiki e todo o seu conteúdo?
+text_issue_category_destroy_question: Alguns tickets (%d) estão atribuÃdos a esta categoria. O que você deseja fazer?
+text_issue_category_destroy_assignments: Remover atribuições da categoria
+text_issue_category_reassign_to: Redefinir tickets para esta categoria
-default_role_manager: Analista de Negocio ou Gerente de Projeto
+default_role_manager: Gerente
default_role_developper: Desenvolvedor
-default_role_reporter: Analista de Suporte
-default_tracker_bug: Bug
-default_tracker_feature: Implementacao
+default_role_reporter: Informante
+default_tracker_bug: Problema
+default_tracker_feature: Implementação
default_tracker_support: Suporte
default_issue_status_new: Novo
-default_issue_status_assigned: Atribuido
+default_issue_status_assigned: AtribuÃdo
default_issue_status_resolved: Resolvido
default_issue_status_feedback: Feedback
default_issue_status_closed: Fechado
default_issue_status_rejected: Rejeitado
-default_doc_category_user: Documentacao do usuario
-default_doc_category_tech: Documentacao do tecnica
+default_doc_category_user: Documentação do usuário
+default_doc_category_tech: Documentação técnica
default_priority_low: Baixo
default_priority_normal: Normal
default_priority_high: Alto
@@ -511,36 +515,125 @@ default_activity_development: Desenvolvimento
enumeration_issue_priorities: Prioridade das tarefas
enumeration_doc_categories: Categorias de documento
enumeration_activities: Atividades (time tracking)
-label_file_plural: Files
+label_file_plural: Arquivos
label_changeset_plural: Changesets
-field_column_names: Columns
-label_default_columns: Default columns
-setting_issue_list_default_columns: Default columns displayed on the issue list
-setting_repositories_encodings: Repositories encodings
-notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit."
-label_bulk_edit_selected_issues: Bulk edit selected issues
-label_no_change_option: (No change)
-notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s."
-label_theme: Theme
-label_default: Default
-label_search_titles_only: Search titles only
-label_nobody: nobody
-button_change_password: Change password
-text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)."
-label_user_mail_option_selected: "For any event on the selected projects only..."
-label_user_mail_option_all: "For any event on all my projects"
-label_user_mail_option_none: "Only for things I watch or I'm involved in"
-setting_emails_footer: Emails footer
-label_float: Float
-button_copy: Copy
-mail_body_account_information_external: You can use your "%s" account to log into Redmine.
-mail_body_account_information: Your Redmine account information
-setting_protocol: Protocol
-label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
-setting_time_format: Time format
-label_registration_activation_by_email: account activation by email
-mail_subject_account_activation_request: Redmine account activation request
-mail_body_account_activation_request: 'A new user (%s) has registered. His account his pending your approval:'
-label_registration_automatic_activation: automatic account activation
-label_registration_manual_activation: manual account activation
-notice_account_pending: "Your account was created and is now pending administrator approval."
+field_column_names: Colunas
+label_default_columns: Colunas padrão
+setting_issue_list_default_columns: Colunas padrão visÃveis na lista de tickets
+setting_repositories_encodings: Codificação dos repositórios
+notice_no_issue_selected: "Nenhum ticket está selecionado! Por favor, marque os tickets que você deseja alterar."
+label_bulk_edit_selected_issues: Edição em massa dos tickets selecionados.
+label_no_change_option: (Sem alteração)
+notice_failed_to_save_issues: "Problema ao salvar %d ticket(s) no %d selecionado: %s."
+label_theme: Tema
+label_default: Padrão
+label_search_titles_only: Pesquisar somente tÃtulos
+label_nobody: ninguém
+button_change_password: Alterar senha
+text_user_mail_option: "Para projetos não selecionados, você somente receberá notificações sobre o que você acompanha ou está envolvido (ex. tickets que você é autor ou está atribuÃdo)"
+label_user_mail_option_selected: "Para qualquer evento somente no(s) projeto(s) selecionado(s)..."
+label_user_mail_option_all: "Para qualquer evento em todos os meus projetos"
+label_user_mail_option_none: "Somente eventos que eu acompanho ou estou envolvido"
+setting_emails_footer: Rodapé dos emails
+label_float: Flutuante
+button_copy: Copiar
+mail_body_account_information_external: Você pode usar sua conta "%s" para entrar.
+mail_body_account_information: Informações de sua conta
+setting_protocol: Protocolo
+label_user_mail_no_self_notified: "Eu não desejo ser notificado de minhas próprias modificações"
+setting_time_format: Formato de data
+label_registration_activation_by_email: ativação de conta por email
+mail_subject_account_activation_request: %s requisição de ativação de conta
+mail_body_account_activation_request: 'Um novo usuário (%s) se registrou. A conta está aguardando sua aprovação:'
+label_registration_automatic_activation: ativação automática de conta
+label_registration_manual_activation: ativação manual de conta
+notice_account_pending: "Sua conta foi criada e está aguardando aprovação do administrador."
+field_time_zone: Fuso-horário
+text_caracters_minimum: Precisa ter ao menos %d caracteres.
+setting_bcc_recipients: Destinatários com cópia oculta (cco)
+button_annotate: Anotar
+label_issues_by: Tickets por %s
+field_searchable: Pesquisável
+label_display_per_page: 'Por página: %s'
+setting_per_page_options: Opções de itens por página
+notice_default_data_loaded: Configuração padrão carregada com sucesso.
+text_load_default_configuration: Carregar a configuração padrão
+text_no_configuration_data: "Os Papéis, tipos de tickets, status de tickets e workflows não foram configurados ainda.\nÉ altamente recomendado carregar as configurações padrão. Você poderá modificar estas configurações assim que carregadas."
+error_can_t_load_default_data: "Configuração padrão não pôde ser carregada: %s"
+button_update: Atualizar
+label_change_properties: Alterar propriedades
+label_general: Geral
+label_repository_plural: Repositórios
+label_associated_revisions: Revisões associadas
+setting_user_format: Formato de visualização dos usuários
+text_status_changed_by_changeset: Aplicado no changeset %s.
+label_more: Mais
+text_issues_destroy_confirmation: 'Você tem certeza que deseja excluir o(s) ticket(s) selecionado(s)?'
+label_scm: SCM
+text_select_project_modules: 'Selecione módulos para habilitar para este projeto:'
+label_issue_added: Ticket adicionado
+label_issue_updated: Ticket atualizado
+label_document_added: Documento adicionado
+label_message_posted: Mensagem enviada
+label_file_added: Arquivo adicionado
+label_news_added: NotÃcia adicionada
+project_module_boards: Fóruns
+project_module_issue_tracking: Gerenciamento de Tickets
+project_module_wiki: Wiki
+project_module_files: Arquivos
+project_module_documents: Documentos
+project_module_repository: Repositório
+project_module_news: NotÃcias
+project_module_time_tracking: Gerenciamento de tempo
+text_file_repository_writable: Repositório de arquivos gravável
+text_default_administrator_account_changed: Conta de administrador padrão modificada
+text_rmagick_available: RMagick disponÃvel (opcional)
+button_configure: Configuração
+label_plugins: Plugins
+label_ldap_authentication: autenticação LDAP
+label_downloads_abbr: D/L
+label_this_month: este mês
+label_last_n_days: últimos %d dias
+label_all_time: todo o tempo
+label_this_year: este ano
+label_date_range: Intervalo de datas
+label_last_week: última semana
+label_yesterday: ontem
+label_last_month: último mês
+label_add_another_file: Adicionar outro arquivo
+label_optional_description: Descrição opcional
+text_destroy_time_entries_question: %.02f horas foram reportadas neste ticket que você está excluindo. O que você deseja fazer?
+error_issue_not_found_in_project: 'O ticket não foi encontrado ou não pertence a este projeto'
+text_assign_time_entries_to_project: Atribuir horas reportadas para o projeto
+text_destroy_time_entries: Excluir horas reportadas
+text_reassign_time_entries: 'Redefinir horas reportadas para este ticket:'
+setting_activity_days_default: Dias visualizados na atividade do projeto
+label_chronological_order: Em ordem cronológica
+field_comments_sorting: Visualizar comentários
+label_reverse_chronological_order: Em order cronológica reversa
+label_preferences: Preferências
+setting_display_subprojects_issues: Visualizar tickets dos subprojetos nos projetos principais por padrão
+label_overall_activity: Atividade geral
+setting_default_projects_public: Novos projetos são públicos por padrão
+error_scm_annotate: "Esta entrada não existe ou não pode ser anotada."
+label_planning: Planejamento
+text_subprojects_destroy_warning: 'Seu(s) subprojeto(s): %s também serão excluÃdos.'
+label_age: Age
+label_and_its_subprojects: %s and its subprojects
+mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
+mail_subject_reminder: "%d issue(s) due in the next days"
+text_user_wrote: '%s wrote:'
+label_duplicated_by: duplicated by
+setting_enabled_scm: Enabled SCM
+text_enumeration_category_reassign_to: 'Reassign them to this value:'
+text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
+text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/pt.yml b/lang/pt.yml
index 00d136416..1d4d043f5 100644
--- a/lang/pt.yml
+++ b/lang/pt.yml
@@ -48,6 +48,7 @@ general_text_no: 'não'
general_text_yes: 'sim'
general_lang_name: 'Português'
general_csv_separator: ','
+general_csv_decimal_separator: '.'
general_csv_encoding: ISO-8859-1
general_pdf_encoding: ISO-8859-1
general_day_names: Segunda,Terça,Quarta,Quinta,Sexta,Sábado,Domingo
@@ -68,16 +69,18 @@ notice_successful_delete: Apagado com sucesso.
notice_successful_connection: Conectado com sucesso.
notice_file_not_found: A página que você está tentando acessar não existe ou foi excluÃda.
notice_locking_conflict: Os dados foram atualizados por um outro usuário.
-notice_scm_error: A entrada e/ou a revisão não existem no repositório.
notice_not_authorized: Você não está autorizado a acessar esta página.
notice_email_sent: An email was sent to %s
notice_email_error: An error occurred while sending mail (%s)
notice_feeds_access_key_reseted: Your RSS access key was reseted.
-mail_subject_lost_password: Sua senha do redMine.
+error_scm_not_found: "A entrada e/ou a revisão não existem no repositório."
+error_scm_command_failed: "An error occurred when trying to access the repository: %s"
+
+mail_subject_lost_password: Sua senha do %s.
mail_body_lost_password: 'Para mudar sua senha, clique no link abaixo:'
-mail_subject_register: Ativação de conta do redMine.
-mail_body_register: 'Para ativar sua conta do Redmine, clique no link abaixo:'
+mail_subject_register: Ativação de conta do %s.
+mail_body_register: 'Para ativar sua conta, clique no link abaixo:'
gui_validation_error: 1 erro
gui_validation_error_plural: %d erros
@@ -115,7 +118,7 @@ field_subject: Assunto
field_due_date: Data final
field_assigned_to: AtribuÃdo para
field_priority: Prioridade
-field_fixed_version: Versão corrigida
+field_fixed_version: Target version
field_user: Usuário
field_role: Regra
field_homepage: Página inicial
@@ -161,6 +164,7 @@ field_delay: Atraso
field_assignable: Issues can be assigned to this role
field_redirect_existing_links: Redirect existing links
field_estimated_hours: Estimated time
+field_default_value: Padrão
setting_app_title: TÃtulo da aplicação
setting_app_subtitle: Sub-tÃtulo da aplicação
@@ -479,14 +483,14 @@ text_tracker_no_workflow: Sem workflow definido para este tipo.
text_unallowed_characters: Caracteres não permitidos
text_comma_separated: Permitido múltiplos valores (separados por vÃrgula).
text_issues_ref_in_commit_messages: Referenciando e arrumando tarefas nas mensagens de commit
-text_issue_added: Tarefa %s foi incluÃda.
-text_issue_updated: Tarefa %s foi alterada.
+text_issue_added: Tarefa %s foi incluÃda (by %s).
+text_issue_updated: Tarefa %s foi alterada (by %s).
text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content ?
text_issue_category_destroy_question: Some issues (%d) are assigned to this category. What do you want to do ?
text_issue_category_destroy_assignments: Remove category assignments
text_issue_category_reassign_to: Reassing issues to this category
-default_role_manager: Analista de Negócio ou Gerente de Projeto
+default_role_manager: Gerente de Projeto
default_role_developper: Desenvolvedor
default_role_reporter: Analista de Suporte
default_tracker_bug: Bug
@@ -533,14 +537,103 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in"
setting_emails_footer: Emails footer
label_float: Float
button_copy: Copy
-mail_body_account_information_external: You can use your "%s" account to log into Redmine.
-mail_body_account_information: Your Redmine account information
+mail_body_account_information_external: You can use your "%s" account to log in.
+mail_body_account_information: Your account information
setting_protocol: Protocol
label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
setting_time_format: Time format
label_registration_activation_by_email: account activation by email
-mail_subject_account_activation_request: Redmine account activation request
+mail_subject_account_activation_request: %s account activation request
mail_body_account_activation_request: 'A new user (%s) has registered. His account his pending your approval:'
label_registration_automatic_activation: automatic account activation
label_registration_manual_activation: manual account activation
notice_account_pending: "Your account was created and is now pending administrator approval."
+field_time_zone: Time zone
+text_caracters_minimum: Must be at least %d characters long.
+setting_bcc_recipients: Blind carbon copy recipients (bcc)
+button_annotate: Annotate
+label_issues_by: Issues by %s
+field_searchable: Searchable
+label_display_per_page: 'Per page: %s'
+setting_per_page_options: Objects per page options
+label_age: Age
+notice_default_data_loaded: Default configuration successfully loaded.
+text_load_default_configuration: Load the default configuration
+text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
+error_can_t_load_default_data: "Default configuration could not be loaded: %s"
+button_update: Update
+label_change_properties: Change properties
+label_general: General
+label_repository_plural: Repositories
+label_associated_revisions: Associated revisions
+setting_user_format: Users display format
+text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
+text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s) ?'
+label_scm: SCM
+text_select_project_modules: 'Select modules to enable for this project:'
+label_issue_added: Issue added
+label_issue_updated: Issue updated
+label_document_added: Document added
+label_message_posted: Message added
+label_file_added: File added
+label_news_added: News added
+project_module_boards: Boards
+project_module_issue_tracking: Issue tracking
+project_module_wiki: Wiki
+project_module_files: Files
+project_module_documents: Documents
+project_module_repository: Repository
+project_module_news: News
+project_module_time_tracking: Time tracking
+text_file_repository_writable: File repository writable
+text_default_administrator_account_changed: Default administrator account changed
+text_rmagick_available: RMagick available (optional)
+button_configure: Configure
+label_plugins: Plugins
+label_ldap_authentication: LDAP authentication
+label_downloads_abbr: D/L
+label_this_month: this month
+label_last_n_days: last %d days
+label_all_time: all time
+label_this_year: this year
+label_date_range: Date range
+label_last_week: last week
+label_yesterday: yesterday
+label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
+text_destroy_time_entries_question: %.02f hours were reported on the issues you are about to delete. What do you want to do ?
+error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
+text_assign_time_entries_to_project: Assign reported hours to the project
+text_destroy_time_entries: Delete reported hours
+text_reassign_time_entries: 'Reassign reported hours to this issue:'
+setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Display comments
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
+setting_display_subprojects_issues: Display subprojects issues on main projects by default
+label_overall_activity: Overall activity
+setting_default_projects_public: New projects are public by default
+error_scm_annotate: "The entry does not exist or can not be annotated."
+label_planning: Planning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
+label_and_its_subprojects: %s and its subprojects
+mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
+mail_subject_reminder: "%d issue(s) due in the next days"
+text_user_wrote: '%s wrote:'
+label_duplicated_by: duplicated by
+setting_enabled_scm: Enabled SCM
+text_enumeration_category_reassign_to: 'Reassign them to this value:'
+text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
+text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/ro.yml b/lang/ro.yml
index ad8881b92..acb5ff8ec 100644
--- a/lang/ro.yml
+++ b/lang/ro.yml
@@ -48,6 +48,7 @@ general_text_no: 'nu'
general_text_yes: 'da'
general_lang_name: 'Română'
general_csv_separator: ','
+general_csv_decimal_separator: '.'
general_csv_encoding: ISO-8859-1
general_pdf_encoding: ISO-8859-1
general_day_names: Luni,Marti,Miercuri,Joi,Vineri,Sambata,Duminica
@@ -68,16 +69,18 @@ notice_successful_delete: Stergere cu succes.
notice_successful_connection: Conectare cu succes.
notice_file_not_found: Pagina dorita nu exista sau nu mai este valabila.
notice_locking_conflict: Informatiile au fost modificate de un alt utilizator.
-notice_scm_error: Articolul sau reviziunea nu exista in stoc (Repository).
notice_not_authorized: Nu aveti autorizatia sa accesati aceasta pagina.
notice_email_sent: Un e-mail a fost trimis la adresa %s
notice_email_error: Eroare in trimiterea e-mailului (%s)
notice_feeds_access_key_reseted: Parola de acces RSS a fost resetat.
-mail_subject_lost_password: Your Redmine password
-mail_body_lost_password: 'To change your Redmine password, click on the following link:'
-mail_subject_register: Redmine account activation
-mail_body_register: 'To activate your Redmine account, click on the following link:'
+error_scm_not_found: "Articolul sau reviziunea nu exista in stoc (Repository)."
+error_scm_command_failed: "An error occurred when trying to access the repository: %s"
+
+mail_subject_lost_password: Your %s password
+mail_body_lost_password: 'To change your password, click on the following link:'
+mail_subject_register: Your %s account activation
+mail_body_register: 'To activate your account, click on the following link:'
gui_validation_error: 1 eroare
gui_validation_error_plural: %d erori
@@ -115,7 +118,7 @@ field_subject: Subiect
field_due_date: Data finalizarii
field_assigned_to: Atribuit pentru
field_priority: Prioritate
-field_fixed_version: Versiune rezolvata
+field_fixed_version: Target version
field_user: Utilizator
field_role: Rol
field_homepage: Pagina principala
@@ -161,6 +164,7 @@ field_delay: Intarziere
field_assignable: La acest rol se poate atribui tichete
field_redirect_existing_links: Redirectare linkuri existente
field_estimated_hours: Timpul estimat
+field_default_value: Default value
setting_app_title: Titlul aplicatiei
setting_app_subtitle: Subtitlul aplicatiei
@@ -477,8 +481,8 @@ text_tracker_no_workflow: Nu este definit nici un workflow pentru acest tip de t
text_unallowed_characters: Caractere nepermise
text_comma_separated: Se poate folosi valori multiple (separate de virgula).
text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages
-text_issue_added: Tichetul %s a fost raportat.
-text_issue_updated: tichetul %s a fost modificat.
+text_issue_added: Tichetul %s a fost raportat (by %s).
+text_issue_updated: tichetul %s a fost modificat (by %s).
text_wiki_destroy_confirmation: Sunteti sigur ca vreti sa stergeti acest wiki si continutul ei ?
text_issue_category_destroy_question: Cateva tichete (%d) apartin acestei categorii. Cum vreti sa procedati ?
text_issue_category_destroy_assignments: Remove category assignments
@@ -494,7 +498,7 @@ default_issue_status_new: Nou
default_issue_status_assigned: Atribuit
default_issue_status_resolved: Rezolvat
default_issue_status_feedback: Feedback
-default_issue_status_closed: Rezolvat
+default_issue_status_closed: Closed
default_issue_status_rejected: Respins
default_doc_category_user: Documentatie
default_doc_category_tech: Documentatie tehnica
@@ -533,14 +537,103 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in"
setting_emails_footer: Emails footer
label_float: Float
button_copy: Copy
-mail_body_account_information_external: You can use your "%s" account to log into Redmine.
-mail_body_account_information: Your Redmine account information
+mail_body_account_information_external: You can use your "%s" account to log in.
+mail_body_account_information: Your account information
setting_protocol: Protocol
label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
setting_time_format: Time format
label_registration_activation_by_email: account activation by email
-mail_subject_account_activation_request: Redmine account activation request
+mail_subject_account_activation_request: %s account activation request
mail_body_account_activation_request: 'A new user (%s) has registered. His account his pending your approval:'
label_registration_automatic_activation: automatic account activation
label_registration_manual_activation: manual account activation
notice_account_pending: "Your account was created and is now pending administrator approval."
+field_time_zone: Time zone
+text_caracters_minimum: Must be at least %d characters long.
+setting_bcc_recipients: Blind carbon copy recipients (bcc)
+button_annotate: Annotate
+label_issues_by: Issues by %s
+field_searchable: Searchable
+label_display_per_page: 'Per page: %s'
+setting_per_page_options: Objects per page options
+label_age: Age
+notice_default_data_loaded: Default configuration successfully loaded.
+text_load_default_configuration: Load the default configuration
+text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
+error_can_t_load_default_data: "Default configuration could not be loaded: %s"
+button_update: Update
+label_change_properties: Change properties
+label_general: General
+label_repository_plural: Repositories
+label_associated_revisions: Associated revisions
+setting_user_format: Users display format
+text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
+text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s) ?'
+label_scm: SCM
+text_select_project_modules: 'Select modules to enable for this project:'
+label_issue_added: Issue added
+label_issue_updated: Issue updated
+label_document_added: Document added
+label_message_posted: Message added
+label_file_added: File added
+label_news_added: News added
+project_module_boards: Boards
+project_module_issue_tracking: Issue tracking
+project_module_wiki: Wiki
+project_module_files: Files
+project_module_documents: Documents
+project_module_repository: Repository
+project_module_news: News
+project_module_time_tracking: Time tracking
+text_file_repository_writable: File repository writable
+text_default_administrator_account_changed: Default administrator account changed
+text_rmagick_available: RMagick available (optional)
+button_configure: Configure
+label_plugins: Plugins
+label_ldap_authentication: LDAP authentication
+label_downloads_abbr: D/L
+label_this_month: this month
+label_last_n_days: last %d days
+label_all_time: all time
+label_this_year: this year
+label_date_range: Date range
+label_last_week: last week
+label_yesterday: yesterday
+label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
+text_destroy_time_entries_question: %.02f hours were reported on the issues you are about to delete. What do you want to do ?
+error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
+text_assign_time_entries_to_project: Assign reported hours to the project
+text_destroy_time_entries: Delete reported hours
+text_reassign_time_entries: 'Reassign reported hours to this issue:'
+setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Display comments
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
+setting_display_subprojects_issues: Display subprojects issues on main projects by default
+label_overall_activity: Overall activity
+setting_default_projects_public: New projects are public by default
+error_scm_annotate: "The entry does not exist or can not be annotated."
+label_planning: Planning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
+label_and_its_subprojects: %s and its subprojects
+mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
+mail_subject_reminder: "%d issue(s) due in the next days"
+text_user_wrote: '%s wrote:'
+label_duplicated_by: duplicated by
+setting_enabled_scm: Enabled SCM
+text_enumeration_category_reassign_to: 'Reassign them to this value:'
+text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
+text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/ru.yml b/lang/ru.yml
index 100fad703..b0e137aa9 100644
--- a/lang/ru.yml
+++ b/lang/ru.yml
@@ -29,7 +29,7 @@ activerecord_error_blank: необходимо заполнить
activerecord_error_too_long: Ñлишком длинное значение
activerecord_error_too_short: Ñлишком короткое значение
activerecord_error_wrong_length: не ÑоответÑтвует длине
-activerecord_error_taken: уже был принÑÑ‚
+activerecord_error_taken: уже иÑпользуетÑÑ
activerecord_error_not_a_number: не ÑвлÑетÑÑ Ñ‡Ð¸Ñлом
activerecord_error_not_a_date: дата недейÑтвительна
activerecord_error_greater_than_start_date: должна быть позднее даты начала
@@ -48,8 +48,9 @@ general_text_no: 'Ðет'
general_text_yes: 'Да'
general_lang_name: 'Russian (РуÑÑкий)'
general_csv_separator: ','
-general_csv_encoding: ISO-8859-1
-general_pdf_encoding: ISO-8859-1
+general_csv_decimal_separator: '.'
+general_csv_encoding: UTF-8
+general_pdf_encoding: UTF-8
general_day_names: Понедельник,Вторник,Среда,Четверг,ПÑтница,Суббота,ВоÑкреÑенье
general_first_day_of_week: '1'
@@ -68,20 +69,28 @@ notice_successful_delete: Удаление уÑпешно завершено.
notice_successful_connection: Подключение уÑпешно уÑтановлено.
notice_file_not_found: Страница, на которую вы пытаетеÑÑŒ зайти, не ÑущеÑтвует или удалена.
notice_locking_conflict: Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð° другим пользователем.
-notice_scm_error: ЗапиÑи и/или иÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÑ‚ в репозитории.
notice_not_authorized: У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ Ð¿Ð¾ÑÐµÑ‰ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ Ñтраницы.
notice_email_sent: Отправлено пиÑьмо %s
notice_email_error: Во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ пиÑьма произошла ошибка (%s)
notice_feeds_access_key_reseted: Ваш ключ доÑтупа RSS был перезапущен.
notice_failed_to_save_issues: "Ðе удалоÑÑŒ Ñохранить %d пункт(ов)из %d выбранных: %s."
notice_no_issue_selected: "Ðе выбрано ни одной задачи! ПожалуйÑта, отметьте задачи, которые вы хотите отредактировать."
+notice_account_pending: "Ваша ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ уже Ñоздан и ожидает Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратора."
+notice_default_data_loaded: Была загружена ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¿Ð¾-умолчанию.
+
+error_scm_not_found: Хранилилище не Ñодержит запиÑи и/или иÑправлениÑ.
+error_scm_command_failed: "Ошибка доÑтупа к хранилищу: %s"
+error_can_t_load_default_data: "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¿Ð¾ умолчанию не была загружена: %s"
+
+mail_subject_lost_password: Ваш %s пароль
+mail_body_lost_password: 'Ð”Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ, зайдите по Ñледующей ÑÑылке:'
+mail_subject_register: ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи %s
+mail_body_register: 'Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ учетной запиÑи, зайдите по Ñледующей ÑÑылке:'
+mail_body_account_information_external: Ð’Ñ‹ можете иÑпользовать вашу "%s" учетную запиÑÑŒ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð°.
+mail_body_account_information: Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ð¾ Вашей учетной запиÑи
+mail_subject_account_activation_request: Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° активацию Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² ÑиÑтеме %s
+mail_body_account_activation_request: 'Ðовый пользователь (%s) зарегиÑтрирован. Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ ожидает вашего утверждениÑ:'
-mail_subject_lost_password: Ваш Redmine пароль
-mail_body_lost_password: 'Ð”Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Redmine паролÑ, зайдите по Ñледующей ÑÑылке:'
-mail_subject_register: ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи Redmine
-mail_body_register: 'Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ учетной запиÑи Redmine, зайдите по Ñледующей ÑÑылке:'
-mail_body_account_information_external: Ð’Ñ‹ можете иÑпользовать вашу "%s" учетную запиÑÑŒ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в Redmine.
-mail_body_account_information: Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ð¾ Вашей учетной запиÑи Redmine
gui_validation_error: 1 ошибка
gui_validation_error_plural: %d ошибки(ок)
@@ -100,7 +109,7 @@ field_author: Ðвтор
field_created_on: Создано
field_updated_on: Обновлено
field_field_format: Формат
-field_is_for_all: Ð”Ð»Ñ Ð²Ñех форматов
+field_is_for_all: Ð”Ð»Ñ Ð²Ñех проектов
field_possible_values: Возможные значениÑ
field_regexp: РегулÑрное выражение
field_min_length: ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð°
@@ -119,12 +128,12 @@ field_subject: Тема
field_due_date: Дата выполнениÑ
field_assigned_to: Ðазначена
field_priority: Приоритет
-field_fixed_version: ФикÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑ
+field_fixed_version: ВерÑиÑ
field_user: Пользователь
field_role: Роль
field_homepage: Ð¡Ñ‚Ð°Ñ€Ñ‚Ð¾Ð²Ð°Ñ Ñтраница
field_is_public: Публичный
-field_parent: Подпроект
+field_parent: РодительÑкий проект
field_is_in_chlog: Задачи, отображаемые в журнале изменений
field_is_in_roadmap: Задачи, отображаемые в оперативном плане
field_login: Вход
@@ -148,17 +157,17 @@ field_attr_lastname: Ðтрибут ФамилиÑ
field_attr_mail: Ðтрибут Email
field_onthefly: Создание Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ð° лету
field_start_date: Ðачало
-field_done_ratio: %% ГотовноÑти
+field_done_ratio: ГотовноÑть в %%
field_auth_source: Режим аутентификации
field_hide_mail: Скрывать мой email
field_comments: Комментарий
field_url: URL
field_start_page: Ð¡Ñ‚Ð°Ñ€Ñ‚Ð¾Ð²Ð°Ñ Ñтраница
field_subproject: Подпроект
-field_hours: ЧаÑÑ‹
+field_hours: ЧаÑ(а,ов)
field_activity: ДеÑтельноÑть
field_spent_on: Дата
-field_identifier: Признак
+field_identifier: Ун. идентификатор
field_is_filter: ИÑпользуетÑÑ Ð² качеÑтве фильтра
field_issue_to_id: СвÑзанные задачи
field_delay: Отложить
@@ -166,6 +175,9 @@ field_assignable: Задача может быть назначена Ñтой
field_redirect_existing_links: Перенаправить ÑущеÑтвующие ÑÑылки
field_estimated_hours: Оцененное времÑ
field_column_names: Колонки
+field_default_value: Значение по умолчанию
+field_time_zone: ЧаÑовой поÑÑ
+field_searchable: ДоÑтупно Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка
setting_app_title: Ðазвание приложениÑ
setting_app_subtitle: Подзаголовок приложениÑ
@@ -179,19 +191,22 @@ setting_mail_from: email Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ информации
setting_host_name: Ð˜Ð¼Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð°
setting_text_formatting: Форматирование текÑта
setting_wiki_compression: Сжатие иÑтории Wiki
-setting_feeds_limit: ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ð²Ð¾Ð´Ð¸Ð¼Ð¾Ð³Ð¾ ÑодержаниÑ
-setting_autofetch_changesets: Autofetch коммиты
-setting_sys_api_enabled: Разрешить WS Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸ÐµÐ¼
+setting_feeds_limit: Ограничение кол-ва заголовков Ð´Ð»Ñ RSS потока
+setting_autofetch_changesets: ÐвтоматичеÑки Ñледить за изменениÑми хранилища
+setting_sys_api_enabled: Разрешить WS Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰ÐµÐ¼
setting_commit_ref_keywords: Ключевые Ñлова Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка
setting_commit_fix_keywords: Ðазначение ключевых Ñлов
setting_autologin: ÐвтоматичеÑкий вход
setting_date_format: Формат даты
-setting_time_format: Time format
+setting_time_format: Формат времени
setting_cross_project_issue_relations: Разрешить переÑечение задач по проектам
setting_issue_list_default_columns: Колонки, отображаемые в ÑпиÑке задач по умолчанию
-setting_repositories_encodings: Кодировки репозиториÑ
+setting_repositories_encodings: Кодировки хранилища
setting_emails_footer: ПодÑтрочные Ð¿Ñ€Ð¸Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ Emailов
setting_protocol: Протокол
+setting_bcc_recipients: ИÑпользовать Ñкрытые ÑпиÑки (bcc)
+setting_per_page_options: Кол-во Ñтрок на Ñтраницу
+setting_user_format: Формат Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¸
label_user: Пользователь
label_user_plural: Пользователи
@@ -225,9 +240,9 @@ label_issue_status_new: Ðовый ÑтатуÑ
label_issue_category: ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ð·Ð°Ð´Ð°Ñ‡Ð¸
label_issue_category_plural: Категории задачи
label_issue_category_new: ÐÐ¾Ð²Ð°Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ
-label_custom_field: Поле клиента
-label_custom_field_plural: ÐŸÐ¾Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°
-label_custom_field_new: Ðовое поле клиента
+label_custom_field: ÐаÑтраиваемое поле
+label_custom_field_plural: ÐаÑтраиваемые полÑ
+label_custom_field_new: Ðовое наÑтраиваемое поле
label_enumerations: Справочники
label_enumeration_new: Ðовое значение
label_information: ИнформациÑ
@@ -243,13 +258,13 @@ label_administration: ÐдминиÑтрирование
label_login: Войти
label_logout: Выйти
label_help: Помощь
-label_reported_issues: Задачи, по которым предоÑтавлен отчет
+label_reported_issues: Созданные задачи
label_assigned_to_me_issues: Мои задачи
label_last_login: ПоÑледнее подключение
label_last_updates: ПоÑледнее обновление
label_last_updates_plural: %d поÑледние обновлениÑ
-label_registered_on: ЗарегиÑтрировано на
-label_activity: СобытиÑ
+label_registered_on: ЗарегиÑтрирован(а)
+label_activity: ÐктивноÑть
label_new: Ðовый
label_logged_as: Вошел как
label_environment: Окружение
@@ -258,11 +273,11 @@ label_auth_source: Режим аутентификации
label_auth_source_new: Ðовый режим аутентификации
label_auth_source_plural: Режимы аутентификации
label_subproject_plural: Подпроекты
-label_min_max_length: Min - МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð°
+label_min_max_length: ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ - МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð°
label_list: СпиÑок
label_date: Дата
label_integer: Целый
-label_float: Свободный
+label_float: С плавающей точкой
label_boolean: ЛогичеÑкий
label_string: ТекÑÑ‚
label_text: Длинный текÑÑ‚
@@ -302,9 +317,9 @@ label_total: Ð’Ñего
label_permissions: Права доÑтупа
label_current_status: Текущий ÑтатуÑ
label_new_statuses_allowed: Разрешены новые ÑтатуÑÑ‹
-label_all: Ð’Ñе
-label_none: Ðикому
-label_nobody: Ðикто
+label_all: вÑе
+label_none: отÑутÑтвует
+label_nobody: никто
label_next: Следующий
label_previous: Предыдущий
label_used_by: ИÑпользуетÑÑ
@@ -318,19 +333,19 @@ label_internal: Внутренний
label_last_changes: менее %d изменений
label_change_view_all: ПроÑмотреть вÑе изменениÑ
label_personalize_page: ПерÑонализировать данную Ñтраницу
-label_comment: Комментировать
+label_comment: комментарий
label_comment_plural: Комментарии
label_comment_add: ОÑтавить комментарий
label_comment_added: Добавленный комментарий
label_comment_delete: Удалить комментарии
-label_query: Ð—Ð°Ð¿Ñ€Ð¾Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°
-label_query_plural: ЗапроÑÑ‹ клиентов
+label_query: Сохраненный запроÑ
+label_query_plural: Сохраненные запроÑÑ‹
label_query_new: Ðовый запроÑ
label_filter_add: Добавить фильтр
label_filter_plural: Фильтры
-label_equals: еÑть
-label_not_equals: нет
-label_in_less_than: менее чем
+label_equals: ÑвлÑетÑÑ
+label_not_equals: не ÑвлÑетÑÑ
+label_in_less_than: Менее чем
label_in_more_than: более чем
label_in: в
label_today: ÑегоднÑ
@@ -341,18 +356,18 @@ label_ago: дней(Ñ) назад
label_contains: Ñодержит
label_not_contains: не Ñодержит
label_day_plural: дней(Ñ)
-label_repository: Репозиторий
-label_browse: ИÑкать
+label_repository: Хранилище
+label_browse: Обзор
label_modification: %d изменение
label_modification_plural: %d изменений
-label_revision: ВерÑиÑ
-label_revision_plural: ВерÑии
+label_revision: РедакциÑ
+label_revision_plural: Редакции
label_added: добавлено
label_modified: изменено
label_deleted: удалено
-label_latest_revision: ПоÑледнÑÑ Ð²ÐµÑ€ÑиÑ
-label_latest_revision_plural: ПоÑледние верÑии
-label_view_revisions: ПроÑмотреть верÑии
+label_latest_revision: ПоÑледнÑÑ Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ñ
+label_latest_revision_plural: ПоÑледние редакции
+label_view_revisions: ПроÑмотреть редакции
label_max_size: МакÑимальный размер
label_on: 'из'
label_sort_highest: В начало
@@ -382,24 +397,24 @@ label_spent_time: Затраченное времÑ
label_f_hour: %.2f чаÑ
label_f_hour_plural: %.2f чаÑов(а)
label_time_tracking: Учет времени
-label_change_plural: ИзменениÑ
+label_change_plural: Правки
label_statistics: СтатиÑтика
-label_commits_per_month: Коммиты на меÑÑц
-label_commits_per_author: Коммиты на пользователÑ
+label_commits_per_month: Изменений в меÑÑц
+label_commits_per_author: Изменений на пользователÑ
label_view_diff: ПроÑмотреть отличиÑ
-label_diff_inline: подключенный
+label_diff_inline: вÑтавкой
label_diff_side_by_side: Ñ€Ñдом
label_options: Опции
label_copy_workflow_from: Скопировать поÑледовательноÑть дейÑтвий из
label_permissions_report: Отчет о правах доÑтупа
-label_watched_issues: ПроÑмотренные задачи
+label_watched_issues: ПроÑматриваемые задачи
label_related_issues: СвÑзанные задачи
label_applied_status: Применимый ÑтатуÑ
label_loading: Загрузка...
label_relation_new: Ðовое отношение
label_relation_delete: Удалить ÑвÑзь
label_relates_to: ÑвÑзана Ñ
-label_duplicates: дублицирует
+label_duplicates: дублирует
label_blocks: блокирует
label_blocked_by: заблокировано
label_precedes: предшеÑтвует
@@ -424,8 +439,8 @@ label_send_information: Отправить пользователю информ
label_year: Год
label_month: МеÑÑц
label_week: ÐеделÑ
-label_date_from: От
-label_date_to: Кому
+label_date_from: С
+label_date_to: По
label_language_based: Ðа оÑнове Ñзыка
label_sort_by: Сортировать по %s
label_send_test_email: ПоÑлать email Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸
@@ -446,6 +461,16 @@ label_user_mail_option_all: "Ð”Ð»Ñ Ð²Ñех Ñобытий во вÑех мои
label_user_mail_option_selected: "Ð”Ð»Ñ Ð²Ñех Ñобытий только в выбранном проекте..."
label_user_mail_option_none: "Только Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, что Ñ Ð¿Ñ€Ð¾Ñматриваю или в чем Ñ ÑƒÑ‡Ð°Ñтвую"
label_user_mail_no_self_notified: "Ðе извещать об изменениÑÑ… которые Ñ Ñделал Ñам"
+label_registration_activation_by_email: Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ ÑƒÑ‡ÐµÑ‚Ð½Ñ‹Ñ… запиÑей по email
+label_registration_automatic_activation: автоматичеÑÐºÐ°Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ ÑƒÑ‡ÐµÑ‚Ð½Ñ‹Ñ… запиÑей
+label_registration_manual_activation: активировать учетные запиÑи вручную
+label_age: ВозраÑÑ‚
+label_change_properties: Изменить ÑвойÑтва
+label_general: Общее
+label_repository_plural: Хранилища
+label_associated_revisions: СвÑзанные редакции
+label_issues_by: Сортировать по %s
+label_display_per_page: 'Ðа Ñтраницу: %s'
button_login: Вход
button_submit: ПринÑть
@@ -460,7 +485,7 @@ button_add: Добавить
button_change: Изменить
button_apply: Применить
button_clear: ОчиÑтить
-button_lock: Закрыть
+button_lock: Заблокировать
button_unlock: Открыть
button_download: Загрузить
button_list: СпиÑок
@@ -481,13 +506,15 @@ button_reset: ПерезапуÑтить
button_rename: Переименовать
button_change_password: Изменить пароль
button_copy: Копировать
+button_annotate: ÐвторÑтво
+button_update: Обновить
status_active: Ðктивен
status_registered: ЗарегиÑтрирован
status_locked: Закрыт
text_select_mail_notifications: Выберите дейÑтвиÑ, на которые будет отÑылатьÑÑ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ðµ на Ñлектронную почту.
-text_regexp_info: eg. ^[A-Z0-9]+$
+text_regexp_info: напр. ^[A-Z0-9]+$
text_min_max_length_info: 0 означает отÑутÑтвие запретов
text_project_destroy_confirmation: Ð’Ñ‹ наÑтаиваете на удалении данного проекта и вÑей отноÑÑщейÑÑ Ðº нему информации?
text_workflow_edit: Выберите роль и трекер Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ÑледовательноÑти ÑоÑтоÑний
@@ -505,18 +532,21 @@ text_tracker_no_workflow: Ð”Ð»Ñ Ñтого трекера поÑледоват
text_unallowed_characters: Запрещенные Ñимволы
text_comma_separated: ДопуÑтимы неÑколько значений (разделенные запÑтой).
text_issues_ref_in_commit_messages: СопоÑтавление и изменение ÑтатуÑа задач иÑÑ…Ð¾Ð´Ñ Ð¸Ð· текÑта Ñообщений
-text_issue_added: О вопроÑе %s был Ñоздает отчет.
-text_issue_updated: Ð’Ð¾Ð¿Ñ€Ð¾Ñ %s был обновлен.
-text_wiki_destroy_confirmation: Ð’Ñ‹ уверены, что хотите удалить данную вики и вÑе Ñодержание?
+text_issue_added: По задаче %s был Ñоздан отчет (%s).
+text_issue_updated: Задача %s была обновлена (%s).
+text_wiki_destroy_confirmation: Ð’Ñ‹ уверены, что хотите удалить данную вики и вÑе Ñодержимое?
text_issue_category_destroy_question: ÐеÑколько задач (%d) назначено в данную категорию. Что вы хотите предпринÑть?
text_issue_category_destroy_assignments: Удалить Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ð¸
text_issue_category_reassign_to: Переназначить задачи Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ категории
-text_user_mail_option: "Ð”Ð»Ñ Ð½ÐµÐ²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… проектов, вы будете получать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ о том что проÑматриваете или в чем учаÑтвуете (например, вопроÑÑ‹ автором которых вы ÑвлÑетеÑÑŒ или которые вам назначенÐÑ‹)."
+text_user_mail_option: "Ð”Ð»Ñ Ð½ÐµÐ²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… проектов, вы будете получать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ о том что проÑматриваете или в чем учаÑтвуете (например, вопроÑÑ‹ автором которых вы ÑвлÑетеÑÑŒ или которые вам назначены)."
+text_caracters_minimum: Должно быть не менее %d знаков.
+text_load_default_configuration: Загрузить конфигурацию по-умолчанию
+text_no_configuration_data: "Роли, трекеры, ÑтатуÑÑ‹ задач и оперативный план не были Ñконфигурированы.\nÐаÑтоÑтельно рекомендуетÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ конфигурацию по-умолчанию. Ð’Ñ‹ Ñможете её изменить потом."
default_role_manager: Менеджер
default_role_developper: Разработчик
default_role_reporter: Генератор отчетов
-default_tracker_bug: Bug Ошибка
+default_tracker_bug: Ошибка
default_tracker_feature: ХарактериÑтика
default_tracker_support: Поддержка
default_issue_status_new: Ðовый
@@ -538,9 +568,76 @@ default_activity_development: Разработка
enumeration_issue_priorities: Приоритеты задач
enumeration_doc_categories: Категории документов
enumeration_activities: ДейÑÑ‚Ð²Ð¸Ñ (учет времени)
-label_registration_activation_by_email: account activation by email
-mail_subject_account_activation_request: Redmine account activation request
-mail_body_account_activation_request: 'A new user (%s) has registered. His account his pending your approval:'
-label_registration_automatic_activation: automatic account activation
-label_registration_manual_activation: manual account activation
-notice_account_pending: "Your account was created and is now pending administrator approval."
+text_status_changed_by_changeset: Реализовано в %s редакции.
+label_more: Больше
+text_issues_destroy_confirmation: 'Вы уверены, что хотите удалить выбранные задачи?'
+label_scm: 'Тип хранилища'
+text_select_project_modules: 'Выберите модули, которые будут иÑпользованы в проекте:'
+label_issue_added: Задача добавлена
+label_issue_updated: Задача обновлена
+label_document_added: Документ добавлен
+label_message_posted: Сообщение добавлено
+label_file_added: Файл добавлен
+label_news_added: ÐовоÑть добавлена
+label_calendar_filter: ВключаÑ
+label_calendar_no_assigned: не мои
+label_timelog_today: РаÑход времени за ÑегоднÑ
+project_module_boards: Форумы
+project_module_issue_tracking: Задачи
+project_module_wiki: Wiki
+project_module_files: Файлы
+project_module_documents: Документы
+project_module_repository: Харнилище
+project_module_news: ÐовоÑтной блок
+project_module_time_tracking: Учет времени
+text_file_repository_writable: Хранилище Ñ Ð´Ð¾Ñтупом на запиÑÑŒ
+text_default_administrator_account_changed: Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ админиÑтратора по умолчанию изменена
+text_rmagick_available: ДоÑтупно иÑпользование RMagick (выборочно)
+button_configure: Параметры
+label_plugins: Модули
+label_ldap_authentication: ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ð¾ÑредÑтвом LDAP
+label_downloads_abbr: Скачек
+label_this_month: Ñтот меÑÑц
+label_last_n_days: поÑледние %d дней
+label_all_time: вÑÑ‘ времÑ
+label_this_year: Ñтот год
+label_date_range: временной интервал
+label_last_week: поÑледнÑÑ Ð½ÐµÐ´ÐµÐ»ÑŽ
+label_yesterday: вчера
+label_last_month: поÑледний меÑÑц
+label_add_another_file: Добавить ещё один файл
+label_optional_description: ОпиÑание (выборочно)
+text_destroy_time_entries_question: Ð’Ñ‹ ÑобираетеÑÑŒ удалить %.02f чаÑа(ов) прикрепленных за Ñтой задачей.
+error_issue_not_found_in_project: Задача не была найдена или не прикреплена к Ñтому проекту
+text_assign_time_entries_to_project: Прикрепить зарегиÑтрированное Ð²Ñ€ÐµÐ¼Ñ Ðº проекту
+text_destroy_time_entries: Удалить зарегиÑтрированное времÑ
+text_reassign_time_entries: 'ПеренеÑти зарегиÑтрированное Ð²Ñ€ÐµÐ¼Ñ Ð½Ð° Ñледующую задачу:'
+setting_activity_days_default: Кол-во дней, отображаемых в ÐктивноÑти
+label_chronological_order: Ð’ хронологичеÑком порÑдке
+field_comments_sorting: Отображение комментариев
+label_reverse_chronological_order: Ð’ обратном порÑдке
+label_preferences: ПредпочтениÑ
+setting_display_subprojects_issues: Отображение подпроектов по умолчанию
+label_overall_activity: Ð¡Ð²Ð¾Ð´Ð½Ð°Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ñть
+setting_default_projects_public: Ðовые проекты ÑвлÑÑŽÑ‚ÑÑ Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ñ‹Ð¼Ð¸
+error_scm_annotate: "Данные отÑутÑтвуют или не могут быть подпиÑаны."
+label_planning: Планирование
+text_subprojects_destroy_warning: 'Подпроекты: %s также будут удалены.'
+label_and_its_subprojects: %s и вÑе подпроекты
+mail_body_reminder: "%d назначенных на Ð²Ð°Ñ Ð·Ð°Ð´Ð°Ñ‡ на Ñледующие %d дней:"
+mail_subject_reminder: "%d назначенных на Ð²Ð°Ñ Ð·Ð°Ð´Ð°Ñ‡ в ближайшие дни"
+text_user_wrote: '%s напиÑал:'
+label_duplicated_by: дублируетÑÑ
+setting_enabled_scm: ЗадейÑтвовать SCM
+text_enumeration_category_reassign_to: 'Ðазначить им Ñледующее значение:'
+text_enumeration_destroy_question: '%d объект(а,ов) ÑвÑзаны Ñ Ñтим значением.'
+label_incoming_emails: Приём Ñообщений
+label_generate_key: Сгенерировать ключ
+setting_mail_handler_api_enabled: Включить веб-ÑÐµÑ€Ð²Ð¸Ñ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих Ñообщений
+setting_mail_handler_api_key: API ключ
+text_email_delivery_not_configured: "Параметры работы Ñ Ð¿Ð¾Ñ‡Ñ‚Ð¾Ð²Ñ‹Ð¼ Ñервером не наÑтроены и Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ email не активна.\nÐаÑтроить параметры Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ SMTP Ñервера вы можете в файле config/email.yml. Ð”Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ перезапуÑтите приложение."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/sr.yml b/lang/sr.yml
index 769d8177f..4e262369e 100644
--- a/lang/sr.yml
+++ b/lang/sr.yml
@@ -1,7 +1,7 @@
_gloc_rule_default: '|n| n==1 ? "" : "_plural" '
actionview_datehelper_select_day_prefix:
-actionview_datehelper_select_month_names: Januar,Februar,Mart,April,Maj,Jue,Jul,Avgust,Septembar,Oktobar,Novembar,Decembar
+actionview_datehelper_select_month_names: Januar,Februar,Mart,April,Maj,Jun,Jul,Avgust,Septembar,Oktobar,Novembar,Decembar
actionview_datehelper_select_month_names_abbr: Jan,Feb,Mar,Apr,Maj,Jun,Jul,Avg,Sep,Okt,Nov,Dec
actionview_datehelper_select_month_prefix:
actionview_datehelper_select_year_prefix:
@@ -19,7 +19,7 @@ actionview_datehelper_time_in_words_second_less_than: manje od sekunde
actionview_datehelper_time_in_words_second_less_than_plural: manje od %d sekundi
actionview_instancetag_blank_option: Molim izaberite
-activerecord_error_inclusion: nije ukljucen u listu
+activerecord_error_inclusion: nije ukljuÄen u listu
activerecord_error_exclusion: je rezervisan
activerecord_error_invalid: je pogrešan
activerecord_error_confirmation: Ne slaže se sa potvrdom
@@ -29,7 +29,7 @@ activerecord_error_blank: ne sme biti prazno
activerecord_error_too_long: je suvise dugaÄko
activerecord_error_too_short: je suvise kratko
activerecord_error_wrong_length: je pogrešne dužine
-activerecord_error_taken: je vež zauzeto
+activerecord_error_taken: je već zauzeto
activerecord_error_not_a_number: nije broj
activerecord_error_not_a_date: nije datum
activerecord_error_greater_than_start_date: mora biti veći od poÄetnog datuma
@@ -48,6 +48,7 @@ general_text_no: 'ne'
general_text_yes: 'da'
general_lang_name: 'Srpski'
general_csv_separator: ','
+general_csv_decimal_separator: '.'
general_csv_encoding: ISO-8859-1
general_pdf_encoding: ISO-8859-1
general_day_names: Ponedeljak, Utorak, Sreda, Äetvrtak, Petak, Subota, Nedelja
@@ -59,7 +60,7 @@ notice_account_password_updated: Lozinka je uspešno izmenjena.
notice_account_wrong_password: Pogrešna lozinka
notice_account_register_done: Nalog je uspešno kreiran. Da bi ste aktivirali vaš nalog kliknite na link koji vam je poslat.
notice_account_unknown_email: Nepoznati korisnik.
-notice_can_t_change_password: Ovaj nalog koristi eksterni izvor autentifikacije. Ne mogu da promenim šifru.
+notice_can_t_change_password: Ovaj nalog koristi eksterni izvor prijavljivanja. Ne mogu da promenim šifru.
notice_account_lost_email_sent: Email sa uputstvima o izboru nove šifre je poslat na vašu adresu.
notice_account_activated: Vaš nalog je aktiviran. Možete se ulogovati.
notice_successful_create: Uspešna kreacija.
@@ -68,7 +69,6 @@ notice_successful_delete: Uspešno brisanje.
notice_successful_connection: Uspešna konekcija.
notice_file_not_found: Stranica kojoj pokušavate da pristupite ne postoji ili je uklonjena.
notice_locking_conflict: Podaci su izmenjeni od strane drugog korisnika.
-notice_scm_error: Unos i/ili revizija ne postoji u repository-ju.
notice_not_authorized: Niste ovlašćeni da pristupite ovoj stranici.
notice_email_sent: Email je poslat %s
notice_email_error: Došlo je do greške pri slanju maila (%s)
@@ -76,12 +76,15 @@ notice_feeds_access_key_reseted: Vaš RSS pristup je resetovan.
notice_failed_to_save_issues: "Neuspešno snimanje %d kartica na %d izabrano: %s."
notice_no_issue_selected: "Nijedna kartica nije izabrana! Molim, izaberite kartice koje želite za editujete."
-mail_subject_lost_password: Vaša redMine lozinka
-mail_body_lost_password: 'Da biste izmenili vašu Redmine lozinku, kliknite na sledeći link:'
-mail_subject_register: aktivacija redMine naloga
-mail_body_register: 'Da biste aktivirali vaš Redmine nalog, kliknite na sledeći link:'
-mail_body_account_information_external: Mozete koristiti vas "%s" nalog da bi ste se prikljucili na Redmine.
-mail_body_account_information: Informacije o vasem Redmine nalogu
+error_scm_not_found: "Unos i/ili revizija ne postoji u spremištu."
+error_scm_command_failed: "An error occurred when trying to access the repository: %s"
+
+mail_subject_lost_password: Vaša %s lozinka
+mail_body_lost_password: 'Da biste izmenili vašu lozinku, kliknite na sledeći link:'
+mail_subject_register: Aktivacija %s naloga
+mail_body_register: 'Da biste aktivirali vaš nalog, kliknite na sledeći link:'
+mail_body_account_information_external: Mozete koristiti vas "%s" nalog da bi ste se prikljucili.
+mail_body_account_information: Informacije o vasem nalogu
gui_validation_error: 1 greška
gui_validation_error_plural: %d grešaka
@@ -119,7 +122,7 @@ field_subject: Subjekat
field_due_date: Do datuma
field_assigned_to: Dodeljeno
field_priority: Prioritet
-field_fixed_version: Ispravljena verzija
+field_fixed_version: Target version
field_user: Korisnik
field_role: Uloga
field_homepage: Homepage
@@ -149,7 +152,7 @@ field_attr_mail: Atribut email-a
field_onthefly: Kreacija naloga "On-the-fly"
field_start_date: Start
field_done_ratio: %% Završeno
-field_auth_source: Vrsta autentifikacije
+field_auth_source: Vrsta prijavljivanja
field_hide_mail: Sakrij moju email adresu
field_comments: Komentar
field_url: URL
@@ -166,12 +169,13 @@ field_assignable: Kartice mogu biti dodeljene ovoj ulozi
field_redirect_existing_links: Redirekcija postojećih linkova
field_estimated_hours: Procenjeno vreme
field_column_names: Kolone
+field_default_value: Default value
setting_app_title: Naziv aplikacije
setting_app_subtitle: Podnaslov aplikacije
setting_welcome_text: Tekst dobrodošlice
setting_default_language: Podrazumevani jezik
-setting_login_required: Autentifikacija obavezna
+setting_login_required: Prijavljivanje obaveyno
setting_self_registration: Samoregistracija je dozvoljena
setting_attachment_max_size: Maksimalna velicina Attachment-a
setting_issues_export_limit: Max broj kartica u exportu
@@ -181,14 +185,14 @@ setting_text_formatting: Formatiranje teksta
setting_wiki_compression: Kompresija wiki history-a
setting_feeds_limit: Feed content limit
setting_autofetch_changesets: Autofetch commits
-setting_sys_api_enabled: Ukljuci WS za menadžment repository-ja
+setting_sys_api_enabled: Ukljuci WS za menadžment spremišta
setting_commit_ref_keywords: Referentne kljuÄne reÄi
setting_commit_fix_keywords: Fiksne kljuÄne reÄi
setting_autologin: Autologin
setting_date_format: Format datuma
setting_cross_project_issue_relations: Dozvoli relacije kartica izmeÄ‘u razliÄitih projekata
setting_issue_list_default_columns: Podrazumevana kolona se prikazuje na listi kartica
-setting_repositories_encodings: Kodna stranica repository-ja
+setting_repositories_encodings: Kodna stranica spremišta
setting_emails_footer: Zaglavlje emaila
label_user: Korisnik
@@ -249,12 +253,12 @@ label_last_updates_plural: %d poslednje izmenjene
label_registered_on: Registrovano
label_activity: Aktivnost
label_new: Novo
-label_logged_as: Logged as
+label_logged_as: Prijavljen kao
label_environment: Environment
-label_authentication: Autentifikacija
-label_auth_source: NaÄin autentifikacije
-label_auth_source_new: Novi naÄin autentifikacije
-label_auth_source_plural: NaÄini autentifikacije
+label_authentication: Prijavljivanje
+label_auth_source: NaÄin prijavljivanja
+label_auth_source_new: Novi naÄin prijavljivanja
+label_auth_source_plural: NaÄini prijavljivanja
label_subproject_plural: Podprojekti
label_min_max_length: Min - Max velicina
label_list: Liste
@@ -339,7 +343,7 @@ label_ago: pre dana
label_contains: Sadrži
label_not_contains: ne sadrži
label_day_plural: dana
-label_repository: Repository
+label_repository: Spremište
label_browse: Pregled
label_modification: %d izmena
label_modification_plural: %d izmena
@@ -501,8 +505,8 @@ text_tracker_no_workflow: Tok rada nije definisan za ovaj tracker
text_unallowed_characters: Nedozvoljeni karakteri
text_comma_separated: Višestruke vrednosti su dozvoljene (razdvojene zarezom).
text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages
-text_issue_added: Kartica %s je prijavljena.
-text_issue_updated: Kartica %s je izmenjena.
+text_issue_added: Kartica %s je prijavljena (by %s).
+text_issue_updated: Kartica %s je izmenjena (by %s).
text_wiki_destroy_confirmation: Da li ste sigurni da želite da izbrišete ovaj wiki i svu njegovu sadržinu ?
text_issue_category_destroy_question: Neke kartice (%d) su dodeljene ovoj kategoriji. Šta želite da uradite ?
text_issue_category_destroy_assignments: Ukloni dodeljivanje kategorija
@@ -520,7 +524,7 @@ default_issue_status_assigned: Dodeljeno
default_issue_status_resolved: Rešeno
default_issue_status_feedback: Povratna informacija
default_issue_status_closed: Zatvoreno
-default_issue_status_rejected: Odbaceno
+default_issue_status_rejected: OdbaÄeno
default_doc_category_user: KorisniÄka dokumentacija
default_doc_category_tech: TehniÄka dokumentacija
default_priority_low: Nizak
@@ -537,11 +541,100 @@ enumeration_activities: Aktivnosti (praćenje vremena))
label_float: Float
button_copy: Copy
setting_protocol: Protocol
-label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
-setting_time_format: Time format
-label_registration_activation_by_email: account activation by email
-mail_subject_account_activation_request: Redmine account activation request
-mail_body_account_activation_request: 'A new user (%s) has registered. His account his pending your approval:'
-label_registration_automatic_activation: automatic account activation
-label_registration_manual_activation: manual account activation
-notice_account_pending: "Your account was created and is now pending administrator approval."
+label_user_mail_no_self_notified: "Ne želim da budem obaveštavan o izmenama koje sam pravim"
+setting_time_format: Format vremena
+label_registration_activation_by_email: aktivacija naloga putem email-a
+mail_subject_account_activation_request: %s zahtev za aktivacijom naloga
+mail_body_account_activation_request: 'Novi korisnik (%s) se registrovao. Njegov nalog Äeka vaÅ¡e odobrenje:'
+label_registration_automatic_activation: automatska aktivacija naloga
+label_registration_manual_activation: ruÄna aktivacija naloga
+notice_account_pending: "VaÅ¡ nalog je kreiran i Äeka odobrenje administratora."
+field_time_zone: Vremenska zona
+text_caracters_minimum: Mora biti minimum %d karaktera dugaÄka.
+setting_bcc_recipients: '"Blind carbon copy" primaoci (bcc)'
+button_annotate: Annotate
+label_issues_by: Kartice od %s
+field_searchable: Searchable
+label_display_per_page: 'Po stranici: %s'
+setting_per_page_options: Objekata po stranici opcija
+label_age: Starost
+notice_default_data_loaded: Default configuration successfully loaded.
+text_load_default_configuration: Load the default configuration
+text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
+error_can_t_load_default_data: "Default configuration could not be loaded: %s"
+button_update: Update
+label_change_properties: Change properties
+label_general: General
+label_repository_plural: Repositories
+label_associated_revisions: Associated revisions
+setting_user_format: Users display format
+text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
+text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s) ?'
+label_scm: SCM
+text_select_project_modules: 'Select modules to enable for this project:'
+label_issue_added: Issue added
+label_issue_updated: Issue updated
+label_document_added: Document added
+label_message_posted: Message added
+label_file_added: File added
+label_news_added: News added
+project_module_boards: Boards
+project_module_issue_tracking: Issue tracking
+project_module_wiki: Wiki
+project_module_files: Files
+project_module_documents: Documents
+project_module_repository: Repository
+project_module_news: News
+project_module_time_tracking: Time tracking
+text_file_repository_writable: File repository writable
+text_default_administrator_account_changed: Default administrator account changed
+text_rmagick_available: RMagick available (optional)
+button_configure: Configure
+label_plugins: Plugins
+label_ldap_authentication: LDAP authentication
+label_downloads_abbr: D/L
+label_this_month: this month
+label_last_n_days: last %d days
+label_all_time: all time
+label_this_year: this year
+label_date_range: Date range
+label_last_week: last week
+label_yesterday: yesterday
+label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
+text_destroy_time_entries_question: %.02f hours were reported on the issues you are about to delete. What do you want to do ?
+error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
+text_assign_time_entries_to_project: Assign reported hours to the project
+text_destroy_time_entries: Delete reported hours
+text_reassign_time_entries: 'Reassign reported hours to this issue:'
+setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Display comments
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
+setting_display_subprojects_issues: Display subprojects issues on main projects by default
+label_overall_activity: Overall activity
+setting_default_projects_public: New projects are public by default
+error_scm_annotate: "The entry does not exist or can not be annotated."
+label_planning: Planning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
+label_and_its_subprojects: %s and its subprojects
+mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
+mail_subject_reminder: "%d issue(s) due in the next days"
+text_user_wrote: '%s wrote:'
+label_duplicated_by: duplicated by
+setting_enabled_scm: Enabled SCM
+text_enumeration_category_reassign_to: 'Reassign them to this value:'
+text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
+text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/sv.yml b/lang/sv.yml
index 6421173fd..3bb337e3d 100644
--- a/lang/sv.yml
+++ b/lang/sv.yml
@@ -48,6 +48,7 @@ general_text_no: 'nej'
general_text_yes: 'ja'
general_lang_name: 'Svenska'
general_csv_separator: ','
+general_csv_decimal_separator: '.'
general_csv_encoding: ISO-8859-1
general_pdf_encoding: ISO-8859-1
general_day_names: Måndag,Tisdag,Onsdag,Torsdag,Fredag,Lördag,Söndag
@@ -68,16 +69,18 @@ notice_successful_delete: Lyckad borttagning.
notice_successful_connection: Lyckad uppkoppling.
notice_file_not_found: Sidan du försökte komma åt existerar inte eller har blivit borttagen.
notice_locking_conflict: Data har uppdaterats av en annan användare.
-notice_scm_error: Inlägg och/eller revision finns inte i repositoriet.
notice_not_authorized: You are not authorized to access this page.
notice_email_sent: An email was sent to %s
notice_email_error: An error occurred while sending mail (%s)
notice_feeds_access_key_reseted: Your RSS access key was reseted.
-mail_subject_lost_password: Ditt redMine lösenord
+error_scm_not_found: "Inlägg och/eller revision finns inte i repositoriet."
+error_scm_command_failed: "An error occurred when trying to access the repository: %s"
+
+mail_subject_lost_password: Ditt %s lösenord
mail_body_lost_password: 'För att ändra lösenord, följ denna länk:'
-mail_subject_register: redMine kontoaktivering
-mail_body_register: 'För att aktivera ditt Redmine-konto, använd följande länk.'
+mail_subject_register: Ditt %s kontoaktivering
+mail_body_register: 'För att aktivera ditt konto, använd följande länk.'
gui_validation_error: 1 fel
gui_validation_error_plural: %d fel
@@ -115,7 +118,7 @@ field_subject: Rubrik
field_due_date: Färdigdatum
field_assigned_to: Tilldelad
field_priority: Prioritet
-field_fixed_version: Fixed version
+field_fixed_version: Target version
field_user: Användare
field_role: Roll
field_homepage: Hemsida
@@ -161,6 +164,7 @@ field_delay: Delay
field_assignable: Issues can be assigned to this role
field_redirect_existing_links: Redirect existing links
field_estimated_hours: Estimated time
+field_default_value: Default value
setting_app_title: Applikationstitel
setting_app_subtitle: Applicationsunderrubrik
@@ -479,8 +483,8 @@ text_tracker_no_workflow: Inget workflow definerat för denna tracker
text_unallowed_characters: Unallowed characters
text_comma_separated: Multiple values allowed (comma separated).
text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages
-text_issue_added: Brist %s har rapporterats.
-text_issue_updated: Brist %s har uppdaterats.
+text_issue_added: Brist %s har rapporterats (by %s).
+text_issue_updated: Brist %s har uppdaterats (by %s).
text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content ?
text_issue_category_destroy_question: Some issues (%d) are assigned to this category. What do you want to do ?
text_issue_category_destroy_assignments: Remove category assignments
@@ -534,14 +538,103 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in"
setting_emails_footer: Emails footer
label_float: Float
button_copy: Copy
-mail_body_account_information_external: You can use your "%s" account to log into Redmine.
-mail_body_account_information: Your Redmine account information
+mail_body_account_information_external: You can use your "%s" account to log in.
+mail_body_account_information: Your account information
setting_protocol: Protocol
label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
setting_time_format: Time format
label_registration_activation_by_email: account activation by email
-mail_subject_account_activation_request: Redmine account activation request
+mail_subject_account_activation_request: %s account activation request
mail_body_account_activation_request: 'A new user (%s) has registered. His account his pending your approval:'
label_registration_automatic_activation: automatic account activation
label_registration_manual_activation: manual account activation
notice_account_pending: "Your account was created and is now pending administrator approval."
+field_time_zone: Time zone
+text_caracters_minimum: Must be at least %d characters long.
+setting_bcc_recipients: Blind carbon copy recipients (bcc)
+button_annotate: Annotate
+label_issues_by: Issues by %s
+field_searchable: Searchable
+label_display_per_page: 'Per page: %s'
+setting_per_page_options: Objects per page options
+label_age: Age
+notice_default_data_loaded: Default configuration successfully loaded.
+text_load_default_configuration: Load the default configuration
+text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
+error_can_t_load_default_data: "Default configuration could not be loaded: %s"
+button_update: Update
+label_change_properties: Change properties
+label_general: General
+label_repository_plural: Repositories
+label_associated_revisions: Associated revisions
+setting_user_format: Users display format
+text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
+text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s) ?'
+label_scm: SCM
+text_select_project_modules: 'Select modules to enable for this project:'
+label_issue_added: Issue added
+label_issue_updated: Issue updated
+label_document_added: Document added
+label_message_posted: Message added
+label_file_added: File added
+label_news_added: News added
+project_module_boards: Boards
+project_module_issue_tracking: Issue tracking
+project_module_wiki: Wiki
+project_module_files: Files
+project_module_documents: Documents
+project_module_repository: Repository
+project_module_news: News
+project_module_time_tracking: Time tracking
+text_file_repository_writable: File repository writable
+text_default_administrator_account_changed: Default administrator account changed
+text_rmagick_available: RMagick available (optional)
+button_configure: Configure
+label_plugins: Plugins
+label_ldap_authentication: LDAP authentication
+label_downloads_abbr: D/L
+label_this_month: this month
+label_last_n_days: last %d days
+label_all_time: all time
+label_this_year: this year
+label_date_range: Date range
+label_last_week: last week
+label_yesterday: yesterday
+label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
+text_destroy_time_entries_question: %.02f hours were reported on the issues you are about to delete. What do you want to do ?
+error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
+text_assign_time_entries_to_project: Assign reported hours to the project
+text_destroy_time_entries: Delete reported hours
+text_reassign_time_entries: 'Reassign reported hours to this issue:'
+setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Display comments
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
+setting_display_subprojects_issues: Display subprojects issues on main projects by default
+label_overall_activity: Overall activity
+setting_default_projects_public: New projects are public by default
+error_scm_annotate: "The entry does not exist or can not be annotated."
+label_planning: Planning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
+label_and_its_subprojects: %s and its subprojects
+mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
+mail_subject_reminder: "%d issue(s) due in the next days"
+text_user_wrote: '%s wrote:'
+label_duplicated_by: duplicated by
+setting_enabled_scm: Enabled SCM
+text_enumeration_category_reassign_to: 'Reassign them to this value:'
+text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
+text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/th.yml b/lang/th.yml
new file mode 100644
index 000000000..a9708716e
--- /dev/null
+++ b/lang/th.yml
@@ -0,0 +1,642 @@
+_gloc_rule_default: '|n| n==1 ? "" : "_plural" '
+
+actionview_datehelper_select_day_prefix:
+actionview_datehelper_select_month_names: มà¸à¸£à¸²à¸„ม,à¸à¸¸à¸¡à¸ าพันธ์,มีนาคม,เมษายน,พฤษภาคม,มิถุนายน,à¸à¸£à¸à¸Žà¸²à¸„ม,สิงหาคม,à¸à¸±à¸™à¸¢à¸²à¸¢à¸™,ตุลาคม,พฤศจิà¸à¸²à¸¢à¸™,ธันวาคม
+actionview_datehelper_select_month_names_abbr: ม.ค.,à¸.พ.,มี.ค.,เม.ย.,พ.ค.,มิ.ย.,à¸.ค.,ส.ค.,à¸.ย.,ต.ค.,พ.ย.,ธ.ค.
+actionview_datehelper_select_month_prefix:
+actionview_datehelper_select_year_prefix:
+actionview_datehelper_time_in_words_day: 1 วัน
+actionview_datehelper_time_in_words_day_plural: %d วัน
+actionview_datehelper_time_in_words_hour_about: ประมาณ 1 ชั่วโมง
+actionview_datehelper_time_in_words_hour_about_plural: ประมาณ %d ชั่วโมง
+actionview_datehelper_time_in_words_hour_about_single: ประมาณ 1 ชั่วโมง
+actionview_datehelper_time_in_words_minute: 1 นาที
+actionview_datehelper_time_in_words_minute_half: ครึ่งนาที
+actionview_datehelper_time_in_words_minute_less_than: ไม่ถึงนาที
+actionview_datehelper_time_in_words_minute_plural: %d นาที
+actionview_datehelper_time_in_words_minute_single: 1 นาที
+actionview_datehelper_time_in_words_second_less_than: ไม่ถึงวินาที
+actionview_datehelper_time_in_words_second_less_than_plural: ไม่ถึง %d วินาที
+actionview_instancetag_blank_option: à¸à¸£à¸¸à¸“าเลืà¸à¸
+
+activerecord_error_inclusion: ไม่à¸à¸¢à¸¹à¹ˆà¹ƒà¸™à¸£à¸²à¸¢à¸à¸²à¸£
+activerecord_error_exclusion: ถูà¸à¸ªà¸‡à¸§à¸™à¹„ว้
+activerecord_error_invalid: ไม่ถูà¸à¸•้à¸à¸‡
+activerecord_error_confirmation: พิมพ์ไม่เหมืà¸à¸™à¹€à¸”ิม
+activerecord_error_accepted: ต้à¸à¸‡à¸¢à¸à¸¡à¸£à¸±à¸š
+activerecord_error_empty: ต้à¸à¸‡à¹€à¸•ิม
+activerecord_error_blank: ต้à¸à¸‡à¹€à¸•ิม
+activerecord_error_too_long: ยาวเà¸à¸´à¸™à¹„ป
+activerecord_error_too_short: สั้นเà¸à¸´à¸™à¹„ป
+activerecord_error_wrong_length: ความยาวไม่ถูà¸à¸•้à¸à¸‡
+activerecord_error_taken: ถูà¸à¹ƒà¸Šà¹‰à¹„ปà¹à¸¥à¹‰à¸§
+activerecord_error_not_a_number: ไม่ใช่ตัวเลข
+activerecord_error_not_a_date: ไม่ใช่วันที่ ที่ถูà¸à¸•้à¸à¸‡
+activerecord_error_greater_than_start_date: ต้à¸à¸‡à¸¡à¸²à¸à¸à¸§à¹ˆà¸²à¸§à¸±à¸™à¹€à¸£à¸´à¹ˆà¸¡
+activerecord_error_not_same_project: ไม่ได้à¸à¸¢à¸¹à¹ˆà¹ƒà¸™à¹‚ครงà¸à¸²à¸£à¹€à¸”ียวà¸à¸±à¸™
+activerecord_error_circular_dependency: ความสัมพันธ์à¸à¹‰à¸²à¸‡à¸à¸´à¸‡à¹€à¸›à¹‡à¸™à¸§à¸‡à¸à¸¥à¸¡
+
+general_fmt_age: %d ปี
+general_fmt_age_plural: %d ปี
+general_fmt_date: %%d/%%B/%%Y
+general_fmt_datetime: %%d/%%B/%%Y %%H:%%M
+general_fmt_datetime_short: %%d %%b, %%H:%%M
+general_fmt_time: %%H:%%M
+general_text_No: 'ไม่'
+general_text_Yes: 'ใช่'
+general_text_no: 'ไม่'
+general_text_yes: 'ใช่'
+general_lang_name: 'Thai (ไทย)'
+general_csv_separator: ','
+general_csv_decimal_separator: '.'
+general_csv_encoding: Windows-874
+general_pdf_encoding: cp874
+general_day_names: จันทร์,à¸à¸±à¸‡à¸„าร,พุธ,พฤหัสบดี,ศุà¸à¸£à¹Œ,เสาร์,à¸à¸²à¸—ิตย์
+general_first_day_of_week: '1'
+
+notice_account_updated: บัà¸à¸Šà¸µà¹„ด้ถูà¸à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¹à¸¥à¹‰à¸§.
+notice_account_invalid_creditentials: ชื้ผู้ใช้หรืà¸à¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™à¹„ม่ถูà¸à¸•้à¸à¸‡
+notice_account_password_updated: รหัสได้ถูà¸à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¹à¸¥à¹‰à¸§.
+notice_account_wrong_password: รหัสผ่านไม่ถูà¸à¸•้à¸à¸‡
+notice_account_register_done: บัà¸à¸Šà¸µà¸–ูà¸à¸ªà¸£à¹‰à¸²à¸‡à¹à¸¥à¹‰à¸§. à¸à¸£à¸¸à¸“าเช็คเมล์ à¹à¸¥à¹‰à¸§à¸„ลิ๊à¸à¸—ี่ลิงค์ในà¸à¸µà¹€à¸¡à¸¥à¹Œà¹€à¸žà¸·à¹ˆà¸à¹€à¸›à¸´à¸”ใช้บัà¸à¸Šà¸µ
+notice_account_unknown_email: ไม่มีผู้ใช้ที่ใช้à¸à¸µà¹€à¸¡à¸¥à¹Œà¸™à¸µà¹‰.
+notice_can_t_change_password: บัà¸à¸Šà¸µà¸™à¸µà¹‰à¹ƒà¸Šà¹‰à¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸•ัวตนจาà¸à¹à¸«à¸¥à¹ˆà¸‡à¸ ายนà¸à¸. ไม่สามารถปลี่ยนรหัสผ่านได้.
+notice_account_lost_email_sent: เราได้ส่งà¸à¸µà¹€à¸¡à¸¥à¹Œà¸žà¸£à¹‰à¸à¸¡à¸§à¸´à¸˜à¸µà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸£à¸«à¸±à¸µà¸ªà¸œà¹ˆà¸²à¸™à¹ƒà¸«à¸¡à¹ˆà¹ƒà¸«à¹‰à¸„ุณà¹à¸¥à¹‰à¸§ à¸à¸£à¸¸à¸“าเช็คเมล์.
+notice_account_activated: บัà¸à¸Šà¸µà¸‚à¸à¸‡à¸„ุณได้เปิดใช้à¹à¸¥à¹‰à¸§. ตà¸à¸™à¸™à¸µà¹‰à¸„ุณสามารถเข้าสู่ระบบได้à¹à¸¥à¹‰à¸§.
+notice_successful_create: สร้างเสร็จà¹à¸¥à¹‰à¸§.
+notice_successful_update: ปรับปรุงเสร็จà¹à¸¥à¹‰à¸§.
+notice_successful_delete: ลบเสร็จà¹à¸¥à¹‰à¸§.
+notice_successful_connection: ติดต่à¸à¸ªà¸³à¹€à¸£à¹‡à¸ˆà¹à¸¥à¹‰à¸§.
+notice_file_not_found: หน้าที่คุณต้à¸à¸‡à¸à¸²à¸£à¸”ูไม่มีà¸à¸¢à¸¹à¹ˆà¸ˆà¸£à¸´à¸‡ หรืà¸à¸–ูà¸à¸¥à¸šà¹„ปà¹à¸¥à¹‰à¸§.
+notice_locking_conflict: ข้à¸à¸¡à¸¹à¸¥à¸–ูà¸à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¹‚ดยผู้ใช้คนà¸à¸·à¹ˆà¸™.
+notice_not_authorized: คุณไม่มีสิทธิเข้าถึงหน้านี้.
+notice_email_sent: à¸à¸µà¹€à¸¡à¸¥à¹Œà¹„ด้ถูà¸à¸ªà¹ˆà¸‡à¸–ึง %s
+notice_email_error: เà¸à¸´à¸”ความผิดพลาดขณะà¸à¸³à¸ªà¹ˆà¸‡à¸à¸µà¹€à¸¡à¸¥à¹Œ (%s)
+notice_feeds_access_key_reseted: RSS access key ขà¸à¸‡à¸„ุณถูภreset à¹à¸¥à¹‰à¸§.
+notice_failed_to_save_issues: "%d ปัà¸à¸«à¸²à¸ˆà¸²à¸ %d ปัà¸à¸«à¸²à¸—ี่ถูà¸à¹€à¸¥à¸·à¸à¸à¹„ม่สามารถจัดเà¸à¹‡à¸š: %s."
+notice_no_issue_selected: "ไม่มีปัà¸à¸«à¸²à¸—ี่ถูà¸à¹€à¸¥à¸·à¸à¸! à¸à¸£à¸¸à¸“าเลืà¸à¸à¸›à¸±à¸à¸«à¸²à¸—ี่คุณต้à¸à¸‡à¸à¸²à¸£à¹à¸à¹‰à¹„ข."
+notice_account_pending: "บัà¸à¸Šà¸µà¸‚à¸à¸‡à¸„ุณสร้างเสร็จà¹à¸¥à¹‰à¸§ ขณะนี้รà¸à¸à¸²à¸£à¸à¸™à¸¸à¸¡à¸±à¸•ิจาà¸à¸œà¸¹à¹‰à¸šà¸£à¸´à¸«à¸²à¸£à¸ˆà¸±à¸”à¸à¸²à¸£."
+notice_default_data_loaded: ค่าเริ่มต้นโหลดเสร็จà¹à¸¥à¹‰à¸§.
+
+error_can_t_load_default_data: "ค่าเริ่มต้นโหลดไม่สำเร็จ: %s"
+error_scm_not_found: "ไม่พบรุ่นที่ต้à¸à¸‡à¸à¸²à¸£à¹ƒà¸™à¹à¸«à¸¥à¹ˆà¸‡à¹€à¸à¹‡à¸šà¸•้นฉบับ."
+error_scm_command_failed: "เà¸à¸´à¸”ความผิดพลาดในà¸à¸²à¸£à¹€à¸‚้าถึงà¹à¸«à¸¥à¹ˆà¸‡à¹€à¸à¹‡à¸šà¸•้นฉบับ: %s"
+error_scm_annotate: "entry ไม่มีà¸à¸¢à¸¹à¹ˆà¸ˆà¸£à¸´à¸‡ หรืà¸à¹„ม่สามารถเขียนหมายเหตุประà¸à¸à¸š."
+error_issue_not_found_in_project: 'ไม่พบปัà¸à¸«à¸²à¸™à¸µà¹‰ หรืà¸à¸›à¸±à¸à¸«à¸²à¹„ม่ได้à¸à¸¢à¸¹à¹ˆà¹ƒà¸™à¹‚ครงà¸à¸²à¸£à¸™à¸µà¹‰'
+
+mail_subject_lost_password: รหัสผ่าน %s ขà¸à¸‡à¸„ุณ
+mail_body_lost_password: 'คลิ๊à¸à¸—ี่ลิงค์ต่à¸à¹„ปนี้เพื่à¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™:'
+mail_subject_register: เปิดบัà¸à¸Šà¸µ %s ขà¸à¸‡à¸„ุณ
+mail_body_register: 'คลิ๊à¸à¸—ี่ลิงค์ต่à¸à¹„ปนี้เพื่à¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™:'
+mail_body_account_information_external: คุณสามารถใช้บัà¸à¸Šà¸µ "%s" เพื่à¸à¹€à¸‚้าสู่ระบบ.
+mail_body_account_information: ข้à¸à¸¡à¸¹à¸¥à¸šà¸±à¸à¸Šà¸µà¸‚à¸à¸‡à¸„ุณ
+mail_subject_account_activation_request: à¸à¸£à¸¸à¸“าเปิดบัà¸à¸Šà¸µ %s
+mail_body_account_activation_request: 'ผู้ใช้ใหม่ (%s) ได้ลงทะเบียน. บัà¸à¸Šà¸µà¸‚à¸à¸‡à¹€à¸‚าà¸à¸³à¸¥à¸±à¸‡à¸£à¸à¸à¸™à¸¸à¸¡à¸±à¸•ิ:'
+
+gui_validation_error: 1 ข้à¸à¸œà¸´à¸”พลาด
+gui_validation_error_plural: %d ข้à¸à¸œà¸´à¸”พลาด
+
+field_name: ชื่à¸
+field_description: รายละเà¸à¸µà¸¢à¸”
+field_summary: สรุปย่à¸
+field_is_required: ต้à¸à¸‡à¹ƒà¸ªà¹ˆ
+field_firstname: ชื่à¸
+field_lastname: นามสà¸à¸¸à¸¥
+field_mail: à¸à¸µà¹€à¸¡à¸¥à¹Œ
+field_filename: à¹à¸Ÿà¹‰à¸¡
+field_filesize: ขนาด
+field_downloads: ดาวน์โหลด
+field_author: ผู้à¹à¸•่ง
+field_created_on: สร้าง
+field_updated_on: ปรับปรุง
+field_field_format: รูปà¹à¸šà¸š
+field_is_for_all: สำหรับทุà¸à¹‚ครงà¸à¸²à¸£
+field_possible_values: ค่าที่เป็นไปได้
+field_regexp: Regular expression
+field_min_length: สั้นสุด
+field_max_length: ยาวสุด
+field_value: ค่า
+field_category: ประเภท
+field_title: ชื่à¸à¹€à¸£à¸·à¹ˆà¸à¸‡
+field_project: โครงà¸à¸²à¸£
+field_issue: ปัà¸à¸«à¸²
+field_status: สถานะ
+field_notes: บันทึà¸
+field_is_closed: ปัà¸à¸«à¸²à¸ˆà¸š
+field_is_default: ค่าเริ่มต้น
+field_tracker: à¸à¸²à¸£à¸•ิดตาม
+field_subject: เรื่à¸à¸‡
+field_due_date: วันครบà¸à¸³à¸«à¸™à¸”
+field_assigned_to: มà¸à¸šà¸«à¸¡à¸²à¸¢à¹ƒà¸«à¹‰
+field_priority: ความสำคัà¸
+field_fixed_version: รุ่น
+field_user: ผู้ใช้
+field_role: บทบาท
+field_homepage: หน้าà¹à¸£à¸
+field_is_public: สาธารณะ
+field_parent: โครงà¸à¸²à¸£à¸¢à¹ˆà¸à¸¢à¸‚à¸à¸‡
+field_is_in_chlog: ปัà¸à¸«à¸²à¹à¸ªà¸”งใน รายà¸à¸²à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡
+field_is_in_roadmap: ปัà¸à¸«à¸²à¹à¸ªà¸”งใน à¹à¸œà¸™à¸‡à¸²à¸™
+field_login: ชื่à¸à¸—ี่ใช้เข้าระบบ
+field_mail_notification: à¸à¸²à¸£à¹à¸ˆà¹‰à¸‡à¹€à¸•ืà¸à¸™à¸—างà¸à¸µà¹€à¸¡à¸¥à¹Œ
+field_admin: ผู้บริหารจัดà¸à¸²à¸£
+field_last_login_on: เข้าระบบครั้งสุดท้าย
+field_language: ภาษา
+field_effective_date: วันที่
+field_password: รหัสผ่าน
+field_new_password: รหัสผ่านใหม่
+field_password_confirmation: ยืนยันรหัสผ่าน
+field_version: รุ่น
+field_type: ชนิด
+field_host: โฮสต์
+field_port: พà¸à¸£à¹Œà¸•
+field_account: บัà¸à¸Šà¸µ
+field_base_dn: Base DN
+field_attr_login: เข้าระบบ attribute
+field_attr_firstname: ชื่ภattribute
+field_attr_lastname: นามสà¸à¸¸à¸¥ attribute
+field_attr_mail: à¸à¸µà¹€à¸¡à¸¥à¹Œ attribute
+field_onthefly: สร้างผู้ใช้ทันที
+field_start_date: เริ่ม
+field_done_ratio: %% สำเร็จ
+field_auth_source: วิธีà¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸•ัวตน
+field_hide_mail: ซ่à¸à¸™à¸à¸µà¹€à¸¡à¸¥à¹Œà¸‚à¸à¸‡à¸‰à¸±à¸™
+field_comments: ความเห็น
+field_url: URL
+field_start_page: หน้าเริ่มต้น
+field_subproject: โครงà¸à¸²à¸£à¸¢à¹ˆà¸à¸¢
+field_hours: ชั่วโมง
+field_activity: à¸à¸´à¸ˆà¸à¸£à¸£à¸¡
+field_spent_on: วันที่
+field_identifier: ชื่à¸à¹€à¸‰à¸žà¸²à¸°
+field_is_filter: ใช้เป็นตัวà¸à¸£à¸à¸‡
+field_issue_to_id: ปัà¸à¸«à¸²à¸—ี่เà¸à¸µà¹ˆà¸¢à¸§à¸‚้à¸à¸‡
+field_delay: เลื่à¸à¸™
+field_assignable: ปัà¸à¸«à¸²à¸ªà¸²à¸¡à¸²à¸£à¸–มà¸à¸šà¸«à¸¡à¸²à¸¢à¹ƒà¸«à¹‰à¸„นที่ทำบทบาทนี้
+field_redirect_existing_links: ย้ายจุดเชื่à¸à¸¡à¹‚ยงนี้
+field_estimated_hours: เวลาที่ใช้โดยประมาณ
+field_column_names: สดมภ์
+field_time_zone: ย่านเวลา
+field_searchable: ค้นหาได้
+field_default_value: ค่าเริ่มต้น
+field_comments_sorting: à¹à¸ªà¸”งความเห็น
+
+setting_app_title: ชื่à¸à¹‚ปรà¹à¸à¸£à¸¡
+setting_app_subtitle: ชื่à¸à¹‚ปรà¹à¸à¸£à¸¡à¸£à¸à¸‡
+setting_welcome_text: ข้à¸à¸„วามต้à¸à¸™à¸£à¸±à¸š
+setting_default_language: ภาษาเริ่มต้น
+setting_login_required: ต้à¸à¸‡à¸›à¹‰à¸à¸™à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰-รหัสผ่าน
+setting_self_registration: ลงทะเบียนด้วยตนเà¸à¸‡
+setting_attachment_max_size: ขนาดà¹à¸Ÿà¹‰à¸¡à¹à¸™à¸šà¸ªà¸¹à¸‡à¸ªà¸¸à¸”
+setting_issues_export_limit: à¸à¸²à¸£à¸ªà¹ˆà¸‡à¸à¸à¸à¸›à¸±à¸à¸«à¸²à¸ªà¸¹à¸‡à¸ªà¸¸à¸”
+setting_mail_from: à¸à¸µà¹€à¸¡à¸¥à¹Œà¸—ี่ใช้ส่ง
+setting_bcc_recipients: ไม่ระบุชื่à¸à¸œà¸¹à¹‰à¸£à¸±à¸š (bcc)
+setting_host_name: ชื่à¸à¹‚ฮสต์
+setting_text_formatting: à¸à¸²à¸£à¸ˆà¸±à¸”รูปà¹à¸šà¸šà¸‚้à¸à¸„วาม
+setting_wiki_compression: บีบà¸à¸±à¸”ประวัติ Wiki
+setting_feeds_limit: จำนวน Feed
+setting_default_projects_public: โครงà¸à¸²à¸£à¹ƒà¸«à¸¡à¹ˆà¸¡à¸µà¸„่าเริ่มต้นเป็น สาธารณะ
+setting_autofetch_changesets: ดึง commits à¸à¸±à¸•โนมัติ
+setting_sys_api_enabled: เปิดใช้ WS สำหรับà¸à¸²à¸£à¸ˆà¸±à¸”à¸à¸²à¸£à¸—ี่เà¸à¹‡à¸šà¸•้นฉบับ
+setting_commit_ref_keywords: คำสำคัภReferencing
+setting_commit_fix_keywords: คำสำคัภFixing
+setting_autologin: เข้าระบบà¸à¸±à¸•โนมัติ
+setting_date_format: รูปà¹à¸šà¸šà¸§à¸±à¸™à¸—ี่
+setting_time_format: รูปà¹à¸šà¸šà¹€à¸§à¸¥à¸²
+setting_cross_project_issue_relations: à¸à¸™à¸¸à¸à¸²à¸•ให้ระบุปัà¸à¸«à¸²à¸‚้ามโครงà¸à¸²à¸£
+setting_issue_list_default_columns: สดมภ์เริ่มต้นà¹à¸ªà¸”งในรายà¸à¸²à¸£à¸›à¸±à¸à¸«à¸²
+setting_repositories_encodings: à¸à¸²à¸£à¹€à¸‚้ารหัสที่เà¸à¹‡à¸šà¸•้นฉบับ
+setting_emails_footer: คำลงท้ายà¸à¸µà¹€à¸¡à¸¥à¹Œ
+setting_protocol: Protocol
+setting_per_page_options: ตัวเลืà¸à¸à¸ˆà¸³à¸™à¸§à¸™à¸•่à¸à¸«à¸™à¹‰à¸²
+setting_user_format: รูปà¹à¸šà¸šà¸à¸²à¸£à¹à¸ªà¸”งชื่à¸à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰
+setting_activity_days_default: จำนวนวันที่à¹à¸ªà¸”งในà¸à¸´à¸ˆà¸à¸£à¸£à¸¡à¸‚à¸à¸‡à¹‚ครงà¸à¸²à¸£
+setting_display_subprojects_issues: à¹à¸ªà¸”งปัà¸à¸«à¸²à¸‚à¸à¸‡à¹‚ครงà¸à¸²à¸£à¸¢à¹ˆà¸à¸¢à¹ƒà¸™à¹‚ครงà¸à¸²à¸£à¸«à¸¥à¸±à¸
+
+project_module_issue_tracking: à¸à¸²à¸£à¸•ิดตามปัà¸à¸«à¸²
+project_module_time_tracking: à¸à¸²à¸£à¹ƒà¸Šà¹‰à¹€à¸§à¸¥à¸²
+project_module_news: ข่าว
+project_module_documents: เà¸à¸à¸ªà¸²à¸£
+project_module_files: à¹à¸Ÿà¹‰à¸¡
+project_module_wiki: Wiki
+project_module_repository: ที่เà¸à¹‡à¸šà¸•้นฉบับ
+project_module_boards: à¸à¸£à¸°à¸”านข้à¸à¸„วาม
+
+label_user: ผู้ใช้
+label_user_plural: ผู้ใช้
+label_user_new: ผู้ใช้ใหม่
+label_project: โครงà¸à¸²à¸£
+label_project_new: โครงà¸à¸²à¸£à¹ƒà¸«à¸¡à¹ˆ
+label_project_plural: โครงà¸à¸²à¸£
+label_project_all: โครงà¸à¸²à¸£à¸—ั้งหมด
+label_project_latest: โครงà¸à¸²à¸£à¸¥à¹ˆà¸²à¸ªà¸¸à¸”
+label_issue: ปัà¸à¸«à¸²
+label_issue_new: ปัà¸à¸«à¸²à¹ƒà¸«à¸¡à¹ˆ
+label_issue_plural: ปัà¸à¸«à¸²
+label_issue_view_all: ดูปัà¸à¸«à¸²à¸—ั้งหมด
+label_issues_by: ปัà¸à¸«à¸²à¹‚ดย %s
+label_issue_added: ปัà¸à¸«à¸²à¸–ูà¸à¹€à¸žà¸´à¹ˆà¸¡
+label_issue_updated: ปัà¸à¸«à¸²à¸–ูà¸à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡
+label_document: เà¸à¸à¸ªà¸²à¸£
+label_document_new: เà¸à¸à¸ªà¸²à¸£à¹ƒà¸«à¸¡à¹ˆ
+label_document_plural: เà¸à¸à¸ªà¸²à¸£
+label_document_added: เà¸à¸à¸ªà¸²à¸£à¸–ูà¸à¹€à¸žà¸´à¹ˆà¸¡
+label_role: บทบาท
+label_role_plural: บทบาท
+label_role_new: บทบาทใหม่
+label_role_and_permissions: บทบาทà¹à¸¥à¸°à¸ªà¸´à¸—ธิ
+label_member: สมาชิà¸
+label_member_new: สมาชิà¸à¹ƒà¸«à¸¡à¹ˆ
+label_member_plural: สมาชิà¸
+label_tracker: à¸à¸²à¸£à¸•ิดตาม
+label_tracker_plural: à¸à¸²à¸£à¸•ิดตาม
+label_tracker_new: à¸à¸²à¸£à¸•ิดตามใหม่
+label_workflow: ลำดับงาน
+label_issue_status: สถานะขà¸à¸‡à¸›à¸±à¸à¸«à¸²
+label_issue_status_plural: สถานะขà¸à¸‡à¸›à¸±à¸à¸«à¸²
+label_issue_status_new: สถานะใหม
+label_issue_category: ประเภทขà¸à¸‡à¸›à¸±à¸à¸«à¸²
+label_issue_category_plural: ประเภทขà¸à¸‡à¸›à¸±à¸à¸«à¸²
+label_issue_category_new: ประเภทใหม่
+label_custom_field: เขตข้à¸à¸¡à¸¹à¸¥à¹à¸šà¸šà¸£à¸°à¸šà¸¸à¹€à¸à¸‡
+label_custom_field_plural: เขตข้à¸à¸¡à¸¹à¸¥à¹à¸šà¸šà¸£à¸°à¸šà¸¸à¹€à¸à¸‡
+label_custom_field_new: สร้างเขตข้à¸à¸¡à¸¹à¸¥à¹à¸šà¸šà¸£à¸°à¸šà¸¸à¹€à¸à¸‡
+label_enumerations: รายà¸à¸²à¸£
+label_enumeration_new: สร้างใหม่
+label_information: ข้à¸à¸¡à¸¹à¸¥
+label_information_plural: ข้à¸à¸¡à¸¹à¸¥
+label_please_login: à¸à¸£à¸¸à¸“าเข้าระบบà¸à¹ˆà¸à¸™
+label_register: ลงทะเบียน
+label_password_lost: ลืมรหัสผ่าน
+label_home: หน้าà¹à¸£à¸
+label_my_page: หน้าขà¸à¸‡à¸‰à¸±à¸™
+label_my_account: บัà¸à¸Šà¸µà¸‚à¸à¸‡à¸‰à¸±à¸™
+label_my_projects: โครงà¸à¸²à¸£à¸‚à¸à¸‡à¸‰à¸±à¸™
+label_administration: บริหารจัดà¸à¸²à¸£
+label_login: เข้าระบบ
+label_logout: à¸à¸à¸à¸£à¸°à¸šà¸š
+label_help: ช่วยเหลืà¸
+label_reported_issues: ปัà¸à¸«à¸²à¸—ี่à¹à¸ˆà¹‰à¸‡à¹„ว้
+label_assigned_to_me_issues: ปัà¸à¸«à¸²à¸—ี่มà¸à¸šà¸«à¸¡à¸²à¸¢à¹ƒà¸«à¹‰à¸‰à¸±à¸™
+label_last_login: ติดต่à¸à¸„รั้งสุดท้าย
+label_last_updates: ปรับปรุงครั้งสุดท้าย
+label_last_updates_plural: %d ปรับปรุงครั้งสุดท้าย
+label_registered_on: ลงทะเบียนเมื่à¸
+label_activity: à¸à¸´à¸ˆà¸à¸£à¸£à¸¡
+label_activity_plural: à¸à¸´à¸ˆà¸à¸£à¸£à¸¡
+label_activity_latest: à¸à¸´à¸ˆà¸à¸£à¸£à¸¡à¸¥à¹ˆà¸²à¸ªà¸¸à¸”
+label_overall_activity: à¸à¸´à¸ˆà¸à¸£à¸£à¸¡à¹‚ดยรวม
+label_new: ใหม่
+label_logged_as: เข้าระบบในชื่à¸
+label_environment: สภาพà¹à¸§à¸”ล้à¸à¸¡
+label_authentication: à¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸•ัวตน
+label_auth_source: วิธีà¸à¸²à¸£à¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸•ัวตน
+label_auth_source_new: สร้างวิธีà¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸•ัวตนใหม่
+label_auth_source_plural: วิธีà¸à¸²à¸£ Authentication
+label_subproject_plural: โครงà¸à¸²à¸£à¸¢à¹ˆà¸à¸¢
+label_min_max_length: สั้น-ยาว สุดที่
+label_list: รายà¸à¸²à¸£
+label_date: วันที่
+label_integer: จำนวนเต็ม
+label_float: จำนวนจริง
+label_boolean: ถูà¸à¸œà¸´à¸”
+label_string: ข้à¸à¸„วาม
+label_text: ข้à¸à¸„วามขนาดยาว
+label_attribute: คุณลัà¸à¸©à¸“ะ
+label_attribute_plural: คุณลัà¸à¸©à¸“ะ
+label_download: %d ดาวน์โหลด
+label_download_plural: %d ดาวน์โหลด
+label_no_data: จำนวนข้à¸à¸¡à¸¹à¸¥à¸—ี่à¹à¸ªà¸”ง
+label_change_status: เปลี่ยนสถานะ
+label_history: ประวัติ
+label_attachment: à¹à¸Ÿà¹‰à¸¡
+label_attachment_new: à¹à¸Ÿà¹‰à¸¡à¹ƒà¸«à¸¡à¹ˆ
+label_attachment_delete: ลบà¹à¸Ÿà¹‰à¸¡
+label_attachment_plural: à¹à¸Ÿà¹‰à¸¡
+label_file_added: à¹à¸Ÿà¹‰à¸¡à¸–ูà¸à¹€à¸žà¸´à¹ˆà¸¡
+label_report: รายงาน
+label_report_plural: รายงาน
+label_news: ข่าว
+label_news_new: เพิ่มข่าว
+label_news_plural: ข่าว
+label_news_latest: ข่าวล่าสุด
+label_news_view_all: ดูข่าวทั้งหมด
+label_news_added: ข่าวถูà¸à¹€à¸žà¸´à¹ˆà¸¡
+label_change_log: บันทึà¸à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡
+label_settings: ปรับà¹à¸•่ง
+label_overview: ภาพรวม
+label_version: รุ่น
+label_version_new: รุ่นใหม่
+label_version_plural: รุ่น
+label_confirmation: ยืนยัน
+label_export_to: 'รูปà¹à¸šà¸šà¸à¸·à¹ˆà¸™à¹† :'
+label_read: à¸à¹ˆà¸²à¸™...
+label_public_projects: โครงà¸à¸²à¸£à¸ªà¸²à¸˜à¸²à¸£à¸“ะ
+label_open_issues: เปิด
+label_open_issues_plural: เปิด
+label_closed_issues: ปิด
+label_closed_issues_plural: ปิด
+label_total: จำนวนรวม
+label_permissions: สิทธิ
+label_current_status: สถานะปัจจุบัน
+label_new_statuses_allowed: à¸à¸™à¸¸à¸à¸²à¸•ให้มีสถานะใหม่
+label_all: ทั้งหมด
+label_none: ไม่มี
+label_nobody: ไม่มีใคร
+label_next: ต่à¸à¹„ป
+label_previous: à¸à¹ˆà¸à¸™à¸«à¸™à¹‰à¸²
+label_used_by: ถูà¸à¹ƒà¸Šà¹‰à¹‚ดย
+label_details: รายละเà¸à¸µà¸¢à¸”
+label_add_note: เพิ่มบันทึà¸
+label_per_page: ต่à¸à¸«à¸™à¹‰à¸²
+label_calendar: ปà¸à¸´à¸—ิน
+label_months_from: เดืà¸à¸™à¸ˆà¸²à¸
+label_gantt: Gantt
+label_internal: ภายใน
+label_last_changes: last %d เปลี่ยนà¹à¸›à¸¥à¸‡
+label_change_view_all: ดูà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸—ั้งหมด
+label_personalize_page: ปรับà¹à¸•่งหน้านี้
+label_comment: ความเห็น
+label_comment_plural: ความเห็น
+label_comment_add: เพิ่มความเห็น
+label_comment_added: ความเห็นถูà¸à¹€à¸žà¸´à¹ˆà¸¡
+label_comment_delete: ลบความเห็น
+label_query: à¹à¸šà¸šà¸ªà¸à¸šà¸–ามà¹à¸šà¸šà¸à¸³à¸«à¸™à¸”เà¸à¸‡
+label_query_plural: à¹à¸šà¸šà¸ªà¸à¸šà¸–ามà¹à¸šà¸šà¸à¸³à¸«à¸™à¸”เà¸à¸‡
+label_query_new: à¹à¸šà¸šà¸ªà¸à¸šà¸–ามใหม่
+label_filter_add: เพิ่มตัวà¸à¸£à¸à¸‡
+label_filter_plural: ตัวà¸à¸£à¸à¸‡
+label_equals: คืà¸
+label_not_equals: ไม่ใช่
+label_in_less_than: น้à¸à¸¢à¸à¸§à¹ˆà¸²
+label_in_more_than: มาà¸à¸à¸§à¹ˆà¸²
+label_in: ในช่วง
+label_today: วันนี้
+label_all_time: ตลà¸à¸”เวลา
+label_yesterday: เมื่à¸à¸§à¸²à¸™
+label_this_week: à¸à¸²à¸—ิตย์นี้
+label_last_week: à¸à¸²à¸—ิตย์ที่à¹à¸¥à¹‰à¸§
+label_last_n_days: %d วันย้à¸à¸™à¸«à¸¥à¸±à¸‡
+label_this_month: เดืà¸à¸™à¸™à¸µà¹‰
+label_last_month: เดืà¸à¸™à¸—ี่à¹à¸¥à¹‰à¸§
+label_this_year: ปีนี้
+label_date_range: ช่วงวันที่
+label_less_than_ago: น้à¸à¸¢à¸à¸§à¹ˆà¸²à¸«à¸™à¸¶à¹ˆà¸‡à¸§à¸±à¸™
+label_more_than_ago: มาà¸à¸à¸§à¹ˆà¸²à¸«à¸™à¸¶à¹ˆà¸‡à¸§à¸±à¸™
+label_ago: วันผ่านมาà¹à¸¥à¹‰à¸§
+label_contains: มี...
+label_not_contains: ไม่มี...
+label_day_plural: วัน
+label_repository: ที่เà¸à¹‡à¸šà¸•้นฉบับ
+label_repository_plural: ที่เà¸à¹‡à¸šà¸•้นฉบับ
+label_browse: เปิดหา
+label_modification: %d เปลี่ยนà¹à¸›à¸¥à¸‡
+label_modification_plural: %d เปลี่ยนà¹à¸›à¸¥à¸‡
+label_revision: à¸à¸²à¸£à¹à¸à¹‰à¹„ข
+label_revision_plural: à¸à¸²à¸£à¹à¸à¹‰à¹„ข
+label_associated_revisions: à¸à¸²à¸£à¹à¸à¹‰à¹„ขที่เà¸à¸µà¹ˆà¸¢à¸§à¸‚้à¸à¸‡
+label_added: ถูà¸à¹€à¸žà¸´à¹ˆà¸¡
+label_modified: ถูà¸à¹à¸à¹‰à¹„ข
+label_deleted: ถูà¸à¸¥à¸š
+label_latest_revision: รุ่นà¸à¸²à¸£à¹à¸à¹‰à¹„ขล่าสุด
+label_latest_revision_plural: รุ่นà¸à¸²à¸£à¹à¸à¹‰à¹„ขล่าสุด
+label_view_revisions: ดูà¸à¸²à¸£à¹à¸à¹‰à¹„ข
+label_max_size: ขนาดใหà¸à¹ˆà¸ªà¸¸à¸”
+label_on: 'ใน'
+label_sort_highest: ย้ายไปบนสุด
+label_sort_higher: ย้ายขึ้น
+label_sort_lower: ย้ายลง
+label_sort_lowest: ย้ายไปล่างสุด
+label_roadmap: à¹à¸œà¸™à¸‡à¸²à¸™
+label_roadmap_due_in: ถึงà¸à¸³à¸«à¸™à¸”ใน
+label_roadmap_overdue: %s ช้าà¸à¸§à¹ˆà¸²à¸à¸³à¸«à¸™à¸”
+label_roadmap_no_issues: ไม่มีปัà¸à¸«à¸²à¸ªà¸³à¸«à¸£à¸±à¸šà¸£à¸¸à¹ˆà¸™à¸™à¸µà¹‰
+label_search: ค้นหา
+label_result_plural: ผลà¸à¸²à¸£à¸„้นหา
+label_all_words: ทุà¸à¸„ำ
+label_wiki: Wiki
+label_wiki_edit: à¹à¸à¹‰à¹„ข Wiki
+label_wiki_edit_plural: à¹à¸à¹‰à¹„ข Wiki
+label_wiki_page: หน้า Wiki
+label_wiki_page_plural: หน้า Wiki
+label_index_by_title: เรียงตามชื่à¸à¹€à¸£à¸·à¹ˆà¸à¸‡
+label_index_by_date: เรียงตามวัน
+label_current_version: รุ่นปัจจุบัน
+label_preview: ตัวà¸à¸¢à¹ˆà¸²à¸‡à¸à¹ˆà¸à¸™à¸ˆà¸±à¸”เà¸à¹‡à¸š
+label_feed_plural: Feeds
+label_changes_details: รายละเà¸à¸µà¸¢à¸”à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸—ั้งหมด
+label_issue_tracking: ติดตามปัà¸à¸«à¸²
+label_spent_time: เวลาที่ใช้
+label_f_hour: %.2f ชั่วโมง
+label_f_hour_plural: %.2f ชั่วโมง
+label_time_tracking: ติดตามà¸à¸²à¸£à¹ƒà¸Šà¹‰à¹€à¸§à¸¥à¸²
+label_change_plural: เปลี่ยนà¹à¸›à¸¥à¸‡
+label_statistics: สถิติ
+label_commits_per_month: Commits ต่à¸à¹€à¸”ืà¸à¸™
+label_commits_per_author: Commits ต่à¸à¸œà¸¹à¹‰à¹à¸•่ง
+label_view_diff: ดูความà¹à¸•à¸à¸•่าง
+label_diff_inline: inline
+label_diff_side_by_side: side by side
+label_options: ตัวเลืà¸à¸
+label_copy_workflow_from: คัดลà¸à¸à¸¥à¸³à¸”ับงานจาà¸
+label_permissions_report: รายงานสิทธิ
+label_watched_issues: เà¸à¹‰à¸²à¸”ูปัà¸à¸«à¸²
+label_related_issues: ปัà¸à¸«à¸²à¸—ี่เà¸à¸µà¹ˆà¸¢à¸§à¸‚้à¸à¸‡
+label_applied_status: จัดเà¸à¹‡à¸šà¸ªà¸–านะ
+label_loading: à¸à¸³à¸¥à¸±à¸‡à¹‚หลด...
+label_relation_new: ความสัมพันธ์ใหม่
+label_relation_delete: ลบความสัมพันธ์
+label_relates_to: สัมพันธ์à¸à¸±à¸š
+label_duplicates: ซ้ำ
+label_blocks: à¸à¸µà¸”à¸à¸±à¸™
+label_blocked_by: à¸à¸µà¸”à¸à¸±à¸™à¹‚ดย
+label_precedes: นำหน้า
+label_follows: ตามหลัง
+label_end_to_start: จบ-เริ่ม
+label_end_to_end: จบ-จบ
+label_start_to_start: เริ่ม-เริ่ม
+label_start_to_end: เริ่ม-จบ
+label_stay_logged_in: à¸à¸¢à¸¹à¹ˆà¹ƒà¸™à¸£à¸°à¸šà¸šà¸•่à¸
+label_disabled: ไม่ใช้งาน
+label_show_completed_versions: à¹à¸ªà¸”งรุ่นที่สมบูรณ์
+label_me: ฉัน
+label_board: สภาà¸à¸²à¹à¸Ÿ
+label_board_new: สร้างสภาà¸à¸²à¹à¸Ÿ
+label_board_plural: สภาà¸à¸²à¹à¸Ÿ
+label_topic_plural: หัวข้à¸
+label_message_plural: ข้à¸à¸„วาม
+label_message_last: ข้à¸à¸„วามล่าสุด
+label_message_new: เขียนข้à¸à¸„วามใหม่
+label_message_posted: ข้à¸à¸„วามถูà¸à¹€à¸žà¸´à¹ˆà¸¡à¹à¸¥à¹‰à¸§
+label_reply_plural: ตà¸à¸šà¸à¸¥à¸±à¸š
+label_send_information: ส่งรายละเà¸à¸µà¸¢à¸”ขà¸à¸‡à¸šà¸±à¸à¸Šà¸µà¹ƒà¸«à¹‰à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰
+label_year: ปี
+label_month: เดืà¸à¸™
+label_week: สัปดาห์
+label_date_from: จาà¸
+label_date_to: ถึง
+label_language_based: ขึ้นà¸à¸¢à¸¹à¹ˆà¸à¸±à¸šà¸ าษาขà¸à¸‡à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰
+label_sort_by: เรียงโดย %s
+label_send_test_email: ส่งจดหมายทดสà¸à¸š
+label_feeds_access_key_created_on: RSS access key สร้างเมื่ภ%s ที่ผ่านมา
+label_module_plural: ส่วนประà¸à¸à¸š
+label_added_time_by: เพิ่มโดย %s %s ที่ผ่านมา
+label_updated_time: ปรับปรุง %s ที่ผ่านมา
+label_jump_to_a_project: ไปที่โครงà¸à¸²à¸£...
+label_file_plural: à¹à¸Ÿà¹‰à¸¡
+label_changeset_plural: à¸à¸¥à¸¸à¹ˆà¸¡à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡
+label_default_columns: สดมภ์เริ่มต้น
+label_no_change_option: (ไม่เปลี่ยนà¹à¸›à¸¥à¸‡)
+label_bulk_edit_selected_issues: à¹à¸à¹‰à¹„ขปัà¸à¸«à¸²à¸—ี่เลืà¸à¸à¸—ั้งหมด
+label_theme: ชุดรูปà¹à¸šà¸š
+label_default: ค่าเริ่มต้น
+label_search_titles_only: ค้นหาจาà¸à¸Šà¸·à¹ˆà¸à¹€à¸£à¸·à¹ˆà¸à¸‡à¹€à¸—่านั้น
+label_user_mail_option_all: "ทุà¸à¹† เหตุà¸à¸²à¸£à¸“์ในโครงà¸à¸²à¸£à¸‚à¸à¸‡à¸‰à¸±à¸™"
+label_user_mail_option_selected: "ทุà¸à¹† เหตุà¸à¸²à¸£à¸“์ในโครงà¸à¸²à¸£à¸—ี่เลืà¸à¸..."
+label_user_mail_option_none: "เฉพาะสิ่งที่ฉันเลืà¸à¸à¸«à¸£à¸·à¸à¸¡à¸µà¸ªà¹ˆà¸§à¸™à¹€à¸à¸µà¹ˆà¸¢à¸§à¸‚้à¸à¸‡"
+label_user_mail_no_self_notified: "ฉันไม่ต้à¸à¸‡à¸à¸²à¸£à¹„ด้รับà¸à¸²à¸£à¹à¸ˆà¹‰à¸‡à¹€à¸•ืà¸à¸™à¹ƒà¸™à¸ªà¸´à¹ˆà¸‡à¸—ี่ฉันทำเà¸à¸‡"
+label_registration_activation_by_email: เปิดบัà¸à¸Šà¸µà¸œà¹ˆà¸²à¸™à¸à¸µà¹€à¸¡à¸¥à¹Œ
+label_registration_manual_activation: à¸à¸™à¸¸à¸¡à¸±à¸•ิโดยผู้บริหารจัดà¸à¸²à¸£
+label_registration_automatic_activation: เปิดบัà¸à¸Šà¸µà¸à¸±à¸•โนมัติ
+label_display_per_page: 'ต่à¸à¸«à¸™à¹‰à¸²: %s'
+label_age: à¸à¸²à¸¢à¸¸
+label_change_properties: เปลี่ยนคุณสมบัติ
+label_general: ทั่วๆ ไป
+label_more: à¸à¸·à¹ˆà¸™ ๆ
+label_scm: ตัวจัดà¸à¸²à¸£à¸•้นฉบับ
+label_plugins: ส่วนเสริม
+label_ldap_authentication: à¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸•ัวตนโดยใช้ LDAP
+label_downloads_abbr: D/L
+label_optional_description: รายละเà¸à¸µà¸¢à¸”เพิ่มเติม
+label_add_another_file: เพิ่มà¹à¸Ÿà¹‰à¸¡à¸à¸·à¹ˆà¸™à¹†
+label_preferences: ค่าที่ชà¸à¸šà¹ƒà¸ˆ
+label_chronological_order: เรียงจาà¸à¹€à¸à¹ˆà¸²à¹„ปใหม่
+label_reverse_chronological_order: เรียงจาà¸à¹ƒà¸«à¸¡à¹ˆà¹„ปเà¸à¹ˆà¸²
+label_planning: à¸à¸²à¸£à¸§à¸²à¸‡à¹à¸œà¸™
+
+button_login: เข้าระบบ
+button_submit: จัดส่งข้à¸à¸¡à¸¹à¸¥
+button_save: จัดเà¸à¹‡à¸š
+button_check_all: เลืà¸à¸à¸—ั้งหมด
+button_uncheck_all: ไม่เลืà¸à¸à¸—ั้งหมด
+button_delete: ลบ
+button_create: สร้าง
+button_test: ทดสà¸à¸š
+button_edit: à¹à¸à¹‰à¹„ข
+button_add: เพิ่ม
+button_change: เปลี่ยนà¹à¸›à¸¥à¸‡
+button_apply: ประยุà¸à¸•์ใช้
+button_clear: ล้างข้à¸à¸„วาม
+button_lock: ล็à¸à¸„
+button_unlock: ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸¥à¹‡à¸à¸„
+button_download: ดาวน์โหลด
+button_list: รายà¸à¸²à¸£
+button_view: มุมมà¸à¸‡
+button_move: ย้าย
+button_back: à¸à¸¥à¸±à¸š
+button_cancel: ยà¸à¹€à¸¥à¸´à¸
+button_activate: เปิดใช้
+button_sort: จัดเรียง
+button_log_time: บันทึà¸à¹€à¸§à¸¥à¸²
+button_rollback: ถà¸à¸¢à¸à¸¥à¸±à¸šà¸¡à¸²à¸—ี่รุ่นนี้
+button_watch: เà¸à¹‰à¸²à¸”ู
+button_unwatch: เลิà¸à¹€à¸à¹‰à¸²à¸”ู
+button_reply: ตà¸à¸šà¸à¸¥à¸±à¸š
+button_archive: เà¸à¹‡à¸šà¹€à¸‚้าโà¸à¸”ัง
+button_unarchive: เà¸à¸²à¸à¸à¸à¸ˆà¸²à¸à¹‚à¸à¸”ัง
+button_reset: เริ่มใหมท
+button_rename: เปลี่ยนชื่à¸
+button_change_password: เปลี่ยนรหัสผ่าน
+button_copy: คัดลà¸à¸
+button_annotate: หมายเหตุประà¸à¸à¸š
+button_update: ปรับปรุง
+button_configure: ปรับà¹à¸•่ง
+
+status_active: เปิดใช้งานà¹à¸¥à¹‰à¸§
+status_registered: รà¸à¸à¸²à¸£à¸à¸™à¸¸à¸¡à¸±à¸•ิ
+status_locked: ล็à¸à¸„
+
+text_select_mail_notifications: เลืà¸à¸à¸à¸²à¸£à¸à¸£à¸°à¸—ำที่ต้à¸à¸‡à¸à¸²à¸£à¹ƒà¸«à¹‰à¸ªà¹ˆà¸‡à¸à¸µà¹€à¸¡à¸¥à¹Œà¹à¸ˆà¹‰à¸‡.
+text_regexp_info: ตัวà¸à¸¢à¹ˆà¸²à¸‡ ^[A-Z0-9]+$
+text_min_max_length_info: 0 หมายถึงไม่จำà¸à¸±à¸”
+text_project_destroy_confirmation: คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¹„หมว่าต้à¸à¸‡à¸à¸²à¸£à¸¥à¸šà¹‚ครงà¸à¸²à¸£à¹à¸¥à¸°à¸‚้à¸à¸¡à¸¹à¸¥à¸—ี่เà¸à¸µà¹ˆà¸¢à¸§à¸‚้่à¸à¸‡ ?
+text_subprojects_destroy_warning: 'โครงà¸à¸²à¸£à¸¢à¹ˆà¸à¸¢: %s จะถูà¸à¸¥à¸šà¸”้วย.'
+text_workflow_edit: เลืà¸à¸à¸šà¸—บาทà¹à¸¥à¸°à¸à¸²à¸£à¸•ิดตาม เพื่à¸à¹à¸à¹‰à¹„ขลำดับงาน
+text_are_you_sure: คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¹„หม ?
+text_journal_changed: เปลี่ยนà¹à¸›à¸¥à¸‡à¸ˆà¸²à¸ %s เป็น %s
+text_journal_set_to: ตั้งค่าเป็น %s
+text_journal_deleted: ถูà¸à¸¥à¸š
+text_tip_task_begin_day: งานที่เริ่มวันนี้
+text_tip_task_end_day: งานที่จบวันนี้
+text_tip_task_begin_end_day: งานที่เริ่มà¹à¸¥à¸°à¸ˆà¸šà¸§à¸±à¸™à¸™à¸µà¹‰
+text_project_identifier_info: 'ภาษาà¸à¸±à¸‡à¸à¸¤à¸©à¸•ัวเล็à¸(a-z), ตัวเลข(0-9) à¹à¸¥à¸°à¸‚ีด (-) เท่านั้น. เมื่à¸à¸ˆà¸±à¸”เà¸à¹‡à¸šà¹à¸¥à¹‰à¸§, ชื่à¸à¹€à¸‰à¸žà¸²à¸°à¹„ม่สามารถเปลี่ยนà¹à¸›à¸¥à¸‡à¹„ด้'
+text_caracters_maximum: สูงสุด %d ตัวà¸à¸±à¸à¸©à¸£.
+text_caracters_minimum: ต้à¸à¸‡à¸¢à¸²à¸§à¸à¸¢à¹ˆà¸²à¸‡à¸™à¹‰à¸à¸¢ %d ตัวà¸à¸±à¸à¸©à¸£.
+text_length_between: ความยาวระหว่าง %d ถึง %d ตัวà¸à¸±à¸à¸©à¸£.
+text_tracker_no_workflow: ไม่ได้บัà¸à¸à¸±à¸•ิลำดับงานสำหรับà¸à¸²à¸£à¸•ิดตามนี้
+text_unallowed_characters: ตัวà¸à¸±à¸à¸©à¸£à¸•้à¸à¸‡à¸«à¹‰à¸²à¸¡
+text_comma_separated: ใส่ได้หลายค่า โดยคั่นด้วยลูà¸à¸™à¹‰à¸³( ,).
+text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages
+text_issue_added: ปัà¸à¸«à¸² %s ถูà¸à¹à¸ˆà¹‰à¸‡à¹‚ดย %s.
+text_issue_updated: ปัà¸à¸«à¸² %s ถูà¸à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¹‚ดย %s.
+text_wiki_destroy_confirmation: คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸à¸§à¹ˆà¸²à¸•้à¸à¸‡à¸à¸²à¸£à¸¥à¸š wiki นี้พร้à¸à¸¡à¸—ั้งเนี้à¸à¸«à¸²?
+text_issue_category_destroy_question: บางปัà¸à¸«à¸² (%d) à¸à¸¢à¸¹à¹ˆà¹ƒà¸™à¸›à¸£à¸°à¹€à¸ ทนี้. คุณต้à¸à¸‡à¸à¸²à¸£à¸—ำà¸à¸¢à¹ˆà¸²à¸‡à¹„ร ?
+text_issue_category_destroy_assignments: ลบประเภทนี้
+text_issue_category_reassign_to: ระบุปัà¸à¸«à¸²à¹ƒà¸™à¸›à¸£à¸°à¹€à¸ ทนี้
+text_user_mail_option: "ในโครงà¸à¸²à¸£à¸—ี่ไม่ได้เลืà¸à¸, คุณจะได้รับà¸à¸²à¸£à¹à¸ˆà¹‰à¸‡à¹€à¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸šà¸ªà¸´à¹ˆà¸‡à¸—ี่คุณเà¸à¹‰à¸²à¸”ูหรืà¸à¸¡à¸µà¸ªà¹ˆà¸§à¸™à¹€à¸à¸µà¹ˆà¸¢à¸§à¸‚้à¸à¸‡ (เช่นปัà¸à¸«à¸²à¸—ี่คุณà¹à¸ˆà¹‰à¸‡à¹„ว้หรืà¸à¹„ด้รับมà¸à¸šà¸«à¸¡à¸²à¸¢)."
+text_no_configuration_data: "บทบาท, à¸à¸²à¸£à¸•ิดตาม, สถานะปัà¸à¸«à¸² à¹à¸¥à¸°à¸¥à¸³à¸”ับงานยังไม่ได้ถูà¸à¸•ั้งค่า.\nขà¸à¹à¸™à¸°à¸™à¸³à¹ƒà¸«à¹‰à¹‚หลดค่าเริ่มต้น. คุณสามารถà¹à¸à¹‰à¹„ขค่าได้หลังจาà¸à¹‚หลดà¹à¸¥à¹‰à¸§."
+text_load_default_configuration: โหลดค่าเริ่มต้น
+text_status_changed_by_changeset: ประยุà¸à¸•์ใช้ในà¸à¸¥à¸¸à¹ˆà¸¡à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡ %s.
+text_issues_destroy_confirmation: 'คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¹„หมว่าต้à¸à¸‡à¸à¸²à¸£à¸¥à¸šà¸›à¸±à¸à¸«à¸²(ทั้งหลาย)ที่เลืà¸à¸à¹„ว้?'
+text_select_project_modules: 'เลืà¸à¸à¸ªà¹ˆà¸§à¸™à¸›à¸£à¸°à¸à¸à¸šà¸—ี่ต้à¸à¸‡à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸ªà¸³à¸«à¸£à¸±à¸šà¹‚ครงà¸à¸²à¸£à¸™à¸µà¹‰:'
+text_default_administrator_account_changed: ค่าเริ่มต้นขà¸à¸‡à¸šà¸±à¸à¸Šà¸µà¸œà¸¹à¹‰à¸šà¸£à¸´à¸«à¸²à¸£à¸ˆà¸±à¸”à¸à¸²à¸£à¸–ูà¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡
+text_file_repository_writable: ที่เà¸à¹‡à¸šà¸•้นฉบับสามารถเขียนได้
+text_rmagick_available: RMagick มีให้ใช้ (เป็นตัวเลืà¸à¸)
+text_destroy_time_entries_question: %.02f ชั่วโมงที่ถูà¸à¹à¸ˆà¹‰à¸‡à¹ƒà¸™à¸›à¸±à¸à¸«à¸²à¸™à¸µà¹‰à¸ˆà¸°à¹‚ดนลบ. คุณต้à¸à¸‡à¸à¸²à¸£à¸—ำà¸à¸¢à¹ˆà¸²à¸‡à¹„ร?
+text_destroy_time_entries: ลบเวลาที่รายงานไว้
+text_assign_time_entries_to_project: ระบุเวลาที่ใช้ในโครงà¸à¸²à¸£à¸™à¸µà¹‰
+text_reassign_time_entries: 'ระบุเวลาที่ใช้ในโครงà¸à¸²à¸£à¸™à¸µà¹ˆà¸à¸µà¸à¸„รั้ง:'
+
+default_role_manager: ผู้จัดà¸à¸²à¸£
+default_role_developper: ผู้พัฒนา
+default_role_reporter: ผู้รายงาน
+default_tracker_bug: บั๊à¸
+default_tracker_feature: ลัà¸à¸©à¸“ะเด่น
+default_tracker_support: สนับสนุน
+default_issue_status_new: เà¸à¸´à¸”ขึ้น
+default_issue_status_assigned: รับมà¸à¸šà¸«à¸¡à¸²à¸¢
+default_issue_status_resolved: ดำเนินà¸à¸²à¸£
+default_issue_status_feedback: รà¸à¸„ำตà¸à¸š
+default_issue_status_closed: จบ
+default_issue_status_rejected: ยà¸à¹€à¸¥à¸´à¸
+default_doc_category_user: เà¸à¸à¸ªà¸²à¸£à¸‚à¸à¸‡à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰
+default_doc_category_tech: เà¸à¸à¸ªà¸²à¸£à¸—างเทคนิค
+default_priority_low: ต่ำ
+default_priority_normal: ปà¸à¸•ิ
+default_priority_high: สูง
+default_priority_urgent: เร่งด่วน
+default_priority_immediate: ด่วนมาà¸
+default_activity_design: à¸à¸à¸à¹à¸šà¸š
+default_activity_development: พัฒนา
+
+enumeration_issue_priorities: ความสำคัà¸à¸‚à¸à¸‡à¸›à¸±à¸à¸«à¸²
+enumeration_doc_categories: ประเภทเà¸à¸à¸ªà¸²à¸£
+enumeration_activities: à¸à¸´à¸ˆà¸à¸£à¸£à¸¡ (ใช้ในà¸à¸²à¸£à¸•ิดตามเวลา)
+label_and_its_subprojects: %s and its subprojects
+mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
+mail_subject_reminder: "%d issue(s) due in the next days"
+text_user_wrote: '%s wrote:'
+label_duplicated_by: duplicated by
+setting_enabled_scm: Enabled SCM
+text_enumeration_category_reassign_to: 'Reassign them to this value:'
+text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
+text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/uk.yml b/lang/uk.yml
new file mode 100644
index 000000000..cb4e17383
--- /dev/null
+++ b/lang/uk.yml
@@ -0,0 +1,641 @@
+_gloc_rule_default: '|n| n==1 ? "" : "_plural" '
+
+actionview_datehelper_select_day_prefix:
+actionview_datehelper_select_month_names: Січень,Лютий,Березень,Квітень,Травень,Червень,Липень,Серпень,ВереÑень,Жовтень,ЛиÑтопад,Грудень
+actionview_datehelper_select_month_names_abbr: Січ,Лют,Бер,Квіт,Трав,Чер,Лип,Серп,Вер,Жов,ЛиÑ,Груд
+actionview_datehelper_select_month_prefix:
+actionview_datehelper_select_year_prefix:
+actionview_datehelper_time_in_words_day: 1 день
+actionview_datehelper_time_in_words_day_plural: %d днів(Ñ)
+actionview_datehelper_time_in_words_hour_about: близько години
+actionview_datehelper_time_in_words_hour_about_plural: близько %d годин(и)
+actionview_datehelper_time_in_words_hour_about_single: близько години
+actionview_datehelper_time_in_words_minute: 1 хвилина
+actionview_datehelper_time_in_words_minute_half: півхвилини
+actionview_datehelper_time_in_words_minute_less_than: менше хвилини
+actionview_datehelper_time_in_words_minute_plural: %d хвилин(и)
+actionview_datehelper_time_in_words_minute_single: 1 хвилина
+actionview_datehelper_time_in_words_second_less_than: менше Ñекунди
+actionview_datehelper_time_in_words_second_less_than_plural: менше %d Ñекунд(и)
+actionview_instancetag_blank_option: Оберіть
+
+activerecord_error_inclusion: немає в ÑпиÑку
+activerecord_error_exclusion: зарезервовано
+activerecord_error_invalid: невірне
+activerecord_error_confirmation: не збігаєтьÑÑ Ð· підтвердженнÑм
+activerecord_error_accepted: необхідно прийнÑти
+activerecord_error_empty: не може бути порожнім
+activerecord_error_blank: не може бути незаповненим
+activerecord_error_too_long: дуже довге
+activerecord_error_too_short: дуже коротке
+activerecord_error_wrong_length: не відповідає довжині
+activerecord_error_taken: вже викориÑтовуєтьÑÑ
+activerecord_error_not_a_number: не Ñ” чиÑлом
+activerecord_error_not_a_date: Ñ” недійÑною датою
+activerecord_error_greater_than_start_date: повинна бути пізніша за дату початку
+activerecord_error_not_same_project: не відноÑÑтьÑÑ Ð´Ð¾ одного проекту
+activerecord_error_circular_dependency: Такий зв'Ñзок приведе до циклічної залежноÑті
+
+general_fmt_age: %d р.
+general_fmt_age_plural: %d рр.
+general_fmt_date: %%m/%%d/%%Y
+general_fmt_datetime: %%m/%%d/%%Y %%I:%%M %%p
+general_fmt_datetime_short: %%b %%d, %%I:%%M %%p
+general_fmt_time: %%I:%%M %%p
+general_text_No: 'ÐÑ–'
+general_text_Yes: 'Так'
+general_text_no: 'ÐÑ–'
+general_text_yes: 'Так'
+general_lang_name: 'Ukrainian (УкраїнÑька)'
+general_csv_separator: ','
+general_csv_decimal_separator: '.'
+general_csv_encoding: UTF-8
+general_pdf_encoding: UTF-8
+general_day_names: Понеділок,Вівторок,Середа,Четвер,П'ÑтницÑ,Субота,ÐеділÑ
+general_first_day_of_week: '1'
+
+notice_account_updated: Обліковий Ð·Ð°Ð¿Ð¸Ñ ÑƒÑпішно оновлений.
+notice_account_invalid_creditentials: Ðеправильне ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача або пароль
+notice_account_password_updated: Пароль уÑпішно оновлений.
+notice_account_wrong_password: Ðевірний пароль
+notice_account_register_done: Обліковий Ð·Ð°Ð¿Ð¸Ñ ÑƒÑпішно Ñтворений. Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ— Вашого облікового запиÑу зайдіть по поÑиланню, Ñке відіÑлане вам електронною поштою.
+notice_account_unknown_email: Ðевідомий кориÑтувач.
+notice_can_t_change_password: Ð”Ð»Ñ Ð´Ð°Ð½Ð¾Ð³Ð¾ облікового запиÑу викориÑтовуєтьÑÑ Ð´Ð¶ÐµÑ€ÐµÐ»Ð¾ зовнішньої аутентифікації. Ðеможливо змінити пароль.
+notice_account_lost_email_sent: Вам відправлений лиÑÑ‚ з інÑтрукціÑми по вибору нового паролÑ.
+notice_account_activated: Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð°ÐºÑ‚Ð¸Ð²Ð¾Ð²Ð°Ð½Ð¸Ð¹. Ви можете увійти.
+notice_successful_create: Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑƒÑпішно завершене.
+notice_successful_update: ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÑƒÑпішно завершене.
+notice_successful_delete: Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ ÑƒÑпішно завершене.
+notice_successful_connection: ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ ÑƒÑпішно вÑтановлене.
+notice_file_not_found: Сторінка, на Ñку ви намагаєтеÑÑ Ð·Ð°Ð¹Ñ‚Ð¸, не Ñ–Ñнує або видалена.
+notice_locking_conflict: Дані оновлено іншим кориÑтувачем.
+notice_scm_error: ЗапиÑу та/або Ð²Ð¸Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð½ÐµÐ¼Ð°Ñ” в репозиторії.
+notice_not_authorized: У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” прав Ð´Ð»Ñ Ð²Ñ–Ð´Ð²Ñ–Ð´Ð¸Ð½Ð¸ даної Ñторінки.
+notice_email_sent: Відправлено лиÑта %s
+notice_email_error: Під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²ÐºÐ¸ лиÑта відбулаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° (%s)
+notice_feeds_access_key_reseted: Ваш ключ доÑтупу RSS було Ñкинуто.
+notice_failed_to_save_issues: "Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ %d пункт(ів) з %d вибраних: %s."
+notice_no_issue_selected: "Ðе вибрано жодної задачі! Будь лаÑка, відзначте задачу, Ñку ви хочете відредагувати."
+notice_account_pending: "Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ñтворено Ñ– він чекає на Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратором."
+
+mail_subject_lost_password: Ваш %s пароль
+mail_body_lost_password: 'Ð”Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ паролÑ, зайдіть за наÑтупним поÑиланнÑм:'
+mail_subject_register: ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу %s
+mail_body_register: 'Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ— облікового запиÑу, зайдіть за наÑтупним поÑиланнÑм:'
+mail_body_account_information_external: Ви можете викориÑтовувати ваш "%s" обліковий Ð·Ð°Ð¿Ð¸Ñ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ.
+mail_body_account_information: Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ð¾ Вашому обліковому запиÑу
+mail_subject_account_activation_request: Запит на активацію облікового запиÑу %s
+mail_body_account_activation_request: 'Ðовий кориÑтувач (%s) зареєÑтрувавÑÑ. Його обліковий Ð·Ð°Ð¿Ð¸Ñ Ñ‡ÐµÐºÐ°Ñ” на ваше підтвердженнÑ:'
+
+gui_validation_error: 1 помилка
+gui_validation_error_plural: %d помилки(ок)
+
+field_name: Ім'Ñ
+field_description: ОпиÑ
+field_summary: Короткий опиÑ
+field_is_required: Ðеобхідно
+field_firstname: Ім'Ñ
+field_lastname: Прізвище
+field_mail: Ел. пошта
+field_filename: Файл
+field_filesize: Розмір
+field_downloads: ЗавантаженнÑ
+field_author: Ðвтор
+field_created_on: Створено
+field_updated_on: Оновлено
+field_field_format: Формат
+field_is_for_all: Ð”Ð»Ñ ÑƒÑÑ–Ñ… проектів
+field_possible_values: Можливі значеннÑ
+field_regexp: РегулÑрний вираз
+field_min_length: Мінімальна довжина
+field_max_length: МакÑимальна довжина
+field_value: ЗначеннÑ
+field_category: КатегоріÑ
+field_title: Ðазва
+field_project: Проект
+field_issue: ПитаннÑ
+field_status: СтатуÑ
+field_notes: Примітки
+field_is_closed: ÐŸÐ¸Ñ‚Ð°Ð½Ð½Ñ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¾
+field_is_default: Типове значеннÑ
+field_tracker: Координатор
+field_subject: Тема
+field_due_date: Дата виконаннÑ
+field_assigned_to: Призначена до
+field_priority: Пріоритет
+field_fixed_version: Target version
+field_user: КориÑтувач
+field_role: Роль
+field_homepage: Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка
+field_is_public: Публічний
+field_parent: Підпроект
+field_is_in_chlog: ПитаннÑ, що відображаютьÑÑ Ð² журналі змін
+field_is_in_roadmap: ПитаннÑ, що відображаютьÑÑ Ð² оперативному плані
+field_login: Вхід
+field_mail_notification: ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð·Ð° електронною поштою
+field_admin: ÐдмініÑтратор
+field_last_login_on: ОÑтаннє підключеннÑ
+field_language: Мова
+field_effective_date: Дата
+field_password: Пароль
+field_new_password: Ðовий пароль
+field_password_confirmation: ПідтвердженнÑ
+field_version: ВерÑÑ–Ñ
+field_type: Тип
+field_host: Машина
+field_port: Порт
+field_account: Обліковий запиÑ
+field_base_dn: Базове відмітне ім'Ñ
+field_attr_login: Ðтрибут РеєÑтраціÑ
+field_attr_firstname: Ðтрибут Ім'Ñ
+field_attr_lastname: Ðтрибут Прізвище
+field_attr_mail: Ðтрибут Email
+field_onthefly: Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача на льоту
+field_start_date: Початок
+field_done_ratio: %% зроблено
+field_auth_source: Режим аутентифікації
+field_hide_mail: Приховувати мій email
+field_comments: Коментар
+field_url: URL
+field_start_page: Стартова Ñторінка
+field_subproject: Підпроект
+field_hours: Годин(и/а)
+field_activity: ДіÑльніÑть
+field_spent_on: Дата
+field_identifier: Ідентифікатор
+field_is_filter: ВикориÑтовуєтьÑÑ Ñк фільтр
+field_issue_to_id: Зв'Ñзані задачі
+field_delay: ВідклаÑти
+field_assignable: Задача може бути призначена цій ролі
+field_redirect_existing_links: Перенаправити Ñ–Ñнуючі поÑиланнÑ
+field_estimated_hours: Оцінний чаÑ
+field_column_names: Колонки
+field_time_zone: ЧаÑовий поÑÑ
+field_searchable: ВживаєтьÑÑ Ñƒ пошуку
+
+setting_app_title: Ðазва додатку
+setting_app_subtitle: Підзаголовок додатку
+setting_welcome_text: ТекÑÑ‚ привітаннÑ
+setting_default_language: Стандартна мова
+setting_login_required: Ðеобхідна аутентифікаціÑ
+setting_self_registration: Можлива Ñамо-реєÑтраціÑ
+setting_attachment_max_size: МакÑимальний размір вкладеннÑ
+setting_issues_export_limit: ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ð¾ задачах, що екÑпортуютьÑÑ
+setting_mail_from: email адреÑа Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ñ– інформації
+setting_bcc_recipients: Отримувачі Ñліпої копії (bcc)
+setting_host_name: Им'Ñ Ð¼Ð°ÑˆÐ¸Ð½Ð¸
+setting_text_formatting: Ð¤Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚ÐµÐºÑту
+setting_wiki_compression: СтиÑÐ½ÐµÐ½Ð½Ñ Ñ–Ñторії Wiki
+setting_feeds_limit: ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ñту подачі
+setting_autofetch_changesets: Ðвтоматично доÑтавати доповненнÑ
+setting_sys_api_enabled: Дозволити WS Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ”Ð¼
+setting_commit_ref_keywords: Ключові Ñлова Ð´Ð»Ñ Ð¿Ð¾ÑиланнÑ
+setting_commit_fix_keywords: ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð²Ð¸Ñ… Ñлів
+setting_autologin: Ðвтоматичний вхід
+setting_date_format: Формат дати
+setting_time_format: Формат чаÑу
+setting_cross_project_issue_relations: Дозволити міжпроектні відноÑини між питаннÑми
+setting_issue_list_default_columns: Колонки, що відображаютьÑÑ Ð·Ð° умовчаннÑм в ÑпиÑку питань
+setting_repositories_encodings: ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ
+setting_emails_footer: ÐŸÑ–Ð´Ð¿Ð¸Ñ Ð´Ð¾ електронної пошти
+setting_protocol: Протокол
+
+label_user: КориÑтувач
+label_user_plural: КориÑтувачі
+label_user_new: Ðовий кориÑтувач
+label_project: Проект
+label_project_new: Ðовий проект
+label_project_plural: Проекти
+label_project_all: УÑÑ– проекти
+label_project_latest: ОÑтанні проекти
+label_issue: ПитаннÑ
+label_issue_new: Ðові питаннÑ
+label_issue_plural: ПитаннÑ
+label_issue_view_all: ПроглÑнути вÑÑ– питаннÑ
+label_issues_by: ÐŸÐ¸Ñ‚Ð°Ð½Ð½Ñ Ð·Ð° %s
+label_document: Документ
+label_document_new: Ðовий документ
+label_document_plural: Документи
+label_role: Роль
+label_role_plural: Ролі
+label_role_new: Ðова роль
+label_role_and_permissions: Ролі Ñ– права доÑтупу
+label_member: УчаÑник
+label_member_new: Ðовий учаÑник
+label_member_plural: УчаÑники
+label_tracker: Координатор
+label_tracker_plural: Координатори
+label_tracker_new: Ðовий Координатор
+label_workflow: ПоÑлідовніÑть дій
+label_issue_status: Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿Ð¸Ñ‚Ð°Ð½Ð½Ñ
+label_issue_status_plural: СтатуÑи питань
+label_issue_status_new: Ðовий ÑтатуÑ
+label_issue_category: ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ñ–Ñ Ð¿Ð¸Ñ‚Ð°Ð½Ð½Ñ
+label_issue_category_plural: Категорії питань
+label_issue_category_new: Ðова категоріÑ
+label_custom_field: Поле клієнта
+label_custom_field_plural: ÐŸÐ¾Ð»Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð°
+label_custom_field_new: Ðове поле клієнта
+label_enumerations: Довідники
+label_enumeration_new: Ðове значеннÑ
+label_information: ІнформаціÑ
+label_information_plural: ІнформаціÑ
+label_please_login: Будь лаÑка, увійдіть
+label_register: ЗареєÑтруватиÑÑ
+label_password_lost: Забули пароль
+label_home: Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка
+label_my_page: ÐœÐ¾Ñ Ñторінка
+label_my_account: Мій обліковий запиÑ
+label_my_projects: Мої проекти
+label_administration: ÐдмініÑтруваннÑ
+label_login: Увійти
+label_logout: Вийти
+label_help: Допомога
+label_reported_issues: Створені питаннÑ
+label_assigned_to_me_issues: Мої питаннÑ
+label_last_login: ОÑтаннє підключеннÑ
+label_last_updates: ОÑтаннє оновленнÑ
+label_last_updates_plural: %d оÑтанні оновленнÑ
+label_registered_on: ЗареєÑтрований(а)
+label_activity: ÐктивніÑть
+label_new: Ðовий
+label_logged_as: Увійшов Ñк
+label_environment: ОточеннÑ
+label_authentication: ÐутентифікаціÑ
+label_auth_source: Режим аутентифікації
+label_auth_source_new: Ðовий режим аутентифікації
+label_auth_source_plural: Режими аутентифікації
+label_subproject_plural: Підпроекти
+label_min_max_length: Мінімальна - макÑимальна довжина
+label_list: СпиÑок
+label_date: Дата
+label_integer: Цілий
+label_float: З плаваючою крапкою
+label_boolean: Логічний
+label_string: ТекÑÑ‚
+label_text: Довгий текÑÑ‚
+label_attribute: Ðтрибут
+label_attribute_plural: атрибути
+label_download: %d Завантажено
+label_download_plural: %d Завантажень
+label_no_data: Ðемає даних Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ
+label_change_status: Змінити ÑтатуÑ
+label_history: ІÑторіÑ
+label_attachment: Файл
+label_attachment_new: Ðовий файл
+label_attachment_delete: Видалити файл
+label_attachment_plural: Файли
+label_report: Звіт
+label_report_plural: Звіти
+label_news: Ðовини
+label_news_new: Додати новину
+label_news_plural: Ðовини
+label_news_latest: ОÑтанні новини
+label_news_view_all: ПодивитиÑÑ Ð²ÑÑ– новини
+label_change_log: Журнал змін
+label_settings: ÐалаштуваннÑ
+label_overview: ПереглÑд
+label_version: ВерÑÑ–Ñ
+label_version_new: Ðова верÑÑ–Ñ
+label_version_plural: ВерÑÑ–Ñ—
+label_confirmation: ПідтвердженнÑ
+label_export_to: ЕкÑпортувати в
+label_read: ЧитаннÑ...
+label_public_projects: Публічні проекти
+label_open_issues: відкрите
+label_open_issues_plural: відкриті
+label_closed_issues: закрите
+label_closed_issues_plural: закриті
+label_total: Ð’Ñього
+label_permissions: Права доÑтупу
+label_current_status: Поточний ÑтатуÑ
+label_new_statuses_allowed: Дозволені нові ÑтатуÑи
+label_all: УÑÑ–
+label_none: Ðікому
+label_nobody: Ðіхто
+label_next: ÐаÑтупний
+label_previous: Попередній
+label_used_by: ВикориÑтовуєтьÑÑ
+label_details: Подробиці
+label_add_note: Додати зауваженнÑ
+label_per_page: Ðа Ñторінку
+label_calendar: Календар
+label_months_from: міÑÑців(цÑ) з
+label_gantt: Діаграма Ганта
+label_internal: Внутрішній
+label_last_changes: оÑтанні %d змін
+label_change_view_all: ПроглÑнути вÑÑ– зміни
+label_personalize_page: ПерÑоналізувати цю Ñторінку
+label_comment: Коментувати
+label_comment_plural: Коментарі
+label_comment_add: Залишити коментар
+label_comment_added: Коментар додано
+label_comment_delete: Видалити коментарі
+label_query: Запит клієнта
+label_query_plural: Запити клієнтів
+label_query_new: Ðовий запит
+label_filter_add: Додати фільтр
+label_filter_plural: Фільтри
+label_equals: Ñ”
+label_not_equals: немає
+label_in_less_than: менш ніж
+label_in_more_than: більш ніж
+label_in: у
+label_today: Ñьогодні
+label_this_week: цього тижнÑ
+label_less_than_ago: менш ніж днів(Ñ) назад
+label_more_than_ago: більш ніж днів(Ñ) назад
+label_ago: днів(Ñ) назад
+label_contains: міÑтить
+label_not_contains: не міÑтить
+label_day_plural: днів(Ñ)
+label_repository: Репозиторій
+label_browse: ПроглÑнути
+label_modification: %d зміна
+label_modification_plural: %d змін
+label_revision: ВерÑÑ–Ñ
+label_revision_plural: ВерÑій
+label_added: додано
+label_modified: змінене
+label_deleted: видалено
+label_latest_revision: ОÑÑ‚Ð°Ð½Ð½Ñ Ð²ÐµÑ€ÑÑ–Ñ
+label_latest_revision_plural: ОÑтанні верÑÑ–Ñ—
+label_view_revisions: ПроглÑнути верÑÑ–Ñ—
+label_max_size: МакÑимальний розмір
+label_on: 'з'
+label_sort_highest: У початок
+label_sort_higher: Вгору
+label_sort_lower: Вниз
+label_sort_lowest: У кінець
+label_roadmap: Оперативний план
+label_roadmap_due_in: Строк
+label_roadmap_overdue: %s запізненнÑ
+label_roadmap_no_issues: Ðемає питань Ð´Ð»Ñ Ð´Ð°Ð½Ð¾Ñ— верÑÑ–Ñ—
+label_search: Пошук
+label_result_plural: Результати
+label_all_words: Ð’ÑÑ– Ñлова
+label_wiki: Wiki
+label_wiki_edit: Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Wiki
+label_wiki_edit_plural: Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Wiki
+label_wiki_page: Сторінка Wiki
+label_wiki_page_plural: Сторінки Wiki
+label_index_by_title: Ð†Ð½Ð´ÐµÐºÑ Ð·Ð° назвою
+label_index_by_date: Ð†Ð½Ð´ÐµÐºÑ Ð·Ð° датою
+label_current_version: Поточна верÑÑ–Ñ
+label_preview: Попередній переглÑд
+label_feed_plural: ПоданнÑ
+label_changes_details: Подробиці по вÑÑ–Ñ… змінах
+label_issue_tracking: ÐšÐ¾Ð¾Ñ€Ð´Ð¸Ð½Ð°Ñ†Ñ–Ñ Ð¿Ð¸Ñ‚Ð°Ð½ÑŒ
+label_spent_time: Витрачений чаÑ
+label_f_hour: %.2f година
+label_f_hour_plural: %.2f годин(и)
+label_time_tracking: Облік чаÑу
+label_change_plural: Зміни
+label_statistics: СтатиÑтика
+label_commits_per_month: Подань на міÑÑць
+label_commits_per_author: Подань на кориÑтувача
+label_view_diff: ПроглÑнути відмінноÑті
+label_diff_inline: підключений
+label_diff_side_by_side: порÑд
+label_options: Опції
+label_copy_workflow_from: Скопіювати поÑлідовніÑть дій з
+label_permissions_report: Звіт про права доÑтупу
+label_watched_issues: ПроглÑнуті питаннÑ
+label_related_issues: Зв'Ñзані питаннÑ
+label_applied_status: ЗаÑтоÑовний ÑтатуÑ
+label_loading: ЗавантаженнÑ...
+label_relation_new: Ðовий зв'Ñзок
+label_relation_delete: Видалити зв'Ñзок
+label_relates_to: пов'Ñзане з
+label_duplicates: дублює
+label_blocks: блокує
+label_blocked_by: заблоковане
+label_precedes: передує
+label_follows: наÑтупний за
+label_end_to_start: з ÐºÑ–Ð½Ñ†Ñ Ð´Ð¾ початку
+label_end_to_end: з ÐºÑ–Ð½Ñ†Ñ Ð´Ð¾ кінцÑ
+label_start_to_start: з початку до початку
+label_start_to_end: з початку до кінцÑ
+label_stay_logged_in: ЗалишатиÑÑ Ð² ÑиÑтемі
+label_disabled: відключений
+label_show_completed_versions: Показати завершені верÑÑ–Ñ—
+label_me: мене
+label_board: Форум
+label_board_new: Ðовий форум
+label_board_plural: Форуми
+label_topic_plural: Теми
+label_message_plural: ПовідомленнÑ
+label_message_last: ОÑтаннє повідомленнÑ
+label_message_new: Ðове повідомленнÑ
+label_reply_plural: Відповіді
+label_send_information: Відправити кориÑтувачеві інформацію з облікового запиÑу
+label_year: Рік
+label_month: МіÑÑць
+label_week: ÐеділÑ
+label_date_from: З
+label_date_to: Кому
+label_language_based: Ðа оÑнові мови кориÑтувача
+label_sort_by: Сортувати за %s
+label_send_test_email: ПоÑлати email Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸
+label_feeds_access_key_created_on: Ключ доÑтупу RSS Ñтворений %s назад
+label_module_plural: Модулі
+label_added_time_by: Доданий %s %s назад
+label_updated_time: Оновлений %s назад
+label_jump_to_a_project: Перейти до проекту...
+label_file_plural: Файли
+label_changeset_plural: Ðабори змін
+label_default_columns: Типові колонки
+label_no_change_option: (Ðемає змін)
+label_bulk_edit_selected_issues: Редагувати вÑÑ– вибрані питаннÑ
+label_theme: Тема
+label_default: Типовий
+label_search_titles_only: Шукати тільки в назвах
+label_user_mail_option_all: "Ð”Ð»Ñ Ð²ÑÑ–Ñ… подій у вÑÑ–Ñ… моїх проектах"
+label_user_mail_option_selected: "Ð”Ð»Ñ Ð²ÑÑ–Ñ… подій тільки у вибраному проекті..."
+label_user_mail_option_none: "Тільки Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, що Ñ Ð¿Ñ€Ð¾Ð³Ð»Ñдаю або в чому Ñ Ð±ÐµÑ€Ñƒ учаÑть"
+label_user_mail_no_self_notified: "Ðе Ñповіщати про зміни, Ñкі Ñ Ð·Ñ€Ð¾Ð±Ð¸Ð² Ñам"
+label_registration_activation_by_email: Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу електронною поштою
+label_registration_manual_activation: ручна Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу
+label_registration_automatic_activation: автоматична Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ Ð¾Ð±Ð»Ñ‹ÐºÐ¾Ð²Ð¾Ð³Ð¾
+label_my_time_report: Мій звіт витраченого чаÑу
+
+button_login: Вхід
+button_submit: Відправити
+button_save: Зберегти
+button_check_all: Відзначити вÑе
+button_uncheck_all: ОчиÑтити
+button_delete: Видалити
+button_create: Створити
+button_test: Перевірити
+button_edit: Редагувати
+button_add: Додати
+button_change: Змінити
+button_apply: ЗаÑтоÑувати
+button_clear: ОчиÑтити
+button_lock: Заблокувати
+button_unlock: Разблокувати
+button_download: Завантажити
+button_list: СпиÑок
+button_view: ПереглÑнути
+button_move: ПереміÑтити
+button_back: Ðазад
+button_cancel: Відмінити
+button_activate: Ðктивувати
+button_sort: Сортувати
+button_log_time: ЗапиÑати чаÑ
+button_rollback: Відкотити до даної верÑÑ–Ñ—
+button_watch: ДивитиÑÑ
+button_unwatch: Ðе дивитиÑÑ
+button_reply: ВідповіÑти
+button_archive: Ðрхівувати
+button_unarchive: Розархівувати
+button_reset: ПерезапуÑтити
+button_rename: Перейменувати
+button_change_password: Змінити пароль
+button_copy: Копіювати
+button_annotate: Ðнотувати
+
+status_active: Ðктивний
+status_registered: ЗареєÑтрований
+status_locked: Заблокований
+
+text_select_mail_notifications: Виберіть дії, на Ñкі відÑилатиметьÑÑ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ð° електронну пошту.
+text_regexp_info: eg. ^[A-Z0-9]+$
+text_min_max_length_info: 0 означає відÑутніÑть заборон
+text_project_destroy_confirmation: Ви наполÑгаєте на видаленні цього проекту Ñ– вÑієї інформації, що відноÑитьÑÑ Ð´Ð¾ нього?
+text_workflow_edit: Виберіть роль Ñ– координатор Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ÑлідовноÑті дій
+text_are_you_sure: Ви впевнені?
+text_journal_changed: змінивÑÑ Ð· %s на %s
+text_journal_set_to: параметр змінивÑÑ Ð½Ð° %s
+text_journal_deleted: видалено
+text_tip_task_begin_day: день початку задачі
+text_tip_task_end_day: день Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡Ñ–
+text_tip_task_begin_end_day: початок задачі Ñ– Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ днÑ
+text_project_identifier_info: 'Ð Ñдкові букви (a-z), допуÑтимі цифри Ñ– дефіÑ. Збережений ідентифікатор не може бути змінений.'
+text_caracters_maximum: %d Ñимволів(а) макÑимум.
+text_caracters_minimum: Повинно мати Ñкнайменше %d Ñимволів(а) у довжину.
+text_length_between: Довжина між %d Ñ– %d Ñимволів.
+text_tracker_no_workflow: Ð”Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ координатора поÑлідовніÑть дій не визначена
+text_unallowed_characters: Заборонені Ñимволи
+text_comma_separated: ДопуÑтимі декілька значень (розділені комою).
+text_issues_ref_in_commit_messages: ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñ‚Ð° зміна питань у повідомленнÑÑ… до подавань
+text_issue_added: ÐŸÐ¸Ñ‚Ð°Ð½Ð½Ñ %s Ñтворено.
+text_issue_updated: ÐŸÐ¸Ñ‚Ð°Ð½Ð½Ñ %s оновлено.
+text_wiki_destroy_confirmation: Ви впевнені, що хочете видалити цю wiki Ñ– веÑÑŒ зміÑÑ‚?
+text_issue_category_destroy_question: Декілька питань (%d) призначено в цю категорію. Що ви хочете зробити?
+text_issue_category_destroy_assignments: Видалити Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ñ–Ñ—
+text_issue_category_reassign_to: Перепризначити задачі до даної категорії
+text_user_mail_option: "Ð”Ð»Ñ Ð½ÐµÐ²Ð¸Ð±Ñ€Ð°Ð½Ð¸Ñ… проектів ви отримуватимете Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ про те, що проглÑдаєте або в чому берете учаÑть (наприклад, Ð¿Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¾Ð¼ Ñких ви Ñ” або Ñкі вам призначені)."
+
+default_role_manager: Менеджер
+default_role_developper: Розробник
+default_role_reporter: Репортер
+звітів default_tracker_bug: Помилка
+default_tracker_feature: ВлаÑтивіÑть
+default_tracker_support: Підтримка
+default_issue_status_new: Ðовий
+default_issue_status_assigned: Призначено
+default_issue_status_resolved: Вирішено
+default_issue_status_feedback: Зворотний зв'Ñзок
+default_issue_status_closed: Зачинено
+default_issue_status_rejected: Відмовлено
+default_doc_category_user: Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ ÐºÐ¾Ñ€Ð¸Ñтувача
+default_doc_category_tech: Технічна документаціÑ
+default_priority_low: Ðизький
+default_priority_normal: Ðормальний
+default_priority_high: ВиÑокий
+default_priority_urgent: Терміновий
+default_priority_immediate: Ðегайний
+default_activity_design: ПроектуваннÑ
+default_activity_development: Розробка
+
+enumeration_issue_priorities: Пріоритети питань
+enumeration_doc_categories: Категорії документів
+enumeration_activities: Дії (облік чаÑу)
+text_status_changed_by_changeset: Applied in changeset %s.
+label_display_per_page: 'Per page: %s'
+label_issue_added: Issue added
+label_issue_updated: Issue updated
+setting_per_page_options: Objects per page options
+notice_default_data_loaded: Default configuration successfully loaded.
+error_scm_not_found: "Entry and/or revision doesn't exist in the repository."
+label_associated_revisions: Associated revisions
+label_document_added: Document added
+label_message_posted: Message added
+text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s) ?'
+error_scm_command_failed: "An error occurred when trying to access the repository: %s"
+setting_user_format: Users display format
+label_age: Age
+label_file_added: File added
+label_more: More
+field_default_value: Default value
+default_tracker_bug: Bug
+label_scm: SCM
+label_general: General
+button_update: Update
+text_select_project_modules: 'Select modules to enable for this project:'
+label_change_properties: Change properties
+text_load_default_configuration: Load the default configuration
+text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
+label_news_added: News added
+label_repository_plural: Repositories
+error_can_t_load_default_data: "Default configuration could not be loaded: %s"
+project_module_boards: Boards
+project_module_issue_tracking: Issue tracking
+project_module_wiki: Wiki
+project_module_files: Files
+project_module_documents: Documents
+project_module_repository: Repository
+project_module_news: News
+project_module_time_tracking: Time tracking
+text_file_repository_writable: File repository writable
+text_default_administrator_account_changed: Default administrator account changed
+text_rmagick_available: RMagick available (optional)
+button_configure: Configure
+label_plugins: Plugins
+label_ldap_authentication: LDAP authentication
+label_downloads_abbr: D/L
+label_this_month: this month
+label_last_n_days: last %d days
+label_all_time: all time
+label_this_year: this year
+label_date_range: Date range
+label_last_week: last week
+label_yesterday: yesterday
+label_last_month: last month
+label_add_another_file: Add another file
+label_optional_description: Optional description
+text_destroy_time_entries_question: %.02f hours were reported on the issues you are about to delete. What do you want to do ?
+error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
+text_assign_time_entries_to_project: Assign reported hours to the project
+text_destroy_time_entries: Delete reported hours
+text_reassign_time_entries: 'Reassign reported hours to this issue:'
+setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Display comments
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
+setting_display_subprojects_issues: Display subprojects issues on main projects by default
+label_overall_activity: Overall activity
+setting_default_projects_public: New projects are public by default
+error_scm_annotate: "The entry does not exist or can not be annotated."
+label_planning: Planning
+text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
+label_and_its_subprojects: %s and its subprojects
+mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
+mail_subject_reminder: "%d issue(s) due in the next days"
+text_user_wrote: '%s wrote:'
+label_duplicated_by: duplicated by
+setting_enabled_scm: Enabled SCM
+text_enumeration_category_reassign_to: 'Reassign them to this value:'
+text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
+text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/zh-tw.yml b/lang/zh-tw.yml
new file mode 100644
index 000000000..b91bef8f9
--- /dev/null
+++ b/lang/zh-tw.yml
@@ -0,0 +1,640 @@
+_gloc_rule_default: '|n| n==1 ? "" : "_plural" '
+
+actionview_datehelper_select_day_prefix:
+actionview_datehelper_select_month_names: 一月,二月,三月,四月,五月,å…æœˆ,七月,八月,乿œˆ,åæœˆ,å一月,å二月
+actionview_datehelper_select_month_names_abbr: 一月,二月,三月,四月,五月,å…æœˆ,七月,八月,乿œˆ,åæœˆ,å一月,å二月
+actionview_datehelper_select_month_prefix:
+actionview_datehelper_select_year_prefix:
+actionview_datehelper_time_in_words_day: 1 天
+actionview_datehelper_time_in_words_day_plural: %d 天
+actionview_datehelper_time_in_words_hour_about: ç´„ 1 å°æ™‚
+actionview_datehelper_time_in_words_hour_about_plural: ç´„ %d å°æ™‚
+actionview_datehelper_time_in_words_hour_about_single: ç´„ 1 å°æ™‚
+actionview_datehelper_time_in_words_minute: 1 分é˜
+actionview_datehelper_time_in_words_minute_half: åŠåˆ†é˜
+actionview_datehelper_time_in_words_minute_less_than: å°æ–¼ 1 分é˜
+actionview_datehelper_time_in_words_minute_plural: %d 分é˜
+actionview_datehelper_time_in_words_minute_single: 1 分é˜
+actionview_datehelper_time_in_words_second_less_than: å°æ–¼ 1 ç§’
+actionview_datehelper_time_in_words_second_less_than_plural: å°æ–¼ %d ç§’
+actionview_instancetag_blank_option: è«‹é¸æ“‡
+
+activerecord_error_inclusion: å¿…é ˆè¢«åŒ…å«
+activerecord_error_exclusion: å¿…é ˆè¢«æŽ’é™¤
+activerecord_error_invalid: 䏿£ç¢º
+activerecord_error_confirmation: èˆ‡ç¢ºèªæ¬„ä½ä¸ç›¸ç¬¦
+activerecord_error_accepted: å¿…é ˆè¢«æŽ¥å—
+activerecord_error_empty: ä¸å¯ç‚ºç©ºå€¼
+activerecord_error_blank: ä¸å¯ç‚ºç©ºç™½
+activerecord_error_too_long: 長度éŽé•·
+activerecord_error_too_short: 長度太çŸ
+activerecord_error_wrong_length: é•·åº¦ä¸æ£ç¢º
+activerecord_error_taken: 已經被使用
+activerecord_error_not_a_number: 䏿˜¯ä¸€å€‹æ•¸å—
+activerecord_error_not_a_date: æ—¥æœŸæ ¼å¼ä¸æ£ç¢º
+activerecord_error_greater_than_start_date: å¿…é ˆåœ¨èµ·å§‹æ—¥æœŸä¹‹å¾Œ
+activerecord_error_not_same_project: ä¸å±¬æ–¼åŒä¸€å€‹å°ˆæ¡ˆ
+activerecord_error_circular_dependency: é€™å€‹é—œè¯æœƒå°Žè‡´ç’°ç‹€ç›¸ä¾
+
+general_fmt_age: %d å¹´
+general_fmt_age_plural: %d å¹´
+general_fmt_date: %%m/%%d/%%Y
+general_fmt_datetime: %%m/%%d/%%Y %%I:%%M %%p
+general_fmt_datetime_short: %%b %%d, %%I:%%M %%p
+general_fmt_time: %%I:%%M %%p
+general_text_No: 'å¦'
+general_text_Yes: '是'
+general_text_no: 'å¦'
+general_text_yes: '是'
+general_lang_name: 'Traditional Chinese (ç¹é«”䏿–‡)'
+general_csv_separator: ','
+general_csv_decimal_separator: '.'
+general_csv_encoding: Big5
+general_pdf_encoding: Big5
+general_day_names: 星期一,星期二,星期三,星期四,星期五,星期å…,星期日
+general_first_day_of_week: '7'
+
+notice_account_updated: 帳戶更新資訊已儲å˜
+notice_account_invalid_creditentials: å¸³æˆ¶æˆ–å¯†ç¢¼ä¸æ£ç¢º
+notice_account_password_updated: 帳戶新密碼已儲å˜
+notice_account_wrong_password: å¯†ç¢¼ä¸æ£ç¢º
+notice_account_register_done: 帳號已建立æˆåŠŸã€‚æ¬²å•Ÿç”¨æ‚¨çš„å¸³è™Ÿï¼Œè«‹é»žæ“Šç³»çµ±ç¢ºèªä¿¡å‡½ä¸çš„啟用連çµã€‚
+notice_account_unknown_email: 未知的使用者
+notice_can_t_change_password: 這個帳號使用外部èªè‰æ–¹å¼ï¼Œç„¡æ³•變更其密碼。
+notice_account_lost_email_sent: 包å«é¸æ“‡æ–°å¯†ç¢¼æŒ‡ç¤ºçš„é›»å郵件,已經寄出給您。
+notice_account_activated: 您的帳號已經啟用,å¯ç”¨å®ƒç™»å…¥ç³»çµ±ã€‚
+notice_successful_create: 建立æˆåŠŸ
+notice_successful_update: æ›´æ–°æˆåŠŸ
+notice_successful_delete: 刪除æˆåŠŸ
+notice_successful_connection: 連線æˆåŠŸ
+notice_file_not_found: 您想è¦å˜å–çš„é é¢å·²ç¶“ä¸å˜åœ¨æˆ–被æ¬ç§»è‡³å…¶ä»–ä½ç½®ã€‚
+notice_locking_conflict: 資料已被其他使用者更新。
+notice_not_authorized: ä½ æœªè¢«æŽˆæ¬Šå˜å–æ¤é é¢ã€‚
+notice_email_sent: 郵件已經æˆåŠŸå¯„é€è‡³ä»¥ä¸‹æ”¶ä»¶è€…: %s
+notice_email_error: 寄é€éƒµä»¶çš„éŽç¨‹ä¸ç™¼ç”ŸéŒ¯èª¤ (%s)
+notice_feeds_access_key_reseted: 您的 RSS å˜å–éµå·²è¢«é‡æ–°è¨å®šã€‚
+notice_failed_to_save_issues: " %d å€‹é …ç›®å„²å˜å¤±æ•— (總共é¸å– %d å€‹é …ç›®): %s."
+notice_no_issue_selected: "æœªé¸æ“‡ä»»ä½•é …ç›®ï¼è«‹å‹¾é¸æ‚¨æƒ³è¦ç·¨è¼¯çš„é …ç›®ã€‚"
+notice_account_pending: "您的帳號已經建立,æ£åœ¨ç‰å¾…管ç†å“¡çš„å¯©æ ¸ã€‚"
+notice_default_data_loaded: é è¨çµ„態已載入æˆåŠŸã€‚
+
+error_can_t_load_default_data: "無法載入é è¨çµ„態: %s"
+error_scm_not_found: SCM 儲å˜åº«ä¸æ‰¾ä¸åˆ°é€™å€‹å°ˆæ¡ˆæˆ–版本。
+error_scm_command_failed: "嘗試å˜å–儲å˜åº«æ™‚發生錯誤: %s"
+error_scm_annotate: "SCM 儲å˜åº«ä¸ç„¡æ¤é …目或æ¤é …ç›®ç„¡æ³•è¢«åŠ è¨»ã€‚"
+error_issue_not_found_in_project: 'è©²é …ç›®ä¸å˜åœ¨æˆ–ä¸å±¬æ–¼æ¤å°ˆæ¡ˆ'
+
+mail_subject_lost_password: 您的 Redmine 網站密碼
+mail_body_lost_password: '欲變更您的 Redmine 網站密碼, 請點é¸ä»¥ä¸‹éˆçµ:'
+mail_subject_register: 啟用您的 Redmine 帳號
+mail_body_register: '欲啟用您的 Redmine 帳號, 請點é¸ä»¥ä¸‹éˆçµ:'
+mail_body_account_information_external: 您å¯ä»¥ä½¿ç”¨ "%s" 帳號登入 Redmine 網站。
+mail_body_account_information: 您的 Redmine 帳號資訊
+mail_subject_account_activation_request: Redmine 帳號啟用需求通知
+mail_body_account_activation_request: 'æœ‰ä½æ–°ç”¨æˆ¶ (%s) 已經完æˆè¨»å†Šï¼Œæ£ç‰å€™æ‚¨çš„å¯©æ ¸ï¼š'
+mail_subject_reminder: "您有 %d å€‹é …ç›®å³å°‡åˆ°æœŸ"
+mail_body_reminder: "%d å€‹æŒ‡æ´¾çµ¦æ‚¨çš„é …ç›®ï¼Œå°‡æ–¼ %d 天之內到期:"
+
+gui_validation_error: 1 個錯誤
+gui_validation_error_plural: %d 個錯誤
+
+field_name: å稱
+field_description: 概述
+field_summary: 摘è¦
+field_is_required: å¿…å¡«
+field_firstname: åå—
+field_lastname: å§“æ°
+field_mail: é›»å郵件
+field_filename: 檔案å稱
+field_filesize: 大å°
+field_downloads: 下載次數
+field_author: 作者
+field_created_on: 建立日期
+field_updated_on: æ›´æ–°
+field_field_format: æ ¼å¼
+field_is_for_all: 給所有專案
+field_possible_values: å¯èƒ½å€¼
+field_regexp: æ£è¦è¡¨ç¤ºå¼
+field_min_length: 最å°é•·åº¦
+field_max_length: 最大長度
+field_value: 值
+field_category: 分類
+field_title: 標題
+field_project: 專案
+field_issue: é …ç›®
+field_status: 狀態
+field_notes: ç†è¨˜
+field_is_closed: é …ç›®çµæŸ
+field_is_default: é è¨å€¼
+field_tracker: 追蹤標籤
+field_subject: 主旨
+field_due_date: å®Œæˆæ—¥æœŸ
+field_assigned_to: 分派給
+field_priority: 優先權
+field_fixed_version: 版本
+field_user: 用戶
+field_role: 角色
+field_homepage: 網站首é
+field_is_public: 公開
+field_parent: 父專案
+field_is_in_chlog: é …ç›®é¡¯ç¤ºæ–¼è®Šæ›´è¨˜éŒ„ä¸
+field_is_in_roadmap: é …ç›®é¡¯ç¤ºæ–¼ç‰ˆæœ¬è—圖ä¸
+field_login: 帳戶å稱
+field_mail_notification: é›»å郵件æé†’é¸é …
+field_admin: 管ç†è€…
+field_last_login_on: 最近連線日期
+field_language: 語系
+field_effective_date: 日期
+field_password: ç›®å‰å¯†ç¢¼
+field_new_password: 新密碼
+field_password_confirmation: ç¢ºèªæ–°å¯†ç¢¼
+field_version: 版本
+field_type: Type
+field_host: Host
+field_port: 連接åŸ
+field_account: 帳戶
+field_base_dn: Base DN
+field_attr_login: 登入屬性
+field_attr_firstname: åå—屬性
+field_attr_lastname: å§“æ°å±¬æ€§
+field_attr_mail: é›»å郵件信箱屬性
+field_onthefly: 峿™‚建立使用者
+field_start_date: 開始日期
+field_done_ratio: 完æˆç™¾åˆ†æ¯”
+field_auth_source: èªè‰æ¨¡å¼
+field_hide_mail: éš±è—æˆ‘的電å郵件
+field_comments: 註解
+field_url: URL
+field_start_page: 首é
+field_subproject: å專案
+field_hours: å°æ™‚
+field_activity: 活動
+field_spent_on: 日期
+field_identifier: 代碼
+field_is_filter: ç”¨ä¾†ä½œç‚ºéŽæ¿¾å™¨
+field_issue_to_id: ç›¸é—œé …ç›®
+field_delay: 逾期
+field_assignable: é …ç›®å¯è¢«åˆ†æ´¾è‡³æ¤è§’色
+field_redirect_existing_links: 釿–°å°Žå‘ç¾æœ‰é€£çµ
+field_estimated_hours: é 估工時
+field_column_names: 欄ä½
+field_time_zone: 時å€
+field_searchable: å¯ç”¨åšæœå°‹æ¢ä»¶
+field_default_value: é è¨å€¼
+field_comments_sorting: 註解排åº
+
+setting_app_title: 標題
+setting_app_subtitle: 副標題
+setting_welcome_text: æ¡è¿Žè©ž
+setting_default_language: é è¨èªžç³»
+setting_login_required: 需è¦é©—è‰
+setting_self_registration: 註冊é¸é …
+setting_attachment_max_size: 附件大å°é™åˆ¶
+setting_issues_export_limit: é …ç›®åŒ¯å‡ºé™åˆ¶
+setting_mail_from: 寄件者電å郵件
+setting_bcc_recipients: 使用密件副本 (BCC)
+setting_host_name: 主機å稱
+setting_text_formatting: æ–‡å—æ ¼å¼
+setting_wiki_compression: 壓縮 Wiki æ·å²æ–‡ç«
+setting_feeds_limit: RSS æ–°èžé™åˆ¶
+setting_autofetch_changesets: 自動å–å¾—é€äº¤ç‰ˆæ¬¡
+setting_default_projects_public: 新建立之專案é è¨ç‚ºã€Œå…¬é–‹ã€
+setting_sys_api_enabled: 啟用管ç†ç‰ˆæœ¬åº«ä¹‹ç¶²é æœå‹™ (Web Service)
+setting_commit_ref_keywords: 用於åƒç…§é …目之關éµå—
+setting_commit_fix_keywords: 用於修æ£é …目之關éµå—
+setting_autologin: 自動登入
+setting_date_format: æ—¥æœŸæ ¼å¼
+setting_time_format: æ™‚é–“æ ¼å¼
+setting_cross_project_issue_relations: å…許關è¯è‡³å…¶å®ƒå°ˆæ¡ˆçš„é …ç›®
+setting_issue_list_default_columns: é è¨é¡¯ç¤ºæ–¼é …目清單的欄ä½
+setting_repositories_encodings: 版本庫編碼
+setting_emails_footer: é›»å郵件附帶說明
+setting_protocol: å”定
+setting_per_page_options: æ¯é 顯示個數é¸é …
+setting_user_format: ä½¿ç”¨è€…é¡¯ç¤ºæ ¼å¼
+setting_activity_days_default: 專案活動顯示天數
+setting_display_subprojects_issues: é è¨æ–¼çˆ¶å°ˆæ¡ˆä¸é¡¯ç¤ºåå°ˆæ¡ˆçš„é …ç›®
+setting_enabled_scm: 啟用的 SCM
+setting_mail_handler_api_enabled: 啟用處ç†å‚³å…¥é›»å郵件的æœå‹™
+setting_mail_handler_api_key: API 金鑰
+
+project_module_issue_tracking: é …ç›®è¿½è¹¤
+project_module_time_tracking: 工時追蹤
+project_module_news: æ–°èž
+project_module_documents: 文件
+project_module_files: 檔案
+project_module_wiki: Wiki
+project_module_repository: 版本控管
+project_module_boards: 討論å€
+
+label_user: 用戶
+label_user_plural: 用戶清單
+label_user_new: 建立新的帳戶
+label_project: 專案
+label_project_new: 建立新的專案
+label_project_plural: 專案清單
+label_project_all: 全部的專案
+label_project_latest: 最近的專案
+label_issue: é …ç›®
+label_issue_new: å»ºç«‹æ–°çš„é …ç›®
+label_issue_plural: é …ç›®æ¸…å–®
+label_issue_view_all: æª¢è¦–æ‰€æœ‰é …ç›®
+label_issues_by: é …ç›®æŒ‰ %s 分組顯示
+label_issue_added: é …ç›®å·²æ–°å¢ž
+label_issue_updated: é …ç›®å·²æ›´æ–°
+label_document: 文件
+label_document_new: 建立新的文件
+label_document_plural: 文件
+label_document_added: 文件已新增
+label_role: 角色
+label_role_plural: 角色
+label_role_new: 建立新角色
+label_role_and_permissions: 角色與權é™
+label_member: æˆå“¡
+label_member_new: 建立新的æˆå“¡
+label_member_plural: æˆå“¡
+label_tracker: 追蹤標籤
+label_tracker_plural: 追蹤標籤清單
+label_tracker_new: 建立新的追蹤標籤
+label_workflow: æµç¨‹
+label_issue_status: é …ç›®ç‹€æ…‹
+label_issue_status_plural: é …ç›®ç‹€æ…‹æ¸…å–®
+label_issue_status_new: 建立新的狀態
+label_issue_category: é …ç›®åˆ†é¡ž
+label_issue_category_plural: é …ç›®åˆ†é¡žæ¸…å–®
+label_issue_category_new: 建立新的分類
+label_custom_field: 自訂欄ä½
+label_custom_field_plural: è‡ªè¨‚æ¬„ä½æ¸…å–®
+label_custom_field_new: 建立新的自訂欄ä½
+label_enumerations: 列舉值清單
+label_enumeration_new: 建立新的列舉值
+label_information: 資訊
+label_information_plural: 資訊
+label_please_login: 請先登入
+label_register: 註冊
+label_password_lost: éºå¤±å¯†ç¢¼
+label_home: 網站首é
+label_my_page: 帳戶首é
+label_my_account: 我的帳戶
+label_my_projects: 我的專案
+label_administration: 網站管ç†
+label_login: 登入
+label_logout: 登出
+label_help: 說明
+label_reported_issues: æˆ‘é€šå ±çš„é …ç›®
+label_assigned_to_me_issues: åˆ†æ´¾çµ¦æˆ‘çš„é …ç›®
+label_last_login: 最近一次連線
+label_last_updates: 最近更新
+label_last_updates_plural: %d 個最近更新
+label_registered_on: 註冊於
+label_activity: 活動
+label_overall_activity: 檢視所有活動
+label_new: 建立新的...
+label_logged_as: ç›®å‰ç™»å…¥
+label_environment: 環境
+label_authentication: èªè‰
+label_auth_source: èªè‰æ¨¡å¼
+label_auth_source_new: 建立新èªè‰æ¨¡å¼
+label_auth_source_plural: èªè‰æ¨¡å¼æ¸…å–®
+label_subproject_plural: å專案
+label_and_its_subprojects: %s 與其å專案
+label_min_max_length: æœ€å° - 最大 長度
+label_list: 清單
+label_date: 日期
+label_integer: 整數
+label_float: ç¦é»žæ•¸
+label_boolean: 布林
+label_string: æ–‡å—
+label_text: é•·æ–‡å—
+label_attribute: 屬性
+label_attribute_plural: 屬性
+label_download: %d 個下載
+label_download_plural: %d 個下載
+label_no_data: 沒有任何資料å¯ä¾›é¡¯ç¤º
+label_change_status: 變更狀態
+label_history: æ·å²
+label_attachment: 檔案
+label_attachment_new: 建立新的檔案
+label_attachment_delete: 刪除檔案
+label_attachment_plural: 檔案
+label_file_added: 檔案已新增
+label_report: å ±å‘Š
+label_report_plural: å ±å‘Š
+label_news: æ–°èž
+label_news_new: 建立新的新èž
+label_news_plural: æ–°èž
+label_news_latest: 最近新èž
+label_news_view_all: 檢視所有新èž
+label_news_added: æ–°èžå·²æ–°å¢ž
+label_change_log: 變更記錄
+label_settings: è¨å®š
+label_overview: 概觀
+label_version: 版本
+label_version_new: 建立新的版本
+label_version_plural: 版本
+label_confirmation: 確èª
+label_export_to: 匯出至
+label_read: 讀å–...
+label_public_projects: 公開專案
+label_open_issues: 進行ä¸
+label_open_issues_plural: 進行ä¸
+label_closed_issues: å·²çµæŸ
+label_closed_issues_plural: å·²çµæŸ
+label_total: 總計
+label_permissions: 權é™
+label_current_status: ç›®å‰ç‹€æ…‹
+label_new_statuses_allowed: å¯è®Šæ›´è‡³ä»¥ä¸‹ç‹€æ…‹
+label_all: 全部
+label_none: 空值
+label_nobody: ç„¡å
+label_next: 下一é
+label_previous: 上一é
+label_used_by: Used by
+label_details: 明細
+label_add_note: åŠ å…¥ä¸€å€‹æ–°ç†è¨˜
+label_per_page: æ¯é
+label_calendar: 日曆
+label_months_from: 個月, 開始月份
+label_gantt: 甘特圖
+label_internal: 內部
+label_last_changes: 最近 %d 個變更
+label_change_view_all: 檢視所有變更
+label_personalize_page: 自訂版é¢
+label_comment: 註解
+label_comment_plural: 註解
+label_comment_add: åŠ å…¥æ–°è¨»è§£
+label_comment_added: æ–°è¨»è§£å·²åŠ å…¥
+label_comment_delete: 刪除註解
+label_query: 自訂查詢
+label_query_plural: 自訂查詢
+label_query_new: 建立新的查詢
+label_filter_add: åŠ å…¥æ–°ç¯©é¸æ¢ä»¶
+label_filter_plural: ç¯©é¸æ¢ä»¶
+label_equals: ç‰æ–¼
+label_not_equals: ä¸ç‰æ–¼
+label_in_less_than: åœ¨å°æ–¼
+label_in_more_than: 在大於
+label_in: 在
+label_today: 今天
+label_all_time: all time
+label_yesterday: 昨天
+label_this_week: 本週
+label_last_week: 上週
+label_last_n_days: éŽåŽ» %d 天
+label_this_month: 這個月
+label_last_month: 上個月
+label_this_year: 今年
+label_date_range: 日期å€é–“
+label_less_than_ago: å°æ–¼å¹¾å¤©ä¹‹å‰
+label_more_than_ago: 大於幾天之å‰
+label_ago: 天以å‰
+label_contains: 包å«
+label_not_contains: ä¸åŒ…å«
+label_day_plural: 天
+label_repository: 版本控管
+label_repository_plural: 版本控管
+label_browse: ç€è¦½
+label_modification: %d 變更
+label_modification_plural: %d 變更
+label_revision: 版次
+label_revision_plural: 版次清單
+label_associated_revisions: 相關版次
+label_added: 已新增
+label_modified: 已修改
+label_deleted: 已刪除
+label_latest_revision: 最新版次
+label_latest_revision_plural: 最近版次清單
+label_view_revisions: 檢視版次清單
+label_max_size: 最大長度
+label_on: 總共
+label_sort_highest: 移動至開é
+label_sort_higher: 往上移動
+label_sort_lower: 往下移動
+label_sort_lowest: 移動至çµå°¾
+label_roadmap: 版本è—圖
+label_roadmap_due_in: 倒數天數:
+label_roadmap_overdue: %s 逾期
+label_roadmap_no_issues: æ¤ç‰ˆæœ¬å°šæœªåŒ…å«ä»»ä½•é …ç›®
+label_search: æœå°‹
+label_result_plural: çµæžœ
+label_all_words: All words
+label_wiki: Wiki
+label_wiki_edit: Wiki 編輯
+label_wiki_edit_plural: Wiki 編輯
+label_wiki_page: Wiki ç¶²é
+label_wiki_page_plural: Wiki ç¶²é
+label_index_by_title: 便¨™é¡Œç´¢å¼•
+label_index_by_date: 便—¥æœŸç´¢å¼•
+label_current_version: ç¾è¡Œç‰ˆæœ¬
+label_preview: é 覽
+label_feed_plural: Feeds
+label_changes_details: 所有變更的明細
+label_issue_tracking: é …ç›®è¿½è¹¤
+label_spent_time: 耗用時間
+label_f_hour: %.2f å°æ™‚
+label_f_hour_plural: %.2f å°æ™‚
+label_time_tracking: 工時追蹤
+label_change_plural: 變更
+label_statistics: 統計資訊
+label_commits_per_month: 便œˆä»½çµ±è¨ˆé€äº¤æ¬¡æ•¸
+label_commits_per_author: ä¾ä½œè€…統計é€äº¤æ¬¡æ•¸
+label_view_diff: 檢視差異
+label_diff_inline: 直列
+label_diff_side_by_side: 並排
+label_options: é¸é …清單
+label_copy_workflow_from: 從以下追蹤標籤複製工作æµç¨‹
+label_permissions_report: 權é™å ±è¡¨
+label_watched_issues: 觀察ä¸çš„é …ç›®æ¸…å–®
+label_related_issues: ç›¸é—œçš„é …ç›®æ¸…å–®
+label_applied_status: 已套用狀態
+label_loading: 載入ä¸...
+label_relation_new: 建立新關è¯
+label_relation_delete: 刪除關è¯
+label_relates_to: é—œè¯è‡³
+label_duplicates: å·²é‡è¤‡
+label_duplicated_by: èˆ‡å¾Œé¢æ‰€åˆ—é …ç›®é‡è¤‡
+label_blocks: 阻擋
+label_blocked_by: 被阻擋
+label_precedes: 優先於
+label_follows: 跟隨於
+label_end_to_start: çµæŸâ”€é–‹å§‹
+label_end_to_end: çµæŸâ”€çµæŸ
+label_start_to_start: 開始─開始
+label_start_to_end: é–‹å§‹â”€çµæŸ
+label_stay_logged_in: ç¶æŒå·²ç™»å…¥ç‹€æ…‹
+label_disabled: 關閉
+label_show_completed_versions: 顯示已完æˆçš„版本
+label_me: 我自己
+label_board: 論壇
+label_board_new: 建立新論壇
+label_board_plural: 論壇
+label_topic_plural: 討論主題
+label_message_plural: 訊æ¯
+label_message_last: 上一å°è¨Šæ¯
+label_message_new: 建立新的訊æ¯
+label_message_posted: 訊æ¯å·²æ–°å¢ž
+label_reply_plural: 回應
+label_send_information: 寄é€å¸³æˆ¶è³‡è¨Šé›»å郵件給用戶
+label_year: å¹´
+label_month: 月
+label_week: 週
+label_date_from: é–‹å§‹
+label_date_to: çµæŸ
+label_language_based: ä¾ç”¨æˆ¶ä¹‹èªžç³»æ±ºå®š
+label_sort_by: 按 %s 排åº
+label_send_test_email: 坄逿¸¬è©¦éƒµä»¶
+label_feeds_access_key_created_on: RSS å˜å–éµå»ºç«‹æ–¼ %s 之å‰
+label_module_plural: 模組
+label_added_time_by: 是由 %s æ–¼ %s å‰åŠ å…¥
+label_updated_time: æ–¼ %s 剿›´æ–°
+label_jump_to_a_project: 鏿“‡æ¬²å‰å¾€çš„專案...
+label_file_plural: 檔案清單
+label_changeset_plural: 變更集清單
+label_default_columns: é è¨æ¬„使¸…å–®
+label_no_change_option: (ç¶æŒä¸è®Š)
+label_bulk_edit_selected_issues: 編輯é¸å®šçš„é …ç›®
+label_theme: ç•«é¢ä¸»é¡Œ
+label_default: é è¨
+label_search_titles_only: 僅æœå°‹æ¨™é¡Œ
+label_user_mail_option_all: "æé†’與我的專案有關的所有事件"
+label_user_mail_option_selected: "åªåœé†’æˆ‘æ‰€é¸æ“‡å°ˆæ¡ˆä¸çš„事件..."
+label_user_mail_option_none: "åªæé†’æˆ‘è§€å¯Ÿä¸æˆ–åƒèˆ‡ä¸çš„事件"
+label_user_mail_no_self_notified: "ä¸æé†’æˆ‘è‡ªå·±æ‰€åšçš„變更"
+label_registration_activation_by_email: é€éŽé›»å郵件啟用帳戶
+label_registration_manual_activation: 手動啟用帳戶
+label_registration_automatic_activation: 自動啟用帳戶
+label_display_per_page: 'æ¯é 顯示: %s 個'
+label_age: 年齡
+label_change_properties: 變更屬性
+label_general: 一般
+label_more: 更多 »
+label_scm: 版本控管
+label_plugins: é™„åŠ å…ƒä»¶
+label_ldap_authentication: LDAP èªè‰
+label_downloads_abbr: 下載
+label_optional_description: é¡å¤–的說明
+label_add_another_file: å¢žåŠ å…¶ä»–æª”æ¡ˆ
+label_preferences: å好é¸é …
+label_chronological_order: 以時間由é 至近排åº
+label_reverse_chronological_order: ä»¥æ™‚é–“ç”±è¿‘è‡³é æŽ’åº
+label_planning: 計劃表
+label_incoming_emails: 傳入的電å郵件
+label_generate_key: 產生金鑰
+
+button_login: 登入
+button_submit: é€å‡º
+button_save: 儲å˜
+button_check_all: å…¨é¸
+button_uncheck_all: å…¨ä¸é¸
+button_delete: 刪除
+button_create: 建立
+button_test: 測試
+button_edit: 編輯
+button_add: 新增
+button_change: 修改
+button_apply: 套用
+button_clear: 清除
+button_lock: 鎖定
+button_unlock: 解除鎖定
+button_download: 下載
+button_list: 清單
+button_view: 檢視
+button_move: 移動
+button_back: 返回
+button_cancel: å–æ¶ˆ
+button_activate: 啟用
+button_sort: 排åº
+button_log_time: 記錄時間
+button_rollback: 還原至æ¤ç‰ˆæœ¬
+button_watch: 觀察
+button_unwatch: å–æ¶ˆè§€å¯Ÿ
+button_reply: 回應
+button_archive: æ¸æª”
+button_unarchive: å–æ¶ˆæ¸æª”
+button_reset: 回復
+button_rename: 釿–°å‘½å
+button_change_password: 變更密碼
+button_copy: 複製
+button_annotate: åŠ æ³¨
+button_update: æ›´æ–°
+button_configure: è¨å®š
+
+status_active: 活動ä¸
+status_registered: 註冊完æˆ
+status_locked: 鎖定ä¸
+
+text_select_mail_notifications: 鏿“‡æ¬²å¯„é€æé†’é€šçŸ¥éƒµä»¶ä¹‹å‹•ä½œ
+text_regexp_info: eg. ^[A-Z0-9]+$
+text_min_max_length_info: 0 代表「ä¸é™åˆ¶ã€
+text_project_destroy_confirmation: 您確定è¦åˆªé™¤é€™å€‹å°ˆæ¡ˆå’Œå…¶ä»–相關資料?
+text_subprojects_destroy_warning: '下列å專案: %s 將一併被刪除。'
+text_workflow_edit: 鏿“‡è§’色與追蹤標籤以è¨å®šå…¶å·¥ä½œæµç¨‹
+text_are_you_sure: 確定執行?
+text_journal_changed: 從 %s 變更為 %s
+text_journal_set_to: è¨å®šç‚º %s
+text_journal_deleted: 已刪除
+text_tip_task_begin_day: 今天起始的工作
+text_tip_task_end_day: 今天截æ¢çš„的工作
+text_tip_task_begin_end_day: 今天起始與截æ¢çš„工作
+text_project_identifier_info: 'åªå…許å°å¯«è‹±æ–‡å—æ¯ï¼ˆa-z)ã€é˜¿æ‹‰ä¼¯æ•¸å—與連å—符號(-)。 儲å˜å¾Œï¼Œä»£ç¢¼ä¸å¯å†è¢«æ›´æ”¹ã€‚'
+text_caracters_maximum: 最多 %d 個å—å…ƒ.
+text_caracters_minimum: é•·åº¦å¿…é ˆå¤§æ–¼ %d 個å—å…ƒ.
+text_length_between: é•·åº¦å¿…é ˆä»‹æ–¼ %d 至 %d 個å—元之間.
+text_tracker_no_workflow: æ¤è¿½è¹¤æ¨™ç±¤å°šæœªå®šç¾©å·¥ä½œæµç¨‹
+text_unallowed_characters: ä¸å…許的å—å…ƒ
+text_comma_separated: å¯è¼¸å…¥å¤šå€‹å€¼ (以逗號分隔).
+text_issues_ref_in_commit_messages: é€äº¤è¨Šæ¯ä¸åƒç…§(或修æ£)é …ç›®ä¹‹é—œéµå—
+text_issue_added: é …ç›® %s 已被 %s é€šå ±ã€‚
+text_issue_updated: é …ç›® %s 已被 %s 更新。
+text_wiki_destroy_confirmation: 您確定è¦åˆªé™¤é€™å€‹ wiki 和其ä¸çš„æ‰€æœ‰å…§å®¹ï¼Ÿ
+text_issue_category_destroy_question: 有 (%d) å€‹é …ç›®è¢«æŒ‡æ´¾åˆ°æ¤åˆ†é¡ž. è«‹é¸æ“‡æ‚¨æƒ³è¦çš„動作?
+text_issue_category_destroy_assignments: ç§»é™¤é€™äº›é …ç›®çš„åˆ†é¡ž
+text_issue_category_reassign_to: 釿–°æŒ‡æ´¾é€™äº›é …目至其它分類
+text_user_mail_option: "å°æ–¼é‚£äº›æœªè¢«é¸æ“‡çš„å°ˆæ¡ˆï¼Œå°‡åªæœƒæŽ¥æ”¶åˆ°æ‚¨æ£åœ¨è§€å¯Ÿä¸ï¼Œæˆ–是åƒèˆ‡ä¸çš„é …ç›®é€šçŸ¥ã€‚ï¼ˆã€Œåƒèˆ‡ä¸çš„é …ç›®ã€åŒ…嫿‚¨å»ºç«‹çš„æˆ–æ˜¯æŒ‡æ´¾çµ¦æ‚¨çš„é …ç›®ï¼‰"
+text_no_configuration_data: "角色ã€è¿½è¹¤å™¨ã€é …目狀態與æµç¨‹å°šæœªè¢«è¨å®šå®Œæˆã€‚\nå¼·çƒˆå»ºè°æ‚¨å…ˆè¼‰å…¥é è¨çš„è¨å®šï¼Œç„¶å¾Œä¿®æ”¹æˆæ‚¨æƒ³è¦çš„è¨å®šã€‚"
+text_load_default_configuration: 載入é è¨çµ„æ…‹
+text_status_changed_by_changeset: 已套用至變更集 %s.
+text_issues_destroy_confirmation: 'ç¢ºå®šåˆªé™¤å·²é¸æ“‡çš„é …ç›®ï¼Ÿ'
+text_select_project_modules: '鏿“‡æ¤å°ˆæ¡ˆå¯ä½¿ç”¨ä¹‹æ¨¡çµ„:'
+text_default_administrator_account_changed: 已變更é è¨ç®¡ç†å“¡å¸³è™Ÿå…§å®¹
+text_file_repository_writable: å¯å¯«å…¥æª”案
+text_rmagick_available: å¯ä½¿ç”¨ RMagick (é¸é…)
+text_destroy_time_entries_question: 您å³å°‡åˆªé™¤çš„é …ç›®å·²å ±å·¥ %.02f å°æ™‚. æ‚¨çš„é¸æ“‡æ˜¯ï¼Ÿ
+text_destroy_time_entries: åˆªé™¤å·²å ±å·¥çš„æ™‚æ•¸
+text_assign_time_entries_to_project: æŒ‡å®šå·²å ±å·¥çš„æ™‚æ•¸è‡³å°ˆæ¡ˆä¸
+text_reassign_time_entries: '釿–°æŒ‡å®šå·²å ±å·¥çš„æ™‚數至æ¤é …目:'
+text_user_wrote: '%s å…ˆå‰æåˆ°:'
+text_enumeration_destroy_question: 'ç›®å‰æœ‰ %d 個物件使用æ¤åˆ—舉值。'
+text_enumeration_category_reassign_to: '釿–°è¨å®šå…¶åˆ—舉值為:'
+text_email_delivery_not_configured: "您尚未è¨å®šé›»åéƒµä»¶å‚³é€æ–¹å¼ï¼Œå› æ¤æé†’é¸é …已被åœç”¨ã€‚\n請在 config/email.yml ä¸è¨å®š SMTP ä¹‹å¾Œï¼Œé‡æ–°å•Ÿå‹• Redmine,以啟用電å郵件æé†’é¸é …。"
+
+default_role_manager: 管ç†äººå“¡
+default_role_developper: 開發人員
+default_role_reporter: å ±å‘Šäººå“¡
+default_tracker_bug: è‡èŸ²
+default_tracker_feature: 功能
+default_tracker_support: 支æ´
+default_issue_status_new: 新建立
+default_issue_status_assigned: 已指派
+default_issue_status_resolved: 已解決
+default_issue_status_feedback: 已回應
+default_issue_status_closed: å·²çµæŸ
+default_issue_status_rejected: 已拒絕
+default_doc_category_user: 使用手冊
+default_doc_category_tech: 技術文件
+default_priority_low: 低
+default_priority_normal: æ£å¸¸
+default_priority_high: 高
+default_priority_urgent: 速
+default_priority_immediate: 急
+default_activity_design: è¨è¨ˆ
+default_activity_development: 開發
+
+enumeration_issue_priorities: é …ç›®å„ªå…ˆæ¬Š
+enumeration_doc_categories: 文件分類
+enumeration_activities: 活動 (時間追蹤)
+field_parent_title: Parent page
+label_issue_watchers: Watchers
+setting_commit_logs_encoding: Commit messages encoding
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lang/zh.yml b/lang/zh.yml
index d738afdb4..dbc531119 100644
--- a/lang/zh.yml
+++ b/lang/zh.yml
@@ -1,6 +1,3 @@
-# translated by andy wu
-# email:andywu.zh@gmail.com
-
_gloc_rule_default: '|n| n==1 ? "" : "_plural" '
actionview_datehelper_select_day_prefix:
@@ -10,37 +7,37 @@ actionview_datehelper_select_month_prefix:
actionview_datehelper_select_year_prefix:
actionview_datehelper_time_in_words_day: 1 天
actionview_datehelper_time_in_words_day_plural: %d 天
-actionview_datehelper_time_in_words_hour_about: 约1å°æ—¶
+actionview_datehelper_time_in_words_hour_about: 约 1 å°æ—¶
actionview_datehelper_time_in_words_hour_about_plural: 约 %d å°æ—¶
-actionview_datehelper_time_in_words_hour_about_single: 约1å°æ—¶
-actionview_datehelper_time_in_words_minute: 1分钟
+actionview_datehelper_time_in_words_hour_about_single: 约 1 å°æ—¶
+actionview_datehelper_time_in_words_minute: 1 分钟
actionview_datehelper_time_in_words_minute_half: åŠåˆ†é’Ÿ
-actionview_datehelper_time_in_words_minute_less_than: 1分钟以内
+actionview_datehelper_time_in_words_minute_less_than: 1 分钟以内
actionview_datehelper_time_in_words_minute_plural: %d 分钟
-actionview_datehelper_time_in_words_minute_single: 1分钟
-actionview_datehelper_time_in_words_second_less_than: 1秒以内
-actionview_datehelper_time_in_words_second_less_than_plural: %d 秒以内
+actionview_datehelper_time_in_words_minute_single: 1 分钟
+actionview_datehelper_time_in_words_second_less_than: 1 秒以内
+actionview_datehelper_time_in_words_second_less_than_plural: %d 秒以内
actionview_instancetag_blank_option: 请选择
-activerecord_error_inclusion: 未包å«åœ¨åˆ—表ä¸
-activerecord_error_exclusion: ä¿ç•™çš„
-activerecord_error_invalid: æ— æ•ˆçš„
-activerecord_error_confirmation: 和确认输入ä¸åŒ¹é…
-activerecord_error_accepted: 必需被接å—
-activerecord_error_empty: ä¸èƒ½ä¸ºç©º
-activerecord_error_blank: ä¸èƒ½æ˜¯ç©ºæ ¼
-activerecord_error_too_long: 太长
-activerecord_error_too_short: 太çŸ
-activerecord_error_wrong_length: 长度有问题
-activerecord_error_taken: has already been taken
+activerecord_error_inclusion: 未被包å«åœ¨åˆ—表ä¸
+activerecord_error_exclusion: 是ä¿ç•™å—
+activerecord_error_invalid: æ˜¯æ— æ•ˆçš„
+activerecord_error_confirmation: 与确认æ ä¸ç¬¦
+activerecord_error_accepted: 必须被接å—
+activerecord_error_empty: ä¸å¯ä¸ºç©º
+activerecord_error_blank: ä¸å¯ä¸ºç©ºç™½
+activerecord_error_too_long: 过长
+activerecord_error_too_short: 过çŸ
+activerecord_error_wrong_length: é•¿åº¦ä¸æ£ç¡®
+activerecord_error_taken: 已被使用
activerecord_error_not_a_number: 䏿˜¯æ•°å—
activerecord_error_not_a_date: 䏿˜¯æœ‰æ•ˆçš„æ—¥æœŸ
-activerecord_error_greater_than_start_date: 必需大于开始日期
-activerecord_error_not_same_project: doesn't belong to the same project
-activerecord_error_circular_dependency: This relation would create a circular dependency
+activerecord_error_greater_than_start_date: 必须在起始日期之åŽ
+activerecord_error_not_same_project: ä¸å±žäºŽåŒä¸€ä¸ªé¡¹ç›®
+activerecord_error_circular_dependency: æ¤å…³è”将导致循环ä¾èµ–
-general_fmt_age: %d yr
-general_fmt_age_plural: %d yrs
+general_fmt_age: %d å¹´
+general_fmt_age_plural: %d å¹´
general_fmt_date: %%m/%%d/%%Y
general_fmt_datetime: %%m/%%d/%%Y %%I:%%M %%p
general_fmt_datetime_short: %%b %%d, %%I:%%M %%p
@@ -49,38 +46,54 @@ general_text_No: 'å¦'
general_text_Yes: '是'
general_text_no: 'å¦'
general_text_yes: '是'
-general_lang_name: 'Chinese (ç®€ä½“ä¸æ–‡)'
+general_lang_name: 'Simplified Chinese (ç®€ä½“ä¸æ–‡)'
general_csv_separator: ','
+general_csv_decimal_separator: '.'
general_csv_encoding: gb2312
-general_pdf_encoding: Big5
-general_day_names: 一,二,三,å››,五,å…,æ—¥
+general_pdf_encoding: gb2312
+general_day_names: 星期一,星期二,星期三,星期四,星期五,星期å…,星期日
general_first_day_of_week: '7'
-notice_account_updated: 叿ˆ·æ›´æ–°æˆåŠŸã€‚
-notice_account_invalid_creditentials: ç”¨æˆ·åæˆ–密ç 䏿£ç¡®
-notice_account_password_updated: æˆåŠŸæ›´æ–°å£ä»¤
-notice_account_wrong_password: 错误的å£ä»¤
-notice_account_register_done: 叿ˆ·å·²åˆ›å»ºæˆåŠŸ
+notice_account_updated: å¸å·æ›´æ–°æˆåŠŸ
+notice_account_invalid_creditentials: æ— æ•ˆçš„ç”¨æˆ·åæˆ–密ç
+notice_account_password_updated: å¯†ç æ›´æ–°æˆåŠŸ
+notice_account_wrong_password: 密ç 错误
+notice_account_register_done: å¸å·åˆ›å»ºæˆåŠŸï¼Œè¯·ä½¿ç”¨æ³¨å†Œç¡®è®¤é‚®ä»¶ä¸çš„é“¾æŽ¥æ¥æ¿€æ´»æ‚¨çš„å¸å·ã€‚
notice_account_unknown_email: 未知用户
-notice_can_t_change_password: è¯¥å¸æˆ·ä½¿ç”¨äº†å¤–部认è¯ã€‚æ— æ³•æ›´æ”¹å£ä»¤ã€‚
-notice_account_lost_email_sent: 邮件已被å‘é€ï¼Œé‚®ä»¶ä¸æœ‰å…³äºŽé€‰æ‹©æ–°å£ä»¤çš„æŒ‡å¯¼
+notice_can_t_change_password: 该å¸å·ä½¿ç”¨äº†å¤–部认è¯ï¼Œå› æ¤æ— 法更改密ç 。
+notice_account_lost_email_sent: 系统已将引导您设置新密ç 的邮件å‘é€ç»™æ‚¨ã€‚
notice_account_activated: 您的å¸å·å·²è¢«æ¿€æ´»ã€‚您现在å¯ä»¥ç™»å½•了。
notice_successful_create: 创建æˆåŠŸ
notice_successful_update: æ›´æ–°æˆåŠŸ
notice_successful_delete: åˆ é™¤æˆåŠŸ
notice_successful_connection: 连接æˆåŠŸ
notice_file_not_found: 您访问的页é¢ä¸å˜åœ¨æˆ–å·²è¢«åˆ é™¤ã€‚
-notice_locking_conflict: æ•°æ®å·²è¢«å¦ä¸€ä¸ªç”¨æˆ·æ›´æ–°
-notice_scm_error: 在版本库ä¸ä¸å˜åœ¨è¯¥æ¡ç›®æˆ–修订
-notice_not_authorized: You are not authorized to access this page.
-notice_email_sent: An email was sent to %s
-notice_email_error: An error occurred while sending mail (%s)
-notice_feeds_access_key_reseted: Your RSS access key was reseted.
+notice_locking_conflict: æ•°æ®å·²è¢«å¦ä¸€ä½ç”¨æˆ·æ›´æ–°
+notice_not_authorized: 对ä¸èµ·ï¼Œæ‚¨æ— æƒè®¿é—®æ¤é¡µé¢ã€‚
+notice_email_sent: 邮件已æˆåŠŸå‘é€åˆ° %s
+notice_email_error: å‘é€é‚®ä»¶æ—¶å‘生错误 (%s)
+notice_feeds_access_key_reseted: 您的RSSå˜å–键已被é‡ç½®ã€‚
+notice_failed_to_save_issues: "%d 个问题ä¿å˜å¤±è´¥ï¼ˆå…±é€‰æ‹© %d 个问题):%s."
+notice_no_issue_selected: "未选择任何问题ï¼è¯·é€‰æ‹©æ‚¨è¦ç¼–辑的问题。"
+notice_account_pending: "您的å¸å·å·²è¢«æˆåŠŸåˆ›å»ºï¼Œæ£åœ¨ç‰å¾…管ç†å‘˜çš„å®¡æ ¸ã€‚"
+notice_default_data_loaded: æˆåŠŸè½½å…¥é»˜è®¤è®¾ç½®ã€‚
-mail_subject_lost_password: 您的redMineå£ä»¤
-mail_body_lost_password: 'To change your Redmine password, click on the following link:'
-mail_subject_register: redMine叿ˆ·æ¿€æ´»
-mail_body_register: 'To activate your Redmine account, click on the following link:'
+error_can_t_load_default_data: "æ— æ³•è½½å…¥é»˜è®¤è®¾ç½®ï¼š%s"
+error_scm_not_found: "版本库ä¸ä¸å˜åœ¨è¯¥æ¡ç›®å’Œï¼ˆæˆ–)其修订版本。"
+error_scm_command_failed: "访问版本库时å‘生错误:%s"
+error_scm_annotate: "该æ¡ç›®ä¸å˜åœ¨æˆ–æ— æ³•è¿½æº¯ã€‚"
+error_issue_not_found_in_project: '问题ä¸å˜åœ¨æˆ–ä¸å±žäºŽæ¤é¡¹ç›®'
+
+mail_subject_lost_password: 您的 %s 密ç
+mail_body_lost_password: '请点击以下链接æ¥ä¿®æ”¹æ‚¨çš„密ç :'
+mail_subject_register: %så¸å·æ¿€æ´»
+mail_body_register: 'è¯·ç‚¹å‡»ä»¥ä¸‹é“¾æŽ¥æ¥æ¿€æ´»æ‚¨çš„å¸å·ï¼š'
+mail_body_account_information_external: 您å¯ä»¥ä½¿ç”¨æ‚¨çš„ "%s" å¸å·æ¥ç™»å½•。
+mail_body_account_information: 您的å¸å·ä¿¡æ¯
+mail_subject_account_activation_request: %så¸å·æ¿€æ´»è¯·æ±‚
+mail_body_account_activation_request: '新用户(%sï¼‰å·²å®Œæˆæ³¨å†Œï¼Œæ£åœ¨ç‰å€™æ‚¨çš„å®¡æ ¸ï¼š'
+mail_subject_reminder: "%d 个问题需è¦å°½å¿«è§£å†³"
+mail_body_reminder: "指派给您的 %d 个问题需è¦åœ¨ %d 天内完æˆï¼š"
gui_validation_error: 1 个错误
gui_validation_error_plural: %d 个错误
@@ -90,7 +103,7 @@ field_description: æè¿°
field_summary: 摘è¦
field_is_required: å¿…å¡«
field_firstname: åå—
-field_lastname: å§“
+field_lastname: å§“æ°
field_mail: 邮件地å€
field_filename: 文件
field_filesize: 大å°
@@ -99,71 +112,77 @@ field_author: 作者
field_created_on: 创建于
field_updated_on: 更新于
field_field_format: æ ¼å¼
-field_is_for_all: 应用于所有项目
+field_is_for_all: 用于所有项目
field_possible_values: å¯èƒ½çš„值
field_regexp: æ£åˆ™è¡¨è¾¾å¼
field_min_length: 最å°é•¿åº¦
field_max_length: 最大长度
field_value: 值
-field_category: 分类
+field_category: 类别
field_title: æ ‡é¢˜
field_project: 项目
-field_issue: 任务
+field_issue: 问题
field_status: 状æ€
field_notes: 说明
-field_is_closed: 已关é—的任务
-field_is_default: 默认状æ€
+field_is_closed: 已关é—的问题
+field_is_default: 默认值
field_tracker: 跟踪
field_subject: 主题
-field_due_date: 到期日
-field_assigned_to: 指派
+field_due_date: å®Œæˆæ—¥æœŸ
+field_assigned_to: 指派给
field_priority: 优先级
-field_fixed_version: 修订版本
+field_fixed_version: ç›®æ ‡ç‰ˆæœ¬
field_user: 用户
field_role: 角色
field_homepage: 主页
field_is_public: 公开
field_parent: 上级项目
-field_is_in_chlog: åœ¨æ›´æ–°æ—¥å¿—ä¸æ˜¾ç¤ºä»»åŠ¡
-field_is_in_roadmap: åœ¨è·¯çº¿å›¾ä¸æ˜¾ç¤ºä»»åŠ¡
+field_is_in_chlog: åœ¨æ›´æ–°æ—¥å¿—ä¸æ˜¾ç¤ºé—®é¢˜
+field_is_in_roadmap: åœ¨è·¯çº¿å›¾ä¸æ˜¾ç¤ºé—®é¢˜
field_login: 登录å
field_mail_notification: 邮件通知
field_admin: 管ç†å‘˜
field_last_login_on: 最åŽç™»å½•
field_language: è¯è¨€
field_effective_date: 日期
-field_password: å£ä»¤
-field_new_password: æ–°å£ä»¤
+field_password: 密ç
+field_new_password: 新密ç
field_password_confirmation: 确认
field_version: 版本
-field_type: 类别
+field_type: 类型
field_host: 主机
field_port: 端å£
field_account: å¸å·
field_base_dn: Base DN
field_attr_login: 登录å属性
field_attr_firstname: åå—属性
-field_attr_lastname: 姓属性
+field_attr_lastname: å§“æ°å±žæ€§
field_attr_mail: 邮件属性
-field_onthefly: On-the-fly user creation
+field_onthefly: 峿—¶ç”¨æˆ·ç”Ÿæˆ
field_start_date: 开始
-field_done_ratio: %% 完æˆ
+field_done_ratio: 完æˆåº¦
field_auth_source: è®¤è¯æ¨¡å¼
-field_hide_mail: éšè—我的邮件
+field_hide_mail: éšè—我的邮件地å€
field_comments: 注释
field_url: URL
field_start_page: 起始页
field_subproject: å项目
-field_hours: Hours
+field_hours: å°æ—¶
field_activity: 活动
field_spent_on: 日期
-field_identifier: Identifier
-field_is_filter: Used as a filter
-field_issue_to_id: Related issue
-field_delay: Delay
-field_assignable: Issues can be assigned to this role
-field_redirect_existing_links: Redirect existing links
-field_estimated_hours: Estimated time
+field_identifier: æ ‡è¯†
+field_is_filter: 作为过滤æ¡ä»¶
+field_issue_to_id: 相关问题
+field_delay: 延期
+field_assignable: é—®é¢˜å¯æŒ‡æ´¾ç»™æ¤è§’色
+field_redirect_existing_links: é‡å®šå‘到现有链接
+field_estimated_hours: 预期时间
+field_column_names: 列
+field_time_zone: 时区
+field_searchable: å¯ç”¨ä½œæœç´¢æ¡ä»¶
+field_default_value: 默认值
+field_comments_sorting: 显示注释
+field_parent_title: 上级页é¢
setting_app_title: åº”ç”¨ç¨‹åºæ ‡é¢˜
setting_app_subtitle: 应用程åºåæ ‡é¢˜
@@ -171,179 +190,223 @@ setting_welcome_text: 欢迎文å—
setting_default_language: 默认è¯è¨€
setting_login_required: è¦æ±‚认è¯
setting_self_registration: å…许自注册
-setting_attachment_max_size: 附件最大尺寸
-setting_issues_export_limit: Issues export limit
-setting_mail_from: Emission mail address
+setting_attachment_max_size: 附件大å°é™åˆ¶
+setting_issues_export_limit: 问题输出æ¡ç›®çš„é™åˆ¶
+setting_mail_from: 邮件å‘件人地å€
+setting_bcc_recipients: ä½¿ç”¨å¯†ä»¶æŠ„é€ (bcc)
setting_host_name: 主机åç§°
setting_text_formatting: æ–‡æœ¬æ ¼å¼
-setting_wiki_compression: Wiki history compression
-setting_feeds_limit: Feed content limit
-setting_autofetch_changesets: Autofetch commits
-setting_sys_api_enabled: Enable WS for repository management
-setting_commit_ref_keywords: Referencing keywords
-setting_commit_fix_keywords: Fixing keywords
-setting_autologin: Autologin
-setting_date_format: Date format
-setting_cross_project_issue_relations: Allow cross-project issue relations
+setting_wiki_compression: 压缩WikiåŽ†å²æ–‡æ¡£
+setting_feeds_limit: RSS Feedå†…å®¹æ¡æ•°é™åˆ¶
+setting_default_projects_public: 新建项目默认为公开项目
+setting_autofetch_changesets: 自动获å–程åºå˜æ›´
+setting_sys_api_enabled: å¯ç”¨ç”¨äºŽç‰ˆæœ¬åº“管ç†çš„Web Service
+setting_commit_ref_keywords: 用于引用问题的关键å—
+setting_commit_fix_keywords: 用于解决问题的关键å—
+setting_autologin: 自动登录
+setting_date_format: æ—¥æœŸæ ¼å¼
+setting_time_format: æ—¶é—´æ ¼å¼
+setting_cross_project_issue_relations: å…许ä¸åŒé¡¹ç›®ä¹‹é—´çš„问题关è”
+setting_issue_list_default_columns: é—®é¢˜åˆ—è¡¨ä¸æ˜¾ç¤ºçš„默认列
+setting_repositories_encodings: 版本库编ç
+setting_commit_logs_encoding: æäº¤æ³¨é‡Šçš„ç¼–ç
+setting_emails_footer: 邮件ç¾å
+setting_protocol: åè®®
+setting_per_page_options: æ¯é¡µæ˜¾ç¤ºæ¡ç›®ä¸ªæ•°çš„设置
+setting_user_format: ç”¨æˆ·æ˜¾ç¤ºæ ¼å¼
+setting_activity_days_default: åœ¨é¡¹ç›®æ´»åŠ¨ä¸æ˜¾ç¤ºçš„天数
+setting_display_subprojects_issues: 在项目页é¢ä¸Šé»˜è®¤æ˜¾ç¤ºå项目的问题
+setting_enabled_scm: å¯ç”¨ SCM
+setting_mail_handler_api_enabled: å¯ç”¨ç”¨äºŽæŽ¥æ”¶é‚®ä»¶çš„Web Service
+setting_mail_handler_api_key: API key
+
+project_module_issue_tracking: 问题跟踪
+project_module_time_tracking: 时间跟踪
+project_module_news: æ–°é—»
+project_module_documents: 文档
+project_module_files: 文件
+project_module_wiki: Wiki
+project_module_repository: 版本库
+project_module_boards: 讨论区
label_user: 用户
-label_user_plural: 用户列表
+label_user_plural: 用户
label_user_new: 新建用户
label_project: 项目
label_project_new: 新建项目
-label_project_plural: 项目列表
-label_project_all: All Projects
-label_project_latest: 最近的项目列表
-label_issue: 任务
-label_issue_new: 新建任务
-label_issue_plural: 任务列表
-label_issue_view_all: 查看所有任务
+label_project_plural: 项目
+label_project_all: 所有的项目
+label_project_latest: 最近更新的项目
+label_issue: 问题
+label_issue_new: 新建问题
+label_issue_plural: 问题
+label_issue_view_all: 查看所有问题
+label_issues_by: 按 %s 分组显示问题
+label_issue_added: 问题已添åŠ
+label_issue_updated: 问题已更新
label_document: 文档
label_document_new: 新建文档
-label_document_plural: 文档列表
+label_document_plural: 文档
+label_document_added: 文档已添åŠ
label_role: 角色
-label_role_plural: 角色列表
+label_role_plural: 角色
label_role_new: 新建角色
label_role_and_permissions: 角色和æƒé™
label_member: æˆå‘˜
label_member_new: 新建æˆå‘˜
-label_member_plural: æˆå‘˜åˆ—表
+label_member_plural: æˆå‘˜
label_tracker: è·Ÿè¸ªæ ‡ç¾
-label_tracker_plural: è·Ÿè¸ªæ ‡ç¾åˆ—表
+label_tracker_plural: è·Ÿè¸ªæ ‡ç¾
label_tracker_new: æ–°å»ºè·Ÿè¸ªæ ‡ç¾
-label_workflow: 工作æµ
-label_issue_status: 任务状æ€åˆ—表
-label_issue_status_plural: 任务状æ€åˆ—表
-label_issue_status_new: 新建任务状æ€åˆ—表
-label_issue_category: 任务类别
-label_issue_category_plural: 任务类别列表
-label_issue_category_new: 新建任务类别
-label_custom_field: è‡ªå®šä¹‰å—æ®µ
-label_custom_field_plural: è‡ªå®šä¹‰å—æ®µåˆ—表
-label_custom_field_new: æ–°å»ºè‡ªå®šä¹‰å—æ®µ
-label_enumerations: 枚举列表
+label_workflow: 工作æµç¨‹
+label_issue_status: 问题状æ€
+label_issue_status_plural: 问题状æ€
+label_issue_status_new: 新建问题状æ€
+label_issue_category: 问题类别
+label_issue_category_plural: 问题类别
+label_issue_category_new: 新建问题类别
+label_custom_field: 自定义属性
+label_custom_field_plural: 自定义属性
+label_custom_field_new: 新建自定义属性
+label_enumerations: 枚举值
label_enumeration_new: 新建枚举值
label_information: ä¿¡æ¯
label_information_plural: ä¿¡æ¯
label_please_login: 请登录
label_register: 注册
-label_password_lost: 忘记å£ä»¤
+label_password_lost: 忘记密ç
label_home: 主页
label_my_page: 我的工作å°
label_my_account: 我的å¸å·
-label_my_projects: 我的项目列表
+label_my_projects: 我的项目
label_administration: 管ç†
label_login: 登录
label_logout: 退出
label_help: 帮助
label_reported_issues: 已报告的问题
-label_assigned_to_me_issues: 分é…给我的任务
+label_assigned_to_me_issues: 指派给我的问题
label_last_login: 最åŽç™»å½•
label_last_updates: æœ€åŽæ›´æ–°
label_last_updates_plural: %d æœ€åŽæ›´æ–°
label_registered_on: 注册于
label_activity: 活动
+label_overall_activity: 全部活动
label_new: 新建
label_logged_as: 登录为
label_environment: 环境
label_authentication: 认è¯
label_auth_source: è®¤è¯æ¨¡å¼
label_auth_source_new: æ–°å»ºè®¤è¯æ¨¡å¼
-label_auth_source_plural: è®¤è¯æ¨¡å¼åˆ—表
-label_subproject_plural: å项目列表
+label_auth_source_plural: è®¤è¯æ¨¡å¼
+label_subproject_plural: å项目
+label_and_its_subprojects: %s åŠå…¶å项目
label_min_max_length: æœ€å° - 最大 长度
-label_list: list
-label_date: Date
-label_integer: Integer
-label_boolean: Boolean
-label_string: Text
-label_text: Long text
+label_list: 列表
+label_date: 日期
+label_integer: æ•´æ•°
+label_float: 浮点数
+label_boolean: 布尔é‡
+label_string: æ–‡å—
+label_text: 长段文å—
label_attribute: 属性
label_attribute_plural: 属性
-label_download: %d 个下载次数
-label_download_plural: %d 个下载次数
-label_no_data: 没有数æ®ç”¨äºŽæ˜¾ç¤º
-label_change_status: 改å˜çжæ€
+label_download: %d 次下载
+label_download_plural: %d 次下载
+label_no_data: 没有任何数æ®å¯ä¾›æ˜¾ç¤º
+label_change_status: å˜æ›´çжæ€
label_history: 历å²è®°å½•
label_attachment: 文件
label_attachment_new: 新建文件
label_attachment_delete: åˆ é™¤æ–‡ä»¶
-label_attachment_plural: 文件列表
+label_attachment_plural: 文件
+label_file_added: 文件已添åŠ
label_report: 报表
-label_report_plural: 报表列表
+label_report_plural: 报表
label_news: æ–°é—»
-label_news_new: å¢žåŠ æ–°é—»
-label_news_plural: 新闻列表
+label_news_new: æ·»åŠ æ–°é—»
+label_news_plural: æ–°é—»
label_news_latest: 最近的新闻
label_news_view_all: 查看所有新闻
+label_news_added: 新闻已添åŠ
label_change_log: 更新日志
label_settings: é…ç½®
label_overview: 概述
label_version: 版本
label_version_new: 新建版本
-label_version_plural: 版本列表
+label_version_plural: 版本
label_confirmation: 确认
label_export_to: 导出
label_read: 读å–...
-label_public_projects: 公开的项目列表
+label_public_projects: 公开的项目
label_open_issues: 打开
label_open_issues_plural: 打开
label_closed_issues: 已关é—
label_closed_issues_plural: 已关é—
label_total: åˆè®¡
-label_permissions: æƒé™åˆ—表
+label_permissions: æƒé™
label_current_status: 当å‰çжæ€
-label_new_statuses_allowed: New statuses allowed
+label_new_statuses_allowed: å¯å˜æ›´çš„æ–°çжæ€
label_all: 全部
label_none: æ—
+label_nobody: æ— äºº
label_next: 下一个
label_previous: 上一个
label_used_by: 使用ä¸
label_details: 详情
label_add_note: æ·»åŠ è¯´æ˜Ž
-label_per_page: æ¯é¢
+label_per_page: æ¯é¡µ
label_calendar: 日历
-label_months_from: months from
-label_gantt: 甘特图(Gantt)
+label_months_from: 个月以æ¥
+label_gantt: 甘特图
label_internal: 内部
-label_last_changes: 最近的 %d 次更改
-label_change_view_all: 查看所有更改
+label_last_changes: 最近的 %d æ¬¡å˜æ›´
+label_change_view_all: æŸ¥çœ‹æ‰€æœ‰å˜æ›´
label_personalize_page: 个性化定制本页
-label_comment: 注释
-label_comment_plural: 注释列表
-label_comment_add: æ·»åŠ æ³¨é‡Š
-label_comment_added: å·²åŠ å…¥æ³¨é‡Š
-label_comment_delete: åˆ é™¤æ³¨é‡Š
+label_comment: 评论
+label_comment_plural: 评论
+label_comment_add: æ·»åŠ è¯„è®º
+label_comment_added: 评论已添åŠ
+label_comment_delete: åˆ é™¤è¯„è®º
label_query: 自定义查询
-label_query_plural: 自定义查询列表
+label_query_plural: 自定义查询
label_query_new: 新建查询
label_filter_add: å¢žåŠ è¿‡æ»¤å™¨
-label_filter_plural: 过滤器列表
+label_filter_plural: 过滤器
label_equals: ç‰äºŽ
label_not_equals: ä¸ç‰äºŽ
label_in_less_than: 剩余天数å°äºŽ
label_in_more_than: 剩余天数大于
label_in: 剩余天数
label_today: 今天
-label_this_week: this week
+label_all_time: 全部时间
+label_yesterday: 昨天
+label_this_week: 本周
+label_last_week: 下周
+label_last_n_days: æœ€åŽ %d 天
+label_this_month: 本月
+label_last_month: 下月
+label_this_year: 今年
+label_date_range: 日期范围
label_less_than_ago: 之å‰å¤©æ•°å°‘于
label_more_than_ago: 之å‰å¤©æ•°å¤§äºŽ
label_ago: 之å‰å¤©æ•°
label_contains: 包å«
label_not_contains: ä¸åŒ…å«
-label_day_plural: 天数
+label_day_plural: 天
label_repository: 版本库
+label_repository_plural: 版本库
label_browse: æµè§ˆ
label_modification: %d 个更新
label_modification_plural: %d 个更新
label_revision: 修订
label_revision_plural: 修订
-label_added: 已增åŠ
+label_associated_revisions: 相关修订版本
+label_added: 已添åŠ
label_modified: 已修改
label_deleted: å·²åˆ é™¤
-label_latest_revision: 最近的版本
-label_latest_revision_plural: 最近的版本列表
-label_view_revisions: 查看修订列表
+label_latest_revision: 最近的修订版本
+label_latest_revision_plural: 最近的修订版本
+label_view_revisions: 查看修订
label_max_size: 最大尺寸
label_on: 'on'
label_sort_highest: 置顶
@@ -351,79 +414,115 @@ label_sort_higher: 上移
label_sort_lower: 下移
label_sort_lowest: 置底
label_roadmap: 路线图
-label_roadmap_due_in: Due in
-label_roadmap_overdue: %s late
-label_roadmap_no_issues: 该版本没有任务
-label_search: 查找
-label_result_plural: 个结果
+label_roadmap_due_in: æˆªæ¢æ—¥æœŸåˆ°
+label_roadmap_overdue: %s 延期
+label_roadmap_no_issues: 该版本没有问题
+label_search: æœç´¢
+label_result_plural: 结果
label_all_words: 所有å•è¯
label_wiki: Wiki
-label_wiki_edit: Wiki edit
-label_wiki_edit_plural: Wiki edits
-label_wiki_page_plural: Wiki pages
-label_index_by_title: 索引
-label_index_by_date: Index by date
+label_wiki_edit: Wiki 编辑
+label_wiki_edit_plural: Wiki 编辑记录
+label_wiki_page: Wiki 页é¢
+label_wiki_page_plural: Wiki 页é¢
+label_index_by_title: æŒ‰æ ‡é¢˜ç´¢å¼•
+label_index_by_date: 按日期索引
label_current_version: 当å‰ç‰ˆæœ¬
label_preview: 预览
label_feed_plural: Feeds
-label_changes_details: 所有更改的详情
-label_issue_tracking: 任务跟踪
+label_changes_details: æ‰€æœ‰å˜æ›´çš„详情
+label_issue_tracking: 问题跟踪
label_spent_time: 耗时
label_f_hour: %.2f å°æ—¶
label_f_hour_plural: %.2f å°æ—¶
label_time_tracking: 时间跟踪
-label_change_plural: 更改列表
+label_change_plural: å˜æ›´
label_statistics: 统计
-label_commits_per_month: Commits per month
-label_commits_per_author: Commits per author
-label_view_diff: View differences
-label_diff_inline: inline
-label_diff_side_by_side: side by side
-label_options: Options
-label_copy_workflow_from: Copy workflow from
-label_permissions_report: Permissions report
-label_watched_issues: Watched issues
-label_related_issues: Related issues
-label_applied_status: Applied status
-label_loading: Loading...
-label_relation_new: New relation
-label_relation_delete: Delete relation
-label_relates_to: related to
-label_duplicates: duplicates
-label_blocks: blocks
-label_blocked_by: blocked by
-label_precedes: precedes
-label_follows: follows
-label_end_to_start: end to start
-label_end_to_end: end to end
-label_start_to_start: start to start
-label_start_to_end: start to end
-label_stay_logged_in: Stay logged in
-label_disabled: disabled
-label_show_completed_versions: Show completed versions
-label_me: me
-label_board: Forum
-label_board_new: New forum
-label_board_plural: Forums
-label_topic_plural: Topics
-label_message_plural: Messages
-label_message_last: Last message
-label_message_new: New message
-label_reply_plural: Replies
-label_send_information: Send account information to the user
-label_year: Year
-label_month: Month
-label_week: Week
-label_date_from: From
-label_date_to: To
-label_language_based: Language based
-label_sort_by: Sort by %s
-label_send_test_email: Send a test email
-label_feeds_access_key_created_on: RSS access key created %s ago
-label_module_plural: Modules
-label_added_time_by: Added by %s %s ago
-label_updated_time: Updated %s ago
-label_jump_to_a_project: Jump to a project...
+label_commits_per_month: æ¯æœˆæäº¤æ¬¡æ•°
+label_commits_per_author: æ¯ç”¨æˆ·æäº¤æ¬¡æ•°
+label_view_diff: 查看差别
+label_diff_inline: 直列
+label_diff_side_by_side: 并排
+label_options: 选项
+label_copy_workflow_from: 从以下项目å¤åˆ¶å·¥ä½œæµç¨‹
+label_permissions_report: æƒé™æŠ¥è¡¨
+label_watched_issues: 跟踪的问题
+label_related_issues: 相关的问题
+label_applied_status: 应用åŽçš„状æ€
+label_loading: 载入ä¸...
+label_relation_new: 新建关è”
+label_relation_delete: åˆ é™¤å…³è”
+label_relates_to: å…³è”到
+label_duplicates: é‡å¤
+label_duplicated_by: 与其é‡å¤
+label_blocks: 阻挡
+label_blocked_by: 被阻挡
+label_precedes: 优先于
+label_follows: è·ŸéšäºŽ
+label_end_to_start: 结æŸ-开始
+label_end_to_end: 结æŸ-结æŸ
+label_start_to_start: 开始-开始
+label_start_to_end: 开始-结æŸ
+label_stay_logged_in: ä¿æŒç™»å½•状æ€
+label_disabled: ç¦ç”¨
+label_show_completed_versions: 显示已完æˆçš„版本
+label_me: 我
+label_board: 讨论区
+label_board_new: 新建讨论区
+label_board_plural: 讨论区
+label_topic_plural: 主题
+label_message_plural: 帖å
+label_message_last: 最新的帖å
+label_message_new: æ–°è´´
+label_message_posted: å‘帖æˆåŠŸ
+label_reply_plural: 回å¤
+label_send_information: 给用户å‘é€å¸å·ä¿¡æ¯
+label_year: å¹´
+label_month: 月
+label_week: 周
+label_date_from: 从
+label_date_to: 到
+label_language_based: æ ¹æ®ç”¨æˆ·çš„è¯è¨€
+label_sort_by: æ ¹æ® %s 排åº
+label_send_test_email: å‘逿µ‹è¯•邮件
+label_feeds_access_key_created_on: RSS å˜å–键是在 %s 之å‰å»ºç«‹çš„
+label_module_plural: 模å—
+label_added_time_by: ç”± %s 在 %s 之剿·»åŠ
+label_updated_time: 更新于 %s å‰
+label_jump_to_a_project: 选择一个项目...
+label_file_plural: 文件
+label_changeset_plural: å˜æ›´
+label_default_columns: 默认列
+label_no_change_option: (ä¸å˜)
+label_bulk_edit_selected_issues: 批é‡ä¿®æ”¹é€‰ä¸çš„问题
+label_theme: 主题
+label_default: 默认
+label_search_titles_only: ä»…åœ¨æ ‡é¢˜ä¸æœç´¢
+label_user_mail_option_all: "æ”¶å–æˆ‘的项目的所有通知"
+label_user_mail_option_selected: "æ”¶å–选ä¸é¡¹ç›®çš„æ‰€æœ‰é€šçŸ¥..."
+label_user_mail_option_none: "åªæ”¶å–我跟踪或å‚与的项目的通知"
+label_user_mail_no_self_notified: "ä¸è¦å‘é€å¯¹æˆ‘自己æäº¤çš„修改的通知"
+label_registration_activation_by_email: é€šè¿‡é‚®ä»¶è®¤è¯æ¿€æ´»å¸å·
+label_registration_manual_activation: 手动激活å¸å·
+label_registration_automatic_activation: 自动激活å¸å·
+label_display_per_page: 'æ¯é¡µæ˜¾ç¤ºï¼š%s'
+label_age: 年龄
+label_change_properties: 修改属性
+label_general: 一般
+label_more: 更多
+label_scm: SCM
+label_plugins: æ’ä»¶
+label_ldap_authentication: LDAP 认è¯
+label_downloads_abbr: D/L
+label_optional_description: å¯é€‰çš„æè¿°
+label_add_another_file: æ·»åŠ å…¶å®ƒæ–‡ä»¶
+label_preferences: 首选项
+label_chronological_order: 按时间顺åº
+label_reverse_chronological_order: 按时间顺åºï¼ˆå€’åºï¼‰
+label_planning: 计划
+label_incoming_emails: 接收邮件
+label_generate_key: 生æˆä¸€ä¸ªkey
+label_issue_watchers: 跟踪者
button_login: 登录
button_submit: æäº¤
@@ -449,57 +548,81 @@ button_cancel: å–æ¶ˆ
button_activate: 激活
button_sort: 排åº
button_log_time: 登记工时
-button_rollback: Rollback to this version
-button_watch: Watch
-button_unwatch: Unwatch
-button_reply: Reply
-button_archive: Archive
-button_unarchive: Unarchive
-button_reset: Reset
-button_rename: Rename
+button_rollback: æ¢å¤åˆ°è¿™ä¸ªç‰ˆæœ¬
+button_watch: 跟踪
+button_unwatch: å–æ¶ˆè·Ÿè¸ª
+button_reply: 回å¤
+button_archive: å˜æ¡£
+button_unarchive: å–æ¶ˆå˜æ¡£
+button_reset: é‡ç½®
+button_rename: é‡å‘½å
+button_change_password: 修改密ç
+button_copy: å¤åˆ¶
+button_annotate: 追溯
+button_update: æ›´æ–°
+button_configure: é…ç½®
-status_active: 激活
+status_active: 活动的
status_registered: 已注册
status_locked: å·²é”定
-text_select_mail_notifications: 选择需è¦å‘é€é‚®ä»¶é€šçŸ¥çš„动作。
-text_regexp_info: eg. ^[A-Z0-9]+$
+text_select_mail_notifications: 选择需è¦å‘é€é‚®ä»¶é€šçŸ¥çš„动作
+text_regexp_info: 例如:^[A-Z0-9]+$
text_min_max_length_info: 0 表示没有é™åˆ¶
text_project_destroy_confirmation: 您确信è¦åˆ é™¤è¿™ä¸ªé¡¹ç›®ä»¥åŠæ‰€æœ‰ç›¸å…³çš„æ•°æ®å—?
-text_workflow_edit: é€‰æ‹©ä¸€ä¸ªè§’è‰²å’Œè·Ÿè¸ªæ ‡ç¾æ¥ç¼–辑这个工作æµ
+text_subprojects_destroy_warning: '以下åé¡¹ç›®ä¹Ÿå°†è¢«åŒæ—¶åˆ 除:%s'
+text_workflow_edit: é€‰æ‹©è§’è‰²å’Œè·Ÿè¸ªæ ‡ç¾æ¥ç¼–辑工作æµç¨‹
text_are_you_sure: 您确定?
-text_journal_changed: 从 %s 更改为 %s
+text_journal_changed: 从 %s å˜æ›´ä¸º %s
text_journal_set_to: 设置为 %s
text_journal_deleted: å·²åˆ é™¤
-text_tip_task_begin_day: 开始于æ¤
-text_tip_task_end_day: 在æ¤ç»“æŸ
-text_tip_task_begin_end_day: 开始并结æŸäºŽæ¤
-text_project_identifier_info: 'Lower case letters (a-z), numbers and dashes allowed. Once saved, the identifier can not be changed.'
-text_caracters_maximum: %d characters maximum.
-text_length_between: Length between %d and %d characters.
-text_tracker_no_workflow: No workflow defined for this tracker
-text_unallowed_characters: Unallowed characters
-text_comma_separated: Multiple values allowed (comma separated).
-text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages
-text_issue_added: %s ѱ
-text_issue_updated: %s Ѹ
-text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content ?
-text_issue_category_destroy_question: Some issues (%d) are assigned to this category. What do you want to do ?
-text_issue_category_destroy_assignments: Remove category assignments
-text_issue_category_reassign_to: Reassing issues to this category
+text_tip_task_begin_day: 今天开始的任务
+text_tip_task_end_day: 今天结æŸçš„任务
+text_tip_task_begin_end_day: 今天开始并结æŸçš„任务
+text_project_identifier_info: 'åªå…许使用å°å†™å—æ¯ï¼ˆa-z),数å—和连å—符(-)。 请注æ„ï¼Œæ ‡è¯†ç¬¦ä¿å˜åŽå°†ä¸å¯ä¿®æ”¹ã€‚'
+text_caracters_maximum: 最多 %d 个å—符。
+text_caracters_minimum: è‡³å°‘éœ€è¦ %d 个å—符。
+text_length_between: 长度必须在 %d 到 %d 个å—符之间。
+text_tracker_no_workflow: æ¤è·Ÿè¸ªæ ‡ç¾æœªå®šä¹‰å·¥ä½œæµç¨‹
+text_unallowed_characters: éžæ³•å—符
+text_comma_separated: å¯ä»¥ä½¿ç”¨å¤šä¸ªå€¼ï¼ˆç”¨é€—å·,分开)。
+text_issues_ref_in_commit_messages: 在æäº¤ä¿¡æ¯ä¸å¼•用和解决问题
+text_issue_added: 问题 %s 已由 %s æäº¤ã€‚
+text_issue_updated: 问题 %s 已由 %s 更新。
+text_wiki_destroy_confirmation: 您确定è¦åˆ 除这个 wiki åŠå…¶æ‰€æœ‰å†…容å—?
+text_issue_category_destroy_question: 有一些问题(%d 个)属于æ¤ç±»åˆ«ã€‚æ‚¨æƒ³è¿›è¡Œå“ªç§æ“作?
+text_issue_category_destroy_assignments: åˆ é™¤é—®é¢˜çš„æ‰€å±žç±»åˆ«ï¼ˆé—®é¢˜å˜ä¸ºæ— 类别)
+text_issue_category_reassign_to: 为问题选择其它类别
+text_user_mail_option: "对于没有选ä¸çš„项目,您将åªä¼šæ”¶åˆ°æ‚¨è·Ÿè¸ªæˆ–å‚与的项目的通知(比如说,您是问题的报告者, 或被指派解决æ¤é—®é¢˜ï¼‰ã€‚"
+text_no_configuration_data: "角色ã€è·Ÿè¸ªæ ‡ç¾ã€é—®é¢˜çжæ€å’Œå·¥ä½œæµç¨‹è¿˜æ²¡æœ‰è®¾ç½®ã€‚\n强烈建议您先载入默认设置,然åŽåœ¨æ¤åŸºç¡€ä¸Šè¿›è¡Œä¿®æ”¹ã€‚"
+text_load_default_configuration: 载入默认设置
+text_status_changed_by_changeset: å·²åº”ç”¨åˆ°å˜æ›´åˆ—表 %s.
+text_issues_destroy_confirmation: '您确定è¦åˆ 除选ä¸çš„问题å—?'
+text_select_project_modules: '请选择æ¤é¡¹ç›®å¯ä»¥ä½¿ç”¨çš„æ¨¡å—:'
+text_default_administrator_account_changed: 默认的管ç†å‘˜å¸å·å·²æ”¹å˜
+text_file_repository_writable: 文件版本库å¯ä¿®æ”¹
+text_rmagick_available: RMagick å¯ç”¨ï¼ˆå¯é€‰çš„)
+text_destroy_time_entries_question: 您è¦åˆ 除的问题已ç»ä¸ŠæŠ¥äº† %.02f å°æ—¶çš„工作é‡ã€‚æ‚¨æƒ³è¿›è¡Œé‚£ç§æ“作?
+text_destroy_time_entries: åˆ é™¤ä¸ŠæŠ¥çš„å·¥ä½œé‡
+text_assign_time_entries_to_project: å°†å·²ä¸ŠæŠ¥çš„å·¥ä½œé‡æäº¤åˆ°é¡¹ç›®ä¸
+text_reassign_time_entries: 'å°†å·²ä¸ŠæŠ¥çš„å·¥ä½œé‡æŒ‡å®šåˆ°æ¤é—®é¢˜ï¼š'
+text_user_wrote: '%s 写到:'
+text_enumeration_category_reassign_to: '将它们关è”到新的枚举值:'
+text_enumeration_destroy_question: '%d 个对象被关è”到了这个枚举值。'
+text_email_delivery_not_configured: "邮件傿•°å°šæœªé…ç½®ï¼Œå› æ¤é‚®ä»¶é€šçŸ¥åŠŸèƒ½å·²è¢«ç¦ç”¨ã€‚\n请在config/email.ymlä¸é…置您的SMTPæœåŠ¡å™¨ä¿¡æ¯å¹¶é‡æ–°å¯åŠ¨ä»¥ä½¿å…¶ç”Ÿæ•ˆã€‚"
-default_role_manager: 管ç†å‘˜
+default_role_manager: 管ç†äººå‘˜
default_role_developper: å¼€å‘人员
default_role_reporter: 报告人员
-default_tracker_bug: 问题
+default_tracker_bug: 错误
default_tracker_feature: 功能
default_tracker_support: 支æŒ
default_issue_status_new: 新建
-default_issue_status_assigned: 已分é…
+default_issue_status_assigned: 已指派
default_issue_status_resolved: 已解决
-default_issue_status_feedback: 回å¤
+default_issue_status_feedback: å馈
default_issue_status_closed: 已关é—
-default_issue_status_rejected: 已打回
+default_issue_status_rejected: 已拒ç»
default_doc_category_user: 用户文档
default_doc_category_tech: 技术文档
default_priority_low: 低
@@ -510,40 +633,8 @@ default_priority_immediate: 立刻
default_activity_design: 设计
default_activity_development: å¼€å‘
-enumeration_issue_priorities: 任务优先级
+enumeration_issue_priorities: 问题优先级
enumeration_doc_categories: 文档类别
-enumeration_activities: Activities (time tracking)
-label_wiki_page: Wiki page
-label_file_plural: Files
-label_changeset_plural: Changesets
-field_column_names: Columns
-label_default_columns: Default columns
-setting_issue_list_default_columns: Default columns displayed on the issue list
-setting_repositories_encodings: Repositories encodings
-notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit."
-label_bulk_edit_selected_issues: Bulk edit selected issues
-label_no_change_option: (No change)
-notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s."
-label_theme: Theme
-label_default: Default
-label_search_titles_only: Search titles only
-label_nobody: nobody
-button_change_password: Change password
-text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)."
-label_user_mail_option_selected: "For any event on the selected projects only..."
-label_user_mail_option_all: "For any event on all my projects"
-label_user_mail_option_none: "Only for things I watch or I'm involved in"
-setting_emails_footer: Emails footer
-label_float: Float
-button_copy: Copy
-mail_body_account_information_external: You can use your "%s" account to log into Redmine.
-mail_body_account_information: Your Redmine account information
-setting_protocol: Protocol
-label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
-setting_time_format: Time format
-label_registration_activation_by_email: account activation by email
-mail_subject_account_activation_request: Redmine account activation request
-mail_body_account_activation_request: 'A new user (%s) has registered. His account his pending your approval:'
-label_registration_automatic_activation: automatic account activation
-label_registration_manual_activation: manual account activation
-notice_account_pending: "Your account was created and is now pending administrator approval."
+enumeration_activities: 活动(时间跟踪)
+button_quote: Quote
+setting_sequential_project_identifiers: Generate sequential project identifiers
diff --git a/lib/SVG/Graph/Graph.rb b/lib/SVG/Graph/Graph.rb
index 403a0202b..a5e1ea732 100644
--- a/lib/SVG/Graph/Graph.rb
+++ b/lib/SVG/Graph/Graph.rb
@@ -829,7 +829,7 @@ module SVG
@doc << DocType.new( %q{svg PUBLIC "-//W3C//DTD SVG 1.0//EN" } +
%q{"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"} )
if style_sheet && style_sheet != ''
- @doc << ProcessingInstruction.new( "xml-stylesheet",
+ @doc << Instruction.new( "xml-stylesheet",
%Q{href="#{style_sheet}" type="text/css"} )
end
@root = @doc.add_element( "svg", {
diff --git a/lib/ar_condition.rb b/lib/ar_condition.rb
new file mode 100644
index 000000000..30c5572ed
--- /dev/null
+++ b/lib/ar_condition.rb
@@ -0,0 +1,41 @@
+# redMine - project management software
+# Copyright (C) 2006-2008 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+class ARCondition
+ attr_reader :conditions
+
+ def initialize(condition=nil)
+ @conditions = ['1=1']
+ add(condition) if condition
+ end
+
+ def add(condition)
+ if condition.is_a?(Array)
+ @conditions.first << " AND (#{condition.first})"
+ @conditions += condition[1..-1]
+ elsif condition.is_a?(String)
+ @conditions.first << " AND (#{condition})"
+ else
+ raise "Unsupported #{condition.class} condition: #{condition}"
+ end
+ self
+ end
+
+ def <<(condition)
+ add(condition)
+ end
+end
diff --git a/lib/generators/redmine_plugin/USAGE b/lib/generators/redmine_plugin/USAGE
new file mode 100644
index 000000000..65a45d163
--- /dev/null
+++ b/lib/generators/redmine_plugin/USAGE
@@ -0,0 +1,18 @@
+Description:
+ The plugin generator creates stubs for a new Redmine plugin.
+
+Example:
+ ./script/generate redmine_plugin meetings
+ create vendor/plugins/redmine_meetings/app/controllers
+ create vendor/plugins/redmine_meetings/app/helpers
+ create vendor/plugins/redmine_meetings/app/models
+ create vendor/plugins/redmine_meetings/app/views
+ create vendor/plugins/redmine_meetings/db/migrate
+ create vendor/plugins/redmine_meetings/lib/tasks
+ create vendor/plugins/redmine_meetings/assets/images
+ create vendor/plugins/redmine_meetings/assets/javascripts
+ create vendor/plugins/redmine_meetings/assets/stylesheets
+ create vendor/plugins/redmine_meetings/lang
+ create vendor/plugins/redmine_meetings/README
+ create vendor/plugins/redmine_meetings/init.rb
+ create vendor/plugins/redmine_meetings/lang/en.yml
diff --git a/lib/generators/redmine_plugin/redmine_plugin_generator.rb b/lib/generators/redmine_plugin/redmine_plugin_generator.rb
new file mode 100644
index 000000000..666386abd
--- /dev/null
+++ b/lib/generators/redmine_plugin/redmine_plugin_generator.rb
@@ -0,0 +1,31 @@
+class RedminePluginGenerator < Rails::Generator::NamedBase
+ attr_reader :plugin_path, :plugin_name, :plugin_pretty_name
+
+ def initialize(runtime_args, runtime_options = {})
+ super
+ @plugin_name = "redmine_#{file_name.underscore}"
+ @plugin_pretty_name = plugin_name.titleize
+ @plugin_path = "vendor/plugins/#{plugin_name}"
+ end
+
+ def manifest
+ record do |m|
+ m.directory "#{plugin_path}/app/controllers"
+ m.directory "#{plugin_path}/app/helpers"
+ m.directory "#{plugin_path}/app/models"
+ m.directory "#{plugin_path}/app/views"
+ m.directory "#{plugin_path}/db/migrate"
+ m.directory "#{plugin_path}/lib/tasks"
+ m.directory "#{plugin_path}/assets/images"
+ m.directory "#{plugin_path}/assets/javascripts"
+ m.directory "#{plugin_path}/assets/stylesheets"
+ m.directory "#{plugin_path}/lang"
+ m.directory "#{plugin_path}/test"
+
+ m.template 'README', "#{plugin_path}/README"
+ m.template 'init.rb', "#{plugin_path}/init.rb"
+ m.template 'en.yml', "#{plugin_path}/lang/en.yml"
+ m.template 'test_helper.rb', "#{plugin_path}/test/test_helper.rb"
+ end
+ end
+end
diff --git a/lib/generators/redmine_plugin/templates/README b/lib/generators/redmine_plugin/templates/README
new file mode 100644
index 000000000..7a31a890e
--- /dev/null
+++ b/lib/generators/redmine_plugin/templates/README
@@ -0,0 +1,3 @@
+= <%= file_name %>
+
+Description goes here
diff --git a/lib/generators/redmine_plugin/templates/en.yml b/lib/generators/redmine_plugin/templates/en.yml
new file mode 100644
index 000000000..e338591ef
--- /dev/null
+++ b/lib/generators/redmine_plugin/templates/en.yml
@@ -0,0 +1,2 @@
+# English strings go here
+my_label: "My label"
diff --git a/lib/generators/redmine_plugin/templates/init.rb b/lib/generators/redmine_plugin/templates/init.rb
new file mode 100644
index 000000000..1ffcd7bb8
--- /dev/null
+++ b/lib/generators/redmine_plugin/templates/init.rb
@@ -0,0 +1,8 @@
+require 'redmine'
+
+Redmine::Plugin.register :<%= plugin_name %> do
+ name '<%= plugin_pretty_name %> plugin'
+ author 'Author name'
+ description 'This is a plugin for Redmine'
+ version '0.0.1'
+end
diff --git a/lib/generators/redmine_plugin/templates/test_helper.rb b/lib/generators/redmine_plugin/templates/test_helper.rb
new file mode 100644
index 000000000..bd1ed0c5d
--- /dev/null
+++ b/lib/generators/redmine_plugin/templates/test_helper.rb
@@ -0,0 +1,5 @@
+# Load the normal Rails helper
+require File.expand_path(File.dirname(__FILE__) + '/../../../../test/test_helper')
+
+# Ensure that we are using the temporary fixture path
+Engines::Testing.set_fixture_path
diff --git a/lib/generators/redmine_plugin_controller/USAGE b/lib/generators/redmine_plugin_controller/USAGE
new file mode 100644
index 000000000..8336e7117
--- /dev/null
+++ b/lib/generators/redmine_plugin_controller/USAGE
@@ -0,0 +1,5 @@
+Description:
+ Generates a plugin controller.
+
+Example:
+ ./script/generate redmine_plugin_controller MyPlugin Pools index show vote
diff --git a/lib/generators/redmine_plugin_controller/redmine_plugin_controller_generator.rb b/lib/generators/redmine_plugin_controller/redmine_plugin_controller_generator.rb
new file mode 100644
index 000000000..533d65ce8
--- /dev/null
+++ b/lib/generators/redmine_plugin_controller/redmine_plugin_controller_generator.rb
@@ -0,0 +1,18 @@
+require 'rails_generator/base'
+require 'rails_generator/generators/components/controller/controller_generator'
+
+class RedminePluginControllerGenerator < ControllerGenerator
+ attr_reader :plugin_path, :plugin_name, :plugin_pretty_name
+
+ def initialize(runtime_args, runtime_options = {})
+ runtime_args = runtime_args.dup
+ @plugin_name = "redmine_" + runtime_args.shift.underscore
+ @plugin_pretty_name = plugin_name.titleize
+ @plugin_path = "vendor/plugins/#{plugin_name}"
+ super(runtime_args, runtime_options)
+ end
+
+ def destination_root
+ File.join(RAILS_ROOT, plugin_path)
+ end
+end
diff --git a/lib/generators/redmine_plugin_controller/templates/controller.rb b/lib/generators/redmine_plugin_controller/templates/controller.rb
new file mode 100644
index 000000000..615986d9e
--- /dev/null
+++ b/lib/generators/redmine_plugin_controller/templates/controller.rb
@@ -0,0 +1,7 @@
+class <%= class_name %>Controller < ApplicationController
+<% actions.each do |action| -%>
+
+ def <%= action %>
+ end
+<% end -%>
+end
diff --git a/lib/generators/redmine_plugin_controller/templates/functional_test.rb b/lib/generators/redmine_plugin_controller/templates/functional_test.rb
new file mode 100644
index 000000000..876bd79e2
--- /dev/null
+++ b/lib/generators/redmine_plugin_controller/templates/functional_test.rb
@@ -0,0 +1,8 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class <%= class_name %>ControllerTest < ActionController::TestCase
+ # Replace this with your real tests.
+ def test_truth
+ assert true
+ end
+end
diff --git a/lib/generators/redmine_plugin_controller/templates/helper.rb b/lib/generators/redmine_plugin_controller/templates/helper.rb
new file mode 100644
index 000000000..3fe2ecdc7
--- /dev/null
+++ b/lib/generators/redmine_plugin_controller/templates/helper.rb
@@ -0,0 +1,2 @@
+module <%= class_name %>Helper
+end
diff --git a/lib/generators/redmine_plugin_controller/templates/view.html.erb b/lib/generators/redmine_plugin_controller/templates/view.html.erb
new file mode 100644
index 000000000..c24afaa6e
--- /dev/null
+++ b/lib/generators/redmine_plugin_controller/templates/view.html.erb
@@ -0,0 +1 @@
+<%= class_name %>#<%= action %>
diff --git a/lib/generators/redmine_plugin_model/USAGE b/lib/generators/redmine_plugin_model/USAGE
new file mode 100644
index 000000000..0cb55a186
--- /dev/null
+++ b/lib/generators/redmine_plugin_model/USAGE
@@ -0,0 +1,5 @@
+Description:
+ Generates a plugin model.
+
+Examples:
+ ./script/generate redmine_plugin_model MyPlugin pool title:string question:text
diff --git a/lib/generators/redmine_plugin_model/redmine_plugin_model_generator.rb b/lib/generators/redmine_plugin_model/redmine_plugin_model_generator.rb
new file mode 100644
index 000000000..b712d9b07
--- /dev/null
+++ b/lib/generators/redmine_plugin_model/redmine_plugin_model_generator.rb
@@ -0,0 +1,18 @@
+require 'rails_generator/base'
+require 'rails_generator/generators/components/model/model_generator'
+
+class RedminePluginModelGenerator < ModelGenerator
+ attr_accessor :plugin_path, :plugin_name, :plugin_pretty_name
+
+ def initialize(runtime_args, runtime_options = {})
+ runtime_args = runtime_args.dup
+ @plugin_name = "redmine_" + runtime_args.shift.underscore
+ @plugin_pretty_name = plugin_name.titleize
+ @plugin_path = "vendor/plugins/#{plugin_name}"
+ super(runtime_args, runtime_options)
+ end
+
+ def destination_root
+ File.join(RAILS_ROOT, plugin_path)
+ end
+end
diff --git a/lib/generators/redmine_plugin_model/templates/fixtures.yml b/lib/generators/redmine_plugin_model/templates/fixtures.yml
new file mode 100644
index 000000000..6be3c81be
--- /dev/null
+++ b/lib/generators/redmine_plugin_model/templates/fixtures.yml
@@ -0,0 +1,11 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+ id: 1
+<% for attribute in attributes -%>
+ <%= attribute.name %>: <%= attribute.default %>
+<% end -%>
+two:
+ id: 2
+<% for attribute in attributes -%>
+ <%= attribute.name %>: <%= attribute.default %>
+<% end -%>
diff --git a/lib/generators/redmine_plugin_model/templates/migration.rb b/lib/generators/redmine_plugin_model/templates/migration.rb
new file mode 100644
index 000000000..2a305a6a9
--- /dev/null
+++ b/lib/generators/redmine_plugin_model/templates/migration.rb
@@ -0,0 +1,13 @@
+class <%= migration_name %> < ActiveRecord::Migration
+ def self.up
+ create_table :<%= table_name %> do |t|
+<% for attribute in attributes -%>
+ t.column :<%= attribute.name %>, :<%= attribute.type %>
+<% end -%>
+ end
+ end
+
+ def self.down
+ drop_table :<%= table_name %>
+ end
+end
diff --git a/lib/generators/redmine_plugin_model/templates/model.rb b/lib/generators/redmine_plugin_model/templates/model.rb
new file mode 100644
index 000000000..8d4c89e91
--- /dev/null
+++ b/lib/generators/redmine_plugin_model/templates/model.rb
@@ -0,0 +1,2 @@
+class <%= class_name %> < ActiveRecord::Base
+end
diff --git a/lib/generators/redmine_plugin_model/templates/unit_test.rb b/lib/generators/redmine_plugin_model/templates/unit_test.rb
new file mode 100644
index 000000000..cc8b2e591
--- /dev/null
+++ b/lib/generators/redmine_plugin_model/templates/unit_test.rb
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class <%= class_name %>Test < Test::Unit::TestCase
+ fixtures :<%= table_name %>
+
+ # Replace this with your real tests.
+ def test_truth
+ assert true
+ end
+end
diff --git a/lib/redcloth.rb b/lib/redcloth.rb
index ae70db747..df19de22d 100644
--- a/lib/redcloth.rb
+++ b/lib/redcloth.rb
@@ -272,7 +272,7 @@ class RedCloth < String
@shelf = []
textile_rules = [:refs_textile, :block_textile_table, :block_textile_lists,
:block_textile_prefix, :inline_textile_image, :inline_textile_link,
- :inline_textile_code, :inline_textile_span, :glyphs_textile]
+ :inline_textile_code, :inline_textile_span]
markdown_rules = [:refs_markdown, :block_markdown_setext, :block_markdown_atx, :block_markdown_rule,
:block_markdown_bq, :block_markdown_lists,
:inline_markdown_reflink, :inline_markdown_link]
@@ -295,9 +295,12 @@ class RedCloth < String
@pre_list = []
rip_offtags text
no_textile text
+ escape_html_tags text
hard_break text
unless @lite_mode
refs text
+ # need to do this before text is split by #blocks
+ block_textile_quotes text
blocks text
end
inline text
@@ -375,18 +378,18 @@ class RedCloth < String
re =
case rtype
when :limit
- /(\W)
+ /(^|[>\s\(])
(#{rcq})
(#{C})
(?::(\S+?))?
- (\S.*?\S|\S)
+ ([^\s\-].*?[^\s\-]|\w)
#{rcq}
- (?=\W)/x
+ (?=[[:punct:]]|\s|\)|$)/x
else
/(#{rcq})
(#{C})
(?::(\S+))?
- (\S.*?\S|\S)
+ ([^\s\-].*?[^\s\-]|\w)
#{rcq}/xm
end
[rc, ht, re, rtype]
@@ -395,15 +398,15 @@ class RedCloth < String
# Elements to handle
GLYPHS = [
# [ /([^\s\[{(>])?\'([dmst]\b|ll\b|ve\b|\s|:|$)/, '\1’\2' ], # single closing
- [ /([^\s\[{(>#{PUNCT_Q}][#{PUNCT_Q}]*)\'/, '\1’' ], # single closing
- [ /\'(?=[#{PUNCT_Q}]*(s\b|[\s#{PUNCT_NOQ}]))/, '’' ], # single closing
- [ /\'/, '‘' ], # single opening
+ # [ /([^\s\[{(>#{PUNCT_Q}][#{PUNCT_Q}]*)\'/, '\1’' ], # single closing
+ # [ /\'(?=[#{PUNCT_Q}]*(s\b|[\s#{PUNCT_NOQ}]))/, '’' ], # single closing
+ # [ /\'/, '‘' ], # single opening
[ /, '<' ], # less-than
[ />/, '>' ], # greater-than
# [ /([^\s\[{(])?"(\s|:|$)/, '\1”\2' ], # double closing
- [ /([^\s\[{(>#{PUNCT_Q}][#{PUNCT_Q}]*)"/, '\1”' ], # double closing
- [ /"(?=[#{PUNCT_Q}]*[\s#{PUNCT_NOQ}])/, '”' ], # double closing
- [ /"/, '“' ], # double opening
+ # [ /([^\s\[{(>#{PUNCT_Q}][#{PUNCT_Q}]*)"/, '\1”' ], # double closing
+ # [ /"(?=[#{PUNCT_Q}]*[\s#{PUNCT_NOQ}])/, '”' ], # double closing
+ # [ /"/, '“' ], # double opening
[ /\b( )?\.{3}/, '\1…' ], # ellipsis
[ /\b([A-Z][A-Z0-9]{2,})\b(?:[(]([^)]*)[)])/, '\1 ' ], # 3+ uppercase acronym
[ /(^|[^"][>\s])([A-Z][A-Z0-9 ]+[A-Z0-9])([^\2\3', :no_span_caps ], # 3+ uppercase caps
@@ -501,25 +504,19 @@ class RedCloth < String
tatts = shelve( tatts ) if tatts
rows = []
- fullrow.
- split( /\|$/m ).
- delete_if { |x| x.empty? }.
- each do |row|
-
+ fullrow.each_line do |row|
ratts, row = pba( $1, 'tr' ), $2 if row =~ /^(#{A}#{C}\. )(.*)/m
-
cells = []
- row.split( '|' ).each do |cell|
+ row.split( /(\|)(?![^\[\|]*\]\])/ )[1..-2].each do |cell|
+ next if cell == '|'
ctyp = 'd'
ctyp = 'h' if cell =~ /^_/
catts = ''
catts, cell = pba( $1, 'td' ), $2 if cell =~ /^(_?#{S}#{A}#{C}\. ?)(.*)/
- unless cell.strip.empty?
- catts = shelve( catts ) if catts
- cells << "\t\t\t#{ cell } "
- end
+ catts = shelve( catts ) if catts
+ cells << "\t\t\t#{ cell } "
end
ratts = shelve( ratts ) if ratts
rows << "\t\t\n#{ cells.join( "\n" ) }\n\t\t "
@@ -574,6 +571,29 @@ class RedCloth < String
lines.join( "\n" )
end
end
+
+ QUOTES_RE = /(^>+([^\n]*?)\n?)+/m
+ QUOTES_CONTENT_RE = /^([> ]+)(.*)$/m
+
+ def block_textile_quotes( text )
+ text.gsub!( QUOTES_RE ) do |match|
+ lines = match.split( /\n/ )
+ quotes = ''
+ indent = 0
+ lines.each do |line|
+ line =~ QUOTES_CONTENT_RE
+ bq,content = $1, $2
+ l = bq.count('>')
+ if l != indent
+ quotes << ("\n\n" + (l>indent ? '' * (l-indent) : ' ' * (indent-l)) + "\n\n")
+ indent = l
+ end
+ quotes << (content + "\n")
+ end
+ quotes << ("\n" + '' * indent + "\n\n")
+ quotes
+ end
+ end
CODE_RE = /(\W)
@
@@ -724,7 +744,7 @@ class RedCloth < String
end
MARKDOWN_RULE_RE = /^(#{
- ['*', '-', '_'].collect { |ch| '( ?' + Regexp::quote( ch ) + ' ?){3,}' }.join( '|' )
+ ['*', '-', '_'].collect { |ch| ' ?(' + Regexp::quote( ch ) + ' ?){3,}' }.join( '|' )
})$/
def block_markdown_rule( text )
@@ -762,11 +782,11 @@ class RedCloth < String
([\s\[{(]|[#{PUNCT}])? # $pre
" # start
(#{C}) # $atts
- ([^"]+?) # $text
+ ([^"\n]+?) # $text
\s?
(?:\(([^)]+?)\)(?="))? # $title
":
- (\S+?) # $url
+ ([\w\/]\S+?) # $url
(\/)? # $slash
([^\w\/;]*?) # $post
(?=<|\s|$)
@@ -784,7 +804,7 @@ class RedCloth < String
atts << " title=\"#{ title }\"" if title
atts = shelve( atts ) if atts
- external = (url =~ /^http:\/\//) ? ' class="external"' : ''
+ external = (url =~ /^https?:\/\//) ? ' class="external"' : ''
"#{ pre }#{ text } #{ post }"
end
@@ -1128,5 +1148,11 @@ class RedCloth < String
end
end
end
+
+ ALLOWED_TAGS = %w(redpre pre code notextile)
+
+ def escape_html_tags(text)
+ text.gsub!(%r{<(\/?([!\w]+)[^<>\n]*)(>?)}) {|m| ALLOWED_TAGS.include?($2) ? "<#{$1}#{$3}" : "<#{$1}#{'>' unless $3.blank?}" }
+ end
end
diff --git a/lib/redmine.rb b/lib/redmine.rb
index 959cfc0c8..3ba2f2cc3 100644
--- a/lib/redmine.rb
+++ b/lib/redmine.rb
@@ -1,7 +1,10 @@
require 'redmine/access_control'
require 'redmine/menu_manager'
+require 'redmine/activity'
require 'redmine/mime_type'
+require 'redmine/core_ext'
require 'redmine/themes'
+require 'redmine/hook'
require 'redmine/plugin'
begin
@@ -10,7 +13,7 @@ rescue LoadError
# RMagick is not available
end
-REDMINE_SUPPORTED_SCM = %w( Subversion Darcs Mercurial Cvs )
+REDMINE_SUPPORTED_SCM = %w( Subversion Darcs Mercurial Cvs Bazaar Git Filesystem )
# Permissions
Redmine::AccessControl.map do |map|
@@ -27,15 +30,16 @@ Redmine::AccessControl.map do |map|
# Issues
map.permission :view_issues, {:projects => [:changelog, :roadmap],
:issues => [:index, :changes, :show, :context_menu],
+ :versions => [:show, :status_by],
:queries => :index,
:reports => :issue_report}, :public => true
- map.permission :add_issues, {:projects => :add_issue}, :require => :loggedin
- map.permission :edit_issues, {:projects => :bulk_edit_issues,
- :issues => [:edit, :destroy_attachment]}, :require => :loggedin
- map.permission :manage_issue_relations, {:issue_relations => [:new, :destroy]}, :require => :loggedin
- map.permission :add_issue_notes, {:issues => :add_note}, :require => :loggedin
- map.permission :change_issue_status, {:issues => :change_status}, :require => :loggedin
- map.permission :move_issues, {:projects => :move_issues}, :require => :loggedin
+ map.permission :add_issues, {:issues => :new}
+ map.permission :edit_issues, {:issues => [:edit, :reply, :bulk_edit, :destroy_attachment]}
+ map.permission :manage_issue_relations, {:issue_relations => [:new, :destroy]}
+ map.permission :add_issue_notes, {:issues => [:edit, :reply]}
+ map.permission :edit_issue_notes, {:journals => :edit}, :require => :loggedin
+ map.permission :edit_own_issue_notes, {:journals => :edit}, :require => :loggedin
+ map.permission :move_issues, {:issues => :move}, :require => :loggedin
map.permission :delete_issues, {:issues => :destroy}, :require => :member
# Queries
map.permission :manage_public_queries, {:queries => [:new, :edit, :destroy]}, :require => :member
@@ -43,22 +47,27 @@ Redmine::AccessControl.map do |map|
# Gantt & calendar
map.permission :view_gantt, :projects => :gantt
map.permission :view_calendar, :projects => :calendar
+ # Watchers
+ map.permission :view_issue_watchers, {}
+ map.permission :add_issue_watchers, {:watchers => :new}
end
map.project_module :time_tracking do |map|
map.permission :log_time, {:timelog => :edit}, :require => :loggedin
map.permission :view_time_entries, :timelog => [:details, :report]
+ map.permission :edit_time_entries, {:timelog => [:edit, :destroy]}, :require => :member
+ map.permission :edit_own_time_entries, {:timelog => [:edit, :destroy]}, :require => :loggedin
end
map.project_module :news do |map|
- map.permission :manage_news, {:projects => :add_news, :news => [:edit, :destroy, :destroy_comment]}, :require => :member
+ map.permission :manage_news, {:news => [:new, :edit, :destroy, :destroy_comment]}, :require => :member
map.permission :view_news, {:news => [:index, :show]}, :public => true
- map.permission :comment_news, {:news => :add_comment}, :require => :loggedin
+ map.permission :comment_news, {:news => :add_comment}
end
map.project_module :documents do |map|
- map.permission :manage_documents, {:projects => :add_document, :documents => [:edit, :destroy, :add_attachment, :destroy_attachment]}, :require => :loggedin
- map.permission :view_documents, :projects => :list_documents, :documents => [:show, :download]
+ map.permission :manage_documents, {:documents => [:new, :edit, :destroy, :add_attachment, :destroy_attachment]}, :require => :loggedin
+ map.permission :view_documents, :documents => [:index, :show, :download]
end
map.project_module :files do |map|
@@ -70,34 +79,71 @@ Redmine::AccessControl.map do |map|
map.permission :manage_wiki, {:wikis => [:edit, :destroy]}, :require => :member
map.permission :rename_wiki_pages, {:wiki => :rename}, :require => :member
map.permission :delete_wiki_pages, {:wiki => :destroy}, :require => :member
- map.permission :view_wiki_pages, :wiki => [:index, :history, :diff, :special]
+ map.permission :view_wiki_pages, :wiki => [:index, :history, :diff, :annotate, :special]
map.permission :edit_wiki_pages, :wiki => [:edit, :preview, :add_attachment, :destroy_attachment]
+ map.permission :protect_wiki_pages, {:wiki => :protect}, :require => :member
end
map.project_module :repository do |map|
map.permission :manage_repository, {:repositories => [:edit, :destroy]}, :require => :member
- map.permission :browse_repository, :repositories => [:show, :browse, :entry, :changes, :diff, :stats, :graph]
+ map.permission :browse_repository, :repositories => [:show, :browse, :entry, :annotate, :changes, :diff, :stats, :graph]
map.permission :view_changesets, :repositories => [:show, :revisions, :revision]
end
map.project_module :boards do |map|
map.permission :manage_boards, {:boards => [:new, :edit, :destroy]}, :require => :member
map.permission :view_messages, {:boards => [:index, :show], :messages => [:show]}, :public => true
- map.permission :add_messages, {:messages => [:new, :reply]}, :require => :loggedin
+ map.permission :add_messages, {:messages => [:new, :reply, :quote]}
+ map.permission :edit_messages, {:messages => :edit}, :require => :member
+ map.permission :delete_messages, {:messages => :destroy}, :require => :member
end
end
-# Project menu configuration
-Redmine::MenuManager.map :project_menu do |menu|
- menu.push :label_overview, :controller => 'projects', :action => 'show'
- menu.push :label_activity, :controller => 'projects', :action => 'activity'
- menu.push :label_roadmap, :controller => 'projects', :action => 'roadmap'
- menu.push :label_issue_plural, { :controller => 'issues', :action => 'index' }, :param => :project_id
- menu.push :label_news_plural, { :controller => 'news', :action => 'index' }, :param => :project_id
- menu.push :label_document_plural, :controller => 'projects', :action => 'list_documents'
- menu.push :label_wiki, { :controller => 'wiki', :action => 'index', :page => nil }, :if => Proc.new { |p| p.wiki && !p.wiki.new_record? }
- menu.push :label_board_plural, { :controller => 'boards', :action => 'index', :id => nil }, :param => :project_id, :if => Proc.new { |p| p.boards.any? }
- menu.push :label_attachment_plural, :controller => 'projects', :action => 'list_files'
- menu.push :label_repository, { :controller => 'repositories', :action => 'show' }, :if => Proc.new { |p| p.repository && !p.repository.new_record? }
- menu.push :label_settings, :controller => 'projects', :action => 'settings'
+Redmine::MenuManager.map :top_menu do |menu|
+ menu.push :home, :home_path, :html => { :class => 'home' }
+ menu.push :my_page, { :controller => 'my', :action => 'page' }, :html => { :class => 'mypage' }, :if => Proc.new { User.current.logged? }
+ menu.push :projects, { :controller => 'projects', :action => 'index' }, :caption => :label_project_plural, :html => { :class => 'projects' }
+ menu.push :administration, { :controller => 'admin', :action => 'index' }, :html => { :class => 'admin' }, :if => Proc.new { User.current.admin? }, :last => true
+ menu.push :help, Redmine::Info.help_url, :html => { :class => 'help' }, :last => true
+end
+
+Redmine::MenuManager.map :account_menu do |menu|
+ menu.push :login, :signin_path, :html => { :class => 'login' }, :if => Proc.new { !User.current.logged? }
+ menu.push :register, { :controller => 'account', :action => 'register' }, :html => { :class => 'register' }, :if => Proc.new { !User.current.logged? && Setting.self_registration? }
+ menu.push :my_account, { :controller => 'my', :action => 'account' }, :html => { :class => 'myaccount' }, :if => Proc.new { User.current.logged? }
+ menu.push :logout, :signout_path, :html => { :class => 'logout' }, :if => Proc.new { User.current.logged? }
+end
+
+Redmine::MenuManager.map :application_menu do |menu|
+ # Empty
+end
+
+Redmine::MenuManager.map :project_menu do |menu|
+ menu.push :overview, { :controller => 'projects', :action => 'show' }
+ menu.push :activity, { :controller => 'projects', :action => 'activity' }
+ menu.push :roadmap, { :controller => 'projects', :action => 'roadmap' },
+ :if => Proc.new { |p| p.versions.any? }
+ menu.push :issues, { :controller => 'issues', :action => 'index' }, :param => :project_id, :caption => :label_issue_plural
+ menu.push :new_issue, { :controller => 'issues', :action => 'new' }, :param => :project_id, :caption => :label_issue_new,
+ :html => { :accesskey => Redmine::AccessKeys.key_for(:new_issue) }
+ menu.push :news, { :controller => 'news', :action => 'index' }, :param => :project_id, :caption => :label_news_plural
+ menu.push :documents, { :controller => 'documents', :action => 'index' }, :param => :project_id, :caption => :label_document_plural
+ menu.push :wiki, { :controller => 'wiki', :action => 'index', :page => nil },
+ :if => Proc.new { |p| p.wiki && !p.wiki.new_record? }
+ menu.push :boards, { :controller => 'boards', :action => 'index', :id => nil }, :param => :project_id,
+ :if => Proc.new { |p| p.boards.any? }, :caption => :label_board_plural
+ menu.push :files, { :controller => 'projects', :action => 'list_files' }, :caption => :label_attachment_plural
+ menu.push :repository, { :controller => 'repositories', :action => 'show' },
+ :if => Proc.new { |p| p.repository && !p.repository.new_record? }
+ menu.push :settings, { :controller => 'projects', :action => 'settings' }, :last => true
+end
+
+Redmine::Activity.map do |activity|
+ activity.register :issues, :class_name => %w(Issue Journal)
+ activity.register :changesets
+ activity.register :news
+ activity.register :documents, :class_name => %w(Document Attachment)
+ activity.register :files, :class_name => 'Attachment'
+ activity.register :wiki_pages, :class_name => 'WikiContent::Version', :default => false
+ activity.register :messages, :default => false
end
diff --git a/lib/redmine/access_keys.rb b/lib/redmine/access_keys.rb
new file mode 100644
index 000000000..96029a6fc
--- /dev/null
+++ b/lib/redmine/access_keys.rb
@@ -0,0 +1,31 @@
+# redMine - project management software
+# Copyright (C) 2006-2008 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+module Redmine
+ module AccessKeys
+ ACCESSKEYS = {:edit => 'e',
+ :preview => 'r',
+ :quick_search => 'f',
+ :search => '4',
+ :new_issue => '7'
+ }.freeze unless const_defined?(:ACCESSKEYS)
+
+ def self.key_for(action)
+ ACCESSKEYS[action]
+ end
+ end
+end
diff --git a/lib/redmine/activity.rb b/lib/redmine/activity.rb
new file mode 100644
index 000000000..565a53f36
--- /dev/null
+++ b/lib/redmine/activity.rb
@@ -0,0 +1,46 @@
+# Redmine - project management software
+# Copyright (C) 2006-2008 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+module Redmine
+ module Activity
+
+ mattr_accessor :available_event_types, :default_event_types, :providers
+
+ @@available_event_types = []
+ @@default_event_types = []
+ @@providers = Hash.new {|h,k| h[k]=[] }
+
+ class << self
+ def map(&block)
+ yield self
+ end
+
+ # Registers an activity provider
+ def register(event_type, options={})
+ options.assert_valid_keys(:class_name, :default)
+
+ event_type = event_type.to_s
+ providers = options[:class_name] || event_type.classify
+ providers = ([] << providers) unless providers.is_a?(Array)
+
+ @@available_event_types << event_type unless @@available_event_types.include?(event_type)
+ @@default_event_types << event_type unless options[:default] == false
+ @@providers[event_type] += providers
+ end
+ end
+ end
+end
diff --git a/lib/redmine/activity/fetcher.rb b/lib/redmine/activity/fetcher.rb
new file mode 100644
index 000000000..adaead564
--- /dev/null
+++ b/lib/redmine/activity/fetcher.rb
@@ -0,0 +1,79 @@
+# Redmine - project management software
+# Copyright (C) 2006-2008 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+module Redmine
+ module Activity
+ # Class used to retrieve activity events
+ class Fetcher
+ attr_reader :user, :project, :scope
+
+ # Needs to be unloaded in development mode
+ @@constantized_providers = Hash.new {|h,k| h[k] = Redmine::Activity.providers[k].collect {|t| t.constantize } }
+
+ def initialize(user, options={})
+ options.assert_valid_keys(:project, :with_subprojects)
+ @user = user
+ @project = options[:project]
+ @options = options
+
+ @scope = event_types
+ end
+
+ # Returns an array of available event types
+ def event_types
+ return @event_types unless @event_types.nil?
+
+ @event_types = Redmine::Activity.available_event_types
+ @event_types = @event_types.select {|o| @user.allowed_to?("view_#{o}".to_sym, @project)} if @project
+ @event_types
+ end
+
+ # Yields to filter the activity scope
+ def scope_select(&block)
+ @scope = @scope.select {|t| yield t }
+ end
+
+ # Sets the scope
+ def scope=(s)
+ @scope = s & event_types
+ end
+
+ # Resets the scope to the default scope
+ def default_scope!
+ @scope = Redmine::Activity.default_event_types
+ end
+
+ # Returns an array of events for the given date range
+ def events(from, to)
+ e = []
+
+ @scope.each do |event_type|
+ constantized_providers(event_type).each do |provider|
+ e += provider.find_events(event_type, @user, from, to, @options)
+ end
+ end
+ e
+ end
+
+ private
+
+ def constantized_providers(event_type)
+ @@constantized_providers[event_type]
+ end
+ end
+ end
+end
diff --git a/lib/redmine/core_ext.rb b/lib/redmine/core_ext.rb
new file mode 100644
index 000000000..573313e74
--- /dev/null
+++ b/lib/redmine/core_ext.rb
@@ -0,0 +1 @@
+Dir[File.dirname(__FILE__) + "/core_ext/*.rb"].each { |file| require(file) }
diff --git a/lib/redmine/core_ext/string.rb b/lib/redmine/core_ext/string.rb
new file mode 100644
index 000000000..ce2646fb9
--- /dev/null
+++ b/lib/redmine/core_ext/string.rb
@@ -0,0 +1,5 @@
+require File.dirname(__FILE__) + '/string/conversions'
+
+class String #:nodoc:
+ include Redmine::CoreExtensions::String::Conversions
+end
diff --git a/lib/redmine/core_ext/string/conversions.rb b/lib/redmine/core_ext/string/conversions.rb
new file mode 100644
index 000000000..41149f5ea
--- /dev/null
+++ b/lib/redmine/core_ext/string/conversions.rb
@@ -0,0 +1,40 @@
+# redMine - project management software
+# Copyright (C) 2008 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+module Redmine #:nodoc:
+ module CoreExtensions #:nodoc:
+ module String #:nodoc:
+ # Custom string conversions
+ module Conversions
+ # Parses hours format and returns a float
+ def to_hours
+ s = self.dup
+ s.strip!
+ unless s =~ %r{^[\d\.,]+$}
+ # 2:30 => 2.5
+ s.gsub!(%r{^(\d+):(\d+)$}) { $1.to_i + $2.to_i / 60.0 }
+ # 2h30, 2h, 30m => 2.5, 2, 0.5
+ s.gsub!(%r{^((\d+)\s*(h|hours?))?\s*((\d+)\s*(m|min)?)?$}) { |m| ($1 || $4) ? ($2.to_i + $5.to_i / 60.0) : m[0] }
+ end
+ # 2,5 => 2.5
+ s.gsub!(',', '.')
+ begin; Kernel.Float(s); rescue; nil; end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/redmine/default_data/loader.rb b/lib/redmine/default_data/loader.rb
new file mode 100644
index 000000000..11bd2a0b4
--- /dev/null
+++ b/lib/redmine/default_data/loader.rb
@@ -0,0 +1,169 @@
+# redMine - project management software
+# Copyright (C) 2006-2007 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+module Redmine
+ module DefaultData
+ class DataAlreadyLoaded < Exception; end
+
+ module Loader
+ include GLoc
+
+ class << self
+ # Returns true if no data is already loaded in the database
+ # otherwise false
+ def no_data?
+ !Role.find(:first, :conditions => {:builtin => 0}) &&
+ !Tracker.find(:first) &&
+ !IssueStatus.find(:first) &&
+ !Enumeration.find(:first)
+ end
+
+ # Loads the default data
+ # Raises a RecordNotSaved exception if something goes wrong
+ def load(lang=nil)
+ raise DataAlreadyLoaded.new("Some configuration data is already loaded.") unless no_data?
+ set_language_if_valid(lang)
+
+ Role.transaction do
+ # Roles
+ manager = Role.create! :name => l(:default_role_manager),
+ :position => 1
+ manager.permissions = manager.setable_permissions.collect {|p| p.name}
+ manager.save!
+
+ developper = Role.create! :name => l(:default_role_developper),
+ :position => 2,
+ :permissions => [:manage_versions,
+ :manage_categories,
+ :add_issues,
+ :edit_issues,
+ :manage_issue_relations,
+ :add_issue_notes,
+ :save_queries,
+ :view_gantt,
+ :view_calendar,
+ :log_time,
+ :view_time_entries,
+ :comment_news,
+ :view_documents,
+ :view_wiki_pages,
+ :edit_wiki_pages,
+ :delete_wiki_pages,
+ :add_messages,
+ :view_files,
+ :manage_files,
+ :browse_repository,
+ :view_changesets]
+
+ reporter = Role.create! :name => l(:default_role_reporter),
+ :position => 3,
+ :permissions => [:add_issues,
+ :add_issue_notes,
+ :save_queries,
+ :view_gantt,
+ :view_calendar,
+ :log_time,
+ :view_time_entries,
+ :comment_news,
+ :view_documents,
+ :view_wiki_pages,
+ :add_messages,
+ :view_files,
+ :browse_repository,
+ :view_changesets]
+
+ Role.non_member.update_attribute :permissions, [:add_issues,
+ :add_issue_notes,
+ :save_queries,
+ :view_gantt,
+ :view_calendar,
+ :view_time_entries,
+ :comment_news,
+ :view_documents,
+ :view_wiki_pages,
+ :add_messages,
+ :view_files,
+ :browse_repository,
+ :view_changesets]
+
+ Role.anonymous.update_attribute :permissions, [:view_gantt,
+ :view_calendar,
+ :view_time_entries,
+ :view_documents,
+ :view_wiki_pages,
+ :view_files,
+ :browse_repository,
+ :view_changesets]
+
+ # Trackers
+ Tracker.create!(:name => l(:default_tracker_bug), :is_in_chlog => true, :is_in_roadmap => false, :position => 1)
+ Tracker.create!(:name => l(:default_tracker_feature), :is_in_chlog => true, :is_in_roadmap => true, :position => 2)
+ Tracker.create!(:name => l(:default_tracker_support), :is_in_chlog => false, :is_in_roadmap => false, :position => 3)
+
+ # Issue statuses
+ new = IssueStatus.create!(:name => l(:default_issue_status_new), :is_closed => false, :is_default => true, :position => 1)
+ assigned = IssueStatus.create!(:name => l(:default_issue_status_assigned), :is_closed => false, :is_default => false, :position => 2)
+ resolved = IssueStatus.create!(:name => l(:default_issue_status_resolved), :is_closed => false, :is_default => false, :position => 3)
+ feedback = IssueStatus.create!(:name => l(:default_issue_status_feedback), :is_closed => false, :is_default => false, :position => 4)
+ closed = IssueStatus.create!(:name => l(:default_issue_status_closed), :is_closed => true, :is_default => false, :position => 5)
+ rejected = IssueStatus.create!(:name => l(:default_issue_status_rejected), :is_closed => true, :is_default => false, :position => 6)
+
+ # Workflow
+ Tracker.find(:all).each { |t|
+ IssueStatus.find(:all).each { |os|
+ IssueStatus.find(:all).each { |ns|
+ Workflow.create!(:tracker_id => t.id, :role_id => manager.id, :old_status_id => os.id, :new_status_id => ns.id) unless os == ns
+ }
+ }
+ }
+
+ Tracker.find(:all).each { |t|
+ [new, assigned, resolved, feedback].each { |os|
+ [assigned, resolved, feedback, closed].each { |ns|
+ Workflow.create!(:tracker_id => t.id, :role_id => developper.id, :old_status_id => os.id, :new_status_id => ns.id) unless os == ns
+ }
+ }
+ }
+
+ Tracker.find(:all).each { |t|
+ [new, assigned, resolved, feedback].each { |os|
+ [closed].each { |ns|
+ Workflow.create!(:tracker_id => t.id, :role_id => reporter.id, :old_status_id => os.id, :new_status_id => ns.id) unless os == ns
+ }
+ }
+ Workflow.create!(:tracker_id => t.id, :role_id => reporter.id, :old_status_id => resolved.id, :new_status_id => feedback.id)
+ }
+
+ # Enumerations
+ Enumeration.create!(:opt => "DCAT", :name => l(:default_doc_category_user), :position => 1)
+ Enumeration.create!(:opt => "DCAT", :name => l(:default_doc_category_tech), :position => 2)
+
+ Enumeration.create!(:opt => "IPRI", :name => l(:default_priority_low), :position => 1)
+ Enumeration.create!(:opt => "IPRI", :name => l(:default_priority_normal), :position => 2, :is_default => true)
+ Enumeration.create!(:opt => "IPRI", :name => l(:default_priority_high), :position => 3)
+ Enumeration.create!(:opt => "IPRI", :name => l(:default_priority_urgent), :position => 4)
+ Enumeration.create!(:opt => "IPRI", :name => l(:default_priority_immediate), :position => 5)
+
+ Enumeration.create!(:opt => "ACTI", :name => l(:default_activity_design), :position => 1)
+ Enumeration.create!(:opt => "ACTI", :name => l(:default_activity_development), :position => 2)
+ end
+ true
+ end
+ end
+ end
+ end
+end
diff --git a/lib/redmine/hook.rb b/lib/redmine/hook.rb
new file mode 100644
index 000000000..9bf92b3e7
--- /dev/null
+++ b/lib/redmine/hook.rb
@@ -0,0 +1,109 @@
+# Redmine - project management software
+# Copyright (C) 2006-2008 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+module Redmine
+ module Hook
+ @@listener_classes = []
+ @@listeners = nil
+ @@hook_listeners = {}
+
+ class << self
+ # Adds a listener class.
+ # Automatically called when a class inherits from Redmine::Hook::Listener.
+ def add_listener(klass)
+ raise "Hooks must include Singleton module." unless klass.included_modules.include?(Singleton)
+ @@listener_classes << klass
+ clear_listeners_instances
+ end
+
+ # Returns all the listerners instances.
+ def listeners
+ @@listeners ||= @@listener_classes.collect {|listener| listener.instance}
+ end
+
+ # Returns the listeners instances for the given hook.
+ def hook_listeners(hook)
+ @@hook_listeners[hook] ||= listeners.select {|listener| listener.respond_to?(hook)}
+ end
+
+ # Clears all the listeners.
+ def clear_listeners
+ @@listener_classes = []
+ clear_listeners_instances
+ end
+
+ # Clears all the listeners instances.
+ def clear_listeners_instances
+ @@listeners = nil
+ @@hook_listeners = {}
+ end
+
+ # Calls a hook.
+ # Returns the listeners response.
+ def call_hook(hook, context={})
+ response = ''
+ hook_listeners(hook).each do |listener|
+ response << listener.send(hook, context).to_s
+ end
+ response
+ end
+ end
+
+ # Base class for hook listeners.
+ class Listener
+ include Singleton
+
+ # Registers the listener
+ def self.inherited(child)
+ Redmine::Hook.add_listener(child)
+ super
+ end
+ end
+
+ # Listener class used for views hooks.
+ # Listeners that inherit this class will include various helpers by default.
+ class ViewListener < Listener
+ include ERB::Util
+ include ActionView::Helpers::TagHelper
+ include ActionView::Helpers::FormHelper
+ include ActionView::Helpers::FormTagHelper
+ include ActionView::Helpers::FormOptionsHelper
+ include ActionView::Helpers::JavaScriptHelper
+ include ActionView::Helpers::PrototypeHelper
+ include ActionView::Helpers::NumberHelper
+ include ActionView::Helpers::UrlHelper
+ include ActionView::Helpers::AssetTagHelper
+ include ActionView::Helpers::TextHelper
+ include ActionController::UrlWriter
+ include ApplicationHelper
+ end
+
+ # Helper module included in ApplicationHelper so that hooks can be called
+ # in views like this:
+ # <%= call_hook(:some_hook) %>
+ # <%= call_hook(:another_hook, :foo => 'bar' %>
+ #
+ # Current project is automatically added to the call context.
+ module Helper
+ def call_hook(hook, context={})
+ Redmine::Hook.call_hook(hook, {:project => @project}.merge(context))
+ end
+ end
+ end
+end
+
+ApplicationHelper.send(:include, Redmine::Hook::Helper)
diff --git a/lib/redmine/imap.rb b/lib/redmine/imap.rb
new file mode 100644
index 000000000..a6cd958cd
--- /dev/null
+++ b/lib/redmine/imap.rb
@@ -0,0 +1,51 @@
+# redMine - project management software
+# Copyright (C) 2006-2008 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+require 'net/imap'
+
+module Redmine
+ module IMAP
+ class << self
+ def check(imap_options={}, options={})
+ host = imap_options[:host] || '127.0.0.1'
+ port = imap_options[:port] || '143'
+ ssl = !imap_options[:ssl].nil?
+ folder = imap_options[:folder] || 'INBOX'
+
+ imap = Net::IMAP.new(host, port, ssl)
+ imap.login(imap_options[:username], imap_options[:password]) unless imap_options[:username].nil?
+ imap.select(folder)
+ imap.search(['NOT', 'SEEN']).each do |message_id|
+ msg = imap.fetch(message_id,'RFC822')[0].attr['RFC822']
+ logger.debug "Receiving message #{message_id}" if logger && logger.debug?
+ if MailHandler.receive(msg, options)
+ imap.store(message_id, "+FLAGS", [:Seen, :Deleted])
+ else
+ imap.store(message_id, "+FLAGS", [:Seen])
+ end
+ end
+ imap.expunge
+ end
+
+ private
+
+ def logger
+ RAILS_DEFAULT_LOGGER
+ end
+ end
+ end
+end
diff --git a/lib/redmine/menu_manager.rb b/lib/redmine/menu_manager.rb
index d4a46b3e1..f6431928e 100644
--- a/lib/redmine/menu_manager.rb
+++ b/lib/redmine/menu_manager.rb
@@ -15,16 +15,86 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+require 'gloc'
+
module Redmine
module MenuManager
+ module MenuController
+ def self.included(base)
+ base.extend(ClassMethods)
+ end
+
+ module ClassMethods
+ @@menu_items = Hash.new {|hash, key| hash[key] = {:default => key, :actions => {}}}
+ mattr_accessor :menu_items
+
+ # Set the menu item name for a controller or specific actions
+ # Examples:
+ # * menu_item :tickets # => sets the menu name to :tickets for the whole controller
+ # * menu_item :tickets, :only => :list # => sets the menu name to :tickets for the 'list' action only
+ # * menu_item :tickets, :only => [:list, :show] # => sets the menu name to :tickets for 2 actions only
+ #
+ # The default menu item name for a controller is controller_name by default
+ # Eg. the default menu item name for ProjectsController is :projects
+ def menu_item(id, options = {})
+ if actions = options[:only]
+ actions = [] << actions unless actions.is_a?(Array)
+ actions.each {|a| menu_items[controller_name.to_sym][:actions][a.to_sym] = id}
+ else
+ menu_items[controller_name.to_sym][:default] = id
+ end
+ end
+ end
+
+ def menu_items
+ self.class.menu_items
+ end
+
+ # Returns the menu item name according to the current action
+ def current_menu_item
+ menu_items[controller_name.to_sym][:actions][action_name.to_sym] ||
+ menu_items[controller_name.to_sym][:default]
+ end
+ end
+
+ module MenuHelper
+ # Returns the current menu item name
+ def current_menu_item
+ @controller.current_menu_item
+ end
+
+ # Renders the application main menu
+ def render_main_menu(project)
+ render_menu((project && !project.new_record?) ? :project_menu : :application_menu, project)
+ end
+
+ def render_menu(menu, project=nil)
+ links = []
+ Redmine::MenuManager.allowed_items(menu, User.current, project).each do |item|
+ unless item.condition && !item.condition.call(project)
+ url = case item.url
+ when Hash
+ project.nil? ? item.url : {item.param => project}.merge(item.url)
+ when Symbol
+ send(item.url)
+ else
+ item.url
+ end
+ caption = item.caption(project)
+ caption = l(caption) if caption.is_a?(Symbol)
+ links << content_tag('li',
+ link_to(h(caption), url, (current_menu_item == item.name ? item.html_options.merge(:class => 'selected') : item.html_options)))
+ end
+ end
+ links.empty? ? nil : content_tag('ul', links.join("\n"))
+ end
+ end
class << self
def map(menu_name)
- mapper = Mapper.new
- yield mapper
@items ||= {}
- @items[menu_name.to_sym] ||= []
- @items[menu_name.to_sym] += mapper.items
+ mapper = Mapper.new(menu_name.to_sym, @items)
+ yield mapper
end
def items(menu_name)
@@ -32,29 +102,78 @@ module Redmine
end
def allowed_items(menu_name, user, project)
- items(menu_name).select {|item| user && user.allowed_to?(item.url, project)}
+ project ? items(menu_name).select {|item| user && user.allowed_to?(item.url, project)} : items(menu_name)
end
end
class Mapper
- def push(name, url, options={})
- @items ||= []
- @items << MenuItem.new(name, url, options)
+ def initialize(menu, items)
+ items[menu] ||= []
+ @menu = menu
+ @menu_items = items[menu]
end
- def items
- @items
+ @@last_items_count = Hash.new {|h,k| h[k] = 0}
+
+ # Adds an item at the end of the menu. Available options:
+ # * param: the parameter name that is used for the project id (default is :id)
+ # * if: a Proc that is called before rendering the item, the item is displayed only if it returns true
+ # * caption that can be:
+ # * a localized string Symbol
+ # * a String
+ # * a Proc that can take the project as argument
+ # * before, after: specify where the menu item should be inserted (eg. :after => :activity)
+ # * last: menu item will stay at the end (eg. :last => true)
+ # * html_options: a hash of html options that are passed to link_to
+ def push(name, url, options={})
+ options = options.dup
+
+ # menu item position
+ if before = options.delete(:before)
+ position = @menu_items.collect(&:name).index(before)
+ elsif after = options.delete(:after)
+ position = @menu_items.collect(&:name).index(after)
+ position += 1 unless position.nil?
+ elsif options.delete(:last)
+ position = @menu_items.size
+ @@last_items_count[@menu] += 1
+ end
+ # default position
+ position ||= @menu_items.size - @@last_items_count[@menu]
+
+ @menu_items.insert(position, MenuItem.new(name, url, options))
+ end
+
+ # Removes a menu item
+ def delete(name)
+ @menu_items.delete_if {|i| i.name == name}
end
end
class MenuItem
- attr_reader :name, :url, :param, :condition
+ include GLoc
+ attr_reader :name, :url, :param, :condition, :html_options
def initialize(name, url, options)
+ raise "Invalid option :if for menu item '#{name}'" if options[:if] && !options[:if].respond_to?(:call)
+ raise "Invalid option :html for menu item '#{name}'" if options[:html] && !options[:html].is_a?(Hash)
@name = name
@url = url
@condition = options[:if]
@param = options[:param] || :id
+ @caption = options[:caption]
+ @html_options = options[:html] || {}
+ end
+
+ def caption(project=nil)
+ if @caption.is_a?(Proc)
+ c = @caption.call(project).to_s
+ c = @name.to_s.humanize if c.blank?
+ c
+ else
+ # check if localized string exists on first render (after GLoc strings are loaded)
+ @caption_key ||= (@caption || (l_has_string?("label_#{@name}".to_sym) ? "label_#{@name}".to_sym : @name.to_s.humanize))
+ end
end
end
end
diff --git a/lib/redmine/mime_type.rb b/lib/redmine/mime_type.rb
index e041c731f..dfdfff407 100644
--- a/lib/redmine/mime_type.rb
+++ b/lib/redmine/mime_type.rb
@@ -19,31 +19,40 @@ module Redmine
module MimeType
MIME_TYPES = {
- 'text/plain' => 'txt',
+ 'text/plain' => 'txt,tpl,properties,patch,diff,ini,readme,install,upgrade',
'text/css' => 'css',
'text/html' => 'html,htm,xhtml',
- 'text/x-c' => 'c,cpp,h',
+ 'text/jsp' => 'jsp',
+ 'text/x-c' => 'c,cpp,cc,h,hh',
+ 'text/x-java' => 'java',
'text/x-javascript' => 'js',
'text/x-html-template' => 'rhtml',
+ 'text/x-perl' => 'pl,pm',
+ 'text/x-php' => 'php,php3,php4,php5',
+ 'text/x-python' => 'py',
'text/x-ruby' => 'rb,rbw,ruby,rake',
- 'text/xml' => 'xml',
+ 'text/x-csh' => 'csh',
+ 'text/x-sh' => 'sh',
+ 'text/xml' => 'xml,xsd,mxml',
'text/yaml' => 'yml,yaml',
'image/gif' => 'gif',
'image/jpeg' => 'jpg,jpeg,jpe',
'image/png' => 'png',
- 'image/tiff' => 'tiff,tif'
+ 'image/tiff' => 'tiff,tif',
+ 'image/x-ms-bmp' => 'bmp',
+ 'image/x-xpixmap' => 'xpm',
}.freeze
EXTENSIONS = MIME_TYPES.inject({}) do |map, (type, exts)|
- exts.split(',').each {|ext| map[ext] = type}
+ exts.split(',').each {|ext| map[ext.strip] = type}
map
end
# returns mime type for name or nil if unknown
def self.of(name)
return nil unless name
- m = name.to_s.match(/\.([^\.]+)$/)
- EXTENSIONS[m[1]] if m
+ m = name.to_s.match(/(^|\.)([^\.]+)$/)
+ EXTENSIONS[m[2].downcase] if m
end
def self.main_mimetype_of(name)
diff --git a/lib/redmine/platform.rb b/lib/redmine/platform.rb
new file mode 100644
index 000000000..f41b92f2e
--- /dev/null
+++ b/lib/redmine/platform.rb
@@ -0,0 +1,26 @@
+# Redmine - project management software
+# Copyright (C) 2006-2008 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+module Redmine
+ module Platform
+ class << self
+ def mswin?
+ (RUBY_PLATFORM =~ /(:?mswin|mingw)/) || (RUBY_PLATFORM == 'java' && (ENV['OS'] || ENV['os']) =~ /windows/i)
+ end
+ end
+ end
+end
diff --git a/lib/redmine/plugin.rb b/lib/redmine/plugin.rb
index e6047974e..cf6c194a2 100644
--- a/lib/redmine/plugin.rb
+++ b/lib/redmine/plugin.rb
@@ -66,11 +66,12 @@ module Redmine #:nodoc:
# Adds an item to the given +menu+.
# The +id+ parameter (equals to the project id) is automatically added to the url.
- # menu :project_menu, :label_plugin_example, :controller => 'example', :action => 'say_hello'
+ # menu :project_menu, :plugin_example, { :controller => 'example', :action => 'say_hello' }, :caption => 'Sample'
#
- # Currently, only the project menu can be extended. Thus, the +name+ parameter must be +:project_menu+
- def menu(name, label, url)
- Redmine::MenuManager.map(name) {|menu| menu.push label, url}
+ # +name+ parameter can be: :top_menu, :account_menu, :application_menu or :project_menu
+ #
+ def menu(name, item, url, options={})
+ Redmine::MenuManager.map(name) {|menu| menu.push item, url, options}
end
# Defines a permission called +name+ for the given +actions+.
@@ -115,6 +116,32 @@ module Redmine #:nodoc:
self.instance_eval(&block)
@project_module = nil
end
+
+ # Registers an activity provider.
+ #
+ # Options:
+ # * :class_name - one or more model(s) that provide these events (inferred from event_type by default)
+ # * :default - setting this option to false will make the events not displayed by default
+ #
+ # A model can provide several activity event types.
+ #
+ # Examples:
+ # register :news
+ # register :scrums, :class_name => 'Meeting'
+ # register :issues, :class_name => ['Issue', 'Journal']
+ #
+ # Retrieving events:
+ # Associated model(s) must implement the find_events class method.
+ # ActiveRecord models can use acts_as_activity_provider as a way to implement this class method.
+ #
+ # The following call should return all the scrum events visible by current user that occured in the 5 last days:
+ # Meeting.find_events('scrums', User.current, 5.days.ago, Date.today)
+ # Meeting.find_events('scrums', User.current, 5.days.ago, Date.today, :project => foo) # events for project foo only
+ #
+ # Note that :view_scrums permission is required to view these events in the activity view.
+ def activity_provider(*args)
+ Redmine::Activity.register(*args)
+ end
# Returns +true+ if the plugin can be configured.
def configurable?
diff --git a/lib/redmine/scm/adapters/abstract_adapter.rb b/lib/redmine/scm/adapters/abstract_adapter.rb
index 4b524c538..9f400880d 100644
--- a/lib/redmine/scm/adapters/abstract_adapter.rb
+++ b/lib/redmine/scm/adapters/abstract_adapter.rb
@@ -24,6 +24,29 @@ module Redmine
end
class AbstractAdapter #:nodoc:
+ class << self
+ # Returns the version of the scm client
+ # Eg: [1, 5, 0] or [] if unknown
+ def client_version
+ []
+ end
+
+ # Returns the version string of the scm client
+ # Eg: '1.5.0' or 'Unknown version' if unknown
+ def client_version_string
+ v = client_version || 'Unknown version'
+ v.is_a?(Array) ? v.join('.') : v.to_s
+ end
+
+ # Returns true if the current client version is above
+ # or equals the given one
+ # If option is :unknown is set to true, it will return
+ # true if the client version is unknown
+ def client_version_above?(v, options={})
+ ((client_version <=> v) >= 0) || (client_version.empty? && options[:unknown])
+ end
+ end
+
def initialize(url, root_url=nil, login=nil, password=nil)
@url = url
@login = login if login && !login.empty?
@@ -38,6 +61,10 @@ module Redmine
def supports_cat?
true
end
+
+ def supports_annotate?
+ respond_to?('annotate')
+ end
def root_url
@root_url
@@ -55,8 +82,17 @@ module Redmine
# Returns the entry identified by path and revision identifier
# or nil if entry doesn't exist in the repository
def entry(path=nil, identifier=nil)
- e = entries(path, identifier)
- e ? e.first : nil
+ parts = path.to_s.split(%r{[\/\\]}).select {|n| !n.blank?}
+ search_path = parts[0..-2].join('/')
+ search_name = parts[-1]
+ if search_path.blank? && search_name.blank?
+ # Root entry
+ Entry.new(:path => '', :kind => 'dir')
+ else
+ # Search for the entry in the parent directory
+ es = entries(search_path, identifier)
+ es ? es.detect {|e| e.name == search_name} : nil
+ end
end
# Returns an Entries collection
@@ -64,32 +100,51 @@ module Redmine
def entries(path=nil, identifier=nil)
return nil
end
+
+ def properties(path, identifier=nil)
+ return nil
+ end
def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
return nil
end
- def diff(path, identifier_from, identifier_to=nil, type="inline")
+ def diff(path, identifier_from, identifier_to=nil)
return nil
end
def cat(path, identifier=nil)
return nil
end
-
+
def with_leading_slash(path)
path ||= ''
(path[0,1]!="/") ? "/#{path}" : path
end
+
+ def with_trailling_slash(path)
+ path ||= ''
+ (path[-1,1] == "/") ? path : "#{path}/"
+ end
+
+ def without_leading_slash(path)
+ path ||= ''
+ path.gsub(%r{^/+}, '')
+ end
+
+ def without_trailling_slash(path)
+ path ||= ''
+ (path[-1,1] == "/") ? path[0..-2] : path
+ end
def shell_quote(str)
- if RUBY_PLATFORM =~ /mswin/
+ if Redmine::Platform.mswin?
'"' + str.gsub(/"/, '\\"') + '"'
else
"'" + str.gsub(/'/, "'\"'\"'") + "'"
end
end
-
+
private
def retrieve_root_url
info = self.info
@@ -97,22 +152,47 @@ module Redmine
end
def target(path)
- path ||= ""
- base = path.match(/^\//) ? root_url : url
- " \"" << "#{base}/#{path}".gsub(/["?<>\*]/, '') << "\""
+ path ||= ''
+ base = path.match(/^\//) ? root_url : url
+ shell_quote("#{base}/#{path}".gsub(/[?<>\*]/, ''))
end
def logger
+ self.class.logger
+ end
+
+ def shellout(cmd, &block)
+ self.class.shellout(cmd, &block)
+ end
+
+ def self.logger
RAILS_DEFAULT_LOGGER
end
-
- def shellout(cmd, &block)
+
+ def self.shellout(cmd, &block)
logger.debug "Shelling out: #{cmd}" if logger && logger.debug?
- IO.popen(cmd, "r+") do |io|
- io.close_write
- block.call(io) if block_given?
+ begin
+ IO.popen(cmd, "r+") do |io|
+ io.close_write
+ block.call(io) if block_given?
+ end
+ rescue Errno::ENOENT => e
+ msg = strip_credential(e.message)
+ # The command failed, log it and re-raise
+ logger.error("SCM command failed, make sure that your SCM binary (eg. svn) is in PATH (#{ENV['PATH']}): #{strip_credential(cmd)}\n with: #{msg}")
+ raise CommandFailed.new(msg)
end
end
+
+ # Hides username/password in a given command
+ def self.strip_credential(cmd)
+ q = (Redmine::Platform.mswin? ? '"' : "'")
+ cmd.to_s.gsub(/(\-\-(password|username))\s+(#{q}[^#{q}]+#{q}|[^#{q}]\S+)/, '\\1 xxxx')
+ end
+
+ def strip_credential(cmd)
+ self.class.strip_credential(cmd)
+ end
end
class Entries < Array
@@ -189,163 +269,26 @@ module Redmine
end
end
-
- # A line of Diff
- class Diff
- attr_accessor :nb_line_left
- attr_accessor :line_left
- attr_accessor :nb_line_right
- attr_accessor :line_right
- attr_accessor :type_diff_right
- attr_accessor :type_diff_left
- def initialize ()
- self.nb_line_left = ''
- self.nb_line_right = ''
- self.line_left = ''
- self.line_right = ''
- self.type_diff_right = ''
- self.type_diff_left = ''
+ class Annotate
+ attr_reader :lines, :revisions
+
+ def initialize
+ @lines = []
+ @revisions = []
end
-
- def inspect
- puts '### Start Line Diff ###'
- puts self.nb_line_left
- puts self.line_left
- puts self.nb_line_right
- puts self.line_right
+
+ def add_line(line, revision)
+ @lines << line
+ @revisions << revision
end
- end
-
- class DiffTableList < Array
- def initialize (diff, type="inline")
- diff_table = DiffTable.new type
- diff.each do |line|
- if line =~ /^(---|\+\+\+) (.*)$/
- self << diff_table if diff_table.length > 1
- diff_table = DiffTable.new type
- end
- a = diff_table.add_line line
- end
- self << diff_table
+
+ def content
+ content = lines.join("\n")
end
- end
-
- # Class for create a Diff
- class DiffTable < Hash
- attr_reader :file_name, :line_num_l, :line_num_r
-
- # Initialize with a Diff file and the type of Diff View
- # The type view must be inline or sbs (side_by_side)
- def initialize (type="inline")
- @parsing = false
- @nb_line = 1
- @start = false
- @before = 'same'
- @second = true
- @type = type
- end
-
- # Function for add a line of this Diff
- def add_line(line)
- unless @parsing
- if line =~ /^(---|\+\+\+) (.*)$/
- @file_name = $2
- return false
- elsif line =~ /^@@ (\+|\-)(\d+)(,\d+)? (\+|\-)(\d+)(,\d+)? @@/
- @line_num_l = $5.to_i
- @line_num_r = $2.to_i
- @parsing = true
- end
- else
- if line =~ /^[^\+\-\s@\\]/
- self.delete(self.keys.sort.last)
- @parsing = false
- return false
- elsif line =~ /^@@ (\+|\-)(\d+)(,\d+)? (\+|\-)(\d+)(,\d+)? @@/
- @line_num_l = $5.to_i
- @line_num_r = $2.to_i
- else
- @nb_line += 1 if parse_line(line, @type)
- end
- end
- return true
- end
-
- def inspect
- puts '### DIFF TABLE ###'
- puts "file : #{file_name}"
- self.each do |d|
- d.inspect
- end
- end
-
- private
- # Test if is a Side By Side type
- def sbs?(type, func)
- if @start and type == "sbs"
- if @before == func and @second
- tmp_nb_line = @nb_line
- self[tmp_nb_line] = Diff.new
- else
- @second = false
- tmp_nb_line = @start
- @start += 1
- @nb_line -= 1
- end
- else
- tmp_nb_line = @nb_line
- @start = @nb_line
- self[tmp_nb_line] = Diff.new
- @second = true
- end
- unless self[tmp_nb_line]
- @nb_line += 1
- self[tmp_nb_line] = Diff.new
- else
- self[tmp_nb_line]
- end
- end
-
- # Escape the HTML for the diff
- def escapeHTML(line)
- CGI.escapeHTML(line)
- end
-
- def parse_line (line, type="inline")
- if line[0, 1] == "+"
- diff = sbs? type, 'add'
- @before = 'add'
- diff.line_left = escapeHTML line[1..-1]
- diff.nb_line_left = @line_num_l
- diff.type_diff_left = 'diff_in'
- @line_num_l += 1
- true
- elsif line[0, 1] == "-"
- diff = sbs? type, 'remove'
- @before = 'remove'
- diff.line_right = escapeHTML line[1..-1]
- diff.nb_line_right = @line_num_r
- diff.type_diff_right = 'diff_out'
- @line_num_r += 1
- true
- elsif line[0, 1] =~ /\s/
- @before = 'same'
- @start = false
- diff = Diff.new
- diff.line_right = escapeHTML line[1..-1]
- diff.nb_line_right = @line_num_r
- diff.line_left = escapeHTML line[1..-1]
- diff.nb_line_left = @line_num_l
- self[@nb_line] = diff
- @line_num_l += 1
- @line_num_r += 1
- true
- elsif line[0, 1] = "\\"
- true
- else
- false
- end
+
+ def empty?
+ lines.empty?
end
end
end
diff --git a/lib/redmine/scm/adapters/bazaar_adapter.rb b/lib/redmine/scm/adapters/bazaar_adapter.rb
new file mode 100644
index 000000000..ff69e3e6b
--- /dev/null
+++ b/lib/redmine/scm/adapters/bazaar_adapter.rb
@@ -0,0 +1,185 @@
+# redMine - project management software
+# Copyright (C) 2006-2007 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+require 'redmine/scm/adapters/abstract_adapter'
+
+module Redmine
+ module Scm
+ module Adapters
+ class BazaarAdapter < AbstractAdapter
+
+ # Bazaar executable name
+ BZR_BIN = "bzr"
+
+ # Get info about the repository
+ def info
+ cmd = "#{BZR_BIN} revno #{target('')}"
+ info = nil
+ shellout(cmd) do |io|
+ if io.read =~ %r{^(\d+)$}
+ info = Info.new({:root_url => url,
+ :lastrev => Revision.new({
+ :identifier => $1
+ })
+ })
+ end
+ end
+ return nil if $? && $?.exitstatus != 0
+ info
+ rescue CommandFailed
+ return nil
+ end
+
+ # Returns an Entries collection
+ # or nil if the given path doesn't exist in the repository
+ def entries(path=nil, identifier=nil)
+ path ||= ''
+ entries = Entries.new
+ cmd = "#{BZR_BIN} ls -v --show-ids"
+ cmd << " -r#{identifier.to_i}" if identifier && identifier.to_i > 0
+ cmd << " #{target(path)}"
+ shellout(cmd) do |io|
+ prefix = "#{url}/#{path}".gsub('\\', '/')
+ logger.debug "PREFIX: #{prefix}"
+ re = %r{^V\s+#{Regexp.escape(prefix)}(\/?)([^\/]+)(\/?)\s+(\S+)$}
+ io.each_line do |line|
+ next unless line =~ re
+ entries << Entry.new({:name => $2.strip,
+ :path => ((path.empty? ? "" : "#{path}/") + $2.strip),
+ :kind => ($3.blank? ? 'file' : 'dir'),
+ :size => nil,
+ :lastrev => Revision.new(:revision => $4.strip)
+ })
+ end
+ end
+ return nil if $? && $?.exitstatus != 0
+ logger.debug("Found #{entries.size} entries in the repository for #{target(path)}") if logger && logger.debug?
+ entries.sort_by_name
+ end
+
+ def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
+ path ||= ''
+ identifier_from = 'last:1' unless identifier_from and identifier_from.to_i > 0
+ identifier_to = 1 unless identifier_to and identifier_to.to_i > 0
+ revisions = Revisions.new
+ cmd = "#{BZR_BIN} log -v --show-ids -r#{identifier_to.to_i}..#{identifier_from} #{target(path)}"
+ shellout(cmd) do |io|
+ revision = nil
+ parsing = nil
+ io.each_line do |line|
+ if line =~ /^----/
+ revisions << revision if revision
+ revision = Revision.new(:paths => [], :message => '')
+ parsing = nil
+ else
+ next unless revision
+
+ if line =~ /^revno: (\d+)$/
+ revision.identifier = $1.to_i
+ elsif line =~ /^committer: (.+)$/
+ revision.author = $1.strip
+ elsif line =~ /^revision-id:(.+)$/
+ revision.scmid = $1.strip
+ elsif line =~ /^timestamp: (.+)$/
+ revision.time = Time.parse($1).localtime
+ elsif line =~ /^ -----/
+ # partial revisions
+ parsing = nil unless parsing == 'message'
+ elsif line =~ /^(message|added|modified|removed|renamed):/
+ parsing = $1
+ elsif line =~ /^ (.*)$/
+ if parsing == 'message'
+ revision.message << "#{$1}\n"
+ else
+ if $1 =~ /^(.*)\s+(\S+)$/
+ path = $1.strip
+ revid = $2
+ case parsing
+ when 'added'
+ revision.paths << {:action => 'A', :path => "/#{path}", :revision => revid}
+ when 'modified'
+ revision.paths << {:action => 'M', :path => "/#{path}", :revision => revid}
+ when 'removed'
+ revision.paths << {:action => 'D', :path => "/#{path}", :revision => revid}
+ when 'renamed'
+ new_path = path.split('=>').last
+ revision.paths << {:action => 'M', :path => "/#{new_path.strip}", :revision => revid} if new_path
+ end
+ end
+ end
+ else
+ parsing = nil
+ end
+ end
+ end
+ revisions << revision if revision
+ end
+ return nil if $? && $?.exitstatus != 0
+ revisions
+ end
+
+ def diff(path, identifier_from, identifier_to=nil)
+ path ||= ''
+ if identifier_to
+ identifier_to = identifier_to.to_i
+ else
+ identifier_to = identifier_from.to_i - 1
+ end
+ cmd = "#{BZR_BIN} diff -r#{identifier_to}..#{identifier_from} #{target(path)}"
+ diff = []
+ shellout(cmd) do |io|
+ io.each_line do |line|
+ diff << line
+ end
+ end
+ #return nil if $? && $?.exitstatus != 0
+ diff
+ end
+
+ def cat(path, identifier=nil)
+ cmd = "#{BZR_BIN} cat"
+ cmd << " -r#{identifier.to_i}" if identifier && identifier.to_i > 0
+ cmd << " #{target(path)}"
+ cat = nil
+ shellout(cmd) do |io|
+ io.binmode
+ cat = io.read
+ end
+ return nil if $? && $?.exitstatus != 0
+ cat
+ end
+
+ def annotate(path, identifier=nil)
+ cmd = "#{BZR_BIN} annotate --all"
+ cmd << " -r#{identifier.to_i}" if identifier && identifier.to_i > 0
+ cmd << " #{target(path)}"
+ blame = Annotate.new
+ shellout(cmd) do |io|
+ author = nil
+ identifier = nil
+ io.each_line do |line|
+ next unless line =~ %r{^(\d+) ([^|]+)\| (.*)$}
+ blame.add_line($3.rstrip, Revision.new(:identifier => $1.to_i, :author => $2.strip))
+ end
+ end
+ return nil if $? && $?.exitstatus != 0
+ blame
+ end
+ end
+ end
+ end
+end
diff --git a/lib/redmine/scm/adapters/cvs_adapter.rb b/lib/redmine/scm/adapters/cvs_adapter.rb
index e84c1eea3..089a6b153 100644
--- a/lib/redmine/scm/adapters/cvs_adapter.rb
+++ b/lib/redmine/scm/adapters/cvs_adapter.rb
@@ -55,15 +55,6 @@ module Redmine
def get_previous_revision(revision)
CvsRevisionHelper.new(revision).prevRev
end
-
- # Returns the entry identified by path and revision identifier
- # or nil if entry doesn't exist in the repository
- # this method returns all revisions from one single SCM-Entry
- def entry(path=nil, identifier="HEAD")
- e = entries(path, identifier)
- logger.debug(" #{e.first.inspect}") if e
- e ? e.first : nil
- end
# Returns an Entries collection
# or nil if the given path doesn't exist in the repository
@@ -72,7 +63,9 @@ module Redmine
logger.debug " entries '#{path}' with identifier '#{identifier}'"
path_with_project="#{url}#{with_leading_slash(path)}"
entries = Entries.new
- cmd = "#{CVS_BIN} -d #{root_url} rls -ed #{path_with_project}"
+ cmd = "#{CVS_BIN} -d #{root_url} rls -ed"
+ cmd << " -D \"#{time_to_cvstime(identifier)}\"" if identifier
+ cmd << " #{shell_quote path_with_project}"
shellout(cmd) do |io|
io.each_line(){|line|
fields=line.chop.split('/',-1)
@@ -103,8 +96,6 @@ module Redmine
end
return nil if $? && $?.exitstatus != 0
entries.sort_by_name
- rescue Errno::ENOENT => e
- raise CommandFailed
end
STARTLOG="----------------------------"
@@ -119,7 +110,7 @@ module Redmine
path_with_project="#{url}#{with_leading_slash(path)}"
cmd = "#{CVS_BIN} -d #{root_url} rlog"
cmd << " -d\">#{time_to_cvstime(identifier_from)}\"" if identifier_from
- cmd << " #{path_with_project}"
+ cmd << " #{shell_quote path_with_project}"
shellout(cmd) do |io|
state="entry_start"
@@ -142,8 +133,8 @@ module Redmine
if state=="entry_start"
branch_map=Hash.new
- # gsub(/^:.*@[^:]+:/, '') is here to remove :pserver:anonymous@foo.bar: string if present in the url
- if /^RCS file: #{Regexp.escape(root_url.gsub(/^:.*@[^:]+:/, ''))}\/#{Regexp.escape(path_with_project)}(.+),v$/ =~ line
+ # gsub(/^:.*@[^:]+:\d*/, '') is here to remove :pserver:anonymous@foo.bar: string if present in the url
+ if /^RCS file: #{Regexp.escape(root_url.gsub(/^:.*@[^:]+:\d*/, ''))}\/#{Regexp.escape(path_with_project)}(.+),v$/ =~ line
entry_path = normalize_cvs_path($1)
entry_name = normalize_path(File.basename($1))
logger.debug("Path #{entry_path} <=> Name #{entry_name}")
@@ -234,14 +225,12 @@ module Redmine
end
end
end
- rescue Errno::ENOENT => e
- raise CommandFailed
end
- def diff(path, identifier_from, identifier_to=nil, type="inline")
+ def diff(path, identifier_from, identifier_to=nil)
logger.debug " diff path:'#{path}',identifier_from #{identifier_from}, identifier_to #{identifier_to}"
path_with_project="#{url}#{with_leading_slash(path)}"
- cmd = "#{CVS_BIN} -d #{root_url} rdiff -u -r#{identifier_to} -r#{identifier_from} #{path_with_project}"
+ cmd = "#{CVS_BIN} -d #{root_url} rdiff -u -r#{identifier_to} -r#{identifier_from} #{shell_quote path_with_project}"
diff = []
shellout(cmd) do |io|
io.each_line do |line|
@@ -249,26 +238,40 @@ module Redmine
end
end
return nil if $? && $?.exitstatus != 0
- DiffTableList.new diff, type
- rescue Errno::ENOENT => e
- raise CommandFailed
+ diff
end
def cat(path, identifier=nil)
identifier = (identifier) ? identifier : "HEAD"
logger.debug " cat path:'#{path}',identifier #{identifier}"
path_with_project="#{url}#{with_leading_slash(path)}"
- cmd = "#{CVS_BIN} -d #{root_url} co -r#{identifier} -p #{path_with_project}"
+ cmd = "#{CVS_BIN} -d #{root_url} co"
+ cmd << " -D \"#{time_to_cvstime(identifier)}\"" if identifier
+ cmd << " -p #{shell_quote path_with_project}"
cat = nil
shellout(cmd) do |io|
cat = io.read
end
return nil if $? && $?.exitstatus != 0
cat
- rescue Errno::ENOENT => e
- raise CommandFailed
end
-
+
+ def annotate(path, identifier=nil)
+ identifier = (identifier) ? identifier : "HEAD"
+ logger.debug " annotate path:'#{path}',identifier #{identifier}"
+ path_with_project="#{url}#{with_leading_slash(path)}"
+ cmd = "#{CVS_BIN} -d #{root_url} rannotate -r#{identifier} #{shell_quote path_with_project}"
+ blame = Annotate.new
+ shellout(cmd) do |io|
+ io.each_line do |line|
+ next unless line =~ %r{^([\d\.]+)\s+\(([^\)]+)\s+[^\)]+\):\s(.*)$}
+ blame.add_line($3.rstrip, Revision.new(:revision => $1, :author => $2.strip))
+ end
+ end
+ return nil if $? && $?.exitstatus != 0
+ blame
+ end
+
private
# convert a date/time into the CVS-format
diff --git a/lib/redmine/scm/adapters/darcs_adapter.rb b/lib/redmine/scm/adapters/darcs_adapter.rb
index 34b36202b..4a5183f79 100644
--- a/lib/redmine/scm/adapters/darcs_adapter.rb
+++ b/lib/redmine/scm/adapters/darcs_adapter.rb
@@ -25,35 +25,50 @@ module Redmine
# Darcs executable name
DARCS_BIN = "darcs"
+ class << self
+ def client_version
+ @@client_version ||= (darcs_binary_version || [])
+ end
+
+ def darcs_binary_version
+ cmd = "#{DARCS_BIN} --version"
+ version = nil
+ shellout(cmd) do |io|
+ # Read darcs version in first returned line
+ if m = io.gets.match(%r{((\d+\.)+\d+)})
+ version = m[0].scan(%r{\d+}).collect(&:to_i)
+ end
+ end
+ return nil if $? && $?.exitstatus != 0
+ version
+ end
+ end
+
def initialize(url, root_url=nil, login=nil, password=nil)
@url = url
@root_url = url
end
def supports_cat?
- false
+ # cat supported in darcs 2.0.0 and higher
+ self.class.client_version_above?([2, 0, 0])
end
-
- # Get info about the svn repository
+
+ # Get info about the darcs repository
def info
rev = revisions(nil,nil,nil,{:limit => 1})
rev ? Info.new({:root_url => @url, :lastrev => rev.last}) : nil
end
- # Returns the entry identified by path and revision identifier
- # or nil if entry doesn't exist in the repository
- def entry(path=nil, identifier=nil)
- e = entries(path, identifier)
- e ? e.first : nil
- end
-
# Returns an Entries collection
# or nil if the given path doesn't exist in the repository
def entries(path=nil, identifier=nil)
path_prefix = (path.blank? ? '' : "#{path}/")
path = '.' if path.blank?
entries = Entries.new
- cmd = "#{DARCS_BIN} annotate --repodir #{@url} --xml-output #{path}"
+ cmd = "#{DARCS_BIN} annotate --repodir #{@url} --xml-output"
+ cmd << " --match \"hash #{identifier}\"" if identifier
+ cmd << " #{path}"
shellout(cmd) do |io|
begin
doc = REXML::Document.new(io)
@@ -70,8 +85,6 @@ module Redmine
end
return nil if $? && $?.exitstatus != 0
entries.sort_by_name
- rescue Errno::ENOENT => e
- raise CommandFailed
end
def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
@@ -99,15 +112,17 @@ module Redmine
end
return nil if $? && $?.exitstatus != 0
revisions
- rescue Errno::ENOENT => e
- raise CommandFailed
end
- def diff(path, identifier_from, identifier_to=nil, type="inline")
+ def diff(path, identifier_from, identifier_to=nil)
path = '*' if path.blank?
cmd = "#{DARCS_BIN} diff --repodir #{@url}"
- cmd << " --to-match \"hash #{identifier_from}\""
- cmd << " --from-match \"hash #{identifier_to}\"" if identifier_to
+ if identifier_to.nil?
+ cmd << " --match \"hash #{identifier_from}\""
+ else
+ cmd << " --to-match \"hash #{identifier_from}\""
+ cmd << " --from-match \"hash #{identifier_to}\""
+ end
cmd << " -u #{path}"
diff = []
shellout(cmd) do |io|
@@ -116,11 +131,22 @@ module Redmine
end
end
return nil if $? && $?.exitstatus != 0
- DiffTableList.new diff, type
- rescue Errno::ENOENT => e
- raise CommandFailed
+ diff
end
+ def cat(path, identifier=nil)
+ cmd = "#{DARCS_BIN} show content --repodir #{@url}"
+ cmd << " --match \"hash #{identifier}\"" if identifier
+ cmd << " #{shell_quote path}"
+ cat = nil
+ shellout(cmd) do |io|
+ io.binmode
+ cat = io.read
+ end
+ return nil if $? && $?.exitstatus != 0
+ cat
+ end
+
private
def entry_from_xml(element, path_prefix)
@@ -154,7 +180,7 @@ module Redmine
end
end
paths
- rescue Errno::ENOENT => e
+ rescue CommandFailed
paths
end
end
diff --git a/lib/redmine/scm/adapters/filesystem_adapter.rb b/lib/redmine/scm/adapters/filesystem_adapter.rb
new file mode 100644
index 000000000..99296a090
--- /dev/null
+++ b/lib/redmine/scm/adapters/filesystem_adapter.rb
@@ -0,0 +1,93 @@
+# redMine - project management software
+# Copyright (C) 2006-2007 Jean-Philippe Lang
+#
+# FileSystem adapter
+# File written by Paul Rivier, at Demotera.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+require 'redmine/scm/adapters/abstract_adapter'
+require 'find'
+
+module Redmine
+ module Scm
+ module Adapters
+ class FilesystemAdapter < AbstractAdapter
+
+
+ def initialize(url, root_url=nil, login=nil, password=nil)
+ @url = with_trailling_slash(url)
+ end
+
+ def format_path_ends(path, leading=true, trailling=true)
+ path = leading ? with_leading_slash(path) :
+ without_leading_slash(path)
+ trailling ? with_trailling_slash(path) :
+ without_trailling_slash(path)
+ end
+
+ def info
+ info = Info.new({:root_url => target(),
+ :lastrev => nil
+ })
+ info
+ rescue CommandFailed
+ return nil
+ end
+
+ def entries(path="", identifier=nil)
+ entries = Entries.new
+ Dir.new(target(path)).each do |e|
+ relative_path = format_path_ends((format_path_ends(path,
+ false,
+ true) + e),
+ false,false)
+ target = target(relative_path)
+ entries <<
+ Entry.new({ :name => File.basename(e),
+ # below : list unreadable files, but dont link them.
+ :path => File.readable?(target) ? relative_path : "",
+ :kind => (File.directory?(target) ? 'dir' : 'file'),
+ :size => (File.directory?(target) ? nil : [File.size(target)].pack('l').unpack('L').first),
+ :lastrev =>
+ Revision.new({:time => (File.mtime(target)).localtime,
+ })
+ }) if File.exist?(target) and # paranoid test
+ %w{file directory}.include?(File.ftype(target)) and # avoid special types
+ not File.basename(e).match(/^\.+$/) # avoid . and ..
+ end
+ entries.sort_by_name
+ end
+
+ def cat(path, identifier=nil)
+ File.new(target(path), "rb").read
+ end
+
+ private
+
+ # AbstractAdapter::target is implicitly made to quote paths.
+ # Here we do not shell-out, so we do not want quotes.
+ def target(path=nil)
+ #Prevent the use of ..
+ if path and !path.match(/(^|\/)\.\.(\/|$)/)
+ return "#{self.url}#{without_leading_slash(path)}"
+ end
+ return self.url
+ end
+
+ end
+ end
+ end
+end
diff --git a/lib/redmine/scm/adapters/git_adapter.rb b/lib/redmine/scm/adapters/git_adapter.rb
new file mode 100644
index 000000000..30d624001
--- /dev/null
+++ b/lib/redmine/scm/adapters/git_adapter.rb
@@ -0,0 +1,271 @@
+# redMine - project management software
+# Copyright (C) 2006-2007 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+require 'redmine/scm/adapters/abstract_adapter'
+
+module Redmine
+ module Scm
+ module Adapters
+ class GitAdapter < AbstractAdapter
+
+ # Git executable name
+ GIT_BIN = "git"
+
+ # Get the revision of a particuliar file
+ def get_rev (rev,path)
+
+ if rev != 'latest' && !rev.nil?
+ cmd="#{GIT_BIN} --git-dir #{target('')} show #{shell_quote rev} -- #{shell_quote path}"
+ else
+ branch = shellout("#{GIT_BIN} --git-dir #{target('')} branch") { |io| io.grep(/\*/)[0].strip.match(/\* (.*)/)[1] }
+ cmd="#{GIT_BIN} --git-dir #{target('')} log -1 #{branch} -- #{shell_quote path}"
+ end
+ rev=[]
+ i=0
+ shellout(cmd) do |io|
+ files=[]
+ changeset = {}
+ parsing_descr = 0 #0: not parsing desc or files, 1: parsing desc, 2: parsing files
+
+ io.each_line do |line|
+ if line =~ /^commit ([0-9a-f]{40})$/
+ key = "commit"
+ value = $1
+ if (parsing_descr == 1 || parsing_descr == 2)
+ parsing_descr = 0
+ rev = Revision.new({:identifier => changeset[:commit],
+ :scmid => changeset[:commit],
+ :author => changeset[:author],
+ :time => Time.parse(changeset[:date]),
+ :message => changeset[:description],
+ :paths => files
+ })
+ changeset = {}
+ files = []
+ end
+ changeset[:commit] = $1
+ elsif (parsing_descr == 0) && line =~ /^(\w+):\s*(.*)$/
+ key = $1
+ value = $2
+ if key == "Author"
+ changeset[:author] = value
+ elsif key == "Date"
+ changeset[:date] = value
+ end
+ elsif (parsing_descr == 0) && line.chomp.to_s == ""
+ parsing_descr = 1
+ changeset[:description] = ""
+ elsif (parsing_descr == 1 || parsing_descr == 2) && line =~ /^:\d+\s+\d+\s+[0-9a-f.]+\s+[0-9a-f.]+\s+(\w)\s+(.+)$/
+ parsing_descr = 2
+ fileaction = $1
+ filepath = $2
+ files << {:action => fileaction, :path => filepath}
+ elsif (parsing_descr == 1) && line.chomp.to_s == ""
+ parsing_descr = 2
+ elsif (parsing_descr == 1)
+ changeset[:description] << line
+ end
+ end
+ rev = Revision.new({:identifier => changeset[:commit],
+ :scmid => changeset[:commit],
+ :author => changeset[:author],
+ :time => (changeset[:date] ? Time.parse(changeset[:date]) : nil),
+ :message => changeset[:description],
+ :paths => files
+ })
+
+ end
+
+ get_rev('latest',path) if rev == []
+
+ return nil if $? && $?.exitstatus != 0
+ return rev
+ end
+
+
+ def info
+ revs = revisions(url,nil,nil,{:limit => 1})
+ if revs && revs.any?
+ Info.new(:root_url => url, :lastrev => revs.first)
+ else
+ nil
+ end
+ rescue Errno::ENOENT => e
+ return nil
+ end
+
+ def entries(path=nil, identifier=nil)
+ path ||= ''
+ entries = Entries.new
+ cmd = "#{GIT_BIN} --git-dir #{target('')} ls-tree -l "
+ cmd << shell_quote("HEAD:" + path) if identifier.nil?
+ cmd << shell_quote(identifier + ":" + path) if identifier
+ shellout(cmd) do |io|
+ io.each_line do |line|
+ e = line.chomp.to_s
+ if e =~ /^\d+\s+(\w+)\s+([0-9a-f]{40})\s+([0-9-]+)\s+(.+)$/
+ type = $1
+ sha = $2
+ size = $3
+ name = $4
+ entries << Entry.new({:name => name,
+ :path => (path.empty? ? name : "#{path}/#{name}"),
+ :kind => ((type == "tree") ? 'dir' : 'file'),
+ :size => ((type == "tree") ? nil : size),
+ :lastrev => get_rev(identifier,(path.empty? ? name : "#{path}/#{name}"))
+
+ }) unless entries.detect{|entry| entry.name == name}
+ end
+ end
+ end
+ return nil if $? && $?.exitstatus != 0
+ entries.sort_by_name
+ end
+
+ def revisions(path, identifier_from, identifier_to, options={})
+ revisions = Revisions.new
+ cmd = "#{GIT_BIN} --git-dir #{target('')} log --raw "
+ cmd << " --reverse" if options[:reverse]
+ cmd << " -n #{options[:limit].to_i} " if (!options.nil?) && options[:limit]
+ cmd << " #{shell_quote(identifier_from + '..')} " if identifier_from
+ cmd << " #{shell_quote identifier_to} " if identifier_to
+ shellout(cmd) do |io|
+ files=[]
+ changeset = {}
+ parsing_descr = 0 #0: not parsing desc or files, 1: parsing desc, 2: parsing files
+ revno = 1
+
+ io.each_line do |line|
+ if line =~ /^commit ([0-9a-f]{40})$/
+ key = "commit"
+ value = $1
+ if (parsing_descr == 1 || parsing_descr == 2)
+ parsing_descr = 0
+ revision = Revision.new({:identifier => changeset[:commit],
+ :scmid => changeset[:commit],
+ :author => changeset[:author],
+ :time => Time.parse(changeset[:date]),
+ :message => changeset[:description],
+ :paths => files
+ })
+ if block_given?
+ yield revision
+ else
+ revisions << revision
+ end
+ changeset = {}
+ files = []
+ revno = revno + 1
+ end
+ changeset[:commit] = $1
+ elsif (parsing_descr == 0) && line =~ /^(\w+):\s*(.*)$/
+ key = $1
+ value = $2
+ if key == "Author"
+ changeset[:author] = value
+ elsif key == "Date"
+ changeset[:date] = value
+ end
+ elsif (parsing_descr == 0) && line.chomp.to_s == ""
+ parsing_descr = 1
+ changeset[:description] = ""
+ elsif (parsing_descr == 1 || parsing_descr == 2) && line =~ /^:\d+\s+\d+\s+[0-9a-f.]+\s+[0-9a-f.]+\s+(\w)\s+(.+)$/
+ parsing_descr = 2
+ fileaction = $1
+ filepath = $2
+ files << {:action => fileaction, :path => filepath}
+ elsif (parsing_descr == 1) && line.chomp.to_s == ""
+ parsing_descr = 2
+ elsif (parsing_descr == 1)
+ changeset[:description] << line[4..-1]
+ end
+ end
+
+ if changeset[:commit]
+ revision = Revision.new({:identifier => changeset[:commit],
+ :scmid => changeset[:commit],
+ :author => changeset[:author],
+ :time => Time.parse(changeset[:date]),
+ :message => changeset[:description],
+ :paths => files
+ })
+ if block_given?
+ yield revision
+ else
+ revisions << revision
+ end
+ end
+ end
+
+ return nil if $? && $?.exitstatus != 0
+ revisions
+ end
+
+ def diff(path, identifier_from, identifier_to=nil)
+ path ||= ''
+ if !identifier_to
+ identifier_to = nil
+ end
+
+ cmd = "#{GIT_BIN} --git-dir #{target('')} show #{shell_quote identifier_from}" if identifier_to.nil?
+ cmd = "#{GIT_BIN} --git-dir #{target('')} diff #{shell_quote identifier_to} #{shell_quote identifier_from}" if !identifier_to.nil?
+ cmd << " -- #{shell_quote path}" unless path.empty?
+ diff = []
+ shellout(cmd) do |io|
+ io.each_line do |line|
+ diff << line
+ end
+ end
+ return nil if $? && $?.exitstatus != 0
+ diff
+ end
+
+ def annotate(path, identifier=nil)
+ identifier = 'HEAD' if identifier.blank?
+ cmd = "#{GIT_BIN} --git-dir #{target('')} blame -l #{shell_quote identifier} -- #{shell_quote path}"
+ blame = Annotate.new
+ content = nil
+ shellout(cmd) { |io| io.binmode; content = io.read }
+ return nil if $? && $?.exitstatus != 0
+ # git annotates binary files
+ return nil if content.is_binary_data?
+ content.split("\n").each do |line|
+ next unless line =~ /([0-9a-f]{39,40})\s\((\w*)[^\)]*\)(.*)/
+ blame.add_line($3.rstrip, Revision.new(:identifier => $1, :author => $2.strip))
+ end
+ blame
+ end
+
+ def cat(path, identifier=nil)
+ if identifier.nil?
+ identifier = 'HEAD'
+ end
+ cmd = "#{GIT_BIN} --git-dir #{target('')} show #{shell_quote(identifier + ':' + path)}"
+ cat = nil
+ shellout(cmd) do |io|
+ io.binmode
+ cat = io.read
+ end
+ return nil if $? && $?.exitstatus != 0
+ cat
+ end
+ end
+ end
+ end
+
+end
+
diff --git a/lib/redmine/scm/adapters/mercurial/hg-template-0.9.5.tmpl b/lib/redmine/scm/adapters/mercurial/hg-template-0.9.5.tmpl
new file mode 100644
index 000000000..b3029e6ff
--- /dev/null
+++ b/lib/redmine/scm/adapters/mercurial/hg-template-0.9.5.tmpl
@@ -0,0 +1,12 @@
+changeset = 'This template must be used with --debug option\n'
+changeset_quiet = 'This template must be used with --debug option\n'
+changeset_verbose = 'This template must be used with --debug option\n'
+changeset_debug = '\n{author|escape} \n{date|isodate} \n\n{files}{file_adds}{file_dels}{file_copies} \n{desc|escape} \n{tags} \n\n'
+
+file = '{file|escape} \n'
+file_add = '{file_add|escape} \n'
+file_del = '{file_del|escape} \n'
+file_copy = '{name|urlescape} \n'
+tag = '{tag|escape} \n'
+header='\n\n\n'
+# footer=" "
\ No newline at end of file
diff --git a/lib/redmine/scm/adapters/mercurial/hg-template-1.0.tmpl b/lib/redmine/scm/adapters/mercurial/hg-template-1.0.tmpl
new file mode 100644
index 000000000..3eef85016
--- /dev/null
+++ b/lib/redmine/scm/adapters/mercurial/hg-template-1.0.tmpl
@@ -0,0 +1,12 @@
+changeset = 'This template must be used with --debug option\n'
+changeset_quiet = 'This template must be used with --debug option\n'
+changeset_verbose = 'This template must be used with --debug option\n'
+changeset_debug = '\n{author|escape} \n{date|isodate} \n\n{file_mods}{file_adds}{file_dels}{file_copies} \n{desc|escape} \n{tags} \n\n'
+
+file_mod = '{file_mod|escape} \n'
+file_add = '{file_add|escape} \n'
+file_del = '{file_del|escape} \n'
+file_copy = '{name|urlescape} \n'
+tag = '{tag|escape} \n'
+header='\n\n\n'
+# footer=" "
diff --git a/lib/redmine/scm/adapters/mercurial_adapter.rb b/lib/redmine/scm/adapters/mercurial_adapter.rb
index 54fa8c4f8..4eed776d8 100644
--- a/lib/redmine/scm/adapters/mercurial_adapter.rb
+++ b/lib/redmine/scm/adapters/mercurial_adapter.rb
@@ -21,9 +21,45 @@ module Redmine
module Scm
module Adapters
class MercurialAdapter < AbstractAdapter
-
+
# Mercurial executable name
HG_BIN = "hg"
+ TEMPLATES_DIR = File.dirname(__FILE__) + "/mercurial"
+ TEMPLATE_NAME = "hg-template"
+ TEMPLATE_EXTENSION = "tmpl"
+
+ class << self
+ def client_version
+ @@client_version ||= (hgversion || [])
+ end
+
+ def hgversion
+ # The hg version is expressed either as a
+ # release number (eg 0.9.5 or 1.0) or as a revision
+ # id composed of 12 hexa characters.
+ theversion = hgversion_from_command_line
+ if theversion.match(/^\d+(\.\d+)+/)
+ theversion.split(".").collect(&:to_i)
+ end
+ end
+
+ def hgversion_from_command_line
+ %x{#{HG_BIN} --version}.match(/\(version (.*)\)/)[1]
+ end
+
+ def template_path
+ @@template_path ||= template_path_for(client_version)
+ end
+
+ def template_path_for(version)
+ if ((version <=> [0,9,5]) > 0) || version.empty?
+ ver = "1.0"
+ else
+ ver = "0.9.5"
+ end
+ "#{TEMPLATES_DIR}/#{TEMPLATE_NAME}-#{ver}.#{TEMPLATE_EXTENSION}"
+ end
+ end
def info
cmd = "#{HG_BIN} -R #{target('')} root"
@@ -33,97 +69,88 @@ module Redmine
end
return nil if $? && $?.exitstatus != 0
info = Info.new({:root_url => root_url.chomp,
- :lastrev => revisions(nil,nil,nil,{:limit => 1}).last
- })
+ :lastrev => revisions(nil,nil,nil,{:limit => 1}).last
+ })
info
- rescue Errno::ENOENT => e
+ rescue CommandFailed
return nil
end
def entries(path=nil, identifier=nil)
path ||= ''
entries = Entries.new
- cmd = "#{HG_BIN} -R #{target('')} --cwd #{target(path)} locate -X */*/*"
- cmd << " -r #{identifier.to_i}" if identifier
- cmd << " * */*"
+ cmd = "#{HG_BIN} -R #{target('')} --cwd #{target('')} locate"
+ cmd << " -r " + (identifier ? identifier.to_s : "tip")
+ cmd << " " + shell_quote("path:#{path}") unless path.empty?
shellout(cmd) do |io|
io.each_line do |line|
- e = line.chomp.split('\\')
- entries << Entry.new({:name => e.first,
- :path => (path.empty? ? e.first : "#{path}/#{e.first}"),
- :kind => (e.size > 1 ? 'dir' : 'file'),
- :lastrev => Revision.new
- }) unless entries.detect{|entry| entry.name == e.first}
+ # HG uses antislashs as separator on Windows
+ line = line.gsub(/\\/, "/")
+ if path.empty? or e = line.gsub!(%r{^#{with_trailling_slash(path)}},'')
+ e ||= line
+ e = e.chomp.split(%r{[\/\\]})
+ entries << Entry.new({:name => e.first,
+ :path => (path.nil? or path.empty? ? e.first : "#{with_trailling_slash(path)}#{e.first}"),
+ :kind => (e.size > 1 ? 'dir' : 'file'),
+ :lastrev => Revision.new
+ }) unless entries.detect{|entry| entry.name == e.first}
+ end
end
end
return nil if $? && $?.exitstatus != 0
entries.sort_by_name
- rescue Errno::ENOENT => e
- raise CommandFailed
end
-
- def entry(path=nil, identifier=nil)
- path ||= ''
- search_path = path.split('/')[0..-2].join('/')
- entry_name = path.split('/').last
- e = entries(search_path, identifier)
- e ? e.detect{|entry| entry.name == entry_name} : nil
- end
-
- def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
+
+ # Fetch the revisions by using a template file that
+ # makes Mercurial produce a xml output.
+ def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
revisions = Revisions.new
- cmd = "#{HG_BIN} -v -R #{target('')} log"
- cmd << " -r #{identifier_from.to_i}:" if identifier_from
+ cmd = "#{HG_BIN} --debug --encoding utf8 -R #{target('')} log -C --style #{self.class.template_path}"
+ if identifier_from && identifier_to
+ cmd << " -r #{identifier_from.to_i}:#{identifier_to.to_i}"
+ elsif identifier_from
+ cmd << " -r #{identifier_from.to_i}:"
+ end
cmd << " --limit #{options[:limit].to_i}" if options[:limit]
+ cmd << " #{path}" if path
shellout(cmd) do |io|
- changeset = {}
- parsing_descr = false
- line_feeds = 0
-
- io.each_line do |line|
- if line =~ /^(\w+):\s*(.*)$/
- key = $1
- value = $2
- if parsing_descr && line_feeds > 1
- parsing_descr = false
- revisions << Revision.new({:identifier => changeset[:changeset].split(':').first.to_i,
- :scmid => changeset[:changeset].split(':').last,
- :author => changeset[:user],
- :time => Time.parse(changeset[:date]),
- :message => changeset[:description],
- :paths => changeset[:files].split.collect{|path| {:action => 'X', :path => "/#{path}"}}
- })
- changeset = {}
- end
- if !parsing_descr
- changeset.store key.to_sym, value
- if $1 == "description"
- parsing_descr = true
- line_feeds = 0
- next
+ begin
+ # HG doesn't close the XML Document...
+ doc = REXML::Document.new(io.read << "")
+ doc.elements.each("log/logentry") do |logentry|
+ paths = []
+ copies = logentry.get_elements('paths/path-copied')
+ logentry.elements.each("paths/path") do |path|
+ # Detect if the added file is a copy
+ if path.attributes['action'] == 'A' and c = copies.find{ |e| e.text == path.text }
+ from_path = c.attributes['copyfrom-path']
+ from_rev = logentry.attributes['revision']
end
+ paths << {:action => path.attributes['action'],
+ :path => "/#{path.text}",
+ :from_path => from_path ? "/#{from_path}" : nil,
+ :from_revision => from_rev ? from_rev : nil
+ }
end
+ paths.sort! { |x,y| x[:path] <=> y[:path] }
+
+ revisions << Revision.new({:identifier => logentry.attributes['revision'],
+ :scmid => logentry.attributes['node'],
+ :author => (logentry.elements['author'] ? logentry.elements['author'].text : ""),
+ :time => Time.parse(logentry.elements['date'].text).localtime,
+ :message => logentry.elements['msg'].text,
+ :paths => paths
+ })
end
- if parsing_descr
- changeset[:description] << line
- line_feeds += 1 if line.chomp.empty?
- end
+ rescue
+ logger.debug($!)
end
- revisions << Revision.new({:identifier => changeset[:changeset].split(':').first.to_i,
- :scmid => changeset[:changeset].split(':').last,
- :author => changeset[:user],
- :time => Time.parse(changeset[:date]),
- :message => changeset[:description],
- :paths => changeset[:files].split.collect{|path| {:action => 'X', :path => "/#{path}"}}
- })
end
return nil if $? && $?.exitstatus != 0
revisions
- rescue Errno::ENOENT => e
- raise CommandFailed
end
- def diff(path, identifier_from, identifier_to=nil, type="inline")
+ def diff(path, identifier_from, identifier_to=nil)
path ||= ''
if identifier_to
identifier_to = identifier_to.to_i
@@ -139,14 +166,13 @@ module Redmine
end
end
return nil if $? && $?.exitstatus != 0
- DiffTableList.new diff, type
-
- rescue Errno::ENOENT => e
- raise CommandFailed
+ diff
end
def cat(path, identifier=nil)
- cmd = "#{HG_BIN} -R #{target('')} cat #{target(path)}"
+ cmd = "#{HG_BIN} -R #{target('')} cat"
+ cmd << " -r " + (identifier ? identifier.to_s : "tip")
+ cmd << " #{target(path)}"
cat = nil
shellout(cmd) do |io|
io.binmode
@@ -154,8 +180,24 @@ module Redmine
end
return nil if $? && $?.exitstatus != 0
cat
- rescue Errno::ENOENT => e
- raise CommandFailed
+ end
+
+ def annotate(path, identifier=nil)
+ path ||= ''
+ cmd = "#{HG_BIN} -R #{target('')}"
+ cmd << " annotate -n -u"
+ cmd << " -r " + (identifier ? identifier.to_s : "tip")
+ cmd << " -r #{identifier.to_i}" if identifier
+ cmd << " #{target(path)}"
+ blame = Annotate.new
+ shellout(cmd) do |io|
+ io.each_line do |line|
+ next unless line =~ %r{^([^:]+)\s(\d+):(.*)$}
+ blame.add_line($3.rstrip, Revision.new(:identifier => $2.to_i, :author => $1.strip))
+ end
+ end
+ return nil if $? && $?.exitstatus != 0
+ blame
end
end
end
diff --git a/lib/redmine/scm/adapters/subversion_adapter.rb b/lib/redmine/scm/adapters/subversion_adapter.rb
index 9e8acce4c..2b7f0192e 100644
--- a/lib/redmine/scm/adapters/subversion_adapter.rb
+++ b/lib/redmine/scm/adapters/subversion_adapter.rb
@@ -26,6 +26,25 @@ module Redmine
# SVN executable name
SVN_BIN = "svn"
+ class << self
+ def client_version
+ @@client_version ||= (svn_binary_version || [])
+ end
+
+ def svn_binary_version
+ cmd = "#{SVN_BIN} --version"
+ version = nil
+ shellout(cmd) do |io|
+ # Read svn version in first returned line
+ if m = io.gets.match(%r{((\d+\.)+\d+)})
+ version = m[0].scan(%r{\d+}).collect(&:to_i)
+ end
+ end
+ return nil if $? && $?.exitstatus != 0
+ version
+ end
+ end
+
# Get info about the svn repository
def info
cmd = "#{SVN_BIN} info --xml #{target('')}"
@@ -47,31 +66,26 @@ module Redmine
end
return nil if $? && $?.exitstatus != 0
info
- rescue Errno::ENOENT => e
+ rescue CommandFailed
return nil
end
- # Returns the entry identified by path and revision identifier
- # or nil if entry doesn't exist in the repository
- def entry(path=nil, identifier=nil)
- e = entries(path, identifier)
- e ? e.first : nil
- end
-
# Returns an Entries collection
# or nil if the given path doesn't exist in the repository
def entries(path=nil, identifier=nil)
path ||= ''
- identifier = 'HEAD' unless identifier and identifier > 0
+ identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD"
entries = Entries.new
cmd = "#{SVN_BIN} list --xml #{target(path)}@#{identifier}"
cmd << credentials_string
- cmd << " 2>&1"
shellout(cmd) do |io|
output = io.read
begin
doc = REXML::Document.new(output)
doc.elements.each("lists/list/entry") do |entry|
+ # Skip directory if there is no commit date (usually that
+ # means that we don't have read access to it)
+ next if entry.attributes['kind'] == 'dir' && entry.elements['commit'].elements['date'].nil?
entries << Entry.new({:name => entry.elements['name'].text,
:path => ((path.empty? ? "" : "#{path}/") + entry.elements['name'].text),
:kind => entry.attributes['kind'],
@@ -91,19 +105,39 @@ module Redmine
return nil if $? && $?.exitstatus != 0
logger.debug("Found #{entries.size} entries in the repository for #{target(path)}") if logger && logger.debug?
entries.sort_by_name
- rescue Errno::ENOENT => e
- raise CommandFailed
end
-
+
+ def properties(path, identifier=nil)
+ # proplist xml output supported in svn 1.5.0 and higher
+ return nil unless self.class.client_version_above?([1, 5, 0])
+
+ identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD"
+ cmd = "#{SVN_BIN} proplist --verbose --xml #{target(path)}@#{identifier}"
+ cmd << credentials_string
+ properties = {}
+ shellout(cmd) do |io|
+ output = io.read
+ begin
+ doc = REXML::Document.new(output)
+ doc.elements.each("properties/target/property") do |property|
+ properties[ property.attributes['name'] ] = property.text
+ end
+ rescue
+ end
+ end
+ return nil if $? && $?.exitstatus != 0
+ properties
+ end
+
def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
path ||= ''
- identifier_from = 'HEAD' unless identifier_from and identifier_from.to_i > 0
- identifier_to = 1 unless identifier_to and identifier_to.to_i > 0
+ identifier_from = (identifier_from and identifier_from.to_i > 0) ? identifier_from.to_i : "HEAD"
+ identifier_to = (identifier_to and identifier_to.to_i > 0) ? identifier_to.to_i : 1
revisions = Revisions.new
cmd = "#{SVN_BIN} log --xml -r #{identifier_from}:#{identifier_to}"
cmd << credentials_string
cmd << " --verbose " if options[:with_paths]
- cmd << target(path)
+ cmd << ' ' + target(path)
shellout(cmd) do |io|
begin
doc = REXML::Document.new(io)
@@ -130,21 +164,17 @@ module Redmine
end
return nil if $? && $?.exitstatus != 0
revisions
- rescue Errno::ENOENT => e
- raise CommandFailed
end
def diff(path, identifier_from, identifier_to=nil, type="inline")
path ||= ''
- if identifier_to and identifier_to.to_i > 0
- identifier_to = identifier_to.to_i
- else
- identifier_to = identifier_from.to_i - 1
- end
+ identifier_from = (identifier_from and identifier_from.to_i > 0) ? identifier_from.to_i : ''
+ identifier_to = (identifier_to and identifier_to.to_i > 0) ? identifier_to.to_i : (identifier_from.to_i - 1)
+
cmd = "#{SVN_BIN} diff -r "
cmd << "#{identifier_to}:"
cmd << "#{identifier_from}"
- cmd << "#{target(path)}@#{identifier_from}"
+ cmd << " #{target(path)}@#{identifier_from}"
cmd << credentials_string
diff = []
shellout(cmd) do |io|
@@ -153,9 +183,7 @@ module Redmine
end
end
return nil if $? && $?.exitstatus != 0
- DiffTableList.new diff, type
- rescue Errno::ENOENT => e
- raise CommandFailed
+ diff
end
def cat(path, identifier=nil)
@@ -169,8 +197,21 @@ module Redmine
end
return nil if $? && $?.exitstatus != 0
cat
- rescue Errno::ENOENT => e
- raise CommandFailed
+ end
+
+ def annotate(path, identifier=nil)
+ identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD"
+ cmd = "#{SVN_BIN} blame #{target(path)}@#{identifier}"
+ cmd << credentials_string
+ blame = Annotate.new
+ shellout(cmd) do |io|
+ io.each_line do |line|
+ next unless line =~ %r{^\s*(\d+)\s*(\S+)\s(.*)$}
+ blame.add_line($3.rstrip, Revision.new(:identifier => $1.to_i, :author => $2.strip))
+ end
+ end
+ return nil if $? && $?.exitstatus != 0
+ blame
end
private
diff --git a/lib/redmine/themes.rb b/lib/redmine/themes.rb
index abbd34cd1..d0c90e3a9 100644
--- a/lib/redmine/themes.rb
+++ b/lib/redmine/themes.rb
@@ -54,7 +54,7 @@ module Redmine
private
def self.scan_themes
- dirs = Dir.glob('public/themes/*').select do |f|
+ dirs = Dir.glob("#{RAILS_ROOT}/public/themes/*").select do |f|
# A theme should at least override application.css
File.directory?(f) && File.exist?("#{f}/stylesheets/application.css")
end
@@ -69,4 +69,8 @@ module ApplicationHelper
super((@current_theme && @current_theme.stylesheets.include?(source)) ?
"/themes/#{@current_theme.dir}/stylesheets/#{source}" : source)
end
+
+ def path_to_stylesheet(source)
+ stylesheet_path source
+ end
end
diff --git a/lib/redmine/unified_diff.rb b/lib/redmine/unified_diff.rb
new file mode 100644
index 000000000..aa8994454
--- /dev/null
+++ b/lib/redmine/unified_diff.rb
@@ -0,0 +1,178 @@
+# redMine - project management software
+# Copyright (C) 2006-2008 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+module Redmine
+ # Class used to parse unified diffs
+ class UnifiedDiff < Array
+ def initialize(diff, type="inline")
+ diff_table = DiffTable.new type
+ diff.each do |line|
+ if line =~ /^(---|\+\+\+) (.*)$/
+ self << diff_table if diff_table.length > 1
+ diff_table = DiffTable.new type
+ end
+ a = diff_table.add_line line
+ end
+ self << diff_table unless diff_table.empty?
+ self
+ end
+ end
+
+ # Class that represents a file diff
+ class DiffTable < Hash
+ attr_reader :file_name, :line_num_l, :line_num_r
+
+ # Initialize with a Diff file and the type of Diff View
+ # The type view must be inline or sbs (side_by_side)
+ def initialize(type="inline")
+ @parsing = false
+ @nb_line = 1
+ @start = false
+ @before = 'same'
+ @second = true
+ @type = type
+ end
+
+ # Function for add a line of this Diff
+ def add_line(line)
+ unless @parsing
+ if line =~ /^(---|\+\+\+) (.*)$/
+ @file_name = $2
+ return false
+ elsif line =~ /^@@ (\+|\-)(\d+)(,\d+)? (\+|\-)(\d+)(,\d+)? @@/
+ @line_num_l = $5.to_i
+ @line_num_r = $2.to_i
+ @parsing = true
+ end
+ else
+ if line =~ /^[^\+\-\s@\\]/
+ @parsing = false
+ return false
+ elsif line =~ /^@@ (\+|\-)(\d+)(,\d+)? (\+|\-)(\d+)(,\d+)? @@/
+ @line_num_l = $5.to_i
+ @line_num_r = $2.to_i
+ else
+ @nb_line += 1 if parse_line(line, @type)
+ end
+ end
+ return true
+ end
+
+ def inspect
+ puts '### DIFF TABLE ###'
+ puts "file : #{file_name}"
+ self.each do |d|
+ d.inspect
+ end
+ end
+
+ private
+ # Test if is a Side By Side type
+ def sbs?(type, func)
+ if @start and type == "sbs"
+ if @before == func and @second
+ tmp_nb_line = @nb_line
+ self[tmp_nb_line] = Diff.new
+ else
+ @second = false
+ tmp_nb_line = @start
+ @start += 1
+ @nb_line -= 1
+ end
+ else
+ tmp_nb_line = @nb_line
+ @start = @nb_line
+ self[tmp_nb_line] = Diff.new
+ @second = true
+ end
+ unless self[tmp_nb_line]
+ @nb_line += 1
+ self[tmp_nb_line] = Diff.new
+ else
+ self[tmp_nb_line]
+ end
+ end
+
+ # Escape the HTML for the diff
+ def escapeHTML(line)
+ CGI.escapeHTML(line)
+ end
+
+ def parse_line(line, type="inline")
+ if line[0, 1] == "+"
+ diff = sbs? type, 'add'
+ @before = 'add'
+ diff.line_left = escapeHTML line[1..-1]
+ diff.nb_line_left = @line_num_l
+ diff.type_diff_left = 'diff_in'
+ @line_num_l += 1
+ true
+ elsif line[0, 1] == "-"
+ diff = sbs? type, 'remove'
+ @before = 'remove'
+ diff.line_right = escapeHTML line[1..-1]
+ diff.nb_line_right = @line_num_r
+ diff.type_diff_right = 'diff_out'
+ @line_num_r += 1
+ true
+ elsif line[0, 1] =~ /\s/
+ @before = 'same'
+ @start = false
+ diff = Diff.new
+ diff.line_right = escapeHTML line[1..-1]
+ diff.nb_line_right = @line_num_r
+ diff.line_left = escapeHTML line[1..-1]
+ diff.nb_line_left = @line_num_l
+ self[@nb_line] = diff
+ @line_num_l += 1
+ @line_num_r += 1
+ true
+ elsif line[0, 1] = "\\"
+ true
+ else
+ false
+ end
+ end
+ end
+
+ # A line of diff
+ class Diff
+ attr_accessor :nb_line_left
+ attr_accessor :line_left
+ attr_accessor :nb_line_right
+ attr_accessor :line_right
+ attr_accessor :type_diff_right
+ attr_accessor :type_diff_left
+
+ def initialize()
+ self.nb_line_left = ''
+ self.nb_line_right = ''
+ self.line_left = ''
+ self.line_right = ''
+ self.type_diff_right = ''
+ self.type_diff_left = ''
+ end
+
+ def inspect
+ puts '### Start Line Diff ###'
+ puts self.nb_line_left
+ puts self.line_left
+ puts self.nb_line_right
+ puts self.line_right
+ end
+ end
+end
diff --git a/lib/redmine/version.rb b/lib/redmine/version.rb
index f09287e7c..81006fe2d 100644
--- a/lib/redmine/version.rb
+++ b/lib/redmine/version.rb
@@ -3,8 +3,8 @@ require 'rexml/document'
module Redmine
module VERSION #:nodoc:
MAJOR = 0
- MINOR = 6
- TINY = 0
+ MINOR = 7
+ TINY = 'devel'
def self.revision
revision = nil
diff --git a/lib/redmine/wiki_formatting.rb b/lib/redmine/wiki_formatting.rb
index 4aebe9a96..8c18d547f 100644
--- a/lib/redmine/wiki_formatting.rb
+++ b/lib/redmine/wiki_formatting.rb
@@ -25,7 +25,8 @@ module Redmine
class TextileFormatter < RedCloth
- RULES = [:inline_auto_link, :inline_auto_mailto, :textile, :inline_toc, :inline_macros]
+ # auto_link rule after textile rules so that it doesn't break !image_url! tags
+ RULES = [:textile, :block_markdown_rule, :inline_auto_link, :inline_auto_mailto, :inline_toc, :inline_macros]
def initialize(*args)
super
@@ -44,7 +45,7 @@ module Redmine
# Patch for RedCloth. Fixed in RedCloth r128 but _why hasn't released it yet.
# http://code.whytheluckystiff.net/redcloth/changeset/128
def hard_break( text )
- text.gsub!( /(.)\n(?!\n|\Z| *([#*=]+(\s|$)|[{|]))/, "\\1 " ) if hard_breaks
+ text.gsub!( /(.)\n(?!\n|\Z|>| *(>? *[#*=]+(\s|$)|[{|]))/, "\\1 \n" ) if hard_breaks
end
# Patch to add code highlighting support to RedCloth
@@ -55,7 +56,7 @@ module Redmine
content = @pre_list[$1.to_i]
if content.match(/\s?(.+)/m)
content = "" +
- CodeRay.scan($2, $1).html(:escape => false, :line_numbers => :inline)
+ CodeRay.scan($2, $1.downcase).html(:escape => false, :line_numbers => :inline)
end
content
end
@@ -64,10 +65,22 @@ module Redmine
# Patch to add 'table of content' support to RedCloth
def textile_p_withtoc(tag, atts, cite, content)
- if tag =~ /^h(\d)$/
- @toc << [$1.to_i, content]
+ # removes wiki links from the item
+ toc_item = content.gsub(/(\[\[|\]\])/, '')
+ # removes styles
+ # eg. %{color:red}Triggers% => Triggers
+ toc_item.gsub! %r[%\{[^\}]*\}([^%]+)%], '\\1'
+
+ # replaces non word caracters by dashes
+ anchor = toc_item.gsub(%r{[^\w\s\-]}, '').gsub(%r{\s+(\-+\s*)?}, '-')
+
+ unless anchor.blank?
+ if tag =~ /^h(\d)$/
+ @toc << [$1.to_i, anchor, toc_item]
+ end
+ atts << " id=\"#{anchor}\""
+ content = content + "¶ "
end
- content = " " + content
textile_p(tag, atts, cite, content)
end
@@ -80,33 +93,39 @@ module Redmine
div_class = 'toc'
div_class << ' right' if $1 == '>'
div_class << ' left' if $1 == '<'
- out = ""
- @toc.each_with_index do |heading, index|
- # remove wiki links from the item
- toc_item = heading.last.gsub(/(\[\[|\]\])/, '')
- out << "
#{toc_item} "
+ out = "
"
+ @toc.each do |heading|
+ level, anchor, toc_item = heading
+ out << "#{toc_item} \n"
end
- out << ' '
+ out << ''
out
end
end
MACROS_RE = /
+ (!)? # escaping
+ (
\{\{ # opening tag
([\w]+) # macro name
(\(([^\}]*)\))? # optional arguments
\}\} # closing tag
+ )
/x unless const_defined?(:MACROS_RE)
def inline_macros(text)
text.gsub!(MACROS_RE) do
- all, macro = $&, $1.downcase
- args = ($3 || '').split(',').each(&:strip)
- begin
- @macros_runner.call(macro, args)
- rescue => e
- "Error executing the #{macro} macro (#{e})
"
- end || all
+ esc, all, macro = $1, $2, $3.downcase
+ args = ($5 || '').split(',').each(&:strip)
+ if esc.nil?
+ begin
+ @macros_runner.call(macro, args)
+ rescue => e
+ "Error executing the #{macro} macro (#{e})
"
+ end || all
+ else
+ all
+ end
end
end
@@ -118,6 +137,7 @@ module Redmine
)
(
(?:https?://)| # protocol spec, or
+ (?:ftp://)|
(?:www\.) # www.*
)
(
@@ -141,12 +161,16 @@ module Redmine
end
end
end
-
+
# Turns all email addresses into clickable links (code from Rails).
def inline_auto_mailto(text)
text.gsub!(/([\w\.!#\$%\-+.]+@[A-Za-z0-9\-]+(\.[A-Za-z0-9\-]+)+)/) do
- text = $1
- %{#{text} }
+ mail = $1
+ if text.match(/]*>(.*)(#{Regexp.escape(mail)})(.*)<\/a>/)
+ mail
+ else
+ %{ #{mail} }
+ end
end
end
end
diff --git a/lib/redmine/wiki_formatting/macros.rb b/lib/redmine/wiki_formatting/macros.rb
index f9920afdb..adfc590e4 100644
--- a/lib/redmine/wiki_formatting/macros.rb
+++ b/lib/redmine/wiki_formatting/macros.rb
@@ -62,7 +62,7 @@ module Redmine
end
# Builtin macros
- desc "Example macro."
+ desc "Sample macro."
macro :hello_world do |obj, args|
"Hello world! Object: #{obj.class.name}, " + (args.empty? ? "Called with no argument." : "Arguments: #{args.join(', ')}")
end
@@ -72,10 +72,36 @@ module Redmine
out = ''
@@available_macros.keys.collect(&:to_s).sort.each do |macro|
out << content_tag('dt', content_tag('code', macro))
- out << content_tag('dd', simple_format(@@available_macros[macro.to_sym]))
+ out << content_tag('dd', textilizable(@@available_macros[macro.to_sym]))
end
content_tag('dl', out)
end
+
+ desc "Displays a list of child pages."
+ macro :child_pages do |obj, args|
+ raise 'This macro applies to wiki pages only.' unless obj.is_a?(WikiContent)
+ render_page_hierarchy(obj.page.descendants.group_by(&:parent_id), obj.page.id)
+ end
+
+ desc "Include a wiki page. Example:\n\n !{{include(Foo)}}\n\nor to include a page of a specific project wiki:\n\n !{{include(projectname:Foo)}}"
+ macro :include do |obj, args|
+ project = @project
+ title = args.first.to_s
+ if title =~ %r{^([^\:]+)\:(.*)$}
+ project_identifier, title = $1, $2
+ project = Project.find_by_identifier(project_identifier) || Project.find_by_name(project_identifier)
+ end
+ raise 'Unknow project' unless project && User.current.allowed_to?(:view_wiki_pages, project)
+ raise 'No wiki for this project' unless !project.wiki.nil?
+ page = project.wiki.find_page(title)
+ raise "Page #{args.first} doesn't exist" unless page && page.content
+ @included_wiki_pages ||= []
+ raise 'Circular inclusion detected' if @included_wiki_pages.include?(page.title)
+ @included_wiki_pages << page.title
+ out = textilizable(page.content, :text, :attachments => page.attachments)
+ @included_wiki_pages.pop
+ out
+ end
end
end
end
diff --git a/lib/tabular_form_builder.rb b/lib/tabular_form_builder.rb
new file mode 100644
index 000000000..88e35a6d2
--- /dev/null
+++ b/lib/tabular_form_builder.rb
@@ -0,0 +1,51 @@
+# redMine - project management software
+# Copyright (C) 2006-2007 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+require 'action_view/helpers/form_helper'
+
+class TabularFormBuilder < ActionView::Helpers::FormBuilder
+ include GLoc
+
+ def initialize(object_name, object, template, options, proc)
+ set_language_if_valid options.delete(:lang)
+ super
+ end
+
+ (field_helpers - %w(radio_button hidden_field) + %w(date_select)).each do |selector|
+ src = <<-END_SRC
+ def #{selector}(field, options = {})
+ return super if options.delete :no_label
+ label_text = l(options[:label]) if options[:label]
+ label_text ||= l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym)
+ label_text << @template.content_tag("span", " *", :class => "required") if options.delete(:required)
+ label = @template.content_tag("label", label_text,
+ :class => (@object && @object.errors[field] ? "error" : nil),
+ :for => (@object_name.to_s + "_" + field.to_s))
+ label + super
+ end
+ END_SRC
+ class_eval src, __FILE__, __LINE__
+ end
+
+ def select(field, choices, options = {}, html_options = {})
+ label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
+ label = @template.content_tag("label", label_text,
+ :class => (@object && @object.errors[field] ? "error" : nil),
+ :for => (@object_name.to_s + "_" + field.to_s))
+ label + super
+ end
+end
diff --git a/lib/tasks/email.rake b/lib/tasks/email.rake
new file mode 100644
index 000000000..a37b3e197
--- /dev/null
+++ b/lib/tasks/email.rake
@@ -0,0 +1,105 @@
+# redMine - project management software
+# Copyright (C) 2006-2008 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+namespace :redmine do
+ namespace :email do
+
+ desc <<-END_DESC
+Read an email from standard input.
+
+Issue attributes control options:
+ project=PROJECT identifier of the target project
+ tracker=TRACKER name of the target tracker
+ category=CATEGORY name of the target category
+ priority=PRIORITY name of the target priority
+ allow_override=ATTRS allow email content to override attributes
+ specified by previous options
+ ATTRS is a comma separated list of attributes
+
+Examples:
+ # No project specified. Emails MUST contain the 'Project' keyword:
+ rake redmine:email:read RAILS_ENV="production" < raw_email
+
+ # Fixed project and default tracker specified, but emails can override
+ # both tracker and priority attributes:
+ rake redmine:email:read RAILS_ENV="production" \\
+ project=foo \\
+ tracker=bug \\
+ allow_override=tracker,priority < raw_email
+END_DESC
+
+ task :read => :environment do
+ options = { :issue => {} }
+ %w(project tracker category priority).each { |a| options[:issue][a.to_sym] = ENV[a] if ENV[a] }
+ options[:allow_override] = ENV['allow_override'] if ENV['allow_override']
+
+ MailHandler.receive(STDIN.read, options)
+ end
+
+ desc <<-END_DESC
+Read emails from an IMAP server.
+
+Available IMAP options:
+ host=HOST IMAP server host (default: 127.0.0.1)
+ port=PORT IMAP server port (default: 143)
+ ssl=SSL Use SSL? (default: false)
+ username=USERNAME IMAP account
+ password=PASSWORD IMAP password
+ folder=FOLDER IMAP folder to read (default: INBOX)
+
+Issue attributes control options:
+ project=PROJECT identifier of the target project
+ tracker=TRACKER name of the target tracker
+ category=CATEGORY name of the target category
+ priority=PRIORITY name of the target priority
+ allow_override=ATTRS allow email content to override attributes
+ specified by previous options
+ ATTRS is a comma separated list of attributes
+
+Examples:
+ # No project specified. Emails MUST contain the 'Project' keyword:
+
+ rake redmine:email:receive_iamp RAILS_ENV="production" \\
+ host=imap.foo.bar username=redmine@example.net password=xxx
+
+
+ # Fixed project and default tracker specified, but emails can override
+ # both tracker and priority attributes:
+
+ rake redmine:email:receive_iamp RAILS_ENV="production" \\
+ host=imap.foo.bar username=redmine@example.net password=xxx ssl=1 \\
+ project=foo \\
+ tracker=bug \\
+ allow_override=tracker,priority
+END_DESC
+
+ task :receive_imap => :environment do
+ imap_options = {:host => ENV['host'],
+ :port => ENV['port'],
+ :ssl => ENV['ssl'],
+ :username => ENV['username'],
+ :password => ENV['password'],
+ :folder => ENV['folder']}
+
+ options = { :issue => {} }
+ %w(project tracker category priority).each { |a| options[:issue][a.to_sym] = ENV[a] if ENV[a] }
+ options[:allow_override] = ENV['allow_override'] if ENV['allow_override']
+
+ Redmine::IMAP.check(imap_options, options)
+ end
+ end
+end
diff --git a/lib/tasks/fetch_changesets.rake b/lib/tasks/fetch_changesets.rake
new file mode 100644
index 000000000..681032bd6
--- /dev/null
+++ b/lib/tasks/fetch_changesets.rake
@@ -0,0 +1,24 @@
+# redMine - project management software
+# Copyright (C) 2006-2008 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+desc 'Fetch changesets from the repositories'
+
+namespace :redmine do
+ task :fetch_changesets => :environment do
+ Repository.fetch_changesets
+ end
+end
diff --git a/lib/tasks/load_default_data.rake b/lib/tasks/load_default_data.rake
index 8e89d4ecd..6ddd1fb97 100644
--- a/lib/tasks/load_default_data.rake
+++ b/lib/tasks/load_default_data.rake
@@ -1,168 +1,29 @@
desc 'Load Redmine default configuration data'
namespace :redmine do
-task :load_default_data => :environment do
- include GLoc
- set_language_if_valid('en')
- puts
-
- while true
- print "Select language: "
- print GLoc.valid_languages.sort {|x,y| x.to_s <=> y.to_s }.join(", ")
- print " [#{GLoc.current_language}] "
- lang = STDIN.gets.chomp!
- break if lang.empty?
- break if set_language_if_valid(lang)
- puts "Unknown language!"
- end
+ task :load_default_data => :environment do
+ include GLoc
+ set_language_if_valid('en')
+ puts
- puts "===================================="
-
-begin
- # check that no data already exists
- if Role.find(:first, :conditions => {:builtin => 0})
- raise "Some roles are already defined."
- end
- if Tracker.find(:first)
- raise "Some trackers are already defined."
- end
- if IssueStatus.find(:first)
- raise "Some statuses are already defined."
- end
- if Enumeration.find(:first)
- raise "Some enumerations are already defined."
- end
+ while true
+ print "Select language: "
+ print GLoc.valid_languages.sort {|x,y| x.to_s <=> y.to_s }.join(", ")
+ print " [#{GLoc.current_language}] "
+ lang = STDIN.gets.chomp!
+ break if lang.empty?
+ break if set_language_if_valid(lang)
+ puts "Unknown language!"
+ end
- puts "Loading default configuration data for language: #{current_language}"
-
- # roles
- manager = Role.create :name => l(:default_role_manager),
- :position => 1
- manager.permissions = manager.setable_permissions.collect {|p| p.name}
- manager.save
-
- developper = Role.create :name => l(:default_role_developper),
- :position => 2,
- :permissions => [:manage_versions,
- :manage_categories,
- :add_issues,
- :edit_issues,
- :manage_issue_relations,
- :add_issue_notes,
- :change_issue_status,
- :save_queries,
- :view_gantt,
- :view_calendar,
- :log_time,
- :view_time_entries,
- :comment_news,
- :view_documents,
- :view_wiki_pages,
- :edit_wiki_pages,
- :delete_wiki_pages,
- :add_messages,
- :view_files,
- :manage_files,
- :browse_repository,
- :view_changesets]
-
- reporter = Role.create :name => l(:default_role_reporter),
- :position => 3,
- :permissions => [:add_issues,
- :add_issue_notes,
- :change_issue_status,
- :save_queries,
- :view_gantt,
- :view_calendar,
- :log_time,
- :view_time_entries,
- :comment_news,
- :view_documents,
- :view_wiki_pages,
- :add_messages,
- :view_files,
- :browse_repository,
- :view_changesets]
-
- Role.non_member.update_attribute :permissions, [:add_issues,
- :add_issue_notes,
- :change_issue_status,
- :save_queries,
- :view_gantt,
- :view_calendar,
- :view_time_entries,
- :comment_news,
- :view_documents,
- :view_wiki_pages,
- :add_messages,
- :view_files,
- :browse_repository,
- :view_changesets]
-
- Role.anonymous.update_attribute :permissions, [:view_gantt,
- :view_calendar,
- :view_time_entries,
- :view_documents,
- :view_wiki_pages,
- :view_files,
- :browse_repository,
- :view_changesets]
-
- # trackers
- Tracker.create(:name => l(:default_tracker_bug), :is_in_chlog => true, :is_in_roadmap => false, :position => 1)
- Tracker.create(:name => l(:default_tracker_feature), :is_in_chlog => true, :is_in_roadmap => true, :position => 2)
- Tracker.create(:name => l(:default_tracker_support), :is_in_chlog => false, :is_in_roadmap => false, :position => 3)
-
- # issue statuses
- new = IssueStatus.create(:name => l(:default_issue_status_new), :is_closed => false, :is_default => true, :position => 1)
- assigned = IssueStatus.create(:name => l(:default_issue_status_assigned), :is_closed => false, :is_default => false, :position => 2)
- resolved = IssueStatus.create(:name => l(:default_issue_status_resolved), :is_closed => false, :is_default => false, :position => 3)
- feedback = IssueStatus.create(:name => l(:default_issue_status_feedback), :is_closed => false, :is_default => false, :position => 4)
- closed = IssueStatus.create(:name => l(:default_issue_status_closed), :is_closed => true, :is_default => false, :position => 5)
- rejected = IssueStatus.create(:name => l(:default_issue_status_rejected), :is_closed => true, :is_default => false, :position => 6)
-
- # workflow
- Tracker.find(:all).each { |t|
- IssueStatus.find(:all).each { |os|
- IssueStatus.find(:all).each { |ns|
- Workflow.create(:tracker_id => t.id, :role_id => manager.id, :old_status_id => os.id, :new_status_id => ns.id) unless os == ns
- }
- }
- }
-
- Tracker.find(:all).each { |t|
- [new, assigned, resolved, feedback].each { |os|
- [assigned, resolved, feedback, closed].each { |ns|
- Workflow.create(:tracker_id => t.id, :role_id => developper.id, :old_status_id => os.id, :new_status_id => ns.id) unless os == ns
- }
- }
- }
-
- Tracker.find(:all).each { |t|
- [new, assigned, resolved, feedback].each { |os|
- [closed].each { |ns|
- Workflow.create(:tracker_id => t.id, :role_id => reporter.id, :old_status_id => os.id, :new_status_id => ns.id) unless os == ns
- }
- }
- Workflow.create(:tracker_id => t.id, :role_id => reporter.id, :old_status_id => resolved.id, :new_status_id => feedback.id)
- }
-
- # enumerations
- Enumeration.create(:opt => "DCAT", :name => l(:default_doc_category_user), :position => 1)
- Enumeration.create(:opt => "DCAT", :name => l(:default_doc_category_tech), :position => 2)
-
- Enumeration.create(:opt => "IPRI", :name => l(:default_priority_low), :position => 1)
- Enumeration.create(:opt => "IPRI", :name => l(:default_priority_normal), :position => 2, :is_default => true)
- Enumeration.create(:opt => "IPRI", :name => l(:default_priority_high), :position => 3)
- Enumeration.create(:opt => "IPRI", :name => l(:default_priority_urgent), :position => 4)
- Enumeration.create(:opt => "IPRI", :name => l(:default_priority_immediate), :position => 5)
-
- Enumeration.create(:opt => "ACTI", :name => l(:default_activity_design), :position => 1)
- Enumeration.create(:opt => "ACTI", :name => l(:default_activity_development), :position => 2)
-
-rescue => error
- puts "Error: " + error
- puts "Default configuration data can't be loaded."
-end
-end
+ puts "===================================="
+
+ begin
+ Redmine::DefaultData::Loader.load(current_language)
+ puts "Default configuration data loaded."
+ rescue => error
+ puts "Error: " + error
+ puts "Default configuration data was not loaded."
+ end
+ end
end
diff --git a/lib/tasks/migrate_from_mantis.rake b/lib/tasks/migrate_from_mantis.rake
index fff668b64..bf3c32ccd 100644
--- a/lib/tasks/migrate_from_mantis.rake
+++ b/lib/tasks/migrate_from_mantis.rake
@@ -53,9 +53,10 @@ task :migrate_from_mantis => :environment do
TRACKER_BUG = Tracker.find_by_position(1)
TRACKER_FEATURE = Tracker.find_by_position(2)
- DEFAULT_ROLE = Role.find_by_position(3)
- manager_role = Role.find_by_position(1)
- developer_role = Role.find_by_position(2)
+ roles = Role.find(:all, :conditions => {:builtin => 0}, :order => 'position ASC')
+ manager_role = roles[0]
+ developer_role = roles[1]
+ DEFAULT_ROLE = roles.last
ROLE_MAPPING = {10 => DEFAULT_ROLE, # viewer
25 => DEFAULT_ROLE, # reporter
40 => DEFAULT_ROLE, # updater
@@ -86,18 +87,24 @@ task :migrate_from_mantis => :environment do
set_table_name :mantis_user_table
def firstname
- realname.blank? ? username : realname.split.first[0..29]
+ @firstname = realname.blank? ? username : realname.split.first[0..29]
+ @firstname.gsub!(/[^\w\s\'\-]/i, '')
+ @firstname
end
def lastname
- realname.blank? ? username : realname.split[1..-1].join(' ')[0..29]
+ @lastname = realname.blank? ? '-' : realname.split[1..-1].join(' ')[0..29]
+ @lastname.gsub!(/[^\w\s\'\-]/i, '')
+ @lastname = '-' if @lastname.blank?
+ @lastname
end
def email
- if read_attribute(:email).match(/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i)
- read_attribute(:email)
+ if read_attribute(:email).match(/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i) &&
+ !User.find_by_mail(read_attribute(:email))
+ @email = read_attribute(:email)
else
- "#{username}@foo.bar"
+ @email = "#{username}@foo.bar"
end
end
@@ -114,15 +121,11 @@ task :migrate_from_mantis => :environment do
has_many :members, :class_name => "MantisProjectUser", :foreign_key => :project_id
def name
- read_attribute(:name)[0..29].gsub(/[^\w\s\'\-]/, '-')
- end
-
- def description
- read_attribute(:description).blank? ? read_attribute(:name) : read_attribute(:description)[0..254]
+ read_attribute(:name)[0..29]
end
def identifier
- read_attribute(:name).underscore[0..11].gsub(/[^a-z0-9\-]/, '-')
+ read_attribute(:name).underscore[0..19].gsub(/[^a-z0-9\-]/, '-')
end
end
@@ -185,7 +188,7 @@ task :migrate_from_mantis => :environment do
end
def original_filename
- filename
+ MantisMigrate.encode(filename)
end
def content_type
@@ -249,7 +252,7 @@ task :migrate_from_mantis => :environment do
u.password = 'mantis'
u.status = User::STATUS_LOCKED if user.enabled != 1
u.admin = true if user.access_level == 90
- next unless u.save
+ next unless u.save!
users_migrated += 1
users_map[user.id] = u.id
print '.'
@@ -268,6 +271,9 @@ task :migrate_from_mantis => :environment do
p.identifier = project.identifier
next unless p.save
projects_map[project.id] = p.id
+ p.enabled_module_names = ['issue_tracking', 'news', 'wiki']
+ p.trackers << TRACKER_BUG
+ p.trackers << TRACKER_FEATURE
print '.'
# Project members
@@ -302,7 +308,8 @@ task :migrate_from_mantis => :environment do
print "Migrating bugs"
Issue.destroy_all
issues_map = {}
- MantisBug.find(:all).each do |bug|
+ keep_bug_ids = (Issue.count == 0)
+ MantisBug.find(:all, :order => 'id ASC').each do |bug|
next unless projects_map[bug.project_id] && users_map[bug.reporter_id]
i = Issue.new :project_id => projects_map[bug.project_id],
:subject => encode(bug.summary),
@@ -315,6 +322,7 @@ task :migrate_from_mantis => :environment do
i.fixed_version = Version.find_by_project_id_and_name(i.project_id, bug.fixed_in_version) unless bug.fixed_in_version.blank?
i.status = STATUS_MAPPING[bug.status] || DEFAULT_STATUS
i.tracker = (bug.severity == 10 ? TRACKER_FEATURE : TRACKER_BUG)
+ i.id = bug.id if keep_bug_ids
next unless i.save
issues_map[bug.id] = i.id
print '.'
@@ -351,6 +359,9 @@ task :migrate_from_mantis => :environment do
i.add_watcher(User.find_by_id(users_map[monitor.user_id]))
end
end
+
+ # update issue id sequence if needed (postgresql)
+ Issue.connection.reset_pk_sequence!(Issue.table_name) if Issue.connection.respond_to?('reset_pk_sequence!')
puts
# Bug relationships
@@ -441,7 +452,6 @@ task :migrate_from_mantis => :environment do
end
end
- private
def self.encode(text)
@ic.iconv text
rescue
@@ -450,6 +460,14 @@ task :migrate_from_mantis => :environment do
end
puts
+ if Redmine::DefaultData::Loader.no_data?
+ puts "Redmine configuration need to be loaded before importing data."
+ puts "Please, run this first:"
+ puts
+ puts " rake redmine:load_default_data RAILS_ENV=\"#{ENV['RAILS_ENV']}\""
+ exit
+ end
+
puts "WARNING: Your Redmine data will be deleted during this process."
print "Are you sure you want to continue ? [y/N] "
break unless STDIN.gets.match(/^y$/i)
diff --git a/lib/tasks/migrate_from_trac.rake b/lib/tasks/migrate_from_trac.rake
index ba002cb6f..880964ff8 100644
--- a/lib/tasks/migrate_from_trac.rake
+++ b/lib/tasks/migrate_from_trac.rake
@@ -24,6 +24,7 @@ namespace :redmine do
task :migrate_from_trac => :environment do
module TracMigrate
+ TICKET_MAP = []
DEFAULT_STATUS = IssueStatus.default
assigned_status = IssueStatus.find_by_position(2)
@@ -42,7 +43,13 @@ namespace :redmine do
'low' => priorities[0],
'normal' => priorities[1],
'high' => priorities[2],
- 'highest' => priorities[3]
+ 'highest' => priorities[3],
+ # ---
+ 'trivial' => priorities[0],
+ 'minor' => priorities[1],
+ 'major' => priorities[2],
+ 'critical' => priorities[3],
+ 'blocker' => priorities[4]
}
TRACKER_BUG = Tracker.find_by_position(1)
@@ -53,14 +60,30 @@ namespace :redmine do
'task' => TRACKER_FEATURE,
'patch' =>TRACKER_FEATURE
}
-
- DEFAULT_ROLE = Role.find_by_position(3)
- manager_role = Role.find_by_position(1)
- developer_role = Role.find_by_position(2)
+
+ roles = Role.find(:all, :conditions => {:builtin => 0}, :order => 'position ASC')
+ manager_role = roles[0]
+ developer_role = roles[1]
+ DEFAULT_ROLE = roles.last
ROLE_MAPPING = {'admin' => manager_role,
'developer' => developer_role
}
-
+
+ class ::Time
+ class << self
+ alias :real_now :now
+ def now
+ real_now - @fake_diff.to_i
+ end
+ def fake(time)
+ @fake_diff = real_now - time
+ res = yield
+ @fake_diff = 0
+ res
+ end
+ end
+ end
+
class TracComponent < ActiveRecord::Base
set_table_name :component
end
@@ -69,12 +92,17 @@ namespace :redmine do
set_table_name :milestone
def due
- if read_attribute(:due) > 0
+ if read_attribute(:due) && read_attribute(:due) > 0
Time.at(read_attribute(:due)).to_date
else
nil
end
end
+
+ def description
+ # Attribute is named descr in Trac v0.8.x
+ has_attribute?(:descr) ? read_attribute(:descr) : read_attribute(:description)
+ end
end
class TracTicketCustom < ActiveRecord::Base
@@ -103,6 +131,10 @@ namespace :redmine do
File.open("#{trac_fullpath}", 'rb').read
end
+ def description
+ read_attribute(:description).to_s.slice(0,255)
+ end
+
private
def trac_fullpath
attachment_type = read_attribute(:type)
@@ -117,7 +149,10 @@ namespace :redmine do
# ticket changes: only migrate status changes and comments
has_many :changes, :class_name => "TracTicketChange", :foreign_key => :ticket
- has_many :attachments, :class_name => "TracAttachment", :foreign_key => :id, :conditions => "#{TracMigrate::TracAttachment.table_name}.type = 'ticket'"
+ has_many :attachments, :class_name => "TracAttachment",
+ :finder_sql => "SELECT DISTINCT attachment.* FROM #{TracMigrate::TracAttachment.table_name}" +
+ " WHERE #{TracMigrate::TracAttachment.table_name}.type = 'ticket'" +
+ ' AND #{TracMigrate::TracAttachment.table_name}.id = \'#{id}\''
has_many :customs, :class_name => "TracTicketCustom", :foreign_key => :ticket
def ticket_type
@@ -133,6 +168,7 @@ namespace :redmine do
end
def time; Time.at(read_attribute(:time)) end
+ def changetime; Time.at(read_attribute(:changetime)) end
end
class TracTicketChange < ActiveRecord::Base
@@ -141,23 +177,63 @@ namespace :redmine do
def time; Time.at(read_attribute(:time)) end
end
+ TRAC_WIKI_PAGES = %w(InterMapTxt InterTrac InterWiki RecentChanges SandBox TracAccessibility TracAdmin TracBackup TracBrowser TracCgi TracChangeset \
+ TracEnvironment TracFastCgi TracGuide TracImport TracIni TracInstall TracInterfaceCustomization \
+ TracLinks TracLogging TracModPython TracNotification TracPermissions TracPlugins TracQuery \
+ TracReports TracRevisionLog TracRoadmap TracRss TracSearch TracStandalone TracSupport TracSyntaxColoring TracTickets \
+ TracTicketsCustomFields TracTimeline TracUnicode TracUpgrade TracWiki WikiDeletePage WikiFormatting \
+ WikiHtml WikiMacros WikiNewPage WikiPageNames WikiProcessors WikiRestructuredText WikiRestructuredTextLinks \
+ CamelCase TitleIndex)
+
class TracWikiPage < ActiveRecord::Base
- set_table_name :wiki
+ set_table_name :wiki
+ set_primary_key :name
+
+ has_many :attachments, :class_name => "TracAttachment",
+ :finder_sql => "SELECT DISTINCT attachment.* FROM #{TracMigrate::TracAttachment.table_name}" +
+ " WHERE #{TracMigrate::TracAttachment.table_name}.type = 'wiki'" +
+ ' AND #{TracMigrate::TracAttachment.table_name}.id = \'#{id}\''
+
+ def self.columns
+ # Hides readonly Trac field to prevent clash with AR readonly? method (Rails 2.0)
+ super.select {|column| column.name.to_s != 'readonly'}
+ end
+
+ def time; Time.at(read_attribute(:time)) end
end
class TracPermission < ActiveRecord::Base
set_table_name :permission
end
+ class TracSessionAttribute < ActiveRecord::Base
+ set_table_name :session_attribute
+ end
+
def self.find_or_create_user(username, project_member = false)
+ return User.anonymous if username.blank?
+
u = User.find_by_login(username)
if !u
# Create a new user if not found
mail = username[0,limit_for(User, 'mail')]
+ if mail_attr = TracSessionAttribute.find_by_sid_and_name(username, 'email')
+ mail = mail_attr.value
+ end
mail = "#{mail}@foo.bar" unless mail.include?("@")
- u = User.new :firstname => username[0,limit_for(User, 'firstname')].gsub(/[^\w\s\'\-]/i, '-'),
- :lastname => '-',
- :mail => mail.gsub(/[^-@a-z0-9\.]/i, '-')
+
+ name = username
+ if name_attr = TracSessionAttribute.find_by_sid_and_name(username, 'name')
+ name = name_attr.value
+ end
+ name =~ (/(.*)(\s+\w+)?/)
+ fn = $1.strip
+ ln = ($2 || '-').strip
+
+ u = User.new :mail => mail.gsub(/[^-@a-z0-9\.]/i, '-'),
+ :firstname => fn[0, limit_for(User, 'firstname')].gsub(/[^\w\s\'\-]/i, '-'),
+ :lastname => ln[0, limit_for(User, 'lastname')].gsub(/[^\w\s\'\-]/i, '-')
+
u.login = username[0,limit_for(User, 'login')].gsub(/[^a-z0-9_\-@\.]/i, '-')
u.password = 'trac'
u.admin = true if TracPermission.find_by_username_and_action(username, 'admin')
@@ -172,7 +248,7 @@ namespace :redmine do
elsif TracPermission.find_by_username_and_action(username, 'developer')
role = ROLE_MAPPING['developer']
end
- Member.create(:user => u, :project => @target_project, :role => DEFAULT_ROLE)
+ Member.create(:user => u, :project => @target_project, :role => role)
u.reload
end
u
@@ -181,40 +257,71 @@ namespace :redmine do
# Basic wiki syntax conversion
def self.convert_wiki_text(text)
# Titles
- text = text.gsub(/^(\=+)\s(.+)\s(\=+)/) {|s| "h#{$1.length}. #{$2}\n"}
- # Links
+ text = text.gsub(/^(\=+)\s(.+)\s(\=+)/) {|s| "\nh#{$1.length}. #{$2}\n"}
+ # External Links
text = text.gsub(/\[(http[^\s]+)\s+([^\]]+)\]/) {|s| "\"#{$2}\":#{$1}"}
+ # Internal Links
+ text = text.gsub(/\[\[BR\]\]/, "\n") # This has to go before the rules below
+ text = text.gsub(/\[\"(.+)\".*\]/) {|s| "[[#{$1.delete(',./?;|:')}]]"}
+ text = text.gsub(/\[wiki:\"(.+)\".*\]/) {|s| "[[#{$1.delete(',./?;|:')}]]"}
+ text = text.gsub(/\[wiki:\"(.+)\".*\]/) {|s| "[[#{$1.delete(',./?;|:')}]]"}
+ text = text.gsub(/\[wiki:([^\s\]]+)\]/) {|s| "[[#{$1.delete(',./?;|:')}]]"}
+ text = text.gsub(/\[wiki:([^\s\]]+)\s(.*)\]/) {|s| "[[#{$1.delete(',./?;|:')}|#{$2.delete(',./?;|:')}]]"}
+
+ # Links to pages UsingJustWikiCaps
+ text = text.gsub(/([^!]|^)(^| )([A-Z][a-z]+[A-Z][a-zA-Z]+)/, '\\1\\2[[\3]]')
+ # Normalize things that were supposed to not be links
+ # like !NotALink
+ text = text.gsub(/(^| )!([A-Z][A-Za-z]+)/, '\1\2')
# Revisions links
text = text.gsub(/\[(\d+)\]/, 'r\1')
+ # Ticket number re-writing
+ text = text.gsub(/#(\d+)/) do |s|
+ if $1.length < 10
+ TICKET_MAP[$1.to_i] ||= $1
+ "\##{TICKET_MAP[$1.to_i] || $1}"
+ else
+ s
+ end
+ end
+ # Preformatted blocks
+ text = text.gsub(/\{\{\{/, '')
+ text = text.gsub(/\}\}\}/, ' ')
+ # Highlighting
+ text = text.gsub(/'''''([^\s])/, '_*\1')
+ text = text.gsub(/([^\s])'''''/, '\1*_')
+ text = text.gsub(/'''/, '*')
+ text = text.gsub(/''/, '_')
+ text = text.gsub(/__/, '+')
+ text = text.gsub(/~~/, '-')
+ text = text.gsub(/`/, '@')
+ text = text.gsub(/,,/, '~')
+ # Lists
+ text = text.gsub(/^([ ]+)\* /) {|s| '*' * $1.length + " "}
+
text
end
def self.migrate
- establish_connection({:adapter => trac_adapter,
- :database => trac_db_path})
+ establish_connection
- # Quick database test before clearing Redmine data
+ # Quick database test
TracComponent.count
-
- puts "Deleting data"
- CustomField.destroy_all
- Issue.destroy_all
- IssueCategory.destroy_all
- Version.destroy_all
- User.destroy_all "login <> 'admin'"
-
+
migrated_components = 0
migrated_milestones = 0
migrated_tickets = 0
migrated_custom_values = 0
migrated_ticket_attachments = 0
migrated_wiki_edits = 0
+ migrated_wiki_attachments = 0
# Components
print "Migrating components"
issues_category_map = {}
TracComponent.find(:all).each do |component|
print '.'
+ STDOUT.flush
c = IssueCategory.new :project => @target_project,
:name => encode(component.name[0, limit_for(IssueCategory, 'name')])
next unless c.save
@@ -228,9 +335,10 @@ namespace :redmine do
version_map = {}
TracMilestone.find(:all).each do |milestone|
print '.'
+ STDOUT.flush
v = Version.new :project => @target_project,
:name => encode(milestone.name[0, limit_for(Version, 'name')]),
- :description => encode(milestone.description[0, limit_for(Version, 'description')]),
+ :description => encode(milestone.description.to_s[0, limit_for(Version, 'description')]),
:effective_date => milestone.due
next unless v.save
version_map[milestone.name] = v
@@ -244,9 +352,16 @@ namespace :redmine do
custom_field_map = {}
TracTicketCustom.find_by_sql("SELECT DISTINCT name FROM #{TracTicketCustom.table_name}").each do |field|
print '.'
- f = IssueCustomField.new :name => encode(field.name[0, limit_for(IssueCustomField, 'name')]).humanize,
- :field_format => 'string'
- next unless f.save
+ STDOUT.flush
+ # Redmine custom field name
+ field_name = encode(field.name[0, limit_for(IssueCustomField, 'name')]).humanize
+ # Find if the custom already exists in Redmine
+ f = IssueCustomField.find_by_name(field_name)
+ # Or create a new one
+ f ||= IssueCustomField.create(:name => encode(field.name[0, limit_for(IssueCustomField, 'name')]).humanize,
+ :field_format => 'string')
+
+ next if f.new_record?
f.trackers = Tracker.find(:all)
f.projects << @target_project
custom_field_map[field.name] = f
@@ -254,18 +369,21 @@ namespace :redmine do
puts
# Trac 'resolution' field as a Redmine custom field
- r = IssueCustomField.new :name => 'Resolution',
+ r = IssueCustomField.find(:first, :conditions => { :name => "Resolution" })
+ r = IssueCustomField.new(:name => 'Resolution',
:field_format => 'list',
- :is_filter => true
+ :is_filter => true) if r.nil?
r.trackers = Tracker.find(:all)
r.projects << @target_project
- r.possible_values = %w(fixed invalid wontfix duplicate worksforme)
- custom_field_map['resolution'] = r if r.save
+ r.possible_values = (r.possible_values + %w(fixed invalid wontfix duplicate worksforme)).flatten.compact.uniq
+ r.save!
+ custom_field_map['resolution'] = r
# Tickets
print "Migrating tickets"
- TracTicket.find(:all).each do |ticket|
+ TracTicket.find(:all, :order => 'id ASC').each do |ticket|
print '.'
+ STDOUT.flush
i = Issue.new :project => @target_project,
:subject => encode(ticket.summary[0, limit_for(Issue, 'subject')]),
:description => convert_wiki_text(encode(ticket.description)),
@@ -276,15 +394,16 @@ namespace :redmine do
i.fixed_version = version_map[ticket.milestone] unless ticket.milestone.blank?
i.status = STATUS_MAPPING[ticket.status] || DEFAULT_STATUS
i.tracker = TRACKER_MAPPING[ticket.ticket_type] || DEFAULT_TRACKER
- i.id = ticket.id
i.custom_values << CustomValue.new(:custom_field => custom_field_map['resolution'], :value => ticket.resolution) unless ticket.resolution.blank?
- next unless i.save
+ i.id = ticket.id unless Issue.exists?(ticket.id)
+ next unless Time.fake(ticket.changetime) { i.save }
+ TICKET_MAP[ticket.id] = i.id
migrated_tickets += 1
# Owner
unless ticket.owner.blank?
i.assigned_to = find_or_create_user(ticket.owner, true)
- i.save
+ Time.fake(ticket.changetime) { i.save }
end
# Comments and status/resolution changes
@@ -322,11 +441,13 @@ namespace :redmine do
a.file = attachment
a.author = find_or_create_user(attachment.author)
a.container = i
+ a.description = attachment.description
migrated_ticket_attachments += 1 if a.save
end
# Custom fields
ticket.customs.each do |custom|
+ next if custom_field_map[custom.name].nil?
v = CustomValue.new :custom_field => custom_field_map[custom.name],
:value => custom.value
v.customized = i
@@ -334,6 +455,9 @@ namespace :redmine do
migrated_custom_values += 1
end
end
+
+ # update issue id sequence if needed (postgresql)
+ Issue.connection.reset_pk_sequence!(Issue.table_name) if Issue.connection.respond_to?('reset_pk_sequence!')
puts
# Wiki
@@ -341,22 +465,41 @@ namespace :redmine do
@target_project.wiki.destroy if @target_project.wiki
@target_project.reload
wiki = Wiki.new(:project => @target_project, :start_page => 'WikiStart')
+ wiki_edit_count = 0
if wiki.save
TracWikiPage.find(:all, :order => 'name, version').each do |page|
+ # Do not migrate Trac manual wiki pages
+ next if TRAC_WIKI_PAGES.include?(page.name)
+ wiki_edit_count += 1
print '.'
+ STDOUT.flush
p = wiki.find_or_new_page(page.name)
p.content = WikiContent.new(:page => p) if p.new_record?
p.content.text = page.text
p.content.author = find_or_create_user(page.author) unless page.author.blank? || page.author == 'trac'
p.content.comments = page.comment
- p.new_record? ? p.save : p.content.save
- migrated_wiki_edits += 1 unless p.content.new_record?
+ Time.fake(page.time) { p.new_record? ? p.save : p.content.save }
+
+ next if p.content.new_record?
+ migrated_wiki_edits += 1
+
+ # Attachments
+ page.attachments.each do |attachment|
+ next unless attachment.exist?
+ next if p.attachments.find_by_filename(attachment.filename.gsub(/^.*(\\|\/)/, '').gsub(/[^\w\.\-]/,'_')) #add only once per page
+ a = Attachment.new :created_on => attachment.time
+ a.file = attachment
+ a.author = find_or_create_user(attachment.author)
+ a.description = attachment.description
+ a.container = p
+ migrated_wiki_attachments += 1 if a.save
+ end
end
wiki.reload
wiki.pages.each do |page|
page.content.text = convert_wiki_text(page.content.text)
- page.content.save
+ Time.fake(page.content.updated_on) { page.content.save }
end
end
puts
@@ -365,9 +508,10 @@ namespace :redmine do
puts "Components: #{migrated_components}/#{TracComponent.count}"
puts "Milestones: #{migrated_milestones}/#{TracMilestone.count}"
puts "Tickets: #{migrated_tickets}/#{TracTicket.count}"
- puts "Ticket files: #{migrated_ticket_attachments}/" + TracAttachment.count("type = 'ticket'").to_s
+ puts "Ticket files: #{migrated_ticket_attachments}/" + TracAttachment.count(:conditions => {:type => 'ticket'}).to_s
puts "Custom values: #{migrated_custom_values}/#{TracTicketCustom.count}"
- puts "Wiki edits: #{migrated_wiki_edits}/#{TracWikiPage.count}"
+ puts "Wiki edits: #{migrated_wiki_edits}/#{wiki_edit_count}"
+ puts "Wiki files: #{migrated_wiki_attachments}/" + TracAttachment.count(:conditions => {:type => 'wiki'}).to_s
end
def self.limit_for(klass, attribute)
@@ -382,26 +526,59 @@ namespace :redmine do
end
def self.set_trac_directory(path)
- @trac_directory = path
+ @@trac_directory = path
raise "This directory doesn't exist!" unless File.directory?(path)
- raise "#{trac_db_path} doesn't exist!" unless File.exist?(trac_db_path)
raise "#{trac_attachments_directory} doesn't exist!" unless File.directory?(trac_attachments_directory)
- @trac_directory
+ @@trac_directory
rescue Exception => e
puts e
return false
end
def self.trac_directory
- @trac_directory
+ @@trac_directory
end
def self.set_trac_adapter(adapter)
- return false unless %w(sqlite sqlite3).include?(adapter)
- @trac_adapter = adapter
+ return false if adapter.blank?
+ raise "Unknown adapter: #{adapter}!" unless %w(sqlite sqlite3 mysql postgresql).include?(adapter)
+ # If adapter is sqlite or sqlite3, make sure that trac.db exists
+ raise "#{trac_db_path} doesn't exist!" if %w(sqlite sqlite3).include?(adapter) && !File.exist?(trac_db_path)
+ @@trac_adapter = adapter
+ rescue Exception => e
+ puts e
+ return false
end
- def self.trac_adapter; @trac_adapter end
+ def self.set_trac_db_host(host)
+ return nil if host.blank?
+ @@trac_db_host = host
+ end
+
+ def self.set_trac_db_port(port)
+ return nil if port.to_i == 0
+ @@trac_db_port = port.to_i
+ end
+
+ def self.set_trac_db_name(name)
+ return nil if name.blank?
+ @@trac_db_name = name
+ end
+
+ def self.set_trac_db_username(username)
+ @@trac_db_username = username
+ end
+
+ def self.set_trac_db_password(password)
+ @@trac_db_password = password
+ end
+
+ def self.set_trac_db_schema(schema)
+ @@trac_db_schema = schema
+ end
+
+ mattr_reader :trac_directory, :trac_adapter, :trac_db_host, :trac_db_port, :trac_db_name, :trac_db_schema, :trac_db_username, :trac_db_password
+
def self.trac_db_path; "#{trac_directory}/db/trac.db" end
def self.trac_attachments_directory; "#{trac_directory}/attachments" end
@@ -410,20 +587,43 @@ namespace :redmine do
if !project
# create the target project
project = Project.new :name => identifier.humanize,
- :description => identifier.humanize
+ :description => ''
project.identifier = identifier
puts "Unable to create a project with identifier '#{identifier}'!" unless project.save
# enable issues and wiki for the created project
project.enabled_module_names = ['issue_tracking', 'wiki']
- end
+ else
+ puts
+ puts "This project already exists in your Redmine database."
+ print "Are you sure you want to append data to this project ? [Y/n] "
+ exit if STDIN.gets.match(/^n$/i)
+ end
+ project.trackers << TRACKER_BUG unless project.trackers.include?(TRACKER_BUG)
+ project.trackers << TRACKER_FEATURE unless project.trackers.include?(TRACKER_FEATURE)
@target_project = project.new_record? ? nil : project
end
- def self.establish_connection(params)
+ def self.connection_params
+ if %w(sqlite sqlite3).include?(trac_adapter)
+ {:adapter => trac_adapter,
+ :database => trac_db_path}
+ else
+ {:adapter => trac_adapter,
+ :database => trac_db_name,
+ :host => trac_db_host,
+ :port => trac_db_port,
+ :username => trac_db_username,
+ :password => trac_db_password,
+ :schema_search_path => trac_db_schema
+ }
+ end
+ end
+
+ def self.establish_connection
constants.each do |const|
klass = const_get(const)
next unless klass.respond_to? 'establish_connection'
- klass.establish_connection params
+ klass.establish_connection connection_params
end
end
@@ -436,7 +636,15 @@ namespace :redmine do
end
puts
- puts "WARNING: Your Redmine data will be deleted during this process."
+ if Redmine::DefaultData::Loader.no_data?
+ puts "Redmine configuration need to be loaded before importing data."
+ puts "Please, run this first:"
+ puts
+ puts " rake redmine:load_default_data RAILS_ENV=\"#{ENV['RAILS_ENV']}\""
+ exit
+ end
+
+ puts "WARNING: a new project will be added to Redmine during this process."
print "Are you sure you want to continue ? [y/N] "
break unless STDIN.gets.match(/^y$/i)
puts
@@ -451,8 +659,18 @@ namespace :redmine do
end
end
- prompt('Trac directory') {|directory| TracMigrate.set_trac_directory directory}
- prompt('Trac database adapter (sqlite, sqlite3)', :default => 'sqlite') {|adapter| TracMigrate.set_trac_adapter adapter}
+ DEFAULT_PORTS = {'mysql' => 3306, 'postgresql' => 5432}
+
+ prompt('Trac directory') {|directory| TracMigrate.set_trac_directory directory.strip}
+ prompt('Trac database adapter (sqlite, sqlite3, mysql, postgresql)', :default => 'sqlite') {|adapter| TracMigrate.set_trac_adapter adapter}
+ unless %w(sqlite sqlite3).include?(TracMigrate.trac_adapter)
+ prompt('Trac database host', :default => 'localhost') {|host| TracMigrate.set_trac_db_host host}
+ prompt('Trac database port', :default => DEFAULT_PORTS[TracMigrate.trac_adapter]) {|port| TracMigrate.set_trac_db_port port}
+ prompt('Trac database name') {|name| TracMigrate.set_trac_db_name name}
+ prompt('Trac database schema', :default => 'public') {|schema| TracMigrate.set_trac_db_schema schema}
+ prompt('Trac database username') {|username| TracMigrate.set_trac_db_username username}
+ prompt('Trac database password') {|password| TracMigrate.set_trac_db_password password}
+ end
prompt('Trac database encoding', :default => 'UTF-8') {|encoding| TracMigrate.encoding encoding}
prompt('Target project identifier') {|identifier| TracMigrate.target_project_identifier identifier}
puts
diff --git a/lib/tasks/plugins.rake b/lib/tasks/plugins.rake
new file mode 100644
index 000000000..136877164
--- /dev/null
+++ b/lib/tasks/plugins.rake
@@ -0,0 +1,38 @@
+require 'source_annotation_extractor'
+
+# Modified version of the SourceAnnotationExtractor in railties
+# Will search for runable code that uses call_hook
+class PluginSourceAnnotationExtractor < SourceAnnotationExtractor
+ # Returns a hash that maps filenames under +dir+ (recursively) to arrays
+ # with their annotations. Only files with annotations are included, and only
+ # those with extension +.builder+, +.rb+, +.rxml+, +.rjs+, +.rhtml+, and +.erb+
+ # are taken into account.
+ def find_in(dir)
+ results = {}
+
+ Dir.glob("#{dir}/*") do |item|
+ next if File.basename(item)[0] == ?.
+
+ if File.directory?(item)
+ results.update(find_in(item))
+ elsif item =~ /(hook|test)\.rb/
+ # skip
+ elsif item =~ /\.(builder|(r(?:b|xml|js)))$/
+ results.update(extract_annotations_from(item, /\s*(#{tag})\(?\s*(.*)$/))
+ elsif item =~ /\.(rhtml|erb)$/
+ results.update(extract_annotations_from(item, /<%=\s*\s*(#{tag})\(?\s*(.*?)\s*%>/))
+ end
+ end
+
+ results
+ end
+end
+
+namespace :redmine do
+ namespace :plugins do
+ desc "Enumerate all Redmine plugin hooks and their context parameters"
+ task :hook_list do
+ PluginSourceAnnotationExtractor.enumerate 'call_hook'
+ end
+ end
+end
diff --git a/lib/tasks/reminder.rake b/lib/tasks/reminder.rake
new file mode 100644
index 000000000..73844fb79
--- /dev/null
+++ b/lib/tasks/reminder.rake
@@ -0,0 +1,39 @@
+# redMine - project management software
+# Copyright (C) 2008 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+desc <<-END_DESC
+Send reminders about issues due in the next days.
+
+Available options:
+ * days => number of days to remind about (defaults to 7)
+ * tracker => id of tracker (defaults to all trackers)
+ * project => id or identifier of project (defaults to all projects)
+
+Example:
+ rake redmine:send_reminders days=7 RAILS_ENV="production"
+END_DESC
+
+namespace :redmine do
+ task :send_reminders => :environment do
+ options = {}
+ options[:days] = ENV['days'].to_i if ENV['days']
+ options[:project] = ENV['project'] if ENV['project']
+ options[:tracker] = ENV['tracker'].to_i if ENV['tracker']
+
+ Mailer.reminders(options)
+ end
+end
diff --git a/lib/tasks/testing.rake b/lib/tasks/testing.rake
new file mode 100644
index 000000000..42f756f68
--- /dev/null
+++ b/lib/tasks/testing.rake
@@ -0,0 +1,46 @@
+### From http://svn.geekdaily.org/public/rails/plugins/generally_useful/tasks/coverage_via_rcov.rake
+
+### Inspired by http://blog.labratz.net/articles/2006/12/2/a-rake-task-for-rcov
+begin
+ require 'rcov/rcovtask'
+
+ rcov_options = "--rails --aggregate test/coverage.data --exclude '/gems/'"
+
+ namespace :test do
+ desc "Aggregate code coverage for all tests"
+ Rcov::RcovTask.new('coverage') do |t|
+ t.libs << 'test'
+ t.test_files = FileList['test/{unit,integration,functional}/*_test.rb']
+ t.verbose = true
+ t.rcov_opts << rcov_options
+ end
+
+ namespace :coverage do
+ desc "Delete coverage test data"
+ task :clean do
+ rm_f "test/coverage.data"
+ rm_rf "test/coverage"
+ end
+
+ desc "Aggregate code coverage for all tests with HTML output"
+ Rcov::RcovTask.new('html') do |t|
+ t.libs << 'test'
+ t.test_files = FileList['test/{unit,integration,functional}/*_test.rb']
+ t.output_dir = "test/coverage"
+ t.verbose = true
+ t.rcov_opts << rcov_options
+ end
+
+ desc "Open the HTML coverage report"
+ task :show_results do
+ system "open test/coverage/index.html"
+ end
+
+ task :full => "test:coverage:clean"
+ task :full => "test:coverage:html"
+ task :full => "test:coverage:show_results"
+ end
+ end
+rescue LoadError
+ # rcov not available
+end
diff --git a/public/.htaccess b/public/.htaccess
index d3c998345..3d3fb88bc 100644
--- a/public/.htaccess
+++ b/public/.htaccess
@@ -1,40 +1,55 @@
-# General Apache options
-AddHandler fastcgi-script .fcgi
-AddHandler cgi-script .cgi
-Options +FollowSymLinks +ExecCGI
-
-# If you don't want Rails to look in certain directories,
-# use the following rewrite rules so that Apache won't rewrite certain requests
-#
-# Example:
-# RewriteCond %{REQUEST_URI} ^/notrails.*
-# RewriteRule .* - [L]
-
-# Redirect all requests not available on the filesystem to Rails
-# By default the cgi dispatcher is used which is very slow
-#
-# For better performance replace the dispatcher with the fastcgi one
-#
-# Example:
-# RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
-RewriteEngine On
-
-# If your Rails application is accessed via an Alias directive,
-# then you MUST also set the RewriteBase in this htaccess file.
-#
-# Example:
-# Alias /myrailsapp /path/to/myrailsapp/public
-# RewriteBase /myrailsapp
-
-RewriteRule ^$ index.html [QSA]
-RewriteRule ^([^.]+)$ $1.html [QSA]
-RewriteCond %{REQUEST_FILENAME} !-f
-RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
-
-# In case Rails experiences terminal errors
-# Instead of displaying this message you can supply a file here which will be rendered instead
-#
-# Example:
-# ErrorDocument 500 /500.html
-
+# General Apache options
+
+ AddHandler fastcgi-script .fcgi
+
+
+ AddHandler fcgid-script .fcgi
+
+
+ AddHandler cgi-script .cgi
+
+Options +FollowSymLinks +ExecCGI
+
+# If you don't want Rails to look in certain directories,
+# use the following rewrite rules so that Apache won't rewrite certain requests
+#
+# Example:
+# RewriteCond %{REQUEST_URI} ^/notrails.*
+# RewriteRule .* - [L]
+
+# Redirect all requests not available on the filesystem to Rails
+# By default the cgi dispatcher is used which is very slow
+#
+# For better performance replace the dispatcher with the fastcgi one
+#
+# Example:
+# RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
+RewriteEngine On
+
+# If your Rails application is accessed via an Alias directive,
+# then you MUST also set the RewriteBase in this htaccess file.
+#
+# Example:
+# Alias /myrailsapp /path/to/myrailsapp/public
+# RewriteBase /myrailsapp
+
+RewriteRule ^$ index.html [QSA]
+RewriteRule ^([^.]+)$ $1.html [QSA]
+RewriteCond %{REQUEST_FILENAME} !-f
+
+ RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
+
+
+ RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
+
+
+ RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
+
+
+# In case Rails experiences terminal errors
+# Instead of displaying this message you can supply a file here which will be rendered instead
+#
+# Example:
+# ErrorDocument 500 /500.html
+
ErrorDocument 500 "Application error Rails application failed to start properly"
\ No newline at end of file
diff --git a/public/help/wiki_syntax.html b/public/help/wiki_syntax.html
new file mode 100644
index 000000000..846fe1bf7
--- /dev/null
+++ b/public/help/wiki_syntax.html
@@ -0,0 +1,66 @@
+
+
+
+
+
+Wiki formatting
+
+
+
+
+Wiki Syntax Quick Reference
+
+
+Font Styles
+*Strong* Strong
+_Italic_ Italic
++Underline+ Underline
+-Deleted- Deleted
+??Quote?? Quote
+@Inline Code@ Inline Code
+<pre> lines of code </pre>
+
+ lines
+ of code
+
+
+
+Lists
+* Item 1 * Item 2
+# Item 1 # Item 2 Item 1 Item 2
+
+Headings
+h1. Title 1 Title 1
+h2. Title 2 Title 2
+h3. Title 3 Title 3
+
+Links
+http://foo.bar http://foo.bar
+"Foo":http://foo.bar Foo
+
+Redmine links
+[[Wiki page]] Wiki page
+Issue #12 Issue #12
+Revision r43 Revision r43
+commit:"f30e13e43" f30e13e4
+source:some/file source:some/file
+
+Inline images
+!image_url !
+!attached_image !
+
+
+More Information
+
+
+
diff --git a/public/help/wiki_syntax_detailed.html b/public/help/wiki_syntax_detailed.html
new file mode 100644
index 000000000..6e23594f6
--- /dev/null
+++ b/public/help/wiki_syntax_detailed.html
@@ -0,0 +1,352 @@
+
+
+
+RedmineWikiFormatting
+
+
+
+
+
+ Wiki formatting
+
+
+
+ Links
+
+
+ Redmine links
+
+
+ Redmine allows hyperlinking between issues, changesets and wiki pages from anywhere wiki formatting is used.
+
+
+
+ Link to an issue: #124 (displays #124 , link is striked-through if the issue is closed)
+ Link to a changeset: r758 (displays r758 )
+ Link to a changeset with a non-numeric hash: commit:"c6f4d0fd" (displays c6f4d0fd). Added in r1236 .
+
+
+
+ Wiki links:
+
+
+
+ [[Guide]] displays a link to the page named 'Guide': Guide
+ [[Guide|User manual]] displays a link to the same page but with a different text: User manual
+
+
+
+ You can also link to pages of an other project wiki:
+
+
+
+ [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
+ [[sandbox:]] displays a link to the Sandbox wiki main page
+
+
+
+ Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page .
+
+
+ Links to others resources (0.7):
+
+
+
+ Documents:
+
+
+ document#17 (link to document with id 17)
+ document:Greetings (link to the document with title "Greetings")
+ document:"Some document" (double quotes can be used when document title contains spaces)
+
+
+
+
+
+ Versions:
+
+
+ version#3 (link to version with id 3)
+ version:1.0.0 (link to version named "1.0.0")
+ version:"1.0 beta 2"
+
+
+
+
+
+ Attachments:
+
+
+ attachment:file.zip (link to the attachment of the current object named file.zip)
+ For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
+
+
+
+
+
+ Repository files
+
+
+ source:some/file -- Link to the file located at /some/file in the project's repository
+ source:some/file@52 -- Link to the file's revision 52
+
+ source:some/file#L120 -- Link to line 120 of the file
+ source:some/file@52#L120 -- Link to line 120 of the file's revision 52
+ export:some/file -- Force the download of the file
+
+
+
+
+
+
+ Escaping (0.7):
+
+
+
+ You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
+
+
+
+ External links
+
+
+ HTTP URLs and email addresses are automatically turned into clickable links:
+
+
+
+http://www.redmine.org, someone@foo.bar
+
+
+ displays: http://www.redmine.org , someone@foo.bar
+
+
+ If you want to display a specific text instead of the URL, you can use the standard textile syntax:
+
+
+
+"Redmine web site":http://www.redmine.org
+
+
+ displays: Redmine web site
+
+
+ Text formatting
+
+
+ For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://hobix.com/textile/ for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.
+
+
+ Font style
+
+
+
+* *bold*
+* _italic_
+* _*bold italic*_
+* +underline+
+* -strike-through-
+
+
+ Display:
+
+
+
+ bold
+ italic
+ *bold italic*
+ underline
+ strike-through
+
+
+
+ Inline images
+
+
+
+ !image_url! displays an image located at image_url (textile syntax)
+ !>image_url! right floating image
+ If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
+
+
+
+ Headings
+
+
+
+h1. Heading
+h2. Subheading
+h3. Subheading
+
+
+ Paragraphs
+
+
+
+p>. right aligned
+p=. centered
+
+
+ This is centered paragraph.
+
+
+ Blockquotes
+
+
+ Start the paragraph with bq.
+
+
+
+bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
+To go live, all you need to add is a database and a web server.
+
+
+ Display:
+
+
+
+ Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern. To go live, all you need to add is a database and a web server.
+
+
+
+ Table of content
+
+
+
+{{toc}} => left aligned toc
+{{>toc}} => right aligned toc
+
+
+ Macros
+
+
+ Redmine has the following builtin macros:
+
+
+
hello_worldSample macro.
includeInclude a wiki page. Example:
+
+
+ {{include(Foo)}}macro_listDisplays a list of all available macros, including description if available.
+
+
+ Code highlighting
+
+
+ Code highlightment relies on CodeRay , a fast syntax highlighting library written completely in Ruby. It currently supports c, html, javascript, rhtml, ruby, scheme, xml languages.
+
+
+ You can highlight code in your wiki page using this syntax:
+
+
+
+<pre><code class="ruby">
+ Place you code here.
+</code></pre>
+
+
+ Example:
+
+
+ 1 # The Greeter class
+ 2 class Greeter
+ 3 def initialize (name)
+ 4 @name = name.capitalize
+ 5 end
+ 6
+ 7 def salute
+ 8 puts " Hello #{ @name } ! "
+ 9 end
+10 end
+
+
+
+
diff --git a/public/images/attachment.png b/public/images/attachment.png
index eea26921b..b7ce3c445 100644
Binary files a/public/images/attachment.png and b/public/images/attachment.png differ
diff --git a/public/images/bullet_toggle_minus.png b/public/images/bullet_toggle_minus.png
new file mode 100644
index 000000000..5ce75938f
Binary files /dev/null and b/public/images/bullet_toggle_minus.png differ
diff --git a/public/images/bullet_toggle_plus.png b/public/images/bullet_toggle_plus.png
new file mode 100644
index 000000000..b3603d30a
Binary files /dev/null and b/public/images/bullet_toggle_plus.png differ
diff --git a/public/images/changeset.png b/public/images/changeset.png
new file mode 100644
index 000000000..67de2c6cc
Binary files /dev/null and b/public/images/changeset.png differ
diff --git a/public/images/comment.png b/public/images/comment.png
new file mode 100644
index 000000000..7bc9233ea
Binary files /dev/null and b/public/images/comment.png differ
diff --git a/public/images/comments.png b/public/images/comments.png
new file mode 100644
index 000000000..39433cf78
Binary files /dev/null and b/public/images/comments.png differ
diff --git a/public/images/contentbg.png b/public/images/contentbg.png
deleted file mode 100644
index eb6d75080..000000000
Binary files a/public/images/contentbg.png and /dev/null differ
diff --git a/public/images/delete.png b/public/images/delete.png
index 137baa68e..a1af31d83 100644
Binary files a/public/images/delete.png and b/public/images/delete.png differ
diff --git a/public/images/document.png b/public/images/document.png
new file mode 100644
index 000000000..d00b9b2f4
Binary files /dev/null and b/public/images/document.png differ
diff --git a/public/images/edit.png b/public/images/edit.png
index 0275d91e4..1b6a9e315 100644
Binary files a/public/images/edit.png and b/public/images/edit.png differ
diff --git a/public/images/expand.png b/public/images/expand.png
deleted file mode 100644
index 3e3aaa441..000000000
Binary files a/public/images/expand.png and /dev/null differ
diff --git a/public/images/feed.png b/public/images/feed.png
index 51dc9778e..900188ae0 100644
Binary files a/public/images/feed.png and b/public/images/feed.png differ
diff --git a/public/images/jstoolbar/bt_bq.png b/public/images/jstoolbar/bt_bq.png
new file mode 100644
index 000000000..c3af4e07f
Binary files /dev/null and b/public/images/jstoolbar/bt_bq.png differ
diff --git a/public/images/jstoolbar/bt_bq_remove.png b/public/images/jstoolbar/bt_bq_remove.png
new file mode 100644
index 000000000..05d5ff7c7
Binary files /dev/null and b/public/images/jstoolbar/bt_bq_remove.png differ
diff --git a/public/images/jstoolbar/bt_br.png b/public/images/jstoolbar/bt_br.png
deleted file mode 100644
index f8211a997..000000000
Binary files a/public/images/jstoolbar/bt_br.png and /dev/null differ
diff --git a/public/images/jstoolbar/bt_code.png b/public/images/jstoolbar/bt_code.png
index 52924abf7..8b6aefbb5 100644
Binary files a/public/images/jstoolbar/bt_code.png and b/public/images/jstoolbar/bt_code.png differ
diff --git a/public/images/jstoolbar/bt_del.png b/public/images/jstoolbar/bt_del.png
index c6f3a8b40..36a912b65 100644
Binary files a/public/images/jstoolbar/bt_del.png and b/public/images/jstoolbar/bt_del.png differ
diff --git a/public/images/jstoolbar/bt_em.png b/public/images/jstoolbar/bt_em.png
index f08de4f30..caa808236 100644
Binary files a/public/images/jstoolbar/bt_em.png and b/public/images/jstoolbar/bt_em.png differ
diff --git a/public/images/jstoolbar/bt_h1.png b/public/images/jstoolbar/bt_h1.png
new file mode 100644
index 000000000..b64e75994
Binary files /dev/null and b/public/images/jstoolbar/bt_h1.png differ
diff --git a/public/images/jstoolbar/bt_h2.png b/public/images/jstoolbar/bt_h2.png
new file mode 100644
index 000000000..1e88cb936
Binary files /dev/null and b/public/images/jstoolbar/bt_h2.png differ
diff --git a/public/images/jstoolbar/bt_h3.png b/public/images/jstoolbar/bt_h3.png
new file mode 100644
index 000000000..646bad11d
Binary files /dev/null and b/public/images/jstoolbar/bt_h3.png differ
diff --git a/public/images/jstoolbar/bt_heading.png b/public/images/jstoolbar/bt_heading.png
deleted file mode 100644
index a143f23a7..000000000
Binary files a/public/images/jstoolbar/bt_heading.png and /dev/null differ
diff --git a/public/images/jstoolbar/bt_img.png b/public/images/jstoolbar/bt_img.png
new file mode 100644
index 000000000..ddded465c
Binary files /dev/null and b/public/images/jstoolbar/bt_img.png differ
diff --git a/public/images/jstoolbar/bt_ins.png b/public/images/jstoolbar/bt_ins.png
index f6697db51..92c8dff69 100644
Binary files a/public/images/jstoolbar/bt_ins.png and b/public/images/jstoolbar/bt_ins.png differ
diff --git a/public/images/jstoolbar/bt_link.png b/public/images/jstoolbar/bt_link.png
index 9b3acbae5..8d67e3d90 100644
Binary files a/public/images/jstoolbar/bt_link.png and b/public/images/jstoolbar/bt_link.png differ
diff --git a/public/images/jstoolbar/bt_ol.png b/public/images/jstoolbar/bt_ol.png
index 2dfaec7c7..0cce2fae0 100644
Binary files a/public/images/jstoolbar/bt_ol.png and b/public/images/jstoolbar/bt_ol.png differ
diff --git a/public/images/jstoolbar/bt_pre.png b/public/images/jstoolbar/bt_pre.png
new file mode 100644
index 000000000..99a7d52ce
Binary files /dev/null and b/public/images/jstoolbar/bt_pre.png differ
diff --git a/public/images/jstoolbar/bt_quote.png b/public/images/jstoolbar/bt_quote.png
deleted file mode 100644
index 25b2b8abe..000000000
Binary files a/public/images/jstoolbar/bt_quote.png and /dev/null differ
diff --git a/public/images/jstoolbar/bt_strong.png b/public/images/jstoolbar/bt_strong.png
index 7e200d3f6..33e6daadd 100644
Binary files a/public/images/jstoolbar/bt_strong.png and b/public/images/jstoolbar/bt_strong.png differ
diff --git a/public/images/jstoolbar/bt_ul.png b/public/images/jstoolbar/bt_ul.png
index 6e20851ec..df9ecc0cf 100644
Binary files a/public/images/jstoolbar/bt_ul.png and b/public/images/jstoolbar/bt_ul.png differ
diff --git a/public/images/locked.png b/public/images/locked.png
index c2789e35c..82d629961 100644
Binary files a/public/images/locked.png and b/public/images/locked.png differ
diff --git a/public/images/mainbg.png b/public/images/mainbg.png
deleted file mode 100644
index 29713c3c1..000000000
Binary files a/public/images/mainbg.png and /dev/null differ
diff --git a/public/images/message.png b/public/images/message.png
new file mode 100644
index 000000000..252ea14d5
Binary files /dev/null and b/public/images/message.png differ
diff --git a/public/images/news.png b/public/images/news.png
new file mode 100644
index 000000000..6a2ecce1b
Binary files /dev/null and b/public/images/news.png differ
diff --git a/public/images/note.png b/public/images/note.png
deleted file mode 100644
index 256368397..000000000
Binary files a/public/images/note.png and /dev/null differ
diff --git a/public/images/projects.png b/public/images/projects.png
index 244c896f0..073c7219d 100644
Binary files a/public/images/projects.png and b/public/images/projects.png differ
diff --git a/public/images/report.png b/public/images/report.png
new file mode 100644
index 000000000..05386ac4f
Binary files /dev/null and b/public/images/report.png differ
diff --git a/public/images/sticky.png b/public/images/sticky.png
new file mode 100644
index 000000000..d32ee63a4
Binary files /dev/null and b/public/images/sticky.png differ
diff --git a/public/images/ticket.png b/public/images/ticket.png
new file mode 100644
index 000000000..244e6ca04
Binary files /dev/null and b/public/images/ticket.png differ
diff --git a/public/images/ticket_checked.png b/public/images/ticket_checked.png
new file mode 100644
index 000000000..4b1dfbc3e
Binary files /dev/null and b/public/images/ticket_checked.png differ
diff --git a/public/images/ticket_edit.png b/public/images/ticket_edit.png
new file mode 100644
index 000000000..291bfc764
Binary files /dev/null and b/public/images/ticket_edit.png differ
diff --git a/public/images/ticket_note.png b/public/images/ticket_note.png
new file mode 100644
index 000000000..c69db223f
Binary files /dev/null and b/public/images/ticket_note.png differ
diff --git a/public/images/toggle_check.png b/public/images/toggle_check.png
new file mode 100644
index 000000000..aca5e4321
Binary files /dev/null and b/public/images/toggle_check.png differ
diff --git a/public/images/true.png b/public/images/true.png
index 7cac1eb8c..cecf618d8 100644
Binary files a/public/images/true.png and b/public/images/true.png differ
diff --git a/public/images/unlock.png b/public/images/unlock.png
index e0d414978..f15fead72 100644
Binary files a/public/images/unlock.png and b/public/images/unlock.png differ
diff --git a/public/images/wiki_edit.png b/public/images/wiki_edit.png
new file mode 100644
index 000000000..bdc333a65
Binary files /dev/null and b/public/images/wiki_edit.png differ
diff --git a/public/javascripts/application.js b/public/javascripts/application.js
index 5ad04e91d..3becbeb21 100644
--- a/public/javascripts/application.js
+++ b/public/javascripts/application.js
@@ -1,21 +1,46 @@
+/* redMine - project management software
+ Copyright (C) 2006-2008 Jean-Philippe Lang */
+
function checkAll (id, checked) {
- var el = document.getElementById(id);
- for (var i = 0; i < el.elements.length; i++) {
- if (el.elements[i].disabled==false) {
- el.elements[i].checked = checked;
+ var els = Element.descendants(id);
+ for (var i = 0; i < els.length; i++) {
+ if (els[i].disabled==false) {
+ els[i].checked = checked;
}
}
}
+function toggleCheckboxesBySelector(selector) {
+ boxes = $$(selector);
+ var all_checked = true;
+ for (i = 0; i < boxes.length; i++) { if (boxes[i].checked == false) { all_checked = false; } }
+ for (i = 0; i < boxes.length; i++) { boxes[i].checked = !all_checked; }
+}
+
+function showAndScrollTo(id, focus) {
+ Element.show(id);
+ if (focus!=null) { Form.Element.focus(focus); }
+ Element.scrollTo(id);
+}
+
+var fileFieldCount = 1;
+
function addFileField() {
+ if (fileFieldCount >= 10) return false
+ fileFieldCount++;
var f = document.createElement("input");
f.type = "file";
- f.name = "attachments[]";
+ f.name = "attachments[" + fileFieldCount + "][file]";
f.size = 30;
-
- p = document.getElementById("attachments_p");
+ var d = document.createElement("input");
+ d.type = "text";
+ d.name = "attachments[" + fileFieldCount + "][description]";
+ d.size = 60;
+
+ p = document.getElementById("attachments_fields");
p.appendChild(document.createElement("br"));
p.appendChild(f);
+ p.appendChild(d);
}
function showTab(name) {
@@ -44,21 +69,11 @@ function setPredecessorFieldsVisibility() {
function promptToRemote(text, param, url) {
value = prompt(text + ':');
if (value) {
- new Ajax.Request(url + '?' + param + '=' + value, {asynchronous:true, evalScripts:true});
+ new Ajax.Request(url + '?' + param + '=' + encodeURIComponent(value), {asynchronous:true, evalScripts:true});
return false;
}
}
-/* checks that at least one checkbox is checked (used when submitting bulk edit form) */
-function checkBulkEdit(form) {
- for (var i = 0; i < form.elements.length; i++) {
- if (form.elements[i].checked) {
- return true;
- }
- }
- return false;
-}
-
function collapseScmEntry(id) {
var els = document.getElementsByClassName(id, 'browser');
for (var i = 0; i < els.length; i++) {
@@ -105,6 +120,15 @@ function scmEntryLoaded(id) {
Element.removeClassName(id, 'loading');
}
+function randomKey(size) {
+ var chars = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
+ var key = '';
+ for (i = 0; i < size; i++) {
+ key += chars[Math.floor(Math.random() * chars.length)];
+ }
+ return key;
+}
+
/* shows and hides ajax indicator */
Ajax.Responders.register({
onCreate: function(){
diff --git a/public/javascripts/calendar/lang/calendar-da.js b/public/javascripts/calendar/lang/calendar-da.js
new file mode 100644
index 000000000..2cba5f683
--- /dev/null
+++ b/public/javascripts/calendar/lang/calendar-da.js
@@ -0,0 +1,128 @@
+// ** I18N
+
+// Calendar EN language
+// Author: Mihai Bazon,
+// Encoding: any
+// Translater: Mads N. Vestergaard
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Søndag",
+ "Mandag",
+ "Tirsdag",
+ "Onsdag",
+ "Torsdag",
+ "Fredag",
+ "Lørdag",
+ "Søndag");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Søn",
+ "Man",
+ "Tir",
+ "Ons",
+ "Tor",
+ "Fre",
+ "Lør",
+ "Søn");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Januar",
+ "Februar",
+ "Marts",
+ "April",
+ "Maj",
+ "Juni",
+ "Juli",
+ "August",
+ "September",
+ "Oktober",
+ "November",
+ "December");
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "Maj",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Okt",
+ "Nov",
+ "Dec");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Om denne kalender";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For seneste version, besøg: http://www.dynarch.com/projects/calendar/\n" +
+"Distribueret under GNU LGPL. Se http://gnu.org/licenses/lgpl.html for detaljer." +
+"\n\n" +
+"Dato valg:\n" +
+"- Benyt \xab, \xbb tasterne til at vælge år\n" +
+"- Benyt " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " tasterne til at vælge måned\n" +
+"- Hold muse tasten inde på punkterne for at vælge hurtigere.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Tids valg:\n" +
+"- Klik på en af tidsramerne for at forhøje det\n" +
+"- eller Shift-klik for at mindske det\n" +
+"- eller klik og træk for hurtigere valg.";
+
+Calendar._TT["PREV_YEAR"] = "Forrige år (hold for menu)";
+Calendar._TT["PREV_MONTH"] = "Forrige måned (hold for menu)";
+Calendar._TT["GO_TODAY"] = "GÃ¥ til idag";
+Calendar._TT["NEXT_MONTH"] = "Næste måned (hold for menu)";
+Calendar._TT["NEXT_YEAR"] = "Næste år (hold for menu)";
+Calendar._TT["SEL_DATE"] = "Vælg dato";
+Calendar._TT["DRAG_TO_MOVE"] = "Træk for at flytte";
+Calendar._TT["PART_TODAY"] = " (idag)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Vis %s først";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "6,7";
+
+Calendar._TT["CLOSE"] = "Luk";
+Calendar._TT["TODAY"] = "Idag";
+Calendar._TT["TIME_PART"] = "(Shift-)Klik eller træk for at ændre værdi";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "uge";
+Calendar._TT["TIME"] = "Tid:";
diff --git a/public/javascripts/calendar/lang/calendar-fi.js b/public/javascripts/calendar/lang/calendar-fi.js
new file mode 100644
index 000000000..1e65eee42
--- /dev/null
+++ b/public/javascripts/calendar/lang/calendar-fi.js
@@ -0,0 +1,127 @@
+// ** I18N
+
+// Calendar FI language
+// Author: Antti Perkiömäki
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Sunnuntai",
+ "Maanantai",
+ "Tiistai",
+ "Keskiviikko",
+ "Torstai",
+ "Perjantai",
+ "Lauantai",
+ "Sunnuntai");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Su",
+ "Ma",
+ "Ti",
+ "Ke",
+ "To",
+ "Pe",
+ "La",
+ "Su");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Tammikuu",
+ "Helmikuu",
+ "Maaliskuu",
+ "Huhtikuu",
+ "Toukokuu",
+ "Kesäkuu",
+ "Heinäkuu",
+ "Elokuu",
+ "Syyskuu",
+ "Lokakuu",
+ "Marraskuu",
+ "Joulukuu");
+
+// short month names
+Calendar._SMN = new Array
+("Tammi",
+ "Helmi",
+ "Maalis",
+ "Huhti",
+ "Touko",
+ "Kesä",
+ "Heinä",
+ "Elo",
+ "Syys",
+ "Loka",
+ "Marras",
+ "Dec");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Tietoa kalenterista";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Tekijä: Mihai Bazon\n" + // don't translate this this ;-)
+"Viimeisin versio: http://www.dynarch.com/projects/calendar/\n" +
+"Jaettu GNU LGPL alaisena. Katso lisätiedot http://gnu.org/licenses/lgpl.html" +
+"\n\n" +
+"Päivä valitsin:\n" +
+"- Käytä \xab, \xbb painikkeita valitaksesi vuoden\n" +
+"- Käytä " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " painikkeita valitaksesi kuukauden\n" +
+"- Pidä alhaalla hiiren painiketta missä tahansa yllämainituissa painikkeissa valitaksesi nopeammin.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Ajan valinta:\n" +
+"- Paina mitä tahansa ajan osaa kasvattaaksesi sitä\n" +
+"- tai Vaihtonäppäin-paina laskeaksesi sitä\n" +
+"- tai paina ja raahaa valitaksesi nopeammin.";
+
+Calendar._TT["PREV_YEAR"] = "Edellinen vuosi (valikko tulee painaessa)";
+Calendar._TT["PREV_MONTH"] = "Edellinen kuukausi (valikko tulee painaessa)";
+Calendar._TT["GO_TODAY"] = "Siirry Tänään";
+Calendar._TT["NEXT_MONTH"] = "Seuraava kuukausi (valikko tulee painaessa)";
+Calendar._TT["NEXT_YEAR"] = "Seuraava vuosi (valikko tulee painaessa)";
+Calendar._TT["SEL_DATE"] = "Valitse päivä";
+Calendar._TT["DRAG_TO_MOVE"] = "Rahaa siirtääksesi";
+Calendar._TT["PART_TODAY"] = " (tänään)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Näytä %s ensin";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "6,0";
+
+Calendar._TT["CLOSE"] = "Sulje";
+Calendar._TT["TODAY"] = "Tänään";
+Calendar._TT["TIME_PART"] = "(Vaihtonäppäin-)Paina tai raahaa vaihtaaksesi arvoa";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d.%m.%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "vko";
+Calendar._TT["TIME"] = "Aika:";
diff --git a/public/javascripts/calendar/lang/calendar-he.js b/public/javascripts/calendar/lang/calendar-he.js
index bd92e0073..9d4c87db0 100644
--- a/public/javascripts/calendar/lang/calendar-he.js
+++ b/public/javascripts/calendar/lang/calendar-he.js
@@ -113,7 +113,7 @@ Calendar._TT["DAY_FIRST"] = "הצג %s קוד×";
// This may be locale-dependent. It specifies the week-end days, as an array
// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
// means Monday, etc.
-Calendar._TT["WEEKEND"] = "6,7";
+Calendar._TT["WEEKEND"] = "5,6";
Calendar._TT["CLOSE"] = "סגור";
Calendar._TT["TODAY"] = "היו×";
diff --git a/public/javascripts/calendar/lang/calendar-hu.js b/public/javascripts/calendar/lang/calendar-hu.js
new file mode 100644
index 000000000..0e219c123
--- /dev/null
+++ b/public/javascripts/calendar/lang/calendar-hu.js
@@ -0,0 +1,127 @@
+// ** I18N
+
+// Calendar HU language
+// Author: Takács Gábor
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Vasárnap",
+ "Hétfő",
+ "Kedd",
+ "Szerda",
+ "Csütörtök",
+ "Péntek",
+ "Szombat",
+ "Vasárnap");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Vas",
+ "Hét",
+ "Ked",
+ "Sze",
+ "Csü",
+ "Pén",
+ "Szo",
+ "Vas");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Január",
+ "Február",
+ "Március",
+ "Ãprilis",
+ "Május",
+ "Június",
+ "Július",
+ "Augusztus",
+ "Szeptember",
+ "Október",
+ "November",
+ "December");
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+ "Feb",
+ "Már",
+ "Ãpr",
+ "Máj",
+ "Jún",
+ "Júl",
+ "Aug",
+ "Szep",
+ "Okt",
+ "Nov",
+ "Dec");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "A naptár leÃrása";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Date selection:\n" +
+"- Use the \xab, \xbb buttons to select year\n" +
+"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +
+"- Hold mouse button on any of the above buttons for faster selection.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Time selection:\n" +
+"- Click on any of the time parts to increase it\n" +
+"- or Shift-click to decrease it\n" +
+"- or click and drag for faster selection.";
+
+Calendar._TT["PREV_YEAR"] = "Előző év (nyomvatart = menü)";
+Calendar._TT["PREV_MONTH"] = "Előző hónap (nyomvatart = menü)";
+Calendar._TT["GO_TODAY"] = "Irány a Ma";
+Calendar._TT["NEXT_MONTH"] = "Következő hónap (nyomvatart = menü)";
+Calendar._TT["NEXT_YEAR"] = "Következő év (nyomvatart = menü)";
+Calendar._TT["SEL_DATE"] = "Válasszon dátumot";
+Calendar._TT["DRAG_TO_MOVE"] = "Fogd és vidd";
+Calendar._TT["PART_TODAY"] = " (ma)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "%s megjelenÃtése elsÅ‘ként";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Bezár";
+Calendar._TT["TODAY"] = "Ma";
+Calendar._TT["TIME_PART"] = "(Shift-)Click vagy húzd az érték változtatásához";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y.%m.%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%B %e, %A";
+
+Calendar._TT["WK"] = "hét";
+Calendar._TT["TIME"] = "Idő:";
diff --git a/public/javascripts/calendar/lang/calendar-ja.js b/public/javascripts/calendar/lang/calendar-ja.js
index 24bde0f30..1bcc8c38c 100644
--- a/public/javascripts/calendar/lang/calendar-ja.js
+++ b/public/javascripts/calendar/lang/calendar-ja.js
@@ -58,10 +58,10 @@ Calendar._TT["ABOUT_TIME"] = "\n\n" +
"- or click and drag for faster selection.";
Calendar._TT["PREV_YEAR"] = "å‰å¹´ (長押ã—ã§ãƒ¡ãƒ‹ãƒ¥ãƒ¼è¡¨ç¤º)";
-Calendar._TT["PREV_MONTH"] = "翌年 (長押ã—ã§ãƒ¡ãƒ‹ãƒ¥ãƒ¼è¡¨ç¤º)";
+Calendar._TT["PREV_MONTH"] = "剿œˆ (長押ã—ã§ãƒ¡ãƒ‹ãƒ¥ãƒ¼è¡¨ç¤º)";
Calendar._TT["GO_TODAY"] = "ä»Šæ—¥ã®æ—¥ä»˜ã‚’é¸æŠž";
-Calendar._TT["NEXT_MONTH"] = "剿œˆ (長押ã—ã§ãƒ¡ãƒ‹ãƒ¥ãƒ¼è¡¨ç¤º)";
-Calendar._TT["NEXT_YEAR"] = "翌月 (長押ã—ã§ãƒ¡ãƒ‹ãƒ¥ãƒ¼è¡¨ç¤º)";
+Calendar._TT["NEXT_MONTH"] = "翌月 (長押ã—ã§ãƒ¡ãƒ‹ãƒ¥ãƒ¼è¡¨ç¤º)";
+Calendar._TT["NEXT_YEAR"] = "翌年 (長押ã—ã§ãƒ¡ãƒ‹ãƒ¥ãƒ¼è¡¨ç¤º)";
Calendar._TT["SEL_DATE"] = "æ—¥ä»˜ã‚’é¸æŠžã—ã¦ãã ã•ã„";
Calendar._TT["DRAG_TO_MOVE"] = "ドラッグã§ç§»å‹•";
Calendar._TT["PART_TODAY"] = " (今日)";
diff --git a/public/javascripts/calendar/lang/calendar-lt.js b/public/javascripts/calendar/lang/calendar-lt.js
new file mode 100644
index 000000000..888cfc801
--- /dev/null
+++ b/public/javascripts/calendar/lang/calendar-lt.js
@@ -0,0 +1,128 @@
+// ** I18N
+
+// Calendar LT language
+// Author: Gediminas Muižis,
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+// Ver: 0.2
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Sekmadienis",
+ "Pirmadienis",
+ "Antradienis",
+ "TreÄiadienis",
+ "Ketvirtadienis",
+ "Penktadienis",
+ "Šeštadienis",
+ "Sekmadienis");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Sek",
+ "Pir",
+ "Ant",
+ "Tre",
+ "Ket",
+ "Pen",
+ "Šeš",
+ "Sek");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Sausis",
+ "Vasaris",
+ "Kovas",
+ "Balandis",
+ "Gegužė",
+ "Birželis",
+ "Liepa",
+ "Rudpjūtis",
+ "RugsÄ—jis",
+ "Spalis",
+ "Lapkritis",
+ "Gruodis");
+
+// short month names
+Calendar._SMN = new Array
+("Sau",
+ "Vas",
+ "Kov",
+ "Bal",
+ "Geg",
+ "Brž",
+ "Lie",
+ "Rgp",
+ "Rgs",
+ "Spl",
+ "Lap",
+ "Grd");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Apie kalendorių";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Datos pasirinkimas:\n" +
+"- Naudoti \xab, \xbb mygtukus norint pasirinkti metus\n" +
+"- Naudoti " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " mygtukus norint pasirinkti mėnesį\n" +
+"- PAlaikykite nuspaudę bet kurį nygtuką norėdami iškviesti greitąjį meniu.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Datos pasirinkimas:\n" +
+"- Paspaudus ant valandos ar minutės, jų reikšmės padidėja\n" +
+"- arba Shift-paspaudimas norint sumažinti reikšmę\n" +
+"- arba paspauskite ir tempkite norint greiÄiau keisti reikÅ¡mÄ™.";
+
+Calendar._TT["PREV_YEAR"] = "Ankst. metai (laikyti, norint iškviesti meniu)";
+Calendar._TT["PREV_MONTH"] = "Ankst. mėnuo (laikyti, norint iškviesti meniu)";
+Calendar._TT["GO_TODAY"] = "Å iandien";
+Calendar._TT["NEXT_MONTH"] = "Kitas mėnuo (laikyti, norint iškviesti meniu)";
+Calendar._TT["NEXT_YEAR"] = "Kiti metai (laikyti, norint iškviesti meniu)";
+Calendar._TT["SEL_DATE"] = "Pasirinkti datÄ…";
+Calendar._TT["DRAG_TO_MOVE"] = "Perkelkite pÄ—lyte";
+Calendar._TT["PART_TODAY"] = " (šiandien)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Rodyti %s pirmiau";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Uždaryti";
+Calendar._TT["TODAY"] = "Å iandien";
+Calendar._TT["TIME_PART"] = "(Shift-)Spausti ar tempti, norint pakeisti reikšmę";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "sav";
+Calendar._TT["TIME"] = "Laikas:";
diff --git a/public/javascripts/calendar/lang/calendar-no.js b/public/javascripts/calendar/lang/calendar-no.js
new file mode 100644
index 000000000..0506b83e2
--- /dev/null
+++ b/public/javascripts/calendar/lang/calendar-no.js
@@ -0,0 +1,86 @@
+// ** I18N
+
+// Calendar NO language (Norwegian/Norsk bokmål)
+// Author: Kai Olav Fredriksen
+
+// full day names
+Calendar._DN = new Array
+("Søndag",
+ "Mandag",
+ "Tirsdag",
+ "Onsdag",
+ "Torsdag",
+ "Fredag",
+ "Lørdag",
+ "Søndag");
+
+Calendar._SDN_len = 3; // short day name length
+Calendar._SMN_len = 3; // short month name length
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Januar",
+ "Februar",
+ "Mars",
+ "April",
+ "Mai",
+ "Juni",
+ "Juli",
+ "August",
+ "September",
+ "Oktober",
+ "November",
+ "Desember");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Om kalenderen";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Date selection:\n" +
+"- Use the \xab, \xbb buttons to select year\n" +
+"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +
+"- Hold mouse button on any of the above buttons for faster selection.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Time selection:\n" +
+"- Click on any of the time parts to increase it\n" +
+"- or Shift-click to decrease it\n" +
+"- or click and drag for faster selection.";
+
+Calendar._TT["PREV_YEAR"] = "Forrige år (hold for meny)";
+Calendar._TT["PREV_MONTH"] = "Forrige måned (hold for meny)";
+Calendar._TT["GO_TODAY"] = "GÃ¥ til idag";
+Calendar._TT["NEXT_MONTH"] = "Neste måned (hold for meny)";
+Calendar._TT["NEXT_YEAR"] = "Neste år (hold for meny)";
+Calendar._TT["SEL_DATE"] = "Velg dato";
+Calendar._TT["DRAG_TO_MOVE"] = "Dra for å flytte";
+Calendar._TT["PART_TODAY"] = " (idag)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Vis %s først";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Lukk";
+Calendar._TT["TODAY"] = "Idag";
+Calendar._TT["TIME_PART"] = "(Shift-)Klikk eller dra for å endre verdi";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%%d.%m.%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "uke";
+Calendar._TT["TIME"] = "Tid:";
diff --git a/public/javascripts/calendar/lang/calendar-pt-br.js b/public/javascripts/calendar/lang/calendar-pt-br.js
index 5d4d014ce..bf7734ab3 100644
--- a/public/javascripts/calendar/lang/calendar-pt-br.js
+++ b/public/javascripts/calendar/lang/calendar-pt-br.js
@@ -2,7 +2,8 @@
// Calendar pt_BR language
// Author: Adalberto Machado,
-// Encoding: any
+// Review: Alexandre da Silva,
+// Encoding: UTF-8
// Distributed under the same terms as the calendar itself.
// For translators: please use UTF-8 if possible. We strongly believe that
@@ -13,7 +14,7 @@
Calendar._DN = new Array
("Domingo",
"Segunda",
- "Terca",
+ "Terça",
"Quarta",
"Quinta",
"Sexta",
@@ -45,13 +46,13 @@ Calendar._SDN = new Array
// First day of the week. "0" means display Sunday first, "1" means display
// Monday first, etc.
-Calendar._FD = 1;
+Calendar._FD = 0;
// full month names
Calendar._MN = new Array
("Janeiro",
"Fevereiro",
- "Marco",
+ "Março",
"Abril",
"Maio",
"Junho",
@@ -79,29 +80,30 @@ Calendar._SMN = new Array
// tooltips
Calendar._TT = {};
-Calendar._TT["INFO"] = "Sobre o calendario";
+Calendar._TT["INFO"] = "Sobre o calendário";
Calendar._TT["ABOUT"] =
"DHTML Date/Time Selector\n" +
"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
-"Ultima versao visite: http://www.dynarch.com/projects/calendar/\n" +
-"Distribuido sobre GNU LGPL. Veja http://gnu.org/licenses/lgpl.html para detalhes." +
+"Última versão visite: http://www.dynarch.com/projects/calendar/\n" +
+"DistribuÃdo sobre GNU LGPL. Veja http://gnu.org/licenses/lgpl.html para detalhes." +
"\n\n" +
-"Selecao de data:\n" +
-"- Use os botoes \xab, \xbb para selecionar o ano\n" +
-"- Use os botoes " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " para selecionar o mes\n" +
-"- Segure o botao do mouse em qualquer um desses botoes para selecao rapida.";
+"Seleção de data:\n" +
+"- Use os botões \xab, \xbb para selecionar o ano\n" +
+"- Use os botões " + String.fromCharCode(0x2039) + ", " +
+String.fromCharCode(0x203a) + " para selecionar o mês\n" +
+"- Segure o botão do mouse em qualquer um desses botões para seleção rápida.";
Calendar._TT["ABOUT_TIME"] = "\n\n" +
-"Selecao de hora:\n" +
+"Seleção de hora:\n" +
"- Clique em qualquer parte da hora para incrementar\n" +
"- ou Shift-click para decrementar\n" +
-"- ou clique e segure para selecao rapida.";
+"- ou clique e segure para seleção rápida.";
Calendar._TT["PREV_YEAR"] = "Ant. ano (segure para menu)";
-Calendar._TT["PREV_MONTH"] = "Ant. mes (segure para menu)";
+Calendar._TT["PREV_MONTH"] = "Ant. mês (segure para menu)";
Calendar._TT["GO_TODAY"] = "Hoje";
-Calendar._TT["NEXT_MONTH"] = "Prox. mes (segure para menu)";
-Calendar._TT["NEXT_YEAR"] = "Prox. ano (segure para menu)";
+Calendar._TT["NEXT_MONTH"] = "Próx. mes (segure para menu)";
+Calendar._TT["NEXT_YEAR"] = "Próx. ano (segure para menu)";
Calendar._TT["SEL_DATE"] = "Selecione a data";
Calendar._TT["DRAG_TO_MOVE"] = "Arraste para mover";
Calendar._TT["PART_TODAY"] = " (hoje)";
diff --git a/public/javascripts/calendar/lang/calendar-th.js b/public/javascripts/calendar/lang/calendar-th.js
new file mode 100644
index 000000000..dc4809e52
--- /dev/null
+++ b/public/javascripts/calendar/lang/calendar-th.js
@@ -0,0 +1,127 @@
+// ** I18N
+
+// Calendar EN language
+// Author: Gampol Thitinilnithi,
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("à¸à¸²à¸—ิตย์",
+ "จันทร์",
+ "à¸à¸±à¸‡à¸„าร",
+ "พุธ",
+ "พฤหัสบดี",
+ "ศุà¸à¸£à¹Œ",
+ "เสาร์",
+ "à¸à¸²à¸—ิตย์");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("à¸à¸².",
+ "จ.",
+ "à¸.",
+ "พ.",
+ "พฤ.",
+ "ศ.",
+ "ส.",
+ "à¸à¸².");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("มà¸à¸£à¸²à¸„ม",
+ "à¸à¸¸à¸¡à¸ าพันธ์",
+ "มีนาคม",
+ "เมษายน",
+ "พฤษภาคม",
+ "มิถุนายน",
+ "à¸à¸£à¸à¸Žà¸²à¸„ม",
+ "สิงหาคม",
+ "à¸à¸±à¸™à¸¢à¸²à¸¢à¸™",
+ "ตุลาคม",
+ "พฤศจิà¸à¸²à¸¢à¸™",
+ "ธันวาคม");
+
+// short month names
+Calendar._SMN = new Array
+("ม.ค.",
+ "à¸.พ.",
+ "มี.ค.",
+ "เม.ย.",
+ "พ.ค.",
+ "มิ.ย.",
+ "à¸.ค.",
+ "ส.ค.",
+ "à¸.ย.",
+ "ต.ค.",
+ "พ.ย.",
+ "ธ.ค.");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "เà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸šà¸›à¸à¸´à¸—ิน";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Date selection:\n" +
+"- Use the \xab, \xbb buttons to select year\n" +
+"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +
+"- Hold mouse button on any of the above buttons for faster selection.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Time selection:\n" +
+"- Click on any of the time parts to increase it\n" +
+"- or Shift-click to decrease it\n" +
+"- or click and drag for faster selection.";
+
+Calendar._TT["PREV_YEAR"] = "ปีที่à¹à¸¥à¹‰à¸§ (ถ้าà¸à¸”ค้างจะมีเมนู)";
+Calendar._TT["PREV_MONTH"] = "เดืà¸à¸™à¸—ี่à¹à¸¥à¹‰à¸§ (ถ้าà¸à¸”ค้างจะมีเมนู)";
+Calendar._TT["GO_TODAY"] = "ไปที่วันนี้";
+Calendar._TT["NEXT_MONTH"] = "เดืà¸à¸™à¸«à¸™à¹‰à¸² (ถ้าà¸à¸”ค้างจะมีเมนู)";
+Calendar._TT["NEXT_YEAR"] = "ปีหน้า (ถ้าà¸à¸”ค้างจะมีเมนู)";
+Calendar._TT["SEL_DATE"] = "เลืà¸à¸à¸§à¸±à¸™";
+Calendar._TT["DRAG_TO_MOVE"] = "à¸à¸”à¹à¸¥à¹‰à¸§à¸¥à¸²à¸à¹€à¸žà¸·à¹ˆà¸à¸¢à¹‰à¸²à¸¢";
+Calendar._TT["PART_TODAY"] = " (วันนี้)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "à¹à¸ªà¸”ง %s เป็นวันà¹à¸£à¸";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "ปิด";
+Calendar._TT["TODAY"] = "วันนี้";
+Calendar._TT["TIME_PART"] = "(Shift-)à¸à¸”หรืà¸à¸à¸”à¹à¸¥à¹‰à¸§à¸¥à¸²à¸à¹€à¸žà¸·à¹ˆà¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸„่า";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%a %e %b";
+
+Calendar._TT["WK"] = "wk";
+Calendar._TT["TIME"] = "เวลา:";
diff --git a/public/javascripts/calendar/lang/calendar-uk.js b/public/javascripts/calendar/lang/calendar-uk.js
new file mode 100644
index 000000000..0dbde793d
--- /dev/null
+++ b/public/javascripts/calendar/lang/calendar-uk.js
@@ -0,0 +1,127 @@
+// ** I18N
+
+// Calendar EN language
+// Author: Mihai Bazon,
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Sunday",
+ "Monday",
+ "Tuesday",
+ "Wednesday",
+ "Thursday",
+ "Friday",
+ "Saturday",
+ "Sunday");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Sun",
+ "Mon",
+ "Tue",
+ "Wed",
+ "Thu",
+ "Fri",
+ "Sat",
+ "Sun");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 0;
+
+// full month names
+Calendar._MN = new Array
+("January",
+ "February",
+ "March",
+ "April",
+ "May",
+ "June",
+ "July",
+ "August",
+ "September",
+ "October",
+ "November",
+ "December");
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "About the calendar";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Date selection:\n" +
+"- Use the \xab, \xbb buttons to select year\n" +
+"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +
+"- Hold mouse button on any of the above buttons for faster selection.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Time selection:\n" +
+"- Click on any of the time parts to increase it\n" +
+"- or Shift-click to decrease it\n" +
+"- or click and drag for faster selection.";
+
+Calendar._TT["PREV_YEAR"] = "Prev. year (hold for menu)";
+Calendar._TT["PREV_MONTH"] = "Prev. month (hold for menu)";
+Calendar._TT["GO_TODAY"] = "Go Today";
+Calendar._TT["NEXT_MONTH"] = "Next month (hold for menu)";
+Calendar._TT["NEXT_YEAR"] = "Next year (hold for menu)";
+Calendar._TT["SEL_DATE"] = "Select date";
+Calendar._TT["DRAG_TO_MOVE"] = "Drag to move";
+Calendar._TT["PART_TODAY"] = " (today)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Display %s first";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Close";
+Calendar._TT["TODAY"] = "Today";
+Calendar._TT["TIME_PART"] = "(Shift-)Click or drag to change value";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "wk";
+Calendar._TT["TIME"] = "Time:";
diff --git a/public/javascripts/calendar/lang/calendar-zh-tw.js b/public/javascripts/calendar/lang/calendar-zh-tw.js
new file mode 100644
index 000000000..1e759db10
--- /dev/null
+++ b/public/javascripts/calendar/lang/calendar-zh-tw.js
@@ -0,0 +1,127 @@
+// ** I18N
+
+// Calendar EN language
+// Author: Mihai Bazon,
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("星期日",
+ "星期一",
+ "星期二",
+ "星期三",
+ "星期四",
+ "星期五",
+ "星期å…",
+ "星期日");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("æ—¥",
+ "一",
+ "二",
+ "三",
+ "å››",
+ "五",
+ "å…",
+ "æ—¥");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 0;
+
+// full month names
+Calendar._MN = new Array
+("一月",
+ "二月",
+ "三月",
+ "四月",
+ "五月",
+ "å…æœˆ",
+ "七月",
+ "八月",
+ "乿œˆ",
+ "åæœˆ",
+ "å一月",
+ "å二月");
+
+// short month names
+Calendar._SMN = new Array
+("一月",
+ "二月",
+ "三月",
+ "四月",
+ "五月",
+ "å…æœˆ",
+ "七月",
+ "八月",
+ "乿œˆ",
+ "åæœˆ",
+ "å一月",
+ "å二月");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "關於 calendar";
+
+Calendar._TT["ABOUT"] =
+"DHTML 日期/時間 鏿“‡å™¨\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"最新版本å–å¾—ä½å€: http://www.dynarch.com/projects/calendar/\n" +
+"使用 GNU LGPL 發行. åƒè€ƒ http://gnu.org/licenses/lgpl.html 以å–得更多關於 LGPL 之細節。" +
+"\n\n" +
+"æ—¥æœŸé¸æ“‡æ–¹å¼:\n" +
+"- ä½¿ç”¨æ»‘é¼ é»žæ“Š \xab 〠\xbb æŒ‰éˆ•é¸æ“‡å¹´ä»½\n" +
+"- ä½¿ç”¨æ»‘é¼ é»žæ“Š " + String.fromCharCode(0x2039) + " 〠" + String.fromCharCode(0x203a) + " æŒ‰éˆ•é¸æ“‡æœˆä»½\n" +
+"- ä½¿ç”¨æ»‘é¼ é»žæ“Šä¸Šè¿°æŒ‰éˆ•ä¸¦æŒ‰ä½ä¸æ”¾ï¼Œå¯é–‹å•Ÿå¿«é€Ÿé¸å–®ã€‚";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"æ™‚é–“é¸æ“‡æ–¹å¼ï¼š\n" +
+"- ã€Œå–®æ“Šã€æ™‚分秒為éžå¢ž\n" +
+"- 或 「Shift-單擊ã€ç‚ºéžæ¸›\n" +
+"- 或 「單擊且拖拉ã€ç‚ºå¿«é€Ÿé¸æ“‡";
+
+Calendar._TT["PREV_YEAR"] = "å‰ä¸€å¹´ (按ä½ä¸æ”¾å¯é¡¯ç¤ºé¸å–®)";
+Calendar._TT["PREV_MONTH"] = "å‰ä¸€å€‹æœˆ (按ä½ä¸æ”¾å¯é¡¯ç¤ºé¸å–®)";
+Calendar._TT["GO_TODAY"] = "鏿“‡ä»Šå¤©";
+Calendar._TT["NEXT_MONTH"] = "後一個月 (按ä½ä¸æ”¾å¯é¡¯ç¤ºé¸å–®)";
+Calendar._TT["NEXT_YEAR"] = "下一年 (按ä½ä¸æ”¾å¯é¡¯å¼é¸å–®)";
+Calendar._TT["SEL_DATE"] = "è«‹é»žé¸æ—¥æœŸ";
+Calendar._TT["DRAG_TO_MOVE"] = "按ä½ä¸æ”¾å¯æ‹–拉視窗";
+Calendar._TT["PART_TODAY"] = " (今天)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "以 %s åšç‚ºä¸€é€±çš„首日";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "關閉視窗";
+Calendar._TT["TODAY"] = "今天";
+Calendar._TT["TIME_PART"] = "(Shift-)åŠ ã€Œå–®æ“Šã€æˆ–「拖拉ã€å¯è®Šæ›´å€¼";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "星期 %a, %b %e 日";
+
+Calendar._TT["WK"] = "週";
+Calendar._TT["TIME"] = "時間:";
diff --git a/public/javascripts/calendar/lang/calendar-zh.js b/public/javascripts/calendar/lang/calendar-zh.js
index ddb092bfa..121653fba 100644
--- a/public/javascripts/calendar/lang/calendar-zh.js
+++ b/public/javascripts/calendar/lang/calendar-zh.js
@@ -82,33 +82,33 @@ Calendar._TT = {};
Calendar._TT["INFO"] = "关于日历";
Calendar._TT["ABOUT"] =
-"DHTML Date/Time Selector\n" +
+"DHTML 日期/时间 选择器\n" +
"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
-"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
-"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"最新版本请访问: http://www.dynarch.com/projects/calendar/\n" +
+"éµå¾ª GNU LGPL å‘布。详情请查阅 http://gnu.org/licenses/lgpl.html " +
"\n\n" +
-"Date selection:\n" +
-"- Use the \xab, \xbb buttons to select year\n" +
-"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +
-"- Hold mouse button on any of the above buttons for faster selection.";
+"日期选择:\n" +
+"- 使用 \xab,\xbb 按钮选择年\n" +
+"- 使用 " + String.fromCharCode(0x2039) + "," + String.fromCharCode(0x203a) + " 按钮选择月\n" +
+"- 在上述按钮上按ä½ä¸æ”¾å¯ä»¥å¿«é€Ÿé€‰æ‹©";
Calendar._TT["ABOUT_TIME"] = "\n\n" +
-"Time selection:\n" +
-"- Click on any of the time parts to increase it\n" +
-"- or Shift-click to decrease it\n" +
-"- or click and drag for faster selection.";
+"时间选择:\n" +
+"- 点击时间的任æ„部分æ¥å¢žåŠ \n" +
+"- ShiftåŠ ç‚¹å‡»æ¥å‡å°‘\n" +
+"- ç‚¹å‡»åŽæ‹–动进行快速选择";
-Calendar._TT["PREV_YEAR"] = "上年 (hold for menu)";
-Calendar._TT["PREV_MONTH"] = "上月 (hold for menu)";
+Calendar._TT["PREV_YEAR"] = "上年(按ä½ä¸æ”¾æ˜¾ç¤ºèœå•)";
+Calendar._TT["PREV_MONTH"] = "上月(按ä½ä¸æ”¾æ˜¾ç¤ºèœå•)";
Calendar._TT["GO_TODAY"] = "回到今天";
-Calendar._TT["NEXT_MONTH"] = "下月 (hold for menu)";
-Calendar._TT["NEXT_YEAR"] = "下年 (hold for menu)";
+Calendar._TT["NEXT_MONTH"] = "下月(按ä½ä¸æ”¾æ˜¾ç¤ºèœå•)";
+Calendar._TT["NEXT_YEAR"] = "下年(按ä½ä¸æ”¾æ˜¾ç¤ºèœå•)";
Calendar._TT["SEL_DATE"] = "选择日期";
Calendar._TT["DRAG_TO_MOVE"] = "拖动";
Calendar._TT["PART_TODAY"] = " (今日)";
// the following is to inform that "%s" is to be the first day of week
// %s will be replaced with the day name.
-Calendar._TT["DAY_FIRST"] = "Display %s first";
+Calendar._TT["DAY_FIRST"] = "一周开始于 %s";
// This may be locale-dependent. It specifies the week-end days, as an array
// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
@@ -117,11 +117,11 @@ Calendar._TT["WEEKEND"] = "0,6";
Calendar._TT["CLOSE"] = "å…³é—";
Calendar._TT["TODAY"] = "今天";
-Calendar._TT["TIME_PART"] = "(Shift-)Click or drag to change value";
+Calendar._TT["TIME_PART"] = "ShiftåŠ ç‚¹å‡»æˆ–è€…æ‹–åŠ¨æ¥å˜æ›´";
// date formats
Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
-Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+Calendar._TT["TT_DATE_FORMAT"] = "星期%a %b%e日";
-Calendar._TT["WK"] = "wk";
-Calendar._TT["TIME"] = "Time:";
+Calendar._TT["WK"] = "周";
+Calendar._TT["TIME"] = "时间:";
diff --git a/public/javascripts/context_menu.js b/public/javascripts/context_menu.js
index 2e8108616..20f0fc5a7 100644
--- a/public/javascripts/context_menu.js
+++ b/public/javascripts/context_menu.js
@@ -1,44 +1,221 @@
+/* redMine - project management software
+ Copyright (C) 2006-2008 Jean-Philippe Lang */
+
+var observingContextMenuClick;
+
ContextMenu = Class.create();
ContextMenu.prototype = {
- initialize: function (options) {
- this.options = Object.extend({selector: '.hascontextmenu'}, options || { });
-
- Event.observe(document, 'click', function(e){
- var t = Event.findElement(e, 'a');
- if ((t != document) && (Element.hasClassName(t, 'disabled') || Element.hasClassName(t, 'submenu'))) {
- Event.stop(e);
- } else {
- $('context-menu').hide();
- if (this.selection) {
- this.selection.removeClassName('context-menu-selection');
- }
- }
-
- }.bind(this));
-
- $$(this.options.selector).invoke('observe', (window.opera ? 'click' : 'contextmenu'), function(e){
- if (window.opera && !e.ctrlKey) {
- return;
- }
- this.show(e);
- }.bind(this));
-
- },
- show: function(e) {
- Event.stop(e);
- Element.hide('context-menu');
- if (this.selection) {
- this.selection.removeClassName('context-menu-selection');
- }
- $('context-menu').style['left'] = (Event.pointerX(e) + 'px');
- $('context-menu').style['top'] = (Event.pointerY(e) + 'px');
- Element.update('context-menu', '');
+ initialize: function (url) {
+ this.url = url;
+ // prevent selection when using Ctrl/Shit key
+ var tables = $$('table.issues');
+ for (i=0; i window_width) {
+ render_x -= menu_width;
+ $('context-menu').addClassName('reverse-x');
+ } else {
+ $('context-menu').removeClassName('reverse-x');
+ }
+ if (max_height > window_height) {
+ render_y -= menu_height;
+ $('context-menu').addClassName('reverse-y');
+ } else {
+ $('context-menu').removeClassName('reverse-y');
+ }
+ if (render_x <= 0) render_x = 1;
+ if (render_y <= 0) render_y = 1;
+ $('context-menu').style['left'] = (render_x + 'px');
+ $('context-menu').style['top'] = (render_y + 'px');
+
+ Effect.Appear('context-menu', {duration: 0.20});
+ if (window.parseStylesheets) { window.parseStylesheets(); } // IE
+ }})
+ },
+
+ hideMenu: function() {
+ Element.hide('context-menu');
+ },
+
+ addSelection: function(tr) {
+ tr.addClassName('context-menu-selection');
+ this.checkSelectionBox(tr, true);
+ },
+
+ toggleSelection: function(tr) {
+ if (this.isSelected(tr)) {
+ this.removeSelection(tr);
+ } else {
+ this.addSelection(tr);
+ }
+ },
+
+ removeSelection: function(tr) {
+ tr.removeClassName('context-menu-selection');
+ this.checkSelectionBox(tr, false);
+ },
+
+ unselectAll: function() {
+ var rows = $$('.hascontextmenu');
+ for (i=0; i 0) { inputs[0].checked = checked; }
+ },
+
+ isSelected: function(tr) {
+ return Element.hasClassName(tr, 'context-menu-selection');
+ }
+}
+
+function toggleIssuesSelection(el) {
+ var boxes = el.getElementsBySelector('input[type=checkbox]');
+ var all_checked = true;
+ for (i = 0; i < boxes.length; i++) { if (boxes[i].checked == false) { all_checked = false; } }
+ for (i = 0; i < boxes.length; i++) {
+ if (all_checked) {
+ boxes[i].checked = false;
+ boxes[i].up('tr').removeClassName('context-menu-selection');
+ } else if (boxes[i].checked == false) {
+ boxes[i].checked = true;
+ boxes[i].up('tr').addClassName('context-menu-selection');
+ }
}
}
+
+function window_size() {
+ var w;
+ var h;
+ if (window.innerWidth) {
+ w = window.innerWidth;
+ h = window.innerHeight;
+ } else if (document.documentElement) {
+ w = document.documentElement.clientWidth;
+ h = document.documentElement.clientHeight;
+ } else {
+ w = document.body.clientWidth;
+ h = document.body.clientHeight;
+ }
+ return {width: w, height: h};
+}
diff --git a/public/javascripts/controls.js b/public/javascripts/controls.js
index 8c273f874..5aaf0bb2b 100644
--- a/public/javascripts/controls.js
+++ b/public/javascripts/controls.js
@@ -1,6 +1,6 @@
-// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-// (c) 2005, 2006 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
-// (c) 2005, 2006 Jon Tirsen (http://www.tirsen.com)
+// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// (c) 2005-2007 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
+// (c) 2005-2007 Jon Tirsen (http://www.tirsen.com)
// Contributors:
// Richard Livsey
// Rahul Bhargava
@@ -37,22 +37,23 @@
if(typeof Effect == 'undefined')
throw("controls.js requires including script.aculo.us' effects.js library");
-var Autocompleter = {}
-Autocompleter.Base = function() {};
-Autocompleter.Base.prototype = {
+var Autocompleter = { }
+Autocompleter.Base = Class.create({
baseInitialize: function(element, update, options) {
- this.element = $(element);
+ element = $(element)
+ this.element = element;
this.update = $(update);
this.hasFocus = false;
this.changed = false;
this.active = false;
this.index = 0;
this.entryCount = 0;
+ this.oldElementValue = this.element.value;
if(this.setOptions)
this.setOptions(options);
else
- this.options = options || {};
+ this.options = options || { };
this.options.paramName = this.options.paramName || this.element.name;
this.options.tokens = this.options.tokens || [];
@@ -74,6 +75,9 @@ Autocompleter.Base.prototype = {
if(typeof(this.options.tokens) == 'string')
this.options.tokens = new Array(this.options.tokens);
+ // Force carriage returns as token delimiters anyway
+ if (!this.options.tokens.include('\n'))
+ this.options.tokens.push('\n');
this.observer = null;
@@ -81,15 +85,14 @@ Autocompleter.Base.prototype = {
Element.hide(this.update);
- Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this));
- Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this));
+ Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this));
+ Event.observe(this.element, 'keydown', this.onKeyPress.bindAsEventListener(this));
},
show: function() {
if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
if(!this.iefix &&
- (navigator.appVersion.indexOf('MSIE')>0) &&
- (navigator.userAgent.indexOf('Opera')<0) &&
+ (Prototype.Browser.IE) &&
(Element.getStyle(this.update, 'position')=='absolute')) {
new Insertion.After(this.update,
'
<%= l(:label_comment_plural) %>
-<% @news.comments.each do |comment| %> +<% @comments.each do |comment| %> <% next if comment.new_record? %> -<%= format_time(comment.created_on) %> - <%= comment.author.name %>
<%= authoring comment.created_on, comment.author %>
+ <%= textilizable(comment.comments) %> +<% end if @comments.any? %>