Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d21776215b | ||
|
|
11b774d39d | ||
|
|
77c4667dbc | ||
|
|
f05fdd5cfa | ||
|
|
a0bb70ed2d | ||
|
|
1d5c3f7fba | ||
|
|
8b83aa1470 | ||
|
|
3a92721af4 | ||
|
|
b3218ba4d4 | ||
|
|
975ee2b522 | ||
|
|
27a319e66d | ||
|
|
7be5bf6e4d | ||
|
|
c73d4042d1 | ||
|
|
8270ad1e64 | ||
|
|
26016fbf43 | ||
|
|
307e4ceaa2 | ||
|
|
03085e85f9 | ||
|
|
1f4e0dc10c | ||
|
|
f69c95306d | ||
|
|
634ede3e8b | ||
|
|
c2a2979189 | ||
|
|
9800469943 | ||
|
|
e47f1d5595 | ||
|
|
135fe04d02 | ||
|
|
794d7c0959 | ||
|
|
b8f365f2a1 | ||
|
|
6188b9eddb | ||
|
|
96c4dc3f1e | ||
|
|
b877215261 | ||
|
|
788b143596 | ||
|
|
6a261eb5a0 | ||
|
|
007fbc00cf | ||
|
|
9b8b4b3bfc | ||
|
|
6734f91a72 | ||
|
|
5266346315 | ||
|
|
d426e4452b |
No files matched your search
@@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>1.1-stable</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.rubypeople.rdt.core.rubybuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>com.aptana.ide.core.unifiedBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>com.aptana.ide.project.nature.web</nature>
|
||||||
|
<nature>org.rubypeople.rdt.core.rubynature</nature>
|
||||||
|
<nature>org.radrails.rails.core.railsnature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
||||||
@@ -28,6 +28,7 @@ class IssueRelationsController < ApplicationController
|
|||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html { redirect_to :controller => 'issues', :action => 'show', :id => @issue }
|
format.html { redirect_to :controller => 'issues', :action => 'show', :id => @issue }
|
||||||
format.js do
|
format.js do
|
||||||
|
@relations = @issue.relations.select {|r| r.other_issue(@issue) && r.other_issue(@issue).visible? }
|
||||||
render :update do |page|
|
render :update do |page|
|
||||||
page.replace_html "relations", :partial => 'issues/relations'
|
page.replace_html "relations", :partial => 'issues/relations'
|
||||||
if @relation.errors.empty?
|
if @relation.errors.empty?
|
||||||
@@ -47,7 +48,10 @@ class IssueRelationsController < ApplicationController
|
|||||||
end
|
end
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html { redirect_to :controller => 'issues', :action => 'show', :id => @issue }
|
format.html { redirect_to :controller => 'issues', :action => 'show', :id => @issue }
|
||||||
format.js { render(:update) {|page| page.replace_html "relations", :partial => 'issues/relations'} }
|
format.js {
|
||||||
|
@relations = @issue.relations.select {|r| r.other_issue(@issue) && r.other_issue(@issue).visible? }
|
||||||
|
render(:update) {|page| page.replace_html "relations", :partial => 'issues/relations'}
|
||||||
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -108,6 +108,7 @@ class IssuesController < ApplicationController
|
|||||||
@journals.reverse! if User.current.wants_comments_in_reverse_order?
|
@journals.reverse! if User.current.wants_comments_in_reverse_order?
|
||||||
@changesets = @issue.changesets.visible.all
|
@changesets = @issue.changesets.visible.all
|
||||||
@changesets.reverse! if User.current.wants_comments_in_reverse_order?
|
@changesets.reverse! if User.current.wants_comments_in_reverse_order?
|
||||||
|
@relations = @issue.relations.select {|r| r.other_issue(@issue) && r.other_issue(@issue).visible? }
|
||||||
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
|
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
|
||||||
@edit_allowed = User.current.allowed_to?(:edit_issues, @project)
|
@edit_allowed = User.current.allowed_to?(:edit_issues, @project)
|
||||||
@priorities = IssuePriority.all
|
@priorities = IssuePriority.all
|
||||||
|
|||||||
@@ -139,6 +139,7 @@ class RepositoriesController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def revision
|
def revision
|
||||||
|
raise ChangesetNotFound if @rev.nil? || @rev.empty?
|
||||||
@changeset = @repository.find_changeset_by_name(@rev)
|
@changeset = @repository.find_changeset_by_name(@rev)
|
||||||
raise ChangesetNotFound unless @changeset
|
raise ChangesetNotFound unless @changeset
|
||||||
|
|
||||||
@@ -224,7 +225,7 @@ class RepositoriesController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def show_error_not_found
|
def show_error_not_found
|
||||||
render_error l(:error_scm_not_found)
|
render_error :message => l(:error_scm_not_found), :status => 404
|
||||||
end
|
end
|
||||||
|
|
||||||
# Handler for Redmine::Scm::Adapters::CommandFailed exception
|
# Handler for Redmine::Scm::Adapters::CommandFailed exception
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ class Repository < ActiveRecord::Base
|
|||||||
|
|
||||||
# Finds and returns a revision with a number or the beginning of a hash
|
# Finds and returns a revision with a number or the beginning of a hash
|
||||||
def find_changeset_by_name(name)
|
def find_changeset_by_name(name)
|
||||||
|
return nil if name.blank?
|
||||||
changesets.find(:first, :conditions => (name.match(/^\d*$/) ? ["revision = ?", name.to_s] : ["revision LIKE ?", name + '%']))
|
changesets.find(:first, :conditions => (name.match(/^\d*$/) ? ["revision = ?", name.to_s] : ["revision LIKE ?", name + '%']))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -66,6 +66,9 @@ class TimeEntry < ActiveRecord::Base
|
|||||||
# these attributes make time aggregations easier
|
# these attributes make time aggregations easier
|
||||||
def spent_on=(date)
|
def spent_on=(date)
|
||||||
super
|
super
|
||||||
|
if spent_on.is_a?(Time)
|
||||||
|
self.spent_on = spent_on.to_date
|
||||||
|
end
|
||||||
self.tyear = spent_on ? spent_on.year : nil
|
self.tyear = spent_on ? spent_on.year : nil
|
||||||
self.tmonth = spent_on ? spent_on.month : nil
|
self.tmonth = spent_on ? spent_on.month : nil
|
||||||
self.tweek = spent_on ? Date.civil(spent_on.year, spent_on.month, spent_on.day).cweek : nil
|
self.tweek = spent_on ? Date.civil(spent_on.year, spent_on.month, spent_on.day).cweek : nil
|
||||||
|
|||||||
+13
-4
@@ -261,12 +261,16 @@ class User < Principal
|
|||||||
notified_projects_ids
|
notified_projects_ids
|
||||||
end
|
end
|
||||||
|
|
||||||
# Only users that belong to more than 1 project can select projects for which they are notified
|
|
||||||
def valid_notification_options
|
def valid_notification_options
|
||||||
|
self.class.valid_notification_options(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Only users that belong to more than 1 project can select projects for which they are notified
|
||||||
|
def self.valid_notification_options(user=nil)
|
||||||
# Note that @user.membership.size would fail since AR ignores
|
# Note that @user.membership.size would fail since AR ignores
|
||||||
# :include association option when doing a count
|
# :include association option when doing a count
|
||||||
if memberships.length < 1
|
if user.nil? || user.memberships.length < 1
|
||||||
MAIL_NOTIFICATION_OPTIONS.delete_if {|option| option.first == 'selected'}
|
MAIL_NOTIFICATION_OPTIONS.reject {|option| option.first == 'selected'}
|
||||||
else
|
else
|
||||||
MAIL_NOTIFICATION_OPTIONS
|
MAIL_NOTIFICATION_OPTIONS
|
||||||
end
|
end
|
||||||
@@ -419,7 +423,12 @@ class User < Principal
|
|||||||
when 'all'
|
when 'all'
|
||||||
true
|
true
|
||||||
when 'selected'
|
when 'selected'
|
||||||
# Handled by the Project
|
# user receives notifications for created/assigned issues on unselected projects
|
||||||
|
if object.is_a?(Issue) && (object.author == self || object.assigned_to == self)
|
||||||
|
true
|
||||||
|
else
|
||||||
|
false
|
||||||
|
end
|
||||||
when 'none'
|
when 'none'
|
||||||
false
|
false
|
||||||
when 'only_my_events'
|
when 'only_my_events'
|
||||||
|
|||||||
+3
-3
@@ -45,11 +45,11 @@ class Wiki < ActiveRecord::Base
|
|||||||
# find the page with the given title
|
# find the page with the given title
|
||||||
def find_page(title, options = {})
|
def find_page(title, options = {})
|
||||||
title = start_page if title.blank?
|
title = start_page if title.blank?
|
||||||
title = Wiki.titleize(title).downcase
|
title = Wiki.titleize(title)
|
||||||
page = pages.first(:conditions => ["LOWER(title) LIKE ?", title])
|
page = pages.first(:conditions => ["LOWER(title) LIKE LOWER(?)", title])
|
||||||
if !page && !(options[:with_redirect] == false)
|
if !page && !(options[:with_redirect] == false)
|
||||||
# search for a redirect
|
# search for a redirect
|
||||||
redirect = redirects.first(:conditions => ["LOWER(title) LIKE ?", title])
|
redirect = redirects.first(:conditions => ["LOWER(title) LIKE LOWER(?)", title])
|
||||||
page = find_page(redirect.redirects_to, :with_redirect => false) if redirect
|
page = find_page(redirect.redirects_to, :with_redirect => false) if redirect
|
||||||
end
|
end
|
||||||
page
|
page
|
||||||
|
|||||||
@@ -6,9 +6,9 @@
|
|||||||
|
|
||||||
<p><strong><%=l(:label_related_issues)%></strong></p>
|
<p><strong><%=l(:label_related_issues)%></strong></p>
|
||||||
|
|
||||||
<% if @issue.relations.any? %>
|
<% if @relations.present? %>
|
||||||
<table style="width:100%">
|
<table style="width:100%">
|
||||||
<% @issue.relations.select {|r| r.other_issue(@issue).visible? }.each do |relation| %>
|
<% @relations.each do |relation| %>
|
||||||
<tr>
|
<tr>
|
||||||
<td><%= l(relation.label_for(@issue)) %> <%= "(#{l('datetime.distance_in_words.x_days', :count => relation.delay)})" if relation.delay && relation.delay != 0 %>
|
<td><%= l(relation.label_for(@issue)) %> <%= "(#{l('datetime.distance_in_words.x_days', :count => relation.delay)})" if relation.delay && relation.delay != 0 %>
|
||||||
<%= h(relation.other_issue(@issue).project) + ' - ' if Setting.cross_project_issue_relations? %>
|
<%= h(relation.other_issue(@issue).project) + ' - ' if Setting.cross_project_issue_relations? %>
|
||||||
|
|||||||
@@ -26,10 +26,10 @@ api.issue do
|
|||||||
render_api_issue_children(@issue, api) if include_in_api_response?('children')
|
render_api_issue_children(@issue, api) if include_in_api_response?('children')
|
||||||
|
|
||||||
api.array :relations do
|
api.array :relations do
|
||||||
@issue.relations.select {|r| r.other_issue(@issue).visible? }.each do |relation|
|
@relations.each do |relation|
|
||||||
api.relation(:id => relation.id, :issue_id => relation.other_issue(@issue).id, :relation_type => relation.relation_type_for(@issue), :delay => relation.delay)
|
api.relation(:id => relation.id, :issue_id => relation.other_issue(@issue).id, :relation_type => relation.relation_type_for(@issue), :delay => relation.delay)
|
||||||
end
|
end
|
||||||
end if include_in_api_response?('relations')
|
end if include_in_api_response?('relations') && @relations.present?
|
||||||
|
|
||||||
api.array :changesets do
|
api.array :changesets do
|
||||||
@issue.changesets.each do |changeset|
|
@issue.changesets.each do |changeset|
|
||||||
|
|||||||
@@ -56,8 +56,8 @@
|
|||||||
<div class="splitcontentright">
|
<div class="splitcontentright">
|
||||||
<% if roles.any? && principals.any? %>
|
<% if roles.any? && principals.any? %>
|
||||||
<% remote_form_for(:member, @member, :url => {:controller => 'members', :action => 'new', :id => @project}, :method => :post,
|
<% remote_form_for(:member, @member, :url => {:controller => 'members', :action => 'new', :id => @project}, :method => :post,
|
||||||
:loading => "$('member-add-submit').disable()",
|
:loading => '$(\'member-add-submit\').disable();',
|
||||||
:complete => "$('member-add-submit').enable()") do |f| %>
|
:complete => 'if($(\'member-add-submit\')) $(\'member-add-submit\').enable();') do |f| %>
|
||||||
<fieldset><legend><%=l(:label_member_new)%></legend>
|
<fieldset><legend><%=l(:label_member_new)%></legend>
|
||||||
|
|
||||||
<p><%= label_tag "principal_search", l(:label_principal_search) %><%= text_field_tag 'principal_search', nil %></p>
|
<p><%= label_tag "principal_search", l(:label_principal_search) %><%= text_field_tag 'principal_search', nil %></p>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
<p><%= setting_check_box :plain_text_mail %></p>
|
<p><%= setting_check_box :plain_text_mail %></p>
|
||||||
|
|
||||||
<p><%= setting_select(:default_notification_option, User::MAIL_NOTIFICATION_OPTIONS.collect {|o| [l(o.last), o.first.to_s]}) %></p>
|
<p><%= setting_select(:default_notification_option, User.valid_notification_options.collect {|o| [l(o.last), o.first.to_s]}) %></p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ Rails::Initializer.run do |config|
|
|||||||
config.action_mailer.perform_deliveries = false
|
config.action_mailer.perform_deliveries = false
|
||||||
|
|
||||||
config.gem 'rubytree', :lib => 'tree'
|
config.gem 'rubytree', :lib => 'tree'
|
||||||
|
config.gem 'coderay', :version => '~>0.9.7'
|
||||||
|
|
||||||
# Load any local configuration that is kept out of source control
|
# Load any local configuration that is kept out of source control
|
||||||
# (e.g. gems, patches).
|
# (e.g. gems, patches).
|
||||||
|
|||||||
+337
-333
@@ -1,11 +1,12 @@
|
|||||||
bg:
|
bg:
|
||||||
|
# Text direction: Left-to-Right (ltr) or Right-to-Left (rtl)
|
||||||
direction: ltr
|
direction: ltr
|
||||||
date:
|
date:
|
||||||
formats:
|
formats:
|
||||||
# Use the strftime parameters for formats.
|
# Use the strftime parameters for formats.
|
||||||
# When no format has been given, it uses default.
|
# When no format has been given, it uses default.
|
||||||
# You can provide other formats here if you like!
|
# You can provide other formats here if you like!
|
||||||
default: "%Y-%m-%d"
|
default: "%d-%m-%Y"
|
||||||
short: "%b %d"
|
short: "%b %d"
|
||||||
long: "%B %d, %Y"
|
long: "%B %d, %Y"
|
||||||
|
|
||||||
@@ -65,6 +66,7 @@ bg:
|
|||||||
other: "почти %{count} години"
|
other: "почти %{count} години"
|
||||||
|
|
||||||
number:
|
number:
|
||||||
|
# Default format for numbers
|
||||||
format:
|
format:
|
||||||
separator: "."
|
separator: "."
|
||||||
delimiter: ""
|
delimiter: ""
|
||||||
@@ -84,6 +86,7 @@ bg:
|
|||||||
gb: "GB"
|
gb: "GB"
|
||||||
tb: "TB"
|
tb: "TB"
|
||||||
|
|
||||||
|
|
||||||
# Used in array.to_sentence.
|
# Used in array.to_sentence.
|
||||||
support:
|
support:
|
||||||
array:
|
array:
|
||||||
@@ -94,8 +97,8 @@ bg:
|
|||||||
errors:
|
errors:
|
||||||
template:
|
template:
|
||||||
header:
|
header:
|
||||||
one: "1 error prohibited this %{model} from being saved"
|
one: "1 грешка попречи този %{model} да бъде записан"
|
||||||
other: "%{count} errors prohibited this %{model} from being saved"
|
other: "%{count} грешки попречиха този %{model} да бъде записан"
|
||||||
messages:
|
messages:
|
||||||
inclusion: "не съществува в списъка"
|
inclusion: "не съществува в списъка"
|
||||||
exclusion: "е запазено"
|
exclusion: "е запазено"
|
||||||
@@ -120,6 +123,7 @@ bg:
|
|||||||
greater_than_start_date: "трябва да е след началната дата"
|
greater_than_start_date: "трябва да е след началната дата"
|
||||||
not_same_project: "не е от същия проект"
|
not_same_project: "не е от същия проект"
|
||||||
circular_dependency: "Тази релация ще доведе до безкрайна зависимост"
|
circular_dependency: "Тази релация ще доведе до безкрайна зависимост"
|
||||||
|
cant_link_an_issue_with_a_descendant: "Една задача не може да бъде свързвана към своя подзадача"
|
||||||
|
|
||||||
actionview_instancetag_blank_option: Изберете
|
actionview_instancetag_blank_option: Изберете
|
||||||
|
|
||||||
@@ -150,24 +154,61 @@ bg:
|
|||||||
notice_file_not_found: Несъществуваща или преместена страница.
|
notice_file_not_found: Несъществуваща или преместена страница.
|
||||||
notice_locking_conflict: Друг потребител променя тези данни в момента.
|
notice_locking_conflict: Друг потребител променя тези данни в момента.
|
||||||
notice_not_authorized: Нямате право на достъп до тази страница.
|
notice_not_authorized: Нямате право на достъп до тази страница.
|
||||||
|
notice_not_authorized_archived_project: Проектът, който се опитвате да видите е архивиран.
|
||||||
notice_email_sent: "Изпратен e-mail на %{value}"
|
notice_email_sent: "Изпратен e-mail на %{value}"
|
||||||
notice_email_error: "Грешка при изпращане на e-mail (%{value})"
|
notice_email_error: "Грешка при изпращане на e-mail (%{value})"
|
||||||
notice_feeds_access_key_reseted: Вашия ключ за RSS достъп беше променен.
|
notice_feeds_access_key_reseted: Вашия ключ за RSS достъп беше променен.
|
||||||
|
notice_api_access_key_reseted: Вашият API ключ за достъп беше изчистен.
|
||||||
|
notice_failed_to_save_issues: "Неуспешен запис на %{count} задачи от %{total} избрани: %{ids}."
|
||||||
|
notice_failed_to_save_members: "Невъзможност за запис на член(ове): %{errors}."
|
||||||
|
notice_no_issue_selected: "Няма избрани задачи."
|
||||||
|
notice_account_pending: "Профилът Ви е създаден и очаква одобрение от администратор."
|
||||||
|
notice_default_data_loaded: Примерната информация е заредена успешно.
|
||||||
|
notice_unable_delete_version: Невъзможност за изтриване на версия
|
||||||
|
notice_unable_delete_time_entry: Невъзможност за изтриване на запис на time log.
|
||||||
|
notice_issue_done_ratios_updated: Обновен процент на завършените задачи.
|
||||||
|
notice_gantt_chart_truncated: Мрежовият график е съкратен, понеже броят на обектите, които могат да бъдат показани е твърде голям (%{max})
|
||||||
|
|
||||||
|
error_can_t_load_default_data: "Грешка при зареждане на примерната информация: %{value}"
|
||||||
error_scm_not_found: Несъществуващ обект в хранилището.
|
error_scm_not_found: Несъществуващ обект в хранилището.
|
||||||
error_scm_command_failed: "Грешка при опит за комуникация с хранилище: %{value}"
|
error_scm_command_failed: "Грешка при опит за комуникация с хранилище: %{value}"
|
||||||
|
error_scm_annotate: "Обектът не съществува или не може да бъде анотиран."
|
||||||
|
error_issue_not_found_in_project: 'Задачата не е намерена или не принадлежи на този проект'
|
||||||
|
error_no_tracker_in_project: Няма асоциирани тракери с този проект. Проверете настройките на проекта.
|
||||||
|
error_no_default_issue_status: Няма установено подразбиращо се състояние за задачите. Моля проверете вашата конфигурация (Вижте "Администрация -> Състояния на задачи").
|
||||||
|
error_can_not_delete_custom_field: Невъзможност за изтриване на потребителско поле
|
||||||
|
error_can_not_delete_tracker: Този тракер съдържа задачи и не може да бъде изтрит.
|
||||||
|
error_can_not_remove_role: Тази роля се използва и не може да бъде изтрита.
|
||||||
|
error_can_not_reopen_issue_on_closed_version: Задача, асоциирана със затворена версия не може да бъде отворена отново
|
||||||
|
error_can_not_archive_project: Този проект не може да бъде архивиран
|
||||||
|
error_issue_done_ratios_not_updated: Процентът на завършените задачи не е обновен.
|
||||||
|
error_workflow_copy_source: Моля изберете source тракер или роля
|
||||||
|
error_workflow_copy_target: Моля изберете тракер(и) и роля (роли).
|
||||||
|
error_unable_delete_issue_status: Невъзможност за изтриване на състояние на задача
|
||||||
|
error_unable_to_connect: Невъзможност за свързване с (%{value})
|
||||||
|
warning_attachments_not_saved: "%{count} файла не бяха записани."
|
||||||
|
|
||||||
mail_subject_lost_password: "Вашата парола (%{value})"
|
mail_subject_lost_password: "Вашата парола (%{value})"
|
||||||
mail_body_lost_password: 'За да смените паролата си, използвайте следния линк:'
|
mail_body_lost_password: 'За да смените паролата си, използвайте следния линк:'
|
||||||
mail_subject_register: "Активация на профил (%{value})"
|
mail_subject_register: "Активация на профил (%{value})"
|
||||||
mail_body_register: 'За да активирате профила си използвайте следния линк:'
|
mail_body_register: 'За да активирате профила си използвайте следния линк:'
|
||||||
|
mail_body_account_information_external: "Можете да използвате вашия %{value} профил за вход."
|
||||||
|
mail_body_account_information: Информацията за профила ви
|
||||||
|
mail_subject_account_activation_request: "Заявка за активиране на профил в %{value}"
|
||||||
|
mail_body_account_activation_request: "Има новорегистриран потребител (%{value}), очакващ вашето одобрение:"
|
||||||
|
mail_subject_reminder: "%{count} задачи с краен срок с следващите %{days} дни"
|
||||||
|
mail_body_reminder: "%{count} задачи, назначени на вас са с краен срок в следващите %{days} дни:"
|
||||||
|
mail_subject_wiki_content_added: "Wiki страницата '%{id}' беше добавена"
|
||||||
|
mail_body_wiki_content_added: Wiki страницата '%{id}' беше добавена от %{author}.
|
||||||
|
mail_subject_wiki_content_updated: "Wiki страницата '%{id}' не беше обновена"
|
||||||
|
mail_body_wiki_content_updated: Wiki страницата '%{id}' беше обновена от %{author}.
|
||||||
|
|
||||||
gui_validation_error: 1 грешка
|
gui_validation_error: 1 грешка
|
||||||
gui_validation_error_plural: "%{count} грешки"
|
gui_validation_error_plural: "%{count} грешки"
|
||||||
|
|
||||||
field_name: Име
|
field_name: Име
|
||||||
field_description: Описание
|
field_description: Описание
|
||||||
field_summary: Групиран изглед
|
field_summary: Анотация
|
||||||
field_is_required: Задължително
|
field_is_required: Задължително
|
||||||
field_firstname: Име
|
field_firstname: Име
|
||||||
field_lastname: Фамилия
|
field_lastname: Фамилия
|
||||||
@@ -200,6 +241,7 @@ bg:
|
|||||||
field_priority: Приоритет
|
field_priority: Приоритет
|
||||||
field_fixed_version: Планувана версия
|
field_fixed_version: Планувана версия
|
||||||
field_user: Потребител
|
field_user: Потребител
|
||||||
|
field_principal: Principal
|
||||||
field_role: Роля
|
field_role: Роля
|
||||||
field_homepage: Начална страница
|
field_homepage: Начална страница
|
||||||
field_is_public: Публичен
|
field_is_public: Публичен
|
||||||
@@ -225,6 +267,7 @@ bg:
|
|||||||
field_attr_lastname: Атрибут Фамилия (Lastname)
|
field_attr_lastname: Атрибут Фамилия (Lastname)
|
||||||
field_attr_mail: Атрибут Email
|
field_attr_mail: Атрибут Email
|
||||||
field_onthefly: Динамично създаване на потребител
|
field_onthefly: Динамично създаване на потребител
|
||||||
|
field_start_date: Начална дата
|
||||||
field_done_ratio: % Прогрес
|
field_done_ratio: % Прогрес
|
||||||
field_auth_source: Начин на оторизация
|
field_auth_source: Начин на оторизация
|
||||||
field_hide_mail: Скрий e-mail адреса ми
|
field_hide_mail: Скрий e-mail адреса ми
|
||||||
@@ -242,7 +285,24 @@ bg:
|
|||||||
field_assignable: Възможно е възлагане на задачи за тази роля
|
field_assignable: Възможно е възлагане на задачи за тази роля
|
||||||
field_redirect_existing_links: Пренасочване на съществуващи линкове
|
field_redirect_existing_links: Пренасочване на съществуващи линкове
|
||||||
field_estimated_hours: Изчислено време
|
field_estimated_hours: Изчислено време
|
||||||
|
field_column_names: Колони
|
||||||
|
field_time_entries: Log time
|
||||||
|
field_time_zone: Часова зона
|
||||||
|
field_searchable: С възможност за търсене
|
||||||
field_default_value: Стойност по подразбиране
|
field_default_value: Стойност по подразбиране
|
||||||
|
field_comments_sorting: Сортиране на коментарите
|
||||||
|
field_parent_title: Родителска страница
|
||||||
|
field_editable: Editable
|
||||||
|
field_watcher: Наблюдател
|
||||||
|
field_identity_url: OpenID URL
|
||||||
|
field_content: Съдържание
|
||||||
|
field_group_by: Групиране на резултатите по
|
||||||
|
field_sharing: Sharing
|
||||||
|
field_parent_issue: Родителска задача
|
||||||
|
field_member_of_group: Член на група
|
||||||
|
field_assigned_to_role: Assignee's role
|
||||||
|
field_text: Текстово поле
|
||||||
|
field_visible: Видим
|
||||||
|
|
||||||
setting_app_title: Заглавие
|
setting_app_title: Заглавие
|
||||||
setting_app_subtitle: Описание
|
setting_app_subtitle: Описание
|
||||||
@@ -253,26 +313,132 @@ bg:
|
|||||||
setting_attachment_max_size: Максимална големина на прикачен файл
|
setting_attachment_max_size: Максимална големина на прикачен файл
|
||||||
setting_issues_export_limit: Максимален брой задачи за експорт
|
setting_issues_export_limit: Максимален брой задачи за експорт
|
||||||
setting_mail_from: E-mail адрес за емисии
|
setting_mail_from: E-mail адрес за емисии
|
||||||
|
setting_bcc_recipients: Получатели на скрито копие (bcc)
|
||||||
|
setting_plain_text_mail: само чист текст (без HTML)
|
||||||
setting_host_name: Хост
|
setting_host_name: Хост
|
||||||
setting_text_formatting: Форматиране на текста
|
setting_text_formatting: Форматиране на текста
|
||||||
setting_wiki_compression: Wiki компресиране на историята
|
setting_wiki_compression: Wiki компресиране на историята
|
||||||
setting_feeds_limit: Максимален брой за емисии
|
setting_feeds_limit: Максимален брой за емисии
|
||||||
|
setting_default_projects_public: Новите проекти са публични по подразбиране
|
||||||
setting_autofetch_changesets: Автоматично обработване на ревизиите
|
setting_autofetch_changesets: Автоматично обработване на ревизиите
|
||||||
setting_sys_api_enabled: Разрешаване на WS за управление
|
setting_sys_api_enabled: Разрешаване на WS за управление
|
||||||
setting_commit_ref_keywords: Отбелязващи ключови думи
|
setting_commit_ref_keywords: Отбелязващи ключови думи
|
||||||
setting_commit_fix_keywords: Приключващи ключови думи
|
setting_commit_fix_keywords: Приключващи ключови думи
|
||||||
setting_autologin: Автоматичен вход
|
setting_autologin: Автоматичен вход
|
||||||
setting_date_format: Формат на датата
|
setting_date_format: Формат на датата
|
||||||
|
setting_time_format: Формат на часа
|
||||||
setting_cross_project_issue_relations: Релации на задачи между проекти
|
setting_cross_project_issue_relations: Релации на задачи между проекти
|
||||||
|
setting_issue_list_default_columns: Показвани колони по подразбиране
|
||||||
|
setting_repositories_encodings: Кодови таблици
|
||||||
|
setting_commit_logs_encoding: Кодова таблица на съобщенията при поверяване
|
||||||
|
setting_emails_header: Emails header
|
||||||
|
setting_emails_footer: Подтекст за e-mail
|
||||||
|
setting_protocol: Протокол
|
||||||
|
setting_per_page_options: Опции за страниране
|
||||||
|
setting_user_format: Потребителски формат
|
||||||
|
setting_activity_days_default: Брой дни показвани на таб Дейност
|
||||||
|
setting_display_subprojects_issues: Показване на подпроектите в проектите по подразбиране
|
||||||
|
setting_enabled_scm: Разрешена SCM
|
||||||
|
setting_mail_handler_body_delimiters: Отрязване на e-mail-ите след един от тези редове
|
||||||
|
setting_mail_handler_api_enabled: Разрешаване на WS за входящи e-mail-и
|
||||||
|
setting_mail_handler_api_key: API ключ
|
||||||
|
setting_sequential_project_identifiers: Генериране на последователни проектни идентификатори
|
||||||
|
setting_gravatar_enabled: Използване на портребителски икони от Gravatar
|
||||||
|
setting_gravatar_default: Подразбиращо се изображение от Gravatar
|
||||||
|
setting_diff_max_lines_displayed: Максимален брой показани diff редове
|
||||||
|
setting_file_max_size_displayed: Максимален размер на текстовите файлове, показвани inline
|
||||||
|
setting_repository_log_display_limit: Максимален брой на показванете ревизии в лог файла
|
||||||
|
setting_openid: Рарешаване на OpenID вход и регистрация
|
||||||
|
setting_password_min_length: Минимална дължина на парола
|
||||||
|
setting_new_project_user_role_id: Роля, давана на потребител, създаващ проекти, който не е администратор
|
||||||
|
setting_default_projects_modules: Активирани модули по подразбиране за нов проект
|
||||||
|
setting_issue_done_ratio: Изчисление на процента на готови задачи с
|
||||||
|
setting_issue_done_ratio_issue_field: Използване на поле '% Прогрес'
|
||||||
|
setting_issue_done_ratio_issue_status: Използване на състоянието на задачите
|
||||||
|
setting_start_of_week: Първи ден на седмицата
|
||||||
|
setting_rest_api_enabled: Разрешаване на REST web сървис
|
||||||
|
setting_cache_formatted_text: Cache formatted text
|
||||||
|
setting_default_notification_option: Подразбиращ се начин за известяване
|
||||||
|
setting_commit_logtime_enabled: Разрешаване на отчитането на работното време
|
||||||
|
setting_commit_logtime_activity_id: Дейност при отчитане на работното време
|
||||||
|
setting_gantt_items_limit: Максимален брой обекти, които да се показват в мрежов график
|
||||||
|
|
||||||
|
permission_add_project: Създаване на проект
|
||||||
|
permission_add_subprojects: Създаване на подпроекти
|
||||||
|
permission_edit_project: Редактиране на проект
|
||||||
|
permission_select_project_modules: Избор на проектни модули
|
||||||
|
permission_manage_members: Управление на членовете (на екип)
|
||||||
|
permission_manage_project_activities: Управление на дейностите на проекта
|
||||||
|
permission_manage_versions: Управление на версиите
|
||||||
|
permission_manage_categories: Управление на категориите
|
||||||
|
permission_view_issues: Разглеждане на задачите
|
||||||
|
permission_add_issues: Добавяне на задачи
|
||||||
|
permission_edit_issues: Редактиране на задачи
|
||||||
|
permission_manage_issue_relations: Управление на връзките между задачите
|
||||||
|
permission_add_issue_notes: Добаване на бележки
|
||||||
|
permission_edit_issue_notes: Редактиране на бележки
|
||||||
|
permission_edit_own_issue_notes: Редактиране на собствени бележки
|
||||||
|
permission_move_issues: Преместване на задачи
|
||||||
|
permission_delete_issues: Изтриване на задачи
|
||||||
|
permission_manage_public_queries: Управление на публичните заявки
|
||||||
|
permission_save_queries: Запис на запитвания (queries)
|
||||||
|
permission_view_gantt: Разглеждане на мрежов график
|
||||||
|
permission_view_calendar: Разглеждане на календари
|
||||||
|
permission_view_issue_watchers: Разглеждане на списък с наблюдатели
|
||||||
|
permission_add_issue_watchers: Добавяне на наблюдатели
|
||||||
|
permission_delete_issue_watchers: Изтриване на наблюдатели
|
||||||
|
permission_log_time: Log spent time
|
||||||
|
permission_view_time_entries: Разглеждане на изразходваното време
|
||||||
|
permission_edit_time_entries: Редактиране на time logs
|
||||||
|
permission_edit_own_time_entries: Редактиране на собствените time logs
|
||||||
|
permission_manage_news: Управление на новини
|
||||||
|
permission_comment_news: Коментиране на новини
|
||||||
|
permission_manage_documents: Управление на документи
|
||||||
|
permission_view_documents: Разглеждане на документи
|
||||||
|
permission_manage_files: Управление на файлове
|
||||||
|
permission_view_files: Разглеждане на файлове
|
||||||
|
permission_manage_wiki: Управление на wiki
|
||||||
|
permission_rename_wiki_pages: Преименуване на wiki страници
|
||||||
|
permission_delete_wiki_pages: Изтриване на wiki страници
|
||||||
|
permission_view_wiki_pages: Разглеждане на wiki
|
||||||
|
permission_view_wiki_edits: Разглеждане на wiki история
|
||||||
|
permission_edit_wiki_pages: Редактиране на wiki страници
|
||||||
|
permission_delete_wiki_pages_attachments: Изтриване на прикачени файлове към wiki страници
|
||||||
|
permission_protect_wiki_pages: Заключване на wiki страници
|
||||||
|
permission_manage_repository: Управление на хранилища
|
||||||
|
permission_browse_repository: Разглеждане на хранилища
|
||||||
|
permission_view_changesets: Разглеждане на changesets
|
||||||
|
permission_commit_access: Поверяване
|
||||||
|
permission_manage_boards: Управление на boards
|
||||||
|
permission_view_messages: Разглеждане на съобщения
|
||||||
|
permission_add_messages: Публикуване на съобщения
|
||||||
|
permission_edit_messages: Редактиране на съобщения
|
||||||
|
permission_edit_own_messages: Редактиране на собствени съобщения
|
||||||
|
permission_delete_messages: Изтриване на съобщения
|
||||||
|
permission_delete_own_messages: Изтриване на собствени съобщения
|
||||||
|
permission_export_wiki_pages: Експорт на wiki страници
|
||||||
|
permission_manage_subtasks: Управление на подзадачите
|
||||||
|
|
||||||
|
project_module_issue_tracking: Тракинг
|
||||||
|
project_module_time_tracking: Отделяне на време
|
||||||
|
project_module_news: Новини
|
||||||
|
project_module_documents: Документи
|
||||||
|
project_module_files: Файлове
|
||||||
|
project_module_wiki: Wiki
|
||||||
|
project_module_repository: Хранилище
|
||||||
|
project_module_boards: Форуми
|
||||||
|
project_module_calendar: Календар
|
||||||
|
project_module_gantt: Мрежов график
|
||||||
|
|
||||||
label_user: Потребител
|
label_user: Потребител
|
||||||
label_user_plural: Потребители
|
label_user_plural: Потребители
|
||||||
label_user_new: Нов потребител
|
label_user_new: Нов потребител
|
||||||
|
label_user_anonymous: Анонимен
|
||||||
label_project: Проект
|
label_project: Проект
|
||||||
label_project_new: Нов проект
|
label_project_new: Нов проект
|
||||||
label_project_plural: Проекти
|
label_project_plural: Проекти
|
||||||
label_x_projects:
|
label_x_projects:
|
||||||
zero: 0 проекти
|
zero: 0 проекта
|
||||||
one: 1 проект
|
one: 1 проект
|
||||||
other: "%{count} проекта"
|
other: "%{count} проекта"
|
||||||
label_project_all: Всички проекти
|
label_project_all: Всички проекти
|
||||||
@@ -281,9 +447,13 @@ bg:
|
|||||||
label_issue_new: Нова задача
|
label_issue_new: Нова задача
|
||||||
label_issue_plural: Задачи
|
label_issue_plural: Задачи
|
||||||
label_issue_view_all: Всички задачи
|
label_issue_view_all: Всички задачи
|
||||||
|
label_issues_by: "Задачи по %{value}"
|
||||||
|
label_issue_added: Добавена задача
|
||||||
|
label_issue_updated: Обновена задача
|
||||||
label_document: Документ
|
label_document: Документ
|
||||||
label_document_new: Нов документ
|
label_document_new: Нов документ
|
||||||
label_document_plural: Документи
|
label_document_plural: Документи
|
||||||
|
label_document_added: Добавен документ
|
||||||
label_role: Роля
|
label_role: Роля
|
||||||
label_role_plural: Роли
|
label_role_plural: Роли
|
||||||
label_role_new: Нова роля
|
label_role_new: Нова роля
|
||||||
@@ -310,11 +480,13 @@ bg:
|
|||||||
label_information_plural: Информация
|
label_information_plural: Информация
|
||||||
label_please_login: Вход
|
label_please_login: Вход
|
||||||
label_register: Регистрация
|
label_register: Регистрация
|
||||||
|
label_login_with_open_id_option: или вход чрез OpenID
|
||||||
label_password_lost: Забравена парола
|
label_password_lost: Забравена парола
|
||||||
label_home: Начало
|
label_home: Начало
|
||||||
label_my_page: Лична страница
|
label_my_page: Лична страница
|
||||||
label_my_account: Профил
|
label_my_account: Профил
|
||||||
label_my_projects: Проекти, в които участвам
|
label_my_projects: Проекти, в които участвам
|
||||||
|
label_my_page_block: Блокове в личната страница
|
||||||
label_administration: Администрация
|
label_administration: Администрация
|
||||||
label_login: Вход
|
label_login: Вход
|
||||||
label_logout: Изход
|
label_logout: Изход
|
||||||
@@ -324,6 +496,8 @@ bg:
|
|||||||
label_last_login: Последно свързване
|
label_last_login: Последно свързване
|
||||||
label_registered_on: Регистрация
|
label_registered_on: Регистрация
|
||||||
label_activity: Дейност
|
label_activity: Дейност
|
||||||
|
label_overall_activity: Цялостна дейност
|
||||||
|
label_user_activity: "Активност на %{value}"
|
||||||
label_new: Нов
|
label_new: Нов
|
||||||
label_logged_as: Здравейте,
|
label_logged_as: Здравейте,
|
||||||
label_environment: Среда
|
label_environment: Среда
|
||||||
@@ -332,10 +506,13 @@ bg:
|
|||||||
label_auth_source_new: Нов начин на оторизация
|
label_auth_source_new: Нов начин на оторизация
|
||||||
label_auth_source_plural: Начини на оторизация
|
label_auth_source_plural: Начини на оторизация
|
||||||
label_subproject_plural: Подпроекти
|
label_subproject_plural: Подпроекти
|
||||||
|
label_subproject_new: Нов подпроект
|
||||||
|
label_and_its_subprojects: "%{value} и неговите подпроекти"
|
||||||
label_min_max_length: Минимална - максимална дължина
|
label_min_max_length: Минимална - максимална дължина
|
||||||
label_list: Списък
|
label_list: Списък
|
||||||
label_date: Дата
|
label_date: Дата
|
||||||
label_integer: Целочислен
|
label_integer: Целочислен
|
||||||
|
label_float: Дробно
|
||||||
label_boolean: Чекбокс
|
label_boolean: Чекбокс
|
||||||
label_string: Текст
|
label_string: Текст
|
||||||
label_text: Дълъг текст
|
label_text: Дълъг текст
|
||||||
@@ -350,6 +527,7 @@ bg:
|
|||||||
label_attachment_new: Нов файл
|
label_attachment_new: Нов файл
|
||||||
label_attachment_delete: Изтриване
|
label_attachment_delete: Изтриване
|
||||||
label_attachment_plural: Файлове
|
label_attachment_plural: Файлове
|
||||||
|
label_file_added: Добавен файл
|
||||||
label_report: Справка
|
label_report: Справка
|
||||||
label_report_plural: Справки
|
label_report_plural: Справки
|
||||||
label_news: Новини
|
label_news: Новини
|
||||||
@@ -357,11 +535,13 @@ bg:
|
|||||||
label_news_plural: Новини
|
label_news_plural: Новини
|
||||||
label_news_latest: Последни новини
|
label_news_latest: Последни новини
|
||||||
label_news_view_all: Виж всички
|
label_news_view_all: Виж всички
|
||||||
|
label_news_added: Добавена новина
|
||||||
label_settings: Настройки
|
label_settings: Настройки
|
||||||
label_overview: Общ изглед
|
label_overview: Общ изглед
|
||||||
label_version: Версия
|
label_version: Версия
|
||||||
label_version_new: Нова версия
|
label_version_new: Нова версия
|
||||||
label_version_plural: Версии
|
label_version_plural: Версии
|
||||||
|
label_close_versions: Затваряне на завършените версии
|
||||||
label_confirmation: Одобрение
|
label_confirmation: Одобрение
|
||||||
label_export_to: Експорт към
|
label_export_to: Експорт към
|
||||||
label_read: Read...
|
label_read: Read...
|
||||||
@@ -388,6 +568,7 @@ bg:
|
|||||||
label_new_statuses_allowed: Позволени състояния
|
label_new_statuses_allowed: Позволени състояния
|
||||||
label_all: всички
|
label_all: всички
|
||||||
label_none: никакви
|
label_none: никакви
|
||||||
|
label_nobody: никой
|
||||||
label_next: Следващ
|
label_next: Следващ
|
||||||
label_previous: Предишен
|
label_previous: Предишен
|
||||||
label_used_by: Използва се от
|
label_used_by: Използва се от
|
||||||
@@ -419,9 +600,19 @@ bg:
|
|||||||
label_not_equals: не е
|
label_not_equals: не е
|
||||||
label_in_less_than: след по-малко от
|
label_in_less_than: след по-малко от
|
||||||
label_in_more_than: след повече от
|
label_in_more_than: след повече от
|
||||||
|
label_greater_or_equal: ">="
|
||||||
|
label_less_or_equal: <=
|
||||||
label_in: в следващите
|
label_in: в следващите
|
||||||
label_today: днес
|
label_today: днес
|
||||||
|
label_all_time: всички
|
||||||
|
label_yesterday: вчера
|
||||||
label_this_week: тази седмица
|
label_this_week: тази седмица
|
||||||
|
label_last_week: последната седмица
|
||||||
|
label_last_n_days: "последните %{count} дни"
|
||||||
|
label_this_month: текущия месец
|
||||||
|
label_last_month: последния месец
|
||||||
|
label_this_year: текущата година
|
||||||
|
label_date_range: Период
|
||||||
label_less_than_ago: преди по-малко от
|
label_less_than_ago: преди по-малко от
|
||||||
label_more_than_ago: преди повече от
|
label_more_than_ago: преди повече от
|
||||||
label_ago: преди
|
label_ago: преди
|
||||||
@@ -429,17 +620,25 @@ bg:
|
|||||||
label_not_contains: не съдържа
|
label_not_contains: не съдържа
|
||||||
label_day_plural: дни
|
label_day_plural: дни
|
||||||
label_repository: Хранилище
|
label_repository: Хранилище
|
||||||
|
label_repository_plural: Хранилища
|
||||||
label_browse: Разглеждане
|
label_browse: Разглеждане
|
||||||
label_modification: "%{count} промяна"
|
label_modification: "%{count} промяна"
|
||||||
label_modification_plural: "%{count} промени"
|
label_modification_plural: "%{count} промени"
|
||||||
|
label_branch: работен вариант
|
||||||
|
label_tag: Версия
|
||||||
label_revision: Ревизия
|
label_revision: Ревизия
|
||||||
label_revision_plural: Ревизии
|
label_revision_plural: Ревизии
|
||||||
|
label_revision_id: Ревизия %{value}
|
||||||
|
label_associated_revisions: Асоциирани ревизии
|
||||||
label_added: добавено
|
label_added: добавено
|
||||||
label_modified: променено
|
label_modified: променено
|
||||||
|
label_copied: копирано
|
||||||
|
label_renamed: преименувано
|
||||||
label_deleted: изтрито
|
label_deleted: изтрито
|
||||||
label_latest_revision: Последна ревизия
|
label_latest_revision: Последна ревизия
|
||||||
label_latest_revision_plural: Последни ревизии
|
label_latest_revision_plural: Последни ревизии
|
||||||
label_view_revisions: Виж ревизиите
|
label_view_revisions: Виж ревизиите
|
||||||
|
label_view_all_revisions: Разглеждане на всички ревизии
|
||||||
label_max_size: Максимална големина
|
label_max_size: Максимална големина
|
||||||
label_sort_highest: Премести най-горе
|
label_sort_highest: Премести най-горе
|
||||||
label_sort_higher: Премести по-горе
|
label_sort_higher: Премести по-горе
|
||||||
@@ -465,6 +664,7 @@ bg:
|
|||||||
label_changes_details: Подробни промени
|
label_changes_details: Подробни промени
|
||||||
label_issue_tracking: Тракинг
|
label_issue_tracking: Тракинг
|
||||||
label_spent_time: Отделено време
|
label_spent_time: Отделено време
|
||||||
|
label_overall_spent_time: Общо употребено време
|
||||||
label_f_hour: "%{value} час"
|
label_f_hour: "%{value} час"
|
||||||
label_f_hour_plural: "%{value} часа"
|
label_f_hour_plural: "%{value} часа"
|
||||||
label_time_tracking: Отделяне на време
|
label_time_tracking: Отделяне на време
|
||||||
@@ -486,6 +686,7 @@ bg:
|
|||||||
label_relation_delete: Изтриване на релация
|
label_relation_delete: Изтриване на релация
|
||||||
label_relates_to: свързана със
|
label_relates_to: свързана със
|
||||||
label_duplicates: дублира
|
label_duplicates: дублира
|
||||||
|
label_duplicated_by: дублирана от
|
||||||
label_blocks: блокира
|
label_blocks: блокира
|
||||||
label_blocked_by: блокирана от
|
label_blocked_by: блокирана от
|
||||||
label_precedes: предшества
|
label_precedes: предшества
|
||||||
@@ -501,10 +702,13 @@ bg:
|
|||||||
label_board: Форум
|
label_board: Форум
|
||||||
label_board_new: Нов форум
|
label_board_new: Нов форум
|
||||||
label_board_plural: Форуми
|
label_board_plural: Форуми
|
||||||
|
label_board_locked: Заключена
|
||||||
|
label_board_sticky: Sticky
|
||||||
label_topic_plural: Теми
|
label_topic_plural: Теми
|
||||||
label_message_plural: Съобщения
|
label_message_plural: Съобщения
|
||||||
label_message_last: Последно съобщение
|
label_message_last: Последно съобщение
|
||||||
label_message_new: Нова тема
|
label_message_new: Нова тема
|
||||||
|
label_message_posted: Добавено съобщение
|
||||||
label_reply_plural: Отговори
|
label_reply_plural: Отговори
|
||||||
label_send_information: Изпращане на информацията до потребителя
|
label_send_information: Изпращане на информацията до потребителя
|
||||||
label_year: Година
|
label_year: Година
|
||||||
@@ -515,11 +719,80 @@ bg:
|
|||||||
label_language_based: В зависимост от езика
|
label_language_based: В зависимост от езика
|
||||||
label_sort_by: "Сортиране по %{value}"
|
label_sort_by: "Сортиране по %{value}"
|
||||||
label_send_test_email: Изпращане на тестов e-mail
|
label_send_test_email: Изпращане на тестов e-mail
|
||||||
|
label_feeds_access_key: RSS access ключ
|
||||||
|
label_missing_feeds_access_key: Липсващ RSS ключ за достъп
|
||||||
label_feeds_access_key_created_on: "%{value} от създаването на RSS ключа"
|
label_feeds_access_key_created_on: "%{value} от създаването на RSS ключа"
|
||||||
label_module_plural: Модули
|
label_module_plural: Модули
|
||||||
label_added_time_by: "Публикувана от %{author} преди %{age}"
|
label_added_time_by: "Публикувана от %{author} преди %{age}"
|
||||||
|
label_updated_time_by: "Обновена от %{author} преди %{age}"
|
||||||
label_updated_time: "Обновена преди %{value}"
|
label_updated_time: "Обновена преди %{value}"
|
||||||
label_jump_to_a_project: Проект...
|
label_jump_to_a_project: Проект...
|
||||||
|
label_file_plural: Файлове
|
||||||
|
label_changeset_plural: Ревизии
|
||||||
|
label_default_columns: По подразбиране
|
||||||
|
label_no_change_option: (Без промяна)
|
||||||
|
label_bulk_edit_selected_issues: Редактиране на задачи
|
||||||
|
label_theme: Тема
|
||||||
|
label_default: По подразбиране
|
||||||
|
label_search_titles_only: Само в заглавията
|
||||||
|
label_user_mail_option_all: "За всяко събитие в проектите, в които участвам"
|
||||||
|
label_user_mail_option_selected: "За всички събития само в избраните проекти..."
|
||||||
|
label_user_mail_option_none: "Само за наблюдавани или в които участвам (автор или назначени на мен)"
|
||||||
|
label_user_mail_option_only_my_events: Само за неща, в които съм включен/а
|
||||||
|
label_user_mail_option_only_assigned: Само за неща, назначени на мен
|
||||||
|
label_user_mail_option_only_owner: Само за неща, на които аз съм собственик
|
||||||
|
label_user_mail_no_self_notified: "Не искам известия за извършени от мен промени"
|
||||||
|
label_registration_activation_by_email: активиране на профила по email
|
||||||
|
label_registration_manual_activation: ръчно активиране
|
||||||
|
label_registration_automatic_activation: автоматично активиране
|
||||||
|
label_display_per_page: "На страница по: %{value}"
|
||||||
|
label_age: Възраст
|
||||||
|
label_change_properties: Промяна на настройки
|
||||||
|
label_general: Основни
|
||||||
|
label_more: Още
|
||||||
|
label_scm: SCM (Система за контрол на версиите)
|
||||||
|
label_plugins: Плъгини
|
||||||
|
label_ldap_authentication: LDAP оторизация
|
||||||
|
label_downloads_abbr: D/L
|
||||||
|
label_optional_description: Незадължително описание
|
||||||
|
label_add_another_file: Добавяне на друг файл
|
||||||
|
label_preferences: Предпочитания
|
||||||
|
label_chronological_order: Хронологичен ред
|
||||||
|
label_reverse_chronological_order: Обратен хронологичен ред
|
||||||
|
label_planning: Планиране
|
||||||
|
label_incoming_emails: Входящи e-mail-и
|
||||||
|
label_generate_key: Генериране на ключ
|
||||||
|
label_issue_watchers: Наблюдатели
|
||||||
|
label_example: Пример
|
||||||
|
label_display: Display
|
||||||
|
label_sort: Сортиране
|
||||||
|
label_ascending: Нарастващ
|
||||||
|
label_descending: Намаляващ
|
||||||
|
label_date_from_to: От %{start} до %{end}
|
||||||
|
label_wiki_content_added: Wiki страница беше добавена
|
||||||
|
label_wiki_content_updated: Wiki страница беше обновена
|
||||||
|
label_group: Група
|
||||||
|
label_group_plural: Групи
|
||||||
|
label_group_new: Нова група
|
||||||
|
label_time_entry_plural: Използвано време
|
||||||
|
label_version_sharing_none: Не споделен
|
||||||
|
label_version_sharing_descendants: С подпроекти
|
||||||
|
label_version_sharing_hierarchy: С проектна йерархия
|
||||||
|
label_version_sharing_tree: С дърво на проектите
|
||||||
|
label_version_sharing_system: С всички проекти
|
||||||
|
label_update_issue_done_ratios: Обновяване на процента на завършените задачи
|
||||||
|
label_copy_source: Източник
|
||||||
|
label_copy_target: Цел
|
||||||
|
label_copy_same_as_target: Също като целта
|
||||||
|
label_display_used_statuses_only: Показване само на състоянията, използвани от този тракер
|
||||||
|
label_api_access_key: API ключ за достъп
|
||||||
|
label_missing_api_access_key: Липсващ API ключ
|
||||||
|
label_api_access_key_created_on: API ключ за достъп е създаден преди %{value}
|
||||||
|
label_profile: Профил
|
||||||
|
label_subtask_plural: Подзадачи
|
||||||
|
label_project_copy_notifications: Изпращане на Send e-mail известия по време на копирането на проекта
|
||||||
|
label_principal_search: "Търсене на потребител или група:"
|
||||||
|
label_user_search: "Търсене на потребител:"
|
||||||
|
|
||||||
button_login: Вход
|
button_login: Вход
|
||||||
button_submit: Прикачване
|
button_submit: Прикачване
|
||||||
@@ -528,8 +801,10 @@ bg:
|
|||||||
button_uncheck_all: Изчистване на всички
|
button_uncheck_all: Изчистване на всички
|
||||||
button_delete: Изтриване
|
button_delete: Изтриване
|
||||||
button_create: Създаване
|
button_create: Създаване
|
||||||
|
button_create_and_continue: Създаване и продължаване
|
||||||
button_test: Тест
|
button_test: Тест
|
||||||
button_edit: Редакция
|
button_edit: Редакция
|
||||||
|
button_edit_associated_wikipage: "Редактиране на асоциираната Wiki страница: %{page_title}"
|
||||||
button_add: Добавяне
|
button_add: Добавяне
|
||||||
button_change: Промяна
|
button_change: Промяна
|
||||||
button_apply: Приложи
|
button_apply: Приложи
|
||||||
@@ -540,6 +815,7 @@ bg:
|
|||||||
button_list: Списък
|
button_list: Списък
|
||||||
button_view: Преглед
|
button_view: Преглед
|
||||||
button_move: Преместване
|
button_move: Преместване
|
||||||
|
button_move_and_follow: Преместване и продължаване
|
||||||
button_back: Назад
|
button_back: Назад
|
||||||
button_cancel: Отказ
|
button_cancel: Отказ
|
||||||
button_activate: Активация
|
button_activate: Активация
|
||||||
@@ -553,26 +829,49 @@ bg:
|
|||||||
button_unarchive: Разархивиране
|
button_unarchive: Разархивиране
|
||||||
button_reset: Генериране наново
|
button_reset: Генериране наново
|
||||||
button_rename: Преименуване
|
button_rename: Преименуване
|
||||||
|
button_change_password: Промяна на парола
|
||||||
|
button_copy: Копиране
|
||||||
|
button_copy_and_follow: Копиране и продължаване
|
||||||
|
button_annotate: Анотация
|
||||||
|
button_update: Обновяване
|
||||||
|
button_configure: Конфигуриране
|
||||||
|
button_quote: Цитат
|
||||||
|
button_duplicate: Дублиране
|
||||||
|
button_show: Показване
|
||||||
|
|
||||||
status_active: активен
|
status_active: активен
|
||||||
status_registered: регистриран
|
status_registered: регистриран
|
||||||
status_locked: заключен
|
status_locked: заключен
|
||||||
|
|
||||||
|
version_status_open: отворена
|
||||||
|
version_status_locked: заключена
|
||||||
|
version_status_closed: затворена
|
||||||
|
|
||||||
|
field_active: Активен
|
||||||
|
|
||||||
text_select_mail_notifications: Изберете събития за изпращане на e-mail.
|
text_select_mail_notifications: Изберете събития за изпращане на e-mail.
|
||||||
text_regexp_info: пр. ^[A-Z0-9]+$
|
text_regexp_info: пр. ^[A-Z0-9]+$
|
||||||
text_min_max_length_info: 0 - без ограничения
|
text_min_max_length_info: 0 - без ограничения
|
||||||
text_project_destroy_confirmation: Сигурни ли сте, че искате да изтриете проекта и данните в него?
|
text_project_destroy_confirmation: Сигурни ли сте, че искате да изтриете проекта и данните в него?
|
||||||
|
text_subprojects_destroy_warning: "Неговите подпроекти: %{value} също ще бъдат изтрити."
|
||||||
text_workflow_edit: Изберете роля и тракер за да редактирате работния процес
|
text_workflow_edit: Изберете роля и тракер за да редактирате работния процес
|
||||||
text_are_you_sure: Сигурни ли сте?
|
text_are_you_sure: Сигурни ли сте?
|
||||||
text_tip_task_begin_day: задача започваща този ден
|
text_are_you_sure_with_children: Изтриване на задачата и нейните подзадачи?
|
||||||
text_tip_task_end_day: задача завършваща този ден
|
text_journal_changed: "%{label} променен от %{old} на %{new}"
|
||||||
text_tip_task_begin_end_day: задача започваща и завършваща този ден
|
text_journal_set_to: "%{label} установен на %{value}"
|
||||||
|
text_journal_deleted: "%{label} изтрит (%{old})"
|
||||||
|
text_journal_added: "Добавено %{label} %{value}"
|
||||||
|
text_tip_issue_begin_day: задача, започваща този ден
|
||||||
|
text_tip_issue_end_day: задача, завършваща този ден
|
||||||
|
text_tip_issue_begin_end_day: задача, започваща и завършваща този ден
|
||||||
text_project_identifier_info: 'Позволени са малки букви (a-z), цифри и тирета.<br />Невъзможна промяна след запис.'
|
text_project_identifier_info: 'Позволени са малки букви (a-z), цифри и тирета.<br />Невъзможна промяна след запис.'
|
||||||
text_caracters_maximum: "До %{count} символа."
|
text_caracters_maximum: "До %{count} символа."
|
||||||
|
text_caracters_minimum: "Минимум %{count} символа."
|
||||||
text_length_between: "От %{min} до %{max} символа."
|
text_length_between: "От %{min} до %{max} символа."
|
||||||
text_tracker_no_workflow: Няма дефиниран работен процес за този тракер
|
text_tracker_no_workflow: Няма дефиниран работен процес за този тракер
|
||||||
text_unallowed_characters: Непозволени символи
|
text_unallowed_characters: Непозволени символи
|
||||||
text_comma_separated: Позволено е изброяване (с разделител запетая).
|
text_comma_separated: Позволено е изброяване (с разделител запетая).
|
||||||
|
text_line_separated: Позволени са много стойности (по едно на ред).
|
||||||
text_issues_ref_in_commit_messages: Отбелязване и приключване на задачи от ревизии
|
text_issues_ref_in_commit_messages: Отбелязване и приключване на задачи от ревизии
|
||||||
text_issue_added: "Публикувана е нова задача с номер %{id} (от %{author})."
|
text_issue_added: "Публикувана е нова задача с номер %{id} (от %{author})."
|
||||||
text_issue_updated: "Задача %{id} е обновена (от %{author})."
|
text_issue_updated: "Задача %{id} е обновена (от %{author})."
|
||||||
@@ -580,6 +879,35 @@ bg:
|
|||||||
text_issue_category_destroy_question: "Има задачи (%{count}) обвързани с тази категория. Какво ще изберете?"
|
text_issue_category_destroy_question: "Има задачи (%{count}) обвързани с тази категория. Какво ще изберете?"
|
||||||
text_issue_category_destroy_assignments: Премахване на връзките с категорията
|
text_issue_category_destroy_assignments: Премахване на връзките с категорията
|
||||||
text_issue_category_reassign_to: Преобвързване с категория
|
text_issue_category_reassign_to: Преобвързване с категория
|
||||||
|
text_user_mail_option: "За неизбраните проекти, ще получавате известия само за наблюдавани дейности или в които участвате (т.е. автор или назначени на мен)."
|
||||||
|
text_no_configuration_data: "Все още не са конфигурирани Роли, тракери, състояния на задачи и работен процес.\nСтрого се препоръчва зареждането на примерната информация. Веднъж заредена ще имате възможност да я редактирате."
|
||||||
|
text_load_default_configuration: Зареждане на примерна информация
|
||||||
|
text_status_changed_by_changeset: "Приложено с ревизия %{value}."
|
||||||
|
text_time_logged_by_changeset: Приложено в ревизия %{value}.
|
||||||
|
text_issues_destroy_confirmation: 'Сигурни ли сте, че искате да изтриете избраните задачи?'
|
||||||
|
text_select_project_modules: 'Изберете активните модули за този проект:'
|
||||||
|
text_default_administrator_account_changed: Сменен фабричния администраторски профил
|
||||||
|
text_file_repository_writable: Възможност за писане в хранилището с файлове
|
||||||
|
text_plugin_assets_writable: Папката на приставките е разрешена за запис
|
||||||
|
text_rmagick_available: Наличен RMagick (по избор)
|
||||||
|
text_destroy_time_entries_question: "%{hours} часа са отделени на задачите, които искате да изтриете. Какво избирате?"
|
||||||
|
text_destroy_time_entries: Изтриване на отделеното време
|
||||||
|
text_assign_time_entries_to_project: Прехвърляне на отделеното време към проект
|
||||||
|
text_reassign_time_entries: 'Прехвърляне на отделеното време към задача:'
|
||||||
|
text_user_wrote: "%{value} написа:"
|
||||||
|
text_enumeration_destroy_question: "%{count} обекта са свързани с тази стойност."
|
||||||
|
text_enumeration_category_reassign_to: 'Пресвържете ги към тази стойност:'
|
||||||
|
text_email_delivery_not_configured: "Изпращането на e-mail-и не е конфигурирано и известията не са разрешени.\nКонфигурирайте вашия SMTP сървър в config/configuration.yml и рестартирайте Redmine, за да ги разрешите."
|
||||||
|
text_repository_usernames_mapping: "Изберете или променете потребителите в Redmine, съответстващи на потребителите в дневника на хранилището (repository).\nПотребителите с еднакви имена в Redmine и хранилищата се съвместяват автоматично."
|
||||||
|
text_diff_truncated: '... Този diff не е пълен, понеже е надхвърля максималния размер, който може да бъде показан.'
|
||||||
|
text_custom_field_possible_values_info: 'Една стойност на ред'
|
||||||
|
text_wiki_page_destroy_question: Тази страница има %{descendants} страници деца и descendant(s). Какво желаете да правите?
|
||||||
|
text_wiki_page_nullify_children: Запазване на тези страници като коренни страници
|
||||||
|
text_wiki_page_destroy_children: Изтриване на страниците деца и всички техни descendants
|
||||||
|
text_wiki_page_reassign_children: Преназначаване на страниците деца на тази родителска страница
|
||||||
|
text_own_membership_delete_confirmation: "Вие сте на път да премахнете някои или всички ваши разрешения и е възможно след това да не можете да редактирате този проект.\nСигурен ли сте, че искате да продължите?"
|
||||||
|
text_zoom_in: Увеличаване
|
||||||
|
text_zoom_out: Намаляване
|
||||||
|
|
||||||
default_role_manager: Мениджър
|
default_role_manager: Мениджър
|
||||||
default_role_developer: Разработчик
|
default_role_developer: Разработчик
|
||||||
@@ -606,329 +934,5 @@ bg:
|
|||||||
enumeration_issue_priorities: Приоритети на задачи
|
enumeration_issue_priorities: Приоритети на задачи
|
||||||
enumeration_doc_categories: Категории документи
|
enumeration_doc_categories: Категории документи
|
||||||
enumeration_activities: Дейности (time tracking)
|
enumeration_activities: Дейности (time tracking)
|
||||||
label_file_plural: Файлове
|
|
||||||
label_changeset_plural: Ревизии
|
|
||||||
field_column_names: Колони
|
|
||||||
label_default_columns: По подразбиране
|
|
||||||
setting_issue_list_default_columns: Показвани колони по подразбиране
|
|
||||||
setting_repositories_encodings: Кодови таблици
|
|
||||||
notice_no_issue_selected: "Няма избрани задачи."
|
|
||||||
label_bulk_edit_selected_issues: Редактиране на задачи
|
|
||||||
label_no_change_option: (Без промяна)
|
|
||||||
notice_failed_to_save_issues: "Неуспешен запис на %{count} задачи от %{total} избрани: %{ids}."
|
|
||||||
label_theme: Тема
|
|
||||||
label_default: По подразбиране
|
|
||||||
label_search_titles_only: Само в заглавията
|
|
||||||
label_nobody: никой
|
|
||||||
button_change_password: Промяна на парола
|
|
||||||
text_user_mail_option: "За неизбраните проекти, ще получавате известия само за наблюдавани дейности или в които участвате (т.е. автор или назначени на мен)."
|
|
||||||
label_user_mail_option_selected: "За всички събития само в избраните проекти..."
|
|
||||||
label_user_mail_option_all: "За всяко събитие в проектите, в които участвам"
|
|
||||||
label_user_mail_option_none: "Само за наблюдавани или в които участвам (автор или назначени на мен)"
|
|
||||||
setting_emails_footer: Подтекст за e-mail
|
|
||||||
label_float: Дробно
|
|
||||||
button_copy: Копиране
|
|
||||||
mail_body_account_information_external: "Можете да използвате вашия %{value} профил за вход."
|
|
||||||
mail_body_account_information: Информацията за профила ви
|
|
||||||
setting_protocol: Протокол
|
|
||||||
label_user_mail_no_self_notified: "Не искам известия за извършени от мен промени"
|
|
||||||
setting_time_format: Формат на часа
|
|
||||||
label_registration_activation_by_email: активиране на профила по email
|
|
||||||
mail_subject_account_activation_request: "Заявка за активиране на профил в %{value}"
|
|
||||||
mail_body_account_activation_request: "Има новорегистриран потребител (%{value}), очакващ вашето одобрение:"
|
|
||||||
label_registration_automatic_activation: автоматично активиране
|
|
||||||
label_registration_manual_activation: ръчно активиране
|
|
||||||
notice_account_pending: "Профилът Ви е създаден и очаква одобрение от администратор."
|
|
||||||
field_time_zone: Часова зона
|
|
||||||
text_caracters_minimum: "Минимум %{count} символа."
|
|
||||||
setting_bcc_recipients: Получатели на скрито копие (bcc)
|
|
||||||
button_annotate: Анотация
|
|
||||||
label_issues_by: "Задачи по %{value}"
|
|
||||||
field_searchable: С възможност за търсене
|
|
||||||
label_display_per_page: "На страница по: %{value}"
|
|
||||||
setting_per_page_options: Опции за страниране
|
|
||||||
label_age: Възраст
|
|
||||||
notice_default_data_loaded: Примерната информацията е успешно заредена.
|
|
||||||
text_load_default_configuration: Зареждане на примерна информация
|
|
||||||
text_no_configuration_data: "Все още не са конфигурирани Роли, тракери, състояния на задачи и работен процес.\nСтрого се препоръчва зареждането на примерната информация. Веднъж заредена ще имате възможност да я редактирате."
|
|
||||||
error_can_t_load_default_data: "Грешка при зареждане на примерната информация: %{value}"
|
|
||||||
button_update: Обновяване
|
|
||||||
label_change_properties: Промяна на настройки
|
|
||||||
label_general: Основни
|
|
||||||
label_repository_plural: Хранилища
|
|
||||||
label_associated_revisions: Асоциирани ревизии
|
|
||||||
setting_user_format: Потребителски формат
|
|
||||||
text_status_changed_by_changeset: "Приложено с ревизия %{value}."
|
|
||||||
label_more: Още
|
|
||||||
text_issues_destroy_confirmation: 'Сигурни ли сте, че искате да изтриете избраните задачи?'
|
|
||||||
label_scm: SCM (Система за контрол на кода)
|
|
||||||
text_select_project_modules: 'Изберете активните модули за този проект:'
|
|
||||||
label_issue_added: Добавена задача
|
|
||||||
label_issue_updated: Обновена задача
|
|
||||||
label_document_added: Добавен документ
|
|
||||||
label_message_posted: Добавено съобщение
|
|
||||||
label_file_added: Добавен файл
|
|
||||||
label_news_added: Добавена новина
|
|
||||||
project_module_boards: Форуми
|
|
||||||
project_module_issue_tracking: Тракинг
|
|
||||||
project_module_wiki: Wiki
|
|
||||||
project_module_files: Файлове
|
|
||||||
project_module_documents: Документи
|
|
||||||
project_module_repository: Хранилище
|
|
||||||
project_module_news: Новини
|
|
||||||
project_module_time_tracking: Отделяне на време
|
|
||||||
text_file_repository_writable: Възможност за писане в хранилището с файлове
|
|
||||||
text_default_administrator_account_changed: Сменен фабричния администраторски профил
|
|
||||||
text_rmagick_available: Наличен RMagick (по избор)
|
|
||||||
button_configure: Конфигуриране
|
|
||||||
label_plugins: Плъгини
|
|
||||||
label_ldap_authentication: LDAP оторизация
|
|
||||||
label_downloads_abbr: D/L
|
|
||||||
label_this_month: текущия месец
|
|
||||||
label_last_n_days: "последните %{count} дни"
|
|
||||||
label_all_time: всички
|
|
||||||
label_this_year: текущата година
|
|
||||||
label_date_range: Период
|
|
||||||
label_last_week: последната седмица
|
|
||||||
label_yesterday: вчера
|
|
||||||
label_last_month: последния месец
|
|
||||||
label_add_another_file: Добавяне на друг файл
|
|
||||||
label_optional_description: Незадължително описание
|
|
||||||
text_destroy_time_entries_question: "%{hours} часа са отделени на задачите, които искате да изтриете. Какво избирате?"
|
|
||||||
error_issue_not_found_in_project: 'Задачата не е намерена или не принадлежи на този проект'
|
|
||||||
text_assign_time_entries_to_project: Прехвърляне на отделеното време към проект
|
|
||||||
text_destroy_time_entries: Изтриване на отделеното време
|
|
||||||
text_reassign_time_entries: 'Прехвърляне на отделеното време към задача:'
|
|
||||||
setting_activity_days_default: Брой дни показвани на таб Дейност
|
|
||||||
label_chronological_order: Хронологичен ред
|
|
||||||
field_comments_sorting: Сортиране на коментарите
|
|
||||||
label_reverse_chronological_order: Обратен хронологичен ред
|
|
||||||
label_preferences: Предпочитания
|
|
||||||
setting_display_subprojects_issues: Показване на подпроектите в проектите по подразбиране
|
|
||||||
label_overall_activity: Цялостна дейност
|
|
||||||
setting_default_projects_public: Новите проекти са публични по подразбиране
|
|
||||||
error_scm_annotate: "Обектът не съществува или не може да бъде анотиран."
|
|
||||||
label_planning: Планиране
|
|
||||||
text_subprojects_destroy_warning: "Неговите подпроекти: %{value} също ще бъдат изтрити."
|
|
||||||
label_and_its_subprojects: "%{value} и неговите подпроекти"
|
|
||||||
mail_body_reminder: "%{count} задачи, назначени на вас са с краен срок в следващите %{days} дни:"
|
|
||||||
mail_subject_reminder: "%{count} задачи с краен срок с следващите %{days} дни"
|
|
||||||
text_user_wrote: "%{value} написа:"
|
|
||||||
label_duplicated_by: дублирана от
|
|
||||||
setting_enabled_scm: Разрешена SCM
|
|
||||||
text_enumeration_category_reassign_to: 'Пресвържете ги към тази стойност:'
|
|
||||||
text_enumeration_destroy_question: "%{count} обекта са свързани с тази стойност."
|
|
||||||
label_incoming_emails: Входящи e-mail-и
|
|
||||||
label_generate_key: Генериране на ключ
|
|
||||||
setting_mail_handler_api_enabled: Разрешаване на WS за входящи e-mail-и
|
|
||||||
setting_mail_handler_api_key: API ключ
|
|
||||||
text_email_delivery_not_configured: "Изпращането на e-mail-и не е конфигурирано и известията не са разрешени.\nКонфигурирайте вашия SMTP сървър в config/email.yml и рестартирайте Redmine, за да ги разрешите."
|
|
||||||
field_parent_title: Родителска страница
|
|
||||||
label_issue_watchers: Наблюдатели
|
|
||||||
setting_commit_logs_encoding: Кодова таблица на съобщенията при поверяване
|
|
||||||
button_quote: Цитат
|
|
||||||
setting_sequential_project_identifiers: Генериране на последователни проектни идентификатори
|
|
||||||
notice_unable_delete_version: Невъзможност за изтриване на версия
|
|
||||||
label_renamed: преименувано
|
|
||||||
label_copied: копирано
|
|
||||||
setting_plain_text_mail: само чист текст (без HTML)
|
|
||||||
permission_view_files: Разглеждане на файлове
|
|
||||||
permission_edit_issues: Редактиране на задачи
|
|
||||||
permission_edit_own_time_entries: Редактиране на собствените time logs
|
|
||||||
permission_manage_public_queries: Управление на публичните заявки
|
|
||||||
permission_add_issues: Добавяне на задачи
|
|
||||||
permission_log_time: Log spent time
|
|
||||||
permission_view_changesets: Разглеждане на changesets
|
|
||||||
permission_view_time_entries: Разглеждане на изразходваното време
|
|
||||||
permission_manage_versions: Управление на версиите
|
|
||||||
permission_manage_wiki: Управление на wiki
|
|
||||||
permission_manage_categories: Управление на категориите задачи
|
|
||||||
permission_protect_wiki_pages: Заключване на wiki страници
|
|
||||||
permission_comment_news: Коментиране на новини
|
|
||||||
permission_delete_messages: Изтриване на съобщения
|
|
||||||
permission_select_project_modules: Избор на проектни модули
|
|
||||||
permission_manage_documents: Управление на документи
|
|
||||||
permission_edit_wiki_pages: Редактиране на wiki страници
|
|
||||||
permission_add_issue_watchers: Добавяне на наблюдатели
|
|
||||||
permission_view_gantt: Разглеждане на мрежов график
|
|
||||||
permission_move_issues: Преместване на задачи
|
|
||||||
permission_manage_issue_relations: Управление на връзките между задачите
|
|
||||||
permission_delete_wiki_pages: Изтриване на wiki страници
|
|
||||||
permission_manage_boards: Управление на boards
|
|
||||||
permission_delete_wiki_pages_attachments: Изтриване на прикачени файлове
|
|
||||||
permission_view_wiki_edits: Разглеждане на wiki история
|
|
||||||
permission_add_messages: Публикуване на съобщения
|
|
||||||
permission_view_messages: Разглеждане на съобщения
|
|
||||||
permission_manage_files: Управление на файлове
|
|
||||||
permission_edit_issue_notes: Редактиране на бележки
|
|
||||||
permission_manage_news: Управление на новини
|
|
||||||
permission_view_calendar: Разглеждане на календари
|
|
||||||
permission_manage_members: Управление на членовете (на екип)
|
|
||||||
permission_edit_messages: Редактиране на съобщения
|
|
||||||
permission_delete_issues: Изтриване на задачи
|
|
||||||
permission_view_issue_watchers: Разглеждане на списък с наблюдатели
|
|
||||||
permission_manage_repository: Управление на хранилища
|
|
||||||
permission_commit_access: Поверяване
|
|
||||||
permission_browse_repository: Разглеждане на хранилища
|
|
||||||
permission_view_documents: Разглеждане на документи
|
|
||||||
permission_edit_project: Редактиране на проект
|
|
||||||
permission_add_issue_notes: Добаване на бележки
|
|
||||||
permission_save_queries: Запис на запитвания (queries)
|
|
||||||
permission_view_wiki_pages: Разглеждане на wiki
|
|
||||||
permission_rename_wiki_pages: Преименуване на wiki страници
|
|
||||||
permission_edit_time_entries: Редактиране на time logs
|
|
||||||
permission_edit_own_issue_notes: Редактиране на собствени бележки
|
|
||||||
setting_gravatar_enabled: Използване на портребителски икони от Gravatar
|
|
||||||
label_example: Пример
|
|
||||||
text_repository_usernames_mapping: "Select ou update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
|
|
||||||
permission_edit_own_messages: Редактиране на собствени съобщения
|
|
||||||
permission_delete_own_messages: Изтриване на собствени съобщения
|
|
||||||
label_user_activity: "Активност на %{value}"
|
|
||||||
label_updated_time_by: "Обновена от %{author} преди %{age}"
|
|
||||||
text_diff_truncated: '... Този diff не е пълен, понеже е надхвърля максималния размер, който може да бъде показан.'
|
|
||||||
setting_diff_max_lines_displayed: Максимален брой показани diff редове
|
|
||||||
text_plugin_assets_writable: Папката на приставките е разрешена за запис
|
|
||||||
warning_attachments_not_saved: "%{count} файла не бяха записани."
|
|
||||||
button_create_and_continue: Създаване и продължаване
|
|
||||||
text_custom_field_possible_values_info: 'Една стойност на ред'
|
|
||||||
label_display: Display
|
|
||||||
field_editable: Editable
|
|
||||||
setting_repository_log_display_limit: Максимален брой на показванете ревизии в лог файла
|
|
||||||
setting_file_max_size_displayed: Максимален размер на текстовите файлове, показвани inline
|
|
||||||
field_watcher: Наблюдател
|
|
||||||
setting_openid: Рарешаване на OpenID вход и регистрация
|
|
||||||
field_identity_url: OpenID URL
|
|
||||||
label_login_with_open_id_option: или вход чрез OpenID
|
|
||||||
field_content: Съдържание
|
|
||||||
label_descending: Намаляващ
|
|
||||||
label_sort: Сортиране
|
|
||||||
label_ascending: Нарастващ
|
|
||||||
label_date_from_to: От %{start} до %{end}
|
|
||||||
label_greater_or_equal: ">="
|
|
||||||
label_less_or_equal: <=
|
|
||||||
text_wiki_page_destroy_question: Тази страница има %{descendants} страници деца и descendant(s). Какво желаете да правите?
|
|
||||||
text_wiki_page_reassign_children: Преназначаване на страниците деца на тази родителска страница
|
|
||||||
text_wiki_page_nullify_children: Запазване на тези страници като коренни страници
|
|
||||||
text_wiki_page_destroy_children: Изтриване на страниците деца и всички техни descendants
|
|
||||||
setting_password_min_length: Минимална дължина на парола
|
|
||||||
field_group_by: Групиране на резултатите по
|
|
||||||
mail_subject_wiki_content_updated: "Wiki страницата '%{id}' не беше обновена"
|
|
||||||
label_wiki_content_added: Wiki страница беше добавена
|
|
||||||
mail_subject_wiki_content_added: "Wiki страницата '%{id}' беше добавена"
|
|
||||||
mail_body_wiki_content_added: Wiki страницата '%{id}' беше добавена от %{author}.
|
|
||||||
label_wiki_content_updated: Wiki страница беше обновена
|
|
||||||
mail_body_wiki_content_updated: Wiki страницата '%{id}' беше обновена от %{author}.
|
|
||||||
permission_add_project: Създаване на проект
|
|
||||||
setting_new_project_user_role_id: Роля, давана на потребител, създаващ проекти, който не е администратор
|
|
||||||
label_view_all_revisions: Разглеждане на всички ревизии
|
|
||||||
label_tag: Версия
|
|
||||||
label_branch: работен вариант
|
|
||||||
error_no_tracker_in_project: Няма асоциирани тракери с този проект. Проверете настройките на проекта.
|
|
||||||
error_no_default_issue_status: Няма установено подразбиращо се състояние за задачите. Моля проверете вашата конфигурация (Вижте "Администрация -> Състояния на задачи").
|
|
||||||
text_journal_changed: "%{label} променен от %{old} на %{new}"
|
|
||||||
text_journal_set_to: "%{label} установен на %{value}"
|
|
||||||
text_journal_deleted: "%{label} изтрит (%{old})"
|
|
||||||
label_group_plural: Групи
|
|
||||||
label_group: Група
|
|
||||||
label_group_new: Нова група
|
|
||||||
label_time_entry_plural: Използвано време
|
|
||||||
text_journal_added: "Добавено %{label} %{value}"
|
|
||||||
field_active: Активен
|
|
||||||
enumeration_system_activity: Системна активност
|
enumeration_system_activity: Системна активност
|
||||||
permission_delete_issue_watchers: Изтриване на наблюдатели
|
|
||||||
version_status_closed: затворена
|
|
||||||
version_status_locked: заключена
|
|
||||||
version_status_open: отворена
|
|
||||||
error_can_not_reopen_issue_on_closed_version: Задача, асоциирана със затворена версия не може да бъде отворена отново
|
|
||||||
label_user_anonymous: Анонимен
|
|
||||||
button_move_and_follow: Преместване и продължаване
|
|
||||||
setting_default_projects_modules: Активирани модули по подразбиране за нов проект
|
|
||||||
setting_gravatar_default: Подразбиращо се изображение от Gravatar
|
|
||||||
field_sharing: Sharing
|
|
||||||
label_version_sharing_hierarchy: С проектна йерархия
|
|
||||||
label_version_sharing_system: С всички проекти
|
|
||||||
label_version_sharing_descendants: С подпроекти
|
|
||||||
label_version_sharing_tree: С дърво на проектите
|
|
||||||
label_version_sharing_none: Не споделен
|
|
||||||
error_can_not_archive_project: Този проект не може да бъде архивиран
|
|
||||||
button_duplicate: Дублиране
|
|
||||||
button_copy_and_follow: Копиране и продължаване
|
|
||||||
label_copy_source: Източник
|
|
||||||
setting_issue_done_ratio: Изчисление на процента на готови задачи с
|
|
||||||
setting_issue_done_ratio_issue_status: Използване на състоянието на задачите
|
|
||||||
error_issue_done_ratios_not_updated: Процентът на завършените задачи не е обновен.
|
|
||||||
error_workflow_copy_target: Моля изберете тракер(и) и роля (роли).
|
|
||||||
setting_issue_done_ratio_issue_field: Използване на поле '% Прогрес'
|
|
||||||
label_copy_same_as_target: Също като целта
|
|
||||||
label_copy_target: Цел
|
|
||||||
notice_issue_done_ratios_updated: Обновен процент на завършените задачи.
|
|
||||||
error_workflow_copy_source: Моля изберете source тракер или роля
|
|
||||||
label_update_issue_done_ratios: Обновяване на процента на завършените задачи
|
|
||||||
setting_start_of_week: Първи ден на седмицата
|
|
||||||
permission_view_issues: Разглеждане на задачите
|
|
||||||
label_display_used_statuses_only: Показване само на състоянията, използвани от този тракер
|
|
||||||
label_revision_id: Ревизия %{value}
|
|
||||||
label_api_access_key: API ключ за достъп
|
|
||||||
label_api_access_key_created_on: API ключ за достъп е създаден преди %{value}
|
|
||||||
label_feeds_access_key: RSS access ключ
|
|
||||||
notice_api_access_key_reseted: Вашият API ключ за достъп беше изчистен.
|
|
||||||
setting_rest_api_enabled: Разрешаване на REST web сървис
|
|
||||||
label_missing_api_access_key: Липсващ API ключ
|
|
||||||
label_missing_feeds_access_key: Липсващ RSS ключ за достъп
|
|
||||||
button_show: Показване
|
|
||||||
text_line_separated: Позволени са много стойности (по едно на ред).
|
|
||||||
setting_mail_handler_body_delimiters: Отрязване на e-mail-ите след един от тези редове
|
|
||||||
permission_add_subprojects: Създаване на подпроекти
|
|
||||||
label_subproject_new: Нов подпроект
|
|
||||||
text_own_membership_delete_confirmation: |-
|
|
||||||
Вие сте на път да премахнете някои или всички ваши разрешения и е възможно след това на да не можете да редатирате този проект.
|
|
||||||
Сигурен ли сте, че искате да продължите?
|
|
||||||
label_close_versions: Затваряне на завършените версии
|
|
||||||
label_board_sticky: Sticky
|
|
||||||
label_board_locked: Заключена
|
|
||||||
permission_export_wiki_pages: Експорт на wiki страници
|
|
||||||
setting_cache_formatted_text: Cache formatted text
|
|
||||||
permission_manage_project_activities: Управление на дейностите на проекта
|
|
||||||
error_unable_delete_issue_status: Невъзможност за изтриване на състояние на задача
|
|
||||||
label_profile: Профил
|
|
||||||
permission_manage_subtasks: Управление на подзадачите
|
|
||||||
field_parent_issue: Родителска задача
|
|
||||||
label_subtask_plural: Подзадачи
|
|
||||||
label_project_copy_notifications: Изпращане на Send e-mail известия по време на копирането на проекта
|
|
||||||
error_can_not_delete_custom_field: Невъзможност за изтриване на потребителско поле
|
|
||||||
error_unable_to_connect: Невъзможност за свързване с (%{value})
|
|
||||||
error_can_not_remove_role: Тази роля се използва и не може да бъде изтрита.
|
|
||||||
error_can_not_delete_tracker: Този тракер съдържа задачи и не може да бъде изтрит.
|
|
||||||
field_principal: Principal
|
|
||||||
label_my_page_block: Блокове в личната страница
|
|
||||||
notice_failed_to_save_members: "Невъзможност за запис на член(ове): %{errors}."
|
|
||||||
text_zoom_out: Намаляване
|
|
||||||
text_zoom_in: Увеличаване
|
|
||||||
notice_unable_delete_time_entry: Невъзможност за изтриване на запис на time log.
|
|
||||||
label_overall_spent_time: Общо употребено време
|
|
||||||
field_time_entries: Log time
|
|
||||||
notice_not_authorized_archived_project: Проектът, който се опитвате да видите е архивиран.
|
|
||||||
text_tip_issue_end_day: задача, завършваща този ден
|
|
||||||
field_text: Текстово поле
|
|
||||||
label_user_mail_option_only_owner: Само за неща, на които аз съм собственик
|
|
||||||
field_member_of_group: Член на група
|
|
||||||
project_module_gantt: Мрежов график
|
|
||||||
text_are_you_sure_with_children: Изтриване на задачата и нейните подзадачи?
|
|
||||||
text_tip_issue_begin_end_day: задача, започваща и завършваща този ден
|
|
||||||
setting_default_notification_option: Подразбиращ се начин за известяване
|
|
||||||
project_module_calendar: Календар
|
|
||||||
label_user_mail_option_only_my_events: Само за неща, в които съм включен/а
|
|
||||||
text_tip_issue_begin_day: задача, започваща този ден
|
|
||||||
label_user_mail_option_only_assigned: Само за неща, назначени на мен
|
|
||||||
button_edit_associated_wikipage: "Редактиране на асоциираната Wiki страница: %{page_title}"
|
|
||||||
field_assigned_to_role: Assignee's role
|
|
||||||
field_start_date: Начална дата
|
|
||||||
label_principal_search: "Търсене на потребител или група:"
|
|
||||||
label_user_search: "Търсене на потребител:"
|
|
||||||
field_visible: Видим
|
|
||||||
setting_emails_header: Emails header
|
|
||||||
setting_commit_logtime_activity_id: Дейност при отчитане на работното време
|
|
||||||
text_time_logged_by_changeset: Приложено в ревизия %{value}.
|
|
||||||
setting_commit_logtime_enabled: Разрешаване на отчитането на работното време
|
|
||||||
notice_gantt_chart_truncated: Мрежовият график е съкратен, понеже броят на обектите, които могат да бъдат показани е твърде голям (%{max})
|
|
||||||
setting_gantt_items_limit: Максимален брой обекти, които да се показват в мрежов график
|
|
||||||
@@ -546,7 +546,7 @@ cs:
|
|||||||
label_relation_delete: Odstranit souvislost
|
label_relation_delete: Odstranit souvislost
|
||||||
label_relates_to: související s
|
label_relates_to: související s
|
||||||
label_duplicates: duplicity
|
label_duplicates: duplicity
|
||||||
label_blocks: bloků
|
label_blocks: blokuje
|
||||||
label_blocked_by: zablokován
|
label_blocked_by: zablokován
|
||||||
label_precedes: předchází
|
label_precedes: předchází
|
||||||
label_follows: následuje
|
label_follows: následuje
|
||||||
|
|||||||
@@ -166,7 +166,7 @@ fr:
|
|||||||
notice_successful_create: Création effectuée avec succès.
|
notice_successful_create: Création effectuée avec succès.
|
||||||
notice_successful_update: Mise à jour effectuée avec succès.
|
notice_successful_update: Mise à jour effectuée avec succès.
|
||||||
notice_successful_delete: Suppression effectuée avec succès.
|
notice_successful_delete: Suppression effectuée avec succès.
|
||||||
notice_successful_connection: Connection réussie.
|
notice_successful_connection: Connexion réussie.
|
||||||
notice_file_not_found: "La page à laquelle vous souhaitez accéder n'existe pas ou a été supprimée."
|
notice_file_not_found: "La page à laquelle vous souhaitez accéder n'existe pas ou a été supprimée."
|
||||||
notice_locking_conflict: Les données ont été mises à jour par un autre utilisateur. Mise à jour impossible.
|
notice_locking_conflict: Les données ont été mises à jour par un autre utilisateur. Mise à jour impossible.
|
||||||
notice_not_authorized: "Vous n'êtes pas autorisés à accéder à cette page."
|
notice_not_authorized: "Vous n'êtes pas autorisés à accéder à cette page."
|
||||||
@@ -449,6 +449,9 @@ fr:
|
|||||||
label_issue_view_all: Voir toutes les demandes
|
label_issue_view_all: Voir toutes les demandes
|
||||||
label_issue_added: Demande ajoutée
|
label_issue_added: Demande ajoutée
|
||||||
label_issue_updated: Demande mise à jour
|
label_issue_updated: Demande mise à jour
|
||||||
|
label_issue_note_added: Note ajoutée
|
||||||
|
label_issue_status_updated: Statut changé
|
||||||
|
label_issue_priority_updated: Priorité changée
|
||||||
label_issues_by: "Demandes par %{value}"
|
label_issues_by: "Demandes par %{value}"
|
||||||
label_document: Document
|
label_document: Document
|
||||||
label_document_new: Nouveau document
|
label_document_new: Nouveau document
|
||||||
@@ -486,7 +489,7 @@ fr:
|
|||||||
label_my_page: Ma page
|
label_my_page: Ma page
|
||||||
label_my_account: Mon compte
|
label_my_account: Mon compte
|
||||||
label_my_projects: Mes projets
|
label_my_projects: Mes projets
|
||||||
label_my_page_block: Ma page bloque
|
label_my_page_block: Blocs disponibles
|
||||||
label_administration: Administration
|
label_administration: Administration
|
||||||
label_login: Connexion
|
label_login: Connexion
|
||||||
label_logout: Déconnexion
|
label_logout: Déconnexion
|
||||||
|
|||||||
@@ -275,9 +275,9 @@ nl:
|
|||||||
field_user: Gebruiker
|
field_user: Gebruiker
|
||||||
field_value: Waarde
|
field_value: Waarde
|
||||||
field_version: Versie
|
field_version: Versie
|
||||||
general_csv_decimal_separator: '.'
|
general_csv_decimal_separator: ','
|
||||||
general_csv_encoding: ISO-8859-1
|
general_csv_encoding: ISO-8859-1
|
||||||
general_csv_separator: ','
|
general_csv_separator: ';'
|
||||||
general_first_day_of_week: '7'
|
general_first_day_of_week: '7'
|
||||||
general_lang_name: 'Nederlands'
|
general_lang_name: 'Nederlands'
|
||||||
general_pdf_encoding: ISO-8859-1
|
general_pdf_encoding: ISO-8859-1
|
||||||
|
|||||||
+23
-23
@@ -208,6 +208,7 @@ sv:
|
|||||||
notice_unable_delete_version: Denna version var inte möjlig att ta bort.
|
notice_unable_delete_version: Denna version var inte möjlig att ta bort.
|
||||||
notice_unable_delete_time_entry: Tidloggning kunde inte tas bort.
|
notice_unable_delete_time_entry: Tidloggning kunde inte tas bort.
|
||||||
notice_issue_done_ratios_updated: % klart uppdaterade.
|
notice_issue_done_ratios_updated: % klart uppdaterade.
|
||||||
|
notice_gantt_chart_truncated: "Schemat förminskades eftersom det överskrider det maximala antalet aktiviteter som får visas (%{max})"
|
||||||
|
|
||||||
error_can_t_load_default_data: "Standardkonfiguration gick inte att läsa in: %{value}"
|
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."
|
error_scm_not_found: "Inlägg och/eller revision finns inte i detta versionsarkiv."
|
||||||
@@ -217,7 +218,7 @@ sv:
|
|||||||
error_no_tracker_in_project: 'Ingen ärendetyp är associerad med projektet. Vänligen kontrollera projektinställningarna.'
|
error_no_tracker_in_project: 'Ingen ärendetyp är associerad med projektet. Vänligen kontrollera projektinställningarna.'
|
||||||
error_no_default_issue_status: 'Ingen status är definierad som standard för nya ärenden. Vänligen kontrollera din konfiguration (Gå till "Administration -> Ärendestatus").'
|
error_no_default_issue_status: 'Ingen status är definierad som standard för nya ärenden. Vänligen kontrollera din konfiguration (Gå till "Administration -> Ärendestatus").'
|
||||||
error_can_not_delete_custom_field: Kan inte ta bort användardefinerat fält
|
error_can_not_delete_custom_field: Kan inte ta bort användardefinerat fält
|
||||||
error_can_not_delete_tracker: Det finns ärenden av denna typ och den är därför inte möjlig att ta bort.
|
error_can_not_delete_tracker: "Det finns ärenden av denna typ och den är därför inte möjlig att ta bort."
|
||||||
error_can_not_remove_role: "Denna roll används och den är därför inte möjlig att ta bort."
|
error_can_not_remove_role: "Denna roll används och den är därför inte möjlig att ta bort."
|
||||||
error_can_not_reopen_issue_on_closed_version: 'Ett ärende tilldelat en stängd version kan inte öppnas på nytt'
|
error_can_not_reopen_issue_on_closed_version: 'Ett ärende tilldelat en stängd version kan inte öppnas på nytt'
|
||||||
error_can_not_archive_project: Detta projekt kan inte arkiveras
|
error_can_not_archive_project: Detta projekt kan inte arkiveras
|
||||||
@@ -225,7 +226,7 @@ sv:
|
|||||||
error_workflow_copy_source: 'Vänligen välj källans ärendetyp eller roll'
|
error_workflow_copy_source: 'Vänligen välj källans ärendetyp eller roll'
|
||||||
error_workflow_copy_target: 'Vänligen välj ärendetyp(er) och roll(er) för mål'
|
error_workflow_copy_target: 'Vänligen välj ärendetyp(er) och roll(er) för mål'
|
||||||
error_unable_delete_issue_status: 'Ärendestatus kunde inte tas bort'
|
error_unable_delete_issue_status: 'Ärendestatus kunde inte tas bort'
|
||||||
error_unable_to_connect: Kan inte ansluta (%{value})
|
error_unable_to_connect: "Kan inte ansluta (%{value})"
|
||||||
|
|
||||||
warning_attachments_not_saved: "%{count} fil(er) kunde inte sparas."
|
warning_attachments_not_saved: "%{count} fil(er) kunde inte sparas."
|
||||||
|
|
||||||
@@ -240,9 +241,9 @@ sv:
|
|||||||
mail_subject_reminder: "%{count} ärende(n) har deadline under de kommande %{days} dagarna"
|
mail_subject_reminder: "%{count} ärende(n) har deadline under de kommande %{days} dagarna"
|
||||||
mail_body_reminder: "%{count} ärende(n) som är tilldelat dig har deadline under de %{days} dagarna:"
|
mail_body_reminder: "%{count} ärende(n) som är tilldelat dig har deadline under de %{days} dagarna:"
|
||||||
mail_subject_wiki_content_added: "'%{id}' wikisida has lagts till"
|
mail_subject_wiki_content_added: "'%{id}' wikisida has lagts till"
|
||||||
mail_body_wiki_content_added: The '%{id}' wikisida has lagts till av %{author}.
|
mail_body_wiki_content_added: "The '%{id}' wikisida has lagts till av %{author}."
|
||||||
mail_subject_wiki_content_updated: "'%{id}' wikisida har uppdaterats"
|
mail_subject_wiki_content_updated: "'%{id}' wikisida har uppdaterats"
|
||||||
mail_body_wiki_content_updated: The '%{id}' wikisida har uppdaterats av %{author}.
|
mail_body_wiki_content_updated: "The '%{id}' wikisida har uppdaterats av %{author}."
|
||||||
|
|
||||||
gui_validation_error: 1 fel
|
gui_validation_error: 1 fel
|
||||||
gui_validation_error_plural: "%{count} fel"
|
gui_validation_error_plural: "%{count} fel"
|
||||||
@@ -340,8 +341,8 @@ sv:
|
|||||||
field_group_by: Gruppera resultat efter
|
field_group_by: Gruppera resultat efter
|
||||||
field_sharing: Delning
|
field_sharing: Delning
|
||||||
field_parent_issue: Förälderaktivitet
|
field_parent_issue: Förälderaktivitet
|
||||||
field_member_of_group: Tilldelad användares grupp
|
field_member_of_group: "Tilldelad användares grupp"
|
||||||
field_assigned_to_role: Tilldelad användares roll
|
field_assigned_to_role: "Tilldelad användares roll"
|
||||||
field_text: Textfält
|
field_text: Textfält
|
||||||
field_visible: Synlig
|
field_visible: Synlig
|
||||||
|
|
||||||
@@ -380,7 +381,7 @@ sv:
|
|||||||
setting_activity_days_default: Dagar som visas på projektaktivitet
|
setting_activity_days_default: Dagar som visas på projektaktivitet
|
||||||
setting_display_subprojects_issues: Visa ärenden från underprojekt i huvudprojekt
|
setting_display_subprojects_issues: Visa ärenden från underprojekt i huvudprojekt
|
||||||
setting_enabled_scm: Aktivera SCM
|
setting_enabled_scm: Aktivera SCM
|
||||||
setting_mail_handler_body_delimiters: Trunkera mail efter en av följande rader
|
setting_mail_handler_body_delimiters: "Trunkera mail efter en av följande rader"
|
||||||
setting_mail_handler_api_enabled: Aktivera WS för inkommande mail
|
setting_mail_handler_api_enabled: Aktivera WS för inkommande mail
|
||||||
setting_mail_handler_api_key: API-nyckel
|
setting_mail_handler_api_key: API-nyckel
|
||||||
setting_sequential_project_identifiers: Generera projektidentifierare sekventiellt
|
setting_sequential_project_identifiers: Generera projektidentifierare sekventiellt
|
||||||
@@ -400,6 +401,9 @@ sv:
|
|||||||
setting_rest_api_enabled: Aktivera REST webbtjänst
|
setting_rest_api_enabled: Aktivera REST webbtjänst
|
||||||
setting_cache_formatted_text: Cacha formaterad text
|
setting_cache_formatted_text: Cacha formaterad text
|
||||||
setting_default_notification_option: Standard notifieringsalternativ
|
setting_default_notification_option: Standard notifieringsalternativ
|
||||||
|
setting_commit_logtime_enabled: Aktivera tidloggning
|
||||||
|
setting_commit_logtime_activity_id: Aktivitet för loggad tid
|
||||||
|
setting_gantt_items_limit: Maximalt antal aktiviteter som visas i gantt-schemat
|
||||||
|
|
||||||
permission_add_project: Skapa projekt
|
permission_add_project: Skapa projekt
|
||||||
permission_add_subprojects: Skapa underprojekt
|
permission_add_subprojects: Skapa underprojekt
|
||||||
@@ -581,7 +585,7 @@ sv:
|
|||||||
label_version_plural: Versioner
|
label_version_plural: Versioner
|
||||||
label_close_versions: Stäng klara versioner
|
label_close_versions: Stäng klara versioner
|
||||||
label_confirmation: Bekräftelse
|
label_confirmation: Bekräftelse
|
||||||
label_export_to: Exportera till
|
label_export_to: 'Finns även som:'
|
||||||
label_read: Läs...
|
label_read: Läs...
|
||||||
label_public_projects: Publika projekt
|
label_public_projects: Publika projekt
|
||||||
label_open_issues: öppen
|
label_open_issues: öppen
|
||||||
@@ -666,7 +670,7 @@ sv:
|
|||||||
label_tag: Tag
|
label_tag: Tag
|
||||||
label_revision: Revision
|
label_revision: Revision
|
||||||
label_revision_plural: Revisioner
|
label_revision_plural: Revisioner
|
||||||
label_revision_id: Revision %{value}
|
label_revision_id: "Revision %{value}"
|
||||||
label_associated_revisions: Associerade revisioner
|
label_associated_revisions: Associerade revisioner
|
||||||
label_added: tillagd
|
label_added: tillagd
|
||||||
label_modified: modifierad
|
label_modified: modifierad
|
||||||
@@ -775,10 +779,10 @@ sv:
|
|||||||
label_search_titles_only: Sök endast i titlar
|
label_search_titles_only: Sök endast i titlar
|
||||||
label_user_mail_option_all: "För alla händelser i mina projekt"
|
label_user_mail_option_all: "För alla händelser i mina projekt"
|
||||||
label_user_mail_option_selected: "För alla händelser i markerade projekt..."
|
label_user_mail_option_selected: "För alla händelser i markerade projekt..."
|
||||||
label_user_mail_option_none: Inga händelser
|
label_user_mail_option_none: "Inga händelser"
|
||||||
label_user_mail_option_only_my_events: Endast för saker jag bevakar eller är inblandad i
|
label_user_mail_option_only_my_events: "Endast för saker jag bevakar eller är inblandad i"
|
||||||
label_user_mail_option_only_assigned: Endast för saker jag är tilldelad
|
label_user_mail_option_only_assigned: "Endast för saker jag är tilldelad"
|
||||||
label_user_mail_option_only_owner: Endast för saker jag äger
|
label_user_mail_option_only_owner: "Endast för saker jag äger"
|
||||||
label_user_mail_no_self_notified: "Jag vill inte bli underrättad om ändringar som jag har gjort"
|
label_user_mail_no_self_notified: "Jag vill inte bli underrättad om ändringar som jag har gjort"
|
||||||
label_registration_activation_by_email: kontoaktivering med mail
|
label_registration_activation_by_email: kontoaktivering med mail
|
||||||
label_registration_manual_activation: manuell kontoaktivering
|
label_registration_manual_activation: manuell kontoaktivering
|
||||||
@@ -825,7 +829,7 @@ sv:
|
|||||||
label_display_used_statuses_only: Visa endast status som används av denna ärendetyp
|
label_display_used_statuses_only: Visa endast status som används av denna ärendetyp
|
||||||
label_api_access_key: API-nyckel
|
label_api_access_key: API-nyckel
|
||||||
label_missing_api_access_key: Saknar en API-nyckel
|
label_missing_api_access_key: Saknar en API-nyckel
|
||||||
label_api_access_key_created_on: API-nyckel skapad för %{value} sedan
|
label_api_access_key_created_on: "API-nyckel skapad för %{value} sedan"
|
||||||
label_profile: Profil
|
label_profile: Profil
|
||||||
label_subtask_plural: Underaktiviteter
|
label_subtask_plural: Underaktiviteter
|
||||||
label_project_copy_notifications: Skicka mailnotifieringar när projektet kopieras
|
label_project_copy_notifications: Skicka mailnotifieringar när projektet kopieras
|
||||||
@@ -921,6 +925,7 @@ sv:
|
|||||||
text_no_configuration_data: "Roller, ärendetyper, ärendestatus och arbetsflöden har inte konfigurerats ännu.\nDet rekommenderas att läsa in standardkonfigurationen. Du kommer att kunna göra ändringar efter att den blivit inläst."
|
text_no_configuration_data: "Roller, ärendetyper, ärendestatus och arbetsflöden har inte konfigurerats ännu.\nDet rekommenderas att läsa in standardkonfigurationen. Du kommer att kunna göra ändringar efter att den blivit inläst."
|
||||||
text_load_default_configuration: Läs in standardkonfiguration
|
text_load_default_configuration: Läs in standardkonfiguration
|
||||||
text_status_changed_by_changeset: "Tilldelad i changeset %{value}."
|
text_status_changed_by_changeset: "Tilldelad i changeset %{value}."
|
||||||
|
text_time_logged_by_changeset: "Tilldelad i changeset %{value}."
|
||||||
text_issues_destroy_confirmation: 'Är du säker på att du vill radera markerade ärende(n) ?'
|
text_issues_destroy_confirmation: 'Är du säker på att du vill radera markerade ärende(n) ?'
|
||||||
text_select_project_modules: 'Välj vilka moduler som ska vara aktiva för projektet:'
|
text_select_project_modules: 'Välj vilka moduler som ska vara aktiva för projektet:'
|
||||||
text_default_administrator_account_changed: Standardadministratörens konto ändrat
|
text_default_administrator_account_changed: Standardadministratörens konto ändrat
|
||||||
@@ -938,10 +943,10 @@ sv:
|
|||||||
text_repository_usernames_mapping: "Välj eller uppdatera den Redmine-användare som är mappad till varje användarnamn i versionarkivloggen.\nAnvändare med samma användarnamn eller mailadress i både Redmine och versionsarkivet mappas automatiskt."
|
text_repository_usernames_mapping: "Välj eller uppdatera den Redmine-användare som är mappad till varje användarnamn i versionarkivloggen.\nAnvändare med samma användarnamn eller mailadress i både Redmine och versionsarkivet mappas automatiskt."
|
||||||
text_diff_truncated: '... Denna diff har förminskats eftersom den överskrider den maximala storlek som kan visas.'
|
text_diff_truncated: '... Denna diff har förminskats eftersom den överskrider den maximala storlek som kan visas.'
|
||||||
text_custom_field_possible_values_info: 'Ett värde per rad'
|
text_custom_field_possible_values_info: 'Ett värde per rad'
|
||||||
text_wiki_page_destroy_question: Denna sida har %{descendants} underliggande sidor. Vad vill du göra?
|
text_wiki_page_destroy_question: "Denna sida har %{descendants} underliggande sidor. Vad vill du göra?"
|
||||||
text_wiki_page_nullify_children: Behåll undersidor som rotsidor
|
text_wiki_page_nullify_children: "Behåll undersidor som rotsidor"
|
||||||
text_wiki_page_destroy_children: Ta bort alla underliggande sidor
|
text_wiki_page_destroy_children: "Ta bort alla underliggande sidor"
|
||||||
text_wiki_page_reassign_children: Flytta undersidor till denna föräldersida
|
text_wiki_page_reassign_children: "Flytta undersidor till denna föräldersida"
|
||||||
text_own_membership_delete_confirmation: "Några av, eller alla, dina behörigheter kommer att tas bort och du kanske inte längre kommer kunna göra ändringar i det här projektet.\nVill du verkligen fortsätta?"
|
text_own_membership_delete_confirmation: "Några av, eller alla, dina behörigheter kommer att tas bort och du kanske inte längre kommer kunna göra ändringar i det här projektet.\nVill du verkligen fortsätta?"
|
||||||
text_zoom_out: Zooma ut
|
text_zoom_out: Zooma ut
|
||||||
text_zoom_in: Zooma in
|
text_zoom_in: Zooma in
|
||||||
@@ -972,8 +977,3 @@ sv:
|
|||||||
enumeration_doc_categories: Dokumentkategorier
|
enumeration_doc_categories: Dokumentkategorier
|
||||||
enumeration_activities: Aktiviteter (tidsuppföljning)
|
enumeration_activities: Aktiviteter (tidsuppföljning)
|
||||||
enumeration_system_activity: Systemaktivitet
|
enumeration_system_activity: Systemaktivitet
|
||||||
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
|
|
||||||
@@ -4,6 +4,29 @@ Redmine - project management software
|
|||||||
Copyright (C) 2006-2011 Jean-Philippe Lang
|
Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
http://www.redmine.org/
|
http://www.redmine.org/
|
||||||
|
|
||||||
|
== 2011-01-30 v1.1.1
|
||||||
|
|
||||||
|
* Defect #4899: Redmine fails to list files for darcs repository
|
||||||
|
* Defect #7245: Wiki fails to find pages with cyrillic characters using postgresql
|
||||||
|
* Defect #7256: redmine/public/.htaccess must be moved for non-fastcgi installs/upgrades
|
||||||
|
* Defect #7258: Automatic spent time logging does not work properly with SQLite3
|
||||||
|
* Defect #7259: Released 1.1.0 uses "devel" label inside admin information
|
||||||
|
* Defect #7265: "Loading..." icon does not disappear after add project member
|
||||||
|
* Defect #7266: Test test_due_date_distance_in_words fail due to undefined locale
|
||||||
|
* Defect #7274: CSV value separator in dutch locale
|
||||||
|
* Defect #7277: Enabling gravatas causes usernames to overlap first name field in user list
|
||||||
|
* Defect #7294: "Notifiy for only project I select" is not available anymore in 1.1.0
|
||||||
|
* Defect #7307: HTTP 500 error on query for empty revision
|
||||||
|
* Defect #7313: Label not translated in french in Settings/Email Notification tab
|
||||||
|
* Defect #7329: <code class="javascript"> with long strings may hang server
|
||||||
|
* Defect #7337: My page french translation
|
||||||
|
* Defect #7348: French Translation of "Connection"
|
||||||
|
* Defect #7385: Error when viewing an issue which was related to a deleted subtask
|
||||||
|
* Defect #7386: NoMethodError on pdf export
|
||||||
|
* Defect #7415: Darcs adapter recognizes new files as modified files above Darcs 2.4
|
||||||
|
* Defect #7421: no email sent with 'Notifiy for any event on the selected projects only'
|
||||||
|
* Feature #5344: Update to latest CodeRay 0.9.x
|
||||||
|
|
||||||
== 2011-01-09 v1.1.0
|
== 2011-01-09 v1.1.0
|
||||||
|
|
||||||
* Defect #2038: Italics in wiki headers show-up wrong in the toc
|
* Defect #2038: Italics in wiki headers show-up wrong in the toc
|
||||||
|
|||||||
@@ -255,7 +255,7 @@ module Redmine
|
|||||||
pdf.SetFontStyle('B',9)
|
pdf.SetFontStyle('B',9)
|
||||||
pdf.Cell(35,5, l(:field_description) + ":")
|
pdf.Cell(35,5, l(:field_description) + ":")
|
||||||
pdf.SetFontStyle('',9)
|
pdf.SetFontStyle('',9)
|
||||||
pdf.MultiCell(155,5, issue.description,"BR")
|
pdf.MultiCell(155,5, issue.description.to_s,"BR")
|
||||||
|
|
||||||
pdf.Line(pdf.GetX, y0, pdf.GetX, pdf.GetY)
|
pdf.Line(pdf.GetX, y0, pdf.GetX, pdf.GetY)
|
||||||
pdf.Line(pdf.GetX, pdf.GetY, 170, pdf.GetY)
|
pdf.Line(pdf.GetX, pdf.GetY, 170, pdf.GetY)
|
||||||
@@ -271,7 +271,7 @@ module Redmine
|
|||||||
pdf.Ln
|
pdf.Ln
|
||||||
unless changeset.comments.blank?
|
unless changeset.comments.blank?
|
||||||
pdf.SetFontStyle('',8)
|
pdf.SetFontStyle('',8)
|
||||||
pdf.MultiCell(190,5, changeset.comments)
|
pdf.MultiCell(190,5, changeset.comments.to_s)
|
||||||
end
|
end
|
||||||
pdf.Ln
|
pdf.Ln
|
||||||
end
|
end
|
||||||
@@ -291,7 +291,7 @@ module Redmine
|
|||||||
end
|
end
|
||||||
if journal.notes?
|
if journal.notes?
|
||||||
pdf.SetFontStyle('',8)
|
pdf.SetFontStyle('',8)
|
||||||
pdf.MultiCell(190,5, journal.notes)
|
pdf.MultiCell(190,5, journal.notes.to_s)
|
||||||
end
|
end
|
||||||
pdf.Ln
|
pdf.Ln
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -31,16 +31,14 @@ module Redmine
|
|||||||
end
|
end
|
||||||
|
|
||||||
def darcs_binary_version
|
def darcs_binary_version
|
||||||
cmd = "#{DARCS_BIN} --version"
|
darcsversion = darcs_binary_version_from_command_line
|
||||||
version = nil
|
if m = darcsversion.match(%r{\A(.*?)((\d+\.)+\d+)})
|
||||||
shellout(cmd) do |io|
|
m[2].scan(%r{\d+}).collect(&:to_i)
|
||||||
# Read darcs version in first returned line
|
|
||||||
if m = io.gets.match(%r{((\d+\.)+\d+)})
|
|
||||||
version = m[0].scan(%r{\d+}).collect(&:to_i)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return nil if $? && $?.exitstatus != 0
|
|
||||||
version
|
def darcs_binary_version_from_command_line
|
||||||
|
shellout("#{DARCS_BIN} --version") { |io| io.read }.to_s
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -64,7 +62,9 @@ module Redmine
|
|||||||
# or nil if the given path doesn't exist in the repository
|
# or nil if the given path doesn't exist in the repository
|
||||||
def entries(path=nil, identifier=nil)
|
def entries(path=nil, identifier=nil)
|
||||||
path_prefix = (path.blank? ? '' : "#{path}/")
|
path_prefix = (path.blank? ? '' : "#{path}/")
|
||||||
path = '.' if path.blank?
|
if path.blank?
|
||||||
|
path = ( self.class.client_version_above?([2, 2, 0]) ? @url : '.' )
|
||||||
|
end
|
||||||
entries = Entries.new
|
entries = Entries.new
|
||||||
cmd = "#{DARCS_BIN} annotate --repodir #{shell_quote @url} --xml-output"
|
cmd = "#{DARCS_BIN} annotate --repodir #{shell_quote @url} --xml-output"
|
||||||
cmd << " --match #{shell_quote("hash #{identifier}")}" if identifier
|
cmd << " --match #{shell_quote("hash #{identifier}")}" if identifier
|
||||||
@@ -168,8 +168,37 @@ module Redmine
|
|||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
# Retrieve changed paths for a single patch
|
|
||||||
def get_paths_for_patch(hash)
|
def get_paths_for_patch(hash)
|
||||||
|
paths = get_paths_for_patch_raw(hash)
|
||||||
|
if self.class.client_version_above?([2, 4])
|
||||||
|
orig_paths = paths
|
||||||
|
paths = []
|
||||||
|
add_paths = []
|
||||||
|
add_paths_name = []
|
||||||
|
mod_paths = []
|
||||||
|
other_paths = []
|
||||||
|
orig_paths.each do |path|
|
||||||
|
if path[:action] == 'A'
|
||||||
|
add_paths << path
|
||||||
|
add_paths_name << path[:path]
|
||||||
|
elsif path[:action] == 'M'
|
||||||
|
mod_paths << path
|
||||||
|
else
|
||||||
|
other_paths << path
|
||||||
|
end
|
||||||
|
end
|
||||||
|
add_paths_name.each do |add_path|
|
||||||
|
mod_paths.delete_if { |m| m[:path] == add_path }
|
||||||
|
end
|
||||||
|
paths.concat add_paths
|
||||||
|
paths.concat mod_paths
|
||||||
|
paths.concat other_paths
|
||||||
|
end
|
||||||
|
paths
|
||||||
|
end
|
||||||
|
|
||||||
|
# Retrieve changed paths for a single patch
|
||||||
|
def get_paths_for_patch_raw(hash)
|
||||||
cmd = "#{DARCS_BIN} annotate --repodir #{shell_quote @url} --summary --xml-output"
|
cmd = "#{DARCS_BIN} annotate --repodir #{shell_quote @url} --summary --xml-output"
|
||||||
cmd << " --match #{shell_quote("hash #{hash}")} "
|
cmd << " --match #{shell_quote("hash #{hash}")} "
|
||||||
paths = []
|
paths = []
|
||||||
|
|||||||
@@ -4,13 +4,13 @@ module Redmine
|
|||||||
module VERSION #:nodoc:
|
module VERSION #:nodoc:
|
||||||
MAJOR = 1
|
MAJOR = 1
|
||||||
MINOR = 1
|
MINOR = 1
|
||||||
TINY = 0
|
TINY = 1
|
||||||
|
|
||||||
# Branch values:
|
# Branch values:
|
||||||
# * official release: nil
|
# * official release: nil
|
||||||
# * stable branch: stable
|
# * stable branch: stable
|
||||||
# * trunk: devel
|
# * trunk: devel
|
||||||
BRANCH = 'devel'
|
BRANCH = 'stable'
|
||||||
|
|
||||||
def self.revision
|
def self.revision
|
||||||
revision = nil
|
revision = nil
|
||||||
|
|||||||
@@ -289,7 +289,7 @@ task :migrate_from_mantis => :environment do
|
|||||||
project.versions.each do |version|
|
project.versions.each do |version|
|
||||||
v = Version.new :name => encode(version.version),
|
v = Version.new :name => encode(version.version),
|
||||||
:description => encode(version.description),
|
:description => encode(version.description),
|
||||||
:effective_date => version.date_order.to_date
|
:effective_date => (version.date_order ? version.date_order.to_date : nil)
|
||||||
v.project = p
|
v.project = p
|
||||||
v.save
|
v.save
|
||||||
versions_map[version.id] = v.id
|
versions_map[version.id] = v.id
|
||||||
|
|||||||
@@ -40,7 +40,15 @@ namespace :test do
|
|||||||
system "gunzip < test/fixtures/repositories/subversion_repository.dump.gz | svnadmin load #{repo_path}"
|
system "gunzip < test/fixtures/repositories/subversion_repository.dump.gz | svnadmin load #{repo_path}"
|
||||||
end
|
end
|
||||||
|
|
||||||
(supported_scms - [:subversion]).each do |scm|
|
desc "Creates a test mercurial repository"
|
||||||
|
task :mercurial => :create_dir do
|
||||||
|
repo_path = "tmp/test/mercurial_repository"
|
||||||
|
bundle_path = "test/fixtures/repositories/mercurial_repository.hg"
|
||||||
|
system "hg init #{repo_path}"
|
||||||
|
system "hg -R #{repo_path} pull #{bundle_path}"
|
||||||
|
end
|
||||||
|
|
||||||
|
(supported_scms - [:subversion, :mercurial]).each do |scm|
|
||||||
desc "Creates a test #{scm} repository"
|
desc "Creates a test #{scm} repository"
|
||||||
task scm => :create_dir do
|
task scm => :create_dir do
|
||||||
system "gunzip < test/fixtures/repositories/#{scm}_repository.tar.gz | tar -xv -C tmp/test"
|
system "gunzip < test/fixtures/repositories/#{scm}_repository.tar.gz | tar -xv -C tmp/test"
|
||||||
|
|||||||
File renamed without changes.
@@ -914,8 +914,8 @@ h4 img.gravatar {
|
|||||||
}
|
}
|
||||||
|
|
||||||
td.username img.gravatar {
|
td.username img.gravatar {
|
||||||
float: left;
|
margin: 0 0.5em 0 0;
|
||||||
margin: 0 1em 0 0;
|
vertical-align: top;
|
||||||
}
|
}
|
||||||
|
|
||||||
#activity dt img.gravatar {
|
#activity dt img.gravatar {
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Vendored
+8
@@ -95,4 +95,12 @@ wiki_contents_009:
|
|||||||
version: 1
|
version: 1
|
||||||
author_id: 1
|
author_id: 1
|
||||||
comments:
|
comments:
|
||||||
|
wiki_contents_010:
|
||||||
|
text: Page with cyrillic title
|
||||||
|
updated_on: 2007-03-08 00:18:07 +01:00
|
||||||
|
page_id: 10
|
||||||
|
id: 10
|
||||||
|
version: 1
|
||||||
|
author_id: 1
|
||||||
|
comments:
|
||||||
|
|
||||||
Vendored
+7
-1
@@ -62,4 +62,10 @@ wiki_pages_009:
|
|||||||
wiki_id: 2
|
wiki_id: 2
|
||||||
protected: false
|
protected: false
|
||||||
parent_id: 8
|
parent_id: 8
|
||||||
|
wiki_pages_010:
|
||||||
|
created_on: 2007-03-08 00:18:07 +01:00
|
||||||
|
title: Этика_менеджмента
|
||||||
|
id: 10
|
||||||
|
wiki_id: 1
|
||||||
|
protected: false
|
||||||
|
parent_id:
|
||||||
@@ -33,6 +33,19 @@ class IssueRelationsControllerTest < ActionController::TestCase
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_new_xhr
|
||||||
|
assert_difference 'IssueRelation.count' do
|
||||||
|
@request.session[:user_id] = 3
|
||||||
|
xhr :post, :new,
|
||||||
|
:issue_id => 3,
|
||||||
|
:relation => {:issue_to_id => '1', :relation_type => 'relates', :delay => ''}
|
||||||
|
assert_select_rjs 'relations' do
|
||||||
|
assert_select 'table', 1
|
||||||
|
assert_select 'tr', 2 # relations
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def test_new_should_accept_id_with_hash
|
def test_new_should_accept_id_with_hash
|
||||||
assert_difference 'IssueRelation.count' do
|
assert_difference 'IssueRelation.count' do
|
||||||
@request.session[:user_id] = 3
|
@request.session[:user_id] = 3
|
||||||
@@ -68,4 +81,20 @@ class IssueRelationsControllerTest < ActionController::TestCase
|
|||||||
post :destroy, :id => '2', :issue_id => '3'
|
post :destroy, :id => '2', :issue_id => '3'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_destroy_xhr
|
||||||
|
IssueRelation.create!(:relation_type => IssueRelation::TYPE_RELATES) do |r|
|
||||||
|
r.issue_from_id = 3
|
||||||
|
r.issue_to_id = 1
|
||||||
|
end
|
||||||
|
|
||||||
|
assert_difference 'IssueRelation.count', -1 do
|
||||||
|
@request.session[:user_id] = 3
|
||||||
|
xhr :post, :destroy, :id => '2', :issue_id => '3'
|
||||||
|
assert_select_rjs 'relations' do
|
||||||
|
assert_select 'table', 1
|
||||||
|
assert_select 'tr', 1 # relation left
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
@@ -33,7 +33,8 @@ class RepositoriesGitControllerTest < ActionController::TestCase
|
|||||||
@request = ActionController::TestRequest.new
|
@request = ActionController::TestRequest.new
|
||||||
@response = ActionController::TestResponse.new
|
@response = ActionController::TestResponse.new
|
||||||
User.current = nil
|
User.current = nil
|
||||||
Repository::Git.create(:project => Project.find(3), :url => REPOSITORY_PATH)
|
@repository = Repository::Git.create(:project => Project.find(3), :url => REPOSITORY_PATH)
|
||||||
|
assert @repository
|
||||||
end
|
end
|
||||||
|
|
||||||
if File.directory?(REPOSITORY_PATH)
|
if File.directory?(REPOSITORY_PATH)
|
||||||
@@ -128,6 +129,9 @@ class RepositoriesGitControllerTest < ActionController::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_diff
|
def test_diff
|
||||||
|
@repository.fetch_changesets
|
||||||
|
@repository.reload
|
||||||
|
|
||||||
# Full diff of changeset 2f9c0091
|
# Full diff of changeset 2f9c0091
|
||||||
get :diff, :id => 3, :rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
|
get :diff, :id => 3, :rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
|
||||||
assert_response :success
|
assert_response :success
|
||||||
@@ -138,6 +142,21 @@ class RepositoriesGitControllerTest < ActionController::TestCase
|
|||||||
:sibling => { :tag => 'td',
|
:sibling => { :tag => 'td',
|
||||||
:attributes => { :class => /diff_out/ },
|
:attributes => { :class => /diff_out/ },
|
||||||
:content => /def remove/ }
|
:content => /def remove/ }
|
||||||
|
assert_tag :tag => 'h2', :content => /2f9c0091/
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_diff_two_revs
|
||||||
|
@repository.fetch_changesets
|
||||||
|
@repository.reload
|
||||||
|
|
||||||
|
get :diff, :id => 3, :rev => '61b685fbe55ab05b5ac68402d5720c1a6ac973d1',
|
||||||
|
:rev_to => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
|
||||||
|
assert_response :success
|
||||||
|
assert_template 'diff'
|
||||||
|
|
||||||
|
diff = assigns(:diff)
|
||||||
|
assert_not_nil diff
|
||||||
|
assert_tag :tag => 'h2', :content => /2f9c0091:61b685fb/
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_annotate
|
def test_annotate
|
||||||
@@ -157,6 +176,26 @@ class RepositoriesGitControllerTest < ActionController::TestCase
|
|||||||
assert_tag :tag => 'p', :attributes => { :id => /errorExplanation/ },
|
assert_tag :tag => 'p', :attributes => { :id => /errorExplanation/ },
|
||||||
:content => /can not be annotated/
|
:content => /can not be annotated/
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_revision
|
||||||
|
@repository.fetch_changesets
|
||||||
|
@repository.reload
|
||||||
|
['61b685fbe55ab05b5ac68402d5720c1a6ac973d1', '61b685f'].each do |r|
|
||||||
|
get :revision, :id => 3, :rev => r
|
||||||
|
assert_response :success
|
||||||
|
assert_template 'revision'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_empty_revision
|
||||||
|
@repository.fetch_changesets
|
||||||
|
@repository.reload
|
||||||
|
['', ' ', nil].each do |r|
|
||||||
|
get :revision, :id => 3, :rev => r
|
||||||
|
assert_response 404
|
||||||
|
assert_error_tag :content => /was not found/
|
||||||
|
end
|
||||||
|
end
|
||||||
else
|
else
|
||||||
puts "Git test repository NOT FOUND. Skipping functional tests !!!"
|
puts "Git test repository NOT FOUND. Skipping functional tests !!!"
|
||||||
def test_fake; assert true end
|
def test_fake; assert true end
|
||||||
|
|||||||
@@ -32,7 +32,8 @@ class RepositoriesMercurialControllerTest < ActionController::TestCase
|
|||||||
@request = ActionController::TestRequest.new
|
@request = ActionController::TestRequest.new
|
||||||
@response = ActionController::TestResponse.new
|
@response = ActionController::TestResponse.new
|
||||||
User.current = nil
|
User.current = nil
|
||||||
Repository::Mercurial.create(:project => Project.find(3), :url => REPOSITORY_PATH)
|
@repository = Repository::Mercurial.create(:project => Project.find(3), :url => REPOSITORY_PATH)
|
||||||
|
assert @repository
|
||||||
end
|
end
|
||||||
|
|
||||||
if File.directory?(REPOSITORY_PATH)
|
if File.directory?(REPOSITORY_PATH)
|
||||||
@@ -164,6 +165,16 @@ class RepositoriesMercurialControllerTest < ActionController::TestCase
|
|||||||
:attributes => { :class => 'line-num' },
|
:attributes => { :class => 'line-num' },
|
||||||
:sibling => { :tag => 'td', :content => /watcher =/ }
|
:sibling => { :tag => 'td', :content => /watcher =/ }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_empty_revision
|
||||||
|
@repository.fetch_changesets
|
||||||
|
@repository.reload
|
||||||
|
['', ' ', nil].each do |r|
|
||||||
|
get :revision, :id => 3, :rev => r
|
||||||
|
assert_response 404
|
||||||
|
assert_error_tag :content => /was not found/
|
||||||
|
end
|
||||||
|
end
|
||||||
else
|
else
|
||||||
puts "Mercurial test repository NOT FOUND. Skipping functional tests !!!"
|
puts "Mercurial test repository NOT FOUND. Skipping functional tests !!!"
|
||||||
def test_fake; assert true end
|
def test_fake; assert true end
|
||||||
|
|||||||
@@ -168,10 +168,18 @@ class RepositoriesSubversionControllerTest < ActionController::TestCase
|
|||||||
|
|
||||||
def test_invalid_revision
|
def test_invalid_revision
|
||||||
get :revision, :id => 1, :rev => 'something_weird'
|
get :revision, :id => 1, :rev => 'something_weird'
|
||||||
assert_response 500
|
assert_response 404
|
||||||
assert_error_tag :content => /was not found/
|
assert_error_tag :content => /was not found/
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_empty_revision
|
||||||
|
['', ' ', nil].each do |r|
|
||||||
|
get :revision, :id => 1, :rev => r
|
||||||
|
assert_response 404
|
||||||
|
assert_error_tag :content => /was not found/
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def test_revision_with_repository_pointing_to_a_subdirectory
|
def test_revision_with_repository_pointing_to_a_subdirectory
|
||||||
r = Project.find(1).repository
|
r = Project.find(1).repository
|
||||||
# Changes repository url to a subdirectory
|
# Changes repository url to a subdirectory
|
||||||
@@ -198,6 +206,8 @@ class RepositoriesSubversionControllerTest < ActionController::TestCase
|
|||||||
get :diff, :id => 1, :rev => 3
|
get :diff, :id => 1, :rev => 3
|
||||||
assert_response :success
|
assert_response :success
|
||||||
assert_template 'diff'
|
assert_template 'diff'
|
||||||
|
|
||||||
|
assert_tag :tag => 'h2', :content => /3/
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_directory_diff
|
def test_directory_diff
|
||||||
@@ -209,6 +219,8 @@ class RepositoriesSubversionControllerTest < ActionController::TestCase
|
|||||||
assert_not_nil diff
|
assert_not_nil diff
|
||||||
# 2 files modified
|
# 2 files modified
|
||||||
assert_equal 2, Redmine::UnifiedDiff.new(diff).size
|
assert_equal 2, Redmine::UnifiedDiff.new(diff).size
|
||||||
|
|
||||||
|
assert_tag :tag => 'h2', :content => /2:6/
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_annotate
|
def test_annotate
|
||||||
|
|||||||
@@ -610,6 +610,7 @@ EXPECTED
|
|||||||
Date.today - 100 => 'about 3 months late',
|
Date.today - 100 => 'about 3 months late',
|
||||||
Date.today - 20000 => 'over 54 years late',
|
Date.today - 20000 => 'over 54 years late',
|
||||||
}
|
}
|
||||||
|
::I18n.locale = :en
|
||||||
to_test.each do |date, expected|
|
to_test.each do |date, expected|
|
||||||
assert_equal expected, due_date_distance_in_words(date)
|
assert_equal expected, due_date_distance_in_words(date)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
require File.expand_path('../../../../../../test_helper', __FILE__)
|
||||||
|
begin
|
||||||
|
require 'mocha'
|
||||||
|
|
||||||
|
class DarcsAdapterTest < ActiveSupport::TestCase
|
||||||
|
|
||||||
|
REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/darcs_repository'
|
||||||
|
|
||||||
|
if File.directory?(REPOSITORY_PATH)
|
||||||
|
def setup
|
||||||
|
@adapter = Redmine::Scm::Adapters::DarcsAdapter.new(REPOSITORY_PATH)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_darcsversion
|
||||||
|
to_test = { "1.0.9 (release)\n" => [1,0,9] ,
|
||||||
|
"2.2.0 (release)\n" => [2,2,0] }
|
||||||
|
to_test.each do |s, v|
|
||||||
|
test_darcsversion_for(s, v)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_revisions
|
||||||
|
id1 = '20080308225258-98289-761f654d669045eabee90b91b53a21ce5593cadf.gz'
|
||||||
|
revs = @adapter.revisions('', nil, nil, {:with_path => true})
|
||||||
|
assert_equal 6, revs.size
|
||||||
|
assert_equal id1, revs[5].scmid
|
||||||
|
paths = revs[5].paths
|
||||||
|
assert_equal 5, paths.size
|
||||||
|
assert_equal 'A', paths[0][:action]
|
||||||
|
assert_equal '/README', paths[0][:path]
|
||||||
|
assert_equal 'A', paths[1][:action]
|
||||||
|
assert_equal '/images', paths[1][:path]
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def test_darcsversion_for(darcsversion, version)
|
||||||
|
@adapter.class.expects(:darcs_binary_version_from_command_line).returns(darcsversion)
|
||||||
|
assert_equal version, @adapter.class.darcs_binary_version
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
puts "Darcs test repository NOT FOUND. Skipping unit tests !!!"
|
||||||
|
def test_fake; assert true end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
rescue LoadError
|
||||||
|
class DarcsMochaFake < ActiveSupport::TestCase
|
||||||
|
def test_fake; assert(false, "Requires mocha to run those tests") end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
@@ -63,6 +63,23 @@ class RepositoryGitTest < ActiveSupport::TestCase
|
|||||||
assert_equal 15, @repository.changesets.count
|
assert_equal 15, @repository.changesets.count
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_find_changeset_by_name
|
||||||
|
@repository.fetch_changesets
|
||||||
|
@repository.reload
|
||||||
|
['7234cb2750b63f47bff735edc50a1c0a433c2518', '7234cb2750b'].each do |r|
|
||||||
|
assert_equal '7234cb2750b63f47bff735edc50a1c0a433c2518',
|
||||||
|
@repository.find_changeset_by_name(r).revision
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_find_changeset_by_empty_name
|
||||||
|
@repository.fetch_changesets
|
||||||
|
@repository.reload
|
||||||
|
['', ' ', nil].each do |r|
|
||||||
|
assert_nil @repository.find_changeset_by_name(r)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def test_identifier
|
def test_identifier
|
||||||
@repository.fetch_changesets
|
@repository.fetch_changesets
|
||||||
@repository.reload
|
@repository.reload
|
||||||
@@ -74,16 +91,17 @@ class RepositoryGitTest < ActiveSupport::TestCase
|
|||||||
@repository.fetch_changesets
|
@repository.fetch_changesets
|
||||||
@repository.reload
|
@repository.reload
|
||||||
c = @repository.changesets.find_by_revision('7234cb2750b63f47bff735edc50a1c0a433c2518')
|
c = @repository.changesets.find_by_revision('7234cb2750b63f47bff735edc50a1c0a433c2518')
|
||||||
assert_equal c.format_identifier, '7234cb27'
|
assert_equal '7234cb27', c.format_identifier
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_activities
|
def test_activities
|
||||||
c = Changeset.new(:repository => @repository, :committed_on => Time.now,
|
c = Changeset.new(:repository => @repository,
|
||||||
|
:committed_on => Time.now,
|
||||||
:revision => 'abc7234cb2750b63f47bff735edc50a1c0a433c2',
|
:revision => 'abc7234cb2750b63f47bff735edc50a1c0a433c2',
|
||||||
:scmid => 'abc7234cb2750b63f47bff735edc50a1c0a433c2',
|
:scmid => 'abc7234cb2750b63f47bff735edc50a1c0a433c2',
|
||||||
:comments => 'test')
|
:comments => 'test')
|
||||||
assert c.event_title.include?('abc7234c:')
|
assert c.event_title.include?('abc7234c:')
|
||||||
assert_equal c.event_url[:rev], 'abc7234cb2750b63f47bff735edc50a1c0a433c2'
|
assert_equal 'abc7234cb2750b63f47bff735edc50a1c0a433c2', c.event_url[:rev]
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
puts "Git test repository NOT FOUND. Skipping unit tests !!!"
|
puts "Git test repository NOT FOUND. Skipping unit tests !!!"
|
||||||
|
|||||||
@@ -102,7 +102,8 @@ class RepositoryMercurialTest < ActiveSupport::TestCase
|
|||||||
@repository.reload
|
@repository.reload
|
||||||
|
|
||||||
cs1 = @repository.changesets.find_by_revision('13')
|
cs1 = @repository.changesets.find_by_revision('13')
|
||||||
c1 = cs1.changes
|
assert_not_nil cs1
|
||||||
|
c1 = cs1.changes.sort_by(&:path)
|
||||||
assert_equal 2, c1.size
|
assert_equal 2, c1.size
|
||||||
|
|
||||||
assert_equal 'A', c1[0].action
|
assert_equal 'A', c1[0].action
|
||||||
|
|||||||
@@ -96,6 +96,14 @@ class RepositorySubversionTest < ActiveSupport::TestCase
|
|||||||
assert_equal c.revision, c.identifier
|
assert_equal c.revision, c.identifier
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_find_changeset_by_empty_name
|
||||||
|
@repository.fetch_changesets
|
||||||
|
@repository.reload
|
||||||
|
['', ' ', nil].each do |r|
|
||||||
|
assert_nil @repository.find_changeset_by_name(r)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def test_identifier_nine_digit
|
def test_identifier_nine_digit
|
||||||
c = Changeset.new(:repository => @repository, :committed_on => Time.now,
|
c = Changeset.new(:repository => @repository, :committed_on => Time.now,
|
||||||
:revision => '123456789', :comments => 'test')
|
:revision => '123456789', :comments => 'test')
|
||||||
@@ -119,14 +127,14 @@ class RepositorySubversionTest < ActiveSupport::TestCase
|
|||||||
c = Changeset.new(:repository => @repository, :committed_on => Time.now,
|
c = Changeset.new(:repository => @repository, :committed_on => Time.now,
|
||||||
:revision => '1', :comments => 'test')
|
:revision => '1', :comments => 'test')
|
||||||
assert c.event_title.include?('1:')
|
assert c.event_title.include?('1:')
|
||||||
assert_equal c.event_url[:rev], '1'
|
assert_equal '1', c.event_url[:rev]
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_activities_nine_digit
|
def test_activities_nine_digit
|
||||||
c = Changeset.new(:repository => @repository, :committed_on => Time.now,
|
c = Changeset.new(:repository => @repository, :committed_on => Time.now,
|
||||||
:revision => '123456789', :comments => 'test')
|
:revision => '123456789', :comments => 'test')
|
||||||
assert c.event_title.include?('123456789:')
|
assert c.event_title.include?('123456789:')
|
||||||
assert_equal c.event_url[:rev], '123456789'
|
assert_equal '123456789', c.event_url[:rev]
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
puts "Subversion test repository NOT FOUND. Skipping unit tests !!!"
|
puts "Subversion test repository NOT FOUND. Skipping unit tests !!!"
|
||||||
|
|||||||
@@ -49,6 +49,42 @@ class TimeEntryTest < ActiveSupport::TestCase
|
|||||||
assert_nil TimeEntry.new.hours
|
assert_nil TimeEntry.new.hours
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_spent_on_with_blank
|
||||||
|
c = TimeEntry.new
|
||||||
|
c.spent_on = ''
|
||||||
|
assert_nil c.spent_on
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_spent_on_with_nil
|
||||||
|
c = TimeEntry.new
|
||||||
|
c.spent_on = nil
|
||||||
|
assert_nil c.spent_on
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_spent_on_with_string
|
||||||
|
c = TimeEntry.new
|
||||||
|
c.spent_on = "2011-01-14"
|
||||||
|
assert_equal Date.parse("2011-01-14"), c.spent_on
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_spent_on_with_invalid_string
|
||||||
|
c = TimeEntry.new
|
||||||
|
c.spent_on = "foo"
|
||||||
|
assert_nil c.spent_on
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_spent_on_with_date
|
||||||
|
c = TimeEntry.new
|
||||||
|
c.spent_on = Date.today
|
||||||
|
assert_equal Date.today, c.spent_on
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_spent_on_with_time
|
||||||
|
c = TimeEntry.new
|
||||||
|
c.spent_on = Time.now
|
||||||
|
assert_equal Date.today, c.spent_on
|
||||||
|
end
|
||||||
|
|
||||||
context "#earilest_date_for_project" do
|
context "#earilest_date_for_project" do
|
||||||
setup do
|
setup do
|
||||||
User.current = nil
|
User.current = nil
|
||||||
|
|||||||
+32
-2
@@ -1,5 +1,5 @@
|
|||||||
# redMine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or
|
# This program is free software; you can redistribute it and/or
|
||||||
# modify it under the terms of the GNU General Public License
|
# modify it under the terms of the GNU General Public License
|
||||||
@@ -303,6 +303,19 @@ class UserTest < ActiveSupport::TestCase
|
|||||||
assert_nil @dlopper.roles_for_project(Project.find(2)).detect {|role| role.member?}
|
assert_nil @dlopper.roles_for_project(Project.find(2)).detect {|role| role.member?}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_valid_notification_options
|
||||||
|
# without memberships
|
||||||
|
assert_equal 5, User.find(7).valid_notification_options.size
|
||||||
|
# with memberships
|
||||||
|
assert_equal 6, User.find(2).valid_notification_options.size
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_valid_notification_options_class_method
|
||||||
|
assert_equal 5, User.valid_notification_options.size
|
||||||
|
assert_equal 5, User.valid_notification_options(User.find(7)).size
|
||||||
|
assert_equal 6, User.valid_notification_options(User.find(2)).size
|
||||||
|
end
|
||||||
|
|
||||||
def test_mail_notification_all
|
def test_mail_notification_all
|
||||||
@jsmith.mail_notification = 'all'
|
@jsmith.mail_notification = 'all'
|
||||||
@jsmith.notified_project_ids = []
|
@jsmith.notified_project_ids = []
|
||||||
@@ -455,6 +468,7 @@ class UserTest < ActiveSupport::TestCase
|
|||||||
|
|
||||||
should "be false for a user with :only_my_events and isn't an author, creator, or assignee" do
|
should "be false for a user with :only_my_events and isn't an author, creator, or assignee" do
|
||||||
@user = User.generate_with_protected!(:mail_notification => 'only_my_events')
|
@user = User.generate_with_protected!(:mail_notification => 'only_my_events')
|
||||||
|
Member.create!(:user => @user, :project => @project, :role_ids => [1])
|
||||||
assert ! @user.notify_about?(@issue)
|
assert ! @user.notify_about?(@issue)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -487,6 +501,22 @@ class UserTest < ActiveSupport::TestCase
|
|||||||
@assignee.update_attribute(:mail_notification, 'only_owner')
|
@assignee.update_attribute(:mail_notification, 'only_owner')
|
||||||
assert ! @assignee.notify_about?(@issue)
|
assert ! @assignee.notify_about?(@issue)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
should "be true for a user with :selected and is the author" do
|
||||||
|
@author.update_attribute(:mail_notification, 'selected')
|
||||||
|
assert @author.notify_about?(@issue)
|
||||||
|
end
|
||||||
|
|
||||||
|
should "be true for a user with :selected and is the assignee" do
|
||||||
|
@assignee.update_attribute(:mail_notification, 'selected')
|
||||||
|
assert @assignee.notify_about?(@issue)
|
||||||
|
end
|
||||||
|
|
||||||
|
should "be false for a user with :selected and is not the author or assignee" do
|
||||||
|
@user = User.generate_with_protected!(:mail_notification => 'selected')
|
||||||
|
Member.create!(:user => @user, :project => @project, :role_ids => [1])
|
||||||
|
assert ! @user.notify_about?(@issue)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "other events" do
|
context "other events" do
|
||||||
|
|||||||
@@ -46,6 +46,9 @@ class WikiTest < ActiveSupport::TestCase
|
|||||||
assert_equal page, wiki.find_page('Another_page')
|
assert_equal page, wiki.find_page('Another_page')
|
||||||
assert_equal page, wiki.find_page('Another page')
|
assert_equal page, wiki.find_page('Another page')
|
||||||
assert_equal page, wiki.find_page('ANOTHER page')
|
assert_equal page, wiki.find_page('ANOTHER page')
|
||||||
|
|
||||||
|
page = WikiPage.find(10)
|
||||||
|
assert_equal page, wiki.find_page('Этика_менеджмента')
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_titleize
|
def test_titleize
|
||||||
|
|||||||
+155
@@ -0,0 +1,155 @@
|
|||||||
|
--- !ruby/object:Gem::Specification
|
||||||
|
name: coderay
|
||||||
|
version: !ruby/object:Gem::Version
|
||||||
|
hash: 53
|
||||||
|
prerelease: false
|
||||||
|
segments:
|
||||||
|
- 0
|
||||||
|
- 9
|
||||||
|
- 7
|
||||||
|
version: 0.9.7
|
||||||
|
platform: ruby
|
||||||
|
authors:
|
||||||
|
- murphy
|
||||||
|
autorequire:
|
||||||
|
bindir: bin
|
||||||
|
cert_chain: []
|
||||||
|
|
||||||
|
date: 2011-01-15 00:00:00 +01:00
|
||||||
|
default_executable:
|
||||||
|
dependencies: []
|
||||||
|
|
||||||
|
description: |
|
||||||
|
Fast and easy syntax highlighting for selected languages, written in Ruby.
|
||||||
|
Comes with RedCloth integration and LOC counter.
|
||||||
|
|
||||||
|
email: murphy@rubychan.de
|
||||||
|
executables:
|
||||||
|
- coderay
|
||||||
|
- coderay_stylesheet
|
||||||
|
extensions: []
|
||||||
|
|
||||||
|
extra_rdoc_files:
|
||||||
|
- lib/README
|
||||||
|
- FOLDERS
|
||||||
|
files:
|
||||||
|
- ./lib/coderay/duo.rb
|
||||||
|
- ./lib/coderay/encoder.rb
|
||||||
|
- ./lib/coderay/encoders/_map.rb
|
||||||
|
- ./lib/coderay/encoders/comment_filter.rb
|
||||||
|
- ./lib/coderay/encoders/count.rb
|
||||||
|
- ./lib/coderay/encoders/debug.rb
|
||||||
|
- ./lib/coderay/encoders/div.rb
|
||||||
|
- ./lib/coderay/encoders/filter.rb
|
||||||
|
- ./lib/coderay/encoders/html/css.rb
|
||||||
|
- ./lib/coderay/encoders/html/numerization.rb
|
||||||
|
- ./lib/coderay/encoders/html/output.rb
|
||||||
|
- ./lib/coderay/encoders/html.rb
|
||||||
|
- ./lib/coderay/encoders/json.rb
|
||||||
|
- ./lib/coderay/encoders/lines_of_code.rb
|
||||||
|
- ./lib/coderay/encoders/null.rb
|
||||||
|
- ./lib/coderay/encoders/page.rb
|
||||||
|
- ./lib/coderay/encoders/span.rb
|
||||||
|
- ./lib/coderay/encoders/statistic.rb
|
||||||
|
- ./lib/coderay/encoders/term.rb
|
||||||
|
- ./lib/coderay/encoders/text.rb
|
||||||
|
- ./lib/coderay/encoders/token_class_filter.rb
|
||||||
|
- ./lib/coderay/encoders/xml.rb
|
||||||
|
- ./lib/coderay/encoders/yaml.rb
|
||||||
|
- ./lib/coderay/for_redcloth.rb
|
||||||
|
- ./lib/coderay/helpers/file_type.rb
|
||||||
|
- ./lib/coderay/helpers/gzip_simple.rb
|
||||||
|
- ./lib/coderay/helpers/plugin.rb
|
||||||
|
- ./lib/coderay/helpers/word_list.rb
|
||||||
|
- ./lib/coderay/scanner.rb
|
||||||
|
- ./lib/coderay/scanners/_map.rb
|
||||||
|
- ./lib/coderay/scanners/c.rb
|
||||||
|
- ./lib/coderay/scanners/cpp.rb
|
||||||
|
- ./lib/coderay/scanners/css.rb
|
||||||
|
- ./lib/coderay/scanners/debug.rb
|
||||||
|
- ./lib/coderay/scanners/delphi.rb
|
||||||
|
- ./lib/coderay/scanners/diff.rb
|
||||||
|
- ./lib/coderay/scanners/groovy.rb
|
||||||
|
- ./lib/coderay/scanners/html.rb
|
||||||
|
- ./lib/coderay/scanners/java/builtin_types.rb
|
||||||
|
- ./lib/coderay/scanners/java.rb
|
||||||
|
- ./lib/coderay/scanners/java_script-0.9.6.rb
|
||||||
|
- ./lib/coderay/scanners/java_script.rb
|
||||||
|
- ./lib/coderay/scanners/json.rb
|
||||||
|
- ./lib/coderay/scanners/nitro_xhtml.rb
|
||||||
|
- ./lib/coderay/scanners/php.rb
|
||||||
|
- ./lib/coderay/scanners/plaintext.rb
|
||||||
|
- ./lib/coderay/scanners/python.rb
|
||||||
|
- ./lib/coderay/scanners/rhtml.rb
|
||||||
|
- ./lib/coderay/scanners/ruby/patterns.rb
|
||||||
|
- ./lib/coderay/scanners/ruby.rb
|
||||||
|
- ./lib/coderay/scanners/scheme.rb
|
||||||
|
- ./lib/coderay/scanners/sql.rb
|
||||||
|
- ./lib/coderay/scanners/xml.rb
|
||||||
|
- ./lib/coderay/scanners/yaml.rb
|
||||||
|
- ./lib/coderay/style.rb
|
||||||
|
- ./lib/coderay/styles/_map.rb
|
||||||
|
- ./lib/coderay/styles/cycnus.rb
|
||||||
|
- ./lib/coderay/styles/murphy.rb
|
||||||
|
- ./lib/coderay/token_classes.rb
|
||||||
|
- ./lib/coderay/tokens.rb
|
||||||
|
- ./lib/coderay.rb
|
||||||
|
- ./Rakefile
|
||||||
|
- ./test/functional/basic.rb
|
||||||
|
- ./test/functional/basic.rbc
|
||||||
|
- ./test/functional/for_redcloth.rb
|
||||||
|
- ./test/functional/for_redcloth.rbc
|
||||||
|
- ./test/functional/load_plugin_scanner.rb
|
||||||
|
- ./test/functional/load_plugin_scanner.rbc
|
||||||
|
- ./test/functional/suite.rb
|
||||||
|
- ./test/functional/suite.rbc
|
||||||
|
- ./test/functional/vhdl.rb
|
||||||
|
- ./test/functional/vhdl.rbc
|
||||||
|
- ./test/functional/word_list.rb
|
||||||
|
- ./test/functional/word_list.rbc
|
||||||
|
- ./lib/README
|
||||||
|
- ./LICENSE
|
||||||
|
- lib/README
|
||||||
|
- FOLDERS
|
||||||
|
- bin/coderay
|
||||||
|
- bin/coderay_stylesheet
|
||||||
|
has_rdoc: true
|
||||||
|
homepage: http://coderay.rubychan.de
|
||||||
|
licenses: []
|
||||||
|
|
||||||
|
post_install_message:
|
||||||
|
rdoc_options:
|
||||||
|
- -SNw2
|
||||||
|
- -mlib/README
|
||||||
|
- -t CodeRay Documentation
|
||||||
|
require_paths:
|
||||||
|
- lib
|
||||||
|
required_ruby_version: !ruby/object:Gem::Requirement
|
||||||
|
none: false
|
||||||
|
requirements:
|
||||||
|
- - ">="
|
||||||
|
- !ruby/object:Gem::Version
|
||||||
|
hash: 51
|
||||||
|
segments:
|
||||||
|
- 1
|
||||||
|
- 8
|
||||||
|
- 2
|
||||||
|
version: 1.8.2
|
||||||
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
||||||
|
none: false
|
||||||
|
requirements:
|
||||||
|
- - ">="
|
||||||
|
- !ruby/object:Gem::Version
|
||||||
|
hash: 3
|
||||||
|
segments:
|
||||||
|
- 0
|
||||||
|
version: "0"
|
||||||
|
requirements: []
|
||||||
|
|
||||||
|
rubyforge_project: coderay
|
||||||
|
rubygems_version: 1.3.7
|
||||||
|
signing_key:
|
||||||
|
specification_version: 3
|
||||||
|
summary: Fast syntax highlighting for selected languages.
|
||||||
|
test_files:
|
||||||
|
- ./test/functional/suite.rb
|
||||||
Vendored
+53
@@ -0,0 +1,53 @@
|
|||||||
|
= CodeRay - Trunk folder structure
|
||||||
|
|
||||||
|
== bench - Benchmarking system
|
||||||
|
|
||||||
|
All benchmarking stuff goes here.
|
||||||
|
|
||||||
|
Test inputs are stored in files named <code>example.<lang></code>.
|
||||||
|
Test outputs go to <code>bench/test.<encoder-default-file-extension></code>.
|
||||||
|
|
||||||
|
Run <code>bench/bench.rb</code> to get a usage description.
|
||||||
|
|
||||||
|
Run <code>rake bench</code> to perform an example benchmark.
|
||||||
|
|
||||||
|
|
||||||
|
== bin - Scripts
|
||||||
|
|
||||||
|
Executional files for CodeRay.
|
||||||
|
|
||||||
|
|
||||||
|
== demo - Demos and functional tests
|
||||||
|
|
||||||
|
Demonstrational scripts to show of CodeRay's features.
|
||||||
|
|
||||||
|
Run them as functional tests with <code>rake test:demos</code>.
|
||||||
|
|
||||||
|
|
||||||
|
== etc - Lots of stuff
|
||||||
|
|
||||||
|
Some addidtional files for CodeRay, mainly graphics and Vim scripts.
|
||||||
|
|
||||||
|
|
||||||
|
== gem_server - Gem output folder
|
||||||
|
|
||||||
|
For <code>rake gem</code>.
|
||||||
|
|
||||||
|
|
||||||
|
== lib - CodeRay library code
|
||||||
|
|
||||||
|
This is the base directory for the CodeRay library.
|
||||||
|
|
||||||
|
|
||||||
|
== rake_helpers - Rake helper libraries
|
||||||
|
|
||||||
|
Some files to enhance Rake, including the Autumnal Rdoc template and some scripts.
|
||||||
|
|
||||||
|
|
||||||
|
== test - Tests
|
||||||
|
|
||||||
|
Tests for the scanners.
|
||||||
|
|
||||||
|
Each language has its own subfolder and sub-suite.
|
||||||
|
|
||||||
|
Run with <code>rake test</code>.
|
||||||
File renamed without changes.
Vendored
+35
@@ -0,0 +1,35 @@
|
|||||||
|
require 'rake/rdoctask'
|
||||||
|
|
||||||
|
ROOT = '.'
|
||||||
|
LIB_ROOT = File.join ROOT, 'lib'
|
||||||
|
EXTRA_RDOC_FILES = %w(lib/README FOLDERS)
|
||||||
|
|
||||||
|
task :default => :test
|
||||||
|
|
||||||
|
if File.directory? 'rake_tasks'
|
||||||
|
|
||||||
|
# load rake tasks from subfolder
|
||||||
|
for task_file in Dir['rake_tasks/*.rake'].sort
|
||||||
|
load task_file
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
# fallback tasks when rake_tasks folder is not present
|
||||||
|
desc 'Run CodeRay tests (basic)'
|
||||||
|
task :test do
|
||||||
|
ruby './test/functional/suite.rb'
|
||||||
|
ruby './test/functional/for_redcloth.rb'
|
||||||
|
end
|
||||||
|
|
||||||
|
desc 'Generate documentation for CodeRay'
|
||||||
|
Rake::RDocTask.new :doc do |rd|
|
||||||
|
rd.title = 'CodeRay Documentation'
|
||||||
|
rd.main = 'lib/README'
|
||||||
|
rd.rdoc_files.add Dir['lib']
|
||||||
|
rd.rdoc_files.add 'lib/README'
|
||||||
|
rd.rdoc_files.add 'FOLDERS'
|
||||||
|
rd.rdoc_dir = 'doc'
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
+86
@@ -0,0 +1,86 @@
|
|||||||
|
#!/usr/bin/env ruby
|
||||||
|
# CodeRay Executable
|
||||||
|
#
|
||||||
|
# Version: 0.2
|
||||||
|
# Author: murphy
|
||||||
|
|
||||||
|
require 'coderay'
|
||||||
|
|
||||||
|
if ARGV.empty?
|
||||||
|
$stderr.puts <<-USAGE
|
||||||
|
CodeRay #{CodeRay::VERSION} (http://coderay.rubychan.de)
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
coderay file [-<format>]
|
||||||
|
coderay -<lang> [-<format>] [< file] [> output]
|
||||||
|
|
||||||
|
Defaults:
|
||||||
|
lang: based on file extension
|
||||||
|
format: ANSI colorized output for terminal, HTML page for files
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
coderay foo.rb # colorized output to terminal, based on file extension
|
||||||
|
coderay foo.rb -loc # print LOC count, based on file extension and format
|
||||||
|
coderay foo.rb > foo.html # HTML page output to file, based on extension
|
||||||
|
coderay -ruby < foo.rb # colorized output to terminal, based on lang
|
||||||
|
coderay -ruby -loc < foo.rb # print LOC count, based on lang
|
||||||
|
coderay -ruby -page foo.rb # HTML page output to terminal, based on lang and format
|
||||||
|
coderay -ruby -page foo.rb > foo.html # HTML page output to file, based on lang and format
|
||||||
|
USAGE
|
||||||
|
end
|
||||||
|
|
||||||
|
first, second = ARGV
|
||||||
|
|
||||||
|
def read
|
||||||
|
file = ARGV.grep(/^(?!-)/).last
|
||||||
|
if file
|
||||||
|
if File.exist?(file)
|
||||||
|
File.read file
|
||||||
|
else
|
||||||
|
$stderr.puts "No such file: #{file}"
|
||||||
|
end
|
||||||
|
else
|
||||||
|
$stdin.read
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if first
|
||||||
|
if first[/-(\w+)/] == first
|
||||||
|
lang = $1
|
||||||
|
input = read
|
||||||
|
tokens = :scan
|
||||||
|
else
|
||||||
|
file = first
|
||||||
|
unless File.exist? file
|
||||||
|
$stderr.puts "No such file: #{file}"
|
||||||
|
exit 2
|
||||||
|
end
|
||||||
|
tokens = CodeRay.scan_file file
|
||||||
|
end
|
||||||
|
else
|
||||||
|
$stderr.puts 'No lang/file given.'
|
||||||
|
exit 1
|
||||||
|
end
|
||||||
|
|
||||||
|
if second
|
||||||
|
if second[/-(\w+)/] == second
|
||||||
|
format = $1.to_sym
|
||||||
|
else
|
||||||
|
raise 'invalid format (must be -xxx)'
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if $stdout.tty?
|
||||||
|
format = :term
|
||||||
|
else
|
||||||
|
$stderr.puts 'No format given; setting to default (HTML Page).'
|
||||||
|
format = :page
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if tokens == :scan
|
||||||
|
output = CodeRay::Duo[lang => format].highlight input
|
||||||
|
else
|
||||||
|
output = tokens.encode format
|
||||||
|
end
|
||||||
|
out = $stdout
|
||||||
|
out.puts output
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env ruby
|
||||||
|
require 'coderay'
|
||||||
|
|
||||||
|
puts CodeRay::Encoders[:html]::CSS.new.stylesheet
|
||||||
+2
-1
@@ -18,7 +18,7 @@ And with line numbers.
|
|||||||
* is what everybody should have on their website
|
* is what everybody should have on their website
|
||||||
* solves all your problems and makes the girls run after you
|
* solves all your problems and makes the girls run after you
|
||||||
|
|
||||||
Version: 0.9.2
|
Version: 0.9.7
|
||||||
Author:: murphy (Kornelius Kalnbach)
|
Author:: murphy (Kornelius Kalnbach)
|
||||||
Contact:: murphy rubychan de
|
Contact:: murphy rubychan de
|
||||||
Website:: coderay.rubychan.de[http://coderay.rubychan.de]
|
Website:: coderay.rubychan.de[http://coderay.rubychan.de]
|
||||||
@@ -94,6 +94,7 @@ Please report errors in this documentation to <murphy rubychan de>.
|
|||||||
* Rob Aldred for the terminal encoder
|
* Rob Aldred for the terminal encoder
|
||||||
* Trans for pointing out $DEBUG dependencies
|
* Trans for pointing out $DEBUG dependencies
|
||||||
* Flameeyes for finding that Term::ANSIColor was obsolete
|
* Flameeyes for finding that Term::ANSIColor was obsolete
|
||||||
|
* Etienne Massip for reporting a serious bug in JavaScript scanner
|
||||||
* matz and all Ruby gods and gurus
|
* matz and all Ruby gods and gurus
|
||||||
* The inventors of: the computer, the internet, the true color display, HTML &
|
* The inventors of: the computer, the internet, the true color display, HTML &
|
||||||
CSS, VIM, Ruby, pizza, microwaves, guitars, scouting, programming, anime,
|
CSS, VIM, Ruby, pizza, microwaves, guitars, scouting, programming, anime,
|
||||||
+1
-1
@@ -134,7 +134,7 @@ module CodeRay
|
|||||||
# Minor: feature milestone
|
# Minor: feature milestone
|
||||||
# Teeny: development state, 0 for pre-release
|
# Teeny: development state, 0 for pre-release
|
||||||
# Revision: Subversion Revision number (generated on rake gem:make)
|
# Revision: Subversion Revision number (generated on rake gem:make)
|
||||||
VERSION = '0.9.2'
|
VERSION = '0.9.7'
|
||||||
|
|
||||||
require 'coderay/tokens'
|
require 'coderay/tokens'
|
||||||
require 'coderay/token_classes'
|
require 'coderay/token_classes'
|
||||||
Vendored
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+7
-3
@@ -276,9 +276,13 @@ module Encoders
|
|||||||
when :begin_line
|
when :begin_line
|
||||||
@opened[0] = type
|
@opened[0] = type
|
||||||
if style = @css_style[@opened]
|
if style = @css_style[@opened]
|
||||||
@out << style.sub('<span', '<div')
|
if style['class="']
|
||||||
|
@out << style.sub('class="', 'class="line ')
|
||||||
else
|
else
|
||||||
@out << '<div>'
|
@out << style.sub('>', ' class="line">')
|
||||||
|
end
|
||||||
|
else
|
||||||
|
@out << '<span class="line">'
|
||||||
end
|
end
|
||||||
@opened << type
|
@opened << type
|
||||||
when :end_line
|
when :end_line
|
||||||
@@ -289,7 +293,7 @@ module Encoders
|
|||||||
raise 'Malformed token stream: Trying to close a line (%p) \
|
raise 'Malformed token stream: Trying to close a line (%p) \
|
||||||
that is not open. Open are: %p.' % [type, @opened[1..-1]]
|
that is not open. Open are: %p.' % [type, @opened[1..-1]]
|
||||||
end
|
end
|
||||||
@out << '</div>'
|
@out << '</span>'
|
||||||
@opened.pop
|
@opened.pop
|
||||||
end
|
end
|
||||||
|
|
||||||
File renamed without changes.
+2
-2
@@ -80,8 +80,8 @@ module Encoders
|
|||||||
line_numbers.gsub!(/\n/) { "<tt>\n</tt>" }
|
line_numbers.gsub!(/\n/) { "<tt>\n</tt>" }
|
||||||
|
|
||||||
line_numbers_table_tpl = TABLE.apply('LINE_NUMBERS', line_numbers)
|
line_numbers_table_tpl = TABLE.apply('LINE_NUMBERS', line_numbers)
|
||||||
gsub!(/<\/div>\n/) { '</div>' }
|
gsub!("</div>\n", '</div>')
|
||||||
gsub!(/\n/) { "<tt>\n</tt>" }
|
gsub!("\n", "<tt>\n</tt>")
|
||||||
wrap_in! line_numbers_table_tpl
|
wrap_in! line_numbers_table_tpl
|
||||||
@wrapped_in = :div
|
@wrapped_in = :div
|
||||||
|
|
||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+15
-9
@@ -68,15 +68,16 @@ module CodeRay
|
|||||||
|
|
||||||
def normify code
|
def normify code
|
||||||
code = code.to_s
|
code = code.to_s
|
||||||
if code.respond_to? :force_encoding
|
if code.respond_to?(:encoding) && (code.encoding.name != 'UTF-8' || !code.valid_encoding?)
|
||||||
debug, $DEBUG = $DEBUG, false
|
code = code.dup
|
||||||
begin
|
original_encoding = code.encoding
|
||||||
code.force_encoding 'utf-8'
|
code.force_encoding 'Windows-1252'
|
||||||
code[/\z/] # raises an ArgumentError when code contains a non-UTF-8 char
|
unless code.valid_encoding?
|
||||||
rescue ArgumentError
|
code.force_encoding original_encoding
|
||||||
code.force_encoding 'binary'
|
if code.encoding.name == 'UTF-8'
|
||||||
ensure
|
code.encode! 'UTF-16BE', :invalid => :replace, :undef => :replace, :replace => '?'
|
||||||
$DEBUG = debug
|
end
|
||||||
|
code.encode! 'UTF-8', :invalid => :replace, :undef => :replace, :replace => '?'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
code.to_unix
|
code.to_unix
|
||||||
@@ -147,7 +148,12 @@ module CodeRay
|
|||||||
|
|
||||||
def string= code
|
def string= code
|
||||||
code = Scanner.normify(code)
|
code = Scanner.normify(code)
|
||||||
|
if defined?(RUBY_DESCRIPTION) && RUBY_DESCRIPTION['rubinius 1.0.1']
|
||||||
|
reset_state
|
||||||
|
@string = code
|
||||||
|
else
|
||||||
super code
|
super code
|
||||||
|
end
|
||||||
reset_instance
|
reset_instance
|
||||||
end
|
end
|
||||||
|
|
||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
+2
-3
@@ -14,12 +14,11 @@ module Scanners
|
|||||||
]
|
]
|
||||||
|
|
||||||
module RE
|
module RE
|
||||||
NonASCII = /[\x80-\xFF]/
|
|
||||||
Hex = /[0-9a-fA-F]/
|
Hex = /[0-9a-fA-F]/
|
||||||
Unicode = /\\#{Hex}{1,6}(?:\r\n|\s)?/ # differs from standard because it allows uppercase hex too
|
Unicode = /\\#{Hex}{1,6}(?:\r\n|\s)?/ # differs from standard because it allows uppercase hex too
|
||||||
Escape = /#{Unicode}|\\[^\r\n\f0-9a-fA-F]/
|
Escape = /#{Unicode}|\\[^\r\n\f0-9a-fA-F]/
|
||||||
NMChar = /[-_a-zA-Z0-9]|#{NonASCII}|#{Escape}/
|
NMChar = /[-_a-zA-Z0-9]|#{Escape}/
|
||||||
NMStart = /[_a-zA-Z]|#{NonASCII}|#{Escape}/
|
NMStart = /[_a-zA-Z]|#{Escape}/
|
||||||
NL = /\r\n|\r|\n|\f/
|
NL = /\r\n|\r|\n|\f/
|
||||||
String1 = /"(?:[^\n\r\f\\"]|\\#{NL}|#{Escape})*"?/ # FIXME: buggy regexp
|
String1 = /"(?:[^\n\r\f\\"]|\\#{NL}|#{Escape})*"?/ # FIXME: buggy regexp
|
||||||
String2 = /'(?:[^\n\r\f\\']|\\#{NL}|#{Escape})*'?/ # FIXME: buggy regexp
|
String2 = /'(?:[^\n\r\f\\']|\\#{NL}|#{Escape})*'?/ # FIXME: buggy regexp
|
||||||
File renamed without changes.
File renamed without changes.
+10
-5
@@ -47,11 +47,16 @@ module Scanners
|
|||||||
tokens << [match, :change]
|
tokens << [match, :change]
|
||||||
next unless match = scan(/.+/)
|
next unless match = scan(/.+/)
|
||||||
kind = :plain
|
kind = :plain
|
||||||
elsif scan(/(@@)((?>[^@\n]*))(@@)/)
|
elsif match = scan(/@@(?>[^@\n]*)@@/)
|
||||||
|
if check(/\n|$/)
|
||||||
tokens << [:begin_line, line_kind = :change]
|
tokens << [:begin_line, line_kind = :change]
|
||||||
tokens << [self[1], :change]
|
else
|
||||||
tokens << [self[2], :plain]
|
tokens << [:open, :change]
|
||||||
tokens << [self[3], :change]
|
end
|
||||||
|
tokens << [match[0,2], :change]
|
||||||
|
tokens << [match[2...-2], :plain]
|
||||||
|
tokens << [match[-2,2], :change]
|
||||||
|
tokens << [:close, :change] unless line_kind
|
||||||
next unless match = scan(/.+/)
|
next unless match = scan(/.+/)
|
||||||
kind = :plain
|
kind = :plain
|
||||||
elsif match = scan(/\+/)
|
elsif match = scan(/\+/)
|
||||||
@@ -67,7 +72,7 @@ module Scanners
|
|||||||
elsif scan(/ .*/)
|
elsif scan(/ .*/)
|
||||||
kind = :comment
|
kind = :comment
|
||||||
elsif scan(/.+/)
|
elsif scan(/.+/)
|
||||||
tokens << [:begin_line, line_kind = :head]
|
tokens << [:begin_line, line_kind = :comment]
|
||||||
kind = :plain
|
kind = :plain
|
||||||
else
|
else
|
||||||
raise_inspect 'else case rached'
|
raise_inspect 'else case rached'
|
||||||
File renamed without changes.
+1
-1
@@ -91,7 +91,7 @@ module Scanners
|
|||||||
end
|
end
|
||||||
|
|
||||||
when :attribute
|
when :attribute
|
||||||
if scan(/#{TAG_END}/)
|
if scan(/#{TAG_END}/o)
|
||||||
kind = :tag
|
kind = :tag
|
||||||
state = :initial
|
state = :initial
|
||||||
elsif scan(/#{ATTR_NAME}/o)
|
elsif scan(/#{ATTR_NAME}/o)
|
||||||
+1
-1
@@ -138,7 +138,7 @@ module Scanners
|
|||||||
elsif scan(/\\./m)
|
elsif scan(/\\./m)
|
||||||
kind = :content
|
kind = :content
|
||||||
elsif scan(/ \\ | $ /x)
|
elsif scan(/ \\ | $ /x)
|
||||||
tokens << [:close, :delimiter]
|
tokens << [:close, state]
|
||||||
kind = :error
|
kind = :error
|
||||||
state = :initial
|
state = :initial
|
||||||
else
|
else
|
||||||
File renamed without changes.
@@ -0,0 +1,224 @@
|
|||||||
|
module CodeRay
|
||||||
|
module Scanners
|
||||||
|
|
||||||
|
class JavaScript < Scanner
|
||||||
|
|
||||||
|
include Streamable
|
||||||
|
|
||||||
|
register_for :java_script
|
||||||
|
file_extension 'js'
|
||||||
|
|
||||||
|
# The actual JavaScript keywords.
|
||||||
|
KEYWORDS = %w[
|
||||||
|
break case catch continue default delete do else
|
||||||
|
finally for function if in instanceof new
|
||||||
|
return switch throw try typeof var void while with
|
||||||
|
]
|
||||||
|
PREDEFINED_CONSTANTS = %w[
|
||||||
|
false null true undefined
|
||||||
|
]
|
||||||
|
|
||||||
|
MAGIC_VARIABLES = %w[ this arguments ] # arguments was introduced in JavaScript 1.4
|
||||||
|
|
||||||
|
KEYWORDS_EXPECTING_VALUE = WordList.new.add %w[
|
||||||
|
case delete in instanceof new return throw typeof with
|
||||||
|
]
|
||||||
|
|
||||||
|
# Reserved for future use.
|
||||||
|
RESERVED_WORDS = %w[
|
||||||
|
abstract boolean byte char class debugger double enum export extends
|
||||||
|
final float goto implements import int interface long native package
|
||||||
|
private protected public short static super synchronized throws transient
|
||||||
|
volatile
|
||||||
|
]
|
||||||
|
|
||||||
|
IDENT_KIND = WordList.new(:ident).
|
||||||
|
add(RESERVED_WORDS, :reserved).
|
||||||
|
add(PREDEFINED_CONSTANTS, :pre_constant).
|
||||||
|
add(MAGIC_VARIABLES, :local_variable).
|
||||||
|
add(KEYWORDS, :keyword)
|
||||||
|
|
||||||
|
ESCAPE = / [bfnrtv\n\\'"] | x[a-fA-F0-9]{1,2} | [0-7]{1,3} /x
|
||||||
|
UNICODE_ESCAPE = / u[a-fA-F0-9]{4} | U[a-fA-F0-9]{8} /x
|
||||||
|
REGEXP_ESCAPE = / [bBdDsSwW] /x
|
||||||
|
STRING_CONTENT_PATTERN = {
|
||||||
|
"'" => /[^\\']+/,
|
||||||
|
'"' => /[^\\"]+/,
|
||||||
|
'/' => /[^\\\/]+/,
|
||||||
|
}
|
||||||
|
KEY_CHECK_PATTERN = {
|
||||||
|
"'" => / [^\\']* (?: \\.? [^\\']* )* '? \s* : /x,
|
||||||
|
'"' => / [^\\"]* (?: \\.? [^\\"]* )* "? \s* : /x,
|
||||||
|
}
|
||||||
|
|
||||||
|
def scan_tokens tokens, options
|
||||||
|
|
||||||
|
state = :initial
|
||||||
|
string_delimiter = nil
|
||||||
|
value_expected = true
|
||||||
|
key_expected = false
|
||||||
|
function_expected = false
|
||||||
|
|
||||||
|
until eos?
|
||||||
|
|
||||||
|
kind = nil
|
||||||
|
match = nil
|
||||||
|
|
||||||
|
case state
|
||||||
|
|
||||||
|
when :initial
|
||||||
|
|
||||||
|
if match = scan(/ \s+ | \\\n /x)
|
||||||
|
value_expected = true if !value_expected && match.index(?\n)
|
||||||
|
tokens << [match, :space]
|
||||||
|
next
|
||||||
|
|
||||||
|
elsif scan(%r! // [^\n\\]* (?: \\. [^\n\\]* )* | /\* (?: .*? \*/ | .* ) !mx)
|
||||||
|
value_expected = true
|
||||||
|
kind = :comment
|
||||||
|
|
||||||
|
elsif check(/\.?\d/)
|
||||||
|
key_expected = value_expected = false
|
||||||
|
if scan(/0[xX][0-9A-Fa-f]+/)
|
||||||
|
kind = :hex
|
||||||
|
elsif scan(/(?>0[0-7]+)(?![89.eEfF])/)
|
||||||
|
kind = :oct
|
||||||
|
elsif scan(/\d+[fF]|\d*\.\d+(?:[eE][+-]?\d+)?[fF]?|\d+[eE][+-]?\d+[fF]?/)
|
||||||
|
kind = :float
|
||||||
|
elsif scan(/\d+/)
|
||||||
|
kind = :integer
|
||||||
|
end
|
||||||
|
|
||||||
|
elsif value_expected && match = scan(/<([[:alpha:]]\w*) (?: [^\/>]*\/> | .*?<\/\1>)/xim)
|
||||||
|
# FIXME: scan over nested tags
|
||||||
|
xml_scanner.tokenize match
|
||||||
|
value_expected = false
|
||||||
|
next
|
||||||
|
|
||||||
|
elsif match = scan(/ [-+*=<>?:;,!&^|(\[{~%]+ | \.(?!\d) /x)
|
||||||
|
value_expected = true
|
||||||
|
last_operator = match[-1]
|
||||||
|
key_expected = (last_operator == ?{) || (last_operator == ?,)
|
||||||
|
function_expected = false
|
||||||
|
kind = :operator
|
||||||
|
|
||||||
|
elsif scan(/ [)\]}]+ /x)
|
||||||
|
function_expected = key_expected = value_expected = false
|
||||||
|
kind = :operator
|
||||||
|
|
||||||
|
elsif match = scan(/ [$a-zA-Z_][A-Za-z_0-9$]* /x)
|
||||||
|
kind = IDENT_KIND[match]
|
||||||
|
value_expected = (kind == :keyword) && KEYWORDS_EXPECTING_VALUE[match]
|
||||||
|
# TODO: labels
|
||||||
|
if kind == :ident
|
||||||
|
if match.index(?$) # $ allowed inside an identifier
|
||||||
|
kind = :predefined
|
||||||
|
elsif function_expected
|
||||||
|
kind = :function
|
||||||
|
elsif check(/\s*[=:]\s*function\b/)
|
||||||
|
kind = :function
|
||||||
|
elsif key_expected && check(/\s*:/)
|
||||||
|
kind = :key
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function_expected = (kind == :keyword) && (match == 'function')
|
||||||
|
key_expected = false
|
||||||
|
|
||||||
|
elsif match = scan(/["']/)
|
||||||
|
if key_expected && check(KEY_CHECK_PATTERN[match])
|
||||||
|
state = :key
|
||||||
|
else
|
||||||
|
state = :string
|
||||||
|
end
|
||||||
|
tokens << [:open, state]
|
||||||
|
string_delimiter = match
|
||||||
|
kind = :delimiter
|
||||||
|
|
||||||
|
elsif value_expected && (match = scan(/\/(?=\S)/))
|
||||||
|
tokens << [:open, :regexp]
|
||||||
|
state = :regexp
|
||||||
|
string_delimiter = '/'
|
||||||
|
kind = :delimiter
|
||||||
|
|
||||||
|
elsif scan(/ \/ /x)
|
||||||
|
value_expected = true
|
||||||
|
key_expected = false
|
||||||
|
kind = :operator
|
||||||
|
|
||||||
|
else
|
||||||
|
getch
|
||||||
|
kind = :error
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
when :string, :regexp, :key
|
||||||
|
if scan(STRING_CONTENT_PATTERN[string_delimiter])
|
||||||
|
kind = :content
|
||||||
|
elsif match = scan(/["'\/]/)
|
||||||
|
tokens << [match, :delimiter]
|
||||||
|
if state == :regexp
|
||||||
|
modifiers = scan(/[gim]+/)
|
||||||
|
tokens << [modifiers, :modifier] if modifiers && !modifiers.empty?
|
||||||
|
end
|
||||||
|
tokens << [:close, state]
|
||||||
|
string_delimiter = nil
|
||||||
|
key_expected = value_expected = false
|
||||||
|
state = :initial
|
||||||
|
next
|
||||||
|
elsif state != :regexp && (match = scan(/ \\ (?: #{ESCAPE} | #{UNICODE_ESCAPE} ) /mox))
|
||||||
|
if string_delimiter == "'" && !(match == "\\\\" || match == "\\'")
|
||||||
|
kind = :content
|
||||||
|
else
|
||||||
|
kind = :char
|
||||||
|
end
|
||||||
|
elsif state == :regexp && scan(/ \\ (?: #{ESCAPE} | #{REGEXP_ESCAPE} | #{UNICODE_ESCAPE} ) /mox)
|
||||||
|
kind = :char
|
||||||
|
elsif scan(/\\./m)
|
||||||
|
kind = :content
|
||||||
|
elsif scan(/ \\ | $ /x)
|
||||||
|
tokens << [:close, state]
|
||||||
|
kind = :error
|
||||||
|
key_expected = value_expected = false
|
||||||
|
state = :initial
|
||||||
|
else
|
||||||
|
raise_inspect "else case \" reached; %p not handled." % peek(1), tokens
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
raise_inspect 'Unknown state', tokens
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
match ||= matched
|
||||||
|
if $CODERAY_DEBUG and not kind
|
||||||
|
raise_inspect 'Error token %p in line %d' %
|
||||||
|
[[match, kind], line], tokens
|
||||||
|
end
|
||||||
|
raise_inspect 'Empty token', tokens unless match
|
||||||
|
|
||||||
|
tokens << [match, kind]
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
if [:string, :regexp].include? state
|
||||||
|
tokens << [:close, state]
|
||||||
|
end
|
||||||
|
|
||||||
|
tokens
|
||||||
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
def reset_instance
|
||||||
|
super
|
||||||
|
@xml_scanner.reset if defined? @xml_scanner
|
||||||
|
end
|
||||||
|
|
||||||
|
def xml_scanner
|
||||||
|
@xml_scanner ||= CodeRay.scanner :xml, :tokens => @tokens, :keep_tokens => true, :keep_state => false
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
+3
-3
@@ -47,8 +47,8 @@ module Scanners
|
|||||||
'/' => /[^\\\/]+/,
|
'/' => /[^\\\/]+/,
|
||||||
}
|
}
|
||||||
KEY_CHECK_PATTERN = {
|
KEY_CHECK_PATTERN = {
|
||||||
"'" => / [^\\']* (?: \\.? [^\\']* )* '? \s* : /x,
|
"'" => / (?> [^\\']* (?: \\. [^\\']* )* ) ' \s* : /mx,
|
||||||
'"' => / [^\\"]* (?: \\.? [^\\"]* )* "? \s* : /x,
|
'"' => / (?> [^\\"]* (?: \\. [^\\"]* )* ) " \s* : /mx,
|
||||||
}
|
}
|
||||||
|
|
||||||
def scan_tokens tokens, options
|
def scan_tokens tokens, options
|
||||||
@@ -215,7 +215,7 @@ module Scanners
|
|||||||
end
|
end
|
||||||
|
|
||||||
def xml_scanner
|
def xml_scanner
|
||||||
@xml_scanner ||= CodeRay.scanner :xml, :tokens => @tokens, :keep_tokens => true, :keep_state => true
|
@xml_scanner ||= CodeRay.scanner :xml, :tokens => @tokens, :keep_tokens => true, :keep_state => false
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
+2
-6
@@ -13,9 +13,6 @@ module Scanners
|
|||||||
:error, :integer, :operator, :value,
|
:error, :integer, :operator, :value,
|
||||||
]
|
]
|
||||||
|
|
||||||
CONSTANTS = %w( true false null )
|
|
||||||
IDENT_KIND = WordList.new(:key).add(CONSTANTS, :value)
|
|
||||||
|
|
||||||
ESCAPE = / [bfnrt\\"\/] /x
|
ESCAPE = / [bfnrt\\"\/] /x
|
||||||
UNICODE_ESCAPE = / u[a-fA-F0-9]{4} /x
|
UNICODE_ESCAPE = / u[a-fA-F0-9]{4} /x
|
||||||
|
|
||||||
@@ -23,7 +20,6 @@ module Scanners
|
|||||||
|
|
||||||
state = :initial
|
state = :initial
|
||||||
stack = []
|
stack = []
|
||||||
string_delimiter = nil
|
|
||||||
key_expected = false
|
key_expected = false
|
||||||
|
|
||||||
until eos?
|
until eos?
|
||||||
@@ -47,7 +43,7 @@ module Scanners
|
|||||||
when '}', ']' then stack.pop # no error recovery, but works for valid JSON
|
when '}', ']' then stack.pop # no error recovery, but works for valid JSON
|
||||||
end
|
end
|
||||||
elsif match = scan(/ true | false | null /x)
|
elsif match = scan(/ true | false | null /x)
|
||||||
kind = IDENT_KIND[match]
|
kind = :value
|
||||||
elsif match = scan(/-?(?:0|[1-9]\d*)/)
|
elsif match = scan(/-?(?:0|[1-9]\d*)/)
|
||||||
kind = :integer
|
kind = :integer
|
||||||
if scan(/\.\d+(?:[eE][-+]?\d+)?|[eE][-+]?\d+/)
|
if scan(/\.\d+(?:[eE][-+]?\d+)?|[eE][-+]?\d+/)
|
||||||
@@ -76,7 +72,7 @@ module Scanners
|
|||||||
elsif scan(/\\./m)
|
elsif scan(/\\./m)
|
||||||
kind = :content
|
kind = :content
|
||||||
elsif scan(/ \\ | $ /x)
|
elsif scan(/ \\ | $ /x)
|
||||||
tokens << [:close, :delimiter]
|
tokens << [:close, state]
|
||||||
kind = :error
|
kind = :error
|
||||||
state = :initial
|
state = :initial
|
||||||
else
|
else
|
||||||
File renamed without changes.
+6
@@ -225,6 +225,12 @@ module Scanners
|
|||||||
end
|
end
|
||||||
|
|
||||||
def scan_tokens tokens, options
|
def scan_tokens tokens, options
|
||||||
|
if string.respond_to?(:encoding)
|
||||||
|
unless string.encoding == Encoding::ASCII_8BIT
|
||||||
|
self.string = string.encode Encoding::ASCII_8BIT,
|
||||||
|
:invalid => :replace, :undef => :replace, :replace => '?'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
if check(RE::PHP_START) || # starts with <?
|
if check(RE::PHP_START) || # starts with <?
|
||||||
(match?(/\s*<\S/) && exist?(RE::PHP_START)) || # starts with tag and contains <?
|
(match?(/\s*<\S/) && exist?(RE::PHP_START)) || # starts with tag and contains <?
|
||||||
File renamed without changes.
File renamed without changes.
+5
-1
@@ -49,12 +49,16 @@ module Scanners
|
|||||||
@html_scanner.tokenize match
|
@html_scanner.tokenize match
|
||||||
|
|
||||||
elsif match = scan(/#{ERB_RUBY_BLOCK}/o)
|
elsif match = scan(/#{ERB_RUBY_BLOCK}/o)
|
||||||
start_tag = match[/\A<%[-=]?/]
|
start_tag = match[/\A<%[-=#]?/]
|
||||||
end_tag = match[/-?%?>?\z/]
|
end_tag = match[/-?%?>?\z/]
|
||||||
tokens << [:open, :inline]
|
tokens << [:open, :inline]
|
||||||
tokens << [start_tag, :inline_delimiter]
|
tokens << [start_tag, :inline_delimiter]
|
||||||
code = match[start_tag.size .. -1 - end_tag.size]
|
code = match[start_tag.size .. -1 - end_tag.size]
|
||||||
|
if start_tag == '<%#'
|
||||||
|
tokens << [code, :comment]
|
||||||
|
else
|
||||||
@ruby_scanner.tokenize code
|
@ruby_scanner.tokenize code
|
||||||
|
end
|
||||||
tokens << [end_tag, :inline_delimiter] unless end_tag.empty?
|
tokens << [end_tag, :inline_delimiter] unless end_tag.empty?
|
||||||
tokens << [:close, :inline]
|
tokens << [:close, :inline]
|
||||||
|
|
||||||
+47
-16
@@ -1,3 +1,4 @@
|
|||||||
|
# encoding: utf-8
|
||||||
module CodeRay
|
module CodeRay
|
||||||
module Scanners
|
module Scanners
|
||||||
|
|
||||||
@@ -28,6 +29,16 @@ module Scanners
|
|||||||
|
|
||||||
private
|
private
|
||||||
def scan_tokens tokens, options
|
def scan_tokens tokens, options
|
||||||
|
if string.respond_to?(:encoding)
|
||||||
|
unless string.encoding == Encoding::UTF_8
|
||||||
|
self.string = string.encode Encoding::UTF_8,
|
||||||
|
:invalid => :replace, :undef => :replace, :replace => '?'
|
||||||
|
end
|
||||||
|
unicode = false
|
||||||
|
else
|
||||||
|
unicode = exist?(/[^\x00-\x7f]/)
|
||||||
|
end
|
||||||
|
|
||||||
last_token_dot = false
|
last_token_dot = false
|
||||||
value_expected = true
|
value_expected = true
|
||||||
heredocs = nil
|
heredocs = nil
|
||||||
@@ -35,7 +46,7 @@ module Scanners
|
|||||||
state = :initial
|
state = :initial
|
||||||
depth = nil
|
depth = nil
|
||||||
inline_block_stack = []
|
inline_block_stack = []
|
||||||
unicode = string.respond_to?(:encoding) && string.encoding.name == 'UTF-8'
|
|
||||||
|
|
||||||
patterns = Patterns # avoid constant lookup
|
patterns = Patterns # avoid constant lookup
|
||||||
|
|
||||||
@@ -169,20 +180,29 @@ module Scanners
|
|||||||
/#{patterns::METHOD_NAME}/o)
|
/#{patterns::METHOD_NAME}/o)
|
||||||
if last_token_dot
|
if last_token_dot
|
||||||
kind = if match[/^[A-Z]/] and not match?(/\(/) then :constant else :ident end
|
kind = if match[/^[A-Z]/] and not match?(/\(/) then :constant else :ident end
|
||||||
|
else
|
||||||
|
if value_expected != :expect_colon && scan(/:(?= )/)
|
||||||
|
tokens << [match, :key]
|
||||||
|
match = ':'
|
||||||
|
kind = :operator
|
||||||
else
|
else
|
||||||
kind = patterns::IDENT_KIND[match]
|
kind = patterns::IDENT_KIND[match]
|
||||||
if kind == :ident and match[/^[A-Z]/] and not match[/[!?]$/] and not match?(/\(/)
|
if kind == :ident
|
||||||
|
if match[/\A[A-Z]/] and not match[/[!?]$/] and not match?(/\(/)
|
||||||
kind = :constant
|
kind = :constant
|
||||||
|
end
|
||||||
elsif kind == :reserved
|
elsif kind == :reserved
|
||||||
state = patterns::DEF_NEW_STATE[match]
|
state = patterns::DEF_NEW_STATE[match]
|
||||||
value_expected = :set if patterns::KEYWORDS_EXPECTING_VALUE[match]
|
value_expected = :set if patterns::KEYWORDS_EXPECTING_VALUE[match]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
value_expected = :set if check(/#{patterns::VALUE_FOLLOWS}/o)
|
value_expected = :set if check(/#{patterns::VALUE_FOLLOWS}/o)
|
||||||
|
|
||||||
elsif last_token_dot and match = scan(/#{patterns::METHOD_NAME_OPERATOR}|\(/o)
|
elsif last_token_dot and match = scan(/#{patterns::METHOD_NAME_OPERATOR}|\(/o)
|
||||||
kind = :ident
|
kind = :ident
|
||||||
value_expected = :set if check(/#{patterns::VALUE_FOLLOWS}/o)
|
value_expected = :set if check(unicode ? /#{patterns::VALUE_FOLLOWS}/uo :
|
||||||
|
/#{patterns::VALUE_FOLLOWS}/o)
|
||||||
|
|
||||||
# OPERATORS #
|
# OPERATORS #
|
||||||
elsif not last_token_dot and match = scan(/ \.\.\.? | (?:\.|::)() | [,\(\)\[\]\{\}] | ==?=? /x)
|
elsif not last_token_dot and match = scan(/ \.\.\.? | (?:\.|::)() | [,\(\)\[\]\{\}] | ==?=? /x)
|
||||||
@@ -212,7 +232,8 @@ module Scanners
|
|||||||
kind = :delimiter
|
kind = :delimiter
|
||||||
state = patterns::StringState.new :string, match == '"', match # important for streaming
|
state = patterns::StringState.new :string, match == '"', match # important for streaming
|
||||||
|
|
||||||
elsif match = scan(/#{patterns::INSTANCE_VARIABLE}/o)
|
elsif match = scan(unicode ? /#{patterns::INSTANCE_VARIABLE}/uo :
|
||||||
|
/#{patterns::INSTANCE_VARIABLE}/o)
|
||||||
kind = :instance_variable
|
kind = :instance_variable
|
||||||
|
|
||||||
elsif value_expected and match = scan(/\//)
|
elsif value_expected and match = scan(/\//)
|
||||||
@@ -225,7 +246,8 @@ module Scanners
|
|||||||
elsif match = value_expected ? scan(/[-+]?#{patterns::NUMERIC}/o) : scan(/#{patterns::NUMERIC}/o)
|
elsif match = value_expected ? scan(/[-+]?#{patterns::NUMERIC}/o) : scan(/#{patterns::NUMERIC}/o)
|
||||||
kind = self[1] ? :float : :integer
|
kind = self[1] ? :float : :integer
|
||||||
|
|
||||||
elsif match = scan(/#{patterns::SYMBOL}/o)
|
elsif match = scan(unicode ? /#{patterns::SYMBOL}/uo :
|
||||||
|
/#{patterns::SYMBOL}/o)
|
||||||
case delim = match[1]
|
case delim = match[1]
|
||||||
when ?', ?"
|
when ?', ?"
|
||||||
tokens << [:open, :symbol]
|
tokens << [:open, :symbol]
|
||||||
@@ -237,11 +259,12 @@ module Scanners
|
|||||||
kind = :symbol
|
kind = :symbol
|
||||||
end
|
end
|
||||||
|
|
||||||
elsif match = scan(/ [-+!~^]=? | [*|&]{1,2}=? | >>? /x)
|
elsif match = scan(/ -[>=]? | [+!~^]=? | [*|&]{1,2}=? | >>? /x)
|
||||||
value_expected = :set
|
value_expected = :set
|
||||||
kind = :operator
|
kind = :operator
|
||||||
|
|
||||||
elsif value_expected and match = scan(/#{patterns::HEREDOC_OPEN}/o)
|
elsif value_expected and match = scan(unicode ? /#{patterns::HEREDOC_OPEN}/uo :
|
||||||
|
/#{patterns::HEREDOC_OPEN}/o)
|
||||||
indented = self[1] == '-'
|
indented = self[1] == '-'
|
||||||
quote = self[3]
|
quote = self[3]
|
||||||
delim = self[quote ? 4 : 2]
|
delim = self[quote ? 4 : 2]
|
||||||
@@ -261,7 +284,8 @@ module Scanners
|
|||||||
state = patterns::StringState.new kind, interpreted, self[2]
|
state = patterns::StringState.new kind, interpreted, self[2]
|
||||||
kind = :delimiter
|
kind = :delimiter
|
||||||
|
|
||||||
elsif value_expected and match = scan(/#{patterns::CHARACTER}/o)
|
elsif value_expected and match = scan(unicode ? /#{patterns::CHARACTER}/uo :
|
||||||
|
/#{patterns::CHARACTER}/o)
|
||||||
kind = :integer
|
kind = :integer
|
||||||
|
|
||||||
elsif match = scan(/ [\/%]=? | <(?:<|=>?)? | [?:;] /x)
|
elsif match = scan(/ [\/%]=? | <(?:<|=>?)? | [?:;] /x)
|
||||||
@@ -277,14 +301,16 @@ module Scanners
|
|||||||
state = patterns::StringState.new :shell, true, match
|
state = patterns::StringState.new :shell, true, match
|
||||||
end
|
end
|
||||||
|
|
||||||
elsif match = scan(/#{patterns::GLOBAL_VARIABLE}/o)
|
elsif match = scan(unicode ? /#{patterns::GLOBAL_VARIABLE}/uo :
|
||||||
|
/#{patterns::GLOBAL_VARIABLE}/o)
|
||||||
kind = :global_variable
|
kind = :global_variable
|
||||||
|
|
||||||
elsif match = scan(/#{patterns::CLASS_VARIABLE}/o)
|
elsif match = scan(unicode ? /#{patterns::CLASS_VARIABLE}/uo :
|
||||||
|
/#{patterns::CLASS_VARIABLE}/o)
|
||||||
kind = :class_variable
|
kind = :class_variable
|
||||||
|
|
||||||
else
|
else
|
||||||
if !unicode
|
if !unicode && !string.respond_to?(:encoding)
|
||||||
# check for unicode
|
# check for unicode
|
||||||
debug, $DEBUG = $DEBUG, false
|
debug, $DEBUG = $DEBUG, false
|
||||||
begin
|
begin
|
||||||
@@ -300,7 +326,7 @@ module Scanners
|
|||||||
next if unicode
|
next if unicode
|
||||||
end
|
end
|
||||||
kind = :error
|
kind = :error
|
||||||
match = getch
|
match = scan(unicode ? /./mu : /./m)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -322,7 +348,8 @@ module Scanners
|
|||||||
kind = :operator
|
kind = :operator
|
||||||
else
|
else
|
||||||
state = :initial
|
state = :initial
|
||||||
if match = scan(/ (?:#{patterns::IDENT}::)* #{patterns::IDENT} /ox)
|
if match = scan(unicode ? /(?:#{patterns::IDENT}::)*#{patterns::IDENT}/uo :
|
||||||
|
/(?:#{patterns::IDENT}::)*#{patterns::IDENT}/o)
|
||||||
kind = :class
|
kind = :class
|
||||||
else
|
else
|
||||||
next
|
next
|
||||||
@@ -331,9 +358,11 @@ module Scanners
|
|||||||
|
|
||||||
elsif state == :undef_expected
|
elsif state == :undef_expected
|
||||||
state = :undef_comma_expected
|
state = :undef_comma_expected
|
||||||
if match = scan(/#{patterns::METHOD_NAME_EX}/o)
|
if match = scan(unicode ? /#{patterns::METHOD_NAME_EX}/uo :
|
||||||
|
/#{patterns::METHOD_NAME_EX}/o)
|
||||||
kind = :method
|
kind = :method
|
||||||
elsif match = scan(/#{patterns::SYMBOL}/o)
|
elsif match = scan(unicode ? /#{patterns::SYMBOL}/uo :
|
||||||
|
/#{patterns::SYMBOL}/o)
|
||||||
case delim = match[1]
|
case delim = match[1]
|
||||||
when ?', ?"
|
when ?', ?"
|
||||||
tokens << [:open, :symbol]
|
tokens << [:open, :symbol]
|
||||||
@@ -375,7 +404,9 @@ module Scanners
|
|||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
unless kind == :error
|
unless kind == :error
|
||||||
value_expected = value_expected == :set
|
if value_expected = value_expected == :set
|
||||||
|
value_expected = :expect_colon if match == '?' || match == 'when'
|
||||||
|
end
|
||||||
last_token_dot = last_token_dot == :set
|
last_token_dot = last_token_dot == :set
|
||||||
end
|
end
|
||||||
|
|
||||||
+18
-4
@@ -16,7 +16,7 @@ module Scanners
|
|||||||
DEF_KEYWORDS = %w[ def ]
|
DEF_KEYWORDS = %w[ def ]
|
||||||
UNDEF_KEYWORDS = %w[ undef ]
|
UNDEF_KEYWORDS = %w[ undef ]
|
||||||
ALIAS_KEYWORDS = %w[ alias ]
|
ALIAS_KEYWORDS = %w[ alias ]
|
||||||
MODULE_KEYWORDS = %w[class module]
|
MODULE_KEYWORDS = %w[ class module ]
|
||||||
DEF_NEW_STATE = WordList.new(:initial).
|
DEF_NEW_STATE = WordList.new(:initial).
|
||||||
add(DEF_KEYWORDS, :def_expected).
|
add(DEF_KEYWORDS, :def_expected).
|
||||||
add(UNDEF_KEYWORDS, :undef_expected).
|
add(UNDEF_KEYWORDS, :undef_expected).
|
||||||
@@ -25,14 +25,26 @@ module Scanners
|
|||||||
|
|
||||||
PREDEFINED_CONSTANTS = %w[
|
PREDEFINED_CONSTANTS = %w[
|
||||||
nil true false self
|
nil true false self
|
||||||
DATA ARGV ARGF __FILE__ __LINE__
|
DATA ARGV ARGF
|
||||||
|
__FILE__ __LINE__ __ENCODING__
|
||||||
]
|
]
|
||||||
|
|
||||||
IDENT_KIND = WordList.new(:ident).
|
IDENT_KIND = WordList.new(:ident).
|
||||||
add(RESERVED_WORDS, :reserved).
|
add(RESERVED_WORDS, :reserved).
|
||||||
add(PREDEFINED_CONSTANTS, :pre_constant)
|
add(PREDEFINED_CONSTANTS, :pre_constant)
|
||||||
|
|
||||||
IDENT = 'ä'[/[[:alpha:]]/] == 'ä' ? /[[:alpha:]_][[:alnum:]_]*/ : /[^\W\d]\w*/
|
if /\w/u === '∑'
|
||||||
|
# MRI 1.8.6, 1.8.7
|
||||||
|
IDENT = /[^\W\d]\w*/
|
||||||
|
else
|
||||||
|
if //.respond_to? :encoding
|
||||||
|
# MRI 1.9.1, 1.9.2
|
||||||
|
IDENT = Regexp.new '[\p{L}\p{M}\p{Pc}\p{Sm}&&[^\x00-\x40\x5b-\x5e\x60\x7b-\x7f]][\p{L}\p{M}\p{N}\p{Pc}\p{Sm}&&[^\x00-\x2f\x3a-\x40\x5b-\x5e\x60\x7b-\x7f]]*'
|
||||||
|
else
|
||||||
|
# JRuby, Rubinius
|
||||||
|
IDENT = /[^\x00-\x40\x5b-\x5e\x60\x7b-\x7f][^\x00-\x2f\x3a-\x40\x5b-\x5e\x60\x7b-\x7f]*/
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
METHOD_NAME = / #{IDENT} [?!]? /ox
|
METHOD_NAME = / #{IDENT} [?!]? /ox
|
||||||
METHOD_NAME_OPERATOR = /
|
METHOD_NAME_OPERATOR = /
|
||||||
@@ -109,10 +121,12 @@ module Scanners
|
|||||||
|
|
||||||
# NOTE: This is not completely correct, but
|
# NOTE: This is not completely correct, but
|
||||||
# nobody needs heredoc delimiters ending with \n.
|
# nobody needs heredoc delimiters ending with \n.
|
||||||
|
# Also, delimiters starting with numbers are allowed.
|
||||||
|
# but they are more often than not a false positive.
|
||||||
HEREDOC_OPEN = /
|
HEREDOC_OPEN = /
|
||||||
<< (-)? # $1 = float
|
<< (-)? # $1 = float
|
||||||
(?:
|
(?:
|
||||||
( [A-Za-z_0-9]+ ) # $2 = delim
|
( #{IDENT} ) # $2 = delim
|
||||||
|
|
|
|
||||||
( ["'`\/] ) # $3 = quote, type
|
( ["'`\/] ) # $3 = quote, type
|
||||||
( [^\n]*? ) \3 # $4 = delim
|
( [^\n]*? ) \3 # $4 = delim
|
||||||
Loaded 100 of 122 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user