##// END OF EJS Templates
r18596@gaspard (orig r1860): nbc | 2008-09-14 21:03:46 +0200...
Nicolas Chuche -
r1872:54433282d3e7
parent child
Show More
This diff has been collapsed as it changes many lines, (644 lines changed) Show them Hide them
@@ -0,0 +1,644
1 _gloc_rule_default: '|n| n==1 ? "" : "_plural" '
2
3 actionview_datehelper_select_day_prefix:
4 actionview_datehelper_select_month_names: Gener,Febrer,Març,Abril,Maig,Juny,Juliol,Agost,Setembre,Octubre,Novembre,Desembre
5 actionview_datehelper_select_month_names_abbr: Gen,Feb,Mar,Abr,Mai,Jun,Jul,Ago,Set,Oct,Nov,Dec
6 actionview_datehelper_select_month_prefix:
7 actionview_datehelper_select_year_prefix:
8 actionview_datehelper_time_in_words_day: 1 dia
9 actionview_datehelper_time_in_words_day_plural: %d dies
10 actionview_datehelper_time_in_words_hour_about: aproximadament una hora
11 actionview_datehelper_time_in_words_hour_about_plural: aproximadament %d hores
12 actionview_datehelper_time_in_words_hour_about_single: aproximadament una hora
13 actionview_datehelper_time_in_words_minute: 1 minut
14 actionview_datehelper_time_in_words_minute_half: mig minut
15 actionview_datehelper_time_in_words_minute_less_than: "menys d'un minut"
16 actionview_datehelper_time_in_words_minute_plural: %d minuts
17 actionview_datehelper_time_in_words_minute_single: 1 minut
18 actionview_datehelper_time_in_words_second_less_than: "menys d'un segon"
19 actionview_datehelper_time_in_words_second_less_than_plural: menys de %d segons
20 actionview_instancetag_blank_option: Seleccioneu
21
22 activerecord_error_inclusion: no està inclòs a la llista
23 activerecord_error_exclusion: està reservat
24 activerecord_error_invalid: no és vàlid
25 activerecord_error_confirmation: la confirmació no coincideix
26 activerecord_error_accepted: "s'ha d'acceptar"
27 activerecord_error_empty: no pot estar buit
28 activerecord_error_blank: no pot estar en blanc
29 activerecord_error_too_long: és massa llarg
30 activerecord_error_too_short: és massa curt
31 activerecord_error_wrong_length: la longitud és incorrecta
32 activerecord_error_taken: "ja s'està utilitzant"
33 activerecord_error_not_a_number: no és un número
34 activerecord_error_not_a_date: no és una data vàlida
35 activerecord_error_greater_than_start_date: ha de ser superior que la data inicial
36 activerecord_error_not_same_project: no pertany al mateix projecte
37 activerecord_error_circular_dependency: Aquesta relació crearia una dependència circular
38
39 general_fmt_age: %d any
40 general_fmt_age_plural: %d anys
41 general_fmt_date: %%d/%%m/%%Y
42 general_fmt_datetime: %%d/%%m/%%Y %%H:%%M
43 general_fmt_datetime_short: %%d/%%m %%H:%%M
44 general_fmt_time: %%H:%%M
45 general_text_No: 'No'
46 general_text_Yes: 'Si'
47 general_text_no: 'no'
48 general_text_yes: 'si'
49 general_lang_name: 'Català'
50 general_csv_separator: ';'
51 general_csv_decimal_separator: ','
52 general_csv_encoding: ISO-8859-15
53 general_pdf_encoding: ISO-8859-15
54 general_day_names: Dilluns,Dimarts,Dimecres,Dijous,Divendres,Dissabte,Diumenge
55 general_first_day_of_week: '1'
56
57 notice_account_updated: "El compte s'ha actualitzat correctament."
58 notice_account_invalid_creditentials: Usuari o contrasenya invàlid
59 notice_account_password_updated: "La contrasenya s'ha modificat correctament."
60 notice_account_wrong_password: Contrasenya incorrecta
61 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."
62 notice_account_unknown_email: Usuari desconegut.
63 notice_can_t_change_password: "Aquest compte utilitza una font d'autenticació externa. No és possible canviar la contrasenya."
64 notice_account_lost_email_sent: "S'ha enviat un correu electrònic amb instruccions per a seleccionar una contrasenya nova."
65 notice_account_activated: "El compte s'ha activat. Ara podeu entrar."
66 notice_successful_create: "S'ha creat correctament."
67 notice_successful_update: "S'ha modificat correctament."
68 notice_successful_delete: "S'ha suprimit correctament."
69 notice_successful_connection: "S'ha connectat correctament."
70 notice_file_not_found: "La pàgina a la que intenteu accedir no existeix o s'ha suprimit."
71 notice_locking_conflict: Un altre usuari ha actualitzat les dades.
72 notice_not_authorized: No teniu permís per a accedir a aquesta pàgina.
73 notice_email_sent: "S'ha enviat un correu electrònic a %s"
74 notice_email_error: "S'ha produït un error en enviar el correu (%s)"
75 notice_feeds_access_key_reseted: "S'ha reiniciat la clau d'accés del RSS."
76 notice_failed_to_save_issues: "No s'han pogut desar %s assumptes de %d seleccionats: %s."
77 notice_no_issue_selected: "No s'ha seleccionat cap assumpte. Activeu els assumptes que voleu editar."
78 notice_account_pending: "S'ha creat el compte i ara està pendent de l'aprovació de l'administrador."
79 notice_default_data_loaded: "S'ha carregat correctament la configuració predeterminada."
80
81 error_can_t_load_default_data: "No s'ha pogut carregar la configuració predeterminada: %s"
82 error_scm_not_found: "No s'ha trobat l'entrada o la revisió en el dipòsit."
83 error_scm_command_failed: "S'ha produït un error en intentar accedir al dipòsit: %s"
84 error_scm_annotate: "L'entrada no existeix o no s'ha pogut anotar."
85 error_issue_not_found_in_project: "No s'ha trobat l'assumpte o no pertany a aquest projecte"
86
87 mail_subject_lost_password: Contrasenya de %s
88 mail_body_lost_password: "Per a canviar la contrasenya, feu clic en l'enllaç següent:"
89 mail_subject_register: Activació del compte de %s
90 mail_body_register: "Per a activar el compte, feu clic en l'enllaç següent:"
91 mail_body_account_information_external: Podeu utilitzar el compte «%s» per a entrar.
92 mail_body_account_information: Informació del compte
93 mail_subject_account_activation_request: "Sol·licitud d'activació del compte de %s"
94 mail_body_account_activation_request: "S'ha registrat un usuari nou (%s). El seu compte està pendent d'aprovació:"
95 mail_subject_reminder: "%d assumptes venceran els següents %d dies"
96 mail_body_reminder: "%d assumptes que teniu assignades venceran els següents %d dies:"
97
98 gui_validation_error: 1 error
99 gui_validation_error_plural: %d errors
100
101 field_name: Nom
102 field_description: Descripció
103 field_summary: Resum
104 field_is_required: Necessari
105 field_firstname: Nom
106 field_lastname: Cognom
107 field_mail: Correu electrònic
108 field_filename: Fitxer
109 field_filesize: Mida
110 field_downloads: Baixades
111 field_author: Autor
112 field_created_on: Creat
113 field_updated_on: Actualitzat
114 field_field_format: Format
115 field_is_for_all: Per a tots els projectes
116 field_possible_values: Valores possibles
117 field_regexp: Expressió regular
118 field_min_length: Longitud mínima
119 field_max_length: Longitud màxima
120 field_value: Valor
121 field_category: Categoria
122 field_title: Títol
123 field_project: Projecte
124 field_issue: Assumpte
125 field_status: Estat
126 field_notes: Notes
127 field_is_closed: Assumpte tancat
128 field_is_default: Estat predeterminat
129 field_tracker: Seguidor
130 field_subject: Tema
131 field_due_date: Data de venciment
132 field_assigned_to: Assignat a
133 field_priority: Prioritat
134 field_fixed_version: Versió objectiu
135 field_user: Usuari
136 field_role: Rol
137 field_homepage: Pàgina web
138 field_is_public: Públic
139 field_parent: Subprojecte de
140 field_is_in_chlog: Assumptes mostrats en el registre de canvis
141 field_is_in_roadmap: Assumptes mostrats en la planificació
142 field_login: Entrada
143 field_mail_notification: Notificacions per correu electrònic
144 field_admin: Administrador
145 field_last_login_on: Última connexió
146 field_language: Idioma
147 field_effective_date: Data
148 field_password: Contrasenya
149 field_new_password: Contrasenya nova
150 field_password_confirmation: Confirmació
151 field_version: Versió
152 field_type: Tipus
153 field_host: Ordinador
154 field_port: Port
155 field_account: Compte
156 field_base_dn: Base DN
157 field_attr_login: "Atribut d'entrada"
158 field_attr_firstname: Atribut del nom
159 field_attr_lastname: Atribut del cognom
160 field_attr_mail: Atribut del correu electrònic
161 field_onthefly: "Creació de l'usuari «al vol»"
162 field_start_date: Inici
163 field_done_ratio: %% realitzat
164 field_auth_source: "Mode d'autenticació"
165 field_hide_mail: "Oculta l'adreça de correu electrònic"
166 field_comment: Comentari
167 field_url: URL
168 field_start_page: Pàgina inicial
169 field_subproject: Subprojecte
170 field_hours: Hores
171 field_activity: Activitat
172 field_spent_on: Data
173 field_identifier: Identificador
174 field_is_filter: "S'ha utilitzat com a filtre"
175 field_issue_to_id: Assumpte relacionat
176 field_delay: Retard
177 field_assignable: Es poden assignar assumptes a aquest rol
178 field_redirect_existing_links: Redirigeix els enllaços existents
179 field_estimated_hours: Temps previst
180 field_column_names: Columnes
181 field_time_zone: Zona horària
182 field_searchable: Es pot cercar
183 field_default_value: Valor predeterminat
184 field_comments_sorting: Mostra els comentaris
185 field_parent_title: Pàgina pare
186
187 setting_app_title: "Títol de l'aplicació"
188 setting_app_subtitle: "Subtítol de l'aplicació"
189 setting_welcome_text: Text de benvinguda
190 setting_default_language: Idioma predeterminat
191 setting_login_required: Es necessita autenticació
192 setting_self_registration: Registre automàtic
193 setting_attachment_max_size: Mida màxima dels adjunts
194 setting_issues_export_limit: "Límit d'exportació d'assumptes"
195 setting_mail_from: "Adreça de correu electrònic d'emissió"
196 setting_bcc_recipients: Vincula els destinataris de les còpies amb carbó (bcc)
197 setting_host_name: "Nom de l'ordinador"
198 setting_text_formatting: Format del text
199 setting_wiki_compression: "Comprimeix l'historial del wiki"
200 setting_feeds_limit: Límit de contingut del canal
201 setting_default_projects_public: Els projectes nous són públics per defecte
202 setting_autofetch_changesets: Omple automàticament les publicacions
203 setting_sys_api_enabled: Habilita el WS per a la gestió del dipòsit
204 setting_commit_ref_keywords: Paraules claus per a la referència
205 setting_commit_fix_keywords: Paraules claus per a la correcció
206 setting_autologin: Entrada automàtica
207 setting_date_format: Format de la data
208 setting_time_format: Format de hora
209 setting_cross_project_issue_relations: "Permet les relacions d'assumptes entre projectes"
210 setting_issue_list_default_columns: "Columnes mostrades per defecte en la llista d'assumptes"
211 setting_repositories_encodings: Codificacions del dipòsit
212 setting_emails_footer: Peu dels correus electrònics
213 setting_protocol: Protocol
214 setting_per_page_options: Opcions dels objectes per pàgina
215 setting_user_format: "Format de com mostrar l'usuari"
216 setting_activity_days_default: "Dies a mostrar l'activitat del projecte"
217 setting_display_subprojects_issues: "Mostra els assumptes d'un subprojecte en el projecte pare per defecte"
218 setting_enabled_scm: "Habilita l'SCM"
219 setting_mail_handler_api_enabled: "Habilita el WS per correus electrònics d'entrada"
220 setting_mail_handler_api_key: Clau API
221
222 project_module_issue_tracking: "Seguidor d'assumptes"
223 project_module_time_tracking: Seguidor de temps
224 project_module_news: Noticies
225 project_module_documents: Documents
226 project_module_files: Fitxers
227 project_module_wiki: Wiki
228 project_module_repository: Dipòsit
229 project_module_boards: Taulers
230
231 label_user: Usuari
232 label_user_plural: Usuaris
233 label_user_new: Usuari nou
234 label_project: Projecte
235 label_project_new: Projecte nou
236 label_project_plural: Projectes
237 label_project_all: Tots els projectes
238 label_project_latest: Els últims projectes
239 label_issue: Assumpte
240 label_issue_new: Assumpte nou
241 label_issue_plural: Assumptes
242 label_issue_view_all: Visualitza tots els assumptes
243 label_issues_by: Assumptes per %s
244 label_issue_added: Assumpte afegit
245 label_issue_updated: Assumpte actualitzat
246 label_document: Document
247 label_document_new: Document nou
248 label_document_plural: Documents
249 label_document_added: Document afegit
250 label_role: Rol
251 label_role_plural: Rols
252 label_role_new: Rol nou
253 label_role_and_permissions: Rols i permisos
254 label_member: Membre
255 label_member_new: Membre nou
256 label_member_plural: Membres
257 label_tracker: Seguidor
258 label_tracker_plural: Seguidors
259 label_tracker_new: Seguidor nou
260 label_workflow: Flux de treball
261 label_issue_status: "Estat de l'assumpte"
262 label_issue_status_plural: "Estats de l'assumpte"
263 label_issue_status_new: Estat nou
264 label_issue_category: "Categoria de l'assumpte"
265 label_issue_category_plural: "Categories de l'assumpte"
266 label_issue_category_new: Categoria nova
267 label_custom_field: Camp personalitzat
268 label_custom_field_plural: Camps personalitzats
269 label_custom_field_new: Camp personalitzat nou
270 label_enumerations: Enumeracions
271 label_enumeration_new: Valor nou
272 label_information: Informació
273 label_information_plural: Informació
274 label_please_login: Entreu
275 label_register: Registre
276 label_password_lost: Contrasenya perduda
277 label_home: Inici
278 label_my_page: La meva pàgina
279 label_my_account: El meu compte
280 label_my_projects: Els meus projectes
281 label_administration: Administració
282 label_login: Entra
283 label_logout: Surt
284 label_help: Ajuda
285 label_reported_issues: Assumptes informats
286 label_assigned_to_me_issues: Assumptes assignats a mi
287 label_last_login: Última connexió
288 label_last_updates: Última actualització
289 label_last_updates_plural: %d última actualització
290 label_registered_on: Informat el
291 label_activity: Activitat
292 label_overall_activity: Activitat global
293 label_new: Nou
294 label_logged_as: Heu entrat com a
295 label_environment: Entorn
296 label_authentication: Autenticació
297 label_auth_source: "Mode d'autenticació"
298 label_auth_source_new: "Mode d'autenticació nou"
299 label_auth_source_plural: "Modes d'autenticació"
300 label_subproject_plural: Subprojectes
301 label_and_its_subprojects: %s i els seus subprojectes
302 label_min_max_length: Longitud mín - max
303 label_list: Llist
304 label_date: Data
305 label_integer: Enter
306 label_float: Flotant
307 label_boolean: Booleà
308 label_string: Text
309 label_text: Text llarg
310 label_attribute: Atribut
311 label_attribute_plural: Atributs
312 label_download: %d baixada
313 label_download_plural: %d baixades
314 label_no_data: Sense dades a mostrar
315 label_change_status: "Canvia l'estat"
316 label_history: Historial
317 label_attachment: Fitxer
318 label_attachment_new: Fitxer nou
319 label_attachment_delete: Suprimeix el fitxer
320 label_attachment_plural: Fitxers
321 label_file_added: Fitxer afegit
322 label_report: Informe
323 label_report_plural: Informes
324 label_news: Noticies
325 label_news_new: Afegeix noticies
326 label_news_plural: Noticies
327 label_news_latest: Últimes noticies
328 label_news_view_all: Visualitza totes les noticies
329 label_news_added: Noticies afegides
330 label_change_log: Registre de canvis
331 label_settings: Paràmetres
332 label_overview: Resum
333 label_version: Versió
334 label_version_new: Versió nova
335 label_version_plural: Versions
336 label_confirmation: Confirmació
337 label_export_to: 'També disponible a:'
338 label_read: Llegeix...
339 label_public_projects: Projectes públics
340 label_open_issues: obert
341 label_open_issues_plural: oberts
342 label_closed_issues: tancat
343 label_closed_issues_plural: tancats
344 label_total: Total
345 label_permissions: Permisos
346 label_current_status: Estat actual
347 label_new_statuses_allowed: Nous estats autoritzats
348 label_all: tots
349 label_none: cap
350 label_nobody: ningú
351 label_next: Següent
352 label_previous: Anterior
353 label_used_by: Utilitzat per
354 label_details: Detalls
355 label_add_note: Afegeix una nota
356 label_per_page: Per pàgina
357 label_calendar: Calendari
358 label_months_from: mesos des de
359 label_gantt: Gantt
360 label_internal: Intern
361 label_last_changes: últims %d canvis
362 label_change_view_all: Visualitza tots els canvis
363 label_personalize_page: Personalitza aquesta pàgina
364 label_comment: Comentari
365 label_comment_plural: Comentaris
366 label_comment_add: Afegeix un comentari
367 label_comment_added: Comentari afegit
368 label_comment_delete: Suprimeix comentaris
369 label_query: Consulta personalitzada
370 label_query_plural: Consultes personalitzades
371 label_query_new: Consulta nova
372 label_filter_add: Afegeix un filtre
373 label_filter_plural: Filtres
374 label_equals: és
375 label_not_equals: no és
376 label_in_less_than: en menys de
377 label_in_more_than: en més de
378 label_in: en
379 label_today: avui
380 label_all_time: tot el temps
381 label_yesterday: ahir
382 label_this_week: aquesta setmana
383 label_last_week: "l'última setmana"
384 label_last_n_days: els últims %d dies
385 label_this_month: aquest més
386 label_last_month: "l'últim més"
387 label_this_year: aquest any
388 label_date_range: Abast de les dates
389 label_less_than_ago: fa menys de
390 label_more_than_ago: fa més de
391 label_ago: fa
392 label_contains: conté
393 label_not_contains: no conté
394 label_day_plural: dies
395 label_repository: Dipòsit
396 label_repository_plural: Dipòsits
397 label_browse: Navega
398 label_modification: %d canvi
399 label_modification_plural: %d canvis
400 label_revision: Revisió
401 label_revision_plural: Revisions
402 label_associated_revisions: Revisions associades
403 label_added: afegit
404 label_modified: modificat
405 label_deleted: suprimit
406 label_latest_revision: Última revisió
407 label_latest_revision_plural: Últimes revisions
408 label_view_revisions: Visualitza les revisions
409 label_max_size: Mida màxima
410 label_on: 'de'
411 label_sort_highest: Mou a la part superior
412 label_sort_higher: Mou cap amunt
413 label_sort_lower: Mou cap avall
414 label_sort_lowest: Mou a la part inferior
415 label_roadmap: Planificació
416 label_roadmap_due_in: Venç en
417 label_roadmap_overdue: %s tard
418 label_roadmap_no_issues: No hi ha assumptes per a aquesta versió
419 label_search: Cerca
420 label_result_plural: Resultats
421 label_all_words: Totes les paraules
422 label_wiki: Wiki
423 label_wiki_edit: Edició wiki
424 label_wiki_edit_plural: Edicions wiki
425 label_wiki_page: Pàgina wiki
426 label_wiki_page_plural: Pàgines wiki
427 label_index_by_title: Índex per títol
428 label_index_by_date: Índex per data
429 label_current_version: Versió actual
430 label_preview: Previsualització
431 label_feed_plural: Canals
432 label_changes_details: Detalls de tots els canvis
433 label_issue_tracking: "Seguiment d'assumptes"
434 label_spent_time: Temps invertit
435 label_f_hour: %.2f hora
436 label_f_hour_plural: %.2f hores
437 label_time_tracking: Temps de seguiment
438 label_change_plural: Canvis
439 label_statistics: Estadístiques
440 label_commits_per_month: Publicacions per mes
441 label_commits_per_author: Publicacions per autor
442 label_view_diff: Visualitza les diferències
443 label_diff_inline: en línia
444 label_diff_side_by_side: costat per costat
445 label_options: Opcions
446 label_copy_workflow_from: Copia el flux de treball des de
447 label_permissions_report: Informe de permisos
448 label_watched_issues: Assumptes vigilats
449 label_related_issues: Assumptes relacionats
450 label_applied_status: Estat aplicat
451 label_loading: "S'està carregant..."
452 label_relation_new: Relació nova
453 label_relation_delete: Suprimeix la relació
454 label_relates_to: relacionat amb
455 label_duplicates: duplicats
456 label_duplicated_by: duplicat per
457 label_blocks: bloqueja
458 label_blocked_by: bloquejats per
459 label_precedes: anterior a
460 label_follows: posterior a
461 label_end_to_start: final al començament
462 label_end_to_end: final al final
463 label_start_to_start: començament al començament
464 label_start_to_end: començament al final
465 label_stay_logged_in: "Manté l'entrada en"
466 label_disabled: inhabilitat
467 label_show_completed_versions: Mostra les versions completes
468 label_me: jo mateix
469 label_board: Fòrum
470 label_board_new: Fòrum nou
471 label_board_plural: Fòrums
472 label_topic_plural: Temes
473 label_message_plural: Missatges
474 label_message_last: Últim missatge
475 label_message_new: Missatge nou
476 label_message_posted: Missatge afegit
477 label_reply_plural: Respostes
478 label_send_information: "Envia la informació del compte a l'usuari"
479 label_year: Any
480 label_month: Mes
481 label_week: Setmana
482 label_date_from: Des de
483 label_date_to: A
484 label_language_based: "Basat en l'idioma de l'usuari"
485 label_sort_by: Ordena per %s
486 label_send_test_email: Envia un correu electrònic de prova
487 label_feeds_access_key_created_on: "Clau d'accés del RSS creada fa %s"
488 label_module_plural: Mòduls
489 label_added_time_by: Afegit per %s fa %s
490 label_updated_time: Actualitzat fa %s
491 label_jump_to_a_project: Salta al projecte...
492 label_file_plural: Fitxers
493 label_changeset_plural: Conjunt de canvis
494 label_default_columns: Columnes predeterminades
495 label_no_change_option: (sense canvis)
496 label_bulk_edit_selected_issues: Edita en bloc els assumptes seleccionats
497 label_theme: Tema
498 label_default: Predeterminat
499 label_search_titles_only: Cerca només en els títols
500 label_user_mail_option_all: "Per qualsevol esdeveniment en tots els meus projectes"
501 label_user_mail_option_selected: "Per qualsevol esdeveniment en els projectes seleccionats..."
502 label_user_mail_option_none: "Només per les coses que vigilo o hi estic implicat"
503 label_user_mail_no_self_notified: "No vull ser notificat pels canvis que faig jo mateix"
504 label_registration_activation_by_email: activació del compte per correu electrònic
505 label_registration_manual_activation: activació del compte manual
506 label_registration_automatic_activation: activació del compte automàtica
507 label_display_per_page: 'Per pàgina: %s'
508 label_age: Edat
509 label_change_properties: Canvia les propietats
510 label_general: General
511 label_more: Més
512 label_scm: SCM
513 label_plugins: Connectors
514 label_ldap_authentication: Autenticació LDAP
515 label_downloads_abbr: Baixades
516 label_optional_description: Descripció opcional
517 label_add_another_file: Afegeix un altre fitxer
518 label_preferences: Preferències
519 label_chronological_order: En ordre cronològic
520 label_reverse_chronological_order: En ordre cronològic invers
521 label_planning: Planificació
522 label_incoming_emails: "Correu electrònics d'entrada"
523 label_generate_key: Genera una clau
524 label_issue_watchers: Vigilants
525
526 button_login: Entra
527 button_submit: Tramet
528 button_save: Desa
529 button_check_all: Activa-ho tot
530 button_uncheck_all: Desactiva-ho tot
531 button_delete: Suprimeix
532 button_create: Crea
533 button_test: Test
534 button_edit: Edit
535 button_add: Afegeix
536 button_change: Canvia
537 button_apply: Aplica
538 button_clear: Neteja
539 button_lock: Bloca
540 button_unlock: Desbloca
541 button_download: Baixa
542 button_list: Llista
543 button_view: Visualitza
544 button_move: Mou
545 button_back: Enrere
546 button_cancel: Cancel·la
547 button_activate: Activa
548 button_sort: Ordena
549 button_log_time: "Hora d'entrada"
550 button_rollback: Torna a aquesta versió
551 button_watch: Vigila
552 button_unwatch: No vigilis
553 button_reply: Resposta
554 button_archive: Arxiva
555 button_unarchive: Desarxiva
556 button_reset: Reinicia
557 button_rename: Reanomena
558 button_change_password: Canvia la contrasenya
559 button_copy: Copia
560 button_annotate: Anota
561 button_update: Actualitza
562 button_configure: Configura
563
564 status_active: actiu
565 status_registered: informat
566 status_locked: bloquejat
567
568 text_select_mail_notifications: "Seleccioneu les accions per les quals s'hauria d'enviar una notificació per correu electrònic."
569 text_regexp_info: ex. ^[A-Z0-9]+$
570 text_min_max_length_info: 0 significa sense restricció
571 text_project_destroy_confirmation: Segur que voleu suprimir aquest projecte i les dades relacionades?
572 text_subprojects_destroy_warning: "També seran suprimits els seus subprojectes: %s."
573 text_workflow_edit: Seleccioneu un rol i un seguidor per a editar el flux de treball
574 text_are_you_sure: Segur?
575 text_journal_changed: canviat des de %s a %s
576 text_journal_set_to: establert a %s
577 text_journal_deleted: suprimit
578 text_tip_task_begin_day: "tasca que s'inicia aquest dia"
579 text_tip_task_end_day: tasca que finalitza aquest dia
580 text_tip_task_begin_end_day: "tasca que s'inicia i finalitza aquest dia"
581 text_project_identifier_info: "Es permeten lletres en minúscules (a-z), números i guions.<br />Un cop desat, l'identificador no es pot modificar."
582 text_caracters_maximum: %d caràcters com a màxim.
583 text_caracters_minimum: Com a mínim ha de tenir %d caràcters.
584 text_length_between: Longitud entre %d i %d caràcters.
585 text_tracker_no_workflow: "No s'ha definit cap flux de treball per a aquest seguidor"
586 text_unallowed_characters: Caràcters no permesos
587 text_comma_separated: Es permeten valors múltiples (separats per una coma).
588 text_issues_ref_in_commit_messages: Referència i soluciona els assumptes en els missatges publicats
589 text_issue_added: "L'assumpte %s ha sigut informat per %s."
590 text_issue_updated: "L'assumpte %s ha sigut actualitzat per %s."
591 text_wiki_destroy_confirmation: Segur que voleu suprimir aquest wiki i tots els seus continguts?
592 text_issue_category_destroy_question: Alguns assumptes (%d) estan assignats a aquesta categoria. Què voleu fer?
593 text_issue_category_destroy_assignments: Suprimeix les assignacions de la categoria
594 text_issue_category_reassign_to: Torna a assignar els assumptes a aquesta categoria
595 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)."
596 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."
597 text_load_default_configuration: Carrega la configuració predeterminada
598 text_status_changed_by_changeset: Aplicat en el conjunt de canvis %s.
599 text_issues_destroy_confirmation: "Segur que voleu suprimir els assumptes seleccionats?"
600 text_select_project_modules: "Seleccioneu els mòduls a habilitar per a aquest projecte:"
601 text_default_administrator_account_changed: "S'ha canviat el compte d'administrador predeterminat"
602 text_file_repository_writable: Es pot escriure en el dipòsit de fitxers
603 text_rmagick_available: RMagick disponible (opcional)
604 text_destroy_time_entries_question: "S'han informat %.02f hores en els assumptes que aneu a suprimir. Què voleu fer?"
605 text_destroy_time_entries: Suprimeix les hores informades
606 text_assign_time_entries_to_project: Assigna les hores informades al projecte
607 text_reassign_time_entries: 'Torna a assignar les hores informades a aquest assumpte:'
608 text_user_wrote: '%s va escriure:'
609 text_enumeration_destroy_question: '%d objectes estan assignats a aquest valor.'
610 text_enumeration_category_reassign_to: 'Torna a assignar-los a aquest valor:'
611 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."
612
613 default_role_manager: Gestor
614 default_role_developper: Desenvolupador
615 default_role_reporter: Informador
616 default_tracker_bug: Error
617 default_tracker_feature: Característica
618 default_tracker_support: Suport
619 default_issue_status_new: Nou
620 default_issue_status_assigned: Assignat
621 default_issue_status_resolved: Resolt
622 default_issue_status_feedback: Comentaris
623 default_issue_status_closed: Tancat
624 default_issue_status_rejected: Rebutjat
625 default_doc_category_user: "Documentació d'usuari"
626 default_doc_category_tech: Documentació tècnica
627 default_priority_low: Baixa
628 default_priority_normal: Normal
629 default_priority_high: Alta
630 default_priority_urgent: Urgent
631 default_priority_immediate: Immediata
632 default_activity_design: Disseny
633 default_activity_development: Desenvolupament
634
635 enumeration_issue_priorities: Prioritat dels assumptes
636 enumeration_doc_categories: Categories del document
637 enumeration_activities: Activitats (seguidor de temps)
638 button_quote: Quote
639 setting_sequential_project_identifiers: Generate sequential project identifiers
640 notice_unable_delete_version: Unable to delete version.
641 field_comments: Comment
642 setting_commit_logs_encoding: Commit messages encoding
643 label_renamed: renamed
644 label_copied: copied
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
@@ -0,0 +1,127
1 // ** I18N
2
3 // Calendar EN language
4 // Author: Mihai Bazon, <mihai_bazon@yahoo.com>
5 // Encoding: any
6 // Distributed under the same terms as the calendar itself.
7
8 // For translators: please use UTF-8 if possible. We strongly believe that
9 // Unicode is the answer to a real internationalized world. Also please
10 // include your contact information in the header, as can be seen above.
11
12 // full day names
13 Calendar._DN = new Array
14 ("Diumenge",
15 "Dilluns",
16 "Dimarts",
17 "Dimecres",
18 "Dijous",
19 "Divendres",
20 "Dissabte",
21 "Diumenge");
22
23 // Please note that the following array of short day names (and the same goes
24 // for short month names, _SMN) isn't absolutely necessary. We give it here
25 // for exemplification on how one can customize the short day names, but if
26 // they are simply the first N letters of the full name you can simply say:
27 //
28 // Calendar._SDN_len = N; // short day name length
29 // Calendar._SMN_len = N; // short month name length
30 //
31 // If N = 3 then this is not needed either since we assume a value of 3 if not
32 // present, to be compatible with translation files that were written before
33 // this feature.
34
35 // short day names
36 Calendar._SDN = new Array
37 ("dg",
38 "dl",
39 "dt",
40 "dc",
41 "dj",
42 "dv",
43 "ds",
44 "dg");
45
46 // First day of the week. "0" means display Sunday first, "1" means display
47 // Monday first, etc.
48 Calendar._FD = 0;
49
50 // full month names
51 Calendar._MN = new Array
52 ("Gener",
53 "Febrer",
54 "Març",
55 "Abril",
56 "Maig",
57 "Juny",
58 "Juliol",
59 "Agost",
60 "Setembre",
61 "Octubre",
62 "Novembre",
63 "Desembre");
64
65 // short month names
66 Calendar._SMN = new Array
67 ("Gen",
68 "Feb",
69 "Mar",
70 "Abr",
71 "Mai",
72 "Jun",
73 "Jul",
74 "Ago",
75 "Set",
76 "Oct",
77 "Nov",
78 "Des");
79
80 // tooltips
81 Calendar._TT = {};
82 Calendar._TT["INFO"] = "Quant al calendari";
83
84 Calendar._TT["ABOUT"] =
85 "Selector DHTML de data/hora\n" +
86 "(c) dynarch.com 2002-2005 / Autor: Mihai Bazon\n" + // don't translate this this ;-)
87 "Per a aconseguir l'última versió visiteu: http://www.dynarch.com/projects/calendar/\n" +
88 "Distribuït sota la llicència GNU LGPL. Vegeu http://gnu.org/licenses/lgpl.html per a més detalls." +
89 "\n\n" +
90 "Selecció de la data:\n" +
91 "- Utilitzeu els botons \xab, \xbb per a seleccionar l'any\n" +
92 "- Utilitzeu els botons " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " per a selecciona el mes\n" +
93 "- Mantingueu premut el botó del ratolí sobre qualsevol d'aquests botons per a uns selecció més ràpida.";
94 Calendar._TT["ABOUT_TIME"] = "\n\n" +
95 "Selecció de l'hora:\n" +
96 "- Feu clic en qualsevol part de l'hora per a incrementar-la\n" +
97 "- o premeu majúscules per a disminuir-la\n" +
98 "- o feu clic i arrossegueu per a una selecció més ràpida.";
99
100 Calendar._TT["PREV_YEAR"] = "Any anterior (mantenir per menú)";
101 Calendar._TT["PREV_MONTH"] = "Mes anterior (mantenir per menú)";
102 Calendar._TT["GO_TODAY"] = "Anar a avui";
103 Calendar._TT["NEXT_MONTH"] = "Mes següent (mantenir per menú)";
104 Calendar._TT["NEXT_YEAR"] = "Any següent (mantenir per menú)";
105 Calendar._TT["SEL_DATE"] = "Sel·lecciona data";
106 Calendar._TT["DRAG_TO_MOVE"] = "Arrossega per a moure";
107 Calendar._TT["PART_TODAY"] = " (avui)";
108
109 // the following is to inform that "%s" is to be the first day of week
110 // %s will be replaced with the day name.
111 Calendar._TT["DAY_FIRST"] = "Primer mostra el %s";
112
113 // This may be locale-dependent. It specifies the week-end days, as an array
114 // of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
115 // means Monday, etc.
116 Calendar._TT["WEEKEND"] = "0,6";
117
118 Calendar._TT["CLOSE"] = "Tanca";
119 Calendar._TT["TODAY"] = "Avui";
120 Calendar._TT["TIME_PART"] = "(Majúscules-)Feu clic o arrossegueu per a canviar el valor";
121
122 // date formats
123 Calendar._TT["DEF_DATE_FORMAT"] = "%d-%m-%Y";
124 Calendar._TT["TT_DATE_FORMAT"] = "%A, %e de %B de %Y";
125
126 Calendar._TT["WK"] = "set";
127 Calendar._TT["TIME"] = "Hora:";
@@ -0,0 +1,16
1 jsToolBar.strings = {};
2 jsToolBar.strings['Strong'] = 'Negreta';
3 jsToolBar.strings['Italic'] = 'Cursiva';
4 jsToolBar.strings['Underline'] = 'Subratllat';
5 jsToolBar.strings['Deleted'] = 'Barrat';
6 jsToolBar.strings['Code'] = 'Codi en línia';
7 jsToolBar.strings['Heading 1'] = 'Encapçalament 1';
8 jsToolBar.strings['Heading 2'] = 'Encapçalament 2';
9 jsToolBar.strings['Heading 3'] = 'Encapçalament 3';
10 jsToolBar.strings['Unordered list'] = 'Llista sense ordre';
11 jsToolBar.strings['Ordered list'] = 'Llista ordenada';
12 jsToolBar.strings['Quote'] = 'Cometes';
13 jsToolBar.strings['Unquote'] = 'Sense cometes';
14 jsToolBar.strings['Preformatted text'] = 'Text formatat';
15 jsToolBar.strings['Wiki link'] = 'Enllaça a una pàgina Wiki';
16 jsToolBar.strings['Image'] = 'Imatge';
@@ -118,11 +118,6 class RepositoriesController < ApplicationController
118 def revision
118 def revision
119 @changeset = @repository.changesets.find_by_revision(@rev)
119 @changeset = @repository.changesets.find_by_revision(@rev)
120 raise ChangesetNotFound unless @changeset
120 raise ChangesetNotFound unless @changeset
121 @changes_count = @changeset.changes.size
122 @changes_pages = Paginator.new self, @changes_count, 150, params['page']
123 @changes = @changeset.changes.find(:all,
124 :limit => @changes_pages.items_per_page,
125 :offset => @changes_pages.current.offset)
126
121
127 respond_to do |format|
122 respond_to do |format|
128 format.html
123 format.html
@@ -32,6 +32,74 module RepositoriesHelper
32 end
32 end
33 end
33 end
34
34
35 def render_changeset_changes
36 changes = @changeset.changes.find(:all, :limit => 1000, :order => 'path').collect do |change|
37 case change.action
38 when 'A'
39 # Detects moved/copied files
40 if !change.from_path.blank?
41 change.action = @changeset.changes.detect {|c| c.action == 'D' && c.path == change.from_path} ? 'R' : 'C'
42 end
43 change
44 when 'D'
45 @changeset.changes.detect {|c| c.from_path == change.path} ? nil : change
46 else
47 change
48 end
49 end.compact
50
51 tree = { }
52 changes.each do |change|
53 p = tree
54 dirs = change.path.to_s.split('/').select {|d| !d.blank?}
55 dirs.each do |dir|
56 p[:s] ||= {}
57 p = p[:s]
58 p[dir] ||= {}
59 p = p[dir]
60 end
61 p[:c] = change
62 end
63
64 render_changes_tree(tree[:s])
65 end
66
67 def render_changes_tree(tree)
68 return '' if tree.nil?
69
70 output = ''
71 output << '<ul>'
72 tree.keys.sort.each do |file|
73 s = !tree[file][:s].nil?
74 c = tree[file][:c]
75
76 style = 'change'
77 style << ' folder' if s
78 style << " change-#{c.action}" if c
79
80 text = h(file)
81 unless c.nil?
82 path_param = to_path_param(@repository.relative_path(c.path))
83 text = link_to(text, :controller => 'repositories',
84 :action => 'entry',
85 :id => @project,
86 :path => path_param,
87 :rev => @changeset.revision) unless s || c.action == 'D'
88 text << " - #{c.revision}" unless c.revision.blank?
89 text << ' (' + link_to('diff', :controller => 'repositories',
90 :action => 'diff',
91 :id => @project,
92 :path => path_param,
93 :rev => @changeset.revision) + ') ' if c.action == 'M'
94 text << ' ' + content_tag('span', c.from_path, :class => 'copied-from') unless c.from_path.blank?
95 end
96 output << "<li class='#{style}'>#{text}</li>"
97 output << render_changes_tree(tree[file][:s]) if s
98 end
99 output << '</ul>'
100 output
101 end
102
35 def to_utf8(str)
103 def to_utf8(str)
36 return str if /\A[\r\n\t\x20-\x7e]*\Z/n.match(str) # for us-ascii
104 return str if /\A[\r\n\t\x20-\x7e]*\Z/n.match(str) # for us-ascii
37 @encodings ||= Setting.repositories_encodings.split(',').collect(&:strip)
105 @encodings ||= Setting.repositories_encodings.split(',').collect(&:strip)
@@ -19,6 +19,6
19 <h3><%= l(:label_query_plural) %></h3>
19 <h3><%= l(:label_query_plural) %></h3>
20
20
21 <% sidebar_queries.each do |query| -%>
21 <% sidebar_queries.each do |query| -%>
22 <%= link_to query.name, :query_id => query %><br />
22 <%= link_to query.name, :controller => 'issues', :action => 'index', :project_id => @project, :query_id => query %><br />
23 <% end -%>
23 <% end -%>
24 <% end -%>
24 <% end -%>
@@ -36,33 +36,19
36 <% end %>
36 <% end %>
37
37
38 <h3><%= l(:label_attachment_plural) %></h3>
38 <h3><%= l(:label_attachment_plural) %></h3>
39 <div style="float:right;">
39 <ul id="changes-legend">
40 <div class="square action_A"></div> <div style="float:left;"><%= l(:label_added) %>&nbsp;</div>
40 <li class="change change-A"><%= l(:label_added) %></li>
41 <div class="square action_M"></div> <div style="float:left;"><%= l(:label_modified) %>&nbsp;</div>
41 <li class="change change-M"><%= l(:label_modified) %></li>
42 <div class="square action_D"></div> <div style="float:left;"><%= l(:label_deleted) %>&nbsp;</div>
42 <li class="change change-C"><%= l(:label_copied) %></li>
43 </div>
43 <li class="change change-R"><%= l(:label_renamed) %></li>
44 <li class="change change-D"><%= l(:label_deleted) %></li>
45 </ul>
46
44 <p><%= link_to(l(:label_view_diff), :action => 'diff', :id => @project, :path => "", :rev => @changeset.revision) if @changeset.changes.any? %></p>
47 <p><%= link_to(l(:label_view_diff), :action => 'diff', :id => @project, :path => "", :rev => @changeset.revision) if @changeset.changes.any? %></p>
45 <table class="list">
48
46 <tbody>
49 <div class="changeset-changes">
47 <% @changes.each do |change| %>
50 <%= render_changeset_changes %>
48 <tr class="<%= cycle 'odd', 'even' %>">
51 </div>
49 <td><div class="square action_<%= change.action %>"></div>
50 <% if change.action == "D" -%>
51 <%= change.path -%>
52 <% else -%>
53 <%= link_to change.path, :action => 'entry', :id => @project, :path => to_path_param(change.relative_path), :rev => @changeset.revision -%>
54 <% end -%>
55 <%= "(#{change.revision})" unless change.revision.blank? %></td>
56 <td align="right">
57 <% if change.action == "M" %>
58 <%= link_to l(:label_view_diff), :action => 'diff', :id => @project, :path => to_path_param(change.relative_path), :rev => @changeset.revision %>
59 <% end %>
60 </td>
61 </tr>
62 <% end %>
63 </tbody>
64 </table>
65 <p class="pagination"><%= pagination_links_full @changes_pages %></p>
66
52
67 <% content_for :header_tags do %>
53 <% content_for :header_tags do %>
68 <%= stylesheet_link_tag "scm" %>
54 <%= stylesheet_link_tag "scm" %>
@@ -1,13 +1,51
1 #!/usr/bin/ruby
1 #!/usr/bin/ruby
2
2
3 # rdm-mailhandler
3 # == Synopsis
4 #
4 # Reads an email from standard input and forward it to a Redmine server
5 # Reads an email from standard input and forward it to a Redmine server
5 # Can be used from a remote mail server
6 # through a HTTP request.
7 #
8 # == Usage
9 #
10 # rdm-mailhandler [options] --url=<Redmine URL> --key=<API key>
11 #
12 # == Arguments
13 #
14 # -u, --url URL of the Redmine server
15 # -k, --key Redmine API key
16 #
17 # General options:
18 # -h, --help show this help
19 # -v, --verbose show extra information
20 # -V, --version show version information and exit
21 #
22 # Issue attributes control options:
23 # -p, --project=PROJECT identifier of the target project
24 # -t, --tracker=TRACKER name of the target tracker
25 # --category=CATEGORY name of the target category
26 # --priority=PRIORITY name of the target priority
27 # -o, --allow-override=ATTRS allow email content to override attributes
28 # specified by previous options
29 # ATTRS is a comma separated list of attributes
30 #
31 # == Examples
32 # No project specified. Emails MUST contain the 'Project' keyword:
33 #
34 # rdm-mailhandler --url http://redmine.domain.foo --key secret
35 #
36 # Fixed project and default tracker specified, but emails can override
37 # both tracker and priority attributes using keywords:
38 #
39 # rdm-mailhandler --url https://domain.foo/redmine --key secret \\
40 # --project foo \\
41 # --tracker bug \\
42 # --allow-override tracker,priority
6
43
7 require 'net/http'
44 require 'net/http'
8 require 'net/https'
45 require 'net/https'
9 require 'uri'
46 require 'uri'
10 require 'getoptlong'
47 require 'getoptlong'
48 require 'rdoc/usage'
11
49
12 module Net
50 module Net
13 class HTTPS < HTTP
51 class HTTPS < HTTP
@@ -31,15 +69,15 class RedmineMailHandler
31 self.issue_attributes = {}
69 self.issue_attributes = {}
32
70
33 opts = GetoptLong.new(
71 opts = GetoptLong.new(
34 [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
72 [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
35 [ '--version', '-V', GetoptLong::NO_ARGUMENT ],
73 [ '--version', '-V', GetoptLong::NO_ARGUMENT ],
36 [ '--verbose', '-v', GetoptLong::NO_ARGUMENT ],
74 [ '--verbose', '-v', GetoptLong::NO_ARGUMENT ],
37 [ '--url', '-u', GetoptLong::REQUIRED_ARGUMENT ],
75 [ '--url', '-u', GetoptLong::REQUIRED_ARGUMENT ],
38 [ '--key', '-k', GetoptLong::REQUIRED_ARGUMENT],
76 [ '--key', '-k', GetoptLong::REQUIRED_ARGUMENT],
39 [ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ],
77 [ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ],
40 [ '--tracker', '-t', GetoptLong::REQUIRED_ARGUMENT],
78 [ '--tracker', '-t', GetoptLong::REQUIRED_ARGUMENT],
41 [ '--category', GetoptLong::REQUIRED_ARGUMENT],
79 [ '--category', GetoptLong::REQUIRED_ARGUMENT],
42 [ '--priority', GetoptLong::REQUIRED_ARGUMENT],
80 [ '--priority', GetoptLong::REQUIRED_ARGUMENT],
43 [ '--allow-override', '-o', GetoptLong::REQUIRED_ARGUMENT]
81 [ '--allow-override', '-o', GetoptLong::REQUIRED_ARGUMENT]
44 )
82 )
45
83
@@ -62,7 +100,7 class RedmineMailHandler
62 end
100 end
63 end
101 end
64
102
65 usage if url.nil?
103 RDoc.usage if url.nil?
66 end
104 end
67
105
68 def submit(email)
106 def submit(email)
@@ -74,48 +112,14 class RedmineMailHandler
74 debug "Posting to #{uri}..."
112 debug "Posting to #{uri}..."
75 response = Net::HTTPS.post_form(URI.parse(uri), data)
113 response = Net::HTTPS.post_form(URI.parse(uri), data)
76 debug "Response received: #{response.code}"
114 debug "Response received: #{response.code}"
77 response.code == 201 ? 0 : 1
115
116 puts "Request was denied by your Redmine server. " +
117 "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'
118 response.code == '201' ? 0 : 1
78 end
119 end
79
120
80 private
121 private
81
122
82 def usage
83 puts <<-USAGE
84 Usage: rdm-mailhandler [options] --url=<Redmine URL> --key=<API key>
85 Reads an email from standard input and forward it to a Redmine server
86
87 Required:
88 -u, --url URL of the Redmine server
89 -k, --key Redmine API key
90
91 General options:
92 -h, --help show this help
93 -v, --verbose show extra information
94 -V, --version show version information and exit
95
96 Issue attributes control options:
97 -p, --project=PROJECT identifier of the target project
98 -t, --tracker=TRACKER name of the target tracker
99 --category=CATEGORY name of the target category
100 --priority=PRIORITY name of the target priority
101 -o, --allow-override=ATTRS allow email content to override attributes
102 specified by previous options
103 ATTRS is a comma separated list of attributes
104
105 Examples:
106 # No project specified. Emails MUST contain the 'Project' keyword:
107 rdm-mailhandler --url http://redmine.domain.foo --key secret
108
109 # Fixed project and default tracker specified, but emails can override
110 # both tracker and priority attributes:
111 rdm-mailhandler --url https://domain.foo/redmine --key secret \\
112 --project foo \\
113 --tracker bug \\
114 --allow-override tracker,priority
115 USAGE
116 exit
117 end
118
119 def debug(msg)
123 def debug(msg)
120 puts msg if verbose
124 puts msg if verbose
121 end
125 end
@@ -2,15 +2,15
2
2
3 # == Synopsis
3 # == Synopsis
4 #
4 #
5 # reposman: manages your svn repositories with Redmine
5 # reposman: manages your repositories with Redmine
6 #
6 #
7 # == Usage
7 # == Usage
8 #
8 #
9 # reposman [OPTIONS...] -s [DIR] -r [HOST]
9 # reposman [OPTIONS...] -s [DIR] -r [HOST]
10 #
10 #
11 # Examples:
11 # Examples:
12 # reposman --svn-dir=/var/svn --redmine-host=redmine.example.net
12 # reposman --svn-dir=/var/svn --redmine-host=redmine.example.net --scm subversion
13 # reposman -s /var/svn -r redmine.example.net -u http://svn.example.net
13 # reposman -s /var/git -r redmine.example.net -u http://svn.example.net --scm git
14 #
14 #
15 # == Arguments (mandatory)
15 # == Arguments (mandatory)
16 #
16 #
@@ -24,7 +24,12
24 #
24 #
25 # -o, --owner=OWNER owner of the repository. using the rails login
25 # -o, --owner=OWNER owner of the repository. using the rails login
26 # allow user to browse the repository within
26 # allow user to browse the repository within
27 # Redmine even for private project
27 # Redmine even for private project. If you want to share repositories
28 # through Redmine.pm, you need to use the apache owner.
29 # --scm=SCM the kind of SCM repository you want to create (and register) in
30 # Redmine (default: Subversion). reposman is able to create Git
31 # and Subversion repositories. For all other kind (Bazaar,
32 # Darcs, Filesystem, Mercurial) you must specify a --command option
28 # -u, --url=URL the base url Redmine will use to access your
33 # -u, --url=URL the base url Redmine will use to access your
29 # repositories. This option is used to automatically
34 # repositories. This option is used to automatically
30 # register the repositories in Redmine. The project
35 # register the repositories in Redmine. The project
@@ -35,13 +40,8
35 # the repositories in Redmine
40 # the repositories in Redmine
36 # -c, --command=COMMAND use this command instead of "svnadmin create" to
41 # -c, --command=COMMAND use this command instead of "svnadmin create" to
37 # create a repository. This option can be used to
42 # create a repository. This option can be used to
38 # create non-subversion repositories
43 # create repositories other than subversion and git kind.
39 # --scm SCM vendor used to register the repository in
44 # This command override the default creation for git and subversion.
40 # Redmine (default: Subversion). Can be one of the
41 # other supported SCM: Bazaar, Darcs, Filesystem,
42 # Git, Mercurial (case sensitive).
43 # This option should be used when both options --url
44 # and --command are used.
45 # -f, --force force repository creation even if the project
45 # -f, --force force repository creation even if the project
46 # repository is already declared in Redmine
46 # repository is already declared in Redmine
47 # -t, --test only show what should be done
47 # -t, --test only show what should be done
@@ -49,6 +49,11
49 # -v, --verbose verbose
49 # -v, --verbose verbose
50 # -V, --version print version and exit
50 # -V, --version print version and exit
51 # -q, --quiet no log
51 # -q, --quiet no log
52 #
53 # == References
54 #
55 # You can find more information on the redmine's wiki : http://www.redmine.org/wiki/redmine/HowTos
56
52
57
53 require 'getoptlong'
58 require 'getoptlong'
54 require 'rdoc/usage'
59 require 'rdoc/usage'
@@ -82,16 +87,38 $svn_owner = 'root'
82 $use_groupid = true
87 $use_groupid = true
83 $svn_url = false
88 $svn_url = false
84 $test = false
89 $test = false
85 $command = "svnadmin create"
86 $force = false
90 $force = false
87 $scm = 'Subversion'
91 $scm = 'Subversion'
88
92
89 def log(text,level=0, exit=false)
93 def log(text,level=0, exit=false)
90 return if $quiet or level > $verbose
94 puts text unless $quiet or level > $verbose
91 puts text
92 exit 1 if exit
95 exit 1 if exit
93 end
96 end
94
97
98 def system_or_raise(command)
99 raise "\"#{command}\" failed" unless system command
100 end
101
102 module SCM
103
104 module Subversion
105 def self.create(path)
106 system_or_raise "svnadmin create #{path}"
107 end
108 end
109
110 module Git
111 def self.create(path)
112 Dir.mkdir path
113 Dir.chdir(path) do
114 system_or_raise "git --bare init --shared"
115 system_or_raise "git-update-server-info"
116 end
117 end
118 end
119
120 end
121
95 begin
122 begin
96 opts.each do |opt, arg|
123 opts.each do |opt, arg|
97 case opt
124 case opt
@@ -99,7 +126,7 begin
99 when '--redmine-host'; $redmine_host = arg.dup
126 when '--redmine-host'; $redmine_host = arg.dup
100 when '--owner'; $svn_owner = arg.dup; $use_groupid = false;
127 when '--owner'; $svn_owner = arg.dup; $use_groupid = false;
101 when '--url'; $svn_url = arg.dup
128 when '--url'; $svn_url = arg.dup
102 when '--scm'; $scm = arg.dup; log("Invalid SCM: #{$scm}", 0, true) unless SUPPORTED_SCM.include?($scm)
129 when '--scm'; $scm = arg.dup.capitalize; log("Invalid SCM: #{$scm}", 0, true) unless SUPPORTED_SCM.include?($scm)
103 when '--command'; $command = arg.dup
130 when '--command'; $command = arg.dup
104 when '--verbose'; $verbose += 1
131 when '--verbose'; $verbose += 1
105 when '--test'; $test = true
132 when '--test'; $test = true
@@ -117,12 +144,15 if $test
117 log("running in test mode")
144 log("running in test mode")
118 end
145 end
119
146
120 # Make sure command is overridden if SCM vendor is not Subversion
147 # Make sure command is overridden if SCM vendor is not handled internally (for the moment Subversion and Git)
121 if $scm != 'Subversion' && $command == 'svnadmin create'
148 if $command.nil?
122 log("Please use --command option to specify how to create a #{$scm} repository.", 0, true)
149 begin
150 scm_module = SCM.const_get($scm)
151 rescue
152 log("Please use --command option to specify how to create a #{$scm} repository.", 0, true)
153 end
123 end
154 end
124
155
125
126 $svn_url += "/" if $svn_url and not $svn_url.match(/\/$/)
156 $svn_url += "/" if $svn_url and not $svn_url.match(/\/$/)
127
157
128 if ($redmine_host.empty? or $repos_base.empty?)
158 if ($redmine_host.empty? or $repos_base.empty?)
@@ -231,8 +261,11 projects.each do |project|
231
261
232 begin
262 begin
233 set_owner_and_rights(project, repos_path) do
263 set_owner_and_rights(project, repos_path) do
234 command = "#{$command} #{repos_path}"
264 if scm_module.nil?
235 raise "#{command} failed" unless system( command )
265 system_or_raise "#{$command} #{repos_path}"
266 else
267 scm_module.create(repos_path)
268 end
236 end
269 end
237 rescue => e
270 rescue => e
238 log("\tunable to create #{repos_path} : #{e}\n")
271 log("\tunable to create #{repos_path} : #{e}\n")
@@ -638,3 +638,5 setting_commit_logs_encoding: Commit messages encoding
638 button_quote: Quote
638 button_quote: Quote
639 setting_sequential_project_identifiers: Generate sequential project identifiers
639 setting_sequential_project_identifiers: Generate sequential project identifiers
640 notice_unable_delete_version: Unable to delete version
640 notice_unable_delete_version: Unable to delete version
641 label_renamed: renamed
642 label_copied: copied
@@ -643,3 +643,5 setting_commit_logs_encoding: Commit messages encoding
643 button_quote: Quote
643 button_quote: Quote
644 setting_sequential_project_identifiers: Generate sequential project identifiers
644 setting_sequential_project_identifiers: Generate sequential project identifiers
645 notice_unable_delete_version: Unable to delete version
645 notice_unable_delete_version: Unable to delete version
646 label_renamed: renamed
647 label_copied: copied
@@ -640,3 +640,5 setting_commit_logs_encoding: Commit messages encoding
640 button_quote: Quote
640 button_quote: Quote
641 setting_sequential_project_identifiers: Generate sequential project identifiers
641 setting_sequential_project_identifiers: Generate sequential project identifiers
642 notice_unable_delete_version: Unable to delete version
642 notice_unable_delete_version: Unable to delete version
643 label_renamed: renamed
644 label_copied: copied
@@ -639,3 +639,5 setting_commit_logs_encoding: Commit messages encoding
639 button_quote: Quote
639 button_quote: Quote
640 setting_sequential_project_identifiers: Generate sequential project identifiers
640 setting_sequential_project_identifiers: Generate sequential project identifiers
641 notice_unable_delete_version: Unable to delete version
641 notice_unable_delete_version: Unable to delete version
642 label_renamed: renamed
643 label_copied: copied
@@ -405,6 +405,8 label_revision_plural: Revisions
405 label_associated_revisions: Associated revisions
405 label_associated_revisions: Associated revisions
406 label_added: added
406 label_added: added
407 label_modified: modified
407 label_modified: modified
408 label_copied: copied
409 label_renamed: renamed
408 label_deleted: deleted
410 label_deleted: deleted
409 label_latest_revision: Latest revision
411 label_latest_revision: Latest revision
410 label_latest_revision_plural: Latest revisions
412 label_latest_revision_plural: Latest revisions
@@ -641,3 +641,5 setting_commit_logs_encoding: Codificación de los mensajes de commit
641 button_quote: Quote
641 button_quote: Quote
642 setting_sequential_project_identifiers: Generate sequential project identifiers
642 setting_sequential_project_identifiers: Generate sequential project identifiers
643 notice_unable_delete_version: Unable to delete version
643 notice_unable_delete_version: Unable to delete version
644 label_renamed: renamed
645 label_copied: copied
@@ -638,3 +638,5 button_quote: Quote
638 setting_sequential_project_identifiers: Generate sequential project identifiers
638 setting_sequential_project_identifiers: Generate sequential project identifiers
639 setting_commit_logs_encoding: Commit messages encoding
639 setting_commit_logs_encoding: Commit messages encoding
640 notice_unable_delete_version: Unable to delete version
640 notice_unable_delete_version: Unable to delete version
641 label_renamed: renamed
642 label_copied: copied
@@ -404,6 +404,8 label_revision_plural: Révisions
404 label_associated_revisions: Révisions associées
404 label_associated_revisions: Révisions associées
405 label_added: ajouté
405 label_added: ajouté
406 label_modified: modifié
406 label_modified: modifié
407 label_copied: copié
408 label_renamed: renommé
407 label_deleted: supprimé
409 label_deleted: supprimé
408 label_latest_revision: Dernière révision
410 label_latest_revision: Dernière révision
409 label_latest_revision_plural: Dernières révisions
411 label_latest_revision_plural: Dernières révisions
@@ -638,3 +638,5 setting_commit_logs_encoding: Commit messages encoding
638 button_quote: Quote
638 button_quote: Quote
639 setting_sequential_project_identifiers: Generate sequential project identifiers
639 setting_sequential_project_identifiers: Generate sequential project identifiers
640 notice_unable_delete_version: Unable to delete version
640 notice_unable_delete_version: Unable to delete version
641 label_renamed: renamed
642 label_copied: copied
@@ -638,4 +638,6 label_issue_watchers: Megfigyelők
638 setting_commit_logs_encoding: Commit üzenetek kódlapja
638 setting_commit_logs_encoding: Commit üzenetek kódlapja
639 button_quote: Idézet
639 button_quote: Idézet
640 setting_sequential_project_identifiers: Szekvenciális projekt azonosítók generálása
640 setting_sequential_project_identifiers: Szekvenciális projekt azonosítók generálása
641 notice_unable_delete_version: Unable to delete version
641 notice_unable_delete_version: A verziót nem lehet törölni
642 label_renamed: renamed
643 label_copied: copied
@@ -638,3 +638,5 setting_commit_logs_encoding: Commit messages encoding
638 button_quote: Quote
638 button_quote: Quote
639 setting_sequential_project_identifiers: Generate sequential project identifiers
639 setting_sequential_project_identifiers: Generate sequential project identifiers
640 notice_unable_delete_version: Unable to delete version
640 notice_unable_delete_version: Unable to delete version
641 label_renamed: renamed
642 label_copied: copied
@@ -639,3 +639,5 setting_commit_logs_encoding: Commit messages encoding
639 button_quote: Quote
639 button_quote: Quote
640 setting_sequential_project_identifiers: Generate sequential project identifiers
640 setting_sequential_project_identifiers: Generate sequential project identifiers
641 notice_unable_delete_version: Unable to delete version
641 notice_unable_delete_version: Unable to delete version
642 label_renamed: renamed
643 label_copied: copied
@@ -638,3 +638,5 setting_commit_logs_encoding: Commit messages encoding
638 button_quote: Quote
638 button_quote: Quote
639 setting_sequential_project_identifiers: Generate sequential project identifiers
639 setting_sequential_project_identifiers: Generate sequential project identifiers
640 notice_unable_delete_version: Unable to delete version
640 notice_unable_delete_version: Unable to delete version
641 label_renamed: renamed
642 label_copied: copied
@@ -640,3 +640,5 setting_commit_logs_encoding: Commit pranėšimų koduotė
640 setting_sequential_project_identifiers: Generate sequential project identifiers
640 setting_sequential_project_identifiers: Generate sequential project identifiers
641 button_quote: Quote
641 button_quote: Quote
642 notice_unable_delete_version: Unable to delete version
642 notice_unable_delete_version: Unable to delete version
643 label_renamed: renamed
644 label_copied: copied
@@ -639,3 +639,5 setting_commit_logs_encoding: Commit messages encoding
639 button_quote: Quote
639 button_quote: Quote
640 setting_sequential_project_identifiers: Generate sequential project identifiers
640 setting_sequential_project_identifiers: Generate sequential project identifiers
641 notice_unable_delete_version: Unable to delete version
641 notice_unable_delete_version: Unable to delete version
642 label_renamed: renamed
643 label_copied: copied
@@ -639,3 +639,5 setting_commit_logs_encoding: Commit messages encoding
639 button_quote: Quote
639 button_quote: Quote
640 setting_sequential_project_identifiers: Generate sequential project identifiers
640 setting_sequential_project_identifiers: Generate sequential project identifiers
641 notice_unable_delete_version: Unable to delete version
641 notice_unable_delete_version: Unable to delete version
642 label_renamed: renamed
643 label_copied: copied
@@ -638,3 +638,5 setting_commit_logs_encoding: Commit messages encoding
638 button_quote: Quote
638 button_quote: Quote
639 setting_sequential_project_identifiers: Generate sequential project identifiers
639 setting_sequential_project_identifiers: Generate sequential project identifiers
640 notice_unable_delete_version: Unable to delete version
640 notice_unable_delete_version: Unable to delete version
641 label_renamed: renamed
642 label_copied: copied
@@ -639,3 +639,5 enumeration_issue_priorities: Prioridade das tarefas
639 enumeration_doc_categories: Categorias de documento
639 enumeration_doc_categories: Categorias de documento
640 enumeration_activities: Atividades (time tracking)
640 enumeration_activities: Atividades (time tracking)
641 notice_unable_delete_version: Unable to delete version
641 notice_unable_delete_version: Unable to delete version
642 label_renamed: renamed
643 label_copied: copied
@@ -638,3 +638,5 setting_commit_logs_encoding: Commit messages encoding
638 button_quote: Quote
638 button_quote: Quote
639 setting_sequential_project_identifiers: Generate sequential project identifiers
639 setting_sequential_project_identifiers: Generate sequential project identifiers
640 notice_unable_delete_version: Unable to delete version
640 notice_unable_delete_version: Unable to delete version
641 label_renamed: renamed
642 label_copied: copied
@@ -638,3 +638,5 setting_commit_logs_encoding: Commit messages encoding
638 button_quote: Quote
638 button_quote: Quote
639 setting_sequential_project_identifiers: Generate sequential project identifiers
639 setting_sequential_project_identifiers: Generate sequential project identifiers
640 notice_unable_delete_version: Unable to delete version
640 notice_unable_delete_version: Unable to delete version
641 label_renamed: renamed
642 label_copied: copied
@@ -31,10 +31,10 activerecord_error_accepted: необходимо принять
31 activerecord_error_blank: необходимо заполнить
31 activerecord_error_blank: необходимо заполнить
32 activerecord_error_circular_dependency: Такая связь приведет к циклической зависимости
32 activerecord_error_circular_dependency: Такая связь приведет к циклической зависимости
33 activerecord_error_confirmation: ошибка в подтверждении
33 activerecord_error_confirmation: ошибка в подтверждении
34 activerecord_error_empty: необходимо заполнить
34 activerecord_error_empty: необходимо заполнить
35 activerecord_error_exclusion: зарезервировано
35 activerecord_error_exclusion: зарезервировано
36 activerecord_error_greater_than_start_date: должна быть позднее даты начала
36 activerecord_error_greater_than_start_date: должна быть позднее даты начала
37 activerecord_error_inclusion: нет в списке
37 activerecord_error_inclusion: нет в списке
38 activerecord_error_invalid: неверное значение
38 activerecord_error_invalid: неверное значение
39 activerecord_error_not_a_date: дата недействительна
39 activerecord_error_not_a_date: дата недействительна
40 activerecord_error_not_a_number: не является числом
40 activerecord_error_not_a_number: не является числом
@@ -76,7 +76,7 button_sort: Сортировать
76 button_submit: Принять
76 button_submit: Принять
77 button_test: Проверить
77 button_test: Проверить
78 button_unarchive: Разархивировать
78 button_unarchive: Разархивировать
79 button_uncheck_all: Очистить
79 button_uncheck_all: Очистить
80 button_unlock: Разблокировать
80 button_unlock: Разблокировать
81 button_unwatch: Не следить
81 button_unwatch: Не следить
82 button_update: Обновить
82 button_update: Обновить
@@ -85,13 +85,13 button_watch: Следить
85
85
86 default_activity_design: Проектирование
86 default_activity_design: Проектирование
87 default_activity_development: Разработка
87 default_activity_development: Разработка
88 default_doc_category_tech: Техническая документация
88 default_doc_category_tech: Техническая документация
89 default_doc_category_user: Документация пользователя
89 default_doc_category_user: Документация пользователя
90 default_issue_status_assigned: Назначен
90 default_issue_status_assigned: Назначен
91 default_issue_status_closed: Закрыт
91 default_issue_status_closed: Закрыт
92 default_issue_status_feedback: Обратная связь
92 default_issue_status_feedback: Обратная связь
93 default_issue_status_new: Новый
93 default_issue_status_new: Новый
94 default_issue_status_rejected: Отказ
94 default_issue_status_rejected: Отказ
95 default_issue_status_resolved: Заблокирован
95 default_issue_status_resolved: Заблокирован
96 default_priority_high: Высокий
96 default_priority_high: Высокий
97 default_priority_immediate: Немедленный
97 default_priority_immediate: Немедленный
@@ -113,7 +113,7 error_can_t_load_default_data: "Конфигурация по умолчанию
113 error_issue_not_found_in_project: Задача не была найдена или не прикреплена к этому проекту
113 error_issue_not_found_in_project: Задача не была найдена или не прикреплена к этому проекту
114 error_scm_annotate: "Данные отсутствуют или не могут быть подписаны."
114 error_scm_annotate: "Данные отсутствуют или не могут быть подписаны."
115 error_scm_command_failed: "Ошибка доступа к хранилищу: %s"
115 error_scm_command_failed: "Ошибка доступа к хранилищу: %s"
116 error_scm_not_found: Хранилилище не содержит записи и/или исправления.
116 error_scm_not_found: Хранилище не содержит записи и/или исправления.
117
117
118 field_account: Учетная запись
118 field_account: Учетная запись
119 field_activity: Деятельность
119 field_activity: Деятельность
@@ -132,7 +132,7 field_column_names: Колонки
132 field_comments_sorting: Отображение комментариев
132 field_comments_sorting: Отображение комментариев
133 field_comments: Комментарий
133 field_comments: Комментарий
134 field_created_on: Создан
134 field_created_on: Создан
135 field_default_value: Значение по умолчанию
135 field_default_value: Значение по умолчанию
136 field_delay: Отложить
136 field_delay: Отложить
137 field_description: Описание
137 field_description: Описание
138 field_done_ratio: Готовность в %%
138 field_done_ratio: Готовность в %%
@@ -173,17 +173,17 field_new_password: Новый пароль
173 field_notes: Примечания
173 field_notes: Примечания
174 field_onthefly: Создание пользователя на лету
174 field_onthefly: Создание пользователя на лету
175 field_parent_title: Родительская страница
175 field_parent_title: Родительская страница
176 field_parent: Родительский проект
176 field_parent: Родительский проект
177 field_password_confirmation: Подтверждение
177 field_password_confirmation: Подтверждение
178 field_password: Пароль
178 field_password: Пароль
179 field_port: Порт
179 field_port: Порт
180 field_possible_values: Возможные значения
180 field_possible_values: Возможные значения
181 field_priority: Приоритет
181 field_priority: Приоритет
182 field_project: Проект
182 field_project: Проект
183 field_redirect_existing_links: Перенаправить существующие ссылки
183 field_redirect_existing_links: Перенаправить существующие ссылки
184 field_regexp: Регулярное выражение
184 field_regexp: Регулярное выражение
185 field_role: Роль
185 field_role: Роль
186 field_searchable: Доступно для поиска
186 field_searchable: Доступно для поиска
187 field_spent_on: Дата
187 field_spent_on: Дата
188 field_start_date: Начало
188 field_start_date: Начало
189 field_start_page: Стартовая страница
189 field_start_page: Стартовая страница
@@ -212,7 +212,7 general_fmt_age_plural5: %d гг.
212 general_fmt_age_plural: %d лет
212 general_fmt_age_plural: %d лет
213 general_fmt_date: %%d.%%m.%%Y
213 general_fmt_date: %%d.%%m.%%Y
214 general_fmt_datetime: %%d.%%m.%%Y %%I:%%M %%p
214 general_fmt_datetime: %%d.%%m.%%Y %%I:%%M %%p
215 general_fmt_datetime_short: %%d %%b, %%H:%%M
215 general_fmt_datetime_short: %%d %%b, %%H:%%M
216 general_fmt_time: %%H:%%M
216 general_fmt_time: %%H:%%M
217 general_lang_name: 'Russian (Русский)'
217 general_lang_name: 'Russian (Русский)'
218 general_pdf_encoding: UTF-8
218 general_pdf_encoding: UTF-8
@@ -228,11 +228,11 gui_validation_error_plural: %d ошибок
228
228
229 label_activity: Активность
229 label_activity: Активность
230 label_add_another_file: Добавить ещё один файл
230 label_add_another_file: Добавить ещё один файл
231 label_added_time_by: Добавлено %s %s назад
231 label_added_time_by: Добавил(а) %s %s назад
232 label_added: добавлено
232 label_added: добавлено
233 label_add_note: Добавить замечание
233 label_add_note: Добавить замечание
234 label_administration: Администрирование
234 label_administration: Администрирование
235 label_age: Возраст
235 label_age: Возраст
236 label_ago: дней(я) назад
236 label_ago: дней(я) назад
237 label_all_time: всё время
237 label_all_time: всё время
238 label_all_words: Все слова
238 label_all_words: Все слова
@@ -251,8 +251,8 label_authentication: Аутентификация
251 label_auth_source_new: Новый режим аутентификации
251 label_auth_source_new: Новый режим аутентификации
252 label_auth_source_plural: Режимы аутентификации
252 label_auth_source_plural: Режимы аутентификации
253 label_auth_source: Режим аутентификации
253 label_auth_source: Режим аутентификации
254 label_blocked_by: заблокировано
254 label_blocked_by: заблокировано
255 label_blocks: блокирует
255 label_blocks: блокирует
256 label_board_new: Новый форум
256 label_board_new: Новый форум
257 label_board_plural: Форумы
257 label_board_plural: Форумы
258 label_board: Форум
258 label_board: Форум
@@ -266,10 +266,10 label_change_log: Журнал изменений
266 label_change_plural: Правки
266 label_change_plural: Правки
267 label_change_properties: Изменить свойства
267 label_change_properties: Изменить свойства
268 label_changes_details: Подробности по всем изменениям
268 label_changes_details: Подробности по всем изменениям
269 label_changeset_plural: Наборы изменений
269 label_changeset_plural: Хранилище
270 label_change_status: Изменить статус
270 label_change_status: Изменить статус
271 label_change_view_all: Просмотреть все изменения
271 label_change_view_all: Просмотреть все изменения
272 label_chronological_order: В хронологическом порядке
272 label_chronological_order: В хронологическом порядке
273 label_closed_issues_plural2: закрыто
273 label_closed_issues_plural2: закрыто
274 label_closed_issues_plural5: закрыто
274 label_closed_issues_plural5: закрыто
275 label_closed_issues_plural: закрыто
275 label_closed_issues_plural: закрыто
@@ -285,7 +285,7 label_commits_per_author: Изменений на пользователя
285 label_commits_per_month: Изменений в месяц
285 label_commits_per_month: Изменений в месяц
286 label_confirmation: Подтверждение
286 label_confirmation: Подтверждение
287 label_contains: содержит
287 label_contains: содержит
288 label_copy_workflow_from: Скопировать последовательность действий из
288 label_copy_workflow_from: Скопировать последовательность действий из
289 label_current_status: Текущий статус
289 label_current_status: Текущий статус
290 label_current_version: Текущая версия
290 label_current_version: Текущая версия
291 label_custom_field_new: Новое настраиваемое поле
291 label_custom_field_new: Новое настраиваемое поле
@@ -363,7 +363,7 label_issue_status: Статус задачи
363 label_issue_tracking: Ситуация по задачам
363 label_issue_tracking: Ситуация по задачам
364 label_issue_updated: Задача обновлена
364 label_issue_updated: Задача обновлена
365 label_issue_view_all: Просмотреть все задачи
365 label_issue_view_all: Просмотреть все задачи
366 label_issue_watchers: Следящие
366 label_issue_watchers: Наблюдатели
367 label_issue: Задача
367 label_issue: Задача
368 label_jump_to_a_project: Перейти к проекту...
368 label_jump_to_a_project: Перейти к проекту...
369 label_language_based: На основе языка
369 label_language_based: На основе языка
@@ -379,7 +379,7 label_last_week: последняя неделю
379 label_latest_revision_plural: Последние редакции
379 label_latest_revision_plural: Последние редакции
380 label_latest_revision: Последняя редакция
380 label_latest_revision: Последняя редакция
381 label_ldap_authentication: Авторизация с помощью LDAP
381 label_ldap_authentication: Авторизация с помощью LDAP
382 label_less_than_ago: менее, чем дней(я) назад
382 label_less_than_ago: менее, чем дней(я) назад
383 label_list: Список
383 label_list: Список
384 label_loading: Загрузка...
384 label_loading: Загрузка...
385 label_logged_as: Вошел как
385 label_logged_as: Вошел как
@@ -396,14 +396,14 label_message_posted: Сообщение добавлено
396 label_me: мне
396 label_me: мне
397 label_min_max_length: Минимальная - максимальная длина
397 label_min_max_length: Минимальная - максимальная длина
398 label_modification: %d изменение
398 label_modification: %d изменение
399 label_modification_plural2: %d изменений
399 label_modification_plural2: %d изменения
400 label_modification_plural5: %d изменений
400 label_modification_plural5: %d изменений
401 label_modification_plural: %d изменений
401 label_modification_plural: %d изменений
402 label_modified: изменено
402 label_modified: изменено
403 label_module_plural: Модули
403 label_module_plural: Модули
404 label_months_from: месяцев(ца) с
404 label_months_from: месяцев(ца) с
405 label_month: Месяц
405 label_month: Месяц
406 label_more_than_ago: более, чем дней(я) назад
406 label_more_than_ago: более, чем дней(я) назад
407 label_more: Больше
407 label_more: Больше
408 label_my_account: Моя учетная запись
408 label_my_account: Моя учетная запись
409 label_my_page: Моя страница
409 label_my_page: Моя страница
@@ -420,7 +420,7 label_next: Следующий
420 label_nobody: никто
420 label_nobody: никто
421 label_no_change_option: (Нет изменений)
421 label_no_change_option: (Нет изменений)
422 label_no_data: Нет данных для отображения
422 label_no_data: Нет данных для отображения
423 label_none: отсутствует
423 label_none: отсутствует
424 label_not_contains: не содержит
424 label_not_contains: не содержит
425 label_not_equals: не соответствует
425 label_not_equals: не соответствует
426 label_on: 'из'
426 label_on: 'из'
@@ -432,7 +432,7 label_optional_description: Описание (опционально)
432 label_options: Опции
432 label_options: Опции
433 label_overall_activity: Сводная активность
433 label_overall_activity: Сводная активность
434 label_overview: Просмотр
434 label_overview: Просмотр
435 label_password_lost: Восстановление пароля
435 label_password_lost: Восстановление пароля
436 label_permissions_report: Отчет о правах доступа
436 label_permissions_report: Отчет о правах доступа
437 label_permissions: Права доступа
437 label_permissions: Права доступа
438 label_per_page: На страницу
438 label_per_page: На страницу
@@ -456,7 +456,7 label_query_new: Новый запрос
456 label_query_plural: Сохраненные запросы
456 label_query_plural: Сохраненные запросы
457 label_query: Сохраненный запрос
457 label_query: Сохраненный запрос
458 label_read: Чтение...
458 label_read: Чтение...
459 label_registered_on: Зарегистрирован(а)
459 label_registered_on: Зарегистрирован(а)
460 label_register: Регистрация
460 label_register: Регистрация
461 label_registration_activation_by_email: активация учетных записей по email
461 label_registration_activation_by_email: активация учетных записей по email
462 label_registration_automatic_activation: автоматическая активация учетных записей
462 label_registration_automatic_activation: автоматическая активация учетных записей
@@ -475,7 +475,7 label_result_plural: Результаты
475 label_reverse_chronological_order: В обратном порядке
475 label_reverse_chronological_order: В обратном порядке
476 label_revision_plural: Редакции
476 label_revision_plural: Редакции
477 label_revision: Редакция
477 label_revision: Редакция
478 label_roadmap_due_in: Вовремя
478 label_roadmap_due_in: Вовремя
479 label_roadmap_no_issues: Нет задач для данной версии
479 label_roadmap_no_issues: Нет задач для данной версии
480 label_roadmap_overdue: %s опоздание
480 label_roadmap_overdue: %s опоздание
481 label_roadmap: Оперативный план
481 label_roadmap: Оперативный план
@@ -499,7 +499,7 label_spent_time: Затраченное время
499 label_start_to_end: с начала к концу
499 label_start_to_end: с начала к концу
500 label_start_to_start: с начала к началу
500 label_start_to_start: с начала к началу
501 label_statistics: Статистика
501 label_statistics: Статистика
502 label_stay_logged_in: Оставаться в системе
502 label_stay_logged_in: Оставаться в системе
503 label_string: Текст
503 label_string: Текст
504 label_subproject_plural: Подпроекты
504 label_subproject_plural: Подпроекты
505 label_text: Длинный текст
505 label_text: Длинный текст
@@ -529,7 +529,7 label_version_plural: Версии
529 label_version: Версия
529 label_version: Версия
530 label_view_diff: Просмотреть отличия
530 label_view_diff: Просмотреть отличия
531 label_view_revisions: Просмотреть редакции
531 label_view_revisions: Просмотреть редакции
532 label_watched_issues: Отслеживаемые задачи
532 label_watched_issues: Отслеживаемые задачи
533 label_week: Неделя
533 label_week: Неделя
534 label_wiki_edit_plural: Редактирования Wiki
534 label_wiki_edit_plural: Редактирования Wiki
535 label_wiki_edit: Редактирование Wiki
535 label_wiki_edit: Редактирование Wiki
@@ -545,18 +545,18 mail_body_account_information_external: Вы можете использоват
545 mail_body_account_information: Информация о Вашей учетной записи
545 mail_body_account_information: Информация о Вашей учетной записи
546 mail_body_lost_password: 'Для изменения пароля зайдите по следующей ссылке:'
546 mail_body_lost_password: 'Для изменения пароля зайдите по следующей ссылке:'
547 mail_body_register: 'Для активации учетной записи зайдите по следующей ссылке:'
547 mail_body_register: 'Для активации учетной записи зайдите по следующей ссылке:'
548 mail_body_reminder: "%d назначенных на вас задач на следующие %d дней:"
548 mail_body_reminder: "%d назначенных на Вас задач на следующие %d дней:"
549 mail_subject_account_activation_request: Запрос на активацию пользователя в системе %s
549 mail_subject_account_activation_request: Запрос на активацию пользователя в системе %s
550 mail_subject_lost_password: Ваш %s пароль
550 mail_subject_lost_password: Ваш %s пароль
551 mail_subject_register: Активация учетной записи %s
551 mail_subject_register: Активация учетной записи %s
552 mail_subject_reminder: "%d назначенных на вас задач в ближайшие дни"
552 mail_subject_reminder: "%d назначенных на Вас задач в ближайшие дни"
553
553
554 notice_account_activated: Ваша учетная запись активирована. Вы можете войти.
554 notice_account_activated: Ваша учетная запись активирована. Вы можете войти.
555 notice_account_invalid_creditentials: Неправильное имя пользователя или пароль
555 notice_account_invalid_creditentials: Неправильное имя пользователя или пароль
556 notice_account_lost_email_sent: Вам отправлено письмо с инструкциями по выбору нового пароля.
556 notice_account_lost_email_sent: Вам отправлено письмо с инструкциями по выбору нового пароля.
557 notice_account_password_updated: Пароль успешно обновлен.
557 notice_account_password_updated: Пароль успешно обновлен.
558 notice_account_pending: "Ваша учетная запись уже создан и ожидает подтверждения администратора."
558 notice_account_pending: "Ваша учетная запись уже создана и ожидает подтверждения администратора."
559 notice_account_register_done: Учетная запись успешно создана. Для активации Вашей учетной записи зайдите по ссылке, которая выслана вам по электронной почте.
559 notice_account_register_done: Учетная запись успешно создана. Для активации Вашей учетной записи зайдите по ссылке, которая выслана Вам по электронной почте.
560 notice_account_unknown_email: Неизвестный пользователь.
560 notice_account_unknown_email: Неизвестный пользователь.
561 notice_account_updated: Учетная запись успешно обновлена.
561 notice_account_updated: Учетная запись успешно обновлена.
562 notice_account_wrong_password: Неверный пароль
562 notice_account_wrong_password: Неверный пароль
@@ -569,14 +569,14 notice_feeds_access_key_reseted: Ваш ключ доступа RSS был пе
569 notice_file_not_found: Страница, на которую Вы пытаетесь зайти, не существует или удалена.
569 notice_file_not_found: Страница, на которую Вы пытаетесь зайти, не существует или удалена.
570 notice_locking_conflict: Информация обновлена другим пользователем.
570 notice_locking_conflict: Информация обновлена другим пользователем.
571 notice_no_issue_selected: "Не выбрано ни одной задачи! Пожалуйста, отметьте задачи, которые Вы хотите отредактировать."
571 notice_no_issue_selected: "Не выбрано ни одной задачи! Пожалуйста, отметьте задачи, которые Вы хотите отредактировать."
572 notice_not_authorized: У вас нет прав для посещения данной страницы.
572 notice_not_authorized: У Вас нет прав для посещения данной страницы.
573 notice_successful_connection: Подключение успешно установлено.
573 notice_successful_connection: Подключение успешно установлено.
574 notice_successful_create: Создание успешно завершено.
574 notice_successful_create: Создание успешно завершено.
575 notice_successful_delete: Удаление успешно завершено.
575 notice_successful_delete: Удаление успешно завершено.
576 notice_successful_update: Обновление успешно завершено.
576 notice_successful_update: Обновление успешно завершено.
577 notice_unable_delete_version: Невозможно удалить версию.
577 notice_unable_delete_version: Невозможно удалить версию.
578
578
579 project_module_boards: Форумы
579 project_module_boards: Форумы
580 project_module_documents: Документы
580 project_module_documents: Документы
581 project_module_files: Файлы
581 project_module_files: Файлы
582 project_module_issue_tracking: Задачи
582 project_module_issue_tracking: Задачи
@@ -586,14 +586,14 project_module_time_tracking: Учет времени
586 project_module_wiki: Wiki
586 project_module_wiki: Wiki
587
587
588 setting_activity_days_default: Количество дней, отображаемых в Активности
588 setting_activity_days_default: Количество дней, отображаемых в Активности
589 setting_app_subtitle: Подзаголовок приложения
589 setting_app_subtitle: Подзаголовок приложения
590 setting_app_title: Название приложения
590 setting_app_title: Название приложения
591 setting_attachment_max_size: Максимальный размер вложения
591 setting_attachment_max_size: Максимальный размер вложения
592 setting_autofetch_changesets: Автоматически следить за изменениями хранилища
592 setting_autofetch_changesets: Автоматически следить за изменениями хранилища
593 setting_autologin: Автоматический вход
593 setting_autologin: Автоматический вход
594 setting_bcc_recipients: Использовать скрытые списки (bcc)
594 setting_bcc_recipients: Использовать скрытые списки (bcc)
595 setting_commit_fix_keywords: Назначение ключевых слов
595 setting_commit_fix_keywords: Назначение ключевых слов
596 setting_commit_logs_encoding: Кодировка добавляемых сообщений
596 setting_commit_logs_encoding: Кодировка комментариев в хранилище
597 setting_commit_ref_keywords: Ключевые слова для поиска
597 setting_commit_ref_keywords: Ключевые слова для поиска
598 setting_cross_project_issue_relations: Разрешить пересечение задач по проектам
598 setting_cross_project_issue_relations: Разрешить пересечение задач по проектам
599 setting_date_format: Формат даты
599 setting_date_format: Формат даты
@@ -617,15 +617,15 setting_self_registration: Возможна саморегистрация
617 setting_sequential_project_identifiers: Генерировать последовательные идентификаторы проектов
617 setting_sequential_project_identifiers: Генерировать последовательные идентификаторы проектов
618 setting_sys_api_enabled: Разрешить WS для управления хранилищем
618 setting_sys_api_enabled: Разрешить WS для управления хранилищем
619 setting_text_formatting: Форматирование текста
619 setting_text_formatting: Форматирование текста
620 setting_time_format: Формат времени
620 setting_time_format: Формат времени
621 setting_user_format: Формат отображения имени
621 setting_user_format: Формат отображения имени
622 setting_welcome_text: Текст приветствия
622 setting_welcome_text: Текст приветствия
623 setting_wiki_compression: Сжатие истории Wiki
623 setting_wiki_compression: Сжатие истории Wiki
624
624
625 status_active: активен
625 status_active: активен
626 status_locked: закрыт
626 status_locked: закрыт
627
628 status_registered: зарегистрирован
627 status_registered: зарегистрирован
628
629 text_are_you_sure: Подтвердите
629 text_are_you_sure: Подтвердите
630 text_assign_time_entries_to_project: Прикрепить зарегистрированное время к проекту
630 text_assign_time_entries_to_project: Прикрепить зарегистрированное время к проекту
631 text_caracters_maximum: Максимум %d символов(а).
631 text_caracters_maximum: Максимум %d символов(а).
@@ -640,7 +640,7 text_enumeration_destroy_question: '%d объект(а,ов) связаны с
640 text_file_repository_writable: Хранилище с доступом на запись
640 text_file_repository_writable: Хранилище с доступом на запись
641 text_issue_added: По задаче %s был создан отчет (%s).
641 text_issue_added: По задаче %s был создан отчет (%s).
642 text_issue_category_destroy_assignments: Удалить назначения категории
642 text_issue_category_destroy_assignments: Удалить назначения категории
643 text_issue_category_destroy_question: Несколько задач (%d) назначено в данную категорию. Что вы хотите предпринять?
643 text_issue_category_destroy_question: Несколько задач (%d) назначено в данную категорию. Что Вы хотите предпринять?
644 text_issue_category_reassign_to: Переназначить задачи для данной категории
644 text_issue_category_reassign_to: Переназначить задачи для данной категории
645 text_issues_destroy_confirmation: 'Вы уверены, что хотите удалить выбранные задачи?'
645 text_issues_destroy_confirmation: 'Вы уверены, что хотите удалить выбранные задачи?'
646 text_issues_ref_in_commit_messages: Сопоставление и изменение статуса задач исходя из текста сообщений
646 text_issues_ref_in_commit_messages: Сопоставление и изменение статуса задач исходя из текста сообщений
@@ -666,7 +666,9 text_tip_task_begin_end_day: начало задачи и окончание е
666 text_tip_task_end_day: дата завершения задачи
666 text_tip_task_end_day: дата завершения задачи
667 text_tracker_no_workflow: Для этого трекера последовательность действий не определена
667 text_tracker_no_workflow: Для этого трекера последовательность действий не определена
668 text_unallowed_characters: Запрещенные символы
668 text_unallowed_characters: Запрещенные символы
669 text_user_mail_option: "Для невыбранных проектов, Вы будете получать уведомления только о том что просматриваете или в чем участвуете (например, вопросы автором которых вы являетесь или которые вам назначены)."
669 text_user_mail_option: "Для невыбранных проектов, Вы будете получать уведомления только о том что просматриваете или в чем участвуете (например, вопросы, автором которых Вы являетесь или которые Вам назначены)."
670 text_user_wrote: '%s написал(а):'
670 text_user_wrote: '%s написал(а):'
671 text_wiki_destroy_confirmation: Вы уверены, что хотите удалить данную вики и все содержимое?
671 text_wiki_destroy_confirmation: Вы уверены, что хотите удалить данную Wiki и все содержимое?
672 text_workflow_edit: Выберите роль и трекер для редактирования последовательности состояний
672 text_workflow_edit: Выберите роль и трекер для редактирования последовательности состояний
673 label_renamed: renamed
674 label_copied: copied
@@ -639,3 +639,5 setting_commit_logs_encoding: Commit messages encoding
639 button_quote: Quote
639 button_quote: Quote
640 setting_sequential_project_identifiers: Generate sequential project identifiers
640 setting_sequential_project_identifiers: Generate sequential project identifiers
641 notice_unable_delete_version: Unable to delete version
641 notice_unable_delete_version: Unable to delete version
642 label_renamed: renamed
643 label_copied: copied
@@ -639,3 +639,5 setting_commit_logs_encoding: Commit messages encoding
639 button_quote: Quote
639 button_quote: Quote
640 setting_sequential_project_identifiers: Generate sequential project identifiers
640 setting_sequential_project_identifiers: Generate sequential project identifiers
641 notice_unable_delete_version: Unable to delete version
641 notice_unable_delete_version: Unable to delete version
642 label_renamed: renamed
643 label_copied: copied
@@ -641,3 +641,5 setting_commit_logs_encoding: Commit messages encoding
641 button_quote: Quote
641 button_quote: Quote
642 setting_sequential_project_identifiers: Generate sequential project identifiers
642 setting_sequential_project_identifiers: Generate sequential project identifiers
643 notice_unable_delete_version: Unable to delete version
643 notice_unable_delete_version: Unable to delete version
644 label_renamed: renamed
645 label_copied: copied
@@ -639,3 +639,5 setting_mail_handler_api_key: API key
639 setting_commit_logs_encoding: Commit messages encoding
639 setting_commit_logs_encoding: Commit messages encoding
640 general_csv_decimal_separator: '.'
640 general_csv_decimal_separator: '.'
641 notice_unable_delete_version: Unable to delete version
641 notice_unable_delete_version: Unable to delete version
642 label_renamed: renamed
643 label_copied: copied
@@ -640,3 +640,5 setting_commit_logs_encoding: Commit messages encoding
640 button_quote: Quote
640 button_quote: Quote
641 setting_sequential_project_identifiers: Generate sequential project identifiers
641 setting_sequential_project_identifiers: Generate sequential project identifiers
642 notice_unable_delete_version: Unable to delete version
642 notice_unable_delete_version: Unable to delete version
643 label_renamed: renamed
644 label_copied: copied
@@ -77,6 +77,7 notice_failed_to_save_issues: " %d 個項目儲存失敗 (總共選取 %d 個項
77 notice_no_issue_selected: "未選擇任何項目!請勾選您想要編輯的項目。"
77 notice_no_issue_selected: "未選擇任何項目!請勾選您想要編輯的項目。"
78 notice_account_pending: "您的帳號已經建立,正在等待管理員的審核。"
78 notice_account_pending: "您的帳號已經建立,正在等待管理員的審核。"
79 notice_default_data_loaded: 預設組態已載入成功。
79 notice_default_data_loaded: 預設組態已載入成功。
80 notice_unable_delete_version: 無法刪除版本。
80
81
81 error_can_t_load_default_data: "無法載入預設組態: %s"
82 error_can_t_load_default_data: "無法載入預設組態: %s"
82 error_scm_not_found: SCM 儲存庫中找不到這個專案或版本。
83 error_scm_not_found: SCM 儲存庫中找不到這個專案或版本。
@@ -638,4 +639,5 default_activity_development: 開發
638 enumeration_issue_priorities: 項目優先權
639 enumeration_issue_priorities: 項目優先權
639 enumeration_doc_categories: 文件分類
640 enumeration_doc_categories: 文件分類
640 enumeration_activities: 活動 (時間追蹤)
641 enumeration_activities: 活動 (時間追蹤)
641 notice_unable_delete_version: Unable to delete version
642 label_renamed: renamed
643 label_copied: copied
@@ -77,6 +77,7 notice_failed_to_save_issues: "%d 个问题保存失败(共选择 %d 个问题
77 notice_no_issue_selected: "未选择任何问题!请选择您要编辑的问题。"
77 notice_no_issue_selected: "未选择任何问题!请选择您要编辑的问题。"
78 notice_account_pending: "您的帐号已被成功创建,正在等待管理员的审核。"
78 notice_account_pending: "您的帐号已被成功创建,正在等待管理员的审核。"
79 notice_default_data_loaded: 成功载入默认设置。
79 notice_default_data_loaded: 成功载入默认设置。
80 notice_unable_delete_version: 无法删除版本
80
81
81 error_can_t_load_default_data: "无法载入默认设置:%s"
82 error_can_t_load_default_data: "无法载入默认设置:%s"
82 error_scm_not_found: "版本库中不存在该条目和(或)其修订版本。"
83 error_scm_not_found: "版本库中不存在该条目和(或)其修订版本。"
@@ -219,6 +220,7 setting_display_subprojects_issues: 在项目页面上默认显示子项目的
219 setting_enabled_scm: 启用 SCM
220 setting_enabled_scm: 启用 SCM
220 setting_mail_handler_api_enabled: 启用用于接收邮件的Web Service
221 setting_mail_handler_api_enabled: 启用用于接收邮件的Web Service
221 setting_mail_handler_api_key: API key
222 setting_mail_handler_api_key: API key
223 setting_sequential_project_identifiers: 顺序产生项目标识
222
224
223 project_module_issue_tracking: 问题跟踪
225 project_module_issue_tracking: 问题跟踪
224 project_module_time_tracking: 时间跟踪
226 project_module_time_tracking: 时间跟踪
@@ -561,6 +563,7 button_copy: 复制
561 button_annotate: 追溯
563 button_annotate: 追溯
562 button_update: 更新
564 button_update: 更新
563 button_configure: 配置
565 button_configure: 配置
566 button_quote: 引用
564
567
565 status_active: 活动的
568 status_active: 活动的
566 status_registered: 已注册
569 status_registered: 已注册
@@ -636,6 +639,5 default_activity_development: 开发
636 enumeration_issue_priorities: 问题优先级
639 enumeration_issue_priorities: 问题优先级
637 enumeration_doc_categories: 文档类别
640 enumeration_doc_categories: 文档类别
638 enumeration_activities: 活动(时间跟踪)
641 enumeration_activities: 活动(时间跟踪)
639 button_quote: Quote
642 label_renamed: renamed
640 setting_sequential_project_identifiers: Generate sequential project identifiers
643 label_copied: copied
641 notice_unable_delete_version: Unable to delete version
@@ -788,10 +788,10 class RedCloth3 < String
788 ":
788 ":
789 ([\w\/]\S+?) # $url
789 ([\w\/]\S+?) # $url
790 (\/)? # $slash
790 (\/)? # $slash
791 ([^\w\/;]*?) # $post
791 ([^\w\=\/;\(\)]*?) # $post
792 (?=<|\s|$)
792 (?=<|\s|$)
793 /x
793 /x
794
794 #"
795 def inline_textile_link( text )
795 def inline_textile_link( text )
796 text.gsub!( LINK_RE ) do |m|
796 text.gsub!( LINK_RE ) do |m|
797 pre,atts,text,title,url,slash,post = $~[1..7]
797 pre,atts,text,title,url,slash,post = $~[1..7]
@@ -799,6 +799,12 class RedCloth3 < String
799 url, url_title = check_refs( url )
799 url, url_title = check_refs( url )
800 title ||= url_title
800 title ||= url_title
801
801
802 # Idea below : an URL with unbalanced parethesis and
803 # ending by ')' is put into external parenthesis
804 if ( url[-1]==?) and ((url.count("(") - url.count(")")) < 0 ) )
805 url=url[0..-2] # discard closing parenth from url
806 post = ")"+post # add closing parenth to post
807 end
802 atts = pba( atts )
808 atts = pba( atts )
803 atts = " href=\"#{ url }#{ slash }\"#{ atts }"
809 atts = " href=\"#{ url }#{ slash }\"#{ atts }"
804 atts << " title=\"#{ title }\"" if title
810 atts << " title=\"#{ title }\"" if title
@@ -144,7 +144,7 module Redmine
144 (\S+?) # url
144 (\S+?) # url
145 (\/)? # slash
145 (\/)? # slash
146 )
146 )
147 ([^\w\=\/;]*?) # post
147 ([^\w\=\/;\(\)]*?) # post
148 (?=<|\s|$)
148 (?=<|\s|$)
149 }x unless const_defined?(:AUTO_LINK_RE)
149 }x unless const_defined?(:AUTO_LINK_RE)
150
150
@@ -156,7 +156,13 module Redmine
156 # don't replace URL's that are already linked
156 # don't replace URL's that are already linked
157 # and URL's prefixed with ! !> !< != (textile images)
157 # and URL's prefixed with ! !> !< != (textile images)
158 all
158 all
159 else
159 else
160 # Idea below : an URL with unbalanced parethesis and
161 # ending by ')' is put into external parenthesis
162 if ( url[-1]==?) and ((url.count("(") - url.count(")")) < 0 ) )
163 url=url[0..-2] # discard closing parenth from url
164 post = ")"+post # add closing parenth to post
165 end
160 %(#{leading}<a class="external" href="#{proto=="www."?"http://www.":proto}#{url}">#{proto + url}</a>#{post})
166 %(#{leading}<a class="external" href="#{proto=="www."?"http://www.":proto}#{url}">#{proto + url}</a>#{post})
161 end
167 end
162 end
168 end
@@ -582,7 +582,6 vertical-align: middle;
582 .icon-mypage { background-image: url(../images/user_page.png); }
582 .icon-mypage { background-image: url(../images/user_page.png); }
583 .icon-admin { background-image: url(../images/admin.png); }
583 .icon-admin { background-image: url(../images/admin.png); }
584 .icon-projects { background-image: url(../images/projects.png); }
584 .icon-projects { background-image: url(../images/projects.png); }
585 .icon-logout { background-image: url(../images/logout.png); }
586 .icon-help { background-image: url(../images/help.png); }
585 .icon-help { background-image: url(../images/help.png); }
587 .icon-attachment { background-image: url(../images/attachment.png); }
586 .icon-attachment { background-image: url(../images/attachment.png); }
588 .icon-index { background-image: url(../images/index.png); }
587 .icon-index { background-image: url(../images/index.png); }
@@ -60,15 +60,9
60 .jstb_del {
60 .jstb_del {
61 background-image: url(../images/jstoolbar/bt_del.png);
61 background-image: url(../images/jstoolbar/bt_del.png);
62 }
62 }
63 .jstb_quote {
64 background-image: url(../images/jstoolbar/bt_quote.png);
65 }
66 .jstb_code {
63 .jstb_code {
67 background-image: url(../images/jstoolbar/bt_code.png);
64 background-image: url(../images/jstoolbar/bt_code.png);
68 }
65 }
69 .jstb_br {
70 background-image: url(../images/jstoolbar/bt_br.png);
71 }
72 .jstb_h1 {
66 .jstb_h1 {
73 background-image: url(../images/jstoolbar/bt_h1.png);
67 background-image: url(../images/jstoolbar/bt_h1.png);
74 }
68 }
@@ -1,4 +1,32
1
1
2 div.changeset-changes ul { margin: 0; padding: 0; }
3 div.changeset-changes ul > ul { margin-left: 18px; padding: 0; }
4
5 li.change {
6 list-style-type:none;
7 background-image: url(../images/bullet_black.png);
8 background-position: 1px 1px;
9 background-repeat: no-repeat;
10 padding-top: 1px;
11 padding-bottom: 1px;
12 padding-left: 20px;
13 margin: 0;
14 }
15 li.change.folder { background-image: url(../images/folder_open.png); }
16 li.change.folder.change-A { background-image: url(../images/folder_open_add.png); }
17 li.change.folder.change-M { background-image: url(../images/folder_open_orange.png); }
18 li.change.change-A { background-image: url(../images/bullet_add.png); }
19 li.change.change-M { background-image: url(../images/bullet_orange.png); }
20 li.change.change-C { background-image: url(../images/bullet_blue.png); }
21 li.change.change-R { background-image: url(../images/bullet_purple.png); }
22 li.change.change-D { background-image: url(../images/bullet_delete.png); }
23
24 li.change .copied-from { font-style: italic; color: #999; font-size: 0.9em; }
25 li.change .copied-from:before { content: " - "}
26
27 #changes-legend { float: right; font-size: 0.8em; margin: 0; }
28 #changes-legend li { float: left; background-position: 5px 0; }
29
2 table.filecontent { border: 1px solid #ccc; border-collapse: collapse; width:98%; }
30 table.filecontent { border: 1px solid #ccc; border-collapse: collapse; width:98%; }
3 table.filecontent th { border: 1px solid #ccc; background-color: #eee; }
31 table.filecontent th { border: 1px solid #ccc; background-color: #eee; }
4 table.filecontent th.filename { background-color: #e4e4d4; text-align: left; padding: 0.2em;}
32 table.filecontent th.filename { background-color: #e4e4d4; text-align: left; padding: 0.2em;}
@@ -125,16 +125,18 class RepositoriesSubversionControllerTest < Test::Unit::TestCase
125 get :revision, :id => 1, :rev => 2
125 get :revision, :id => 1, :rev => 2
126 assert_response :success
126 assert_response :success
127 assert_template 'revision'
127 assert_template 'revision'
128 assert_tag :tag => 'tr',
128 assert_tag :tag => 'ul',
129 :child => { :tag => 'td',
129 :child => { :tag => 'li',
130 # link to the entry at rev 2
130 # link to the entry at rev 2
131 :child => { :tag => 'a', :attributes => {:href => 'repositories/entry/ecookbook/test/some/path/in/the/repo?rev=2'},
131 :child => { :tag => 'a',
132 :content => %r{/test/some/path/in/the/repo} }
132 :attributes => {:href => '/repositories/entry/ecookbook/test/some/path/in/the/repo?rev=2'},
133 },
133 :content => 'repo',
134 :child => { :tag => 'td',
134 # link to partial diff
135 # link to partial diff
135 :sibling => { :tag => 'a',
136 :child => { :tag => 'a', :attributes => { :href => '/repositories/diff/ecookbook/test/some/path/in/the/repo?rev=2' } }
136 :attributes => { :href => '/repositories/diff/ecookbook/test/some/path/in/the/repo?rev=2' }
137 }
137 }
138 }
139 }
138 end
140 end
139
141
140 def test_revision_with_repository_pointing_to_a_subdirectory
142 def test_revision_with_repository_pointing_to_a_subdirectory
@@ -145,11 +147,18 class RepositoriesSubversionControllerTest < Test::Unit::TestCase
145 get :revision, :id => 1, :rev => 2
147 get :revision, :id => 1, :rev => 2
146 assert_response :success
148 assert_response :success
147 assert_template 'revision'
149 assert_template 'revision'
148 assert_tag :tag => 'tr',
150 assert_tag :tag => 'ul',
149 :child => { :tag => 'td', :content => %r{/test/some/path/in/the/repo} },
151 :child => { :tag => 'li',
150 :child => { :tag => 'td',
152 # link to the entry at rev 2
151 :child => { :tag => 'a', :attributes => { :href => '/repositories/diff/ecookbook/path/in/the/repo?rev=2' } }
153 :child => { :tag => 'a',
152 }
154 :attributes => {:href => '/repositories/entry/ecookbook/path/in/the/repo?rev=2'},
155 :content => 'repo',
156 # link to partial diff
157 :sibling => { :tag => 'a',
158 :attributes => { :href => '/repositories/diff/ecookbook/path/in/the/repo?rev=2' }
159 }
160 }
161 }
153 end
162 end
154
163
155 def test_diff
164 def test_diff
@@ -38,10 +38,18 class ApplicationHelperTest < HelperTestCase
38 'This is a link: http://foo.bar.' => 'This is a link: <a class="external" href="http://foo.bar">http://foo.bar</a>.',
38 'This is a link: http://foo.bar.' => 'This is a link: <a class="external" href="http://foo.bar">http://foo.bar</a>.',
39 'A link (eg. http://foo.bar).' => 'A link (eg. <a class="external" href="http://foo.bar">http://foo.bar</a>).',
39 'A link (eg. http://foo.bar).' => 'A link (eg. <a class="external" href="http://foo.bar">http://foo.bar</a>).',
40 'http://foo.bar/foo.bar#foo.bar.' => '<a class="external" href="http://foo.bar/foo.bar#foo.bar">http://foo.bar/foo.bar#foo.bar</a>.',
40 'http://foo.bar/foo.bar#foo.bar.' => '<a class="external" href="http://foo.bar/foo.bar#foo.bar">http://foo.bar/foo.bar#foo.bar</a>.',
41 'http://www.foo.bar/Test_(foobar)' => '<a class="external" href="http://www.foo.bar/Test_(foobar)">http://www.foo.bar/Test_(foobar)</a>',
42 '(see inline link : http://www.foo.bar/Test_(foobar))' => '(see inline link : <a class="external" href="http://www.foo.bar/Test_(foobar)">http://www.foo.bar/Test_(foobar)</a>)',
43 '(see inline link : http://www.foo.bar/Test)' => '(see inline link : <a class="external" href="http://www.foo.bar/Test">http://www.foo.bar/Test</a>)',
44 '(see inline link : http://www.foo.bar/Test).' => '(see inline link : <a class="external" href="http://www.foo.bar/Test">http://www.foo.bar/Test</a>).',
45 '(see "inline link":http://www.foo.bar/Test_(foobar))' => '(see <a href="http://www.foo.bar/Test_(foobar)" class="external">inline link</a>)',
46 '(see "inline link":http://www.foo.bar/Test)' => '(see <a href="http://www.foo.bar/Test" class="external">inline link</a>)',
47 '(see "inline link":http://www.foo.bar/Test).' => '(see <a href="http://www.foo.bar/Test" class="external">inline link</a>).',
41 'www.foo.bar' => '<a class="external" href="http://www.foo.bar">www.foo.bar</a>',
48 'www.foo.bar' => '<a class="external" href="http://www.foo.bar">www.foo.bar</a>',
42 'http://foo.bar/page?p=1&t=z&s=' => '<a class="external" href="http://foo.bar/page?p=1&#38;t=z&#38;s=">http://foo.bar/page?p=1&#38;t=z&#38;s=</a>',
49 'http://foo.bar/page?p=1&t=z&s=' => '<a class="external" href="http://foo.bar/page?p=1&#38;t=z&#38;s=">http://foo.bar/page?p=1&#38;t=z&#38;s=</a>',
43 'http://foo.bar/page#125' => '<a class="external" href="http://foo.bar/page#125">http://foo.bar/page#125</a>',
50 'http://foo.bar/page#125' => '<a class="external" href="http://foo.bar/page#125">http://foo.bar/page#125</a>',
44 'http://foo@www.bar.com' => '<a class="external" href="http://foo@www.bar.com">http://foo@www.bar.com</a>',
51 'http://foo@www.bar.com' => '<a class="external" href="http://foo@www.bar.com">http://foo@www.bar.com</a>',
52 'http://foo:bar@www.bar.com' => '<a class="external" href="http://foo:bar@www.bar.com">http://foo:bar@www.bar.com</a>',
45 'ftp://foo.bar' => '<a class="external" href="ftp://foo.bar">ftp://foo.bar</a>',
53 'ftp://foo.bar' => '<a class="external" href="ftp://foo.bar">ftp://foo.bar</a>',
46 }
54 }
47 to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
55 to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
General Comments 0
You need to be logged in to leave comments. Login now