Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b1b08e2c89 |
4
Gemfile
4
Gemfile
@@ -1,6 +1,6 @@
|
||||
source 'http://rubygems.org'
|
||||
|
||||
gem "rails", "3.2.13"
|
||||
gem 'rails', '3.2.9'
|
||||
gem "jquery-rails", "~> 2.0.2"
|
||||
gem "i18n", "~> 0.6.0"
|
||||
gem "coderay", "~> 1.0.6"
|
||||
@@ -79,7 +79,7 @@ group :test do
|
||||
platforms = [:mri_19]
|
||||
platforms << :jruby if defined?(JRUBY_VERSION) && JRUBY_VERSION >= "1.7"
|
||||
gem "test-unit", :platforms => platforms
|
||||
gem "mocha", "~> 0.13.3"
|
||||
gem "mocha", "0.12.3"
|
||||
end
|
||||
|
||||
local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local")
|
||||
|
||||
@@ -39,18 +39,14 @@ class BoardsController < ApplicationController
|
||||
sort_init 'updated_on', 'desc'
|
||||
sort_update 'created_on' => "#{Message.table_name}.created_on",
|
||||
'replies' => "#{Message.table_name}.replies_count",
|
||||
'updated_on' => "COALESCE(last_replies_messages.created_on, #{Message.table_name}.created_on)"
|
||||
'updated_on' => "#{Message.table_name}.updated_on"
|
||||
|
||||
@topic_count = @board.topics.count
|
||||
@topic_pages = Paginator.new self, @topic_count, per_page_option, params['page']
|
||||
@topics = @board.topics.
|
||||
reorder("#{Message.table_name}.sticky DESC").
|
||||
includes(:last_reply).
|
||||
limit(@topic_pages.items_per_page).
|
||||
offset(@topic_pages.current.offset).
|
||||
order(sort_clause).
|
||||
preload(:author, {:last_reply => :author}).
|
||||
all
|
||||
@topics = @board.topics.reorder("#{Message.table_name}.sticky DESC").order(sort_clause).all(
|
||||
:include => [:author, {:last_reply => :author}],
|
||||
:limit => @topic_pages.items_per_page,
|
||||
:offset => @topic_pages.current.offset)
|
||||
@message = Message.new(:board => @board)
|
||||
render :action => 'show', :layout => !request.xhr?
|
||||
}
|
||||
|
||||
@@ -123,7 +123,7 @@ class MessagesController < ApplicationController
|
||||
|
||||
private
|
||||
def find_message
|
||||
return unless find_board
|
||||
find_board
|
||||
@message = @board.messages.find(params[:id], :include => :parent)
|
||||
@topic = @message.root
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
@@ -135,6 +135,5 @@ private
|
||||
@project = @board.project
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
render_404
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
@@ -147,16 +147,15 @@ class MyController < ApplicationController
|
||||
# params[:block] : id of the block to add
|
||||
def add_block
|
||||
block = params[:block].to_s.underscore
|
||||
if block.present? && BLOCKS.key?(block)
|
||||
@user = User.current
|
||||
layout = @user.pref[:my_page_layout] || {}
|
||||
# remove if already present in a group
|
||||
%w(top left right).each {|f| (layout[f] ||= []).delete block }
|
||||
# add it on top
|
||||
layout['top'].unshift block
|
||||
@user.pref[:my_page_layout] = layout
|
||||
@user.pref.save
|
||||
end
|
||||
(render :nothing => true; return) unless block && (BLOCKS.keys.include? block)
|
||||
@user = User.current
|
||||
layout = @user.pref[:my_page_layout] || {}
|
||||
# remove if already present in a group
|
||||
%w(top left right).each {|f| (layout[f] ||= []).delete block }
|
||||
# add it on top
|
||||
layout['top'].unshift block
|
||||
@user.pref[:my_page_layout] = layout
|
||||
@user.pref.save
|
||||
redirect_to :action => 'page_layout'
|
||||
end
|
||||
|
||||
|
||||
@@ -597,9 +597,8 @@ module ApplicationHelper
|
||||
|
||||
def parse_inline_attachments(text, project, obj, attr, only_path, options)
|
||||
# when using an image link, try to use an attachment, if possible
|
||||
attachments = options[:attachments] || []
|
||||
attachments += obj.attachments if obj.respond_to?(:attachments)
|
||||
if attachments.present?
|
||||
if options[:attachments] || (obj && obj.respond_to?(:attachments))
|
||||
attachments = options[:attachments] || obj.attachments
|
||||
text.gsub!(/src="([^\/"]+\.(bmp|gif|jpg|jpe|jpeg|png))"(\s+alt="([^"]*)")?/i) do |m|
|
||||
filename, ext, alt, alttext = $1.downcase, $2, $3, $4
|
||||
# search for the picture in attachments
|
||||
@@ -704,11 +703,10 @@ module ApplicationHelper
|
||||
# identifier:document:"Some document"
|
||||
# identifier:version:1.0.0
|
||||
# identifier:source:some/file
|
||||
def parse_redmine_links(text, default_project, obj, attr, only_path, options)
|
||||
text.gsub!(%r{([\s\(,\-\[\>]|^)(!)?(([a-z0-9\-_]+):)?(attachment|document|version|forum|news|message|project|commit|source|export)?(((#)|((([a-z0-9\-_]+)\|)?(r)))((\d+)((#note)?-(\d+))?)|(:)([^"\s<>][^\s<>]*?|"[^"]+?"))(?=(?=[[:punct:]][^A-Za-z0-9_/])|,|\s|\]|<|$)}) do |m|
|
||||
def parse_redmine_links(text, project, obj, attr, only_path, options)
|
||||
text.gsub!(%r{([\s\(,\-\[\>]|^)(!)?(([a-z0-9\-_]+):)?(attachment|document|version|forum|news|message|project|commit|source|export)?(((#)|((([a-z0-9\-]+)\|)?(r)))((\d+)((#note)?-(\d+))?)|(:)([^"\s<>][^\s<>]*?|"[^"]+?"))(?=(?=[[:punct:]][^A-Za-z0-9_/])|,|\s|\]|<|$)}) do |m|
|
||||
leading, esc, project_prefix, project_identifier, prefix, repo_prefix, repo_identifier, sep, identifier, comment_suffix, comment_id = $1, $2, $3, $4, $5, $10, $11, $8 || $12 || $18, $14 || $19, $15, $17
|
||||
link = nil
|
||||
project = default_project
|
||||
if project_identifier
|
||||
project = Project.visible.find_by_identifier(project_identifier)
|
||||
end
|
||||
@@ -794,7 +792,7 @@ module ApplicationHelper
|
||||
when 'commit', 'source', 'export'
|
||||
if project
|
||||
repository = nil
|
||||
if name =~ %r{^(([a-z0-9\-_]+)\|)(.+)$}
|
||||
if name =~ %r{^(([a-z0-9\-]+)\|)(.+)$}
|
||||
repo_prefix, repo_identifier, name = $1, $2, $3
|
||||
repository = project.repositories.detect {|repo| repo.identifier == repo_identifier}
|
||||
else
|
||||
@@ -821,7 +819,7 @@ module ApplicationHelper
|
||||
end
|
||||
when 'attachment'
|
||||
attachments = options[:attachments] || (obj && obj.respond_to?(:attachments) ? obj.attachments : nil)
|
||||
if attachments && attachment = Attachment.latest_attach(attachments, name)
|
||||
if attachments && attachment = attachments.detect {|a| a.filename == name }
|
||||
link = link_to h(attachment.filename), {:only_path => only_path, :controller => 'attachments', :action => 'download', :id => attachment},
|
||||
:class => 'attachment'
|
||||
end
|
||||
|
||||
@@ -350,10 +350,7 @@ module IssuesHelper
|
||||
association = Issue.reflect_on_association(field.to_sym)
|
||||
if association
|
||||
record = association.class_name.constantize.find_by_id(id)
|
||||
if record
|
||||
record.name.force_encoding('UTF-8') if record.name.respond_to?(:force_encoding)
|
||||
return record.name
|
||||
end
|
||||
return record.name if record
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -87,14 +87,14 @@ module QueriesHelper
|
||||
format_time(value)
|
||||
when 'Date'
|
||||
format_date(value)
|
||||
when 'Fixnum'
|
||||
when 'Fixnum', 'Float'
|
||||
if column.name == :done_ratio
|
||||
progress_bar(value, :width => '80px')
|
||||
elsif column.name == :spent_hours
|
||||
sprintf "%.2f", value
|
||||
else
|
||||
value.to_s
|
||||
h(value.to_s)
|
||||
end
|
||||
when 'Float'
|
||||
sprintf "%.2f", value
|
||||
when 'User'
|
||||
link_to_user value
|
||||
when 'Project'
|
||||
|
||||
@@ -418,7 +418,7 @@ class Issue < ActiveRecord::Base
|
||||
|
||||
if attrs['parent_issue_id'].present?
|
||||
s = attrs['parent_issue_id'].to_s
|
||||
unless (m = s.match(%r{\A#?(\d+)\z})) && (m[1] == parent_id.to_s || Issue.visible(user).exists?(m[1]))
|
||||
unless (m = s.match(%r{\A#?(\d+)\z})) && Issue.visible(user).exists?(m[1])
|
||||
@invalid_parent_issue_id = attrs.delete('parent_issue_id')
|
||||
end
|
||||
end
|
||||
|
||||
@@ -249,9 +249,26 @@ class MailHandler < ActionMailer::Base
|
||||
def add_attachments(obj)
|
||||
if email.attachments && email.attachments.any?
|
||||
email.attachments.each do |attachment|
|
||||
filename = attachment.filename
|
||||
unless filename.respond_to?(:encoding)
|
||||
# try to reencode to utf8 manually with ruby1.8
|
||||
h = attachment.header['Content-Disposition']
|
||||
unless h.nil?
|
||||
begin
|
||||
if m = h.value.match(/filename\*[0-9\*]*=([^=']+)'/)
|
||||
filename = Redmine::CodesetUtil.to_utf8(filename, m[1])
|
||||
elsif m = h.value.match(/filename=.*=\?([^\?]+)\?[BbQq]\?/)
|
||||
# http://tools.ietf.org/html/rfc2047#section-4
|
||||
filename = Redmine::CodesetUtil.to_utf8(filename, m[1])
|
||||
end
|
||||
rescue
|
||||
# nop
|
||||
end
|
||||
end
|
||||
end
|
||||
obj.attachments << Attachment.create(:container => obj,
|
||||
:file => attachment.decoded,
|
||||
:filename => attachment.filename,
|
||||
:filename => filename,
|
||||
:author => user,
|
||||
:content_type => attachment.mime_type)
|
||||
end
|
||||
@@ -374,6 +391,19 @@ class MailHandler < ActionMailer::Base
|
||||
|
||||
def cleaned_up_subject
|
||||
subject = email.subject.to_s
|
||||
unless subject.respond_to?(:encoding)
|
||||
# try to reencode to utf8 manually with ruby1.8
|
||||
begin
|
||||
if h = email.header[:subject]
|
||||
# http://tools.ietf.org/html/rfc2047#section-4
|
||||
if m = h.value.match(/=\?([^\?]+)\?[BbQq]\?/)
|
||||
subject = Redmine::CodesetUtil.to_utf8(subject, m[1])
|
||||
end
|
||||
end
|
||||
rescue
|
||||
# nop
|
||||
end
|
||||
end
|
||||
subject.strip[0,255]
|
||||
end
|
||||
|
||||
|
||||
@@ -731,7 +731,7 @@ class Project < ActiveRecord::Base
|
||||
def copy_wiki(project)
|
||||
# Check that the source project has a wiki first
|
||||
unless project.wiki.nil?
|
||||
wiki = self.wiki || Wiki.new
|
||||
self.wiki ||= Wiki.new
|
||||
wiki.attributes = project.wiki.attributes.dup.except("id", "project_id")
|
||||
wiki_pages_map = {}
|
||||
project.wiki.pages.each do |page|
|
||||
@@ -743,8 +743,6 @@ class Project < ActiveRecord::Base
|
||||
wiki.pages << new_wiki_page
|
||||
wiki_pages_map[page.id] = new_wiki_page
|
||||
end
|
||||
|
||||
self.wiki = wiki
|
||||
wiki.save
|
||||
# Reproduce page hierarchy
|
||||
project.wiki.pages.each do |page|
|
||||
|
||||
@@ -111,7 +111,7 @@
|
||||
<li><%= bulk_update_custom_field_context_menu_link(field, text, value || text) %></li>
|
||||
<% end %>
|
||||
<% unless field.is_required? %>
|
||||
<li><%= bulk_update_custom_field_context_menu_link(field, l(:label_none), '__none__') %></li>
|
||||
<li><%= bulk_update_custom_field_context_menu_link(field, l(:label_none), '') %></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
<% end %>
|
||||
|
||||
<% if @issue.safe_attribute? 'subject' %>
|
||||
<p><%= f.text_field :subject, :size => 80, :maxlength => 255, :required => true %></p>
|
||||
<p><%= f.text_field :subject, :size => 80, :required => true %></p>
|
||||
<% end %>
|
||||
|
||||
<% if @issue.safe_attribute? 'description' %>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<p><%= f.text_field :issue_id, :size => 6 %> <em><%= h("#{@time_entry.issue.tracker.name} ##{@time_entry.issue.id}: #{@time_entry.issue.subject}") if @time_entry.issue %></em></p>
|
||||
<p><%= f.text_field :spent_on, :size => 10, :required => true %><%= calendar_for('time_entry_spent_on') %></p>
|
||||
<p><%= f.text_field :hours, :size => 6, :required => true %></p>
|
||||
<p><%= f.text_field :comments, :size => 100, :maxlength => 255 %></p>
|
||||
<p><%= f.text_field :comments, :size => 100 %></p>
|
||||
<p><%= f.select :activity_id, activity_collection_for_select_options(@time_entry), :required => true %></p>
|
||||
<% @time_entry.custom_field_values.each do |value| %>
|
||||
<p><%= custom_field_tag_with_label :time_entry, value %></p>
|
||||
|
||||
@@ -833,7 +833,7 @@ bg:
|
||||
label_generate_key: Генериране на ключ
|
||||
label_issue_watchers: Наблюдатели
|
||||
label_example: Пример
|
||||
label_display: Показване
|
||||
label_display: Display
|
||||
label_sort: Сортиране
|
||||
label_ascending: Нарастващ
|
||||
label_descending: Намаляващ
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
# Update to 2.2 by Karel Picman <karel.picman@kontron.com>
|
||||
# Update to 1.1 by Michal Gebauer <mishak@mishak.net>
|
||||
# Updated by Josef Liška <jl@chl.cz>
|
||||
# CZ translation by Maxim Krušina | Massimo Filippi, s.r.o. | maxim@mxm.cz
|
||||
@@ -942,146 +941,146 @@ cs:
|
||||
enumeration_activities: Aktivity (sledování času)
|
||||
enumeration_system_activity: Systémová aktivita
|
||||
|
||||
field_warn_on_leaving_unsaved: Varuj mě před opuštěním stránky s neuloženým textem
|
||||
text_warn_on_leaving_unsaved: Aktuální stránka obsahuje neuložený text, který bude ztracen, když opustíte stránku.
|
||||
label_my_queries: Moje vlastní dotazy
|
||||
text_journal_changed_no_detail: "%{label} aktualizován"
|
||||
label_news_comment_added: K novince byl přidán komentář
|
||||
button_expand_all: Rozbal vše
|
||||
button_collapse_all: Sbal vše
|
||||
label_additional_workflow_transitions_for_assignee: Další změna stavu povolena, jestliže je uživatel přiřazen
|
||||
label_additional_workflow_transitions_for_author: Další změna stavu povolena, jestliže je uživatel autorem
|
||||
label_bulk_edit_selected_time_entries: Hromadná změna záznamů času
|
||||
text_time_entries_destroy_confirmation: Jste si jistí, že chcete smazat vybraný záznam(y) času?
|
||||
label_role_anonymous: Anonymní
|
||||
label_role_non_member: Není členem
|
||||
label_issue_note_added: Přidána poznámka
|
||||
label_issue_status_updated: Aktualizován stav
|
||||
label_issue_priority_updated: Aktualizována priorita
|
||||
label_issues_visibility_own: Úkol vytvořen nebo přiřazen uživatel(i/em)
|
||||
field_issues_visibility: Viditelnost úkolů
|
||||
label_issues_visibility_all: Všechny úkoly
|
||||
permission_set_own_issues_private: Nastavit vlastní úkoly jako veřejné nebo soukromé
|
||||
field_is_private: Soukromý
|
||||
permission_set_issues_private: Nastavit úkoly jako veřejné nebo soukromé
|
||||
label_issues_visibility_public: Všechny úkoly, které nejsou soukromé
|
||||
text_issues_destroy_descendants_confirmation: "%{count} podúkol(ů) bude rovněž smazán(o)."
|
||||
field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
|
||||
text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
|
||||
label_my_queries: My custom queries
|
||||
text_journal_changed_no_detail: "%{label} updated"
|
||||
label_news_comment_added: Comment added to a news
|
||||
button_expand_all: Expand all
|
||||
button_collapse_all: Collapse all
|
||||
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee
|
||||
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author
|
||||
label_bulk_edit_selected_time_entries: Bulk edit selected time entries
|
||||
text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)?
|
||||
label_role_anonymous: Anonymous
|
||||
label_role_non_member: Non member
|
||||
label_issue_note_added: Note added
|
||||
label_issue_status_updated: Status updated
|
||||
label_issue_priority_updated: Priority updated
|
||||
label_issues_visibility_own: Issues created by or assigned to the user
|
||||
field_issues_visibility: Issues visibility
|
||||
label_issues_visibility_all: All issues
|
||||
permission_set_own_issues_private: Set own issues public or private
|
||||
field_is_private: Private
|
||||
permission_set_issues_private: Set issues public or private
|
||||
label_issues_visibility_public: All non private issues
|
||||
text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s).
|
||||
field_commit_logs_encoding: Kódování zpráv při commitu
|
||||
field_scm_path_encoding: Kódování cesty SCM
|
||||
text_scm_path_encoding_note: "Výchozí: UTF-8"
|
||||
field_path_to_repository: Cesta k repositáři
|
||||
field_root_directory: Kořenový adresář
|
||||
field_cvs_module: Modul
|
||||
field_scm_path_encoding: Path encoding
|
||||
text_scm_path_encoding_note: "Default: UTF-8"
|
||||
field_path_to_repository: Path to repository
|
||||
field_root_directory: Root directory
|
||||
field_cvs_module: Module
|
||||
field_cvsroot: CVSROOT
|
||||
text_mercurial_repository_note: Lokální repositář (např. /hgrepo, c:\hgrepo)
|
||||
text_scm_command: Příkaz
|
||||
text_scm_command_version: Verze
|
||||
label_git_report_last_commit: Reportovat poslední commit pro soubory a adresáře
|
||||
text_scm_config: Můžete si nastavit vaše SCM příkazy v config/configuration.yml. Restartujte, prosím, aplikaci po jejich úpravě.
|
||||
text_scm_command_not_available: SCM příkaz není k dispozici. Zkontrolujte, prosím, nastavení v panelu Administrace.
|
||||
notice_issue_successful_create: Úkol %{id} vytvořen.
|
||||
label_between: mezi
|
||||
setting_issue_group_assignment: Povolit přiřazení úkolu skupině
|
||||
label_diff: rozdíl
|
||||
text_git_repository_note: Repositář je "bare and local" (např. /gitrepo, c:\gitrepo)
|
||||
description_query_sort_criteria_direction: Směr třídění
|
||||
description_project_scope: Rozsah vyhledávání
|
||||
description_filter: Filtr
|
||||
description_user_mail_notification: Nastavení emailových notifikací
|
||||
description_date_from: Zadejte počáteční datum
|
||||
description_message_content: Obsah zprávy
|
||||
description_available_columns: Dostupné sloupce
|
||||
description_date_range_interval: Zvolte rozsah výběrem počátečního a koncového data
|
||||
description_issue_category_reassign: Zvolte kategorii úkolu
|
||||
description_search: Vyhledávací pole
|
||||
description_notes: Poznámky
|
||||
description_date_range_list: Zvolte rozsah ze seznamu
|
||||
description_choose_project: Projekty
|
||||
description_date_to: Zadejte datum
|
||||
description_query_sort_criteria_attribute: Třídící atribut
|
||||
description_wiki_subpages_reassign: Zvolte novou rodičovskou stránku
|
||||
description_selected_columns: Vybraný sloupec
|
||||
label_parent_revision: Rodič
|
||||
label_child_revision: Potomek
|
||||
error_scm_annotate_big_text_file: Vstup nemůže být anotován, protože překračuje povolenou velikost textového souboru
|
||||
setting_default_issue_start_date_to_creation_date: Použij aktuální datum jako počáteční datum pro nové úkoly
|
||||
button_edit_section: Uprav tuto sekci
|
||||
setting_repositories_encodings: Kódování příloh a repositářů
|
||||
description_all_columns: Všechny sloupce
|
||||
text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo)
|
||||
text_scm_command: Command
|
||||
text_scm_command_version: Version
|
||||
label_git_report_last_commit: Report last commit for files and directories
|
||||
text_scm_config: You can configure your scm commands in config/configuration.yml. Please restart the application after editing it.
|
||||
text_scm_command_not_available: Scm command is not available. Please check settings on the administration panel.
|
||||
notice_issue_successful_create: Issue %{id} created.
|
||||
label_between: between
|
||||
setting_issue_group_assignment: Allow issue assignment to groups
|
||||
label_diff: diff
|
||||
text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
|
||||
description_query_sort_criteria_direction: Sort direction
|
||||
description_project_scope: Search scope
|
||||
description_filter: Filter
|
||||
description_user_mail_notification: Mail notification settings
|
||||
description_date_from: Enter start date
|
||||
description_message_content: Message content
|
||||
description_available_columns: Available Columns
|
||||
description_date_range_interval: Choose range by selecting start and end date
|
||||
description_issue_category_reassign: Choose issue category
|
||||
description_search: Searchfield
|
||||
description_notes: Notes
|
||||
description_date_range_list: Choose range from list
|
||||
description_choose_project: Projects
|
||||
description_date_to: Enter end date
|
||||
description_query_sort_criteria_attribute: Sort attribute
|
||||
description_wiki_subpages_reassign: Choose new parent page
|
||||
description_selected_columns: Selected Columns
|
||||
label_parent_revision: Parent
|
||||
label_child_revision: Child
|
||||
error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size.
|
||||
setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
|
||||
button_edit_section: Edit this section
|
||||
setting_repositories_encodings: Attachments and repositories encodings
|
||||
description_all_columns: All Columns
|
||||
button_export: Export
|
||||
label_export_options: "nastavení exportu %{export_format}"
|
||||
error_attachment_too_big: Soubor nemůže být nahrán, protože jeho velikost je větší než maximum (%{max_size})
|
||||
notice_failed_to_save_time_entries: "Chyba při ukládání %{count} časov(ých/ého) záznam(ů) z %{total} vybraného: %{ids}."
|
||||
label_export_options: "%{export_format} export options"
|
||||
error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})
|
||||
notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}."
|
||||
label_x_issues:
|
||||
zero: 0 Úkol
|
||||
one: 1 Úkol
|
||||
other: "%{count} Úkoly"
|
||||
label_repository_new: Nový repositář
|
||||
field_repository_is_default: Hlavní repositář
|
||||
label_copy_attachments: Kopírovat přílohy
|
||||
label_repository_new: New repository
|
||||
field_repository_is_default: Main repository
|
||||
label_copy_attachments: Copy attachments
|
||||
label_item_position: "%{position}/%{count}"
|
||||
label_completed_versions: Dokončené verze
|
||||
text_project_identifier_info: Jsou povolena pouze malá písmena (a-z), číslice, pomlčky a podtržítka.<br />Po uložení již nelze identifikátor měnit.
|
||||
field_multiple: Více hodnot
|
||||
setting_commit_cross_project_ref: Povolit reference a opravy úklů ze všech ostatních projektů
|
||||
text_issue_conflict_resolution_add_notes: Přidat moje poznámky a zahodit ostatní změny
|
||||
text_issue_conflict_resolution_overwrite: Přesto přijmout moje úpravy (předchozí poznámky budou zachovány, ale některé změny mohou být přepsány)
|
||||
notice_issue_update_conflict: Během vašich úprav byl úkol aktualizován jiným uživatelem.
|
||||
text_issue_conflict_resolution_cancel: Zahoď všechny moje změny a znovu zobraz %{link}
|
||||
permission_manage_related_issues: Spravuj související úkoly
|
||||
field_auth_source_ldap_filter: LDAP filtr
|
||||
label_search_for_watchers: Hledej sledující pro přidání
|
||||
notice_account_deleted: Váš účet byl trvale smazán.
|
||||
setting_unsubscribe: Povolit uživatelům smazání jejich vlastního účtu
|
||||
button_delete_my_account: Smazat můj účet
|
||||
label_completed_versions: Completed versions
|
||||
text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.
|
||||
field_multiple: Multiple values
|
||||
setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
|
||||
text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes
|
||||
text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten)
|
||||
notice_issue_update_conflict: The issue has been updated by an other user while you were editing it.
|
||||
text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link}
|
||||
permission_manage_related_issues: Manage related issues
|
||||
field_auth_source_ldap_filter: LDAP filter
|
||||
label_search_for_watchers: Search for watchers to add
|
||||
notice_account_deleted: Your account has been permanently deleted.
|
||||
setting_unsubscribe: Allow users to delete their own account
|
||||
button_delete_my_account: Delete my account
|
||||
text_account_destroy_confirmation: |-
|
||||
Skutečně chcete pokračovat?
|
||||
Váš účet bude nenávratně smazán.
|
||||
error_session_expired: Vaše sezení vypršelo. Znovu se přihlaste, prosím.
|
||||
text_session_expiration_settings: "Varování: změnou tohoto nastavení mohou vypršet aktuální sezení včetně toho vašeho."
|
||||
setting_session_lifetime: Maximální čas sezení
|
||||
setting_session_timeout: Vypršení sezení bez aktivity
|
||||
label_session_expiration: Vypršení sezení
|
||||
permission_close_project: Zavřít / Otevřít projekt
|
||||
label_show_closed_projects: Zobrazit zavřené projekty
|
||||
button_close: Zavřít
|
||||
button_reopen: Znovu otevřít
|
||||
project_status_active: aktivní
|
||||
project_status_closed: zavřený
|
||||
project_status_archived: archivovaný
|
||||
text_project_closed: Tento projekt je uzevřený a je pouze pro čtení.
|
||||
notice_user_successful_create: Uživatel %{id} vytvořen.
|
||||
field_core_fields: Standardní pole
|
||||
field_timeout: Vypršení (v sekundách)
|
||||
setting_thumbnails_enabled: Zobrazit náhled přílohy
|
||||
setting_thumbnails_size: Velikost náhledu (v pixelech)
|
||||
label_status_transitions: Změna stavu
|
||||
label_fields_permissions: Práva k polím
|
||||
label_readonly: Pouze pro čtení
|
||||
label_required: Vyžadováno
|
||||
text_repository_identifier_info: Jou povoleny pouze malá písmena (a-z), číslice, pomlčky a podtržítka.<br />Po uložení již nelze identifikátor změnit.
|
||||
field_board_parent: Rodičovské fórum
|
||||
label_attribute_of_project: Projektové %{name}
|
||||
label_attribute_of_author: Autorovo %{name}
|
||||
label_attribute_of_assigned_to: "%{name} přiřazené(ho)"
|
||||
label_attribute_of_fixed_version: Cílová verze %{name}
|
||||
label_copy_subtasks: Kopírovat podúkoly
|
||||
label_copied_to: zkopírováno do
|
||||
label_copied_from: zkopírováno z
|
||||
label_any_issues_in_project: jakékoli úkoly v projektu
|
||||
label_any_issues_not_in_project: jakékoli úkoly mimo projektu
|
||||
field_private_notes: Soukromé poznámky
|
||||
permission_view_private_notes: Zobrazit soukromé poznámky
|
||||
permission_set_notes_private: Nastavit poznámky jako soukromé
|
||||
label_no_issues_in_project: žádné úkoly v projektu
|
||||
Are you sure you want to proceed?
|
||||
Your account will be permanently deleted, with no way to reactivate it.
|
||||
error_session_expired: Your session has expired. Please login again.
|
||||
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||
setting_session_lifetime: Session maximum lifetime
|
||||
setting_session_timeout: Session inactivity timeout
|
||||
label_session_expiration: Session expiration
|
||||
permission_close_project: Close / reopen the project
|
||||
label_show_closed_projects: View closed projects
|
||||
button_close: Close
|
||||
button_reopen: Reopen
|
||||
project_status_active: active
|
||||
project_status_closed: closed
|
||||
project_status_archived: archived
|
||||
text_project_closed: This project is closed and read-only.
|
||||
notice_user_successful_create: User %{id} created.
|
||||
field_core_fields: Standard fields
|
||||
field_timeout: Timeout (in seconds)
|
||||
setting_thumbnails_enabled: Display attachment thumbnails
|
||||
setting_thumbnails_size: Thumbnails size (in pixels)
|
||||
label_status_transitions: Status transitions
|
||||
label_fields_permissions: Fields permissions
|
||||
label_readonly: Read-only
|
||||
label_required: Required
|
||||
text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.
|
||||
field_board_parent: Parent forum
|
||||
label_attribute_of_project: Project's %{name}
|
||||
label_attribute_of_author: Author's %{name}
|
||||
label_attribute_of_assigned_to: Assignee's %{name}
|
||||
label_attribute_of_fixed_version: Target version's %{name}
|
||||
label_copy_subtasks: Copy subtasks
|
||||
label_copied_to: copied to
|
||||
label_copied_from: copied from
|
||||
label_any_issues_in_project: any issues in project
|
||||
label_any_issues_not_in_project: any issues not in project
|
||||
field_private_notes: Private notes
|
||||
permission_view_private_notes: View private notes
|
||||
permission_set_notes_private: Set notes as private
|
||||
label_no_issues_in_project: no issues in project
|
||||
label_any: vše
|
||||
label_last_n_weeks: poslední %{count} týdny
|
||||
setting_cross_project_subtasks: Povolit podúkoly napříč projekty
|
||||
label_last_n_weeks: last %{count} weeks
|
||||
setting_cross_project_subtasks: Allow cross-project subtasks
|
||||
label_cross_project_descendants: S podprojekty
|
||||
label_cross_project_tree: Se stromem projektu
|
||||
label_cross_project_hierarchy: S hierarchií projektu
|
||||
label_cross_project_system: Se všemi projekty
|
||||
button_hide: Skrýt
|
||||
setting_non_working_week_days: Dny pracovního volna/klidu
|
||||
label_in_the_next_days: v přístích
|
||||
label_in_the_past_days: v minulých
|
||||
button_hide: Hide
|
||||
setting_non_working_week_days: Non-working days
|
||||
label_in_the_next_days: in the next
|
||||
label_in_the_past_days: in the past
|
||||
|
||||
@@ -1037,84 +1037,84 @@ es:
|
||||
description_selected_columns: Columnas seleccionadas
|
||||
label_parent_revision: Padre
|
||||
label_child_revision: Hijo
|
||||
setting_default_issue_start_date_to_creation_date: Utilizar la fecha actual como fecha de inicio para nuevas peticiones
|
||||
button_edit_section: Editar esta sección
|
||||
setting_repositories_encodings: Codificación de adjuntos y repositorios
|
||||
setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
|
||||
button_edit_section: Edit this section
|
||||
setting_repositories_encodings: Attachments and repositories encodings
|
||||
description_all_columns: Todas las columnas
|
||||
button_export: Exportar
|
||||
label_export_options: "%{export_format} opciones de exportación"
|
||||
error_attachment_too_big: Este fichero no se puede adjuntar porque excede el tamaño máximo de fichero (%{max_size})
|
||||
notice_failed_to_save_time_entries: "Error al guardar %{count} entradas de tiempo de las %{total} seleccionadas: %{ids}."
|
||||
notice_failed_to_save_time_entries: "Error al guarda %{count} entradas de tiempo de las %{total} seleccionadas: %{ids}."
|
||||
label_x_issues:
|
||||
zero: 0 petición
|
||||
one: 1 petición
|
||||
other: "%{count} peticiones"
|
||||
label_repository_new: Nuevo repositorio
|
||||
field_repository_is_default: Repositorio principal
|
||||
label_copy_attachments: Copiar adjuntos
|
||||
label_repository_new: New repository
|
||||
field_repository_is_default: Main repository
|
||||
label_copy_attachments: Copy attachments
|
||||
label_item_position: "%{position}/%{count}"
|
||||
label_completed_versions: Versiones completadas
|
||||
text_project_identifier_info: Solo se permiten letras en minúscula (a-z), números, guiones y barras bajas.<br />Una vez guardado, el identificador no se puede cambiar.
|
||||
field_multiple: Valores múltiples
|
||||
setting_commit_cross_project_ref: Permitir referenciar y resolver peticiones de todos los demás proyectos
|
||||
text_issue_conflict_resolution_add_notes: Añadir mis notas y descartar mis otros cambios
|
||||
text_issue_conflict_resolution_overwrite: Aplicar mis campos de todas formas (las notas anteriores se mantendrán pero algunos cambios podrían ser sobreescritos)
|
||||
notice_issue_update_conflict: La petición ha sido actualizada por otro usuario mientras la editaba.
|
||||
text_issue_conflict_resolution_cancel: Descartar todos mis cambios y mostrar de nuevo %{link}
|
||||
permission_manage_related_issues: Gestionar peticiones relacionadas
|
||||
field_auth_source_ldap_filter: Filtro LDAP
|
||||
label_search_for_watchers: Buscar seguidores para añadirlos
|
||||
notice_account_deleted: Su cuenta ha sido eliminada
|
||||
setting_unsubscribe: Permitir a los usuarios borrar sus propias cuentas
|
||||
button_delete_my_account: Borrar mi cuenta
|
||||
label_completed_versions: Completed versions
|
||||
text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.
|
||||
field_multiple: Multiple values
|
||||
setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
|
||||
text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes
|
||||
text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten)
|
||||
notice_issue_update_conflict: The issue has been updated by an other user while you were editing it.
|
||||
text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link}
|
||||
permission_manage_related_issues: Manage related issues
|
||||
field_auth_source_ldap_filter: LDAP filter
|
||||
label_search_for_watchers: Search for watchers to add
|
||||
notice_account_deleted: Your account has been permanently deleted.
|
||||
setting_unsubscribe: Allow users to delete their own account
|
||||
button_delete_my_account: Delete my account
|
||||
text_account_destroy_confirmation: |-
|
||||
¿Está seguro de querer proceder?
|
||||
Su cuenta quedará borrada permanentemente, sin la posibilidad de reactivarla.
|
||||
error_session_expired: Su sesión ha expirado. Por favor, vuelva a identificarse.
|
||||
text_session_expiration_settings: "Advertencia: el cambio de estas opciones podría hacer expirar las sesiones activas, incluyendo la suya."
|
||||
setting_session_lifetime: Tiempo de vida máximo de las sesiones
|
||||
setting_session_timeout: Tiempo máximo de inactividad de las sesiones
|
||||
label_session_expiration: Expiración de sesiones
|
||||
permission_close_project: Cerrar / reabrir el proyecto
|
||||
label_show_closed_projects: Ver proyectos cerrados
|
||||
button_close: Cerrar
|
||||
button_reopen: Reabrir
|
||||
project_status_active: activo
|
||||
project_status_closed: cerrado
|
||||
project_status_archived: archivado
|
||||
text_project_closed: Este proyecto está cerrado y es de sólo lectura
|
||||
notice_user_successful_create: Usuario %{id} creado.
|
||||
field_core_fields: Campos básicos
|
||||
field_timeout: Tiempo de inactividad (en segundos)
|
||||
setting_thumbnails_enabled: Mostrar miniaturas de los adjuntos
|
||||
setting_thumbnails_size: Tamaño de las miniaturas (en píxeles)
|
||||
label_status_transitions: Transiciones de estado
|
||||
label_fields_permissions: Permisos sobre los campos
|
||||
label_readonly: Sólo lectura
|
||||
label_required: Requerido
|
||||
text_repository_identifier_info: Solo se permiten letras en minúscula (a-z), números, guiones y barras bajas.<br />Una vez guardado, el identificador no se puede cambiar.
|
||||
field_board_parent: Foro padre
|
||||
label_attribute_of_project: "%{name} del proyecto"
|
||||
label_attribute_of_author: "%{name} del autor"
|
||||
label_attribute_of_assigned_to: "%{name} de la persona asignada"
|
||||
label_attribute_of_fixed_version: "%{name} de la versión indicada"
|
||||
label_copy_subtasks: Copiar subtareas
|
||||
label_copied_to: copiada a
|
||||
label_copied_from: copiada desde
|
||||
label_any_issues_in_project: cualquier petición del proyecto
|
||||
label_any_issues_not_in_project: cualquier petición que no sea del proyecto
|
||||
field_private_notes: Notas privadas
|
||||
permission_view_private_notes: Ver notas privadas
|
||||
permission_set_notes_private: Poner notas como privadas
|
||||
label_no_issues_in_project: no hay peticiones en el proyecto
|
||||
Are you sure you want to proceed?
|
||||
Your account will be permanently deleted, with no way to reactivate it.
|
||||
error_session_expired: Your session has expired. Please login again.
|
||||
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||
setting_session_lifetime: Session maximum lifetime
|
||||
setting_session_timeout: Session inactivity timeout
|
||||
label_session_expiration: Session expiration
|
||||
permission_close_project: Close / reopen the project
|
||||
label_show_closed_projects: View closed projects
|
||||
button_close: Close
|
||||
button_reopen: Reopen
|
||||
project_status_active: active
|
||||
project_status_closed: closed
|
||||
project_status_archived: archived
|
||||
text_project_closed: This project is closed and read-only.
|
||||
notice_user_successful_create: User %{id} created.
|
||||
field_core_fields: Standard fields
|
||||
field_timeout: Timeout (in seconds)
|
||||
setting_thumbnails_enabled: Display attachment thumbnails
|
||||
setting_thumbnails_size: Thumbnails size (in pixels)
|
||||
label_status_transitions: Status transitions
|
||||
label_fields_permissions: Fields permissions
|
||||
label_readonly: Read-only
|
||||
label_required: Required
|
||||
text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.
|
||||
field_board_parent: Parent forum
|
||||
label_attribute_of_project: Project's %{name}
|
||||
label_attribute_of_author: Author's %{name}
|
||||
label_attribute_of_assigned_to: Assignee's %{name}
|
||||
label_attribute_of_fixed_version: Target version's %{name}
|
||||
label_copy_subtasks: Copy subtasks
|
||||
label_copied_to: copied to
|
||||
label_copied_from: copied from
|
||||
label_any_issues_in_project: any issues in project
|
||||
label_any_issues_not_in_project: any issues not in project
|
||||
field_private_notes: Private notes
|
||||
permission_view_private_notes: View private notes
|
||||
permission_set_notes_private: Set notes as private
|
||||
label_no_issues_in_project: no issues in project
|
||||
label_any: todos
|
||||
label_last_n_weeks: en las últimas %{count} semanas
|
||||
setting_cross_project_subtasks: Permitir subtareas cruzadas entre proyectos
|
||||
label_last_n_weeks: last %{count} weeks
|
||||
setting_cross_project_subtasks: Allow cross-project subtasks
|
||||
label_cross_project_descendants: Con proyectos hijo
|
||||
label_cross_project_tree: Con el árbol del proyecto
|
||||
label_cross_project_hierarchy: Con la jerarquía del proyecto
|
||||
label_cross_project_system: Con todos los proyectos
|
||||
button_hide: Ocultar
|
||||
setting_non_working_week_days: Días no laborables
|
||||
label_in_the_next_days: en los próximos
|
||||
label_in_the_past_days: en los anteriores
|
||||
button_hide: Hide
|
||||
setting_non_working_week_days: Non-working days
|
||||
label_in_the_next_days: in the next
|
||||
label_in_the_past_days: in the past
|
||||
|
||||
@@ -53,8 +53,8 @@ pt-BR:
|
||||
one: 'aproximadamente 1 hora'
|
||||
other: 'aproximadamente %{count} horas'
|
||||
x_hours:
|
||||
one: "1 hora"
|
||||
other: "%{count} horas"
|
||||
one: "1 hour"
|
||||
other: "%{count} hours"
|
||||
|
||||
x_days:
|
||||
one: '1 dia'
|
||||
@@ -76,8 +76,8 @@ pt-BR:
|
||||
one: 'mais de 1 ano'
|
||||
other: 'mais de %{count} anos'
|
||||
almost_x_years:
|
||||
one: "quase 1 ano"
|
||||
other: "quase %{count} anos"
|
||||
one: "almost 1 year"
|
||||
other: "almost %{count} years"
|
||||
|
||||
# numeros
|
||||
number:
|
||||
@@ -888,7 +888,7 @@ pt-BR:
|
||||
setting_issue_done_ratio_issue_status: Usar a situação da tarefa
|
||||
error_issue_done_ratios_not_updated: O pecentual de conclusão das tarefas não foi atualizado.
|
||||
error_workflow_copy_target: Por favor, selecione os tipos de tarefa e os papéis alvo
|
||||
setting_issue_done_ratio_issue_field: Use o campo da tarefa
|
||||
setting_issue_done_ratio_issue_field: Use the issue field
|
||||
label_copy_same_as_target: Mesmo alvo
|
||||
label_copy_target: Alvo
|
||||
notice_issue_done_ratios_updated: Percentual de conslusão atualizados.
|
||||
@@ -994,13 +994,13 @@ pt-BR:
|
||||
label_git_report_last_commit: Relatar última alteração para arquivos e diretórios
|
||||
text_scm_config: Você pode configurar seus comandos de versionamento em config/configurations.yml. Por favor reinicie a aplicação após alterá-lo.
|
||||
text_scm_command_not_available: Comando de versionamento não disponível. Por favor verifique as configurações no painel de administração.
|
||||
notice_issue_successful_create: Tarefa %{id} criada.
|
||||
label_between: entre
|
||||
setting_issue_group_assignment: Permitir atribuições de tarefas a grupos
|
||||
notice_issue_successful_create: Issue %{id} created.
|
||||
label_between: between
|
||||
setting_issue_group_assignment: Allow issue assignment to groups
|
||||
label_diff: diff
|
||||
text_git_repository_note: "Repositório esta vazio e é local (ex: /gitrepo, c:\\gitrepo)"
|
||||
text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
|
||||
|
||||
description_query_sort_criteria_direction: Direção da ordenação
|
||||
description_query_sort_criteria_direction: Sort direction
|
||||
description_project_scope: Escopo da pesquisa
|
||||
description_filter: Filtro
|
||||
description_user_mail_notification: Configuração de notificações por e-mail
|
||||
@@ -1014,91 +1014,91 @@ pt-BR:
|
||||
description_date_range_list: Escolha um período a partira da lista
|
||||
description_choose_project: Projetos
|
||||
description_date_to: Digite a data final
|
||||
description_query_sort_criteria_attribute: Atributo de ordenação
|
||||
description_query_sort_criteria_attribute: Sort attribute
|
||||
description_wiki_subpages_reassign: Escolha uma nova página pai
|
||||
description_selected_columns: Colunas selecionadas
|
||||
|
||||
label_parent_revision: Pais
|
||||
label_child_revision: Filhos
|
||||
error_scm_annotate_big_text_file: A entrada não pode ser anotada, pois excede o tamanho máximo do arquivo de texto.
|
||||
label_parent_revision: Parent
|
||||
label_child_revision: Child
|
||||
error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size.
|
||||
setting_default_issue_start_date_to_creation_date: Usar data corrente como data inicial para novas tarefas
|
||||
button_edit_section: Editar esta seção
|
||||
setting_repositories_encodings: Encoding dos repositórios e anexos
|
||||
description_all_columns: Todas as colunas
|
||||
button_export: Exportar
|
||||
label_export_options: "Opções de exportação %{export_format}"
|
||||
error_attachment_too_big: Este arquivo não pode ser enviado porque excede o tamanho máximo permitido (%{max_size})
|
||||
notice_failed_to_save_time_entries: "Falha ao salvar %{count} de %{total} horas trabalhadas: %{ids}."
|
||||
button_edit_section: Edit this section
|
||||
setting_repositories_encodings: Attachments and repositories encodings
|
||||
description_all_columns: All Columns
|
||||
button_export: Export
|
||||
label_export_options: "%{export_format} export options"
|
||||
error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})
|
||||
notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}."
|
||||
label_x_issues:
|
||||
zero: 0 tarefa
|
||||
one: 1 tarefa
|
||||
other: "%{count} tarefas"
|
||||
label_repository_new: Novo repositório
|
||||
field_repository_is_default: Repositório principal
|
||||
label_copy_attachments: Copiar anexos
|
||||
label_repository_new: New repository
|
||||
field_repository_is_default: Main repository
|
||||
label_copy_attachments: Copy attachments
|
||||
label_item_position: "%{position}/%{count}"
|
||||
label_completed_versions: Versões completadas
|
||||
text_project_identifier_info: Somente letras minúsculas (az), números, traços e sublinhados são permitidos. <br /> Uma vez salvo, o identificador não pode ser alterado.
|
||||
field_multiple: Multiplos valores
|
||||
setting_commit_cross_project_ref: Permitir que tarefas de todos os outros projetos sejam refenciadas e resolvidas
|
||||
text_issue_conflict_resolution_add_notes: Adicione minhas anotações e descartar minhas outras mudanças
|
||||
text_issue_conflict_resolution_overwrite: Aplicar as minhas alterações de qualquer maneira (notas anteriores serão mantidos, mas algumas mudanças podem ser substituídos)
|
||||
notice_issue_update_conflict: A tarefa foi atualizada por um outro usuário, enquanto você estava editando.
|
||||
text_issue_conflict_resolution_cancel: Descartar todas as minhas mudanças e re-exibir %{link}
|
||||
permission_manage_related_issues: Gerenciar tarefas relacionadas
|
||||
field_auth_source_ldap_filter: Filtro LDAP
|
||||
label_search_for_watchers: Procurar por outros observadores para adiconar
|
||||
notice_account_deleted: Sua conta foi excluída permanentemente.
|
||||
setting_unsubscribe: Permitir aos usuários excluir sua conta própria
|
||||
button_delete_my_account: Excluir minha conta
|
||||
label_completed_versions: Completed versions
|
||||
text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.
|
||||
field_multiple: Multiple values
|
||||
setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
|
||||
text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes
|
||||
text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten)
|
||||
notice_issue_update_conflict: The issue has been updated by an other user while you were editing it.
|
||||
text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link}
|
||||
permission_manage_related_issues: Manage related issues
|
||||
field_auth_source_ldap_filter: LDAP filter
|
||||
label_search_for_watchers: Search for watchers to add
|
||||
notice_account_deleted: Your account has been permanently deleted.
|
||||
setting_unsubscribe: Allow users to delete their own account
|
||||
button_delete_my_account: Delete my account
|
||||
text_account_destroy_confirmation: |-
|
||||
Tem certeza de que quer continuar?
|
||||
Sua conta será excluída permanentemente, sem qualquer forma de reativá-lo.
|
||||
error_session_expired: A sua sessão expirou. Por favor, faça login novamente.
|
||||
text_session_expiration_settings: "Aviso: a alteração dessas configurações pode expirar as sessões atuais, incluindo a sua."
|
||||
setting_session_lifetime: duração máxima da sessão
|
||||
setting_session_timeout: tempo limite de inatividade da sessão
|
||||
label_session_expiration: "Expiração da sessão"
|
||||
permission_close_project: Fechar / reabrir o projeto
|
||||
label_show_closed_projects: Visualização de projetos fechados
|
||||
button_close: Fechar
|
||||
button_reopen: Reabrir
|
||||
project_status_active: ativo
|
||||
project_status_closed: fechado
|
||||
project_status_archived: arquivado
|
||||
text_project_closed: Este projeto é fechado e somente leitura.
|
||||
notice_user_successful_create: Usuário %{id} criado.
|
||||
field_core_fields: campos padrão
|
||||
field_timeout: Tempo de espera (em segundos)
|
||||
setting_thumbnails_enabled: exibir miniaturas de anexos
|
||||
setting_thumbnails_size: Tamanho das miniaturas (em pixels)
|
||||
label_status_transitions: Estados das transições
|
||||
label_fields_permissions: Permissões de campos
|
||||
label_readonly: somente leitura
|
||||
label_required: Obrigatório
|
||||
text_repository_identifier_info: Somente letras minúsculas (az), números, traços e sublinhados são permitidos <br/> Uma vez salvo, o identificador não pode ser alterado.
|
||||
field_board_parent: Fórum Pai
|
||||
label_attribute_of_project: "Projeto %{name}"
|
||||
label_attribute_of_author: "autor %{name}"
|
||||
label_attribute_of_assigned_to: "atribuído %{name}"
|
||||
label_attribute_of_fixed_version: "versão alvo %{name}"
|
||||
label_copy_subtasks: Copiar sub-tarefas
|
||||
label_copied_to: copiada
|
||||
label_copied_from: copiado
|
||||
label_any_issues_in_project: quaisquer problemas em projeto
|
||||
label_any_issues_not_in_project: todas as questões que não estão em projeto
|
||||
field_private_notes: notas privadas
|
||||
permission_view_private_notes: Ver notas privadas
|
||||
permission_set_notes_private: Defina notas como privada
|
||||
label_no_issues_in_project: sem problemas em projeto
|
||||
Are you sure you want to proceed?
|
||||
Your account will be permanently deleted, with no way to reactivate it.
|
||||
error_session_expired: Your session has expired. Please login again.
|
||||
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||
setting_session_lifetime: Session maximum lifetime
|
||||
setting_session_timeout: Session inactivity timeout
|
||||
label_session_expiration: Session expiration
|
||||
permission_close_project: Close / reopen the project
|
||||
label_show_closed_projects: View closed projects
|
||||
button_close: Close
|
||||
button_reopen: Reopen
|
||||
project_status_active: active
|
||||
project_status_closed: closed
|
||||
project_status_archived: archived
|
||||
text_project_closed: This project is closed and read-only.
|
||||
notice_user_successful_create: User %{id} created.
|
||||
field_core_fields: Standard fields
|
||||
field_timeout: Timeout (in seconds)
|
||||
setting_thumbnails_enabled: Display attachment thumbnails
|
||||
setting_thumbnails_size: Thumbnails size (in pixels)
|
||||
label_status_transitions: Status transitions
|
||||
label_fields_permissions: Fields permissions
|
||||
label_readonly: Read-only
|
||||
label_required: Required
|
||||
text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.
|
||||
field_board_parent: Parent forum
|
||||
label_attribute_of_project: Project's %{name}
|
||||
label_attribute_of_author: Author's %{name}
|
||||
label_attribute_of_assigned_to: Assignee's %{name}
|
||||
label_attribute_of_fixed_version: Target version's %{name}
|
||||
label_copy_subtasks: Copy subtasks
|
||||
label_copied_to: copied to
|
||||
label_copied_from: copied from
|
||||
label_any_issues_in_project: any issues in project
|
||||
label_any_issues_not_in_project: any issues not in project
|
||||
field_private_notes: Private notes
|
||||
permission_view_private_notes: View private notes
|
||||
permission_set_notes_private: Set notes as private
|
||||
label_no_issues_in_project: no issues in project
|
||||
label_any: todos
|
||||
label_last_n_weeks: "últimas %{count} semanas"
|
||||
setting_cross_project_subtasks: Permitir cruzamento de sub-tarefas entre projetos
|
||||
label_last_n_weeks: last %{count} weeks
|
||||
setting_cross_project_subtasks: Allow cross-project subtasks
|
||||
label_cross_project_descendants: Com sub-projetos
|
||||
label_cross_project_tree: Com a árvore do projeto
|
||||
label_cross_project_hierarchy: Com a hierarquia do projeto
|
||||
label_cross_project_system: Com todos os projetos
|
||||
button_hide: Esconder
|
||||
setting_non_working_week_days: dias não úteis
|
||||
label_in_the_next_days: na próxima
|
||||
label_in_the_past_days: no passado
|
||||
button_hide: Hide
|
||||
setting_non_working_week_days: Non-working days
|
||||
label_in_the_next_days: in the next
|
||||
label_in_the_past_days: in the past
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
# Portuguese localization for Ruby on Rails
|
||||
# by Ricardo Otero <oterosantos@gmail.com>
|
||||
# by Alberto Ferreira <toraxic@gmail.com>
|
||||
# by Rui Rebelo <rmrebelo@ua.pt>
|
||||
pt:
|
||||
support:
|
||||
array:
|
||||
@@ -52,8 +51,8 @@ pt:
|
||||
one: "aproximadamente 1 hora"
|
||||
other: "aproximadamente %{count} horas"
|
||||
x_hours:
|
||||
one: "1 hora"
|
||||
other: "%{count} horas"
|
||||
one: "1 hour"
|
||||
other: "%{count} hours"
|
||||
x_days:
|
||||
one: "1 dia"
|
||||
other: "%{count} dias"
|
||||
@@ -70,8 +69,8 @@ pt:
|
||||
one: "mais de 1 ano"
|
||||
other: "mais de %{count} anos"
|
||||
almost_x_years:
|
||||
one: "quase 1 ano"
|
||||
other: "quase %{count} anos"
|
||||
one: "almost 1 year"
|
||||
other: "almost %{count} years"
|
||||
|
||||
number:
|
||||
format:
|
||||
@@ -441,17 +440,17 @@ pt:
|
||||
label_closed_issues: fechado
|
||||
label_closed_issues_plural: fechados
|
||||
label_x_open_issues_abbr_on_total:
|
||||
zero: 0 abertas / %{total}
|
||||
one: 1 aberta / %{total}
|
||||
other: "%{count} abertas / %{total}"
|
||||
zero: 0 open / %{total}
|
||||
one: 1 open / %{total}
|
||||
other: "%{count} open / %{total}"
|
||||
label_x_open_issues_abbr:
|
||||
zero: 0 abertas
|
||||
one: 1 aberta
|
||||
other: "%{count} abertas"
|
||||
zero: 0 open
|
||||
one: 1 open
|
||||
other: "%{count} open"
|
||||
label_x_closed_issues_abbr:
|
||||
zero: 0 fechadas
|
||||
one: 1 fechada
|
||||
other: "%{count} fechadas"
|
||||
zero: 0 closed
|
||||
one: 1 closed
|
||||
other: "%{count} closed"
|
||||
label_total: Total
|
||||
label_permissions: Permissões
|
||||
label_current_status: Estado actual
|
||||
@@ -475,9 +474,9 @@ pt:
|
||||
label_comment: Comentário
|
||||
label_comment_plural: Comentários
|
||||
label_x_comments:
|
||||
zero: sem comentários
|
||||
one: 1 comentário
|
||||
other: "%{count} comentários"
|
||||
zero: no comments
|
||||
one: 1 comment
|
||||
other: "%{count} comments"
|
||||
label_comment_add: Adicionar comentário
|
||||
label_comment_added: Comentário adicionado
|
||||
label_comment_delete: Apagar comentários
|
||||
@@ -944,146 +943,146 @@ pt:
|
||||
setting_commit_logtime_enabled: Activar registo de tempo
|
||||
notice_gantt_chart_truncated: O gráfico foi truncado porque excede o número máximo de itens visível (%{máx.})
|
||||
setting_gantt_items_limit: Número máximo de itens exibidos no gráfico Gantt
|
||||
field_warn_on_leaving_unsaved: Avisar-me quando deixar uma página com texto por salvar
|
||||
text_warn_on_leaving_unsaved: A página actual contém texto por salvar que será perdido caso saia desta página.
|
||||
label_my_queries: As minhas consultas
|
||||
text_journal_changed_no_detail: "%{label} actualizada"
|
||||
label_news_comment_added: Comentário adicionado a uma notícia
|
||||
button_expand_all: Expandir todos
|
||||
button_collapse_all: Minimizar todos
|
||||
label_additional_workflow_transitions_for_assignee: Transições adicionais permitidas quando a tarefa está atribuida ao utilizador
|
||||
label_additional_workflow_transitions_for_author: Transições adicionais permitidas quando o utilizador é o autor da tarefa
|
||||
label_bulk_edit_selected_time_entries: Edição em massa de registos de tempo
|
||||
text_time_entries_destroy_confirmation: Têm a certeza que pretende apagar o(s) registo(s) de tempo selecionado(s)?
|
||||
label_role_anonymous: Anónimo
|
||||
label_role_non_member: Não membro
|
||||
label_issue_note_added: Nota adicionada
|
||||
label_issue_status_updated: Estado actualizado
|
||||
label_issue_priority_updated: Prioridade adicionada
|
||||
label_issues_visibility_own: Tarefas criadas ou atribuídas ao utilizador
|
||||
field_issues_visibility: Visibilidade das tarefas
|
||||
label_issues_visibility_all: Todas as tarefas
|
||||
permission_set_own_issues_private: Configurar as suas tarefas como públicas ou privadas
|
||||
field_is_private: Privado
|
||||
permission_set_issues_private: Configurar tarefas como públicas ou privadas
|
||||
label_issues_visibility_public: Todas as tarefas públicas
|
||||
text_issues_destroy_descendants_confirmation: Irá apagar também %{count} subtarefa(s).
|
||||
field_commit_logs_encoding: Codificação das mensagens de commit
|
||||
field_scm_path_encoding: Codificação do caminho
|
||||
text_scm_path_encoding_note: "Por omissão: UTF-8"
|
||||
field_path_to_repository: Caminho para o repositório
|
||||
field_root_directory: Raíz do directório
|
||||
field_cvs_module: Módulo
|
||||
field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
|
||||
text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
|
||||
label_my_queries: My custom queries
|
||||
text_journal_changed_no_detail: "%{label} updated"
|
||||
label_news_comment_added: Comment added to a news
|
||||
button_expand_all: Expand all
|
||||
button_collapse_all: Collapse all
|
||||
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee
|
||||
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author
|
||||
label_bulk_edit_selected_time_entries: Bulk edit selected time entries
|
||||
text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)?
|
||||
label_role_anonymous: Anonymous
|
||||
label_role_non_member: Non member
|
||||
label_issue_note_added: Note added
|
||||
label_issue_status_updated: Status updated
|
||||
label_issue_priority_updated: Priority updated
|
||||
label_issues_visibility_own: Issues created by or assigned to the user
|
||||
field_issues_visibility: Issues visibility
|
||||
label_issues_visibility_all: All issues
|
||||
permission_set_own_issues_private: Set own issues public or private
|
||||
field_is_private: Private
|
||||
permission_set_issues_private: Set issues public or private
|
||||
label_issues_visibility_public: All non private issues
|
||||
text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s).
|
||||
field_commit_logs_encoding: Encoding das mensagens de commit
|
||||
field_scm_path_encoding: Path encoding
|
||||
text_scm_path_encoding_note: "Default: UTF-8"
|
||||
field_path_to_repository: Path to repository
|
||||
field_root_directory: Root directory
|
||||
field_cvs_module: Module
|
||||
field_cvsroot: CVSROOT
|
||||
text_mercurial_repository_note: "Repositório local (ex: /hgrepo, c:\\hgrepo)"
|
||||
text_scm_command: Comando
|
||||
text_scm_command_version: Versão
|
||||
label_git_report_last_commit: Analisar último commit por ficheiros e pastas
|
||||
text_scm_config: Pode configurar os comando SCM em config/configuration.yml. Por favor reinicie a aplicação depois de alterar o ficheiro.
|
||||
text_scm_command_not_available: O comando SCM não está disponível. Por favor verifique as configurações no painel de administração.
|
||||
notice_issue_successful_create: Tarefa %{id} criada.
|
||||
label_between: entre
|
||||
setting_issue_group_assignment: Permitir atribuir tarefas a grupos
|
||||
label_diff: diferença
|
||||
text_git_repository_note: O repositório é local (e.g. /gitrepo, c:\gitrepo)
|
||||
description_query_sort_criteria_direction: Direcção da ordenação
|
||||
description_project_scope: Âmbito da pesquisa
|
||||
description_filter: Filtro
|
||||
description_user_mail_notification: Configurações das notificações por email
|
||||
description_date_from: Introduza data de início
|
||||
description_message_content: Conteúdo da mensagem
|
||||
description_available_columns: Colunas disponíveis
|
||||
description_date_range_interval: Escolha o intervalo seleccionando a data de início e de fim
|
||||
description_issue_category_reassign: Escolha a categoria da tarefa
|
||||
description_search: Campo de pesquisa
|
||||
description_notes: Notas
|
||||
description_date_range_list: Escolha o intervalo da lista
|
||||
description_choose_project: Projecto
|
||||
description_date_to: Introduza data de fim
|
||||
description_query_sort_criteria_attribute: Ordenar atributos
|
||||
description_wiki_subpages_reassign: Escolha nova página pai
|
||||
description_selected_columns: Colunas seleccionadas
|
||||
label_parent_revision: Pai
|
||||
label_child_revision: Filha
|
||||
error_scm_annotate_big_text_file: Esta entrada não pode ser anotada, excede o tamanha máximo.
|
||||
setting_default_issue_start_date_to_creation_date: Utilizar a data actual como data de início para novas tarefas
|
||||
button_edit_section: Editar esta secção
|
||||
setting_repositories_encodings: Codificação dos anexos e repositórios
|
||||
description_all_columns: Todas as colunas
|
||||
button_export: Exportar
|
||||
label_export_options: "%{export_format} opções de exportação"
|
||||
error_attachment_too_big: Este ficheiro não pode ser carregado pois excede o tamanho máximo permitido por ficheiro (%{max_size})
|
||||
notice_failed_to_save_time_entries: "Falha ao guardar %{count} registo(s) de tempo dos %{total} seleccionados: %{ids}."
|
||||
text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo)
|
||||
text_scm_command: Command
|
||||
text_scm_command_version: Version
|
||||
label_git_report_last_commit: Report last commit for files and directories
|
||||
text_scm_config: You can configure your scm commands in config/configuration.yml. Please restart the application after editing it.
|
||||
text_scm_command_not_available: Scm command is not available. Please check settings on the administration panel.
|
||||
notice_issue_successful_create: Issue %{id} created.
|
||||
label_between: between
|
||||
setting_issue_group_assignment: Allow issue assignment to groups
|
||||
label_diff: diff
|
||||
text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
|
||||
description_query_sort_criteria_direction: Sort direction
|
||||
description_project_scope: Search scope
|
||||
description_filter: Filter
|
||||
description_user_mail_notification: Mail notification settings
|
||||
description_date_from: Enter start date
|
||||
description_message_content: Message content
|
||||
description_available_columns: Available Columns
|
||||
description_date_range_interval: Choose range by selecting start and end date
|
||||
description_issue_category_reassign: Choose issue category
|
||||
description_search: Searchfield
|
||||
description_notes: Notes
|
||||
description_date_range_list: Choose range from list
|
||||
description_choose_project: Projects
|
||||
description_date_to: Enter end date
|
||||
description_query_sort_criteria_attribute: Sort attribute
|
||||
description_wiki_subpages_reassign: Choose new parent page
|
||||
description_selected_columns: Selected Columns
|
||||
label_parent_revision: Parent
|
||||
label_child_revision: Child
|
||||
error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size.
|
||||
setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
|
||||
button_edit_section: Edit this section
|
||||
setting_repositories_encodings: Attachments and repositories encodings
|
||||
description_all_columns: All Columns
|
||||
button_export: Export
|
||||
label_export_options: "%{export_format} export options"
|
||||
error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})
|
||||
notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}."
|
||||
label_x_issues:
|
||||
zero: 0 tarefa
|
||||
one: 1 tarefa
|
||||
other: "%{count} tarefas"
|
||||
label_repository_new: Novo repositório
|
||||
field_repository_is_default: Repositório principal
|
||||
label_copy_attachments: Copiar anexos
|
||||
label_repository_new: New repository
|
||||
field_repository_is_default: Main repository
|
||||
label_copy_attachments: Copy attachments
|
||||
label_item_position: "%{position}/%{count}"
|
||||
label_completed_versions: Versões completas
|
||||
text_project_identifier_info: Apenas letras minúsculas (a-z), números, traços e sublinhados são permitidos.<br />Depois de guardar não é possível alterar.
|
||||
field_multiple: Múltiplos valores
|
||||
setting_commit_cross_project_ref: Permitir que tarefas dos restantes projectos sejam referenciadas e resolvidas
|
||||
text_issue_conflict_resolution_add_notes: Adicionar as minhas notas e descartar as minhas restantes alterações
|
||||
text_issue_conflict_resolution_overwrite: Aplicar as minhas alterações (notas antigas serão mantidas mas algumas alterações podem se perder)
|
||||
notice_issue_update_conflict: Esta tarefa foi actualizada por outro utilizador enquanto estava a edita-la.
|
||||
text_issue_conflict_resolution_cancel: Descartar todas as minhas alterações e actualizar %{link}
|
||||
permission_manage_related_issues: Gerir tarefas relacionadas
|
||||
field_auth_source_ldap_filter: Filtro LDAP
|
||||
label_search_for_watchers: Pesquisar por observadores para adicionar
|
||||
notice_account_deleted: A sua conta foi apagada permanentemente.
|
||||
setting_unsubscribe: Permitir aos utilizadores apagarem a sua própria conta
|
||||
button_delete_my_account: Apagar a minha conta
|
||||
label_completed_versions: Completed versions
|
||||
text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.
|
||||
field_multiple: Multiple values
|
||||
setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
|
||||
text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes
|
||||
text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten)
|
||||
notice_issue_update_conflict: The issue has been updated by an other user while you were editing it.
|
||||
text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link}
|
||||
permission_manage_related_issues: Manage related issues
|
||||
field_auth_source_ldap_filter: LDAP filter
|
||||
label_search_for_watchers: Search for watchers to add
|
||||
notice_account_deleted: Your account has been permanently deleted.
|
||||
setting_unsubscribe: Allow users to delete their own account
|
||||
button_delete_my_account: Delete my account
|
||||
text_account_destroy_confirmation: |-
|
||||
Têm a certeza que pretende avançar?
|
||||
A sua conta vai ser permanentemente apagada, não será possível recupera-la.
|
||||
error_session_expired: A sua sessão expirou. Por-favor autentique-se novamente.
|
||||
text_session_expiration_settings: "Atenção: alterar estas configurações pode fazer expirar as sessões em curso, incluíndo a sua."
|
||||
setting_session_lifetime: Duração máxima da sessão
|
||||
setting_session_timeout: Tempo limite de inactividade da sessão
|
||||
label_session_expiration: Expiração da sessão
|
||||
permission_close_project: Fechar / re-abrir o projecto
|
||||
label_show_closed_projects: Ver os projectos fechados
|
||||
button_close: Fechar
|
||||
button_reopen: Re-abrir
|
||||
project_status_active: activo
|
||||
project_status_closed: fechado
|
||||
project_status_archived: arquivado
|
||||
text_project_closed: Este projecto está fechado e é apenas de leitura.
|
||||
notice_user_successful_create: Utilizador %{id} criado.
|
||||
field_core_fields: Campos padrão
|
||||
field_timeout: Tempo limite (em segundos)
|
||||
setting_thumbnails_enabled: Apresentar miniaturas dos anexos
|
||||
setting_thumbnails_size: Tamanho das miniaturas (em pixeis)
|
||||
label_status_transitions: Estado das transições
|
||||
label_fields_permissions: Permissões do campo
|
||||
label_readonly: Apenas de leitura
|
||||
label_required: Obrigatório
|
||||
text_repository_identifier_info: Apenas letras minúsculas (a-z), números, traços e sublinhados são permitidos.<br />Depois de guardar não é possível alterar.
|
||||
field_board_parent: Fórum pai
|
||||
label_attribute_of_project: "%{name} do Projecto"
|
||||
label_attribute_of_author: "%{name} do Autor"
|
||||
label_attribute_of_assigned_to: "%{name} do atribuído"
|
||||
label_attribute_of_fixed_version: "%{name} da Versão"
|
||||
label_copy_subtasks: Copiar sub-tarefas
|
||||
label_copied_to: copiado para
|
||||
label_copied_from: copiado de
|
||||
label_any_issues_in_project: tarefas do projecto
|
||||
label_any_issues_not_in_project: tarefas sem projecto
|
||||
field_private_notes: Notas privadas
|
||||
permission_view_private_notes: Ver notas privadas
|
||||
permission_set_notes_private: Configurar notas como privadas
|
||||
label_no_issues_in_project: sem tarefas no projecto
|
||||
Are you sure you want to proceed?
|
||||
Your account will be permanently deleted, with no way to reactivate it.
|
||||
error_session_expired: Your session has expired. Please login again.
|
||||
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||
setting_session_lifetime: Session maximum lifetime
|
||||
setting_session_timeout: Session inactivity timeout
|
||||
label_session_expiration: Session expiration
|
||||
permission_close_project: Close / reopen the project
|
||||
label_show_closed_projects: View closed projects
|
||||
button_close: Close
|
||||
button_reopen: Reopen
|
||||
project_status_active: active
|
||||
project_status_closed: closed
|
||||
project_status_archived: archived
|
||||
text_project_closed: This project is closed and read-only.
|
||||
notice_user_successful_create: User %{id} created.
|
||||
field_core_fields: Standard fields
|
||||
field_timeout: Timeout (in seconds)
|
||||
setting_thumbnails_enabled: Display attachment thumbnails
|
||||
setting_thumbnails_size: Thumbnails size (in pixels)
|
||||
label_status_transitions: Status transitions
|
||||
label_fields_permissions: Fields permissions
|
||||
label_readonly: Read-only
|
||||
label_required: Required
|
||||
text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.
|
||||
field_board_parent: Parent forum
|
||||
label_attribute_of_project: Project's %{name}
|
||||
label_attribute_of_author: Author's %{name}
|
||||
label_attribute_of_assigned_to: Assignee's %{name}
|
||||
label_attribute_of_fixed_version: Target version's %{name}
|
||||
label_copy_subtasks: Copy subtasks
|
||||
label_copied_to: copied to
|
||||
label_copied_from: copied from
|
||||
label_any_issues_in_project: any issues in project
|
||||
label_any_issues_not_in_project: any issues not in project
|
||||
field_private_notes: Private notes
|
||||
permission_view_private_notes: View private notes
|
||||
permission_set_notes_private: Set notes as private
|
||||
label_no_issues_in_project: no issues in project
|
||||
label_any: todos
|
||||
label_last_n_weeks: últimas %{count} semanas
|
||||
setting_cross_project_subtasks: Permitir sub-tarefas entre projectos
|
||||
label_last_n_weeks: last %{count} weeks
|
||||
setting_cross_project_subtasks: Allow cross-project subtasks
|
||||
label_cross_project_descendants: Com os sub-projectos
|
||||
label_cross_project_tree: Com árvore do projecto
|
||||
label_cross_project_hierarchy: Com hierarquia do projecto
|
||||
label_cross_project_system: Com todos os projectos
|
||||
button_hide: Esconder
|
||||
setting_non_working_week_days: Dias não úteis
|
||||
label_in_the_next_days: no futuro
|
||||
label_in_the_past_days: no passado
|
||||
button_hide: Hide
|
||||
setting_non_working_week_days: Non-working days
|
||||
label_in_the_next_days: in the next
|
||||
label_in_the_past_days: in the past
|
||||
|
||||
@@ -117,8 +117,8 @@ ru:
|
||||
many: "около %{count} часов"
|
||||
other: "около %{count} часа"
|
||||
x_hours:
|
||||
one: "1 час"
|
||||
other: "%{count} часов"
|
||||
one: "1 hour"
|
||||
other: "%{count} hours"
|
||||
x_days:
|
||||
one: "%{count} день"
|
||||
few: "%{count} дня"
|
||||
@@ -1147,7 +1147,7 @@ ru:
|
||||
button_delete_my_account: "Удалить мою учетную запись"
|
||||
text_account_destroy_confirmation: "Ваша учетная запись будет полностью удалена без возможности восстановления.\nВы уверены, что хотите продолжить?"
|
||||
error_session_expired: Срок вашей сессии истек. Пожалуйста войдите еще раз
|
||||
text_session_expiration_settings: "Внимание! Изменение этих настроек может привести к завершению текущих сессий, включая вашу."
|
||||
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||
setting_session_lifetime: Максимальная продолжительность сессии
|
||||
setting_session_timeout: Таймут сессии
|
||||
label_session_expiration: Срок истечения сессии
|
||||
|
||||
@@ -923,47 +923,47 @@ sr-YU:
|
||||
project_module_calendar: Kalendar
|
||||
button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}"
|
||||
field_text: Text field
|
||||
label_user_mail_option_only_owner: Samo za stvari koje posedujem
|
||||
setting_default_notification_option: Podrazumevana opcija za notifikaciju
|
||||
label_user_mail_option_only_my_events: Za dogadjaje koje pratim ili sam u njih uključen
|
||||
label_user_mail_option_only_assigned: Za dogadjaje koji su mi dodeljeni lično
|
||||
label_user_mail_option_none: Bez obaveštenja
|
||||
label_user_mail_option_only_owner: Only for things I am the owner of
|
||||
setting_default_notification_option: Default notification option
|
||||
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in
|
||||
label_user_mail_option_only_assigned: Only for things I am assigned to
|
||||
label_user_mail_option_none: No events
|
||||
field_member_of_group: Assignee's group
|
||||
field_assigned_to_role: Assignee's role
|
||||
notice_not_authorized_archived_project: Projekat kome pokušavate da pristupite je arhiviran
|
||||
label_principal_search: "Traži korisnike ili grupe:"
|
||||
label_user_search: "Traži korisnike:"
|
||||
field_visible: Vidljivo
|
||||
setting_emails_header: Email zaglavlje
|
||||
notice_not_authorized_archived_project: The project you're trying to access has been archived.
|
||||
label_principal_search: "Search for user or group:"
|
||||
label_user_search: "Search for user:"
|
||||
field_visible: Visible
|
||||
setting_emails_header: Emails header
|
||||
setting_commit_logtime_activity_id: Activity for logged time
|
||||
text_time_logged_by_changeset: Applied in changeset %{value}.
|
||||
setting_commit_logtime_enabled: Omogući praćenje vremena
|
||||
setting_commit_logtime_enabled: Enable time logging
|
||||
notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
|
||||
setting_gantt_items_limit: Maksimalan broj stavki na gant grafiku
|
||||
field_warn_on_leaving_unsaved: Upozori me ako napuštam stranu sa tekstom koji nije snimljen
|
||||
text_warn_on_leaving_unsaved: Strana sadrži tekst koji nije snimljen i biće izgubljen ako je napustite.
|
||||
setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
|
||||
field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
|
||||
text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
|
||||
label_my_queries: My custom queries
|
||||
text_journal_changed_no_detail: "%{label} ažuriran"
|
||||
label_news_comment_added: Komentar dodat u novosti
|
||||
button_expand_all: Proširi sve
|
||||
button_collapse_all: Zatvori sve
|
||||
text_journal_changed_no_detail: "%{label} updated"
|
||||
label_news_comment_added: Comment added to a news
|
||||
button_expand_all: Expand all
|
||||
button_collapse_all: Collapse all
|
||||
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee
|
||||
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author
|
||||
label_bulk_edit_selected_time_entries: Bulk edit selected time entries
|
||||
text_time_entries_destroy_confirmation: Da li ste sigurni da želite da obrišete selektovane stavke ?
|
||||
label_role_anonymous: Anonimus
|
||||
label_role_non_member: Nije član
|
||||
label_issue_note_added: Nota dodana
|
||||
label_issue_status_updated: Status ažuriran
|
||||
label_issue_priority_updated: Prioritet ažuriran
|
||||
label_issues_visibility_own: Problem kreiran od strane ili je dodeljen korisniku
|
||||
field_issues_visibility: Vidljivost problema
|
||||
label_issues_visibility_all: Svi problemi
|
||||
permission_set_own_issues_private: Podesi sopstveni problem kao privatan ili javan
|
||||
field_is_private: Privatno
|
||||
permission_set_issues_private: Podesi problem kao privatan ili javan
|
||||
label_issues_visibility_public: Svi javni problemi
|
||||
text_issues_destroy_descendants_confirmation: Ova operacija će takođe obrisati %{count} podzadataka.
|
||||
text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)?
|
||||
label_role_anonymous: Anonymous
|
||||
label_role_non_member: Non member
|
||||
label_issue_note_added: Note added
|
||||
label_issue_status_updated: Status updated
|
||||
label_issue_priority_updated: Priority updated
|
||||
label_issues_visibility_own: Issues created by or assigned to the user
|
||||
field_issues_visibility: Issues visibility
|
||||
label_issues_visibility_all: All issues
|
||||
permission_set_own_issues_private: Set own issues public or private
|
||||
field_is_private: Private
|
||||
permission_set_issues_private: Set issues public or private
|
||||
label_issues_visibility_public: All non private issues
|
||||
text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s).
|
||||
field_commit_logs_encoding: Kodiranje izvršnih poruka
|
||||
field_scm_path_encoding: Path encoding
|
||||
text_scm_path_encoding_note: "Default: UTF-8"
|
||||
|
||||
@@ -79,8 +79,8 @@ sv:
|
||||
one: "ungefär en timme"
|
||||
other: "ungefär %{count} timmar"
|
||||
x_hours:
|
||||
one: "1 timme"
|
||||
other: "%{count} timmar"
|
||||
one: "1 hour"
|
||||
other: "%{count} hours"
|
||||
x_days:
|
||||
one: "en dag"
|
||||
other: "%{count} dagar"
|
||||
@@ -219,7 +219,6 @@ sv:
|
||||
notice_issue_successful_create: Ärende %{id} skapades.
|
||||
notice_issue_update_conflict: Detta ärende har uppdaterats av en annan användare samtidigt som du redigerade det.
|
||||
notice_account_deleted: Ditt konto har avslutats permanent.
|
||||
notice_user_successful_create: "Användare %{id} skapad."
|
||||
|
||||
error_can_t_load_default_data: "Standardkonfiguration gick inte att läsa in: %{value}"
|
||||
error_scm_not_found: "Inlägg och/eller revision finns inte i detta versionsarkiv."
|
||||
@@ -240,7 +239,6 @@ sv:
|
||||
error_unable_delete_issue_status: 'Ärendestatus kunde inte tas bort'
|
||||
error_unable_to_connect: "Kan inte ansluta (%{value})"
|
||||
error_attachment_too_big: Denna fil kan inte laddas upp eftersom den överstiger maximalt tillåten filstorlek (%{max_size})
|
||||
error_session_expired: "Din session har gått ut. Vänligen logga in på nytt."
|
||||
warning_attachments_not_saved: "%{count} fil(er) kunde inte sparas."
|
||||
|
||||
mail_subject_lost_password: "Ditt %{value} lösenord"
|
||||
@@ -370,10 +368,6 @@ sv:
|
||||
field_repository_is_default: Huvudarkiv
|
||||
field_multiple: Flera värden
|
||||
field_auth_source_ldap_filter: LDAP-filter
|
||||
field_core_fields: Standardfält
|
||||
field_timeout: "Timeout (i sekunder)"
|
||||
field_board_parent: Förälderforum
|
||||
field_private_notes: Privata anteckningar
|
||||
|
||||
setting_app_title: Applikationsrubrik
|
||||
setting_app_subtitle: Applikationsunderrubrik
|
||||
@@ -398,7 +392,6 @@ sv:
|
||||
setting_autologin: Automatisk inloggning
|
||||
setting_date_format: Datumformat
|
||||
setting_time_format: Tidsformat
|
||||
setting_cross_project_subtasks: Tillåt underaktiviteter mellan projekt
|
||||
setting_cross_project_issue_relations: Tillåt ärenderelationer mellan projekt
|
||||
setting_issue_list_default_columns: Standardkolumner i ärendelistan
|
||||
setting_repositories_encodings: Encoding för bilagor och versionsarkiv
|
||||
@@ -437,16 +430,10 @@ sv:
|
||||
setting_default_issue_start_date_to_creation_date: Använd dagens datum som startdatum för nya ärenden
|
||||
setting_commit_cross_project_ref: Tillåt ärende i alla de andra projekten att bli refererade och fixade
|
||||
setting_unsubscribe: Tillåt användare att avsluta prenumereration
|
||||
setting_session_lifetime: Maximal sessionslivslängd
|
||||
setting_session_timeout: Tidsgräns för sessionsinaktivitet
|
||||
setting_thumbnails_enabled: Visa miniatyrbilder av bilagor
|
||||
setting_thumbnails_size: Storlek på miniatyrbilder (i pixlar)
|
||||
setting_non_working_week_days: Lediga dagar
|
||||
|
||||
permission_add_project: Skapa projekt
|
||||
permission_add_subprojects: Skapa underprojekt
|
||||
permission_edit_project: Ändra projekt
|
||||
permission_close_project: Stänga / återöppna projektet
|
||||
permission_select_project_modules: Välja projektmoduler
|
||||
permission_manage_members: Hantera medlemmar
|
||||
permission_manage_project_activities: Hantera projektaktiviteter
|
||||
@@ -461,8 +448,6 @@ sv:
|
||||
permission_add_issue_notes: Lägga till ärendenotering
|
||||
permission_edit_issue_notes: Ändra ärendenoteringar
|
||||
permission_edit_own_issue_notes: Ändra egna ärendenoteringar
|
||||
permission_view_private_notes: Visa privata anteckningar
|
||||
permission_set_notes_private: Ställa in anteckningar som privata
|
||||
permission_move_issues: Flytta ärenden
|
||||
permission_delete_issues: Ta bort ärenden
|
||||
permission_manage_public_queries: Hantera publika frågor
|
||||
@@ -697,8 +682,6 @@ sv:
|
||||
label_not_equals: är inte
|
||||
label_in_less_than: om mindre än
|
||||
label_in_more_than: om mer än
|
||||
label_in_the_next_days: under kommande
|
||||
label_in_the_past_days: under föregående
|
||||
label_greater_or_equal: '>='
|
||||
label_less_or_equal: '<='
|
||||
label_between: mellan
|
||||
@@ -708,7 +691,6 @@ sv:
|
||||
label_yesterday: igår
|
||||
label_this_week: denna vecka
|
||||
label_last_week: senaste veckan
|
||||
label_last_n_weeks: "senaste %{count} veckorna"
|
||||
label_last_n_days: "senaste %{count} dagarna"
|
||||
label_this_month: denna månad
|
||||
label_last_month: senaste månaden
|
||||
@@ -719,9 +701,6 @@ sv:
|
||||
label_ago: dagar sedan
|
||||
label_contains: innehåller
|
||||
label_not_contains: innehåller inte
|
||||
label_any_issues_in_project: några ärenden i projektet
|
||||
label_any_issues_not_in_project: några ärenden utanför projektet
|
||||
label_no_issues_in_project: inga ärenden i projektet
|
||||
label_day_plural: dagar
|
||||
label_repository: Versionsarkiv
|
||||
label_repository_new: Nytt versionsarkiv
|
||||
@@ -797,8 +776,6 @@ sv:
|
||||
label_blocked_by: blockerad av
|
||||
label_precedes: kommer före
|
||||
label_follows: följer
|
||||
label_copied_to: Kopierad till
|
||||
label_copied_from: Kopierad från
|
||||
label_end_to_start: slut till start
|
||||
label_end_to_end: slut till slut
|
||||
label_start_to_start: start till start
|
||||
@@ -912,20 +889,9 @@ sv:
|
||||
label_child_revision: Barn
|
||||
label_export_options: "%{export_format} exportalternativ"
|
||||
label_copy_attachments: Kopiera bilagor
|
||||
label_copy_subtasks: Kopiera underaktiviteter
|
||||
label_item_position: "%{position}/%{count}"
|
||||
label_completed_versions: Klara versioner
|
||||
label_search_for_watchers: Sök efter bevakare att lägga till
|
||||
label_session_expiration: Sessionsutgång
|
||||
label_show_closed_projects: Visa stängda projekt
|
||||
label_status_transitions: Statusövergångar
|
||||
label_fields_permissions: Fältbehörigheter
|
||||
label_readonly: Skrivskyddad
|
||||
label_required: Nödvändig
|
||||
label_attribute_of_project: Projektets %{name}
|
||||
label_attribute_of_author: Författarens %{name}
|
||||
label_attribute_of_assigned_to: Tilldelads %{name}
|
||||
label_attribute_of_fixed_version: Målversionens %{name}
|
||||
|
||||
button_login: Logga in
|
||||
button_submit: Skicka
|
||||
@@ -973,21 +939,14 @@ sv:
|
||||
button_quote: Citera
|
||||
button_duplicate: Duplicera
|
||||
button_show: Visa
|
||||
button_hide: Göm
|
||||
button_edit_section: Redigera denna sektion
|
||||
button_export: Exportera
|
||||
button_delete_my_account: Ta bort mitt konto
|
||||
button_close: Stäng
|
||||
button_reopen: Återöppna
|
||||
|
||||
status_active: aktiv
|
||||
status_registered: registrerad
|
||||
status_locked: låst
|
||||
|
||||
project_status_active: aktiv
|
||||
project_status_closed: stängd
|
||||
project_status_archived: arkiverad
|
||||
|
||||
version_status_open: öppen
|
||||
version_status_locked: låst
|
||||
version_status_closed: stängd
|
||||
@@ -1067,8 +1026,6 @@ sv:
|
||||
text_issue_conflict_resolution_add_notes: Lägg till mina anteckningar och kasta mina andra ändringar
|
||||
text_issue_conflict_resolution_cancel: Kasta alla mina ändringar och visa igen %{link}
|
||||
text_account_destroy_confirmation: "Är du säker på att du vill fortsätta?\nDitt konto kommer tas bort permanent, utan möjlighet att återaktivera det."
|
||||
text_session_expiration_settings: "Varning: ändring av dessa inställningar kan få alla nuvarande sessioner, inklusive din egen, att gå ut."
|
||||
text_project_closed: Detta projekt är stängt och skrivskyddat.
|
||||
|
||||
default_role_manager: Projektledare
|
||||
default_role_developer: Utvecklare
|
||||
@@ -1114,9 +1071,51 @@ sv:
|
||||
description_date_range_interval: Ange intervall genom att välja start- och slutdatum
|
||||
description_date_from: Ange startdatum
|
||||
description_date_to: Ange slutdatum
|
||||
error_session_expired: Your session has expired. Please login again.
|
||||
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||
setting_session_lifetime: Session maximum lifetime
|
||||
setting_session_timeout: Session inactivity timeout
|
||||
label_session_expiration: Session expiration
|
||||
permission_close_project: Close / reopen the project
|
||||
label_show_closed_projects: View closed projects
|
||||
button_close: Close
|
||||
button_reopen: Reopen
|
||||
project_status_active: active
|
||||
project_status_closed: closed
|
||||
project_status_archived: archived
|
||||
text_project_closed: This project is closed and read-only.
|
||||
notice_user_successful_create: User %{id} created.
|
||||
field_core_fields: Standard fields
|
||||
field_timeout: Timeout (in seconds)
|
||||
setting_thumbnails_enabled: Display attachment thumbnails
|
||||
setting_thumbnails_size: Thumbnails size (in pixels)
|
||||
label_status_transitions: Status transitions
|
||||
label_fields_permissions: Fields permissions
|
||||
label_readonly: Read-only
|
||||
label_required: Required
|
||||
text_repository_identifier_info: Ändast gemener (a-z), siffror, streck och understreck är tillåtna.<br />När identifieraren sparats kan den inte ändras.
|
||||
field_board_parent: Parent forum
|
||||
label_attribute_of_project: Project's %{name}
|
||||
label_attribute_of_author: Author's %{name}
|
||||
label_attribute_of_assigned_to: Assignee's %{name}
|
||||
label_attribute_of_fixed_version: Target version's %{name}
|
||||
label_copy_subtasks: Copy subtasks
|
||||
label_copied_to: copied to
|
||||
label_copied_from: copied from
|
||||
label_any_issues_in_project: any issues in project
|
||||
label_any_issues_not_in_project: any issues not in project
|
||||
field_private_notes: Private notes
|
||||
permission_view_private_notes: View private notes
|
||||
permission_set_notes_private: Set notes as private
|
||||
label_no_issues_in_project: no issues in project
|
||||
label_any: alla
|
||||
label_last_n_weeks: last %{count} weeks
|
||||
setting_cross_project_subtasks: Allow cross-project subtasks
|
||||
label_cross_project_descendants: Med underprojekt
|
||||
label_cross_project_tree: Med projektträd
|
||||
label_cross_project_hierarchy: Med projekthierarki
|
||||
label_cross_project_system: Med alla projekt
|
||||
button_hide: Hide
|
||||
setting_non_working_week_days: Non-working days
|
||||
label_in_the_next_days: in the next
|
||||
label_in_the_past_days: in the past
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
# by
|
||||
# Do Hai Bac (dohaibac@gmail.com)
|
||||
# Dao Thanh Ngoc (ngocdaothanh@gmail.com, http://github.com/ngocdaothanh/rails-i18n/tree/master)
|
||||
# Nguyen Minh Thien (thiencdcn@gmail.com, http://www.eDesignLab.org)
|
||||
|
||||
vi:
|
||||
number:
|
||||
@@ -81,8 +80,8 @@ vi:
|
||||
one: "khoảng 1 giờ"
|
||||
other: "khoảng %{count} giờ"
|
||||
x_hours:
|
||||
one: "1 giờ"
|
||||
other: "%{count} giờ"
|
||||
one: "1 hour"
|
||||
other: "%{count} hours"
|
||||
x_days:
|
||||
one: "1 ngày"
|
||||
other: "%{count} ngày"
|
||||
@@ -99,8 +98,8 @@ vi:
|
||||
one: "hơn 1 năm"
|
||||
other: "hơn %{count} năm"
|
||||
almost_x_years:
|
||||
one: "gần 1 năm"
|
||||
other: "gần %{count} năm"
|
||||
one: "almost 1 year"
|
||||
other: "almost %{count} years"
|
||||
prompts:
|
||||
year: "Năm"
|
||||
month: "Tháng"
|
||||
@@ -143,7 +142,7 @@ vi:
|
||||
greater_than_start_date: "phải đi sau ngày bắt đầu"
|
||||
not_same_project: "không thuộc cùng dự án"
|
||||
circular_dependency: "quan hệ có thể gây ra lặp vô tận"
|
||||
cant_link_an_issue_with_a_descendant: "Một vấn đề không thể liên kết tới một trong số những tác vụ con của nó"
|
||||
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks"
|
||||
|
||||
direction: ltr
|
||||
date:
|
||||
@@ -215,16 +214,16 @@ vi:
|
||||
notice_email_sent: "Email đã được gửi tới %{value}"
|
||||
notice_email_error: "Lỗi xảy ra khi gửi email (%{value})"
|
||||
notice_feeds_access_key_reseted: Mã số chứng thực RSS đã được tạo lại.
|
||||
notice_failed_to_save_issues: "Thất bại khi lưu %{count} vấn đề trong %{total} lựa chọn: %{ids}."
|
||||
notice_no_issue_selected: "Không có vấn đề được chọn! Vui lòng kiểm tra các vấn đề bạn cần chỉnh sửa."
|
||||
notice_failed_to_save_issues: "Failed to save %{count} issue(s) on %{total} selected: %{ids}."
|
||||
notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit."
|
||||
notice_account_pending: "Thông tin tài khoản đã được tạo ra và đang chờ chứng thực từ ban quản trị."
|
||||
notice_default_data_loaded: Đã nạp cấu hình mặc định.
|
||||
notice_unable_delete_version: Không thể xóa phiên bản.
|
||||
|
||||
error_can_t_load_default_data: "Không thể nạp cấu hình mặc định: %{value}"
|
||||
error_scm_not_found: "Không tìm thấy dữ liệu trong kho chứa."
|
||||
error_scm_not_found: "The entry or revision was not found in the repository."
|
||||
error_scm_command_failed: "Lỗi xảy ra khi truy cập vào kho lưu trữ: %{value}"
|
||||
error_scm_annotate: "Đầu vào không tồn tại hoặc không thể chú thích."
|
||||
error_scm_annotate: "The entry does not exist or can not be annotated."
|
||||
error_issue_not_found_in_project: 'Vấn đề không tồn tại hoặc không thuộc dự án'
|
||||
|
||||
mail_subject_lost_password: "%{value}: mật mã của bạn"
|
||||
@@ -293,17 +292,17 @@ vi:
|
||||
field_version: Phiên bản
|
||||
field_type: Kiểu
|
||||
field_host: Host
|
||||
field_port: Cổng
|
||||
field_port: Port
|
||||
field_account: Tài khoản
|
||||
field_base_dn: Base DN
|
||||
field_attr_login: Thuộc tính đăng nhập
|
||||
field_attr_firstname: Thuộc tính tên đệm và Tên
|
||||
field_attr_lastname: Thuộc tính Họ
|
||||
field_attr_mail: Thuộc tính Email
|
||||
field_onthefly: Tạo người dùng tức thì
|
||||
field_attr_login: Login attribute
|
||||
field_attr_firstname: Firstname attribute
|
||||
field_attr_lastname: Lastname attribute
|
||||
field_attr_mail: Email attribute
|
||||
field_onthefly: On-the-fly user creation
|
||||
field_start_date: Bắt đầu
|
||||
field_done_ratio: Tiến độ
|
||||
field_auth_source: Chế độ xác thực
|
||||
field_auth_source: Authentication mode
|
||||
field_hide_mail: Không làm lộ email của bạn
|
||||
field_comments: Bình luận
|
||||
field_url: URL
|
||||
@@ -333,31 +332,31 @@ vi:
|
||||
setting_login_required: Cần đăng nhập
|
||||
setting_self_registration: Tự chứng thực
|
||||
setting_attachment_max_size: Cỡ tối đa của tập tin đính kèm
|
||||
setting_issues_export_limit: Giới hạn Export vấn đề
|
||||
setting_mail_from: Địa chỉ email gửi thông báo
|
||||
setting_issues_export_limit: Issues export limit
|
||||
setting_mail_from: Emission email address
|
||||
setting_bcc_recipients: Tạo bản CC bí mật (bcc)
|
||||
setting_host_name: Tên miền và đường dẫn
|
||||
setting_text_formatting: Định dạng bài viết
|
||||
setting_wiki_compression: Nén lịch sử Wiki
|
||||
setting_wiki_compression: Wiki history compression
|
||||
setting_feeds_limit: Giới hạn nội dung của feed
|
||||
setting_default_projects_public: Dự án mặc định là công cộng
|
||||
setting_autofetch_changesets: Tự động tìm nạp commits
|
||||
setting_sys_api_enabled: Cho phép WS quản lý kho chứa
|
||||
setting_autofetch_changesets: Autofetch commits
|
||||
setting_sys_api_enabled: Enable WS for repository management
|
||||
setting_commit_ref_keywords: Từ khóa tham khảo
|
||||
setting_commit_fix_keywords: Từ khóa chỉ vấn đề đã giải quyết
|
||||
setting_autologin: Tự động đăng nhập
|
||||
setting_date_format: Định dạng ngày
|
||||
setting_time_format: Định dạng giờ
|
||||
setting_cross_project_issue_relations: Cho phép quan hệ chéo giữa các dự án
|
||||
setting_issue_list_default_columns: Các cột mặc định hiển thị trong danh sách vấn đề
|
||||
setting_issue_list_default_columns: Default columns displayed on the issue list
|
||||
setting_emails_footer: Chữ ký cuối thư
|
||||
setting_protocol: Giao thức
|
||||
setting_per_page_options: Tùy chọn đối tượng mỗi trang
|
||||
setting_per_page_options: Objects per page options
|
||||
setting_user_format: Định dạng hiển thị người dùng
|
||||
setting_activity_days_default: Ngày hiển thị hoạt động của dự án
|
||||
setting_display_subprojects_issues: Hiển thị mặc định vấn đề của dự án con ở dự án chính
|
||||
setting_enabled_scm: Cho phép SCM
|
||||
setting_mail_handler_api_enabled: Cho phép WS cho các email tới
|
||||
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: Mã số API
|
||||
setting_sequential_project_identifiers: Tự sinh chuỗi ID dự án
|
||||
|
||||
@@ -377,9 +376,9 @@ vi:
|
||||
label_project_new: Dự án mới
|
||||
label_project_plural: Dự án
|
||||
label_x_projects:
|
||||
zero: không có dự án
|
||||
one: một dự án
|
||||
other: "%{count} dự án"
|
||||
zero: no projects
|
||||
one: 1 project
|
||||
other: "%{count} projects"
|
||||
label_project_all: Mọi dự án
|
||||
label_project_latest: Dự án mới nhất
|
||||
label_issue: Vấn đề
|
||||
@@ -403,18 +402,18 @@ vi:
|
||||
label_tracker: Dòng vấn đề
|
||||
label_tracker_plural: Dòng vấn đề
|
||||
label_tracker_new: Tạo dòng vấn đề mới
|
||||
label_workflow: Quy trình làm việc
|
||||
label_issue_status: Trạng thái vấn đề
|
||||
label_issue_status_plural: Trạng thái vấn đề
|
||||
label_issue_status_new: Thêm trạng thái
|
||||
label_workflow: Workflow
|
||||
label_issue_status: Issue status
|
||||
label_issue_status_plural: Issue statuses
|
||||
label_issue_status_new: New status
|
||||
label_issue_category: Chủ đề
|
||||
label_issue_category_plural: Chủ đề
|
||||
label_issue_category_new: Chủ đề mới
|
||||
label_custom_field: Trường tùy biến
|
||||
label_custom_field_plural: Trường tùy biến
|
||||
label_custom_field_new: Thêm Trường tùy biến
|
||||
label_enumerations: Liệt kê
|
||||
label_enumeration_new: Thêm giá trị
|
||||
label_custom_field: Custom field
|
||||
label_custom_field_plural: Custom fields
|
||||
label_custom_field_new: New custom field
|
||||
label_enumerations: Enumerations
|
||||
label_enumeration_new: New value
|
||||
label_information: Thông tin
|
||||
label_information_plural: Thông tin
|
||||
label_please_login: Vui lòng đăng nhập
|
||||
@@ -436,23 +435,23 @@ vi:
|
||||
label_overall_activity: Tất cả hoạt động
|
||||
label_new: Mới
|
||||
label_logged_as: Tài khoản »
|
||||
label_environment: Môi trường
|
||||
label_authentication: Xác thực
|
||||
label_auth_source: Chế độ xác thực
|
||||
label_auth_source_new: Chế độ xác thực mới
|
||||
label_auth_source_plural: Chế độ xác thực
|
||||
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: Dự án con
|
||||
label_and_its_subprojects: "%{value} và dự án con"
|
||||
label_min_max_length: Độ dài nhỏ nhất - lớn nhất
|
||||
label_list: Danh sách
|
||||
label_min_max_length: Min - Max length
|
||||
label_list: List
|
||||
label_date: Ngày
|
||||
label_integer: Số nguyên
|
||||
label_float: Số thực
|
||||
label_integer: Integer
|
||||
label_float: Float
|
||||
label_boolean: Boolean
|
||||
label_string: Văn bản
|
||||
label_text: Văn bản dài
|
||||
label_attribute: Thuộc tính
|
||||
label_attribute_plural: Các thuộc tính
|
||||
label_string: Text
|
||||
label_text: Long text
|
||||
label_attribute: Attribute
|
||||
label_attribute_plural: Attributes
|
||||
label_download: "%{count} lần tải"
|
||||
label_download_plural: "%{count} lần tải"
|
||||
label_no_data: Chưa có thông tin gì
|
||||
@@ -478,24 +477,24 @@ vi:
|
||||
label_version_plural: Phiên bản
|
||||
label_confirmation: Khẳng định
|
||||
label_export_to: 'Định dạng khác của trang này:'
|
||||
label_read: Đọc...
|
||||
label_read: Read...
|
||||
label_public_projects: Các dự án công cộng
|
||||
label_open_issues: mở
|
||||
label_open_issues_plural: mở
|
||||
label_closed_issues: đóng
|
||||
label_closed_issues_plural: đóng
|
||||
label_x_open_issues_abbr_on_total:
|
||||
zero: "0 mở / %{total}"
|
||||
one: "1 mở / %{total}"
|
||||
other: "%{count} mở / %{total}"
|
||||
zero: 0 open / %{total}
|
||||
one: 1 open / %{total}
|
||||
other: "%{count} open / %{total}"
|
||||
label_x_open_issues_abbr:
|
||||
zero: 0 mở
|
||||
one: 1 mở
|
||||
other: "%{count} mở"
|
||||
zero: 0 open
|
||||
one: 1 open
|
||||
other: "%{count} open"
|
||||
label_x_closed_issues_abbr:
|
||||
zero: 0 đóng
|
||||
one: 1 đóng
|
||||
other: "%{count} đóng"
|
||||
zero: 0 closed
|
||||
one: 1 closed
|
||||
other: "%{count} closed"
|
||||
label_total: Tổng cộng
|
||||
label_permissions: Quyền
|
||||
label_current_status: Trạng thái hiện tại
|
||||
@@ -505,7 +504,7 @@ vi:
|
||||
label_nobody: Chẳng ai
|
||||
label_next: Sau
|
||||
label_previous: Trước
|
||||
label_used_by: Được dùng bởi
|
||||
label_used_by: Used by
|
||||
label_details: Chi tiết
|
||||
label_add_note: Thêm ghi chú
|
||||
label_per_page: Mỗi trang
|
||||
@@ -519,9 +518,9 @@ vi:
|
||||
label_comment: Bình luận
|
||||
label_comment_plural: Bình luận
|
||||
label_x_comments:
|
||||
zero: không có bình luận
|
||||
one: 1 bình luận
|
||||
other: "%{count} bình luận"
|
||||
zero: no comments
|
||||
one: 1 comment
|
||||
other: "%{count} comments"
|
||||
label_comment_add: Thêm bình luận
|
||||
label_comment_added: Đã thêm bình luận
|
||||
label_comment_delete: Xóa bình luận
|
||||
@@ -558,7 +557,7 @@ vi:
|
||||
label_modification_plural: "%{count} thay đổi"
|
||||
label_revision: Bản điều chỉnh
|
||||
label_revision_plural: Bản điều chỉnh
|
||||
label_associated_revisions: Các bản điều chỉnh được ghép
|
||||
label_associated_revisions: Associated revisions
|
||||
label_added: thêm
|
||||
label_modified: đổi
|
||||
label_copied: chép
|
||||
@@ -580,7 +579,7 @@ vi:
|
||||
label_result_plural: Kết quả
|
||||
label_all_words: Mọi từ
|
||||
label_wiki: Wiki
|
||||
label_wiki_edit: Sửa Wiki
|
||||
label_wiki_edit: Wiki edit
|
||||
label_wiki_edit_plural: Thay đổi wiki
|
||||
label_wiki_page: Trang wiki
|
||||
label_wiki_page_plural: Trang wiki
|
||||
@@ -588,7 +587,7 @@ vi:
|
||||
label_index_by_date: Danh sách theo ngày
|
||||
label_current_version: Bản hiện tại
|
||||
label_preview: Xem trước
|
||||
label_feed_plural: Nguồn cấp tin
|
||||
label_feed_plural: Feeds
|
||||
label_changes_details: Chi tiết của mọi thay đổi
|
||||
label_issue_tracking: Vấn đề
|
||||
label_spent_time: Thời gian
|
||||
@@ -597,13 +596,13 @@ vi:
|
||||
label_time_tracking: Theo dõi thời gian
|
||||
label_change_plural: Thay đổi
|
||||
label_statistics: Thống kê
|
||||
label_commits_per_month: Commits mỗi tháng
|
||||
label_commits_per_author: Commits mỗi tác giả
|
||||
label_commits_per_month: Commits per month
|
||||
label_commits_per_author: Commits per author
|
||||
label_view_diff: So sánh
|
||||
label_diff_inline: inline
|
||||
label_diff_side_by_side: bên cạnh nhau
|
||||
label_diff_side_by_side: side by side
|
||||
label_options: Tùy chọn
|
||||
label_copy_workflow_from: Sao chép quy trình từ
|
||||
label_copy_workflow_from: Copy workflow from
|
||||
label_permissions_report: Thống kê các quyền
|
||||
label_watched_issues: Chủ đề đang theo dõi
|
||||
label_related_issues: Liên quan
|
||||
@@ -643,7 +642,7 @@ vi:
|
||||
label_date_to: Đến
|
||||
label_language_based: Theo ngôn ngữ người dùng
|
||||
label_sort_by: "Sắp xếp theo %{value}"
|
||||
label_send_test_email: Gửi một email kiểm tra
|
||||
label_send_test_email: Send a test email
|
||||
label_feeds_access_key_created_on: "Mã chứng thực RSS được tạo ra cách đây %{value}"
|
||||
label_module_plural: Mô-đun
|
||||
label_added_time_by: "thêm bởi %{author} cách đây %{age}"
|
||||
@@ -660,11 +659,11 @@ vi:
|
||||
label_user_mail_option_all: "Mọi sự kiện trên mọi dự án của bạn"
|
||||
label_user_mail_option_selected: "Mọi sự kiện trên các dự án được chọn..."
|
||||
label_user_mail_no_self_notified: "Đừng gửi email về các thay đổi do chính bạn thực hiện"
|
||||
label_registration_activation_by_email: kích hoạt tài khoản qua email
|
||||
label_registration_manual_activation: kích hoạt tài khoản thủ công
|
||||
label_registration_automatic_activation: kích hoạt tài khoản tự động
|
||||
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: "mỗi trang: %{value}"
|
||||
label_age: Thời gian
|
||||
label_age: Age
|
||||
label_change_properties: Thay đổi thuộc tính
|
||||
label_general: Tổng quan
|
||||
label_more: Chi tiết
|
||||
@@ -728,43 +727,43 @@ vi:
|
||||
text_select_mail_notifications: Chọn hành động đối với mỗi email thông báo sẽ gửi.
|
||||
text_regexp_info: eg. ^[A-Z0-9]+$
|
||||
text_min_max_length_info: 0 để chỉ không hạn chế
|
||||
text_project_destroy_confirmation: Bạn có chắc chắn muốn xóa dự án này và các dữ liệu liên quan ?
|
||||
text_subprojects_destroy_warning: "Dự án con của : %{value} cũng sẽ bị xóa."
|
||||
text_workflow_edit: Chọn một vai trò và một vấn đề để sửa quy trình
|
||||
text_project_destroy_confirmation: Are you sure you want to delete this project and related data ?
|
||||
text_subprojects_destroy_warning: "Its subproject(s): %{value} will be also deleted."
|
||||
text_workflow_edit: Select a role and a tracker to edit the workflow
|
||||
text_are_you_sure: Bạn chắc chứ?
|
||||
text_tip_issue_begin_day: ngày bắt đầu
|
||||
text_tip_issue_end_day: ngày kết thúc
|
||||
text_tip_issue_begin_end_day: bắt đầu và kết thúc cùng ngày
|
||||
text_caracters_maximum: "Tối đa %{count} ký tự."
|
||||
text_caracters_minimum: "Phải gồm ít nhất %{count} ký tự."
|
||||
text_length_between: "Chiều dài giữa %{min} và %{max} ký tự."
|
||||
text_tracker_no_workflow: Không có quy trình được định nghĩa cho theo dõi này
|
||||
text_length_between: "Length between %{min} and %{max} characters."
|
||||
text_tracker_no_workflow: No workflow defined for this tracker
|
||||
text_unallowed_characters: Ký tự không hợp lệ
|
||||
text_comma_separated: Nhiều giá trị được phép (cách nhau bởi dấu phẩy).
|
||||
text_issues_ref_in_commit_messages: Vấn đề tham khảo và cố định trong ghi chú commit
|
||||
text_issue_added: "Vấn đề %{id} đã được báo cáo bởi %{author}."
|
||||
text_issue_updated: "Vấn đề %{id} đã được cập nhật bởi %{author}."
|
||||
text_wiki_destroy_confirmation: Bạn có chắc chắn muốn xóa trang wiki này và tất cả nội dung của nó ?
|
||||
text_issue_category_destroy_question: "Một số vấn đề (%{count}) được gán cho danh mục này. Bạn muốn làm gì ?"
|
||||
text_issue_category_destroy_assignments: Gỡ bỏ danh mục được phân công
|
||||
text_issue_category_reassign_to: Gán lại vấn đề cho danh mục này
|
||||
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 %{id} has been reported by %{author}."
|
||||
text_issue_updated: "Issue %{id} has been updated by %{author}."
|
||||
text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content ?
|
||||
text_issue_category_destroy_question: "Some issues (%{count}) are assigned to this category. What do you want to do ?"
|
||||
text_issue_category_destroy_assignments: Remove category assignments
|
||||
text_issue_category_reassign_to: Reassign issues to this category
|
||||
text_user_mail_option: "Với các dự án không được chọn, bạn chỉ có thể nhận được thông báo về các vấn đề bạn đăng ký theo dõi hoặc có liên quan đến bạn (chẳng hạn, vấn đề được gán cho bạn)."
|
||||
text_no_configuration_data: "Quyền, theo dõi, tình trạng vấn đề và quy trình chưa được cấu hình.\nBắt buộc phải nạp cấu hình mặc định. Bạn sẽ thay đổi nó được sau khi đã nạp."
|
||||
text_load_default_configuration: Nạp lại cấu hình mặc định
|
||||
text_status_changed_by_changeset: "Áp dụng trong changeset : %{value}."
|
||||
text_issues_destroy_confirmation: 'Bạn có chắc chắn muốn xóa các vấn đề đã chọn ?'
|
||||
text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
|
||||
text_load_default_configuration: Load the default configuration
|
||||
text_status_changed_by_changeset: "Applied in changeset %{value}."
|
||||
text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s) ?'
|
||||
text_select_project_modules: 'Chọn các mô-đun cho dự án:'
|
||||
text_default_administrator_account_changed: Thay đổi tài khoản quản trị mặc định
|
||||
text_file_repository_writable: Cho phép ghi thư mục đính kèm
|
||||
text_rmagick_available: Trạng thái RMagick
|
||||
text_destroy_time_entries_question: "Thời gian %{hours} giờ đã báo cáo trong vấn đề bạn định xóa. Bạn muốn làm gì tiếp ?"
|
||||
text_destroy_time_entries: Xóa thời gian báo cáo
|
||||
text_assign_time_entries_to_project: Gán thời gian báo cáo cho dự án
|
||||
text_reassign_time_entries: 'Gán lại thời gian báo cáo cho Vấn đề này:'
|
||||
text_user_wrote: "%{value} đã viết:"
|
||||
text_enumeration_destroy_question: "%{count} đối tượng được gán giá trị này."
|
||||
text_enumeration_category_reassign_to: 'Gán lại giá trị này:'
|
||||
text_email_delivery_not_configured: "Cấu hình gửi Email chưa được đặt, và chức năng thông báo bị loại bỏ.\nCấu hình máy chủ SMTP của bạn ở file config/configuration.yml và khởi động lại để kích hoạt chúng."
|
||||
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: "%{hours} hours were reported on the issues you are about to delete. What do you want to do ?"
|
||||
text_destroy_time_entries: Delete reported hours
|
||||
text_assign_time_entries_to_project: Assign reported hours to the project
|
||||
text_reassign_time_entries: 'Reassign reported hours to this issue:'
|
||||
text_user_wrote: "%{value} wrote:"
|
||||
text_enumeration_destroy_question: "%{count} objects are assigned to this value."
|
||||
text_enumeration_category_reassign_to: 'Reassign them to this value:'
|
||||
text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/configuration.yml and restart the application to enable them."
|
||||
|
||||
default_role_manager: Điều hành
|
||||
default_role_developer: Phát triển
|
||||
@@ -773,7 +772,7 @@ vi:
|
||||
default_tracker_feature: Tính năng
|
||||
default_tracker_support: Hỗ trợ
|
||||
default_issue_status_new: Mới
|
||||
default_issue_status_in_progress: Đang tiến hành
|
||||
default_issue_status_in_progress: In Progress
|
||||
default_issue_status_resolved: Quyết tâm
|
||||
default_issue_status_feedback: Phản hồi
|
||||
default_issue_status_closed: Đóng
|
||||
@@ -844,295 +843,292 @@ vi:
|
||||
permission_delete_own_messages: Xóa bài viết cá nhân
|
||||
label_example: Ví dụ
|
||||
text_repository_usernames_mapping: "Chọn hoặc cập nhật ánh xạ người dùng hệ thống với người dùng trong kho lưu trữ.\nNhững trường hợp trùng hợp về tên và email sẽ được tự động ánh xạ."
|
||||
permission_delete_own_messages: Xóa thông điệp
|
||||
label_user_activity: "%{value} hoạt động"
|
||||
label_updated_time_by: "Cập nhật bởi %{author} cách đây %{age}"
|
||||
text_diff_truncated: '... Thay đổi này đã được cắt bớt do nó vượt qua giới hạn kích thước có thể hiển thị.'
|
||||
setting_diff_max_lines_displayed: Số dòng thay đổi tối đa được hiển thị
|
||||
text_plugin_assets_writable: Cho phép ghi thư mục Plugin
|
||||
warning_attachments_not_saved: "%{count} file không được lưu."
|
||||
button_create_and_continue: Tạo và tiếp tục
|
||||
text_custom_field_possible_values_info: 'Một dòng cho mỗi giá trị'
|
||||
label_display: Hiển thị
|
||||
field_editable: Có thể sửa được
|
||||
setting_repository_log_display_limit: Số lượng tối đa các bản điều chỉnh hiển thị trong file log
|
||||
setting_file_max_size_displayed: Kích thước tối đa của tệp tin văn bản
|
||||
field_watcher: Người quan sát
|
||||
setting_openid: Cho phép đăng nhập và đăng ký dùng OpenID
|
||||
permission_delete_own_messages: Delete own messages
|
||||
label_user_activity: "%{value}'s activity"
|
||||
label_updated_time_by: "Updated by %{author} %{age} ago"
|
||||
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
|
||||
setting_diff_max_lines_displayed: Max number of diff lines displayed
|
||||
text_plugin_assets_writable: Plugin assets directory writable
|
||||
warning_attachments_not_saved: "%{count} file(s) could not be saved."
|
||||
button_create_and_continue: Create and continue
|
||||
text_custom_field_possible_values_info: 'One line for each value'
|
||||
label_display: Display
|
||||
field_editable: Editable
|
||||
setting_repository_log_display_limit: Maximum number of revisions displayed on file log
|
||||
setting_file_max_size_displayed: Max size of text files displayed inline
|
||||
field_watcher: Watcher
|
||||
setting_openid: Allow OpenID login and registration
|
||||
field_identity_url: OpenID URL
|
||||
label_login_with_open_id_option: hoặc đăng nhập với OpenID
|
||||
field_content: Nội dung
|
||||
label_descending: Giảm dần
|
||||
label_sort: Sắp xếp
|
||||
label_ascending: Tăng dần
|
||||
label_date_from_to: "Từ %{start} tới %{end}"
|
||||
label_login_with_open_id_option: or login with OpenID
|
||||
field_content: Content
|
||||
label_descending: Descending
|
||||
label_sort: Sort
|
||||
label_ascending: Ascending
|
||||
label_date_from_to: From %{start} to %{end}
|
||||
label_greater_or_equal: ">="
|
||||
label_less_or_equal: "<="
|
||||
text_wiki_page_destroy_question: "Trang này có %{descendants} trang con và trang cháu. Bạn muốn làm gì tiếp?"
|
||||
text_wiki_page_reassign_children: Gán lại trang con vào trang mẹ này
|
||||
text_wiki_page_nullify_children: Giữ trang con như trang gốc
|
||||
text_wiki_page_destroy_children: Xóa trang con và tất cả trang con cháu của nó
|
||||
setting_password_min_length: Chiều dài tối thiểu của mật khẩu
|
||||
field_group_by: Nhóm kết quả bởi
|
||||
mail_subject_wiki_content_updated: "%{id} trang wiki đã được cập nhật"
|
||||
label_wiki_content_added: Đã thêm trang Wiki
|
||||
mail_subject_wiki_content_added: "%{id} trang wiki đã được thêm vào"
|
||||
mail_body_wiki_content_added: "Có %{id} trang wiki đã được thêm vào bởi %{author}."
|
||||
label_wiki_content_updated: Trang Wiki đã được cập nhật
|
||||
mail_body_wiki_content_updated: "Có %{id} trang wiki đã được cập nhật bởi %{author}."
|
||||
permission_add_project: Tạo dự án
|
||||
setting_new_project_user_role_id: Quyền được gán cho người dùng không phải quản trị viên khi tạo dự án mới
|
||||
label_view_all_revisions: Xem tất cả bản điều chỉnh
|
||||
label_tag: Thẻ
|
||||
label_branch: Nhánh
|
||||
error_no_tracker_in_project: Không có ai theo dõi dự án này. Hãy kiểm tra lại phần thiết lập cho dự án.
|
||||
error_no_default_issue_status: Không có vấn đề mặc định được định nghĩa. Vui lòng kiểm tra cấu hình của bạn (Vào "Quản trị -> Trạng thái vấn đề").
|
||||
text_journal_changed: "%{label} thay đổi từ %{old} tới %{new}"
|
||||
text_journal_set_to: "%{label} gán cho %{value}"
|
||||
text_journal_deleted: "%{label} xóa (%{old})"
|
||||
label_group_plural: Các nhóm
|
||||
label_group: Nhóm
|
||||
label_group_new: Thêm nhóm
|
||||
label_time_entry_plural: Thời gian đã sử dụng
|
||||
text_journal_added: "%{label} %{value} được thêm"
|
||||
field_active: Tích cực
|
||||
enumeration_system_activity: Hoạt động hệ thống
|
||||
permission_delete_issue_watchers: Xóa người quan sát
|
||||
version_status_closed: đóng
|
||||
version_status_locked: khóa
|
||||
version_status_open: mở
|
||||
error_can_not_reopen_issue_on_closed_version: Một vấn đề được gán cho phiên bản đã đóng không thể mở lại được
|
||||
label_user_anonymous: Ẩn danh
|
||||
button_move_and_follow: Di chuyển và theo
|
||||
setting_default_projects_modules: Các Module được kích hoạt mặc định cho dự án mới
|
||||
setting_gravatar_default: Ảnh Gravatar mặc định
|
||||
field_sharing: Chia sẻ
|
||||
label_version_sharing_hierarchy: Với thứ bậc dự án
|
||||
label_version_sharing_system: Với tất cả dự án
|
||||
label_version_sharing_descendants: Với dự án con
|
||||
label_version_sharing_tree: Với cây dự án
|
||||
label_version_sharing_none: Không chia sẻ
|
||||
error_can_not_archive_project: Dựa án này không thể lưu trữ được
|
||||
button_duplicate: Nhân đôi
|
||||
button_copy_and_follow: Sao chép và theo
|
||||
label_copy_source: Nguồn
|
||||
setting_issue_done_ratio: Tính toán tỷ lệ hoàn thành vấn đề với
|
||||
setting_issue_done_ratio_issue_status: Sử dụng trạng thái của vấn đề
|
||||
error_issue_done_ratios_not_updated: Tỷ lệ hoàn thành vấn đề không được cập nhật.
|
||||
error_workflow_copy_target: Vui lòng lựa chọn đích của theo dấu và quyền
|
||||
setting_issue_done_ratio_issue_field: Dùng trường vấn đề
|
||||
label_copy_same_as_target: Tương tự như đích
|
||||
label_copy_target: Đích
|
||||
notice_issue_done_ratios_updated: Tỷ lệ hoàn thành vấn đề được cập nhật.
|
||||
error_workflow_copy_source: Vui lòng lựa chọn nguồn của theo dấu hoặc quyền
|
||||
label_update_issue_done_ratios: Cập nhật tỷ lệ hoàn thành vấn đề
|
||||
setting_start_of_week: Định dạng lịch
|
||||
permission_view_issues: Xem Vấn đề
|
||||
label_display_used_statuses_only: Chỉ hiển thị trạng thái đã được dùng bởi theo dõi này
|
||||
label_revision_id: "Bản điều chỉnh %{value}"
|
||||
label_api_access_key: Khoá truy cập API
|
||||
label_api_access_key_created_on: "Khoá truy cập API đựơc tạo cách đây %{value}. Khóa này được dùng cho eDesignLab Client."
|
||||
label_feeds_access_key: Khoá truy cập RSS
|
||||
notice_api_access_key_reseted: Khoá truy cập API của bạn đã được đặt lại.
|
||||
setting_rest_api_enabled: Cho phép dịch vụ web REST
|
||||
label_missing_api_access_key: Mất Khoá truy cập API
|
||||
label_missing_feeds_access_key: Mất Khoá truy cập RSS
|
||||
button_show: Hiện
|
||||
text_line_separated: Nhiều giá trị được phép(mỗi dòng một giá trị).
|
||||
setting_mail_handler_body_delimiters: "Cắt bớt email sau những dòng :"
|
||||
permission_add_subprojects: Tạo Dự án con
|
||||
label_subproject_new: Thêm dự án con
|
||||
label_less_or_equal: <=
|
||||
text_wiki_page_destroy_question: This page has %{descendants} child page(s) and descendant(s). What do you want to do?
|
||||
text_wiki_page_reassign_children: Reassign child pages to this parent page
|
||||
text_wiki_page_nullify_children: Keep child pages as root pages
|
||||
text_wiki_page_destroy_children: Delete child pages and all their descendants
|
||||
setting_password_min_length: Minimum password length
|
||||
field_group_by: Group results by
|
||||
mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated"
|
||||
label_wiki_content_added: Wiki page added
|
||||
mail_subject_wiki_content_added: "'%{id}' wiki page has been added"
|
||||
mail_body_wiki_content_added: The '%{id}' wiki page has been added by %{author}.
|
||||
label_wiki_content_updated: Wiki page updated
|
||||
mail_body_wiki_content_updated: The '%{id}' wiki page has been updated by %{author}.
|
||||
permission_add_project: Create project
|
||||
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
|
||||
label_view_all_revisions: View all revisions
|
||||
label_tag: Tag
|
||||
label_branch: Branch
|
||||
error_no_tracker_in_project: No tracker is associated to this project. Please check the Project settings.
|
||||
error_no_default_issue_status: No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").
|
||||
text_journal_changed: "%{label} changed from %{old} to %{new}"
|
||||
text_journal_set_to: "%{label} set to %{value}"
|
||||
text_journal_deleted: "%{label} deleted (%{old})"
|
||||
label_group_plural: Groups
|
||||
label_group: Group
|
||||
label_group_new: New group
|
||||
label_time_entry_plural: Spent time
|
||||
text_journal_added: "%{label} %{value} added"
|
||||
field_active: Active
|
||||
enumeration_system_activity: System Activity
|
||||
permission_delete_issue_watchers: Delete watchers
|
||||
version_status_closed: closed
|
||||
version_status_locked: locked
|
||||
version_status_open: open
|
||||
error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened
|
||||
label_user_anonymous: Anonymous
|
||||
button_move_and_follow: Move and follow
|
||||
setting_default_projects_modules: Default enabled modules for new projects
|
||||
setting_gravatar_default: Default Gravatar image
|
||||
field_sharing: Sharing
|
||||
label_version_sharing_hierarchy: With project hierarchy
|
||||
label_version_sharing_system: With all projects
|
||||
label_version_sharing_descendants: With subprojects
|
||||
label_version_sharing_tree: With project tree
|
||||
label_version_sharing_none: Not shared
|
||||
error_can_not_archive_project: This project can not be archived
|
||||
button_duplicate: Duplicate
|
||||
button_copy_and_follow: Copy and follow
|
||||
label_copy_source: Source
|
||||
setting_issue_done_ratio: Calculate the issue done ratio with
|
||||
setting_issue_done_ratio_issue_status: Use the issue status
|
||||
error_issue_done_ratios_not_updated: Issue done ratios not updated.
|
||||
error_workflow_copy_target: Please select target tracker(s) and role(s)
|
||||
setting_issue_done_ratio_issue_field: Use the issue field
|
||||
label_copy_same_as_target: Same as target
|
||||
label_copy_target: Target
|
||||
notice_issue_done_ratios_updated: Issue done ratios updated.
|
||||
error_workflow_copy_source: Please select a source tracker or role
|
||||
label_update_issue_done_ratios: Update issue done ratios
|
||||
setting_start_of_week: Start calendars on
|
||||
permission_view_issues: View Issues
|
||||
label_display_used_statuses_only: Only display statuses that are used by this tracker
|
||||
label_revision_id: Revision %{value}
|
||||
label_api_access_key: API access key
|
||||
label_api_access_key_created_on: API access key created %{value} ago
|
||||
label_feeds_access_key: RSS access key
|
||||
notice_api_access_key_reseted: Your API access key was reset.
|
||||
setting_rest_api_enabled: Enable REST web service
|
||||
label_missing_api_access_key: Missing an API access key
|
||||
label_missing_feeds_access_key: Missing a RSS access key
|
||||
button_show: Show
|
||||
text_line_separated: Multiple values allowed (one line for each value).
|
||||
setting_mail_handler_body_delimiters: Truncate emails after one of these lines
|
||||
permission_add_subprojects: Create subprojects
|
||||
label_subproject_new: New subproject
|
||||
text_own_membership_delete_confirmation: |-
|
||||
Bạn đang cố gỡ bỏ một số hoặc tất cả quyền của bạn với dự án này và có thể sẽ mất quyền thay đổi nó sau đó.
|
||||
Bạn có muốn tiếp tục?
|
||||
label_close_versions: Đóng phiên bản đã hoàn thành
|
||||
label_board_sticky: Chú ý
|
||||
label_board_locked: Đã khóa
|
||||
permission_export_wiki_pages: Xuất trang wiki
|
||||
setting_cache_formatted_text: Cache định dạng các ký tự
|
||||
permission_manage_project_activities: Quản lý hoạt động của dự án
|
||||
error_unable_delete_issue_status: Không thể xóa trạng thái vấn đề
|
||||
label_profile: Hồ sơ
|
||||
permission_manage_subtasks: Quản lý tác vụ con
|
||||
field_parent_issue: Tác vụ cha
|
||||
label_subtask_plural: Tác vụ con
|
||||
label_project_copy_notifications: Gửi email thông báo trong khi dự án được sao chép
|
||||
error_can_not_delete_custom_field: Không thể xóa trường tùy biến
|
||||
error_unable_to_connect: "Không thể kết nối (%{value})"
|
||||
error_can_not_remove_role: Quyền này đang được dùng và không thể xóa được.
|
||||
error_can_not_delete_tracker: Theo dõi này chứa vấn đề và không thể xóa được.
|
||||
field_principal: Chủ yếu
|
||||
label_my_page_block: Block trang của tôi
|
||||
notice_failed_to_save_members: "Thất bại khi lưu thành viên : %{errors}."
|
||||
text_zoom_out: Thu nhỏ
|
||||
text_zoom_in: Phóng to
|
||||
notice_unable_delete_time_entry: Không thể xóa mục time log.
|
||||
label_overall_spent_time: Tổng thời gian sử dụng
|
||||
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
|
||||
Are you sure you want to continue?
|
||||
label_close_versions: Close completed versions
|
||||
label_board_sticky: Sticky
|
||||
label_board_locked: Locked
|
||||
permission_export_wiki_pages: Export wiki pages
|
||||
setting_cache_formatted_text: Cache formatted text
|
||||
permission_manage_project_activities: Manage project activities
|
||||
error_unable_delete_issue_status: Unable to delete issue status
|
||||
label_profile: Profile
|
||||
permission_manage_subtasks: Manage subtasks
|
||||
field_parent_issue: Parent task
|
||||
label_subtask_plural: Subtasks
|
||||
label_project_copy_notifications: Send email notifications during the project copy
|
||||
error_can_not_delete_custom_field: Unable to delete custom field
|
||||
error_unable_to_connect: Unable to connect (%{value})
|
||||
error_can_not_remove_role: This role is in use and can not be deleted.
|
||||
error_can_not_delete_tracker: This tracker contains issues and can't be deleted.
|
||||
field_principal: Principal
|
||||
label_my_page_block: My page block
|
||||
notice_failed_to_save_members: "Failed to save member(s): %{errors}."
|
||||
text_zoom_out: Zoom out
|
||||
text_zoom_in: Zoom in
|
||||
notice_unable_delete_time_entry: Unable to delete time log entry.
|
||||
label_overall_spent_time: Overall spent time
|
||||
field_time_entries: Log time
|
||||
project_module_gantt: Biểu đồ Gantt
|
||||
project_module_calendar: Lịch
|
||||
button_edit_associated_wikipage: "Chỉnh sửa trang Wiki liên quan: %{page_title}"
|
||||
text_are_you_sure_with_children: Xóa vấn đề và tất cả vấn đề con?
|
||||
field_text: Trường văn bản
|
||||
label_user_mail_option_only_owner: Chỉ những thứ tôi sở hữu
|
||||
setting_default_notification_option: Tuỳ chọn thông báo mặc định
|
||||
label_user_mail_option_only_my_events: Chỉ những thứ tôi theo dõi hoặc liên quan
|
||||
label_user_mail_option_only_assigned: Chỉ những thứ tôi được phân công
|
||||
label_user_mail_option_none: Không có sự kiện
|
||||
field_member_of_group: Nhóm thụ hưởng
|
||||
field_assigned_to_role: Quyền thụ hưởng
|
||||
notice_not_authorized_archived_project: Dự án bạn đang có truy cập đã được lưu trữ.
|
||||
label_principal_search: "Tìm kiếm người dùng hoặc nhóm:"
|
||||
label_user_search: "Tìm kiếm người dùng:"
|
||||
field_visible: Nhìn thấy
|
||||
setting_emails_header: Tiêu đề Email
|
||||
setting_commit_logtime_activity_id: Cho phép ghi lại thời gian
|
||||
text_time_logged_by_changeset: "Áp dụng trong changeset : %{value}."
|
||||
setting_commit_logtime_enabled: Cho phép time logging
|
||||
notice_gantt_chart_truncated: "Đồ thị đã được cắt bớt bởi vì nó đã vượt qua lượng thông tin tối đa có thể hiển thị :(%{max})"
|
||||
setting_gantt_items_limit: Lượng thông tin tối đa trên đồ thị gantt
|
||||
description_selected_columns: Các cột được lựa chọn
|
||||
field_warn_on_leaving_unsaved: Cảnh báo tôi khi rời một trang có các nội dung chưa lưu
|
||||
text_warn_on_leaving_unsaved: Trang hiện tại chứa nội dung chưa lưu và sẽ bị mất nếu bạn rời trang này.
|
||||
label_my_queries: Các truy vấn tùy biến
|
||||
text_journal_changed_no_detail: "%{label} cập nhật"
|
||||
label_news_comment_added: Bình luận đã được thêm cho một tin tức
|
||||
button_expand_all: Mở rộng tất cả
|
||||
button_collapse_all: Thu gọn tất cả
|
||||
label_additional_workflow_transitions_for_assignee: Chuyển đổi bổ sung cho phép khi người sử dụng là người nhận chuyển nhượng
|
||||
label_additional_workflow_transitions_for_author: Các chuyển đổi bổ xung được phép khi người dùng là tác giả
|
||||
label_bulk_edit_selected_time_entries: Sửa nhiều mục đã chọn
|
||||
text_time_entries_destroy_confirmation: Bạn có chắc chắn muốn xóa bỏ các mục đã chọn?
|
||||
label_role_anonymous: Ẩn danh
|
||||
label_role_non_member: Không là thành viên
|
||||
label_issue_note_added: Ghi chú được thêm
|
||||
label_issue_status_updated: Trạng thái cập nhật
|
||||
label_issue_priority_updated: Cập nhật ưu tiên
|
||||
label_issues_visibility_own: Vấn đề tạo bởi hoặc gán cho người dùng
|
||||
field_issues_visibility: Vấn đề được nhìn thấy
|
||||
label_issues_visibility_all: Tất cả vấn đề
|
||||
permission_set_own_issues_private: Đặt vấn đề sở hữu là riêng tư hoặc công cộng
|
||||
field_is_private: Riêng tư
|
||||
permission_set_issues_private: Gán vấn đề là riêng tư hoặc công cộng
|
||||
label_issues_visibility_public: Tất cả vấn đề không riêng tư
|
||||
text_issues_destroy_descendants_confirmation: "Hành động này sẽ xóa %{count} tác vụ con."
|
||||
field_commit_logs_encoding: Mã hóa ghi chú Commit
|
||||
field_scm_path_encoding: Mã hóa đường dẫn
|
||||
text_scm_path_encoding_note: "Mặc định: UTF-8"
|
||||
field_path_to_repository: Đường dẫn tới kho chứa
|
||||
field_root_directory: Thư mục gốc
|
||||
project_module_gantt: Gantt
|
||||
project_module_calendar: Calendar
|
||||
button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}"
|
||||
field_text: Text field
|
||||
label_user_mail_option_only_owner: Only for things I am the owner of
|
||||
setting_default_notification_option: Default notification option
|
||||
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in
|
||||
label_user_mail_option_only_assigned: Only for things I am assigned to
|
||||
label_user_mail_option_none: No events
|
||||
field_member_of_group: Assignee's group
|
||||
field_assigned_to_role: Assignee's role
|
||||
notice_not_authorized_archived_project: The project you're trying to access has been archived.
|
||||
label_principal_search: "Search for user or group:"
|
||||
label_user_search: "Search for user:"
|
||||
field_visible: Visible
|
||||
setting_emails_header: Emails header
|
||||
setting_commit_logtime_activity_id: Activity for logged time
|
||||
text_time_logged_by_changeset: Applied in changeset %{value}.
|
||||
setting_commit_logtime_enabled: Enable time logging
|
||||
notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
|
||||
setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
|
||||
field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
|
||||
text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
|
||||
label_my_queries: My custom queries
|
||||
text_journal_changed_no_detail: "%{label} updated"
|
||||
label_news_comment_added: Comment added to a news
|
||||
button_expand_all: Expand all
|
||||
button_collapse_all: Collapse all
|
||||
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee
|
||||
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author
|
||||
label_bulk_edit_selected_time_entries: Bulk edit selected time entries
|
||||
text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)?
|
||||
label_role_anonymous: Anonymous
|
||||
label_role_non_member: Non member
|
||||
label_issue_note_added: Note added
|
||||
label_issue_status_updated: Status updated
|
||||
label_issue_priority_updated: Priority updated
|
||||
label_issues_visibility_own: Issues created by or assigned to the user
|
||||
field_issues_visibility: Issues visibility
|
||||
label_issues_visibility_all: All issues
|
||||
permission_set_own_issues_private: Set own issues public or private
|
||||
field_is_private: Private
|
||||
permission_set_issues_private: Set issues public or private
|
||||
label_issues_visibility_public: All non private issues
|
||||
text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s).
|
||||
field_commit_logs_encoding: Commit messages encoding
|
||||
field_scm_path_encoding: Path encoding
|
||||
text_scm_path_encoding_note: "Default: UTF-8"
|
||||
field_path_to_repository: Path to repository
|
||||
field_root_directory: Root directory
|
||||
field_cvs_module: Module
|
||||
field_cvsroot: CVSROOT
|
||||
text_mercurial_repository_note: Kho chứa cục bộ (vd. /hgrepo, c:\hgrepo)
|
||||
text_scm_command: Lệnh
|
||||
text_scm_command_version: Phiên bản
|
||||
label_git_report_last_commit: Báo cáo lần Commit cuối cùng cho file và thư mục
|
||||
text_scm_config: Bạn có thể cấu hình lệnh Scm trong file config/configuration.yml. Vui lòng khởi động lại ứng dụng sau khi chỉnh sửa nó.
|
||||
text_scm_command_not_available: Lệnh Scm không có sẵn. Vui lòng kiểm tra lại thiết đặt trong phần Quản trị.
|
||||
notice_issue_successful_create: "Vấn đề %{id} đã được tạo."
|
||||
label_between: Ở giữa
|
||||
setting_issue_group_assignment: Cho phép gán vấn đề đến các nhóm
|
||||
label_diff: Sự khác nhau
|
||||
text_git_repository_note: Kho chứa cục bộ và công cộng (vd. /gitrepo, c:\gitrepo)
|
||||
description_query_sort_criteria_direction: Chiều sắp xếp
|
||||
description_project_scope: Phạm vi tìm kiếm
|
||||
description_filter: Lọc
|
||||
description_user_mail_notification: Thiết lập email thông báo
|
||||
description_date_from: Nhập ngày bắt đầu
|
||||
description_message_content: Nội dung thông điệp
|
||||
description_available_columns: Các cột có sẵn
|
||||
description_date_range_interval: Chọn khoảng thời gian giữa ngày bắt đầu và kết thúc
|
||||
description_issue_category_reassign: Chọn danh mục vấn đề
|
||||
description_search: Trường tìm kiếm
|
||||
description_notes: Các chú ý
|
||||
description_date_range_list: Chọn khoảng từ danh sách
|
||||
description_choose_project: Các dự án
|
||||
description_date_to: Nhập ngày kết thúc
|
||||
description_query_sort_criteria_attribute: Sắp xếp thuộc tính
|
||||
description_wiki_subpages_reassign: Chọn một trang cấp trên
|
||||
label_parent_revision: Cha
|
||||
label_child_revision: Con
|
||||
error_scm_annotate_big_text_file: Các mục không được chú thích, vì nó vượt quá kích thước tập tin văn bản tối đa.
|
||||
setting_default_issue_start_date_to_creation_date: Sử dụng thời gian hiện tại khi tạo vấn đề mới
|
||||
button_edit_section: Soạn thảo sự lựa chọn này
|
||||
setting_repositories_encodings: Mã hóa kho chứa
|
||||
description_all_columns: Các cột
|
||||
text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo)
|
||||
text_scm_command: Command
|
||||
text_scm_command_version: Version
|
||||
label_git_report_last_commit: Report last commit for files and directories
|
||||
text_scm_config: You can configure your scm commands in config/configuration.yml. Please restart the application after editing it.
|
||||
text_scm_command_not_available: Scm command is not available. Please check settings on the administration panel.
|
||||
notice_issue_successful_create: Issue %{id} created.
|
||||
label_between: between
|
||||
setting_issue_group_assignment: Allow issue assignment to groups
|
||||
label_diff: diff
|
||||
text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
|
||||
description_query_sort_criteria_direction: Sort direction
|
||||
description_project_scope: Search scope
|
||||
description_filter: Filter
|
||||
description_user_mail_notification: Mail notification settings
|
||||
description_date_from: Enter start date
|
||||
description_message_content: Message content
|
||||
description_available_columns: Available Columns
|
||||
description_date_range_interval: Choose range by selecting start and end date
|
||||
description_issue_category_reassign: Choose issue category
|
||||
description_search: Searchfield
|
||||
description_notes: Notes
|
||||
description_date_range_list: Choose range from list
|
||||
description_choose_project: Projects
|
||||
description_date_to: Enter end date
|
||||
description_query_sort_criteria_attribute: Sort attribute
|
||||
description_wiki_subpages_reassign: Choose new parent page
|
||||
description_selected_columns: Selected Columns
|
||||
label_parent_revision: Parent
|
||||
label_child_revision: Child
|
||||
error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size.
|
||||
setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
|
||||
button_edit_section: Edit this section
|
||||
setting_repositories_encodings: Attachments and repositories encodings
|
||||
description_all_columns: All Columns
|
||||
button_export: Export
|
||||
label_export_options: "%{export_format} tùy chọn Export"
|
||||
error_attachment_too_big: "File này không thể tải lên vì nó vượt quá kích thước cho phép : (%{max_size})"
|
||||
notice_failed_to_save_time_entries: "Lỗi khi lưu %{count} lần trên %{total} sự lựa chọn : %{ids}."
|
||||
label_export_options: "%{export_format} export options"
|
||||
error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})
|
||||
notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}."
|
||||
label_x_issues:
|
||||
zero: 0 vấn đề
|
||||
one: 1 vấn đề
|
||||
other: "%{count} vấn đề"
|
||||
label_repository_new: Kho lưu trữ mới
|
||||
field_repository_is_default: Kho lưu trữ chính
|
||||
label_copy_attachments: Copy các file đính kèm
|
||||
label_repository_new: New repository
|
||||
field_repository_is_default: Main repository
|
||||
label_copy_attachments: Copy attachments
|
||||
label_item_position: "%{position}/%{count}"
|
||||
label_completed_versions: Các phiên bản hoàn thành
|
||||
text_project_identifier_info: Chỉ cho phép chữ cái thường (a-z), con số và dấu gạch ngang.<br />Sau khi lưu, chỉ số ID không thể thay đổi.
|
||||
field_multiple: Nhiều giá trị
|
||||
setting_commit_cross_project_ref: Sử dụng thời gian hiện tại khi tạo vấn đề mới
|
||||
text_issue_conflict_resolution_add_notes: Thêm ghi chú của tôi và loại bỏ các thay đổi khác
|
||||
text_issue_conflict_resolution_overwrite: Áp dụng thay đổi bằng bất cứ giá nào, ghi chú trước đó có thể bị ghi đè
|
||||
notice_issue_update_conflict: Vấn đề này đã được cập nhật bởi một người dùng khác trong khi bạn đang chỉnh sửa nó.
|
||||
text_issue_conflict_resolution_cancel: "Loại bỏ tất cả các thay đổi và hiển thị lại %{link}"
|
||||
permission_manage_related_issues: Quản lý các vấn đề liên quan
|
||||
field_auth_source_ldap_filter: Bộ lọc LDAP
|
||||
label_search_for_watchers: Tìm kiếm người theo dõi để thêm
|
||||
notice_account_deleted: Tài khoản của bạn đã được xóa vĩnh viễn.
|
||||
button_delete_my_account: Xóa tài khoản của tôi
|
||||
setting_unsubscribe: Cho phép người dùng xóa Account
|
||||
label_completed_versions: Completed versions
|
||||
text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.
|
||||
field_multiple: Multiple values
|
||||
setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
|
||||
text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes
|
||||
text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten)
|
||||
notice_issue_update_conflict: The issue has been updated by an other user while you were editing it.
|
||||
text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link}
|
||||
permission_manage_related_issues: Manage related issues
|
||||
field_auth_source_ldap_filter: LDAP filter
|
||||
label_search_for_watchers: Search for watchers to add
|
||||
notice_account_deleted: Your account has been permanently deleted.
|
||||
setting_unsubscribe: Allow users to delete their own account
|
||||
button_delete_my_account: Delete my account
|
||||
text_account_destroy_confirmation: |-
|
||||
Bạn đồng ý không ?
|
||||
Tài khoản của bạn sẽ bị xóa vĩnh viễn, không thể khôi phục lại!
|
||||
error_session_expired: Phiên làm việc của bạn bị quá hạn, hãy đăng nhập lại
|
||||
text_session_expiration_settings: "Chú ý : Thay đổi các thiết lập này có thể gây vô hiệu hóa Session hiện tại"
|
||||
setting_session_lifetime: Thời gian tồn tại lớn nhất của Session
|
||||
setting_session_timeout: Thời gian vô hiệu hóa Session
|
||||
label_session_expiration: Phiên làm việc bị quá hạn
|
||||
permission_close_project: Đóng / Mở lại dự án
|
||||
label_show_closed_projects: Xem các dự án đã đóng
|
||||
button_close: Đóng
|
||||
button_reopen: Mở lại
|
||||
project_status_active: Kích hoạt
|
||||
project_status_closed: Đã đóng
|
||||
project_status_archived: Lưu trữ
|
||||
text_project_closed: Dự án này đã đóng và chỉ đọc
|
||||
notice_user_successful_create: "Người dùng %{id} đã được tạo."
|
||||
field_core_fields: Các trường tiêu chuẩn
|
||||
field_timeout: Quá hạn
|
||||
setting_thumbnails_enabled: Hiển thị các thumbnail đính kèm
|
||||
setting_thumbnails_size: Kích thước Thumbnails(pixel)
|
||||
setting_session_lifetime: Thời gian tồn tại lớn nhất của Session
|
||||
setting_session_timeout: Thời gian vô hiệu hóa Session
|
||||
label_status_transitions: Trạng thái chuyển tiếp
|
||||
label_fields_permissions: Cho phép các trường
|
||||
label_readonly: Chỉ đọc
|
||||
label_required: Yêu cầu
|
||||
text_repository_identifier_info: Chỉ có các chữ thường (a-z), các số (0-9), dấu gạch ngang và gạch dưới là hợp lệ.<br />Khi đã lưu, tên định danh sẽ không thể thay đổi.
|
||||
field_board_parent: Diễn đàn cha
|
||||
label_attribute_of_project: "Của dự án : %{name}"
|
||||
label_attribute_of_author: "Của tác giả : %{name}"
|
||||
label_attribute_of_assigned_to: "Được phân công bởi %{name}"
|
||||
label_attribute_of_fixed_version: "Phiên bản mục tiêu của %{name}"
|
||||
label_copy_subtasks: Sao chép các nhiệm vụ con
|
||||
label_copied_to: Sao chép đến
|
||||
label_copied_from: Sao chép từ
|
||||
label_any_issues_in_project: Bất kỳ vấn đề nào trong dự án
|
||||
label_any_issues_not_in_project: Bất kỳ vấn đề nào không thuộc dự án
|
||||
field_private_notes: Ghi chú riêng tư
|
||||
permission_view_private_notes: Xem ghi chú riêng tư
|
||||
permission_set_notes_private: Đặt ghi chú thành riêng tư
|
||||
label_no_issues_in_project: Không có vấn đề nào trong dự án
|
||||
Are you sure you want to proceed?
|
||||
Your account will be permanently deleted, with no way to reactivate it.
|
||||
error_session_expired: Your session has expired. Please login again.
|
||||
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
|
||||
setting_session_lifetime: Session maximum lifetime
|
||||
setting_session_timeout: Session inactivity timeout
|
||||
label_session_expiration: Session expiration
|
||||
permission_close_project: Close / reopen the project
|
||||
label_show_closed_projects: View closed projects
|
||||
button_close: Close
|
||||
button_reopen: Reopen
|
||||
project_status_active: active
|
||||
project_status_closed: closed
|
||||
project_status_archived: archived
|
||||
text_project_closed: This project is closed and read-only.
|
||||
notice_user_successful_create: User %{id} created.
|
||||
field_core_fields: Standard fields
|
||||
field_timeout: Timeout (in seconds)
|
||||
setting_thumbnails_enabled: Display attachment thumbnails
|
||||
setting_thumbnails_size: Thumbnails size (in pixels)
|
||||
label_status_transitions: Status transitions
|
||||
label_fields_permissions: Fields permissions
|
||||
label_readonly: Read-only
|
||||
label_required: Required
|
||||
text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.
|
||||
field_board_parent: Parent forum
|
||||
label_attribute_of_project: Project's %{name}
|
||||
label_attribute_of_author: Author's %{name}
|
||||
label_attribute_of_assigned_to: Assignee's %{name}
|
||||
label_attribute_of_fixed_version: Target version's %{name}
|
||||
label_copy_subtasks: Copy subtasks
|
||||
label_copied_to: copied to
|
||||
label_copied_from: copied from
|
||||
label_any_issues_in_project: any issues in project
|
||||
label_any_issues_not_in_project: any issues not in project
|
||||
field_private_notes: Private notes
|
||||
permission_view_private_notes: View private notes
|
||||
permission_set_notes_private: Set notes as private
|
||||
label_no_issues_in_project: no issues in project
|
||||
label_any: tất cả
|
||||
label_last_n_weeks: "%{count} tuần qua"
|
||||
setting_cross_project_subtasks: Cho phép các nhiệm vụ con liên dự án
|
||||
label_cross_project_descendants: Trong các dự án con
|
||||
label_cross_project_tree: Trong cùng cây dự án
|
||||
label_cross_project_hierarchy: Trong dự án cùng cấp bậc
|
||||
label_cross_project_system: Trong tất cả các dự án
|
||||
button_hide: Ẩn
|
||||
setting_non_working_week_days: Các ngày không làm việc
|
||||
label_in_the_next_days: Trong tương lai
|
||||
label_in_the_past_days: Trong quá khứ
|
||||
label_last_n_weeks: last %{count} weeks
|
||||
setting_cross_project_subtasks: Allow cross-project subtasks
|
||||
label_cross_project_descendants: With subprojects
|
||||
label_cross_project_tree: With project tree
|
||||
label_cross_project_hierarchy: With project hierarchy
|
||||
label_cross_project_system: With all projects
|
||||
button_hide: Hide
|
||||
setting_non_working_week_days: Non-working days
|
||||
label_in_the_next_days: in the next
|
||||
label_in_the_past_days: in the past
|
||||
|
||||
@@ -4,58 +4,6 @@ Redmine - project management software
|
||||
Copyright (C) 2006-2012 Jean-Philippe Lang
|
||||
http://www.redmine.org/
|
||||
|
||||
== 2013-03-19 v2.2.4
|
||||
|
||||
* Upgrade to Rails 3.2.13
|
||||
* Defect #12243: Ordering forum replies by last reply date is broken
|
||||
* Defect #13127: h1 multiple lined titles breaks into main menu
|
||||
* Defect #13138: Generating PDF of issue causes UndefinedConversionError with htmlentities gem
|
||||
* Defect #13165: rdm-mailhandler.rb: initialize_http_header override basic auth
|
||||
* Defect #13232: Link to topic in nonexistent forum causes error 500
|
||||
* Patch #13181: Bulgarian translation of jstoolbar-bg.js
|
||||
* Patch #13207: Portuguese translation for 2.2-stable
|
||||
* Patch #13310: pt-BR label_last_n_weeks translation
|
||||
* Patch #13325: pt-BR translation for 2.2-stable
|
||||
* Patch #13343: Vietnamese translation for 2.2-stable
|
||||
* Patch #13398: Czech translation for 2.2-stable
|
||||
|
||||
== 2013-02-12 v2.2.3
|
||||
|
||||
* Upgrade to Rails 3.2.12
|
||||
* Defect #11987: pdf: Broken new line in table
|
||||
* Defect #12930: 404 Error when referencing different project source files in the wiki syntax
|
||||
* Defect #12979: Wiki link syntax commit:repo_a:abcd doesn't work
|
||||
* Defect #13075: Can't clear custom field value through context menu in the issue list
|
||||
* Defect #13097: Project copy fails when wiki module is disabled
|
||||
* Defect #13126: Issue view: estimated time vs. spent time
|
||||
* Patch #12922: Update Spanish translation
|
||||
* Patch #12928: Bulgarian translation for 2.2-stable
|
||||
* Patch #12987: Russian translation for 2.2-stable
|
||||
|
||||
== 2013-01-20 v2.2.2
|
||||
|
||||
* Defect #7510: Link to attachment should return latest attachment
|
||||
* Defect #9842: {{toc}} is not replaced by table of content when exporting wiki page to pdf
|
||||
* Defect #12749: Plugins cannot route wiki page sub-path
|
||||
* Defect #12799: Cannot edit a wiki section which title starts with a tab
|
||||
* Defect #12801: Viewing the history of a wiki page with attachments raises an error
|
||||
* Defect #12833: Input fields restricted on length should have maxlength parameter set
|
||||
* Defect #12838: Blank page when clicking Add with no block selected on my page layout
|
||||
* Defect #12851: "Parent task is invalid" while editing child issues by Role with restricted Issues Visibility
|
||||
* Patch #12800: Serbian Latin translation patch (sr-YU.yml)
|
||||
* Patch #12809: Swedish Translation for r11162
|
||||
* Patch #12818: Minor swedish translation fix
|
||||
|
||||
== 2013-01-09 v2.2.1
|
||||
|
||||
* Upgrade to Rails 3.2.11
|
||||
* Defect #12652: "Copy ticket" selects "new ticket"
|
||||
* Defect #12691: Textile Homepage Dead?
|
||||
* Defect #12711: incorrect fix of lib/SVG/Graph/TimeSeries.rb
|
||||
* Defect #12744: Unable to call a macro with a name that contains uppercase letters
|
||||
* Defect #12776: Security vulnerability in Rails 3.2.10 (CVE-2013-0156)
|
||||
* Patch #12630: Russian "x_hours" translation
|
||||
|
||||
== 2012-12-18 v2.2.0
|
||||
|
||||
* Defect #4787: Gannt to PNG - CJK (Chinese, Japanese and Korean) characters appear as ?
|
||||
|
||||
@@ -10,8 +10,8 @@ module Net
|
||||
def self.post_form(url, params, headers, options={})
|
||||
request = Post.new(url.path)
|
||||
request.form_data = params
|
||||
request.initialize_http_header(headers)
|
||||
request.basic_auth url.user, url.password if url.user
|
||||
request.initialize_http_header(headers)
|
||||
http = new(url.host, url.port)
|
||||
http.use_ssl = (url.scheme == 'https')
|
||||
if options[:no_check_certificate]
|
||||
@@ -23,7 +23,7 @@ module Net
|
||||
end
|
||||
|
||||
class RedmineMailHandler
|
||||
VERSION = '0.2.1'
|
||||
VERSION = '0.2'
|
||||
|
||||
attr_accessor :verbose, :issue_attributes, :allow_override, :unknown_user, :no_permission_check, :url, :key, :no_check_certificate
|
||||
|
||||
|
||||
@@ -1,148 +1,148 @@
|
||||
require 'rexml/document'
|
||||
require 'SVG/Graph/Graph'
|
||||
require 'SVG/Graph/BarBase'
|
||||
|
||||
module SVG
|
||||
module Graph
|
||||
# === Create presentation quality SVG bar graphs easily
|
||||
#
|
||||
# = Synopsis
|
||||
#
|
||||
# require 'SVG/Graph/Bar'
|
||||
#
|
||||
# fields = %w(Jan Feb Mar);
|
||||
# data_sales_02 = [12, 45, 21]
|
||||
#
|
||||
# graph = SVG::Graph::Bar.new(
|
||||
# :height => 500,
|
||||
# :width => 300,
|
||||
# :fields => fields
|
||||
# )
|
||||
#
|
||||
# graph.add_data(
|
||||
# :data => data_sales_02,
|
||||
# :title => 'Sales 2002'
|
||||
# )
|
||||
#
|
||||
# print "Content-type: image/svg+xml\r\n\r\n"
|
||||
# print graph.burn
|
||||
#
|
||||
# = Description
|
||||
#
|
||||
# This object aims to allow you to easily create high quality
|
||||
# SVG[http://www.w3c.org/tr/svg bar graphs. You can either use the default
|
||||
# style sheet or supply your own. Either way there are many options which
|
||||
# can be configured to give you control over how the graph is generated -
|
||||
# with or without a key, data elements at each point, title, subtitle etc.
|
||||
#
|
||||
# = Notes
|
||||
#
|
||||
# The default stylesheet handles upto 12 data sets, if you
|
||||
# use more you must create your own stylesheet and add the
|
||||
# additional settings for the extra data sets. You will know
|
||||
# if you go over 12 data sets as they will have no style and
|
||||
# be in black.
|
||||
#
|
||||
# = Examples
|
||||
#
|
||||
# * http://germane-software.com/repositories/public/SVG/test/test.rb
|
||||
#
|
||||
# = See also
|
||||
#
|
||||
# * SVG::Graph::Graph
|
||||
# * SVG::Graph::BarHorizontal
|
||||
# * SVG::Graph::Line
|
||||
# * SVG::Graph::Pie
|
||||
# * SVG::Graph::Plot
|
||||
# * SVG::Graph::TimeSeries
|
||||
class Bar < BarBase
|
||||
include REXML
|
||||
|
||||
# See Graph::initialize and BarBase::set_defaults
|
||||
def set_defaults
|
||||
super
|
||||
self.top_align = self.top_font = 1
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def get_x_labels
|
||||
@config[:fields]
|
||||
end
|
||||
|
||||
def get_y_labels
|
||||
maxvalue = max_value
|
||||
minvalue = min_value
|
||||
range = maxvalue - minvalue
|
||||
|
||||
top_pad = range == 0 ? 10 : range / 20.0
|
||||
scale_range = (maxvalue + top_pad) - minvalue
|
||||
|
||||
scale_division = scale_divisions || (scale_range / 10.0)
|
||||
|
||||
if scale_integers
|
||||
scale_division = scale_division < 1 ? 1 : scale_division.round
|
||||
end
|
||||
|
||||
rv = []
|
||||
maxvalue = maxvalue%scale_division == 0 ?
|
||||
maxvalue : maxvalue + scale_division
|
||||
minvalue.step( maxvalue, scale_division ) {|v| rv << v}
|
||||
return rv
|
||||
end
|
||||
|
||||
def x_label_offset( width )
|
||||
width / 2.0
|
||||
end
|
||||
|
||||
def draw_data
|
||||
minvalue = min_value
|
||||
fieldwidth = field_width
|
||||
|
||||
unit_size = (@graph_height.to_f - font_size*2*top_font) /
|
||||
(get_y_labels.max - get_y_labels.min)
|
||||
bargap = bar_gap ? (fieldwidth < 10 ? fieldwidth / 2 : 10) : 0
|
||||
|
||||
bar_width = fieldwidth - bargap
|
||||
bar_width /= @data.length if stack == :side
|
||||
x_mod = (@graph_width-bargap)/2 - (stack==:side ? bar_width/2 : 0)
|
||||
|
||||
bottom = @graph_height
|
||||
|
||||
field_count = 0
|
||||
@config[:fields].each_index { |i|
|
||||
dataset_count = 0
|
||||
for dataset in @data
|
||||
|
||||
# cases (assume 0 = +ve):
|
||||
# value min length
|
||||
# +ve +ve value - min
|
||||
# +ve -ve value - 0
|
||||
# -ve -ve value.abs - 0
|
||||
|
||||
value = dataset[:data][i]
|
||||
|
||||
left = (fieldwidth * field_count)
|
||||
|
||||
length = (value.abs - (minvalue > 0 ? minvalue : 0)) * unit_size
|
||||
# top is 0 if value is negative
|
||||
top = bottom - (((value < 0 ? 0 : value) - minvalue) * unit_size)
|
||||
left += bar_width * dataset_count if stack == :side
|
||||
|
||||
@graph.add_element( "rect", {
|
||||
"x" => left.to_s,
|
||||
"y" => top.to_s,
|
||||
"width" => bar_width.to_s,
|
||||
"height" => length.to_s,
|
||||
"class" => "fill#{dataset_count+1}"
|
||||
})
|
||||
|
||||
make_datapoint_text(left + bar_width/2.0, top - 6, value.to_s)
|
||||
dataset_count += 1
|
||||
end
|
||||
field_count += 1
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
require 'rexml/document'
|
||||
require 'SVG/Graph/Graph'
|
||||
require 'SVG/Graph/BarBase'
|
||||
|
||||
module SVG
|
||||
module Graph
|
||||
# === Create presentation quality SVG bar graphs easily
|
||||
#
|
||||
# = Synopsis
|
||||
#
|
||||
# require 'SVG/Graph/Bar'
|
||||
#
|
||||
# fields = %w(Jan Feb Mar);
|
||||
# data_sales_02 = [12, 45, 21]
|
||||
#
|
||||
# graph = SVG::Graph::Bar.new(
|
||||
# :height => 500,
|
||||
# :width => 300,
|
||||
# :fields => fields
|
||||
# )
|
||||
#
|
||||
# graph.add_data(
|
||||
# :data => data_sales_02,
|
||||
# :title => 'Sales 2002'
|
||||
# )
|
||||
#
|
||||
# print "Content-type: image/svg+xml\r\n\r\n"
|
||||
# print graph.burn
|
||||
#
|
||||
# = Description
|
||||
#
|
||||
# This object aims to allow you to easily create high quality
|
||||
# SVG[http://www.w3c.org/tr/svg bar graphs. You can either use the default
|
||||
# style sheet or supply your own. Either way there are many options which
|
||||
# can be configured to give you control over how the graph is generated -
|
||||
# with or without a key, data elements at each point, title, subtitle etc.
|
||||
#
|
||||
# = Notes
|
||||
#
|
||||
# The default stylesheet handles upto 12 data sets, if you
|
||||
# use more you must create your own stylesheet and add the
|
||||
# additional settings for the extra data sets. You will know
|
||||
# if you go over 12 data sets as they will have no style and
|
||||
# be in black.
|
||||
#
|
||||
# = Examples
|
||||
#
|
||||
# * http://germane-software.com/repositories/public/SVG/test/test.rb
|
||||
#
|
||||
# = See also
|
||||
#
|
||||
# * SVG::Graph::Graph
|
||||
# * SVG::Graph::BarHorizontal
|
||||
# * SVG::Graph::Line
|
||||
# * SVG::Graph::Pie
|
||||
# * SVG::Graph::Plot
|
||||
# * SVG::Graph::TimeSeries
|
||||
class Bar < BarBase
|
||||
include REXML
|
||||
|
||||
# See Graph::initialize and BarBase::set_defaults
|
||||
def set_defaults
|
||||
super
|
||||
self.top_align = self.top_font = 1
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def get_x_labels
|
||||
@config[:fields]
|
||||
end
|
||||
|
||||
def get_y_labels
|
||||
maxvalue = max_value
|
||||
minvalue = min_value
|
||||
range = maxvalue - minvalue
|
||||
|
||||
top_pad = range == 0 ? 10 : range / 20.0
|
||||
scale_range = (maxvalue + top_pad) - minvalue
|
||||
|
||||
scale_division = scale_divisions || (scale_range / 10.0)
|
||||
|
||||
if scale_integers
|
||||
scale_division = scale_division < 1 ? 1 : scale_division.round
|
||||
end
|
||||
|
||||
rv = []
|
||||
maxvalue = maxvalue%scale_division == 0 ?
|
||||
maxvalue : maxvalue + scale_division
|
||||
minvalue.step( maxvalue, scale_division ) {|v| rv << v}
|
||||
return rv
|
||||
end
|
||||
|
||||
def x_label_offset( width )
|
||||
width / 2.0
|
||||
end
|
||||
|
||||
def draw_data
|
||||
minvalue = min_value
|
||||
fieldwidth = field_width
|
||||
|
||||
unit_size = (@graph_height.to_f - font_size*2*top_font) /
|
||||
(get_y_labels.max - get_y_labels.min)
|
||||
bargap = bar_gap ? (fieldwidth < 10 ? fieldwidth / 2 : 10) : 0
|
||||
|
||||
bar_width = fieldwidth - bargap
|
||||
bar_width /= @data.length if stack == :side
|
||||
x_mod = (@graph_width-bargap)/2 - (stack==:side ? bar_width/2 : 0)
|
||||
|
||||
bottom = @graph_height
|
||||
|
||||
field_count = 0
|
||||
@config[:fields].each_index { |i|
|
||||
dataset_count = 0
|
||||
for dataset in @data
|
||||
|
||||
# cases (assume 0 = +ve):
|
||||
# value min length
|
||||
# +ve +ve value - min
|
||||
# +ve -ve value - 0
|
||||
# -ve -ve value.abs - 0
|
||||
|
||||
value = dataset[:data][i]
|
||||
|
||||
left = (fieldwidth * field_count)
|
||||
|
||||
length = (value.abs - (minvalue > 0 ? minvalue : 0)) * unit_size
|
||||
# top is 0 if value is negative
|
||||
top = bottom - (((value < 0 ? 0 : value) - minvalue) * unit_size)
|
||||
left += bar_width * dataset_count if stack == :side
|
||||
|
||||
@graph.add_element( "rect", {
|
||||
"x" => left.to_s,
|
||||
"y" => top.to_s,
|
||||
"width" => bar_width.to_s,
|
||||
"height" => length.to_s,
|
||||
"class" => "fill#{dataset_count+1}"
|
||||
})
|
||||
|
||||
make_datapoint_text(left + bar_width/2.0, top - 6, value.to_s)
|
||||
dataset_count += 1
|
||||
end
|
||||
field_count += 1
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,139 +1,139 @@
|
||||
require 'rexml/document'
|
||||
require 'SVG/Graph/Graph'
|
||||
|
||||
module SVG
|
||||
module Graph
|
||||
# = Synopsis
|
||||
#
|
||||
# A superclass for bar-style graphs. Do not attempt to instantiate
|
||||
# directly; use one of the subclasses instead.
|
||||
#
|
||||
# = Author
|
||||
#
|
||||
# Sean E. Russell <serATgermaneHYPHENsoftwareDOTcom>
|
||||
#
|
||||
# Copyright 2004 Sean E. Russell
|
||||
# This software is available under the Ruby license[LICENSE.txt]
|
||||
#
|
||||
class BarBase < SVG::Graph::Graph
|
||||
# Ensures that :fields are provided in the configuration.
|
||||
def initialize config
|
||||
raise "fields was not supplied or is empty" unless config[:fields] &&
|
||||
config[:fields].kind_of?(Array) &&
|
||||
config[:fields].length > 0
|
||||
super
|
||||
end
|
||||
|
||||
# In addition to the defaults set in Graph::initialize, sets
|
||||
# [bar_gap] true
|
||||
# [stack] :overlap
|
||||
def set_defaults
|
||||
init_with( :bar_gap => true, :stack => :overlap )
|
||||
end
|
||||
|
||||
# Whether to have a gap between the bars or not, default
|
||||
# is true, set to false if you don't want gaps.
|
||||
attr_accessor :bar_gap
|
||||
# How to stack data sets. :overlap overlaps bars with
|
||||
# transparent colors, :top stacks bars on top of one another,
|
||||
# :side stacks the bars side-by-side. Defaults to :overlap.
|
||||
attr_accessor :stack
|
||||
|
||||
|
||||
protected
|
||||
|
||||
def max_value
|
||||
@data.collect{|x| x[:data].max}.max
|
||||
end
|
||||
|
||||
def min_value
|
||||
min = 0
|
||||
if min_scale_value.nil?
|
||||
min = @data.collect{|x| x[:data].min}.min
|
||||
min = min > 0 ? 0 : min
|
||||
else
|
||||
min = min_scale_value
|
||||
end
|
||||
return min
|
||||
end
|
||||
|
||||
def get_css
|
||||
return <<EOL
|
||||
/* default fill styles for multiple datasets (probably only use a single dataset on this graph though) */
|
||||
.key1,.fill1{
|
||||
fill: #ff0000;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 0.5px;
|
||||
}
|
||||
.key2,.fill2{
|
||||
fill: #0000ff;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key3,.fill3{
|
||||
fill: #00ff00;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key4,.fill4{
|
||||
fill: #ffcc00;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key5,.fill5{
|
||||
fill: #00ccff;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key6,.fill6{
|
||||
fill: #ff00ff;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key7,.fill7{
|
||||
fill: #00ffff;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key8,.fill8{
|
||||
fill: #ffff00;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key9,.fill9{
|
||||
fill: #cc6666;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key10,.fill10{
|
||||
fill: #663399;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key11,.fill11{
|
||||
fill: #339900;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key12,.fill12{
|
||||
fill: #9966FF;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
EOL
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
require 'rexml/document'
|
||||
require 'SVG/Graph/Graph'
|
||||
|
||||
module SVG
|
||||
module Graph
|
||||
# = Synopsis
|
||||
#
|
||||
# A superclass for bar-style graphs. Do not attempt to instantiate
|
||||
# directly; use one of the subclasses instead.
|
||||
#
|
||||
# = Author
|
||||
#
|
||||
# Sean E. Russell <serATgermaneHYPHENsoftwareDOTcom>
|
||||
#
|
||||
# Copyright 2004 Sean E. Russell
|
||||
# This software is available under the Ruby license[LICENSE.txt]
|
||||
#
|
||||
class BarBase < SVG::Graph::Graph
|
||||
# Ensures that :fields are provided in the configuration.
|
||||
def initialize config
|
||||
raise "fields was not supplied or is empty" unless config[:fields] &&
|
||||
config[:fields].kind_of?(Array) &&
|
||||
config[:fields].length > 0
|
||||
super
|
||||
end
|
||||
|
||||
# In addition to the defaults set in Graph::initialize, sets
|
||||
# [bar_gap] true
|
||||
# [stack] :overlap
|
||||
def set_defaults
|
||||
init_with( :bar_gap => true, :stack => :overlap )
|
||||
end
|
||||
|
||||
# Whether to have a gap between the bars or not, default
|
||||
# is true, set to false if you don't want gaps.
|
||||
attr_accessor :bar_gap
|
||||
# How to stack data sets. :overlap overlaps bars with
|
||||
# transparent colors, :top stacks bars on top of one another,
|
||||
# :side stacks the bars side-by-side. Defaults to :overlap.
|
||||
attr_accessor :stack
|
||||
|
||||
|
||||
protected
|
||||
|
||||
def max_value
|
||||
@data.collect{|x| x[:data].max}.max
|
||||
end
|
||||
|
||||
def min_value
|
||||
min = 0
|
||||
if min_scale_value.nil?
|
||||
min = @data.collect{|x| x[:data].min}.min
|
||||
min = min > 0 ? 0 : min
|
||||
else
|
||||
min = min_scale_value
|
||||
end
|
||||
return min
|
||||
end
|
||||
|
||||
def get_css
|
||||
return <<EOL
|
||||
/* default fill styles for multiple datasets (probably only use a single dataset on this graph though) */
|
||||
.key1,.fill1{
|
||||
fill: #ff0000;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 0.5px;
|
||||
}
|
||||
.key2,.fill2{
|
||||
fill: #0000ff;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key3,.fill3{
|
||||
fill: #00ff00;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key4,.fill4{
|
||||
fill: #ffcc00;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key5,.fill5{
|
||||
fill: #00ccff;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key6,.fill6{
|
||||
fill: #ff00ff;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key7,.fill7{
|
||||
fill: #00ffff;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key8,.fill8{
|
||||
fill: #ffff00;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key9,.fill9{
|
||||
fill: #cc6666;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key10,.fill10{
|
||||
fill: #663399;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key11,.fill11{
|
||||
fill: #339900;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key12,.fill12{
|
||||
fill: #9966FF;
|
||||
fill-opacity: 0.5;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
EOL
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,149 +1,149 @@
|
||||
require 'rexml/document'
|
||||
require 'SVG/Graph/BarBase'
|
||||
|
||||
module SVG
|
||||
module Graph
|
||||
# === Create presentation quality SVG horitonzal bar graphs easily
|
||||
#
|
||||
# = Synopsis
|
||||
#
|
||||
# require 'SVG/Graph/BarHorizontal'
|
||||
#
|
||||
# fields = %w(Jan Feb Mar)
|
||||
# data_sales_02 = [12, 45, 21]
|
||||
#
|
||||
# graph = SVG::Graph::BarHorizontal.new({
|
||||
# :height => 500,
|
||||
# :width => 300,
|
||||
# :fields => fields,
|
||||
# })
|
||||
#
|
||||
# graph.add_data({
|
||||
# :data => data_sales_02,
|
||||
# :title => 'Sales 2002',
|
||||
# })
|
||||
#
|
||||
# print "Content-type: image/svg+xml\r\n\r\n"
|
||||
# print graph.burn
|
||||
#
|
||||
# = Description
|
||||
#
|
||||
# This object aims to allow you to easily create high quality
|
||||
# SVG horitonzal bar graphs. You can either use the default style sheet
|
||||
# or supply your own. Either way there are many options which can
|
||||
# be configured to give you control over how the graph is
|
||||
# generated - with or without a key, data elements at each point,
|
||||
# title, subtitle etc.
|
||||
#
|
||||
# = Examples
|
||||
#
|
||||
# * http://germane-software.com/repositories/public/SVG/test/test.rb
|
||||
#
|
||||
# = See also
|
||||
#
|
||||
# * SVG::Graph::Graph
|
||||
# * SVG::Graph::Bar
|
||||
# * SVG::Graph::Line
|
||||
# * SVG::Graph::Pie
|
||||
# * SVG::Graph::Plot
|
||||
# * SVG::Graph::TimeSeries
|
||||
#
|
||||
# == Author
|
||||
#
|
||||
# Sean E. Russell <serATgermaneHYPHENsoftwareDOTcom>
|
||||
#
|
||||
# Copyright 2004 Sean E. Russell
|
||||
# This software is available under the Ruby license[LICENSE.txt]
|
||||
#
|
||||
class BarHorizontal < BarBase
|
||||
# In addition to the defaults set in BarBase::set_defaults, sets
|
||||
# [rotate_y_labels] true
|
||||
# [show_x_guidelines] true
|
||||
# [show_y_guidelines] false
|
||||
def set_defaults
|
||||
super
|
||||
init_with(
|
||||
:rotate_y_labels => true,
|
||||
:show_x_guidelines => true,
|
||||
:show_y_guidelines => false
|
||||
)
|
||||
self.right_align = self.right_font = 1
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def get_x_labels
|
||||
maxvalue = max_value
|
||||
minvalue = min_value
|
||||
range = maxvalue - minvalue
|
||||
top_pad = range == 0 ? 10 : range / 20.0
|
||||
scale_range = (maxvalue + top_pad) - minvalue
|
||||
|
||||
scale_division = scale_divisions || (scale_range / 10.0)
|
||||
|
||||
if scale_integers
|
||||
scale_division = scale_division < 1 ? 1 : scale_division.round
|
||||
end
|
||||
|
||||
rv = []
|
||||
maxvalue = maxvalue%scale_division == 0 ?
|
||||
maxvalue : maxvalue + scale_division
|
||||
minvalue.step( maxvalue, scale_division ) {|v| rv << v}
|
||||
return rv
|
||||
end
|
||||
|
||||
def get_y_labels
|
||||
@config[:fields]
|
||||
end
|
||||
|
||||
def y_label_offset( height )
|
||||
height / -2.0
|
||||
end
|
||||
|
||||
def draw_data
|
||||
minvalue = min_value
|
||||
fieldheight = field_height
|
||||
|
||||
unit_size = (@graph_width.to_f - font_size*2*right_font ) /
|
||||
(get_x_labels.max - get_x_labels.min )
|
||||
bargap = bar_gap ? (fieldheight < 10 ? fieldheight / 2 : 10) : 0
|
||||
|
||||
bar_height = fieldheight - bargap
|
||||
bar_height /= @data.length if stack == :side
|
||||
y_mod = (bar_height / 2) + (font_size / 2)
|
||||
|
||||
field_count = 1
|
||||
@config[:fields].each_index { |i|
|
||||
dataset_count = 0
|
||||
for dataset in @data
|
||||
value = dataset[:data][i]
|
||||
|
||||
top = @graph_height - (fieldheight * field_count)
|
||||
top += (bar_height * dataset_count) if stack == :side
|
||||
# cases (assume 0 = +ve):
|
||||
# value min length left
|
||||
# +ve +ve value.abs - min minvalue.abs
|
||||
# +ve -ve value.abs - 0 minvalue.abs
|
||||
# -ve -ve value.abs - 0 minvalue.abs + value
|
||||
length = (value.abs - (minvalue > 0 ? minvalue : 0)) * unit_size
|
||||
left = (minvalue.abs + (value < 0 ? value : 0)) * unit_size
|
||||
|
||||
@graph.add_element( "rect", {
|
||||
"x" => left.to_s,
|
||||
"y" => top.to_s,
|
||||
"width" => length.to_s,
|
||||
"height" => bar_height.to_s,
|
||||
"class" => "fill#{dataset_count+1}"
|
||||
})
|
||||
|
||||
make_datapoint_text(
|
||||
left+length+5, top+y_mod, value, "text-anchor: start; "
|
||||
)
|
||||
dataset_count += 1
|
||||
end
|
||||
field_count += 1
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
require 'rexml/document'
|
||||
require 'SVG/Graph/BarBase'
|
||||
|
||||
module SVG
|
||||
module Graph
|
||||
# === Create presentation quality SVG horitonzal bar graphs easily
|
||||
#
|
||||
# = Synopsis
|
||||
#
|
||||
# require 'SVG/Graph/BarHorizontal'
|
||||
#
|
||||
# fields = %w(Jan Feb Mar)
|
||||
# data_sales_02 = [12, 45, 21]
|
||||
#
|
||||
# graph = SVG::Graph::BarHorizontal.new({
|
||||
# :height => 500,
|
||||
# :width => 300,
|
||||
# :fields => fields,
|
||||
# })
|
||||
#
|
||||
# graph.add_data({
|
||||
# :data => data_sales_02,
|
||||
# :title => 'Sales 2002',
|
||||
# })
|
||||
#
|
||||
# print "Content-type: image/svg+xml\r\n\r\n"
|
||||
# print graph.burn
|
||||
#
|
||||
# = Description
|
||||
#
|
||||
# This object aims to allow you to easily create high quality
|
||||
# SVG horitonzal bar graphs. You can either use the default style sheet
|
||||
# or supply your own. Either way there are many options which can
|
||||
# be configured to give you control over how the graph is
|
||||
# generated - with or without a key, data elements at each point,
|
||||
# title, subtitle etc.
|
||||
#
|
||||
# = Examples
|
||||
#
|
||||
# * http://germane-software.com/repositories/public/SVG/test/test.rb
|
||||
#
|
||||
# = See also
|
||||
#
|
||||
# * SVG::Graph::Graph
|
||||
# * SVG::Graph::Bar
|
||||
# * SVG::Graph::Line
|
||||
# * SVG::Graph::Pie
|
||||
# * SVG::Graph::Plot
|
||||
# * SVG::Graph::TimeSeries
|
||||
#
|
||||
# == Author
|
||||
#
|
||||
# Sean E. Russell <serATgermaneHYPHENsoftwareDOTcom>
|
||||
#
|
||||
# Copyright 2004 Sean E. Russell
|
||||
# This software is available under the Ruby license[LICENSE.txt]
|
||||
#
|
||||
class BarHorizontal < BarBase
|
||||
# In addition to the defaults set in BarBase::set_defaults, sets
|
||||
# [rotate_y_labels] true
|
||||
# [show_x_guidelines] true
|
||||
# [show_y_guidelines] false
|
||||
def set_defaults
|
||||
super
|
||||
init_with(
|
||||
:rotate_y_labels => true,
|
||||
:show_x_guidelines => true,
|
||||
:show_y_guidelines => false
|
||||
)
|
||||
self.right_align = self.right_font = 1
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def get_x_labels
|
||||
maxvalue = max_value
|
||||
minvalue = min_value
|
||||
range = maxvalue - minvalue
|
||||
top_pad = range == 0 ? 10 : range / 20.0
|
||||
scale_range = (maxvalue + top_pad) - minvalue
|
||||
|
||||
scale_division = scale_divisions || (scale_range / 10.0)
|
||||
|
||||
if scale_integers
|
||||
scale_division = scale_division < 1 ? 1 : scale_division.round
|
||||
end
|
||||
|
||||
rv = []
|
||||
maxvalue = maxvalue%scale_division == 0 ?
|
||||
maxvalue : maxvalue + scale_division
|
||||
minvalue.step( maxvalue, scale_division ) {|v| rv << v}
|
||||
return rv
|
||||
end
|
||||
|
||||
def get_y_labels
|
||||
@config[:fields]
|
||||
end
|
||||
|
||||
def y_label_offset( height )
|
||||
height / -2.0
|
||||
end
|
||||
|
||||
def draw_data
|
||||
minvalue = min_value
|
||||
fieldheight = field_height
|
||||
|
||||
unit_size = (@graph_width.to_f - font_size*2*right_font ) /
|
||||
(get_x_labels.max - get_x_labels.min )
|
||||
bargap = bar_gap ? (fieldheight < 10 ? fieldheight / 2 : 10) : 0
|
||||
|
||||
bar_height = fieldheight - bargap
|
||||
bar_height /= @data.length if stack == :side
|
||||
y_mod = (bar_height / 2) + (font_size / 2)
|
||||
|
||||
field_count = 1
|
||||
@config[:fields].each_index { |i|
|
||||
dataset_count = 0
|
||||
for dataset in @data
|
||||
value = dataset[:data][i]
|
||||
|
||||
top = @graph_height - (fieldheight * field_count)
|
||||
top += (bar_height * dataset_count) if stack == :side
|
||||
# cases (assume 0 = +ve):
|
||||
# value min length left
|
||||
# +ve +ve value.abs - min minvalue.abs
|
||||
# +ve -ve value.abs - 0 minvalue.abs
|
||||
# -ve -ve value.abs - 0 minvalue.abs + value
|
||||
length = (value.abs - (minvalue > 0 ? minvalue : 0)) * unit_size
|
||||
left = (minvalue.abs + (value < 0 ? value : 0)) * unit_size
|
||||
|
||||
@graph.add_element( "rect", {
|
||||
"x" => left.to_s,
|
||||
"y" => top.to_s,
|
||||
"width" => length.to_s,
|
||||
"height" => bar_height.to_s,
|
||||
"class" => "fill#{dataset_count+1}"
|
||||
})
|
||||
|
||||
make_datapoint_text(
|
||||
left+length+5, top+y_mod, value, "text-anchor: start; "
|
||||
)
|
||||
dataset_count += 1
|
||||
end
|
||||
field_count += 1
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,395 +1,395 @@
|
||||
require 'SVG/Graph/Graph'
|
||||
|
||||
module SVG
|
||||
module Graph
|
||||
# === Create presentation quality SVG pie graphs easily
|
||||
#
|
||||
# == Synopsis
|
||||
#
|
||||
# require 'SVG/Graph/Pie'
|
||||
#
|
||||
# fields = %w(Jan Feb Mar)
|
||||
# data_sales_02 = [12, 45, 21]
|
||||
#
|
||||
# graph = SVG::Graph::Pie.new({
|
||||
# :height => 500,
|
||||
# :width => 300,
|
||||
# :fields => fields,
|
||||
# })
|
||||
#
|
||||
# graph.add_data({
|
||||
# :data => data_sales_02,
|
||||
# :title => 'Sales 2002',
|
||||
# })
|
||||
#
|
||||
# print "Content-type: image/svg+xml\r\n\r\n"
|
||||
# print graph.burn();
|
||||
#
|
||||
# == Description
|
||||
#
|
||||
# This object aims to allow you to easily create high quality
|
||||
# SVG pie graphs. You can either use the default style sheet
|
||||
# or supply your own. Either way there are many options which can
|
||||
# be configured to give you control over how the graph is
|
||||
# generated - with or without a key, display percent on pie chart,
|
||||
# title, subtitle etc.
|
||||
#
|
||||
# = Examples
|
||||
#
|
||||
# http://www.germane-software/repositories/public/SVG/test/single.rb
|
||||
#
|
||||
# == See also
|
||||
#
|
||||
# * SVG::Graph::Graph
|
||||
# * SVG::Graph::BarHorizontal
|
||||
# * SVG::Graph::Bar
|
||||
# * SVG::Graph::Line
|
||||
# * SVG::Graph::Plot
|
||||
# * SVG::Graph::TimeSeries
|
||||
#
|
||||
# == Author
|
||||
#
|
||||
# Sean E. Russell <serATgermaneHYPHENsoftwareDOTcom>
|
||||
#
|
||||
# Copyright 2004 Sean E. Russell
|
||||
# This software is available under the Ruby license[LICENSE.txt]
|
||||
#
|
||||
class Pie < Graph
|
||||
# Defaults are those set by Graph::initialize, and
|
||||
# [show_shadow] true
|
||||
# [shadow_offset] 10
|
||||
# [show_data_labels] false
|
||||
# [show_actual_values] false
|
||||
# [show_percent] true
|
||||
# [show_key_data_labels] true
|
||||
# [show_key_actual_values] true
|
||||
# [show_key_percent] false
|
||||
# [expanded] false
|
||||
# [expand_greatest] false
|
||||
# [expand_gap] 10
|
||||
# [show_x_labels] false
|
||||
# [show_y_labels] false
|
||||
# [datapoint_font_size] 12
|
||||
def set_defaults
|
||||
init_with(
|
||||
:show_shadow => true,
|
||||
:shadow_offset => 10,
|
||||
|
||||
:show_data_labels => false,
|
||||
:show_actual_values => false,
|
||||
:show_percent => true,
|
||||
|
||||
:show_key_data_labels => true,
|
||||
:show_key_actual_values => true,
|
||||
:show_key_percent => false,
|
||||
|
||||
:expanded => false,
|
||||
:expand_greatest => false,
|
||||
:expand_gap => 10,
|
||||
|
||||
:show_x_labels => false,
|
||||
:show_y_labels => false,
|
||||
:datapoint_font_size => 12
|
||||
)
|
||||
@data = []
|
||||
end
|
||||
|
||||
# Adds a data set to the graph.
|
||||
#
|
||||
# graph.add_data( { :data => [1,2,3,4] } )
|
||||
#
|
||||
# Note that the :title is not necessary. If multiple
|
||||
# data sets are added to the graph, the pie chart will
|
||||
# display the +sums+ of the data. EG:
|
||||
#
|
||||
# graph.add_data( { :data => [1,2,3,4] } )
|
||||
# graph.add_data( { :data => [2,3,5,9] } )
|
||||
#
|
||||
# is the same as:
|
||||
#
|
||||
# graph.add_data( { :data => [3,5,8,13] } )
|
||||
def add_data arg
|
||||
arg[:data].each_index {|idx|
|
||||
@data[idx] = 0 unless @data[idx]
|
||||
@data[idx] += arg[:data][idx]
|
||||
}
|
||||
end
|
||||
|
||||
# If true, displays a drop shadow for the chart
|
||||
attr_accessor :show_shadow
|
||||
# Sets the offset of the shadow from the pie chart
|
||||
attr_accessor :shadow_offset
|
||||
# If true, display the data labels on the chart
|
||||
attr_accessor :show_data_labels
|
||||
# If true, display the actual field values in the data labels
|
||||
attr_accessor :show_actual_values
|
||||
# If true, display the percentage value of each pie wedge in the data
|
||||
# labels
|
||||
attr_accessor :show_percent
|
||||
# If true, display the labels in the key
|
||||
attr_accessor :show_key_data_labels
|
||||
# If true, display the actual value of the field in the key
|
||||
attr_accessor :show_key_actual_values
|
||||
# If true, display the percentage value of the wedges in the key
|
||||
attr_accessor :show_key_percent
|
||||
# If true, "explode" the pie (put space between the wedges)
|
||||
attr_accessor :expanded
|
||||
# If true, expand the largest pie wedge
|
||||
attr_accessor :expand_greatest
|
||||
# The amount of space between expanded wedges
|
||||
attr_accessor :expand_gap
|
||||
# The font size of the data point labels
|
||||
attr_accessor :datapoint_font_size
|
||||
|
||||
|
||||
protected
|
||||
|
||||
def add_defs defs
|
||||
gradient = defs.add_element( "filter", {
|
||||
"id"=>"dropshadow",
|
||||
"width" => "1.2",
|
||||
"height" => "1.2",
|
||||
} )
|
||||
gradient.add_element( "feGaussianBlur", {
|
||||
"stdDeviation" => "4",
|
||||
"result" => "blur"
|
||||
})
|
||||
end
|
||||
|
||||
# We don't need the graph
|
||||
def draw_graph
|
||||
end
|
||||
|
||||
def get_y_labels
|
||||
[""]
|
||||
end
|
||||
|
||||
def get_x_labels
|
||||
[""]
|
||||
end
|
||||
|
||||
def keys
|
||||
total = 0
|
||||
max_value = 0
|
||||
@data.each {|x| total += x }
|
||||
percent_scale = 100.0 / total
|
||||
count = -1
|
||||
a = @config[:fields].collect{ |x|
|
||||
count += 1
|
||||
v = @data[count]
|
||||
perc = show_key_percent ? " "+(v * percent_scale).round.to_s+"%" : ""
|
||||
x + " [" + v.to_s + "]" + perc
|
||||
}
|
||||
end
|
||||
|
||||
RADIANS = Math::PI/180
|
||||
|
||||
def draw_data
|
||||
@graph = @root.add_element( "g" )
|
||||
background = @graph.add_element("g")
|
||||
midground = @graph.add_element("g")
|
||||
|
||||
diameter = @graph_height > @graph_width ? @graph_width : @graph_height
|
||||
diameter -= expand_gap if expanded or expand_greatest
|
||||
diameter -= datapoint_font_size if show_data_labels
|
||||
diameter -= 10 if show_shadow
|
||||
radius = diameter / 2.0
|
||||
|
||||
xoff = (width - diameter) / 2
|
||||
yoff = (height - @border_bottom - diameter)
|
||||
yoff -= 10 if show_shadow
|
||||
@graph.attributes['transform'] = "translate( #{xoff} #{yoff} )"
|
||||
|
||||
wedge_text_pad = 5
|
||||
wedge_text_pad = 20 if show_percent and show_data_labels
|
||||
|
||||
total = 0
|
||||
max_value = 0
|
||||
@data.each {|x|
|
||||
max_value = max_value < x ? x : max_value
|
||||
total += x
|
||||
}
|
||||
percent_scale = 100.0 / total
|
||||
|
||||
prev_percent = 0
|
||||
rad_mult = 3.6 * RADIANS
|
||||
@config[:fields].each_index { |count|
|
||||
value = @data[count]
|
||||
percent = percent_scale * value
|
||||
|
||||
radians = prev_percent * rad_mult
|
||||
x_start = radius+(Math.sin(radians) * radius)
|
||||
y_start = radius-(Math.cos(radians) * radius)
|
||||
radians = (prev_percent+percent) * rad_mult
|
||||
x_end = radius+(Math.sin(radians) * radius)
|
||||
x_end -= 0.00001 if @data.length == 1
|
||||
y_end = radius-(Math.cos(radians) * radius)
|
||||
path = "M#{radius},#{radius} L#{x_start},#{y_start} "+
|
||||
"A#{radius},#{radius} "+
|
||||
"0, #{percent >= 50 ? '1' : '0'},1, "+
|
||||
"#{x_end} #{y_end} Z"
|
||||
|
||||
|
||||
wedge = @foreground.add_element( "path", {
|
||||
"d" => path,
|
||||
"class" => "fill#{count+1}"
|
||||
})
|
||||
|
||||
translate = nil
|
||||
tx = 0
|
||||
ty = 0
|
||||
half_percent = prev_percent + percent / 2
|
||||
radians = half_percent * rad_mult
|
||||
|
||||
if show_shadow
|
||||
shadow = background.add_element( "path", {
|
||||
"d" => path,
|
||||
"filter" => "url(#dropshadow)",
|
||||
"style" => "fill: #ccc; stroke: none;"
|
||||
})
|
||||
clear = midground.add_element( "path", {
|
||||
"d" => path,
|
||||
"style" => "fill: #fff; stroke: none;"
|
||||
})
|
||||
end
|
||||
|
||||
if expanded or (expand_greatest && value == max_value)
|
||||
tx = (Math.sin(radians) * expand_gap)
|
||||
ty = -(Math.cos(radians) * expand_gap)
|
||||
translate = "translate( #{tx} #{ty} )"
|
||||
wedge.attributes["transform"] = translate
|
||||
clear.attributes["transform"] = translate if clear
|
||||
end
|
||||
|
||||
if show_shadow
|
||||
shadow.attributes["transform"] =
|
||||
"translate( #{tx+shadow_offset} #{ty+shadow_offset} )"
|
||||
end
|
||||
|
||||
if show_data_labels and value != 0
|
||||
label = ""
|
||||
label += @config[:fields][count] if show_key_data_labels
|
||||
label += " ["+value.to_s+"]" if show_actual_values
|
||||
label += " "+percent.round.to_s+"%" if show_percent
|
||||
|
||||
msr = Math.sin(radians)
|
||||
mcr = Math.cos(radians)
|
||||
tx = radius + (msr * radius)
|
||||
ty = radius -(mcr * radius)
|
||||
|
||||
if expanded or (expand_greatest && value == max_value)
|
||||
tx += (msr * expand_gap)
|
||||
ty -= (mcr * expand_gap)
|
||||
end
|
||||
@foreground.add_element( "text", {
|
||||
"x" => tx.to_s,
|
||||
"y" => ty.to_s,
|
||||
"class" => "dataPointLabel",
|
||||
"style" => "stroke: #fff; stroke-width: 2;"
|
||||
}).text = label.to_s
|
||||
@foreground.add_element( "text", {
|
||||
"x" => tx.to_s,
|
||||
"y" => ty.to_s,
|
||||
"class" => "dataPointLabel",
|
||||
}).text = label.to_s
|
||||
end
|
||||
|
||||
prev_percent += percent
|
||||
}
|
||||
end
|
||||
|
||||
|
||||
def round val, to
|
||||
up = 10**to.to_f
|
||||
(val * up).to_i / up
|
||||
end
|
||||
|
||||
|
||||
def get_css
|
||||
return <<EOL
|
||||
.dataPointLabel{
|
||||
fill: #000000;
|
||||
text-anchor:middle;
|
||||
font-size: #{datapoint_font_size}px;
|
||||
font-family: "Arial", sans-serif;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
/* key - MUST match fill styles */
|
||||
.key1,.fill1{
|
||||
fill: #ff0000;
|
||||
fill-opacity: 0.7;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key2,.fill2{
|
||||
fill: #0000ff;
|
||||
fill-opacity: 0.7;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key3,.fill3{
|
||||
fill-opacity: 0.7;
|
||||
fill: #00ff00;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key4,.fill4{
|
||||
fill-opacity: 0.7;
|
||||
fill: #ffcc00;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key5,.fill5{
|
||||
fill-opacity: 0.7;
|
||||
fill: #00ccff;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key6,.fill6{
|
||||
fill-opacity: 0.7;
|
||||
fill: #ff00ff;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key7,.fill7{
|
||||
fill-opacity: 0.7;
|
||||
fill: #00ff99;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key8,.fill8{
|
||||
fill-opacity: 0.7;
|
||||
fill: #ffff00;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key9,.fill9{
|
||||
fill-opacity: 0.7;
|
||||
fill: #cc6666;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key10,.fill10{
|
||||
fill-opacity: 0.7;
|
||||
fill: #663399;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key11,.fill11{
|
||||
fill-opacity: 0.7;
|
||||
fill: #339900;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key12,.fill12{
|
||||
fill-opacity: 0.7;
|
||||
fill: #9966FF;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
EOL
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
require 'SVG/Graph/Graph'
|
||||
|
||||
module SVG
|
||||
module Graph
|
||||
# === Create presentation quality SVG pie graphs easily
|
||||
#
|
||||
# == Synopsis
|
||||
#
|
||||
# require 'SVG/Graph/Pie'
|
||||
#
|
||||
# fields = %w(Jan Feb Mar)
|
||||
# data_sales_02 = [12, 45, 21]
|
||||
#
|
||||
# graph = SVG::Graph::Pie.new({
|
||||
# :height => 500,
|
||||
# :width => 300,
|
||||
# :fields => fields,
|
||||
# })
|
||||
#
|
||||
# graph.add_data({
|
||||
# :data => data_sales_02,
|
||||
# :title => 'Sales 2002',
|
||||
# })
|
||||
#
|
||||
# print "Content-type: image/svg+xml\r\n\r\n"
|
||||
# print graph.burn();
|
||||
#
|
||||
# == Description
|
||||
#
|
||||
# This object aims to allow you to easily create high quality
|
||||
# SVG pie graphs. You can either use the default style sheet
|
||||
# or supply your own. Either way there are many options which can
|
||||
# be configured to give you control over how the graph is
|
||||
# generated - with or without a key, display percent on pie chart,
|
||||
# title, subtitle etc.
|
||||
#
|
||||
# = Examples
|
||||
#
|
||||
# http://www.germane-software/repositories/public/SVG/test/single.rb
|
||||
#
|
||||
# == See also
|
||||
#
|
||||
# * SVG::Graph::Graph
|
||||
# * SVG::Graph::BarHorizontal
|
||||
# * SVG::Graph::Bar
|
||||
# * SVG::Graph::Line
|
||||
# * SVG::Graph::Plot
|
||||
# * SVG::Graph::TimeSeries
|
||||
#
|
||||
# == Author
|
||||
#
|
||||
# Sean E. Russell <serATgermaneHYPHENsoftwareDOTcom>
|
||||
#
|
||||
# Copyright 2004 Sean E. Russell
|
||||
# This software is available under the Ruby license[LICENSE.txt]
|
||||
#
|
||||
class Pie < Graph
|
||||
# Defaults are those set by Graph::initialize, and
|
||||
# [show_shadow] true
|
||||
# [shadow_offset] 10
|
||||
# [show_data_labels] false
|
||||
# [show_actual_values] false
|
||||
# [show_percent] true
|
||||
# [show_key_data_labels] true
|
||||
# [show_key_actual_values] true
|
||||
# [show_key_percent] false
|
||||
# [expanded] false
|
||||
# [expand_greatest] false
|
||||
# [expand_gap] 10
|
||||
# [show_x_labels] false
|
||||
# [show_y_labels] false
|
||||
# [datapoint_font_size] 12
|
||||
def set_defaults
|
||||
init_with(
|
||||
:show_shadow => true,
|
||||
:shadow_offset => 10,
|
||||
|
||||
:show_data_labels => false,
|
||||
:show_actual_values => false,
|
||||
:show_percent => true,
|
||||
|
||||
:show_key_data_labels => true,
|
||||
:show_key_actual_values => true,
|
||||
:show_key_percent => false,
|
||||
|
||||
:expanded => false,
|
||||
:expand_greatest => false,
|
||||
:expand_gap => 10,
|
||||
|
||||
:show_x_labels => false,
|
||||
:show_y_labels => false,
|
||||
:datapoint_font_size => 12
|
||||
)
|
||||
@data = []
|
||||
end
|
||||
|
||||
# Adds a data set to the graph.
|
||||
#
|
||||
# graph.add_data( { :data => [1,2,3,4] } )
|
||||
#
|
||||
# Note that the :title is not necessary. If multiple
|
||||
# data sets are added to the graph, the pie chart will
|
||||
# display the +sums+ of the data. EG:
|
||||
#
|
||||
# graph.add_data( { :data => [1,2,3,4] } )
|
||||
# graph.add_data( { :data => [2,3,5,9] } )
|
||||
#
|
||||
# is the same as:
|
||||
#
|
||||
# graph.add_data( { :data => [3,5,8,13] } )
|
||||
def add_data arg
|
||||
arg[:data].each_index {|idx|
|
||||
@data[idx] = 0 unless @data[idx]
|
||||
@data[idx] += arg[:data][idx]
|
||||
}
|
||||
end
|
||||
|
||||
# If true, displays a drop shadow for the chart
|
||||
attr_accessor :show_shadow
|
||||
# Sets the offset of the shadow from the pie chart
|
||||
attr_accessor :shadow_offset
|
||||
# If true, display the data labels on the chart
|
||||
attr_accessor :show_data_labels
|
||||
# If true, display the actual field values in the data labels
|
||||
attr_accessor :show_actual_values
|
||||
# If true, display the percentage value of each pie wedge in the data
|
||||
# labels
|
||||
attr_accessor :show_percent
|
||||
# If true, display the labels in the key
|
||||
attr_accessor :show_key_data_labels
|
||||
# If true, display the actual value of the field in the key
|
||||
attr_accessor :show_key_actual_values
|
||||
# If true, display the percentage value of the wedges in the key
|
||||
attr_accessor :show_key_percent
|
||||
# If true, "explode" the pie (put space between the wedges)
|
||||
attr_accessor :expanded
|
||||
# If true, expand the largest pie wedge
|
||||
attr_accessor :expand_greatest
|
||||
# The amount of space between expanded wedges
|
||||
attr_accessor :expand_gap
|
||||
# The font size of the data point labels
|
||||
attr_accessor :datapoint_font_size
|
||||
|
||||
|
||||
protected
|
||||
|
||||
def add_defs defs
|
||||
gradient = defs.add_element( "filter", {
|
||||
"id"=>"dropshadow",
|
||||
"width" => "1.2",
|
||||
"height" => "1.2",
|
||||
} )
|
||||
gradient.add_element( "feGaussianBlur", {
|
||||
"stdDeviation" => "4",
|
||||
"result" => "blur"
|
||||
})
|
||||
end
|
||||
|
||||
# We don't need the graph
|
||||
def draw_graph
|
||||
end
|
||||
|
||||
def get_y_labels
|
||||
[""]
|
||||
end
|
||||
|
||||
def get_x_labels
|
||||
[""]
|
||||
end
|
||||
|
||||
def keys
|
||||
total = 0
|
||||
max_value = 0
|
||||
@data.each {|x| total += x }
|
||||
percent_scale = 100.0 / total
|
||||
count = -1
|
||||
a = @config[:fields].collect{ |x|
|
||||
count += 1
|
||||
v = @data[count]
|
||||
perc = show_key_percent ? " "+(v * percent_scale).round.to_s+"%" : ""
|
||||
x + " [" + v.to_s + "]" + perc
|
||||
}
|
||||
end
|
||||
|
||||
RADIANS = Math::PI/180
|
||||
|
||||
def draw_data
|
||||
@graph = @root.add_element( "g" )
|
||||
background = @graph.add_element("g")
|
||||
midground = @graph.add_element("g")
|
||||
|
||||
diameter = @graph_height > @graph_width ? @graph_width : @graph_height
|
||||
diameter -= expand_gap if expanded or expand_greatest
|
||||
diameter -= datapoint_font_size if show_data_labels
|
||||
diameter -= 10 if show_shadow
|
||||
radius = diameter / 2.0
|
||||
|
||||
xoff = (width - diameter) / 2
|
||||
yoff = (height - @border_bottom - diameter)
|
||||
yoff -= 10 if show_shadow
|
||||
@graph.attributes['transform'] = "translate( #{xoff} #{yoff} )"
|
||||
|
||||
wedge_text_pad = 5
|
||||
wedge_text_pad = 20 if show_percent and show_data_labels
|
||||
|
||||
total = 0
|
||||
max_value = 0
|
||||
@data.each {|x|
|
||||
max_value = max_value < x ? x : max_value
|
||||
total += x
|
||||
}
|
||||
percent_scale = 100.0 / total
|
||||
|
||||
prev_percent = 0
|
||||
rad_mult = 3.6 * RADIANS
|
||||
@config[:fields].each_index { |count|
|
||||
value = @data[count]
|
||||
percent = percent_scale * value
|
||||
|
||||
radians = prev_percent * rad_mult
|
||||
x_start = radius+(Math.sin(radians) * radius)
|
||||
y_start = radius-(Math.cos(radians) * radius)
|
||||
radians = (prev_percent+percent) * rad_mult
|
||||
x_end = radius+(Math.sin(radians) * radius)
|
||||
x_end -= 0.00001 if @data.length == 1
|
||||
y_end = radius-(Math.cos(radians) * radius)
|
||||
path = "M#{radius},#{radius} L#{x_start},#{y_start} "+
|
||||
"A#{radius},#{radius} "+
|
||||
"0, #{percent >= 50 ? '1' : '0'},1, "+
|
||||
"#{x_end} #{y_end} Z"
|
||||
|
||||
|
||||
wedge = @foreground.add_element( "path", {
|
||||
"d" => path,
|
||||
"class" => "fill#{count+1}"
|
||||
})
|
||||
|
||||
translate = nil
|
||||
tx = 0
|
||||
ty = 0
|
||||
half_percent = prev_percent + percent / 2
|
||||
radians = half_percent * rad_mult
|
||||
|
||||
if show_shadow
|
||||
shadow = background.add_element( "path", {
|
||||
"d" => path,
|
||||
"filter" => "url(#dropshadow)",
|
||||
"style" => "fill: #ccc; stroke: none;"
|
||||
})
|
||||
clear = midground.add_element( "path", {
|
||||
"d" => path,
|
||||
"style" => "fill: #fff; stroke: none;"
|
||||
})
|
||||
end
|
||||
|
||||
if expanded or (expand_greatest && value == max_value)
|
||||
tx = (Math.sin(radians) * expand_gap)
|
||||
ty = -(Math.cos(radians) * expand_gap)
|
||||
translate = "translate( #{tx} #{ty} )"
|
||||
wedge.attributes["transform"] = translate
|
||||
clear.attributes["transform"] = translate if clear
|
||||
end
|
||||
|
||||
if show_shadow
|
||||
shadow.attributes["transform"] =
|
||||
"translate( #{tx+shadow_offset} #{ty+shadow_offset} )"
|
||||
end
|
||||
|
||||
if show_data_labels and value != 0
|
||||
label = ""
|
||||
label += @config[:fields][count] if show_key_data_labels
|
||||
label += " ["+value.to_s+"]" if show_actual_values
|
||||
label += " "+percent.round.to_s+"%" if show_percent
|
||||
|
||||
msr = Math.sin(radians)
|
||||
mcr = Math.cos(radians)
|
||||
tx = radius + (msr * radius)
|
||||
ty = radius -(mcr * radius)
|
||||
|
||||
if expanded or (expand_greatest && value == max_value)
|
||||
tx += (msr * expand_gap)
|
||||
ty -= (mcr * expand_gap)
|
||||
end
|
||||
@foreground.add_element( "text", {
|
||||
"x" => tx.to_s,
|
||||
"y" => ty.to_s,
|
||||
"class" => "dataPointLabel",
|
||||
"style" => "stroke: #fff; stroke-width: 2;"
|
||||
}).text = label.to_s
|
||||
@foreground.add_element( "text", {
|
||||
"x" => tx.to_s,
|
||||
"y" => ty.to_s,
|
||||
"class" => "dataPointLabel",
|
||||
}).text = label.to_s
|
||||
end
|
||||
|
||||
prev_percent += percent
|
||||
}
|
||||
end
|
||||
|
||||
|
||||
def round val, to
|
||||
up = 10**to.to_f
|
||||
(val * up).to_i / up
|
||||
end
|
||||
|
||||
|
||||
def get_css
|
||||
return <<EOL
|
||||
.dataPointLabel{
|
||||
fill: #000000;
|
||||
text-anchor:middle;
|
||||
font-size: #{datapoint_font_size}px;
|
||||
font-family: "Arial", sans-serif;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
/* key - MUST match fill styles */
|
||||
.key1,.fill1{
|
||||
fill: #ff0000;
|
||||
fill-opacity: 0.7;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key2,.fill2{
|
||||
fill: #0000ff;
|
||||
fill-opacity: 0.7;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key3,.fill3{
|
||||
fill-opacity: 0.7;
|
||||
fill: #00ff00;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key4,.fill4{
|
||||
fill-opacity: 0.7;
|
||||
fill: #ffcc00;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key5,.fill5{
|
||||
fill-opacity: 0.7;
|
||||
fill: #00ccff;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key6,.fill6{
|
||||
fill-opacity: 0.7;
|
||||
fill: #ff00ff;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key7,.fill7{
|
||||
fill-opacity: 0.7;
|
||||
fill: #00ff99;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key8,.fill8{
|
||||
fill-opacity: 0.7;
|
||||
fill: #ffff00;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key9,.fill9{
|
||||
fill-opacity: 0.7;
|
||||
fill: #cc6666;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key10,.fill10{
|
||||
fill-opacity: 0.7;
|
||||
fill: #663399;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key11,.fill11{
|
||||
fill-opacity: 0.7;
|
||||
fill: #339900;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
.key12,.fill12{
|
||||
fill-opacity: 0.7;
|
||||
fill: #9966FF;
|
||||
stroke: none;
|
||||
stroke-width: 1px;
|
||||
}
|
||||
EOL
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,238 +1,238 @@
|
||||
require 'SVG/Graph/Plot'
|
||||
|
||||
module SVG
|
||||
module Graph
|
||||
# === For creating SVG plots of scalar temporal data
|
||||
#
|
||||
# = Synopsis
|
||||
#
|
||||
# require 'SVG/Graph/TimeSeriess'
|
||||
#
|
||||
# # Data sets are x,y pairs
|
||||
# data1 = ["6/17/72", 11, "1/11/72", 7, "4/13/04 17:31", 11,
|
||||
# "9/11/01", 9, "9/1/85", 2, "9/1/88", 1, "1/15/95", 13]
|
||||
# data2 = ["8/1/73", 18, "3/1/77", 15, "10/1/98", 4,
|
||||
# "5/1/02", 14, "3/1/95", 6, "8/1/91", 12, "12/1/87", 6,
|
||||
# "5/1/84", 17, "10/1/80", 12]
|
||||
#
|
||||
# graph = SVG::Graph::TimeSeries.new( {
|
||||
# :width => 640,
|
||||
# :height => 480,
|
||||
# :graph_title => title,
|
||||
# :show_graph_title => true,
|
||||
# :no_css => true,
|
||||
# :key => true,
|
||||
# :scale_x_integers => true,
|
||||
# :scale_y_integers => true,
|
||||
# :min_x_value => 0,
|
||||
# :min_y_value => 0,
|
||||
# :show_data_labels => true,
|
||||
# :show_x_guidelines => true,
|
||||
# :show_x_title => true,
|
||||
# :x_title => "Time",
|
||||
# :show_y_title => true,
|
||||
# :y_title => "Ice Cream Cones",
|
||||
# :y_title_text_direction => :bt,
|
||||
# :stagger_x_labels => true,
|
||||
# :x_label_format => "%m/%d/%y",
|
||||
# })
|
||||
#
|
||||
# graph.add_data({
|
||||
# :data => projection
|
||||
# :title => 'Projected',
|
||||
# })
|
||||
#
|
||||
# graph.add_data({
|
||||
# :data => actual,
|
||||
# :title => 'Actual',
|
||||
# })
|
||||
#
|
||||
# print graph.burn()
|
||||
#
|
||||
# = Description
|
||||
#
|
||||
# Produces a graph of temporal scalar data.
|
||||
#
|
||||
# = Examples
|
||||
#
|
||||
# http://www.germane-software/repositories/public/SVG/test/timeseries.rb
|
||||
#
|
||||
# = Notes
|
||||
#
|
||||
# The default stylesheet handles upto 10 data sets, if you
|
||||
# use more you must create your own stylesheet and add the
|
||||
# additional settings for the extra data sets. You will know
|
||||
# if you go over 10 data sets as they will have no style and
|
||||
# be in black.
|
||||
#
|
||||
# Unlike the other types of charts, data sets must contain x,y pairs:
|
||||
#
|
||||
# [ "12:30", 2 ] # A data set with 1 point: ("12:30",2)
|
||||
# [ "01:00",2, "14:20",6] # A data set with 2 points: ("01:00",2) and
|
||||
# # ("14:20",6)
|
||||
#
|
||||
# Note that multiple data sets within the same chart can differ in length,
|
||||
# and that the data in the datasets needn't be in order; they will be ordered
|
||||
# by the plot along the X-axis.
|
||||
#
|
||||
# The dates must be parseable by ParseDate, but otherwise can be
|
||||
# any order of magnitude (seconds within the hour, or years)
|
||||
#
|
||||
# = See also
|
||||
#
|
||||
# * SVG::Graph::Graph
|
||||
# * SVG::Graph::BarHorizontal
|
||||
# * SVG::Graph::Bar
|
||||
# * SVG::Graph::Line
|
||||
# * SVG::Graph::Pie
|
||||
# * SVG::Graph::Plot
|
||||
#
|
||||
# == Author
|
||||
#
|
||||
# Sean E. Russell <serATgermaneHYPHENsoftwareDOTcom>
|
||||
#
|
||||
# Copyright 2004 Sean E. Russell
|
||||
# This software is available under the Ruby license[LICENSE.txt]
|
||||
#
|
||||
class TimeSeries < Plot
|
||||
# In addition to the defaults set by Graph::initialize and
|
||||
# Plot::set_defaults, sets:
|
||||
# [x_label_format] '%Y-%m-%d %H:%M:%S'
|
||||
# [popup_format] '%Y-%m-%d %H:%M:%S'
|
||||
def set_defaults
|
||||
super
|
||||
init_with(
|
||||
#:max_time_span => '',
|
||||
:x_label_format => '%Y-%m-%d %H:%M:%S',
|
||||
:popup_format => '%Y-%m-%d %H:%M:%S'
|
||||
)
|
||||
end
|
||||
|
||||
# The format string use do format the X axis labels.
|
||||
# See Time::strformat
|
||||
attr_accessor :x_label_format
|
||||
# Use this to set the spacing between dates on the axis. The value
|
||||
# must be of the form
|
||||
# "\d+ ?(days|weeks|months|years|hours|minutes|seconds)?"
|
||||
#
|
||||
# EG:
|
||||
#
|
||||
# graph.timescale_divisions = "2 weeks"
|
||||
#
|
||||
# will cause the chart to try to divide the X axis up into segments of
|
||||
# two week periods.
|
||||
attr_accessor :timescale_divisions
|
||||
# The formatting used for the popups. See x_label_format
|
||||
attr_accessor :popup_format
|
||||
|
||||
# Add data to the plot.
|
||||
#
|
||||
# d1 = [ "12:30", 2 ] # A data set with 1 point: ("12:30",2)
|
||||
# d2 = [ "01:00",2, "14:20",6] # A data set with 2 points: ("01:00",2) and
|
||||
# # ("14:20",6)
|
||||
# graph.add_data(
|
||||
# :data => d1,
|
||||
# :title => 'One'
|
||||
# )
|
||||
# graph.add_data(
|
||||
# :data => d2,
|
||||
# :title => 'Two'
|
||||
# )
|
||||
#
|
||||
# Note that the data must be in time,value pairs, and that the date format
|
||||
# may be any date that is parseable by ParseDate.
|
||||
def add_data data
|
||||
@data = [] unless @data
|
||||
|
||||
raise "No data provided by #{@data.inspect}" unless data[:data] and
|
||||
data[:data].kind_of? Array
|
||||
raise "Data supplied must be x,y pairs! "+
|
||||
"The data provided contained an odd set of "+
|
||||
"data points" unless data[:data].length % 2 == 0
|
||||
return if data[:data].length == 0
|
||||
|
||||
|
||||
x = []
|
||||
y = []
|
||||
data[:data].each_index {|i|
|
||||
if i%2 == 0
|
||||
t = DateTime.parse( data[:data][i] ).to_time
|
||||
x << t.to_i
|
||||
else
|
||||
y << data[:data][i]
|
||||
end
|
||||
}
|
||||
sort( x, y )
|
||||
data[:data] = [x,y]
|
||||
@data << data
|
||||
end
|
||||
|
||||
|
||||
protected
|
||||
|
||||
def min_x_value=(value)
|
||||
@min_x_value = DateTime.parse( value ).to_time
|
||||
end
|
||||
|
||||
|
||||
def format x, y
|
||||
Time.at( x ).strftime( popup_format )
|
||||
end
|
||||
|
||||
def get_x_labels
|
||||
get_x_values.collect { |v| Time.at(v).strftime( x_label_format ) }
|
||||
end
|
||||
|
||||
private
|
||||
def get_x_values
|
||||
rv = []
|
||||
min, max, scale_division = x_range
|
||||
if timescale_divisions
|
||||
timescale_divisions =~ /(\d+) ?(day|week|month|year|hour|minute|second)?/
|
||||
division_units = $2 ? $2 : "day"
|
||||
amount = $1.to_i
|
||||
if amount
|
||||
step = nil
|
||||
case division_units
|
||||
when "month"
|
||||
cur = min
|
||||
while cur < max
|
||||
rv << cur
|
||||
arr = Time.at( cur ).to_a
|
||||
arr[4] += amount
|
||||
if arr[4] > 12
|
||||
arr[5] += (arr[4] / 12).to_i
|
||||
arr[4] = (arr[4] % 12)
|
||||
end
|
||||
cur = Time.local(*arr).to_i
|
||||
end
|
||||
when "year"
|
||||
cur = min
|
||||
while cur < max
|
||||
rv << cur
|
||||
arr = Time.at( cur ).to_a
|
||||
arr[5] += amount
|
||||
cur = Time.local(*arr).to_i
|
||||
end
|
||||
when "week"
|
||||
step = 7 * 24 * 60 * 60 * amount
|
||||
when "day"
|
||||
step = 24 * 60 * 60 * amount
|
||||
when "hour"
|
||||
step = 60 * 60 * amount
|
||||
when "minute"
|
||||
step = 60 * amount
|
||||
when "second"
|
||||
step = amount
|
||||
end
|
||||
min.step( max, step ) {|v| rv << v} if step
|
||||
|
||||
return rv
|
||||
end
|
||||
end
|
||||
min.step( max, scale_division ) {|v| rv << v}
|
||||
return rv
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
require 'SVG/Graph/Plot'
|
||||
|
||||
module SVG
|
||||
module Graph
|
||||
# === For creating SVG plots of scalar temporal data
|
||||
#
|
||||
# = Synopsis
|
||||
#
|
||||
# require 'SVG/Graph/TimeSeriess'
|
||||
#
|
||||
# # Data sets are x,y pairs
|
||||
# data1 = ["6/17/72", 11, "1/11/72", 7, "4/13/04 17:31", 11,
|
||||
# "9/11/01", 9, "9/1/85", 2, "9/1/88", 1, "1/15/95", 13]
|
||||
# data2 = ["8/1/73", 18, "3/1/77", 15, "10/1/98", 4,
|
||||
# "5/1/02", 14, "3/1/95", 6, "8/1/91", 12, "12/1/87", 6,
|
||||
# "5/1/84", 17, "10/1/80", 12]
|
||||
#
|
||||
# graph = SVG::Graph::TimeSeries.new( {
|
||||
# :width => 640,
|
||||
# :height => 480,
|
||||
# :graph_title => title,
|
||||
# :show_graph_title => true,
|
||||
# :no_css => true,
|
||||
# :key => true,
|
||||
# :scale_x_integers => true,
|
||||
# :scale_y_integers => true,
|
||||
# :min_x_value => 0,
|
||||
# :min_y_value => 0,
|
||||
# :show_data_labels => true,
|
||||
# :show_x_guidelines => true,
|
||||
# :show_x_title => true,
|
||||
# :x_title => "Time",
|
||||
# :show_y_title => true,
|
||||
# :y_title => "Ice Cream Cones",
|
||||
# :y_title_text_direction => :bt,
|
||||
# :stagger_x_labels => true,
|
||||
# :x_label_format => "%m/%d/%y",
|
||||
# })
|
||||
#
|
||||
# graph.add_data({
|
||||
# :data => projection
|
||||
# :title => 'Projected',
|
||||
# })
|
||||
#
|
||||
# graph.add_data({
|
||||
# :data => actual,
|
||||
# :title => 'Actual',
|
||||
# })
|
||||
#
|
||||
# print graph.burn()
|
||||
#
|
||||
# = Description
|
||||
#
|
||||
# Produces a graph of temporal scalar data.
|
||||
#
|
||||
# = Examples
|
||||
#
|
||||
# http://www.germane-software/repositories/public/SVG/test/timeseries.rb
|
||||
#
|
||||
# = Notes
|
||||
#
|
||||
# The default stylesheet handles upto 10 data sets, if you
|
||||
# use more you must create your own stylesheet and add the
|
||||
# additional settings for the extra data sets. You will know
|
||||
# if you go over 10 data sets as they will have no style and
|
||||
# be in black.
|
||||
#
|
||||
# Unlike the other types of charts, data sets must contain x,y pairs:
|
||||
#
|
||||
# [ "12:30", 2 ] # A data set with 1 point: ("12:30",2)
|
||||
# [ "01:00",2, "14:20",6] # A data set with 2 points: ("01:00",2) and
|
||||
# # ("14:20",6)
|
||||
#
|
||||
# Note that multiple data sets within the same chart can differ in length,
|
||||
# and that the data in the datasets needn't be in order; they will be ordered
|
||||
# by the plot along the X-axis.
|
||||
#
|
||||
# The dates must be parseable by ParseDate, but otherwise can be
|
||||
# any order of magnitude (seconds within the hour, or years)
|
||||
#
|
||||
# = See also
|
||||
#
|
||||
# * SVG::Graph::Graph
|
||||
# * SVG::Graph::BarHorizontal
|
||||
# * SVG::Graph::Bar
|
||||
# * SVG::Graph::Line
|
||||
# * SVG::Graph::Pie
|
||||
# * SVG::Graph::Plot
|
||||
#
|
||||
# == Author
|
||||
#
|
||||
# Sean E. Russell <serATgermaneHYPHENsoftwareDOTcom>
|
||||
#
|
||||
# Copyright 2004 Sean E. Russell
|
||||
# This software is available under the Ruby license[LICENSE.txt]
|
||||
#
|
||||
class TimeSeries < Plot
|
||||
# In addition to the defaults set by Graph::initialize and
|
||||
# Plot::set_defaults, sets:
|
||||
# [x_label_format] '%Y-%m-%d %H:%M:%S'
|
||||
# [popup_format] '%Y-%m-%d %H:%M:%S'
|
||||
def set_defaults
|
||||
super
|
||||
init_with(
|
||||
#:max_time_span => '',
|
||||
:x_label_format => '%Y-%m-%d %H:%M:%S',
|
||||
:popup_format => '%Y-%m-%d %H:%M:%S'
|
||||
)
|
||||
end
|
||||
|
||||
# The format string use do format the X axis labels.
|
||||
# See Time::strformat
|
||||
attr_accessor :x_label_format
|
||||
# Use this to set the spacing between dates on the axis. The value
|
||||
# must be of the form
|
||||
# "\d+ ?(days|weeks|months|years|hours|minutes|seconds)?"
|
||||
#
|
||||
# EG:
|
||||
#
|
||||
# graph.timescale_divisions = "2 weeks"
|
||||
#
|
||||
# will cause the chart to try to divide the X axis up into segments of
|
||||
# two week periods.
|
||||
attr_accessor :timescale_divisions
|
||||
# The formatting used for the popups. See x_label_format
|
||||
attr_accessor :popup_format
|
||||
|
||||
# Add data to the plot.
|
||||
#
|
||||
# d1 = [ "12:30", 2 ] # A data set with 1 point: ("12:30",2)
|
||||
# d2 = [ "01:00",2, "14:20",6] # A data set with 2 points: ("01:00",2) and
|
||||
# # ("14:20",6)
|
||||
# graph.add_data(
|
||||
# :data => d1,
|
||||
# :title => 'One'
|
||||
# )
|
||||
# graph.add_data(
|
||||
# :data => d2,
|
||||
# :title => 'Two'
|
||||
# )
|
||||
#
|
||||
# Note that the data must be in time,value pairs, and that the date format
|
||||
# may be any date that is parseable by ParseDate.
|
||||
def add_data data
|
||||
@data = [] unless @data
|
||||
|
||||
raise "No data provided by #{@data.inspect}" unless data[:data] and
|
||||
data[:data].kind_of? Array
|
||||
raise "Data supplied must be x,y pairs! "+
|
||||
"The data provided contained an odd set of "+
|
||||
"data points" unless data[:data].length % 2 == 0
|
||||
return if data[:data].length == 0
|
||||
|
||||
|
||||
x = []
|
||||
y = []
|
||||
data[:data].each_index {|i|
|
||||
if i%2 == 0
|
||||
t = DateTime.parse( data[:data][i] ).to_time
|
||||
x << t.to_i
|
||||
else
|
||||
y << data[:data][i]
|
||||
end
|
||||
}
|
||||
sort( x, y )
|
||||
data[:data] = [x,y]
|
||||
@data << data
|
||||
end
|
||||
|
||||
|
||||
protected
|
||||
|
||||
def min_x_value=(value)
|
||||
@min_x_value = DateTime.parse( data[:data][i] ).to_time
|
||||
end
|
||||
|
||||
|
||||
def format x, y
|
||||
Time.at( x ).strftime( popup_format )
|
||||
end
|
||||
|
||||
def get_x_labels
|
||||
get_x_values.collect { |v| Time.at(v).strftime( x_label_format ) }
|
||||
end
|
||||
|
||||
private
|
||||
def get_x_values
|
||||
rv = []
|
||||
min, max, scale_division = x_range
|
||||
if timescale_divisions
|
||||
timescale_divisions =~ /(\d+) ?(day|week|month|year|hour|minute|second)?/
|
||||
division_units = $2 ? $2 : "day"
|
||||
amount = $1.to_i
|
||||
if amount
|
||||
step = nil
|
||||
case division_units
|
||||
when "month"
|
||||
cur = min
|
||||
while cur < max
|
||||
rv << cur
|
||||
arr = Time.at( cur ).to_a
|
||||
arr[4] += amount
|
||||
if arr[4] > 12
|
||||
arr[5] += (arr[4] / 12).to_i
|
||||
arr[4] = (arr[4] % 12)
|
||||
end
|
||||
cur = Time.local(*arr).to_i
|
||||
end
|
||||
when "year"
|
||||
cur = min
|
||||
while cur < max
|
||||
rv << cur
|
||||
arr = Time.at( cur ).to_a
|
||||
arr[5] += amount
|
||||
cur = Time.local(*arr).to_i
|
||||
end
|
||||
when "week"
|
||||
step = 7 * 24 * 60 * 60 * amount
|
||||
when "day"
|
||||
step = 24 * 60 * 60 * amount
|
||||
when "hour"
|
||||
step = 60 * 60 * amount
|
||||
when "minute"
|
||||
step = 60 * amount
|
||||
when "second"
|
||||
step = amount
|
||||
end
|
||||
min.step( max, step ) {|v| rv << v} if step
|
||||
|
||||
return rv
|
||||
end
|
||||
end
|
||||
min.step( max, scale_division ) {|v| rv << v}
|
||||
return rv
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -10,6 +10,10 @@ A template plugin allowing the inclusion of ERB-enabled RFPDF template files.
|
||||
==
|
||||
==
|
||||
|
||||
If you are using HTML, it is recommended you install:
|
||||
|
||||
gem install -r htmlentities
|
||||
|
||||
TCPDF Documentation located at:
|
||||
|
||||
http://phpdocs.moodle.org/com-tecnick-tcpdf/TCPDF.html
|
||||
@@ -38,4 +42,4 @@ to:
|
||||
|
||||
pdf = TCPDF.new
|
||||
|
||||
ENJOY!
|
||||
ENJOY!
|
||||
@@ -1,3 +1,8 @@
|
||||
begin
|
||||
require('htmlentities')
|
||||
rescue LoadError
|
||||
# This gem is not required - just nice to have.
|
||||
end
|
||||
require('cgi')
|
||||
require 'rfpdf'
|
||||
|
||||
|
||||
@@ -94,6 +94,8 @@ class TCPDF
|
||||
cattr_accessor :k_path_url_cache
|
||||
@@k_path_url_cache = Rails.root.join('tmp')
|
||||
|
||||
cattr_accessor :decoder
|
||||
|
||||
attr_accessor :barcode
|
||||
|
||||
attr_accessor :buffer
|
||||
@@ -221,6 +223,12 @@ class TCPDF
|
||||
#Some checks
|
||||
dochecks();
|
||||
|
||||
begin
|
||||
@@decoder = HTMLEntities.new
|
||||
rescue
|
||||
@@decoder = nil
|
||||
end
|
||||
|
||||
#Initialization of properties
|
||||
@barcode ||= false
|
||||
@buffer ||= ''
|
||||
@@ -3994,10 +4002,6 @@ class TCPDF
|
||||
@quote_page[@quote_count] = @page;
|
||||
@quote_count += 1
|
||||
when 'br'
|
||||
if @tdbegin
|
||||
@tdtext << "\n"
|
||||
return
|
||||
end
|
||||
Ln();
|
||||
|
||||
if (@li_spacer.length > 0)
|
||||
@@ -4336,7 +4340,11 @@ class TCPDF
|
||||
# @return string converted
|
||||
#
|
||||
def unhtmlentities(string)
|
||||
if @@decoder.nil?
|
||||
CGI.unescapeHTML(string)
|
||||
else
|
||||
@@decoder.decode(string)
|
||||
end
|
||||
end
|
||||
|
||||
end # END OF CLASS
|
||||
|
||||
@@ -198,7 +198,7 @@ Redmine::MenuManager.map :project_menu do |menu|
|
||||
menu.push :roadmap, { :controller => 'versions', :action => 'index' }, :param => :project_id,
|
||||
:if => Proc.new { |p| p.shared_versions.any? }
|
||||
menu.push :issues, { :controller => 'issues', :action => 'index' }, :param => :project_id, :caption => :label_issue_plural
|
||||
menu.push :new_issue, { :controller => 'issues', :action => 'new', :copy_from => nil }, :param => :project_id, :caption => :label_issue_new,
|
||||
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 :gantt, { :controller => 'gantts', :action => 'show' }, :param => :project_id, :caption => :label_gantt
|
||||
menu.push :calendar, { :controller => 'calendars', :action => 'show' }, :param => :project_id, :caption => :label_calendar
|
||||
|
||||
@@ -109,13 +109,6 @@ module Redmine
|
||||
RDMPdfEncoding::rdm_from_utf8(txt, l(:general_pdf_encoding))
|
||||
end
|
||||
|
||||
def formatted_text(text)
|
||||
html = Redmine::WikiFormatting.to_html(Setting.text_formatting, text)
|
||||
# Strip {{toc}} tags
|
||||
html.gsub!(/<p>\{\{([<>]?)toc\}\}<\/p>/i, '')
|
||||
html
|
||||
end
|
||||
|
||||
def RDMCell(w ,h=0, txt='', border=0, ln=0, align='', fill=0, link='')
|
||||
Cell(w, h, fix_text_encoding(txt), border, ln, align, fill, link)
|
||||
end
|
||||
@@ -127,7 +120,8 @@ module Redmine
|
||||
def RDMwriteHTMLCell(w, h, x, y, txt='', attachments=[], border=0, ln=1, fill=0)
|
||||
@attachments = attachments
|
||||
writeHTMLCell(w, h, x, y,
|
||||
fix_text_encoding(formatted_text(txt)),
|
||||
fix_text_encoding(
|
||||
Redmine::WikiFormatting.to_html(Setting.text_formatting, txt)),
|
||||
border, ln, fill)
|
||||
end
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ module Redmine
|
||||
module VERSION #:nodoc:
|
||||
MAJOR = 2
|
||||
MINOR = 2
|
||||
TINY = 4
|
||||
TINY = 0
|
||||
|
||||
# Branch values:
|
||||
# * official release: nil
|
||||
|
||||
@@ -147,10 +147,10 @@ module Redmine
|
||||
unless block_given?
|
||||
raise "Can not create a macro without a block!"
|
||||
end
|
||||
name = name.to_s.downcase.to_sym
|
||||
name = name.to_sym if name.is_a?(String)
|
||||
available_macros[name] = {:desc => @@desc || ''}.merge(options)
|
||||
@@desc = nil
|
||||
Definitions.send :define_method, "macro_#{name}", &block
|
||||
Definitions.send :define_method, "macro_#{name}".downcase, &block
|
||||
end
|
||||
|
||||
# Sets description for the next macro to be defined
|
||||
|
||||
@@ -69,7 +69,7 @@ module Redmine
|
||||
l = 1
|
||||
started = false
|
||||
ended = false
|
||||
text.scan(/(((?:.*?)(\A|\r?\n\s*\r?\n))(h(\d+)(#{A}#{C})\.(?::(\S+))?[ \t](.*?)$)|.*)/m).each do |all, content, lf, heading, level|
|
||||
text.scan(/(((?:.*?)(\A|\r?\n\s*\r?\n))(h(\d+)(#{A}#{C})\.(?::(\S+))? (.*?)$)|.*)/m).each do |all, content, lf, heading, level|
|
||||
if heading.nil?
|
||||
if ended
|
||||
after << all
|
||||
|
||||
@@ -13,7 +13,6 @@ namespace :ci do
|
||||
desc "Setup Redmine for a new build."
|
||||
task :setup do
|
||||
Rake::Task["ci:dump_environment"].invoke
|
||||
Rake::Task["tmp:clear"].invoke
|
||||
Rake::Task["db:create"].invoke
|
||||
Rake::Task["db:migrate"].invoke
|
||||
Rake::Task["db:schema:dump"].invoke
|
||||
|
||||
@@ -169,7 +169,7 @@ http://www.redmine.org, someone@foo.bar
|
||||
<h2><a name="5" class="wiki-page"></a>Text formatting</h2>
|
||||
|
||||
|
||||
<p>For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See <a class="external" href="http://en.wikipedia.org/wiki/Textile_%28markup_language%29">http://en.wikipedia.org/wiki/Textile_(markup_language)</a> for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.</p>
|
||||
<p>For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See <a class="external" href="http://www.textism.com/tools/textile/">http://www.textism.com/tools/textile/</a> for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.</p>
|
||||
|
||||
<h3><a name="6" class="wiki-page"></a>Font style</h3>
|
||||
|
||||
|
||||
@@ -11,6 +11,6 @@ jsToolBar.strings['Unordered list'] = 'Неподреден списък';
|
||||
jsToolBar.strings['Ordered list'] = 'Подреден списък';
|
||||
jsToolBar.strings['Quote'] = 'Цитат';
|
||||
jsToolBar.strings['Unquote'] = 'Премахване на цитат';
|
||||
jsToolBar.strings['Preformatted text'] = 'Форматиран текст';
|
||||
jsToolBar.strings['Preformatted text'] = 'Preformatted text';
|
||||
jsToolBar.strings['Wiki link'] = 'Връзка до Wiki страница';
|
||||
jsToolBar.strings['Image'] = 'Изображение';
|
||||
|
||||
@@ -25,7 +25,7 @@ h4 {border-bottom: 1px dotted #bbb;}
|
||||
|
||||
#account {float:right;}
|
||||
|
||||
#header {min-height:5.3em;margin:0;background-color:#628DB6;color:#f8f8f8; padding: 4px 8px 20px 6px; position:relative;}
|
||||
#header {height:5.3em;margin:0;background-color:#628DB6;color:#f8f8f8; padding: 4px 8px 0px 6px; position:relative;}
|
||||
#header a {color:#f8f8f8;}
|
||||
#header h1 a.ancestor { font-size: 80%; }
|
||||
#quick-search {float:right;}
|
||||
|
||||
14
test/fixtures/wiki_content_versions.yml
vendored
14
test/fixtures/wiki_content_versions.yml
vendored
@@ -99,18 +99,4 @@ wiki_content_versions_006:
|
||||
version: 3
|
||||
author_id: 1
|
||||
comments:
|
||||
wiki_content_versions_007:
|
||||
data: |-
|
||||
h1. Page with an inline image
|
||||
|
||||
This is an inline image:
|
||||
|
||||
!logo.gif!
|
||||
updated_on: 2007-03-08 00:18:07 +01:00
|
||||
page_id: 4
|
||||
wiki_content_id: 4
|
||||
id: 7
|
||||
version: 1
|
||||
author_id: 1
|
||||
comments:
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ class ActivitiesControllerTest < ActionController::TestCase
|
||||
end
|
||||
|
||||
def test_previous_project_index
|
||||
get :index, :id => 1, :from => 2.days.ago.to_date
|
||||
get :index, :id => 1, :from => 3.days.ago.to_date
|
||||
assert_response :success
|
||||
assert_template 'index'
|
||||
assert_not_nil assigns(:events_by_day)
|
||||
|
||||
@@ -69,21 +69,6 @@ class BoardsControllerTest < ActionController::TestCase
|
||||
assert topics.first.updated_on < topics.second.updated_on
|
||||
end
|
||||
|
||||
def test_show_should_display_message_with_last_reply_first
|
||||
Message.update_all(:sticky => 0)
|
||||
|
||||
# Reply to an old topic
|
||||
old_topic = Message.where(:board_id => 1, :parent_id => nil).order('created_on ASC').first
|
||||
reply = Message.new(:board_id => 1, :subject => 'New reply', :content => 'New reply', :author_id => 2)
|
||||
old_topic.children << reply
|
||||
|
||||
get :show, :project_id => 1, :id => 1
|
||||
assert_response :success
|
||||
topics = assigns(:topics)
|
||||
assert_not_nil topics
|
||||
assert_equal old_topic, topics.first
|
||||
end
|
||||
|
||||
def test_show_with_permission_should_display_the_new_message_form
|
||||
@request.session[:user_id] = 2
|
||||
get :show, :project_id => 1, :id => 1
|
||||
|
||||
@@ -132,7 +132,7 @@ class ContextMenusControllerTest < ActionController::TestCase
|
||||
:attributes => {:href => "/issues/bulk_update?ids%5B%5D=1&issue%5Bcustom_field_values%5D%5B#{field.id}%5D=Foo"}
|
||||
assert_tag 'a',
|
||||
:content => 'none',
|
||||
:attributes => {:href => "/issues/bulk_update?ids%5B%5D=1&issue%5Bcustom_field_values%5D%5B#{field.id}%5D=__none__"}
|
||||
:attributes => {:href => "/issues/bulk_update?ids%5B%5D=1&issue%5Bcustom_field_values%5D%5B#{field.id}%5D="}
|
||||
end
|
||||
|
||||
def test_context_menu_should_not_include_null_value_for_required_custom_fields
|
||||
|
||||
@@ -2356,9 +2356,6 @@ class IssuesControllerTest < ActionController::TestCase
|
||||
assert_tag 'select', :attributes => {:name => 'issue[project_id]'},
|
||||
:child => {:tag => 'option', :attributes => {:value => '2', :selected => nil}, :content => 'OnlineStore'}
|
||||
assert_tag 'input', :attributes => {:name => 'copy_from', :value => '1'}
|
||||
|
||||
# "New issue" menu item should not link to copy
|
||||
assert_select '#main-menu a.new-issue[href=/projects/ecookbook/issues/new]'
|
||||
end
|
||||
|
||||
def test_new_as_copy_with_attachments_should_show_copy_attachments_checkbox
|
||||
@@ -2914,20 +2911,6 @@ class IssuesControllerTest < ActionController::TestCase
|
||||
assert_equal spent_hours_before + 2.5, issue.spent_hours
|
||||
end
|
||||
|
||||
def test_put_update_should_preserve_parent_issue_even_if_not_visible
|
||||
parent = Issue.generate!(:project_id => 1, :is_private => true)
|
||||
issue = Issue.generate!(:parent_issue_id => parent.id)
|
||||
assert !parent.visible?(User.find(3))
|
||||
@request.session[:user_id] = 3
|
||||
|
||||
get :edit, :id => issue.id
|
||||
assert_select 'input[name=?][value=?]', 'issue[parent_issue_id]', parent.id.to_s
|
||||
|
||||
put :update, :id => issue.id, :issue => {:subject => 'New subject', :parent_issue_id => parent.id.to_s}
|
||||
assert_response 302
|
||||
assert_equal parent, issue.parent
|
||||
end
|
||||
|
||||
def test_put_update_with_attachment_only
|
||||
set_tmp_attachments_directory
|
||||
|
||||
|
||||
@@ -81,11 +81,6 @@ class MessagesControllerTest < ActionController::TestCase
|
||||
assert_response 404
|
||||
end
|
||||
|
||||
def test_show_message_from_invalid_board_should_respond_with_404
|
||||
get :show, :board_id => 999, :id => 1
|
||||
assert_response 404
|
||||
end
|
||||
|
||||
def test_get_new
|
||||
@request.session[:user_id] = 2
|
||||
get :new, :board_id => 1
|
||||
|
||||
@@ -187,11 +187,6 @@ class MyControllerTest < ActionController::TestCase
|
||||
assert User.find(2).pref[:my_page_layout]['top'].include?('issuesreportedbyme')
|
||||
end
|
||||
|
||||
def test_add_invalid_block_should_redirect
|
||||
post :add_block, :block => 'invalid'
|
||||
assert_redirected_to '/my/page_layout'
|
||||
end
|
||||
|
||||
def test_remove_block
|
||||
post :remove_block, :block => 'issuesassignedtome'
|
||||
assert_redirected_to '/my/page_layout'
|
||||
|
||||
@@ -75,19 +75,6 @@ class WikiControllerTest < ActionController::TestCase
|
||||
assert_select 'a[href=?]', '/projects/ecookbook/wiki/CookBook_documentation', :text => /Current version/
|
||||
end
|
||||
|
||||
def test_show_old_version_with_attachments
|
||||
page = WikiPage.find(4)
|
||||
assert page.attachments.any?
|
||||
content = page.content
|
||||
content.text = "update"
|
||||
content.save!
|
||||
|
||||
get :show, :project_id => 'ecookbook', :id => page.title, :version => '1'
|
||||
assert_kind_of WikiContent::Version, assigns(:content)
|
||||
assert_response :success
|
||||
assert_template 'show'
|
||||
end
|
||||
|
||||
def test_show_old_version_without_permission_should_be_denied
|
||||
Role.anonymous.remove_permission! :view_wiki_edits
|
||||
|
||||
|
||||
@@ -118,16 +118,4 @@ module ObjectHelpers
|
||||
board.save!
|
||||
board
|
||||
end
|
||||
|
||||
def Attachment.generate!(attributes={})
|
||||
@generated_filename ||= 'testfile0'
|
||||
@generated_filename.succ!
|
||||
attributes = attributes.dup
|
||||
attachment = Attachment.new(attributes)
|
||||
attachment.container ||= Issue.find(1)
|
||||
attachment.author ||= User.find(2)
|
||||
attachment.filename = @generated_filename if attachment.filename.blank?
|
||||
attachment.save!
|
||||
attachment
|
||||
end
|
||||
end
|
||||
|
||||
@@ -347,15 +347,6 @@ RAW
|
||||
to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text), "#{text} failed" }
|
||||
end
|
||||
|
||||
def test_redmine_links_with_a_different_project_before_current_project
|
||||
vp1 = Version.generate!(:project_id => 1, :name => '1.4.4')
|
||||
vp3 = Version.generate!(:project_id => 3, :name => '1.4.4')
|
||||
|
||||
@project = Project.find(3)
|
||||
assert_equal %(<p><a href="/versions/#{vp1.id}" class="version">1.4.4</a> <a href="/versions/#{vp3.id}" class="version">1.4.4</a></p>),
|
||||
textilizable("ecookbook:version:1.4.4 version:1.4.4")
|
||||
end
|
||||
|
||||
def test_escaped_redmine_links_should_not_be_parsed
|
||||
to_test = [
|
||||
'#3.',
|
||||
@@ -403,14 +394,14 @@ RAW
|
||||
end
|
||||
|
||||
def test_multiple_repositories_redmine_links
|
||||
svn = Repository::Subversion.create!(:project_id => 1, :identifier => 'svn_repo-1', :url => 'file:///foo/hg')
|
||||
svn = Repository::Subversion.create!(:project_id => 1, :identifier => 'svn1', :url => 'file:///foo/hg')
|
||||
Changeset.create!(:repository => svn, :committed_on => Time.now, :revision => '123')
|
||||
hg = Repository::Mercurial.create!(:project_id => 1, :identifier => 'hg1', :url => '/foo/hg')
|
||||
Changeset.create!(:repository => hg, :committed_on => Time.now, :revision => '123', :scmid => 'abcd')
|
||||
|
||||
changeset_link = link_to('r2', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 2},
|
||||
:class => 'changeset', :title => 'This commit fixes #1, #2 and references #1 & #3')
|
||||
svn_changeset_link = link_to('svn_repo-1|r123', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :repository_id => 'svn_repo-1', :rev => 123},
|
||||
svn_changeset_link = link_to('svn1|r123', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :repository_id => 'svn1', :rev => 123},
|
||||
:class => 'changeset', :title => '')
|
||||
hg_changeset_link = link_to('hg1|abcd', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :repository_id => 'hg1', :rev => 'abcd'},
|
||||
:class => 'changeset', :title => '')
|
||||
@@ -420,7 +411,7 @@ RAW
|
||||
|
||||
to_test = {
|
||||
'r2' => changeset_link,
|
||||
'svn_repo-1|r123' => svn_changeset_link,
|
||||
'svn1|r123' => svn_changeset_link,
|
||||
'invalid|r123' => 'invalid|r123',
|
||||
'commit:hg1|abcd' => hg_changeset_link,
|
||||
'commit:invalid|abcd' => 'commit:invalid|abcd',
|
||||
@@ -560,15 +551,6 @@ RAW
|
||||
to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text, :attachments => Issue.find(3).attachments), "#{text} failed" }
|
||||
end
|
||||
|
||||
def test_attachment_link_should_link_to_latest_attachment
|
||||
set_tmp_attachments_directory
|
||||
a1 = Attachment.generate!(:filename => "test.txt", :created_on => 1.hour.ago)
|
||||
a2 = Attachment.generate!(:filename => "test.txt")
|
||||
|
||||
assert_equal %(<p><a href="/attachments/download/#{a2.id}" class="attachment">test.txt</a></p>),
|
||||
textilizable('attachment:test.txt', :attachments => [a1, a2])
|
||||
end
|
||||
|
||||
def test_wiki_links
|
||||
to_test = {
|
||||
'[[CookBook documentation]]' => '<a href="/projects/ecookbook/wiki/CookBook_documentation" class="wiki-page">CookBook documentation</a>',
|
||||
|
||||
@@ -78,12 +78,6 @@ class Redmine::WikiFormatting::MacrosTest < ActionView::TestCase
|
||||
assert_equal "<p>Baz: (arg1,arg2) (String) (line1\nline2)</p>", textilizable("{{baz(arg1, arg2)\nline1\nline2\n}}")
|
||||
end
|
||||
|
||||
def test_macro_name_with_upper_case
|
||||
Redmine::WikiFormatting::Macros.macro(:UpperCase) {|obj, args| "Upper"}
|
||||
|
||||
assert_equal "<p>Upper</p>", textilizable("{{UpperCase}}")
|
||||
end
|
||||
|
||||
def test_multiple_macros_on_the_same_line
|
||||
Redmine::WikiFormatting::Macros.macro :foo do |obj, args|
|
||||
args.any? ? "args: #{args.join(',')}" : "no args"
|
||||
|
||||
@@ -419,20 +419,6 @@ STR
|
||||
end
|
||||
end
|
||||
|
||||
def test_get_section_should_support_headings_starting_with_a_tab
|
||||
text = <<-STR
|
||||
h1.\tHeading 1
|
||||
|
||||
Content 1
|
||||
|
||||
h1. Heading 2
|
||||
|
||||
Content 2
|
||||
STR
|
||||
|
||||
assert_match /\Ah1.\tHeading 1\s+Content 1\z/, @formatter.new(text).get_section(1).first
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def assert_html_output(to_test, expect_paragraph = true)
|
||||
|
||||
Reference in New Issue
Block a user