diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 2f96e2d..7857685 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -118,11 +118,6 @@ class RepositoriesController < ApplicationController def revision @changeset = @repository.changesets.find_by_revision(@rev) raise ChangesetNotFound unless @changeset - @changes_count = @changeset.changes.size - @changes_pages = Paginator.new self, @changes_count, 150, params['page'] - @changes = @changeset.changes.find(:all, - :limit => @changes_pages.items_per_page, - :offset => @changes_pages.current.offset) respond_to do |format| format.html diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index 852ed18..1a82bb8 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -32,6 +32,74 @@ module RepositoriesHelper end end + def render_changeset_changes + changes = @changeset.changes.find(:all, :limit => 1000, :order => 'path').collect do |change| + case change.action + when 'A' + # Detects moved/copied files + if !change.from_path.blank? + change.action = @changeset.changes.detect {|c| c.action == 'D' && c.path == change.from_path} ? 'R' : 'C' + end + change + when 'D' + @changeset.changes.detect {|c| c.from_path == change.path} ? nil : change + else + change + end + end.compact + + tree = { } + changes.each do |change| + p = tree + dirs = change.path.to_s.split('/').select {|d| !d.blank?} + dirs.each do |dir| + p[:s] ||= {} + p = p[:s] + p[dir] ||= {} + p = p[dir] + end + p[:c] = change + end + + render_changes_tree(tree[:s]) + end + + def render_changes_tree(tree) + return '' if tree.nil? + + output = '' + output << '' + output + end + def to_utf8(str) return str if /\A[\r\n\t\x20-\x7e]*\Z/n.match(str) # for us-ascii @encodings ||= Setting.repositories_encodings.split(',').collect(&:strip) diff --git a/app/views/issues/_sidebar.rhtml b/app/views/issues/_sidebar.rhtml index db93516..1b48696 100644 --- a/app/views/issues/_sidebar.rhtml +++ b/app/views/issues/_sidebar.rhtml @@ -19,6 +19,6 @@

<%= l(:label_query_plural) %>

<% sidebar_queries.each do |query| -%> -<%= link_to query.name, :query_id => query %>
+<%= link_to query.name, :controller => 'issues', :action => 'index', :project_id => @project, :query_id => query %>
<% end -%> <% end -%> diff --git a/app/views/repositories/revision.rhtml b/app/views/repositories/revision.rhtml index 80ac3bd..123fccf 100644 --- a/app/views/repositories/revision.rhtml +++ b/app/views/repositories/revision.rhtml @@ -36,33 +36,19 @@ <% end %>

<%= l(:label_attachment_plural) %>

-
-
<%= l(:label_added) %> 
-
<%= l(:label_modified) %> 
-
<%= l(:label_deleted) %> 
-
+ +

<%= link_to(l(:label_view_diff), :action => 'diff', :id => @project, :path => "", :rev => @changeset.revision) if @changeset.changes.any? %>

- - -<% @changes.each do |change| %> - - - - -<% end %> - -
-<% if change.action == "D" -%> - <%= change.path -%> -<% else -%> - <%= link_to change.path, :action => 'entry', :id => @project, :path => to_path_param(change.relative_path), :rev => @changeset.revision -%> -<% end -%> -<%= "(#{change.revision})" unless change.revision.blank? %>
-<% if change.action == "M" %> -<%= link_to l(:label_view_diff), :action => 'diff', :id => @project, :path => to_path_param(change.relative_path), :rev => @changeset.revision %> -<% end %> -
-

<%= pagination_links_full @changes_pages %>

+ +
+<%= render_changeset_changes %> +
<% content_for :header_tags do %> <%= stylesheet_link_tag "scm" %> diff --git a/extra/mail_handler/rdm-mailhandler.rb b/extra/mail_handler/rdm-mailhandler.rb index 96e9751..0f8020c 100644 --- a/extra/mail_handler/rdm-mailhandler.rb +++ b/extra/mail_handler/rdm-mailhandler.rb @@ -1,13 +1,51 @@ #!/usr/bin/ruby -# rdm-mailhandler +# == Synopsis +# # Reads an email from standard input and forward it to a Redmine server -# Can be used from a remote mail server +# through a HTTP request. +# +# == Usage +# +# rdm-mailhandler [options] --url= --key= +# +# == Arguments +# +# -u, --url URL of the Redmine server +# -k, --key Redmine API key +# +# General options: +# -h, --help show this help +# -v, --verbose show extra information +# -V, --version show version information and exit +# +# Issue attributes control options: +# -p, --project=PROJECT identifier of the target project +# -t, --tracker=TRACKER name of the target tracker +# --category=CATEGORY name of the target category +# --priority=PRIORITY name of the target priority +# -o, --allow-override=ATTRS allow email content to override attributes +# specified by previous options +# ATTRS is a comma separated list of attributes +# +# == Examples +# No project specified. Emails MUST contain the 'Project' keyword: +# +# rdm-mailhandler --url http://redmine.domain.foo --key secret +# +# Fixed project and default tracker specified, but emails can override +# both tracker and priority attributes using keywords: +# +# rdm-mailhandler --url https://domain.foo/redmine --key secret \\ +# --project foo \\ +# --tracker bug \\ +# --allow-override tracker,priority require 'net/http' require 'net/https' require 'uri' require 'getoptlong' +require 'rdoc/usage' module Net class HTTPS < HTTP @@ -31,15 +69,15 @@ class RedmineMailHandler self.issue_attributes = {} opts = GetoptLong.new( - [ '--help', '-h', GetoptLong::NO_ARGUMENT ], - [ '--version', '-V', GetoptLong::NO_ARGUMENT ], - [ '--verbose', '-v', GetoptLong::NO_ARGUMENT ], - [ '--url', '-u', GetoptLong::REQUIRED_ARGUMENT ], - [ '--key', '-k', GetoptLong::REQUIRED_ARGUMENT], - [ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ], - [ '--tracker', '-t', GetoptLong::REQUIRED_ARGUMENT], - [ '--category', GetoptLong::REQUIRED_ARGUMENT], - [ '--priority', GetoptLong::REQUIRED_ARGUMENT], + [ '--help', '-h', GetoptLong::NO_ARGUMENT ], + [ '--version', '-V', GetoptLong::NO_ARGUMENT ], + [ '--verbose', '-v', GetoptLong::NO_ARGUMENT ], + [ '--url', '-u', GetoptLong::REQUIRED_ARGUMENT ], + [ '--key', '-k', GetoptLong::REQUIRED_ARGUMENT], + [ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ], + [ '--tracker', '-t', GetoptLong::REQUIRED_ARGUMENT], + [ '--category', GetoptLong::REQUIRED_ARGUMENT], + [ '--priority', GetoptLong::REQUIRED_ARGUMENT], [ '--allow-override', '-o', GetoptLong::REQUIRED_ARGUMENT] ) @@ -62,7 +100,7 @@ class RedmineMailHandler end end - usage if url.nil? + RDoc.usage if url.nil? end def submit(email) @@ -74,48 +112,14 @@ class RedmineMailHandler debug "Posting to #{uri}..." response = Net::HTTPS.post_form(URI.parse(uri), data) debug "Response received: #{response.code}" - response.code == 201 ? 0 : 1 + + puts "Request was denied by your Redmine server. " + + "Please, make sure that 'WS for incoming emails' is enabled in application settings and that you provided the correct API key." if response.code == '403' + response.code == '201' ? 0 : 1 end private - def usage - puts <<-USAGE -Usage: rdm-mailhandler [options] --url= --key= -Reads an email from standard input and forward it to a Redmine server - -Required: - -u, --url URL of the Redmine server - -k, --key Redmine API key - -General options: - -h, --help show this help - -v, --verbose show extra information - -V, --version show version information and exit - -Issue attributes control options: - -p, --project=PROJECT identifier of the target project - -t, --tracker=TRACKER name of the target tracker - --category=CATEGORY name of the target category - --priority=PRIORITY name of the target priority - -o, --allow-override=ATTRS allow email content to override attributes - specified by previous options - ATTRS is a comma separated list of attributes - -Examples: - # No project specified. Emails MUST contain the 'Project' keyword: - rdm-mailhandler --url http://redmine.domain.foo --key secret - - # Fixed project and default tracker specified, but emails can override - # both tracker and priority attributes: - rdm-mailhandler --url https://domain.foo/redmine --key secret \\ - --project foo \\ - --tracker bug \\ - --allow-override tracker,priority -USAGE - exit - end - def debug(msg) puts msg if verbose end diff --git a/extra/svn/reposman.rb b/extra/svn/reposman.rb index 76804d6..0e1c757 100755 --- a/extra/svn/reposman.rb +++ b/extra/svn/reposman.rb @@ -2,15 +2,15 @@ # == Synopsis # -# reposman: manages your svn repositories with Redmine +# reposman: manages your repositories with Redmine # # == Usage # # reposman [OPTIONS...] -s [DIR] -r [HOST] # # Examples: -# reposman --svn-dir=/var/svn --redmine-host=redmine.example.net -# reposman -s /var/svn -r redmine.example.net -u http://svn.example.net +# reposman --svn-dir=/var/svn --redmine-host=redmine.example.net --scm subversion +# reposman -s /var/git -r redmine.example.net -u http://svn.example.net --scm git # # == Arguments (mandatory) # @@ -24,7 +24,12 @@ # # -o, --owner=OWNER owner of the repository. using the rails login # allow user to browse the repository within -# Redmine even for private project +# Redmine even for private project. If you want to share repositories +# through Redmine.pm, you need to use the apache owner. +# --scm=SCM the kind of SCM repository you want to create (and register) in +# Redmine (default: Subversion). reposman is able to create Git +# and Subversion repositories. For all other kind (Bazaar, +# Darcs, Filesystem, Mercurial) you must specify a --command option # -u, --url=URL the base url Redmine will use to access your # repositories. This option is used to automatically # register the repositories in Redmine. The project @@ -35,13 +40,8 @@ # the repositories in Redmine # -c, --command=COMMAND use this command instead of "svnadmin create" to # create a repository. This option can be used to -# create non-subversion repositories -# --scm SCM vendor used to register the repository in -# Redmine (default: Subversion). Can be one of the -# other supported SCM: Bazaar, Darcs, Filesystem, -# Git, Mercurial (case sensitive). -# This option should be used when both options --url -# and --command are used. +# create repositories other than subversion and git kind. +# This command override the default creation for git and subversion. # -f, --force force repository creation even if the project # repository is already declared in Redmine # -t, --test only show what should be done @@ -49,6 +49,11 @@ # -v, --verbose verbose # -V, --version print version and exit # -q, --quiet no log +# +# == References +# +# You can find more information on the redmine's wiki : http://www.redmine.org/wiki/redmine/HowTos + require 'getoptlong' require 'rdoc/usage' @@ -82,16 +87,38 @@ $svn_owner = 'root' $use_groupid = true $svn_url = false $test = false -$command = "svnadmin create" $force = false $scm = 'Subversion' def log(text,level=0, exit=false) - return if $quiet or level > $verbose - puts text + puts text unless $quiet or level > $verbose exit 1 if exit end +def system_or_raise(command) + raise "\"#{command}\" failed" unless system command +end + +module SCM + + module Subversion + def self.create(path) + system_or_raise "svnadmin create #{path}" + end + end + + module Git + def self.create(path) + Dir.mkdir path + Dir.chdir(path) do + system_or_raise "git --bare init --shared" + system_or_raise "git-update-server-info" + end + end + end + +end + begin opts.each do |opt, arg| case opt @@ -99,7 +126,7 @@ begin when '--redmine-host'; $redmine_host = arg.dup when '--owner'; $svn_owner = arg.dup; $use_groupid = false; when '--url'; $svn_url = arg.dup - when '--scm'; $scm = arg.dup; log("Invalid SCM: #{$scm}", 0, true) unless SUPPORTED_SCM.include?($scm) + when '--scm'; $scm = arg.dup.capitalize; log("Invalid SCM: #{$scm}", 0, true) unless SUPPORTED_SCM.include?($scm) when '--command'; $command = arg.dup when '--verbose'; $verbose += 1 when '--test'; $test = true @@ -117,12 +144,15 @@ if $test log("running in test mode") end -# Make sure command is overridden if SCM vendor is not Subversion -if $scm != 'Subversion' && $command == 'svnadmin create' - log("Please use --command option to specify how to create a #{$scm} repository.", 0, true) +# Make sure command is overridden if SCM vendor is not handled internally (for the moment Subversion and Git) +if $command.nil? + begin + scm_module = SCM.const_get($scm) + rescue + log("Please use --command option to specify how to create a #{$scm} repository.", 0, true) + end end - $svn_url += "/" if $svn_url and not $svn_url.match(/\/$/) if ($redmine_host.empty? or $repos_base.empty?) @@ -231,8 +261,11 @@ projects.each do |project| begin set_owner_and_rights(project, repos_path) do - command = "#{$command} #{repos_path}" - raise "#{command} failed" unless system( command ) + if scm_module.nil? + system_or_raise "#{$command} #{repos_path}" + else + scm_module.create(repos_path) + end end rescue => e log("\tunable to create #{repos_path} : #{e}\n") diff --git a/lang/bg.yml b/lang/bg.yml index c5c4e0e..e072ad9 100644 --- a/lang/bg.yml +++ b/lang/bg.yml @@ -638,3 +638,5 @@ setting_commit_logs_encoding: Commit messages encoding button_quote: Quote setting_sequential_project_identifiers: Generate sequential project identifiers notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/ca.yml b/lang/ca.yml new file mode 100644 index 0000000..895f213 --- /dev/null +++ b/lang/ca.yml @@ -0,0 +1,644 @@ +_gloc_rule_default: '|n| n==1 ? "" : "_plural" ' + +actionview_datehelper_select_day_prefix: +actionview_datehelper_select_month_names: Gener,Febrer,Març,Abril,Maig,Juny,Juliol,Agost,Setembre,Octubre,Novembre,Desembre +actionview_datehelper_select_month_names_abbr: Gen,Feb,Mar,Abr,Mai,Jun,Jul,Ago,Set,Oct,Nov,Dec +actionview_datehelper_select_month_prefix: +actionview_datehelper_select_year_prefix: +actionview_datehelper_time_in_words_day: 1 dia +actionview_datehelper_time_in_words_day_plural: %d dies +actionview_datehelper_time_in_words_hour_about: aproximadament una hora +actionview_datehelper_time_in_words_hour_about_plural: aproximadament %d hores +actionview_datehelper_time_in_words_hour_about_single: aproximadament una hora +actionview_datehelper_time_in_words_minute: 1 minut +actionview_datehelper_time_in_words_minute_half: mig minut +actionview_datehelper_time_in_words_minute_less_than: "menys d'un minut" +actionview_datehelper_time_in_words_minute_plural: %d minuts +actionview_datehelper_time_in_words_minute_single: 1 minut +actionview_datehelper_time_in_words_second_less_than: "menys d'un segon" +actionview_datehelper_time_in_words_second_less_than_plural: menys de %d segons +actionview_instancetag_blank_option: Seleccioneu + +activerecord_error_inclusion: no està inclòs a la llista +activerecord_error_exclusion: està reservat +activerecord_error_invalid: no és vàlid +activerecord_error_confirmation: la confirmació no coincideix +activerecord_error_accepted: "s'ha d'acceptar" +activerecord_error_empty: no pot estar buit +activerecord_error_blank: no pot estar en blanc +activerecord_error_too_long: és massa llarg +activerecord_error_too_short: és massa curt +activerecord_error_wrong_length: la longitud és incorrecta +activerecord_error_taken: "ja s'està utilitzant" +activerecord_error_not_a_number: no és un número +activerecord_error_not_a_date: no és una data vàlida +activerecord_error_greater_than_start_date: ha de ser superior que la data inicial +activerecord_error_not_same_project: no pertany al mateix projecte +activerecord_error_circular_dependency: Aquesta relació crearia una dependència circular + +general_fmt_age: %d any +general_fmt_age_plural: %d anys +general_fmt_date: %%d/%%m/%%Y +general_fmt_datetime: %%d/%%m/%%Y %%H:%%M +general_fmt_datetime_short: %%d/%%m %%H:%%M +general_fmt_time: %%H:%%M +general_text_No: 'No' +general_text_Yes: 'Si' +general_text_no: 'no' +general_text_yes: 'si' +general_lang_name: 'Català' +general_csv_separator: ';' +general_csv_decimal_separator: ',' +general_csv_encoding: ISO-8859-15 +general_pdf_encoding: ISO-8859-15 +general_day_names: Dilluns,Dimarts,Dimecres,Dijous,Divendres,Dissabte,Diumenge +general_first_day_of_week: '1' + +notice_account_updated: "El compte s'ha actualitzat correctament." +notice_account_invalid_creditentials: Usuari o contrasenya invàlid +notice_account_password_updated: "La contrasenya s'ha modificat correctament." +notice_account_wrong_password: Contrasenya incorrecta +notice_account_register_done: "El compte s'ha creat correctament. Per a activar el compte, feu clic en l'enllaç que us han enviat per correu electrònic." +notice_account_unknown_email: Usuari desconegut. +notice_can_t_change_password: "Aquest compte utilitza una font d'autenticació externa. No és possible canviar la contrasenya." +notice_account_lost_email_sent: "S'ha enviat un correu electrònic amb instruccions per a seleccionar una contrasenya nova." +notice_account_activated: "El compte s'ha activat. Ara podeu entrar." +notice_successful_create: "S'ha creat correctament." +notice_successful_update: "S'ha modificat correctament." +notice_successful_delete: "S'ha suprimit correctament." +notice_successful_connection: "S'ha connectat correctament." +notice_file_not_found: "La pàgina a la que intenteu accedir no existeix o s'ha suprimit." +notice_locking_conflict: Un altre usuari ha actualitzat les dades. +notice_not_authorized: No teniu permís per a accedir a aquesta pàgina. +notice_email_sent: "S'ha enviat un correu electrònic a %s" +notice_email_error: "S'ha produït un error en enviar el correu (%s)" +notice_feeds_access_key_reseted: "S'ha reiniciat la clau d'accés del RSS." +notice_failed_to_save_issues: "No s'han pogut desar %s assumptes de %d seleccionats: %s." +notice_no_issue_selected: "No s'ha seleccionat cap assumpte. Activeu els assumptes que voleu editar." +notice_account_pending: "S'ha creat el compte i ara està pendent de l'aprovació de l'administrador." +notice_default_data_loaded: "S'ha carregat correctament la configuració predeterminada." + +error_can_t_load_default_data: "No s'ha pogut carregar la configuració predeterminada: %s" +error_scm_not_found: "No s'ha trobat l'entrada o la revisió en el dipòsit." +error_scm_command_failed: "S'ha produït un error en intentar accedir al dipòsit: %s" +error_scm_annotate: "L'entrada no existeix o no s'ha pogut anotar." +error_issue_not_found_in_project: "No s'ha trobat l'assumpte o no pertany a aquest projecte" + +mail_subject_lost_password: Contrasenya de %s +mail_body_lost_password: "Per a canviar la contrasenya, feu clic en l'enllaç següent:" +mail_subject_register: Activació del compte de %s +mail_body_register: "Per a activar el compte, feu clic en l'enllaç següent:" +mail_body_account_information_external: Podeu utilitzar el compte «%s» per a entrar. +mail_body_account_information: Informació del compte +mail_subject_account_activation_request: "Sol·licitud d'activació del compte de %s" +mail_body_account_activation_request: "S'ha registrat un usuari nou (%s). El seu compte està pendent d'aprovació:" +mail_subject_reminder: "%d assumptes venceran els següents %d dies" +mail_body_reminder: "%d assumptes que teniu assignades venceran els següents %d dies:" + +gui_validation_error: 1 error +gui_validation_error_plural: %d errors + +field_name: Nom +field_description: Descripció +field_summary: Resum +field_is_required: Necessari +field_firstname: Nom +field_lastname: Cognom +field_mail: Correu electrònic +field_filename: Fitxer +field_filesize: Mida +field_downloads: Baixades +field_author: Autor +field_created_on: Creat +field_updated_on: Actualitzat +field_field_format: Format +field_is_for_all: Per a tots els projectes +field_possible_values: Valores possibles +field_regexp: Expressió regular +field_min_length: Longitud mínima +field_max_length: Longitud màxima +field_value: Valor +field_category: Categoria +field_title: Títol +field_project: Projecte +field_issue: Assumpte +field_status: Estat +field_notes: Notes +field_is_closed: Assumpte tancat +field_is_default: Estat predeterminat +field_tracker: Seguidor +field_subject: Tema +field_due_date: Data de venciment +field_assigned_to: Assignat a +field_priority: Prioritat +field_fixed_version: Versió objectiu +field_user: Usuari +field_role: Rol +field_homepage: Pàgina web +field_is_public: Públic +field_parent: Subprojecte de +field_is_in_chlog: Assumptes mostrats en el registre de canvis +field_is_in_roadmap: Assumptes mostrats en la planificació +field_login: Entrada +field_mail_notification: Notificacions per correu electrònic +field_admin: Administrador +field_last_login_on: Última connexió +field_language: Idioma +field_effective_date: Data +field_password: Contrasenya +field_new_password: Contrasenya nova +field_password_confirmation: Confirmació +field_version: Versió +field_type: Tipus +field_host: Ordinador +field_port: Port +field_account: Compte +field_base_dn: Base DN +field_attr_login: "Atribut d'entrada" +field_attr_firstname: Atribut del nom +field_attr_lastname: Atribut del cognom +field_attr_mail: Atribut del correu electrònic +field_onthefly: "Creació de l'usuari «al vol»" +field_start_date: Inici +field_done_ratio: %% realitzat +field_auth_source: "Mode d'autenticació" +field_hide_mail: "Oculta l'adreça de correu electrònic" +field_comment: Comentari +field_url: URL +field_start_page: Pàgina inicial +field_subproject: Subprojecte +field_hours: Hores +field_activity: Activitat +field_spent_on: Data +field_identifier: Identificador +field_is_filter: "S'ha utilitzat com a filtre" +field_issue_to_id: Assumpte relacionat +field_delay: Retard +field_assignable: Es poden assignar assumptes a aquest rol +field_redirect_existing_links: Redirigeix els enllaços existents +field_estimated_hours: Temps previst +field_column_names: Columnes +field_time_zone: Zona horària +field_searchable: Es pot cercar +field_default_value: Valor predeterminat +field_comments_sorting: Mostra els comentaris +field_parent_title: Pàgina pare + +setting_app_title: "Títol de l'aplicació" +setting_app_subtitle: "Subtítol de l'aplicació" +setting_welcome_text: Text de benvinguda +setting_default_language: Idioma predeterminat +setting_login_required: Es necessita autenticació +setting_self_registration: Registre automàtic +setting_attachment_max_size: Mida màxima dels adjunts +setting_issues_export_limit: "Límit d'exportació d'assumptes" +setting_mail_from: "Adreça de correu electrònic d'emissió" +setting_bcc_recipients: Vincula els destinataris de les còpies amb carbó (bcc) +setting_host_name: "Nom de l'ordinador" +setting_text_formatting: Format del text +setting_wiki_compression: "Comprimeix l'historial del wiki" +setting_feeds_limit: Límit de contingut del canal +setting_default_projects_public: Els projectes nous són públics per defecte +setting_autofetch_changesets: Omple automàticament les publicacions +setting_sys_api_enabled: Habilita el WS per a la gestió del dipòsit +setting_commit_ref_keywords: Paraules claus per a la referència +setting_commit_fix_keywords: Paraules claus per a la correcció +setting_autologin: Entrada automàtica +setting_date_format: Format de la data +setting_time_format: Format de hora +setting_cross_project_issue_relations: "Permet les relacions d'assumptes entre projectes" +setting_issue_list_default_columns: "Columnes mostrades per defecte en la llista d'assumptes" +setting_repositories_encodings: Codificacions del dipòsit +setting_emails_footer: Peu dels correus electrònics +setting_protocol: Protocol +setting_per_page_options: Opcions dels objectes per pàgina +setting_user_format: "Format de com mostrar l'usuari" +setting_activity_days_default: "Dies a mostrar l'activitat del projecte" +setting_display_subprojects_issues: "Mostra els assumptes d'un subprojecte en el projecte pare per defecte" +setting_enabled_scm: "Habilita l'SCM" +setting_mail_handler_api_enabled: "Habilita el WS per correus electrònics d'entrada" +setting_mail_handler_api_key: Clau API + +project_module_issue_tracking: "Seguidor d'assumptes" +project_module_time_tracking: Seguidor de temps +project_module_news: Noticies +project_module_documents: Documents +project_module_files: Fitxers +project_module_wiki: Wiki +project_module_repository: Dipòsit +project_module_boards: Taulers + +label_user: Usuari +label_user_plural: Usuaris +label_user_new: Usuari nou +label_project: Projecte +label_project_new: Projecte nou +label_project_plural: Projectes +label_project_all: Tots els projectes +label_project_latest: Els últims projectes +label_issue: Assumpte +label_issue_new: Assumpte nou +label_issue_plural: Assumptes +label_issue_view_all: Visualitza tots els assumptes +label_issues_by: Assumptes per %s +label_issue_added: Assumpte afegit +label_issue_updated: Assumpte actualitzat +label_document: Document +label_document_new: Document nou +label_document_plural: Documents +label_document_added: Document afegit +label_role: Rol +label_role_plural: Rols +label_role_new: Rol nou +label_role_and_permissions: Rols i permisos +label_member: Membre +label_member_new: Membre nou +label_member_plural: Membres +label_tracker: Seguidor +label_tracker_plural: Seguidors +label_tracker_new: Seguidor nou +label_workflow: Flux de treball +label_issue_status: "Estat de l'assumpte" +label_issue_status_plural: "Estats de l'assumpte" +label_issue_status_new: Estat nou +label_issue_category: "Categoria de l'assumpte" +label_issue_category_plural: "Categories de l'assumpte" +label_issue_category_new: Categoria nova +label_custom_field: Camp personalitzat +label_custom_field_plural: Camps personalitzats +label_custom_field_new: Camp personalitzat nou +label_enumerations: Enumeracions +label_enumeration_new: Valor nou +label_information: Informació +label_information_plural: Informació +label_please_login: Entreu +label_register: Registre +label_password_lost: Contrasenya perduda +label_home: Inici +label_my_page: La meva pàgina +label_my_account: El meu compte +label_my_projects: Els meus projectes +label_administration: Administració +label_login: Entra +label_logout: Surt +label_help: Ajuda +label_reported_issues: Assumptes informats +label_assigned_to_me_issues: Assumptes assignats a mi +label_last_login: Última connexió +label_last_updates: Última actualització +label_last_updates_plural: %d última actualització +label_registered_on: Informat el +label_activity: Activitat +label_overall_activity: Activitat global +label_new: Nou +label_logged_as: Heu entrat com a +label_environment: Entorn +label_authentication: Autenticació +label_auth_source: "Mode d'autenticació" +label_auth_source_new: "Mode d'autenticació nou" +label_auth_source_plural: "Modes d'autenticació" +label_subproject_plural: Subprojectes +label_and_its_subprojects: %s i els seus subprojectes +label_min_max_length: Longitud mín - max +label_list: Llist +label_date: Data +label_integer: Enter +label_float: Flotant +label_boolean: Booleà +label_string: Text +label_text: Text llarg +label_attribute: Atribut +label_attribute_plural: Atributs +label_download: %d baixada +label_download_plural: %d baixades +label_no_data: Sense dades a mostrar +label_change_status: "Canvia l'estat" +label_history: Historial +label_attachment: Fitxer +label_attachment_new: Fitxer nou +label_attachment_delete: Suprimeix el fitxer +label_attachment_plural: Fitxers +label_file_added: Fitxer afegit +label_report: Informe +label_report_plural: Informes +label_news: Noticies +label_news_new: Afegeix noticies +label_news_plural: Noticies +label_news_latest: Últimes noticies +label_news_view_all: Visualitza totes les noticies +label_news_added: Noticies afegides +label_change_log: Registre de canvis +label_settings: Paràmetres +label_overview: Resum +label_version: Versió +label_version_new: Versió nova +label_version_plural: Versions +label_confirmation: Confirmació +label_export_to: 'També disponible a:' +label_read: Llegeix... +label_public_projects: Projectes públics +label_open_issues: obert +label_open_issues_plural: oberts +label_closed_issues: tancat +label_closed_issues_plural: tancats +label_total: Total +label_permissions: Permisos +label_current_status: Estat actual +label_new_statuses_allowed: Nous estats autoritzats +label_all: tots +label_none: cap +label_nobody: ningú +label_next: Següent +label_previous: Anterior +label_used_by: Utilitzat per +label_details: Detalls +label_add_note: Afegeix una nota +label_per_page: Per pàgina +label_calendar: Calendari +label_months_from: mesos des de +label_gantt: Gantt +label_internal: Intern +label_last_changes: últims %d canvis +label_change_view_all: Visualitza tots els canvis +label_personalize_page: Personalitza aquesta pàgina +label_comment: Comentari +label_comment_plural: Comentaris +label_comment_add: Afegeix un comentari +label_comment_added: Comentari afegit +label_comment_delete: Suprimeix comentaris +label_query: Consulta personalitzada +label_query_plural: Consultes personalitzades +label_query_new: Consulta nova +label_filter_add: Afegeix un filtre +label_filter_plural: Filtres +label_equals: és +label_not_equals: no és +label_in_less_than: en menys de +label_in_more_than: en més de +label_in: en +label_today: avui +label_all_time: tot el temps +label_yesterday: ahir +label_this_week: aquesta setmana +label_last_week: "l'última setmana" +label_last_n_days: els últims %d dies +label_this_month: aquest més +label_last_month: "l'últim més" +label_this_year: aquest any +label_date_range: Abast de les dates +label_less_than_ago: fa menys de +label_more_than_ago: fa més de +label_ago: fa +label_contains: conté +label_not_contains: no conté +label_day_plural: dies +label_repository: Dipòsit +label_repository_plural: Dipòsits +label_browse: Navega +label_modification: %d canvi +label_modification_plural: %d canvis +label_revision: Revisió +label_revision_plural: Revisions +label_associated_revisions: Revisions associades +label_added: afegit +label_modified: modificat +label_deleted: suprimit +label_latest_revision: Última revisió +label_latest_revision_plural: Últimes revisions +label_view_revisions: Visualitza les revisions +label_max_size: Mida màxima +label_on: 'de' +label_sort_highest: Mou a la part superior +label_sort_higher: Mou cap amunt +label_sort_lower: Mou cap avall +label_sort_lowest: Mou a la part inferior +label_roadmap: Planificació +label_roadmap_due_in: Venç en +label_roadmap_overdue: %s tard +label_roadmap_no_issues: No hi ha assumptes per a aquesta versió +label_search: Cerca +label_result_plural: Resultats +label_all_words: Totes les paraules +label_wiki: Wiki +label_wiki_edit: Edició wiki +label_wiki_edit_plural: Edicions wiki +label_wiki_page: Pàgina wiki +label_wiki_page_plural: Pàgines wiki +label_index_by_title: Índex per títol +label_index_by_date: Índex per data +label_current_version: Versió actual +label_preview: Previsualització +label_feed_plural: Canals +label_changes_details: Detalls de tots els canvis +label_issue_tracking: "Seguiment d'assumptes" +label_spent_time: Temps invertit +label_f_hour: %.2f hora +label_f_hour_plural: %.2f hores +label_time_tracking: Temps de seguiment +label_change_plural: Canvis +label_statistics: Estadístiques +label_commits_per_month: Publicacions per mes +label_commits_per_author: Publicacions per autor +label_view_diff: Visualitza les diferències +label_diff_inline: en línia +label_diff_side_by_side: costat per costat +label_options: Opcions +label_copy_workflow_from: Copia el flux de treball des de +label_permissions_report: Informe de permisos +label_watched_issues: Assumptes vigilats +label_related_issues: Assumptes relacionats +label_applied_status: Estat aplicat +label_loading: "S'està carregant..." +label_relation_new: Relació nova +label_relation_delete: Suprimeix la relació +label_relates_to: relacionat amb +label_duplicates: duplicats +label_duplicated_by: duplicat per +label_blocks: bloqueja +label_blocked_by: bloquejats per +label_precedes: anterior a +label_follows: posterior a +label_end_to_start: final al començament +label_end_to_end: final al final +label_start_to_start: començament al començament +label_start_to_end: començament al final +label_stay_logged_in: "Manté l'entrada en" +label_disabled: inhabilitat +label_show_completed_versions: Mostra les versions completes +label_me: jo mateix +label_board: Fòrum +label_board_new: Fòrum nou +label_board_plural: Fòrums +label_topic_plural: Temes +label_message_plural: Missatges +label_message_last: Últim missatge +label_message_new: Missatge nou +label_message_posted: Missatge afegit +label_reply_plural: Respostes +label_send_information: "Envia la informació del compte a l'usuari" +label_year: Any +label_month: Mes +label_week: Setmana +label_date_from: Des de +label_date_to: A +label_language_based: "Basat en l'idioma de l'usuari" +label_sort_by: Ordena per %s +label_send_test_email: Envia un correu electrònic de prova +label_feeds_access_key_created_on: "Clau d'accés del RSS creada fa %s" +label_module_plural: Mòduls +label_added_time_by: Afegit per %s fa %s +label_updated_time: Actualitzat fa %s +label_jump_to_a_project: Salta al projecte... +label_file_plural: Fitxers +label_changeset_plural: Conjunt de canvis +label_default_columns: Columnes predeterminades +label_no_change_option: (sense canvis) +label_bulk_edit_selected_issues: Edita en bloc els assumptes seleccionats +label_theme: Tema +label_default: Predeterminat +label_search_titles_only: Cerca només en els títols +label_user_mail_option_all: "Per qualsevol esdeveniment en tots els meus projectes" +label_user_mail_option_selected: "Per qualsevol esdeveniment en els projectes seleccionats..." +label_user_mail_option_none: "Només per les coses que vigilo o hi estic implicat" +label_user_mail_no_self_notified: "No vull ser notificat pels canvis que faig jo mateix" +label_registration_activation_by_email: activació del compte per correu electrònic +label_registration_manual_activation: activació del compte manual +label_registration_automatic_activation: activació del compte automàtica +label_display_per_page: 'Per pàgina: %s' +label_age: Edat +label_change_properties: Canvia les propietats +label_general: General +label_more: Més +label_scm: SCM +label_plugins: Connectors +label_ldap_authentication: Autenticació LDAP +label_downloads_abbr: Baixades +label_optional_description: Descripció opcional +label_add_another_file: Afegeix un altre fitxer +label_preferences: Preferències +label_chronological_order: En ordre cronològic +label_reverse_chronological_order: En ordre cronològic invers +label_planning: Planificació +label_incoming_emails: "Correu electrònics d'entrada" +label_generate_key: Genera una clau +label_issue_watchers: Vigilants + +button_login: Entra +button_submit: Tramet +button_save: Desa +button_check_all: Activa-ho tot +button_uncheck_all: Desactiva-ho tot +button_delete: Suprimeix +button_create: Crea +button_test: Test +button_edit: Edit +button_add: Afegeix +button_change: Canvia +button_apply: Aplica +button_clear: Neteja +button_lock: Bloca +button_unlock: Desbloca +button_download: Baixa +button_list: Llista +button_view: Visualitza +button_move: Mou +button_back: Enrere +button_cancel: Cancel·la +button_activate: Activa +button_sort: Ordena +button_log_time: "Hora d'entrada" +button_rollback: Torna a aquesta versió +button_watch: Vigila +button_unwatch: No vigilis +button_reply: Resposta +button_archive: Arxiva +button_unarchive: Desarxiva +button_reset: Reinicia +button_rename: Reanomena +button_change_password: Canvia la contrasenya +button_copy: Copia +button_annotate: Anota +button_update: Actualitza +button_configure: Configura + +status_active: actiu +status_registered: informat +status_locked: bloquejat + +text_select_mail_notifications: "Seleccioneu les accions per les quals s'hauria d'enviar una notificació per correu electrònic." +text_regexp_info: ex. ^[A-Z0-9]+$ +text_min_max_length_info: 0 significa sense restricció +text_project_destroy_confirmation: Segur que voleu suprimir aquest projecte i les dades relacionades? +text_subprojects_destroy_warning: "També seran suprimits els seus subprojectes: %s." +text_workflow_edit: Seleccioneu un rol i un seguidor per a editar el flux de treball +text_are_you_sure: Segur? +text_journal_changed: canviat des de %s a %s +text_journal_set_to: establert a %s +text_journal_deleted: suprimit +text_tip_task_begin_day: "tasca que s'inicia aquest dia" +text_tip_task_end_day: tasca que finalitza aquest dia +text_tip_task_begin_end_day: "tasca que s'inicia i finalitza aquest dia" +text_project_identifier_info: "Es permeten lletres en minúscules (a-z), números i guions.
Un cop desat, l'identificador no es pot modificar." +text_caracters_maximum: %d caràcters com a màxim. +text_caracters_minimum: Com a mínim ha de tenir %d caràcters. +text_length_between: Longitud entre %d i %d caràcters. +text_tracker_no_workflow: "No s'ha definit cap flux de treball per a aquest seguidor" +text_unallowed_characters: Caràcters no permesos +text_comma_separated: Es permeten valors múltiples (separats per una coma). +text_issues_ref_in_commit_messages: Referència i soluciona els assumptes en els missatges publicats +text_issue_added: "L'assumpte %s ha sigut informat per %s." +text_issue_updated: "L'assumpte %s ha sigut actualitzat per %s." +text_wiki_destroy_confirmation: Segur que voleu suprimir aquest wiki i tots els seus continguts? +text_issue_category_destroy_question: Alguns assumptes (%d) estan assignats a aquesta categoria. Què voleu fer? +text_issue_category_destroy_assignments: Suprimeix les assignacions de la categoria +text_issue_category_reassign_to: Torna a assignar els assumptes a aquesta categoria +text_user_mail_option: "Per als projectes no seleccionats, només rebreu notificacions sobre les coses que vigileu o que hi esteu implicat (ex. assumptes que en sou l'autor o hi esteu assignat)." +text_no_configuration_data: "Encara no s'han configurat els rols, seguidors, estats de l'assumpte i flux de treball.\nÉs altament recomanable que carregueu la configuració predeterminada. Podreu modificar-la un cop carregada." +text_load_default_configuration: Carrega la configuració predeterminada +text_status_changed_by_changeset: Aplicat en el conjunt de canvis %s. +text_issues_destroy_confirmation: "Segur que voleu suprimir els assumptes seleccionats?" +text_select_project_modules: "Seleccioneu els mòduls a habilitar per a aquest projecte:" +text_default_administrator_account_changed: "S'ha canviat el compte d'administrador predeterminat" +text_file_repository_writable: Es pot escriure en el dipòsit de fitxers +text_rmagick_available: RMagick disponible (opcional) +text_destroy_time_entries_question: "S'han informat %.02f hores en els assumptes que aneu a suprimir. Què voleu fer?" +text_destroy_time_entries: Suprimeix les hores informades +text_assign_time_entries_to_project: Assigna les hores informades al projecte +text_reassign_time_entries: 'Torna a assignar les hores informades a aquest assumpte:' +text_user_wrote: '%s va escriure:' +text_enumeration_destroy_question: '%d objectes estan assignats a aquest valor.' +text_enumeration_category_reassign_to: 'Torna a assignar-los a aquest valor:' +text_email_delivery_not_configured: "El lliurament per correu electrònic no està configurat i les notificacions estan inhabilitades.\nConfigureu el servidor SMTP a config/email.yml i reinicieu l'aplicació per habilitar-lo." + +default_role_manager: Gestor +default_role_developper: Desenvolupador +default_role_reporter: Informador +default_tracker_bug: Error +default_tracker_feature: Característica +default_tracker_support: Suport +default_issue_status_new: Nou +default_issue_status_assigned: Assignat +default_issue_status_resolved: Resolt +default_issue_status_feedback: Comentaris +default_issue_status_closed: Tancat +default_issue_status_rejected: Rebutjat +default_doc_category_user: "Documentació d'usuari" +default_doc_category_tech: Documentació tècnica +default_priority_low: Baixa +default_priority_normal: Normal +default_priority_high: Alta +default_priority_urgent: Urgent +default_priority_immediate: Immediata +default_activity_design: Disseny +default_activity_development: Desenvolupament + +enumeration_issue_priorities: Prioritat dels assumptes +enumeration_doc_categories: Categories del document +enumeration_activities: Activitats (seguidor de temps) +button_quote: Quote +setting_sequential_project_identifiers: Generate sequential project identifiers +notice_unable_delete_version: Unable to delete version. +field_comments: Comment +setting_commit_logs_encoding: Commit messages encoding +label_renamed: renamed +label_copied: copied diff --git a/lang/cs.yml b/lang/cs.yml index 67cfba0..51486ae 100644 --- a/lang/cs.yml +++ b/lang/cs.yml @@ -643,3 +643,5 @@ setting_commit_logs_encoding: Commit messages encoding button_quote: Quote setting_sequential_project_identifiers: Generate sequential project identifiers notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/da.yml b/lang/da.yml index ce8b850..2461d58 100644 --- a/lang/da.yml +++ b/lang/da.yml @@ -640,3 +640,5 @@ setting_commit_logs_encoding: Commit messages encoding button_quote: Quote setting_sequential_project_identifiers: Generate sequential project identifiers notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/de.yml b/lang/de.yml index dd1b74b..7ee1425 100644 --- a/lang/de.yml +++ b/lang/de.yml @@ -639,3 +639,5 @@ setting_commit_logs_encoding: Commit messages encoding button_quote: Quote setting_sequential_project_identifiers: Generate sequential project identifiers notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/en.yml b/lang/en.yml index 7e8ba9f..5ad1e55 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -405,6 +405,8 @@ label_revision_plural: Revisions label_associated_revisions: Associated revisions label_added: added label_modified: modified +label_copied: copied +label_renamed: renamed label_deleted: deleted label_latest_revision: Latest revision label_latest_revision_plural: Latest revisions diff --git a/lang/es.yml b/lang/es.yml index d8f5417..320a169 100644 --- a/lang/es.yml +++ b/lang/es.yml @@ -641,3 +641,5 @@ setting_commit_logs_encoding: Codificación de los mensajes de commit button_quote: Quote setting_sequential_project_identifiers: Generate sequential project identifiers notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/fi.yml b/lang/fi.yml index b63802e..1953fdf 100644 --- a/lang/fi.yml +++ b/lang/fi.yml @@ -638,3 +638,5 @@ button_quote: Quote setting_sequential_project_identifiers: Generate sequential project identifiers setting_commit_logs_encoding: Commit messages encoding notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/fr.yml b/lang/fr.yml index 872266e..eb52d5a 100644 --- a/lang/fr.yml +++ b/lang/fr.yml @@ -404,6 +404,8 @@ label_revision_plural: Révisions label_associated_revisions: Révisions associées label_added: ajouté label_modified: modifié +label_copied: copié +label_renamed: renommé label_deleted: supprimé label_latest_revision: Dernière révision label_latest_revision_plural: Dernières révisions diff --git a/lang/he.yml b/lang/he.yml index 8cd68c1..7a6c62e 100644 --- a/lang/he.yml +++ b/lang/he.yml @@ -638,3 +638,5 @@ setting_commit_logs_encoding: Commit messages encoding button_quote: Quote setting_sequential_project_identifiers: Generate sequential project identifiers notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/hu.yml b/lang/hu.yml index 2f177d4..2b1f3c3 100644 --- a/lang/hu.yml +++ b/lang/hu.yml @@ -638,4 +638,6 @@ label_issue_watchers: Megfigyelők setting_commit_logs_encoding: Commit üzenetek kódlapja button_quote: Idézet setting_sequential_project_identifiers: Szekvenciális projekt azonosítók generálása -notice_unable_delete_version: Unable to delete version +notice_unable_delete_version: A verziót nem lehet törölni +label_renamed: renamed +label_copied: copied diff --git a/lang/it.yml b/lang/it.yml index 5507e6b..2591358 100644 --- a/lang/it.yml +++ b/lang/it.yml @@ -638,3 +638,5 @@ setting_commit_logs_encoding: Commit messages encoding button_quote: Quote setting_sequential_project_identifiers: Generate sequential project identifiers notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/ja.yml b/lang/ja.yml index c9470f9..c38c2ef 100644 --- a/lang/ja.yml +++ b/lang/ja.yml @@ -639,3 +639,5 @@ setting_commit_logs_encoding: Commit messages encoding button_quote: Quote setting_sequential_project_identifiers: Generate sequential project identifiers notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/ko.yml b/lang/ko.yml index 38b5a48..27adf16 100644 --- a/lang/ko.yml +++ b/lang/ko.yml @@ -638,3 +638,5 @@ setting_commit_logs_encoding: Commit messages encoding button_quote: Quote setting_sequential_project_identifiers: Generate sequential project identifiers notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/lt.yml b/lang/lt.yml index 7c62bf1..d9d1933 100644 --- a/lang/lt.yml +++ b/lang/lt.yml @@ -640,3 +640,5 @@ setting_commit_logs_encoding: Commit pranėšimų koduotė setting_sequential_project_identifiers: Generate sequential project identifiers button_quote: Quote notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/nl.yml b/lang/nl.yml index e8cab52..746f242 100644 --- a/lang/nl.yml +++ b/lang/nl.yml @@ -639,3 +639,5 @@ setting_commit_logs_encoding: Commit messages encoding button_quote: Quote setting_sequential_project_identifiers: Generate sequential project identifiers notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/no.yml b/lang/no.yml index ce47413..2b78826 100644 --- a/lang/no.yml +++ b/lang/no.yml @@ -639,3 +639,5 @@ setting_commit_logs_encoding: Commit messages encoding button_quote: Quote setting_sequential_project_identifiers: Generate sequential project identifiers notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/pl.yml b/lang/pl.yml index 05ff1af..6bdac48 100644 --- a/lang/pl.yml +++ b/lang/pl.yml @@ -638,3 +638,5 @@ setting_commit_logs_encoding: Commit messages encoding button_quote: Quote setting_sequential_project_identifiers: Generate sequential project identifiers notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/pt-br.yml b/lang/pt-br.yml index c40c87a..a4bbefe 100644 --- a/lang/pt-br.yml +++ b/lang/pt-br.yml @@ -639,3 +639,5 @@ enumeration_issue_priorities: Prioridade das tarefas enumeration_doc_categories: Categorias de documento enumeration_activities: Atividades (time tracking) notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/pt.yml b/lang/pt.yml index 37e9ad6..98cde78 100644 --- a/lang/pt.yml +++ b/lang/pt.yml @@ -638,3 +638,5 @@ setting_commit_logs_encoding: Commit messages encoding button_quote: Quote setting_sequential_project_identifiers: Generate sequential project identifiers notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/ro.yml b/lang/ro.yml index ebf1c0a..855662c 100644 --- a/lang/ro.yml +++ b/lang/ro.yml @@ -638,3 +638,5 @@ setting_commit_logs_encoding: Commit messages encoding button_quote: Quote setting_sequential_project_identifiers: Generate sequential project identifiers notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/ru.yml b/lang/ru.yml index e522e1c..9ef1871 100644 --- a/lang/ru.yml +++ b/lang/ru.yml @@ -31,10 +31,10 @@ activerecord_error_accepted: необходимо принять activerecord_error_blank: необходимо заполнить activerecord_error_circular_dependency: Такая связь приведет к циклической зависимости activerecord_error_confirmation: ошибка в подтверждении -activerecord_error_empty: необходимо заполнить -activerecord_error_exclusion: зарезервировано +activerecord_error_empty: необходимо заполнить +activerecord_error_exclusion: зарезервировано activerecord_error_greater_than_start_date: должна быть позднее даты начала -activerecord_error_inclusion: нет в списке +activerecord_error_inclusion: нет в списке activerecord_error_invalid: неверное значение activerecord_error_not_a_date: дата недействительна activerecord_error_not_a_number: не является числом @@ -76,7 +76,7 @@ button_sort: Сортировать button_submit: Принять button_test: Проверить button_unarchive: Разархивировать -button_uncheck_all: Очистить +button_uncheck_all: Очистить button_unlock: Разблокировать button_unwatch: Не следить button_update: Обновить @@ -85,13 +85,13 @@ button_watch: Следить default_activity_design: Проектирование default_activity_development: Разработка -default_doc_category_tech: Техническая документация +default_doc_category_tech: Техническая документация default_doc_category_user: Документация пользователя default_issue_status_assigned: Назначен default_issue_status_closed: Закрыт -default_issue_status_feedback: Обратная связь +default_issue_status_feedback: Обратная связь default_issue_status_new: Новый -default_issue_status_rejected: Отказ +default_issue_status_rejected: Отказ default_issue_status_resolved: Заблокирован default_priority_high: Высокий default_priority_immediate: Немедленный @@ -113,7 +113,7 @@ error_can_t_load_default_data: "Конфигурация по умолчанию error_issue_not_found_in_project: Задача не была найдена или не прикреплена к этому проекту error_scm_annotate: "Данные отсутствуют или не могут быть подписаны." error_scm_command_failed: "Ошибка доступа к хранилищу: %s" -error_scm_not_found: Хранилилище не содержит записи и/или исправления. +error_scm_not_found: Хранилище не содержит записи и/или исправления. field_account: Учетная запись field_activity: Деятельность @@ -132,7 +132,7 @@ field_column_names: Колонки field_comments_sorting: Отображение комментариев field_comments: Комментарий field_created_on: Создан -field_default_value: Значение по умолчанию +field_default_value: Значение по умолчанию field_delay: Отложить field_description: Описание field_done_ratio: Готовность в %% @@ -173,17 +173,17 @@ field_new_password: Новый пароль field_notes: Примечания field_onthefly: Создание пользователя на лету field_parent_title: Родительская страница -field_parent: Родительский проект +field_parent: Родительский проект field_password_confirmation: Подтверждение field_password: Пароль field_port: Порт -field_possible_values: Возможные значения +field_possible_values: Возможные значения field_priority: Приоритет field_project: Проект field_redirect_existing_links: Перенаправить существующие ссылки field_regexp: Регулярное выражение field_role: Роль -field_searchable: Доступно для поиска +field_searchable: Доступно для поиска field_spent_on: Дата field_start_date: Начало field_start_page: Стартовая страница @@ -212,7 +212,7 @@ general_fmt_age_plural5: %d гг. general_fmt_age_plural: %d лет general_fmt_date: %%d.%%m.%%Y general_fmt_datetime: %%d.%%m.%%Y %%I:%%M %%p -general_fmt_datetime_short: %%d %%b, %%H:%%M +general_fmt_datetime_short: %%d %%b, %%H:%%M general_fmt_time: %%H:%%M general_lang_name: 'Russian (Русский)' general_pdf_encoding: UTF-8 @@ -228,11 +228,11 @@ gui_validation_error_plural: %d ошибок label_activity: Активность label_add_another_file: Добавить ещё один файл -label_added_time_by: Добавлено %s %s назад +label_added_time_by: Добавил(а) %s %s назад label_added: добавлено label_add_note: Добавить замечание label_administration: Администрирование -label_age: Возраст +label_age: Возраст label_ago: дней(я) назад label_all_time: всё время label_all_words: Все слова @@ -251,8 +251,8 @@ label_authentication: Аутентификация label_auth_source_new: Новый режим аутентификации label_auth_source_plural: Режимы аутентификации label_auth_source: Режим аутентификации -label_blocked_by: заблокировано -label_blocks: блокирует +label_blocked_by: заблокировано +label_blocks: блокирует label_board_new: Новый форум label_board_plural: Форумы label_board: Форум @@ -266,10 +266,10 @@ label_change_log: Журнал изменений label_change_plural: Правки label_change_properties: Изменить свойства label_changes_details: Подробности по всем изменениям -label_changeset_plural: Наборы изменений +label_changeset_plural: Хранилище label_change_status: Изменить статус label_change_view_all: Просмотреть все изменения -label_chronological_order: В хронологическом порядке +label_chronological_order: В хронологическом порядке label_closed_issues_plural2: закрыто label_closed_issues_plural5: закрыто label_closed_issues_plural: закрыто @@ -285,7 +285,7 @@ label_commits_per_author: Изменений на пользователя label_commits_per_month: Изменений в месяц label_confirmation: Подтверждение label_contains: содержит -label_copy_workflow_from: Скопировать последовательность действий из +label_copy_workflow_from: Скопировать последовательность действий из label_current_status: Текущий статус label_current_version: Текущая версия label_custom_field_new: Новое настраиваемое поле @@ -363,7 +363,7 @@ label_issue_status: Статус задачи label_issue_tracking: Ситуация по задачам label_issue_updated: Задача обновлена label_issue_view_all: Просмотреть все задачи -label_issue_watchers: Следящие +label_issue_watchers: Наблюдатели label_issue: Задача label_jump_to_a_project: Перейти к проекту... label_language_based: На основе языка @@ -379,7 +379,7 @@ label_last_week: последняя неделю label_latest_revision_plural: Последние редакции label_latest_revision: Последняя редакция label_ldap_authentication: Авторизация с помощью LDAP -label_less_than_ago: менее, чем дней(я) назад +label_less_than_ago: менее, чем дней(я) назад label_list: Список label_loading: Загрузка... label_logged_as: Вошел как @@ -396,14 +396,14 @@ label_message_posted: Сообщение добавлено label_me: мне label_min_max_length: Минимальная - максимальная длина label_modification: %d изменение -label_modification_plural2: %d изменений +label_modification_plural2: %d изменения label_modification_plural5: %d изменений label_modification_plural: %d изменений label_modified: изменено label_module_plural: Модули label_months_from: месяцев(ца) с label_month: Месяц -label_more_than_ago: более, чем дней(я) назад +label_more_than_ago: более, чем дней(я) назад label_more: Больше label_my_account: Моя учетная запись label_my_page: Моя страница @@ -420,7 +420,7 @@ label_next: Следующий label_nobody: никто label_no_change_option: (Нет изменений) label_no_data: Нет данных для отображения -label_none: отсутствует +label_none: отсутствует label_not_contains: не содержит label_not_equals: не соответствует label_on: 'из' @@ -432,7 +432,7 @@ label_optional_description: Описание (опционально) label_options: Опции label_overall_activity: Сводная активность label_overview: Просмотр -label_password_lost: Восстановление пароля +label_password_lost: Восстановление пароля label_permissions_report: Отчет о правах доступа label_permissions: Права доступа label_per_page: На страницу @@ -456,7 +456,7 @@ label_query_new: Новый запрос label_query_plural: Сохраненные запросы label_query: Сохраненный запрос label_read: Чтение... -label_registered_on: Зарегистрирован(а) +label_registered_on: Зарегистрирован(а) label_register: Регистрация label_registration_activation_by_email: активация учетных записей по email label_registration_automatic_activation: автоматическая активация учетных записей @@ -475,7 +475,7 @@ label_result_plural: Результаты label_reverse_chronological_order: В обратном порядке label_revision_plural: Редакции label_revision: Редакция -label_roadmap_due_in: Вовремя +label_roadmap_due_in: Вовремя label_roadmap_no_issues: Нет задач для данной версии label_roadmap_overdue: %s опоздание label_roadmap: Оперативный план @@ -499,7 +499,7 @@ label_spent_time: Затраченное время label_start_to_end: с начала к концу label_start_to_start: с начала к началу label_statistics: Статистика -label_stay_logged_in: Оставаться в системе +label_stay_logged_in: Оставаться в системе label_string: Текст label_subproject_plural: Подпроекты label_text: Длинный текст @@ -529,7 +529,7 @@ label_version_plural: Версии label_version: Версия label_view_diff: Просмотреть отличия label_view_revisions: Просмотреть редакции -label_watched_issues: Отслеживаемые задачи +label_watched_issues: Отслеживаемые задачи label_week: Неделя label_wiki_edit_plural: Редактирования Wiki label_wiki_edit: Редактирование Wiki @@ -545,18 +545,18 @@ mail_body_account_information_external: Вы можете использоват mail_body_account_information: Информация о Вашей учетной записи mail_body_lost_password: 'Для изменения пароля зайдите по следующей ссылке:' mail_body_register: 'Для активации учетной записи зайдите по следующей ссылке:' -mail_body_reminder: "%d назначенных на вас задач на следующие %d дней:" +mail_body_reminder: "%d назначенных на Вас задач на следующие %d дней:" mail_subject_account_activation_request: Запрос на активацию пользователя в системе %s mail_subject_lost_password: Ваш %s пароль mail_subject_register: Активация учетной записи %s -mail_subject_reminder: "%d назначенных на вас задач в ближайшие дни" +mail_subject_reminder: "%d назначенных на Вас задач в ближайшие дни" notice_account_activated: Ваша учетная запись активирована. Вы можете войти. notice_account_invalid_creditentials: Неправильное имя пользователя или пароль notice_account_lost_email_sent: Вам отправлено письмо с инструкциями по выбору нового пароля. notice_account_password_updated: Пароль успешно обновлен. -notice_account_pending: "Ваша учетная запись уже создан и ожидает подтверждения администратора." -notice_account_register_done: Учетная запись успешно создана. Для активации Вашей учетной записи зайдите по ссылке, которая выслана вам по электронной почте. +notice_account_pending: "Ваша учетная запись уже создана и ожидает подтверждения администратора." +notice_account_register_done: Учетная запись успешно создана. Для активации Вашей учетной записи зайдите по ссылке, которая выслана Вам по электронной почте. notice_account_unknown_email: Неизвестный пользователь. notice_account_updated: Учетная запись успешно обновлена. notice_account_wrong_password: Неверный пароль @@ -569,14 +569,14 @@ notice_feeds_access_key_reseted: Ваш ключ доступа RSS был пе notice_file_not_found: Страница, на которую Вы пытаетесь зайти, не существует или удалена. notice_locking_conflict: Информация обновлена другим пользователем. notice_no_issue_selected: "Не выбрано ни одной задачи! Пожалуйста, отметьте задачи, которые Вы хотите отредактировать." -notice_not_authorized: У вас нет прав для посещения данной страницы. +notice_not_authorized: У Вас нет прав для посещения данной страницы. notice_successful_connection: Подключение успешно установлено. notice_successful_create: Создание успешно завершено. notice_successful_delete: Удаление успешно завершено. notice_successful_update: Обновление успешно завершено. notice_unable_delete_version: Невозможно удалить версию. -project_module_boards: Форумы +project_module_boards: Форумы project_module_documents: Документы project_module_files: Файлы project_module_issue_tracking: Задачи @@ -586,14 +586,14 @@ project_module_time_tracking: Учет времени project_module_wiki: Wiki setting_activity_days_default: Количество дней, отображаемых в Активности -setting_app_subtitle: Подзаголовок приложения +setting_app_subtitle: Подзаголовок приложения setting_app_title: Название приложения setting_attachment_max_size: Максимальный размер вложения setting_autofetch_changesets: Автоматически следить за изменениями хранилища setting_autologin: Автоматический вход setting_bcc_recipients: Использовать скрытые списки (bcc) setting_commit_fix_keywords: Назначение ключевых слов -setting_commit_logs_encoding: Кодировка добавляемых сообщений +setting_commit_logs_encoding: Кодировка комментариев в хранилище setting_commit_ref_keywords: Ключевые слова для поиска setting_cross_project_issue_relations: Разрешить пересечение задач по проектам setting_date_format: Формат даты @@ -617,15 +617,15 @@ setting_self_registration: Возможна саморегистрация setting_sequential_project_identifiers: Генерировать последовательные идентификаторы проектов setting_sys_api_enabled: Разрешить WS для управления хранилищем setting_text_formatting: Форматирование текста -setting_time_format: Формат времени +setting_time_format: Формат времени setting_user_format: Формат отображения имени setting_welcome_text: Текст приветствия setting_wiki_compression: Сжатие истории Wiki status_active: активен status_locked: закрыт - status_registered: зарегистрирован + text_are_you_sure: Подтвердите text_assign_time_entries_to_project: Прикрепить зарегистрированное время к проекту text_caracters_maximum: Максимум %d символов(а). @@ -640,7 +640,7 @@ text_enumeration_destroy_question: '%d объект(а,ов) связаны с text_file_repository_writable: Хранилище с доступом на запись text_issue_added: По задаче %s был создан отчет (%s). text_issue_category_destroy_assignments: Удалить назначения категории -text_issue_category_destroy_question: Несколько задач (%d) назначено в данную категорию. Что вы хотите предпринять? +text_issue_category_destroy_question: Несколько задач (%d) назначено в данную категорию. Что Вы хотите предпринять? text_issue_category_reassign_to: Переназначить задачи для данной категории text_issues_destroy_confirmation: 'Вы уверены, что хотите удалить выбранные задачи?' text_issues_ref_in_commit_messages: Сопоставление и изменение статуса задач исходя из текста сообщений @@ -666,7 +666,9 @@ text_tip_task_begin_end_day: начало задачи и окончание е text_tip_task_end_day: дата завершения задачи text_tracker_no_workflow: Для этого трекера последовательность действий не определена text_unallowed_characters: Запрещенные символы -text_user_mail_option: "Для невыбранных проектов, Вы будете получать уведомления только о том что просматриваете или в чем участвуете (например, вопросы автором которых вы являетесь или которые вам назначены)." +text_user_mail_option: "Для невыбранных проектов, Вы будете получать уведомления только о том что просматриваете или в чем участвуете (например, вопросы, автором которых Вы являетесь или которые Вам назначены)." text_user_wrote: '%s написал(а):' -text_wiki_destroy_confirmation: Вы уверены, что хотите удалить данную вики и все содержимое? +text_wiki_destroy_confirmation: Вы уверены, что хотите удалить данную Wiki и все содержимое? text_workflow_edit: Выберите роль и трекер для редактирования последовательности состояний +label_renamed: renamed +label_copied: copied diff --git a/lang/sr.yml b/lang/sr.yml index f7ddfd7..574470e 100644 --- a/lang/sr.yml +++ b/lang/sr.yml @@ -639,3 +639,5 @@ setting_commit_logs_encoding: Commit messages encoding button_quote: Quote setting_sequential_project_identifiers: Generate sequential project identifiers notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/sv.yml b/lang/sv.yml index b4e621c..1e7d292 100644 --- a/lang/sv.yml +++ b/lang/sv.yml @@ -639,3 +639,5 @@ setting_commit_logs_encoding: Commit messages encoding button_quote: Quote setting_sequential_project_identifiers: Generate sequential project identifiers notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/th.yml b/lang/th.yml index e2d8a0a..0ad6b9b 100644 --- a/lang/th.yml +++ b/lang/th.yml @@ -641,3 +641,5 @@ setting_commit_logs_encoding: Commit messages encoding button_quote: Quote setting_sequential_project_identifiers: Generate sequential project identifiers notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/tr.yml b/lang/tr.yml index 9fb5b63..7cb2a9e 100644 --- a/lang/tr.yml +++ b/lang/tr.yml @@ -639,3 +639,5 @@ setting_mail_handler_api_key: API key setting_commit_logs_encoding: Commit messages encoding general_csv_decimal_separator: '.' notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/uk.yml b/lang/uk.yml index 8e8541f..055d27e 100644 --- a/lang/uk.yml +++ b/lang/uk.yml @@ -640,3 +640,5 @@ setting_commit_logs_encoding: Commit messages encoding button_quote: Quote setting_sequential_project_identifiers: Generate sequential project identifiers notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/zh-tw.yml b/lang/zh-tw.yml index b547786..a7a7767 100644 --- a/lang/zh-tw.yml +++ b/lang/zh-tw.yml @@ -77,6 +77,7 @@ notice_failed_to_save_issues: " %d 個項目儲存失敗 (總共選取 %d 個項 notice_no_issue_selected: "未選擇任何項目!請勾選您想要編輯的項目。" notice_account_pending: "您的帳號已經建立,正在等待管理員的審核。" notice_default_data_loaded: 預設組態已載入成功。 +notice_unable_delete_version: 無法刪除版本。 error_can_t_load_default_data: "無法載入預設組態: %s" error_scm_not_found: SCM 儲存庫中找不到這個專案或版本。 @@ -638,4 +639,5 @@ default_activity_development: 開發 enumeration_issue_priorities: 項目優先權 enumeration_doc_categories: 文件分類 enumeration_activities: 活動 (時間追蹤) -notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lang/zh.yml b/lang/zh.yml index d016c5a..ed84eeb 100644 --- a/lang/zh.yml +++ b/lang/zh.yml @@ -77,6 +77,7 @@ notice_failed_to_save_issues: "%d 个问题保存失败(共选择 %d 个问题 notice_no_issue_selected: "未选择任何问题!请选择您要编辑的问题。" notice_account_pending: "您的帐号已被成功创建,正在等待管理员的审核。" notice_default_data_loaded: 成功载入默认设置。 +notice_unable_delete_version: 无法删除版本 error_can_t_load_default_data: "无法载入默认设置:%s" error_scm_not_found: "版本库中不存在该条目和(或)其修订版本。" @@ -219,6 +220,7 @@ setting_display_subprojects_issues: 在项目页面上默认显示子项目的 setting_enabled_scm: 启用 SCM setting_mail_handler_api_enabled: 启用用于接收邮件的Web Service setting_mail_handler_api_key: API key +setting_sequential_project_identifiers: 顺序产生项目标识 project_module_issue_tracking: 问题跟踪 project_module_time_tracking: 时间跟踪 @@ -561,6 +563,7 @@ button_copy: 复制 button_annotate: 追溯 button_update: 更新 button_configure: 配置 +button_quote: 引用 status_active: 活动的 status_registered: 已注册 @@ -636,6 +639,5 @@ default_activity_development: 开发 enumeration_issue_priorities: 问题优先级 enumeration_doc_categories: 文档类别 enumeration_activities: 活动(时间跟踪) -button_quote: Quote -setting_sequential_project_identifiers: Generate sequential project identifiers -notice_unable_delete_version: Unable to delete version +label_renamed: renamed +label_copied: copied diff --git a/lib/redcloth3.rb b/lib/redcloth3.rb index b2e4435..a5e6326 100644 --- a/lib/redcloth3.rb +++ b/lib/redcloth3.rb @@ -788,10 +788,10 @@ class RedCloth3 < String ": ([\w\/]\S+?) # $url (\/)? # $slash - ([^\w\/;]*?) # $post + ([^\w\=\/;\(\)]*?) # $post (?=<|\s|$) /x - +#" def inline_textile_link( text ) text.gsub!( LINK_RE ) do |m| pre,atts,text,title,url,slash,post = $~[1..7] @@ -799,6 +799,12 @@ class RedCloth3 < String url, url_title = check_refs( url ) title ||= url_title + # Idea below : an URL with unbalanced parethesis and + # ending by ')' is put into external parenthesis + if ( url[-1]==?) and ((url.count("(") - url.count(")")) < 0 ) ) + url=url[0..-2] # discard closing parenth from url + post = ")"+post # add closing parenth to post + end atts = pba( atts ) atts = " href=\"#{ url }#{ slash }\"#{ atts }" atts << " title=\"#{ title }\"" if title diff --git a/lib/redmine/wiki_formatting.rb b/lib/redmine/wiki_formatting.rb index 649edfe..7dffff4 100644 --- a/lib/redmine/wiki_formatting.rb +++ b/lib/redmine/wiki_formatting.rb @@ -144,7 +144,7 @@ module Redmine (\S+?) # url (\/)? # slash ) - ([^\w\=\/;]*?) # post + ([^\w\=\/;\(\)]*?) # post (?=<|\s|$) }x unless const_defined?(:AUTO_LINK_RE) @@ -156,7 +156,13 @@ module Redmine # don't replace URL's that are already linked # and URL's prefixed with ! !> !< != (textile images) all - else + else + # Idea below : an URL with unbalanced parethesis and + # ending by ')' is put into external parenthesis + if ( url[-1]==?) and ((url.count("(") - url.count(")")) < 0 ) ) + url=url[0..-2] # discard closing parenth from url + post = ")"+post # add closing parenth to post + end %(#{leading}#{proto + url}#{post}) end end diff --git a/public/images/bullet_add.png b/public/images/bullet_add.png new file mode 100644 index 0000000000000000000000000000000000000000..41ff8335b06be000bc6912c2bbd9d3c572c8a9da GIT binary patch literal 286 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 literal 0 Hc$@p@N{tuu{izq(ta+-M44kBpIe=q zx`X8@9}gS%(w5FYFVig+ojZ_cD5YzW==f41NB?BP0gvSsuL~|cX5(?+BsuSEuz#(i z(0!iz2et`~ZLD6*`-~P&eW1fC)8o%D^YrBE+t1g1f3V_>QFkv3+p8U`|6X{$=uzRE zYb8;$Jas}77I1~H-7TjsdDijKvCOxpB#s?yRPsxju2(W^mhtCPasN(mSRK@VvcWVc q!c)dr)HS~K;xqxD$MKK)8^oXLysE8u-|YeP1B0ilpUXO@geCyg%6BgS literal 0 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 +// Encoding: any +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("Diumenge", + "Dilluns", + "Dimarts", + "Dimecres", + "Dijous", + "Divendres", + "Dissabte", + "Diumenge"); + +// Please note that the following array of short day names (and the same goes +// for short month names, _SMN) isn't absolutely necessary. We give it here +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("dg", + "dl", + "dt", + "dc", + "dj", + "dv", + "ds", + "dg"); + +// First day of the week. "0" means display Sunday first, "1" means display +// Monday first, etc. +Calendar._FD = 0; + +// full month names +Calendar._MN = new Array +("Gener", + "Febrer", + "Març", + "Abril", + "Maig", + "Juny", + "Juliol", + "Agost", + "Setembre", + "Octubre", + "Novembre", + "Desembre"); + +// short month names +Calendar._SMN = new Array +("Gen", + "Feb", + "Mar", + "Abr", + "Mai", + "Jun", + "Jul", + "Ago", + "Set", + "Oct", + "Nov", + "Des"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "Quant al calendari"; + +Calendar._TT["ABOUT"] = +"Selector DHTML de data/hora\n" + +"(c) dynarch.com 2002-2005 / Autor: Mihai Bazon\n" + // don't translate this this ;-) +"Per a aconseguir l'última versió visiteu: http://www.dynarch.com/projects/calendar/\n" + +"Distribuït sota la llicència GNU LGPL. Vegeu http://gnu.org/licenses/lgpl.html per a més detalls." + +"\n\n" + +"Selecció de la data:\n" + +"- Utilitzeu els botons \xab, \xbb per a seleccionar l'any\n" + +"- Utilitzeu els botons " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " per a selecciona el mes\n" + +"- Mantingueu premut el botó del ratolí sobre qualsevol d'aquests botons per a uns selecció més ràpida."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Selecció de l'hora:\n" + +"- Feu clic en qualsevol part de l'hora per a incrementar-la\n" + +"- o premeu majúscules per a disminuir-la\n" + +"- o feu clic i arrossegueu per a una selecció més ràpida."; + +Calendar._TT["PREV_YEAR"] = "Any anterior (mantenir per menú)"; +Calendar._TT["PREV_MONTH"] = "Mes anterior (mantenir per menú)"; +Calendar._TT["GO_TODAY"] = "Anar a avui"; +Calendar._TT["NEXT_MONTH"] = "Mes següent (mantenir per menú)"; +Calendar._TT["NEXT_YEAR"] = "Any següent (mantenir per menú)"; +Calendar._TT["SEL_DATE"] = "Sel·lecciona data"; +Calendar._TT["DRAG_TO_MOVE"] = "Arrossega per a moure"; +Calendar._TT["PART_TODAY"] = " (avui)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "Primer mostra el %s"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Tanca"; +Calendar._TT["TODAY"] = "Avui"; +Calendar._TT["TIME_PART"] = "(Majúscules-)Feu clic o arrossegueu per a canviar el valor"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%d-%m-%Y"; +Calendar._TT["TT_DATE_FORMAT"] = "%A, %e de %B de %Y"; + +Calendar._TT["WK"] = "set"; +Calendar._TT["TIME"] = "Hora:"; diff --git a/public/javascripts/jstoolbar/lang/jstoolbar-ca.js b/public/javascripts/jstoolbar/lang/jstoolbar-ca.js new file mode 100644 index 0000000..3d652a4 --- /dev/null +++ b/public/javascripts/jstoolbar/lang/jstoolbar-ca.js @@ -0,0 +1,16 @@ +jsToolBar.strings = {}; +jsToolBar.strings['Strong'] = 'Negreta'; +jsToolBar.strings['Italic'] = 'Cursiva'; +jsToolBar.strings['Underline'] = 'Subratllat'; +jsToolBar.strings['Deleted'] = 'Barrat'; +jsToolBar.strings['Code'] = 'Codi en línia'; +jsToolBar.strings['Heading 1'] = 'Encapçalament 1'; +jsToolBar.strings['Heading 2'] = 'Encapçalament 2'; +jsToolBar.strings['Heading 3'] = 'Encapçalament 3'; +jsToolBar.strings['Unordered list'] = 'Llista sense ordre'; +jsToolBar.strings['Ordered list'] = 'Llista ordenada'; +jsToolBar.strings['Quote'] = 'Cometes'; +jsToolBar.strings['Unquote'] = 'Sense cometes'; +jsToolBar.strings['Preformatted text'] = 'Text formatat'; +jsToolBar.strings['Wiki link'] = 'Enllaça a una pàgina Wiki'; +jsToolBar.strings['Image'] = 'Imatge'; diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css index 643ebe7..8c41734 100644 --- a/public/stylesheets/application.css +++ b/public/stylesheets/application.css @@ -582,7 +582,6 @@ vertical-align: middle; .icon-mypage { background-image: url(../images/user_page.png); } .icon-admin { background-image: url(../images/admin.png); } .icon-projects { background-image: url(../images/projects.png); } -.icon-logout { background-image: url(../images/logout.png); } .icon-help { background-image: url(../images/help.png); } .icon-attachment { background-image: url(../images/attachment.png); } .icon-index { background-image: url(../images/index.png); } diff --git a/public/stylesheets/jstoolbar.css b/public/stylesheets/jstoolbar.css index 4e9d44b..9514e3e 100644 --- a/public/stylesheets/jstoolbar.css +++ b/public/stylesheets/jstoolbar.css @@ -60,15 +60,9 @@ .jstb_del { background-image: url(../images/jstoolbar/bt_del.png); } -.jstb_quote { - background-image: url(../images/jstoolbar/bt_quote.png); -} .jstb_code { background-image: url(../images/jstoolbar/bt_code.png); } -.jstb_br { - background-image: url(../images/jstoolbar/bt_br.png); -} .jstb_h1 { background-image: url(../images/jstoolbar/bt_h1.png); } diff --git a/public/stylesheets/scm.css b/public/stylesheets/scm.css index d5a879b..ecd3193 100644 --- a/public/stylesheets/scm.css +++ b/public/stylesheets/scm.css @@ -1,4 +1,32 @@ +div.changeset-changes ul { margin: 0; padding: 0; } +div.changeset-changes ul > ul { margin-left: 18px; padding: 0; } + +li.change { + list-style-type:none; + background-image: url(../images/bullet_black.png); + background-position: 1px 1px; + background-repeat: no-repeat; + padding-top: 1px; + padding-bottom: 1px; + padding-left: 20px; + margin: 0; +} +li.change.folder { background-image: url(../images/folder_open.png); } +li.change.folder.change-A { background-image: url(../images/folder_open_add.png); } +li.change.folder.change-M { background-image: url(../images/folder_open_orange.png); } +li.change.change-A { background-image: url(../images/bullet_add.png); } +li.change.change-M { background-image: url(../images/bullet_orange.png); } +li.change.change-C { background-image: url(../images/bullet_blue.png); } +li.change.change-R { background-image: url(../images/bullet_purple.png); } +li.change.change-D { background-image: url(../images/bullet_delete.png); } + +li.change .copied-from { font-style: italic; color: #999; font-size: 0.9em; } +li.change .copied-from:before { content: " - "} + +#changes-legend { float: right; font-size: 0.8em; margin: 0; } +#changes-legend li { float: left; background-position: 5px 0; } + table.filecontent { border: 1px solid #ccc; border-collapse: collapse; width:98%; } table.filecontent th { border: 1px solid #ccc; background-color: #eee; } table.filecontent th.filename { background-color: #e4e4d4; text-align: left; padding: 0.2em;} diff --git a/test/functional/repositories_subversion_controller_test.rb b/test/functional/repositories_subversion_controller_test.rb index 8320be7..245a170 100644 --- a/test/functional/repositories_subversion_controller_test.rb +++ b/test/functional/repositories_subversion_controller_test.rb @@ -125,16 +125,18 @@ class RepositoriesSubversionControllerTest < Test::Unit::TestCase get :revision, :id => 1, :rev => 2 assert_response :success assert_template 'revision' - assert_tag :tag => 'tr', - :child => { :tag => 'td', + assert_tag :tag => 'ul', + :child => { :tag => 'li', # link to the entry at rev 2 - :child => { :tag => 'a', :attributes => {:href => 'repositories/entry/ecookbook/test/some/path/in/the/repo?rev=2'}, - :content => %r{/test/some/path/in/the/repo} } - }, - :child => { :tag => 'td', - # link to partial diff - :child => { :tag => 'a', :attributes => { :href => '/repositories/diff/ecookbook/test/some/path/in/the/repo?rev=2' } } - } + :child => { :tag => 'a', + :attributes => {:href => '/repositories/entry/ecookbook/test/some/path/in/the/repo?rev=2'}, + :content => 'repo', + # link to partial diff + :sibling => { :tag => 'a', + :attributes => { :href => '/repositories/diff/ecookbook/test/some/path/in/the/repo?rev=2' } + } + } + } end def test_revision_with_repository_pointing_to_a_subdirectory @@ -145,11 +147,18 @@ class RepositoriesSubversionControllerTest < Test::Unit::TestCase get :revision, :id => 1, :rev => 2 assert_response :success assert_template 'revision' - assert_tag :tag => 'tr', - :child => { :tag => 'td', :content => %r{/test/some/path/in/the/repo} }, - :child => { :tag => 'td', - :child => { :tag => 'a', :attributes => { :href => '/repositories/diff/ecookbook/path/in/the/repo?rev=2' } } - } + assert_tag :tag => 'ul', + :child => { :tag => 'li', + # link to the entry at rev 2 + :child => { :tag => 'a', + :attributes => {:href => '/repositories/entry/ecookbook/path/in/the/repo?rev=2'}, + :content => 'repo', + # link to partial diff + :sibling => { :tag => 'a', + :attributes => { :href => '/repositories/diff/ecookbook/path/in/the/repo?rev=2' } + } + } + } end def test_diff diff --git a/test/unit/helpers/application_helper_test.rb b/test/unit/helpers/application_helper_test.rb index 6db029a..7ef47f5 100644 --- a/test/unit/helpers/application_helper_test.rb +++ b/test/unit/helpers/application_helper_test.rb @@ -38,10 +38,18 @@ class ApplicationHelperTest < HelperTestCase 'This is a link: http://foo.bar.' => 'This is a link: http://foo.bar.', 'A link (eg. http://foo.bar).' => 'A link (eg. http://foo.bar).', 'http://foo.bar/foo.bar#foo.bar.' => 'http://foo.bar/foo.bar#foo.bar.', + 'http://www.foo.bar/Test_(foobar)' => 'http://www.foo.bar/Test_(foobar)', + '(see inline link : http://www.foo.bar/Test_(foobar))' => '(see inline link : http://www.foo.bar/Test_(foobar))', + '(see inline link : http://www.foo.bar/Test)' => '(see inline link : http://www.foo.bar/Test)', + '(see inline link : http://www.foo.bar/Test).' => '(see inline link : http://www.foo.bar/Test).', + '(see "inline link":http://www.foo.bar/Test_(foobar))' => '(see inline link)', + '(see "inline link":http://www.foo.bar/Test)' => '(see inline link)', + '(see "inline link":http://www.foo.bar/Test).' => '(see inline link).', 'www.foo.bar' => 'www.foo.bar', 'http://foo.bar/page?p=1&t=z&s=' => 'http://foo.bar/page?p=1&t=z&s=', 'http://foo.bar/page#125' => 'http://foo.bar/page#125', 'http://foo@www.bar.com' => 'http://foo@www.bar.com', + 'http://foo:bar@www.bar.com' => 'http://foo:bar@www.bar.com', 'ftp://foo.bar' => 'ftp://foo.bar', } to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text) }