]> source.dussan.org Git - redmine.git/commitdiff
Merged r2119 to r2127 from trunk.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 14 Dec 2008 15:32:11 +0000 (15:32 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 14 Dec 2008 15:32:11 +0000 (15:32 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.8-stable@2133 e93f8b46-1217-0410-a6f0-8f06a7374b81

21 files changed:
app/controllers/application.rb
app/controllers/documents_controller.rb
app/controllers/journals_controller.rb
app/helpers/application_helper.rb
app/models/document.rb
app/models/enumeration.rb
app/models/user.rb
app/views/journals/_notes_form.rhtml
app/views/journals/update.rjs
lang/de.yml
lang/es.yml
lang/hu.yml
lang/ko.yml
lang/ru.yml
lang/zh-tw.yml
lang/zh.yml
test/functional/documents_controller_test.rb
test/integration/account_test.rb
test/unit/document_test.rb [new file with mode: 0644]
test/unit/enumeration_test.rb
test/unit/user_test.rb

index 36123ba4757e92cf7b185beb69b48f83e7056520..7d89e21631e2bcb678b167be87213fb7345179d0 100644 (file)
@@ -126,10 +126,14 @@ class ApplicationController < ActionController::Base
   def redirect_back_or_default(default)
     back_url = CGI.unescape(params[:back_url].to_s)
     if !back_url.blank?
-      uri = URI.parse(back_url)
-      # do not redirect user to another host or to the login or register page
-      if (uri.relative? || (uri.host == request.host)) && !uri.path.match(%r{/(login|account/register)})
-        redirect_to(back_url) and return
+      begin
+        uri = URI.parse(back_url)
+        # do not redirect user to another host or to the login or register page
+        if (uri.relative? || (uri.host == request.host)) && !uri.path.match(%r{/(login|account/register)})
+          redirect_to(back_url) and return
+        end
+      rescue URI::InvalidURIError
+        # redirect to default
       end
     end
     redirect_to default
index dbf9cd8e5d7b1f2d91534f16f82c2af065bb3957..aebd48bec4afe5a6a00413d777d099531fb428b5 100644 (file)
@@ -35,6 +35,7 @@ class DocumentsController < ApplicationController
     else
       @grouped = documents.group_by(&:category)
     end
+    @document = @project.documents.build
     render :layout => false if request.xhr?
   end
   
index 6df54f09881868c39b646abf58605c0b44871e39..d479855f2c4455a6802e2bc02364c6c71cc25c1d 100644 (file)
@@ -22,6 +22,7 @@ class JournalsController < ApplicationController
     if request.post?
       @journal.update_attributes(:notes => params[:notes]) if params[:notes]
       @journal.destroy if @journal.details.empty? && @journal.notes.blank?
+      call_hook(:controller_journals_edit_post, { :journal => @journal, :params => params})
       respond_to do |format|
         format.html { redirect_to :controller => 'issues', :action => 'show', :id => @journal.journalized_id }
         format.js { render :action => 'update' }
index 0e02e56924f0a64c811830caeba79648cf027dff..37231cb57d5619c48aaa80def63d16ef10e4fd36 100644 (file)
@@ -18,6 +18,7 @@
 require 'coderay'
 require 'coderay/helpers/file_type'
 require 'forwardable'
+require 'cgi'
 
 module ApplicationHelper
   include Redmine::WikiFormatting::Macros::Definitions
@@ -525,7 +526,7 @@ module ApplicationHelper
 
   def back_url_hidden_field_tag
     back_url = params[:back_url] || request.env['HTTP_REFERER']
-    hidden_field_tag('back_url', back_url) unless back_url.blank?
+    hidden_field_tag('back_url', CGI.escape(back_url)) unless back_url.blank?
   end
 
   def check_all_links(form_name)
index 627a2418f89ed95f8ef07de6a4ccc30ff971a6cb..af38484e7f8a96f6e174f6db706a8341363e8042 100644 (file)
@@ -28,4 +28,10 @@ class Document < ActiveRecord::Base
   
   validates_presence_of :project, :title, :category
   validates_length_of :title, :maximum => 60
+  
+  def after_initialize
+    if new_record?
+      self.category ||= Enumeration.default('DCAT')
+    end
+  end
 end
index d32a0c04926630f79adab00a28c5739039978dc0..e4b080be1ffa5d32507c0537cdd608b4dd8734b3 100644 (file)
@@ -44,7 +44,9 @@ class Enumeration < ActiveRecord::Base
   end
 
   def before_save
-    Enumeration.update_all("is_default = #{connection.quoted_false}", {:opt => opt}) if is_default?
+    if is_default? && is_default_changed?
+      Enumeration.update_all("is_default = #{connection.quoted_false}", {:opt => opt})
+    end
   end
   
   def objects_count
index 3722081d260376575eb52cdb35dbd5b2300a5380..ff46d97721bc836f4b448e95b17e6404d9b549b7 100644 (file)
@@ -178,6 +178,11 @@ class User < ActiveRecord::Base
     token = Token.find_by_action_and_value('autologin', key)
     token && (token.created_on > Setting.autologin.to_i.day.ago) && token.user.active? ? token.user : nil
   end
+  
+  # Makes find_by_mail case-insensitive
+  def self.find_by_mail(mail)
+    find(:first, :conditions => ["LOWER(mail) = ?", mail.to_s.downcase])
+  end
 
   # Sort users by their display names
   def <=>(user)
index 9baec03faf5cb1bb1101d3f6d345885517b92fbe..94c710ebd8e8e41fd80443289bd0f37bd3ec0ebd 100644 (file)
@@ -1,6 +1,7 @@
 <% form_remote_tag(:url => {}, :html => { :id => "journal-#{@journal.id}-form" }) do %>
     <%= text_area_tag :notes, @journal.notes, :class => 'wiki-edit', 
                                               :rows => (@journal.notes.blank? ? 10 : [[10, @journal.notes.length / 50].max, 100].min) %>
+    <%= call_hook(:view_journals_notes_form_after_notes, { :journal => @journal}) %>
     <p><%= submit_tag l(:button_save) %>
     <%= link_to l(:button_cancel), '#', :onclick => "Element.remove('journal-#{@journal.id}-form'); " +
                                                     "Element.show('journal-#{@journal.id}-notes'); return false;" %></p>
index 2b5a54c0a40832f1d205208644129a0fa11cb4d9..55efb9bf373a5d386a25b59f517db39585891eb4 100644 (file)
@@ -6,3 +6,5 @@ else
   page.show "journal-#{@journal.id}-notes"
   page.remove "journal-#{@journal.id}-form"
 end
+
+call_hook(:view_journals_update_rjs_bottom, { :page => page, :journal => @journal })
index 93afc016b59a8c4c62696269850dea7bc991c6fa..5650c3c31d54bea89c6c98b314b2cde084074778 100644 (file)
@@ -344,6 +344,7 @@ label_last_updates_plural: %d zuletzt aktualisierten
 label_registered_on: Angemeldet am
 label_activity: Aktivität
 label_overall_activity: Aktivität aller Projekte anzeigen
+label_user_activity: "Aktivität von %s"
 label_new: Neu
 label_logged_as: Angemeldet als
 label_environment: Environment
@@ -543,6 +544,7 @@ label_send_test_email: Test-E-Mail senden
 label_feeds_access_key_created_on: Atom-Zugriffsschlüssel vor %s erstellt
 label_module_plural: Module
 label_added_time_by: Von %s vor %s hinzugefügt
+label_updated_time_by: Von %s vor %s aktualisiert
 label_updated_time: Vor %s aktualisiert
 label_jump_to_a_project: Zu einem Projekt springen...
 label_file_plural: Dateien
@@ -694,7 +696,5 @@ default_activity_development: Entwicklung
 enumeration_issue_priorities: Ticket-Prioritäten
 enumeration_doc_categories: Dokumentenkategorien
 enumeration_activities: Aktivitäten (Zeiterfassung)
-label_user_activity: "%s's activity"
-label_updated_time_by: Updated by %s %s ago
 text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
 setting_diff_max_lines_displayed: Max number of diff lines displayed
index 52d3c30aa69a99b10738b190a3814d700ae04589..8437beca1df3bd26eb3aadf9ae1c3123d1143026 100644 (file)
@@ -19,11 +19,11 @@ actionview_datehelper_time_in_words_second_less_than_plural: menos de %d segundo
 actionview_instancetag_blank_option: Por favor seleccione
 activerecord_error_accepted: debe ser aceptado
 activerecord_error_blank: no puede estar en blanco
-activerecord_error_circular_dependency: Esta relación podría crear una dependencia anidada
+activerecord_error_circular_dependency: Esta relación podría crear una dependencia circular
 activerecord_error_confirmation: la confirmación no coincide
 activerecord_error_empty: no puede estar vacío
 activerecord_error_exclusion: está reservado
-activerecord_error_greater_than_start_date: debe ser la fecha mayor que del comienzo
+activerecord_error_greater_than_start_date: debe ser posterior a la fecha de comienzo
 activerecord_error_inclusion: no está incluído en la lista
 activerecord_error_invalid: no es válido
 activerecord_error_not_a_date: no es una fecha válida
@@ -140,11 +140,11 @@ field_is_default: Estado por defecto
 field_is_filter: Usado como filtro
 field_is_for_all: Para todos los proyectos
 field_is_in_chlog: Consultar las peticiones en el histórico
-field_is_in_roadmap: Consultar las peticiones en el roadmap
+field_is_in_roadmap: Consultar las peticiones en la planificación
 field_is_public: Público
 field_is_required: Obligatorio
 field_issue: Petición
-field_issue_to_id: Petición Relacionada
+field_issue_to_id: Petición relacionada
 field_language: Idioma
 field_last_login_on: Última conexión
 field_lastname: Apellido
@@ -178,7 +178,7 @@ field_subproject: Proyecto secundario
 field_summary: Resumen
 field_time_zone: Zona horaria
 field_title: Título
-field_tracker: Tracker
+field_tracker: Tipo
 field_type: Tipo
 field_updated_on: Actualizado
 field_url: URL
@@ -215,7 +215,7 @@ label_ago: hace
 label_all: todos
 label_all_time: todo el tiempo
 label_all_words: Todas las palabras
-label_and_its_subprojects: %s y sus subproyectos
+label_and_its_subprojects: %s y proyectos secundarios
 label_applied_status: Aplicar estado
 label_assigned_to_me_issues: Peticiones que me están asignadas
 label_associated_revisions: Revisiones asociadas
@@ -234,7 +234,7 @@ label_blocks: bloquea a
 label_board: Foro
 label_board_new: Nuevo foro
 label_board_plural: Foros
-label_boolean: Boleano
+label_boolean: Booleano
 label_browse: Hojear
 label_bulk_edit_selected_issues: Editar las peticiones seleccionadas
 label_calendar: Calendario
@@ -293,7 +293,7 @@ label_enumerations: Listas de valores
 label_environment: Entorno
 label_equals: igual
 label_example: Ejemplo
-label_export_to: Exportar a
+label_export_to: 'Exportar a:'
 label_f_hour: %.2f hora
 label_f_hour_plural: %.2f horas
 label_feed_plural: Feeds
@@ -327,7 +327,7 @@ label_issue_category_new: Nueva categoría
 label_issue_category_plural: Categorías de las peticiones
 label_issue_new: Nueva petición
 label_issue_plural: Peticiones
-label_issue_status: Estado de petición
+label_issue_status: Estado de la petición
 label_issue_status_new: Nuevo estado
 label_issue_status_plural: Estados de las peticiones
 label_issue_tracking: Peticiones
@@ -337,7 +337,7 @@ label_issue_watchers: Seguidores
 label_issues_by: Peticiones por %s
 label_jump_to_a_project: Ir al proyecto...
 label_language_based: Basado en el idioma
-label_last_changes: %d cambios del último
+label_last_changes: últimos %d cambios
 label_last_login: Última conexión
 label_last_month: último mes
 label_last_n_days: últimos %d días
@@ -384,7 +384,7 @@ label_news_plural: Noticias
 label_news_view_all: Ver todas las noticias
 label_next: Siguiente
 label_no_change_option: (Sin cambios)
-label_no_data: Ningun dato a mostrar
+label_no_data: Ningún dato a mostrar
 label_nobody: nadie
 label_none: ninguno
 label_not_contains: no contiene
@@ -397,7 +397,7 @@ label_options: Opciones
 label_overall_activity: Actividad global
 label_overview: Vistazo
 label_password_lost: ¿Olvidaste la contraseña?
-label_per_page: Por la página
+label_per_page: Por página
 label_permissions: Permisos
 label_permissions_report: Informe de permisos
 label_personalize_page: Personalizar esta página
@@ -438,7 +438,7 @@ label_result_plural: Resultados
 label_reverse_chronological_order: En orden cronológico inverso
 label_revision: Revisión
 label_revision_plural: Revisiones
-label_roadmap: Roadmap
+label_roadmap: Planificación
 label_roadmap_due_in: Finaliza en %s
 label_roadmap_no_issues: No hay peticiones para esta versión
 label_roadmap_overdue: %s tarde
@@ -452,7 +452,7 @@ label_search_titles_only: Buscar sólo en títulos
 label_send_information: Enviar información de la cuenta al usuario
 label_send_test_email: Enviar un correo de prueba
 label_settings: Configuración
-label_show_completed_versions: Muestra las versiones completas
+label_show_completed_versions: Muestra las versiones terminadas
 label_sort_by: Ordenar por %s
 label_sort_higher: Subir
 label_sort_highest: Primero
@@ -474,16 +474,18 @@ label_time_tracking: Control de tiempo
 label_today: hoy
 label_topic_plural: Temas
 label_total: Total
-label_tracker: Tracker
-label_tracker_new: Nuevo tracker
-label_tracker_plural: Trackers
+label_tracker: Tipo
+label_tracker_new: Nuevo tipo
+label_tracker_plural: Tipos de peticiones
 label_updated_time: Actualizado hace %s
+label_updated_time_by: Actualizado por %s hace %s
 label_used_by: Utilizado por
 label_user: Usuario
+label_user_activity: "Actividad de %s"
 label_user_mail_no_self_notified: "No quiero ser avisado de cambios hechos por mí"
 label_user_mail_option_all: "Para cualquier evento en todos mis proyectos"
 label_user_mail_option_none: "Sólo para elementos monitorizados o relacionados conmigo"
-label_user_mail_option_selected: "Para cualquier evento del proyecto seleccionado..."
+label_user_mail_option_selected: "Para cualquier evento de los proyectos seleccionados..."
 label_user_new: Nuevo usuario
 label_user_plural: Usuarios
 label_version: Versión
@@ -501,22 +503,22 @@ label_wiki_page_plural: Wiki páginas
 label_workflow: Flujo de trabajo
 label_year: Año
 label_yesterday: ayer
-mail_body_account_activation_request: "Un nuevo usuario (%s) ha sido registrado. Esta cuenta está pendiende de aprobación"
+mail_body_account_activation_request: 'Se ha inscrito un nuevo usuario (%s). La cuenta está pendiende de aprobación:'
 mail_body_account_information: Información sobre su cuenta
 mail_body_account_information_external: Puede usar su cuenta "%s" para conectarse.
-mail_body_lost_password: 'Para cambiar su contraseña, haga click en el siguiente enlace:'
-mail_body_register: 'Para activar su cuenta, haga click en el siguiente enlace:'
+mail_body_lost_password: 'Para cambiar su contraseña, haga clic en el siguiente enlace:'
+mail_body_register: 'Para activar su cuenta, haga clic en el siguiente enlace:'
 mail_body_reminder: "%d peticion(es) asignadas a tí finalizan en los próximos %d días:"
 mail_subject_account_activation_request: Petición de activación de cuenta %s
 mail_subject_lost_password: Tu contraseña del %s
 mail_subject_register: Activación de la cuenta del %s
 mail_subject_reminder: "%d peticion(es) finalizan en los próximos días"
-notice_account_activated: Su cuenta ha sido activada. Ahora se encuentra conectado.
+notice_account_activated: Su cuenta ha sido activada. Ya puede conectarse.
 notice_account_invalid_creditentials: Usuario o contraseña inválido.
 notice_account_lost_email_sent: Se le ha enviado un correo con instrucciones para elegir una nueva contraseña.
 notice_account_password_updated: Contraseña modificada correctamente.
-notice_account_pending: "Su cuenta ha sido creada y está pendiende de la aprobación por parte de administrador"
-notice_account_register_done: Cuenta creada correctamente.
+notice_account_pending: "Su cuenta ha sido creada y está pendiende de la aprobación por parte del administrador."
+notice_account_register_done: Cuenta creada correctamente. Para activarla, haga clic sobre el enlace que le ha sido enviado por correo.
 notice_account_unknown_email: Usuario desconocido.
 notice_account_updated: Cuenta actualizada correctamente.
 notice_account_wrong_password: Contraseña incorrecta.
@@ -524,9 +526,9 @@ notice_can_t_change_password: Esta cuenta utiliza una fuente de autenticación e
 notice_default_data_loaded: Configuración por defecto cargada correctamente.
 notice_email_error: Ha ocurrido un error mientras enviando el correo (%s)
 notice_email_sent: Se ha enviado un correo a %s
-notice_failed_to_save_issues: "Imposible salvar %s peticion(es) en %d seleccionado: %s."
-notice_feeds_access_key_reseted: Su clave de acceso para RSS ha sido reiniciada
-notice_file_not_found: La página a la que intentas acceder no existe.
+notice_failed_to_save_issues: "Imposible grabar %s peticion(es) en %d seleccionado: %s."
+notice_feeds_access_key_reseted: Su clave de acceso para RSS ha sido reiniciada.
+notice_file_not_found: La página a la que intenta acceder no existe.
 notice_locking_conflict: Los datos han sido modificados por otro usuario.
 notice_no_issue_selected: "Ninguna petición seleccionada. Por favor, compruebe la petición que quiere modificar"
 notice_not_authorized: No tiene autorización para acceder a esta página.
@@ -544,9 +546,9 @@ permission_comment_news: Comentar noticias
 permission_commit_access: Acceso de escritura
 permission_delete_issues: Borrar peticiones
 permission_delete_messages: Borrar mensajes
+permission_delete_own_messages: Borrar mensajes propios
 permission_delete_wiki_pages: Borrar páginas wiki
 permission_delete_wiki_pages_attachments: Borrar ficheros
-permission_delete_own_messages: Borrar mensajes propios
 permission_edit_issue_notes: Modificar notas
 permission_edit_issues: Modificar peticiones
 permission_edit_messages: Modificar mensajes
@@ -602,15 +604,16 @@ setting_commit_fix_keywords: Palabras clave para la corrección
 setting_commit_logs_encoding: Codificación de los mensajes de commit
 setting_commit_ref_keywords: Palabras clave para la referencia
 setting_cross_project_issue_relations: Permitir relacionar peticiones de distintos proyectos
-setting_date_format: Formato de la fecha
+setting_date_format: Formato de fecha
 setting_default_language: Idioma por defecto
 setting_default_projects_public: Los proyectos nuevos son públicos por defecto
-setting_display_subprojects_issues: Mostrar peticiones de un subproyecto en el proyecto padre por defecto
+setting_diff_max_lines_displayed: Número máximo de diferencias mostradas
+setting_display_subprojects_issues: Mostrar por defecto peticiones de proy. secundarios en el principal
 setting_emails_footer: Pie de mensajes
 setting_enabled_scm: Activar SCM
 setting_feeds_limit: Límite de contenido para sindicación
 setting_gravatar_enabled: Usar iconos de usuario (Gravatar)
-setting_host_name: Nombre de host
+setting_host_name: Nombre y ruta del servidor
 setting_issue_list_default_columns: Columnas por defecto para la lista de peticiones
 setting_issues_export_limit: Límite de exportación de peticiones
 setting_login_required: Se requiere identificación
@@ -632,7 +635,7 @@ setting_wiki_compression: Compresión del historial del Wiki
 status_active: activo
 status_locked: bloqueado
 status_registered: registrado
-text_are_you_sure: ¿ Estás seguro ?
+text_are_you_sure: ¿Está seguro?
 text_assign_time_entries_to_project: Asignar las horas al proyecto
 text_caracters_maximum: %d caracteres como máximo.
 text_caracters_minimum: %d caracteres como mínimo
@@ -640,11 +643,12 @@ text_comma_separated: Múltiples valores permitidos (separados por coma).
 text_default_administrator_account_changed: Cuenta de administrador por defecto modificada
 text_destroy_time_entries: Borrar las horas
 text_destroy_time_entries_question: Existen %.02f horas asignadas a la petición que quiere borrar. ¿Qué quiere hacer ?
+text_diff_truncated: '... Diferencia truncada por exceder el máximo tamaño visualizable.'
 text_email_delivery_not_configured: "El envío de correos no está configurado, y las notificaciones se han desactivado. \n Configure el servidor de SMTP en config/email.yml y reinicie la aplicación para activar los cambios."
 text_enumeration_category_reassign_to: 'Reasignar al siguiente valor:'
 text_enumeration_destroy_question: '%d objetos con este valor asignado.'
 text_file_repository_writable: Se puede escribir en el repositorio
-text_issue_added: Petición añadida por %s.
+text_issue_added: Petición %s añadida por %s.
 text_issue_category_destroy_assignments: Dejar las peticiones sin categoría
 text_issue_category_destroy_question: Algunas peticiones (%d) están asignadas a esta categoría. ¿Qué desea hacer?
 text_issue_category_reassign_to: Reasignar las peticiones a la categoría
@@ -657,27 +661,23 @@ text_journal_set_to: fijado a %s
 text_length_between: Longitud entre %d y %d caracteres.
 text_load_default_configuration: Cargar la configuración por defecto
 text_min_max_length_info: 0 para ninguna restricción
-text_no_configuration_data: "Todavía no se han configurado roles, ni trackers, ni estados y flujo de trabajo asociado a peticiones. Se recomiendo encarecidamente cargar la configuración por defecto. Una vez cargada, podrá modificarla."
+text_no_configuration_data: "Todavía no se han configurado perfiles, ni tipos, estados y flujo de trabajo asociado a peticiones. Se recomiendo encarecidamente cargar la configuración por defecto. Una vez cargada, podrá modificarla."
 text_project_destroy_confirmation: ¿Estás seguro de querer eliminar el proyecto?
 text_project_identifier_info: 'Letras minúsculas (a-z), números y signos de puntuación permitidos.<br />Una vez guardado, el identificador no puede modificarse.'
 text_reassign_time_entries: 'Reasignar las horas a esta petición:'
 text_regexp_info: ej. ^[A-Z0-9]+$
-text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
+text_repository_usernames_mapping: "Establezca la correspondencia entre los usuarios de Redmine y los presentes en el log del repositorio.\nLos usuarios con el mismo nombre o correo en Redmine y en el repositorio serán asociados automáticamente."
 text_rmagick_available: RMagick disponible (opcional)
 text_select_mail_notifications: Seleccionar los eventos a notificar
 text_select_project_modules: 'Seleccione los módulos a activar para este proyecto:'
 text_status_changed_by_changeset: Aplicado en los cambios %s
-text_subprojects_destroy_warning: 'Los subproyectos: %s también se eliminarán'
+text_subprojects_destroy_warning: 'Los proyectos secundarios: %s también se eliminarán'
 text_tip_task_begin_day: tarea que comienza este día
 text_tip_task_begin_end_day: tarea que comienza y termina este día
 text_tip_task_end_day: tarea que termina este día
-text_tracker_no_workflow: No hay ningún flujo de trabajo definido para este tracker
+text_tracker_no_workflow: No hay ningún flujo de trabajo definido para este tipo de petición
 text_unallowed_characters: Caracteres no permitidos
-text_user_mail_option: "En los proyectos no seleccionados, sólo recibirá notificaciones sobre elementos monitorizados o elementos en los que esté involucrado (por ejemplo, peticiones de las que usted sea autor o asignadas a usted)."
+text_user_mail_option: "De los proyectos no seleccionados, sólo recibirá notificaciones sobre elementos monitorizados o elementos en los que esté involucrado (por ejemplo, peticiones de las que usted sea autor o asignadas a usted)."
 text_user_wrote: '%s escribió:'
 text_wiki_destroy_confirmation: ¿Seguro que quiere borrar el wiki y todo su contenido?
 text_workflow_edit: Seleccionar un flujo de trabajo para actualizar
-label_user_activity: "%s's activity"
-label_updated_time_by: Updated by %s %s ago
-text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
-setting_diff_max_lines_displayed: Max number of diff lines displayed
index 24a9da4a5d40f71a1c08b6f7422845f72d53422f..170c6956e6147032adea7b03eb271560802a623c 100644 (file)
@@ -694,6 +694,6 @@ text_repository_usernames_mapping: "Állítsd be a felhasználó összerendelés
 permission_edit_own_messages: Saját üzenetek szerkesztése
 permission_delete_own_messages: Saját üzenetek törlése
 label_user_activity: "%s tevékenységei"
-label_updated_time_by: Updated by %s %s ago
-text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
-setting_diff_max_lines_displayed: Max number of diff lines displayed
+label_updated_time_by: "Módosította %s ennyivel ezelőtt: %s"
+text_diff_truncated: '... A diff fájl vége nem jelenik meg, mert hosszab, mint a megjeleníthető sorok száma.'
+setting_diff_max_lines_displayed: A megjelenítendő sorok száma (maximum) a diff fájloknál
index 9d2fb6d8e6a9de3f11487ee68c5a0c22530494b0..b3f4a5dd2f7c07f908e5eec7c72a51be62e8ea56 100644 (file)
@@ -120,18 +120,18 @@ field_subject: 제목
 field_due_date: 완료 기한
 field_assigned_to: 담당자
 field_priority: 우선순위
-field_fixed_version: 목표 버전
+field_fixed_version: 목표버전
 field_user: 사용자
 field_role: 역할
 field_homepage: 홈페이지
 field_is_public: 공개
 field_parent: 상위 프로젝트
-field_is_in_chlog: 변경이력(changelog)에서 보여지는 일감들
-field_is_in_roadmap: 로드맵에서 보여지는 일감들
+field_is_in_chlog: 변경이력(changelog)에서 표시할 일감들
+field_is_in_roadmap: 로드맵에서표시할 일감들
 field_login: 로그인
 field_mail_notification: 메일 알림
 field_admin: 관리자
-field_last_login_on: 최종 접속
+field_last_login_on: 마지막 로그인
 field_language: 언어
 field_effective_date: 일자
 field_password: 비밀번호
@@ -188,7 +188,7 @@ setting_commit_ref_keywords: 일감 참조에 사용할 키워드들
 setting_commit_fix_keywords: 일감 해결에 사용할 키워드들 
 setting_autologin: 자동 로그인
 setting_date_format: 날짜 형식
-setting_cross_project_issue_relations: 프로젝트간 일감에 관을 맺는 것을 허용
+setting_cross_project_issue_relations: 프로젝트간 일감에 관을 맺는 것을 허용
 setting_issue_list_default_columns: 일감 목록에 보여줄 기본 컬럼들 
 setting_repositories_encodings:  저장소 인코딩
 setting_emails_footer: 메일 꼬리
@@ -201,7 +201,7 @@ label_project_new: 새 프로젝트
 label_project_plural: 프로젝트
 label_project_all: 모든 프로젝트
 label_project_latest: 최근 프로젝트
-label_issue: 일감 보기
+label_issue: 일감
 label_issue_new: 새 일감만들기
 label_issue_plural: 일감 보기
 label_issue_view_all: 모든 일감 보기
@@ -249,9 +249,9 @@ label_last_login: 최종 접속
 label_last_updates: 최종 변경 내역
 label_last_updates_plural: 최종변경 %d 
 label_registered_on: 등록시각
-label_activity: ì§\84í\96\89ì¤\91ì\9d¸ ì\9e\91ì\97\85
-label_new: ì\8b ê·\9c
-label_logged_as: 
+label_activity: ì\9e\91ì\97\85ë\82´ì\97­
+label_new: ì\83\88ë¡\9c ë§\8cë\93¤ê¸°
+label_logged_as: '로그인계정:'
 label_environment: 환경
 label_authentication: 인증설정
 label_auth_source: 인증 모드
@@ -280,7 +280,7 @@ label_attachment_plural: 관련파일
 label_report: 보고서
 label_report_plural: 보고서
 label_news: 뉴스
-label_news_new: 뉴스추가
+label_news_new: 새 뉴스
 label_news_plural: 뉴스
 label_news_latest: 최근 뉴스
 label_news_view_all: 모든 뉴스
@@ -298,7 +298,7 @@ label_open_issues: 진행중
 label_open_issues_plural: 진행중
 label_closed_issues: 완료됨
 label_closed_issues_plural: 완료됨
-label_total: Total
+label_total: 합계
 label_permissions: 허가권한
 label_current_status: 일감 상태
 label_new_statuses_allowed: 허용되는 일감 상태
@@ -316,7 +316,7 @@ label_gantt: Gantt 챠트
 label_internal: 내부
 label_last_changes: 지난 변경사항 %d 건
 label_change_view_all: 모든 변경 내역 보기
-label_personalize_page: 입맛대로 구성하기(Drag & Drop)
+label_personalize_page: 입맛대로 구성하기
 label_comment: 댓글
 label_comment_plural: 댓글
 label_comment_add: 댓글 추가
@@ -353,7 +353,7 @@ label_latest_revision: 최근 개정판
 label_latest_revision_plural: 최근 개정판
 label_view_revisions: 개정판 보기
 label_max_size: 최대 크기
-label_on: 'on'
+label_on: '전체: '
 label_sort_highest: 최상단으로
 label_sort_higher: 위로
 label_sort_lower: 아래로
@@ -361,7 +361,7 @@ label_sort_lowest: 최하단으로
 label_roadmap: 로드맵
 label_roadmap_due_in: 기한  %s
 label_roadmap_overdue: %s 지연
-label_roadmap_no_issues: 이버전에 해당하는 일감 없음
+label_roadmap_no_issues: 이 버전에 해당하는 일감 없음
 label_search: 검색
 label_result_plural: 결과
 label_all_words: 모든 단어
@@ -412,19 +412,19 @@ label_disabled: 비활성화
 label_show_completed_versions: 완료된 버전 보기
 label_me: 나
 label_board: 게시판
-label_board_new: ì\8b ê·\9c 게시판
+label_board_new: ì\83\88 게시판
 label_board_plural: 게시판
 label_topic_plural: 주제
 label_message_plural: 관련글
-label_message_last: 최종 글
+label_message_last: 마지막 글
 label_message_new: 새글쓰기
 label_reply_plural: 답글
 label_send_information: 사용자에게 계정정보를 보냄
 label_year: 년
 label_month: 월
 label_week: 주
-label_date_from: 에서
-label_date_to: (으)로
+label_date_from: '기간:'
+label_date_to: ' ~ '
 label_language_based: 언어설정에 따름
 label_sort_by: 정렬방법(%s)
 label_send_test_email: 테스트 메일 보내기
@@ -533,7 +533,7 @@ default_activity_development: 개발
 
 enumeration_issue_priorities: 일감 우선순위
 enumeration_doc_categories: 문서 카테고리
-enumeration_activities: ì§\84í\96\89í\99\9cë\8f\99\8b\9cê°\84 추적)
+enumeration_activities: ì\9e\91ì\97\85ë¶\84ë¥\98\8b\9cê°\84추적)
 button_copy: 복사
 mail_body_account_information_external: 레드마인에 로그인할 때 "%s" 계정을 사용하실 수 있습니다.
 button_change_password: 비밀번호 변경
@@ -555,7 +555,7 @@ button_annotate: 주석달기(annotate)
 label_issues_by: 일감분류 방식 %s
 field_searchable: 검색가능
 label_display_per_page: '페이지당: %s'
-setting_per_page_options: í\8e\98ì\9d´ì§\80ë\8b¹ í\91\9cì\8b\9cí\95  ê°\9dì±\84 수
+setting_per_page_options: í\8e\98ì\9d´ì§\80ë\8b¹ í\91\9cì\8b\9cí\95  ê°\9dì²´ 수
 label_age: 마지막 수정일
 notice_default_data_loaded: 기본 설정을 성공적으로 로드하였습니다.
 text_load_default_configuration: 기본 설정을 로딩하기
@@ -585,20 +585,20 @@ project_module_files: 관련파일
 project_module_documents: 문서
 project_module_repository: 저장소
 project_module_news: 뉴스
-project_module_time_tracking: ì§\84í\96\89ì¤\91ì\9d¸ ì\9e\91ì\97\85
+project_module_time_tracking: ì\8b\9cê°\84ì¶\94ì \81
 text_file_repository_writable: 파일 저장소 쓰기 가능
 text_default_administrator_account_changed: 기본 관리자 계정이 변경되었습니다.
-text_rmagick_available: RMagick available (optional)
+text_rmagick_available: RMagick 사용가능(옵션)
 button_configure: 설정
 label_plugins: 플러그인
 label_ldap_authentication: LDAP 인증
 label_downloads_abbr: D/L
 label_add_another_file: 다른 파일 추가 
 label_this_month: 이번 달
-text_destroy_time_entries_question: %.02f hours were reported on the issues you are about to delete. What do you want to do ?
+text_destroy_time_entries_question: 삭제하려는 일감에 %.02f 시간이 보고되어 있습니다. 어떻게 하시겠습니까?
 label_last_n_days: 지난 %d 일
 label_all_time: 모든 시간
-error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
+error_issue_not_found_in_project: '일감이 없거나 이 프로젝트의 것이 아닙니다.'
 label_this_year: 올해
 text_assign_time_entries_to_project: 보고된 시간을 프로젝트에 할당하기
 label_date_range: 날짜 범위
@@ -608,15 +608,15 @@ label_optional_description: 부가적인 설명
 label_last_month: 지난 달
 text_destroy_time_entries: 보고된 시간을 삭제하기
 text_reassign_time_entries: '이 알림에 보고된 시간을 재할당하기:'
-setting_activity_days_default: 프로젝트 활동에 보여질 날수
+setting_activity_days_default: 프로젝트 작업내역에 보여줄 날수
 label_chronological_order: 시간 순으로 정렬
 field_comments_sorting: 히스토리 정렬 설정
 label_reverse_chronological_order: 시간 역순으로 정렬 
-label_preferences: Preferences
+label_preferences: 설정
 setting_display_subprojects_issues: 하위 프로젝트의 일감을 최상위 프로젝트에서 표시
-label_overall_activity: ì \84ì²´ ì§\84í\96\89 ì\83\81í\99©
+label_overall_activity: ì \84ì²´ ì\9e\91ì\97\85ë\82´ì\97­
 setting_default_projects_public: 새 프로젝트를 공개로 설정
-error_scm_annotate: "The entry does not exist or can not be annotated."
+error_scm_annotate: "항목이 없거나 주석을 달 수 없습니다."
 label_planning: 프로젝트계획(Planning)
 text_subprojects_destroy_warning: '서브프로젝트(%s)가 자동으로 지워질 것입니다.'
 label_and_its_subprojects: %s와 서브프로젝트들
@@ -692,7 +692,7 @@ label_example: 예
 text_repository_usernames_mapping: "저장소 로그에서 발견된 각 사용자에 레드마인 사용자를 업데이트할때 선택합니다.\n레드마인과 저장소의 이름이나 이메일이 같은 사용자가 자동으로 연결됩니다."
 permission_edit_own_messages: 자기 메시지 편집
 permission_delete_own_messages: 자기 메시지 삭제
-label_user_activity: "%s의 활동"
-label_updated_time_by: Updated by %s %s ago
-text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
-setting_diff_max_lines_displayed: Max number of diff lines displayed
+label_user_activity: "%s의 작업내역"
+label_updated_time_by: %s가 %s 전에 변경
+text_diff_truncated: '... 이 차이점은 표시할 수 있는 최대 줄수를 초과해서 이 차이점은 잘렸습니다.'
+setting_diff_max_lines_displayed: 차이점보기에 표시할 최대 줄수
index acf916006aed05303f2b955b75cf3697f2d4157f..ce051bd5c5586feffc298bc0acf346f444c14e47 100644 (file)
@@ -518,7 +518,8 @@ label_total: Всего
 label_tracker_new: Новый трекер
 label_tracker_plural: Трекеры
 label_tracker: Трекер
-label_updated_time: Обновлен %s назад
+label_updated_time: Обновлено %s назад
+label_updated_time_by: Обновлено %s %s назад
 label_used_by: Используется
 label_user_activity: "Активность пользователя %s"
 label_user_mail_no_self_notified: "Не извещать об изменениях, которые я сделал сам"
@@ -652,6 +653,7 @@ setting_cross_project_issue_relations: Разрешить пересечение
 setting_date_format: Формат даты
 setting_default_language: Язык по умолчанию
 setting_default_projects_public: Новые проекты являются общедоступными
+setting_diff_max_lines_displayed: Максимальное число строк для diff
 setting_display_subprojects_issues: Отображение подпроектов по умолчанию
 setting_emails_footer: Подстрочные примечания Email
 setting_enabled_scm: Разрешенные SCM
@@ -689,6 +691,7 @@ text_comma_separated: Допустимы несколько значений (ч
 text_default_administrator_account_changed: Учетная запись администратора по умолчанию изменена
 text_destroy_time_entries_question: Вы собираетесь удалить %.02f часа(ов) прикрепленных за этой задачей.
 text_destroy_time_entries: Удалить зарегистрированное время
+text_diff_truncated: '... Этот diff ограничен, так как превышает максимальный отображаемый размер.'
 text_email_delivery_not_configured: "Параметры работы с почтовым сервером не настроены и функция уведомления по email не активна.\nНастроить параметры для Вашего SMTP-сервера Вы можете в файле config/email.yml. Для применения изменений перезапустите приложение."
 text_enumeration_category_reassign_to: 'Назначить им следующее значение:'
 text_enumeration_destroy_question: '%d объект(а,ов) связаны с этим значением.'
@@ -727,6 +730,3 @@ text_user_wrote: '%s написал(а):'
 text_wiki_destroy_confirmation: Вы уверены, что хотите удалить данную Wiki и все ее содержимое?
 text_workflow_edit: Выберите роль и трекер для редактирования последовательности состояний
 
-label_updated_time_by: Updated by %s %s ago
-text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
-setting_diff_max_lines_displayed: Max number of diff lines displayed
index f52f4d815f97129cc7a49d7dcd0939884b53036f..6faa7d6d658e43812b62b45fe8c6bb79db6fdb0a 100644 (file)
@@ -223,6 +223,7 @@ setting_mail_handler_api_enabled: 啟用處理傳入電子郵件的服務
 setting_mail_handler_api_key: API 金鑰
 setting_sequential_project_identifiers: 循序產生專案識別碼
 setting_gravatar_enabled: 啟用 Gravatar 全球認證大頭像
+setting_diff_max_lines_displayed: 差異顯示行數之最大值
 
 permission_edit_project: 編輯專案
 permission_select_project_modules: 選擇專案模組
@@ -670,6 +671,7 @@ text_enumeration_destroy_question: '目前有 %d 個物件使用此列舉值。'
 text_enumeration_category_reassign_to: '重新設定其列舉值為:'
 text_email_delivery_not_configured: "您尚未設定電子郵件傳送方式,因此提醒選項已被停用。\n請在 config/email.yml 中設定 SMTP 之後,重新啟動 Redmine,以啟用電子郵件提醒選項。"
 text_repository_usernames_mapping: "選擇或更新 Redmine 使用者與版本庫使用者之對應關係。\n版本庫中之使用者帳號或電子郵件信箱,與 Redmine 設定相同者,將自動產生對應關係。"
+text_diff_truncated: '... 這份差異已被截短以符合顯示行數之最大值'
 
 default_role_manager: 管理人員
 default_role_developper: 開發人員
@@ -696,5 +698,3 @@ default_activity_development: 開發
 enumeration_issue_priorities: 項目優先權
 enumeration_doc_categories: 文件分類
 enumeration_activities: 活動 (時間追蹤)
-text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
-setting_diff_max_lines_displayed: Max number of diff lines displayed
index 428c6e67da7822d4ac112737d2f538e7174bbf75..6e6b42b505830982b998bb2fb9376f0b6918f5f2 100644 (file)
@@ -223,6 +223,7 @@ setting_mail_handler_api_enabled: 启用用于接收邮件的服务
 setting_mail_handler_api_key: API key
 setting_sequential_project_identifiers: 顺序产生项目标识
 setting_gravatar_enabled: 使用Gravatar用户头像
+setting_diff_max_lines_displayed: 查看差别页面上显示的最大行数
 
 permission_edit_project: 编辑项目
 permission_select_project_modules: 选择项目模块
@@ -544,7 +545,8 @@ label_send_test_email: 发送测试邮件
 label_feeds_access_key_created_on: RSS 存取键是在 %s 之前建立的
 label_module_plural: 模块
 label_added_time_by: 由 %s 在 %s 之前添加
-label_updated_time:  更新于 %s 前
+label_updated_time:  更新于 %s 之前
+label_updated_time_by: 由 %s 更新于 %s 之前
 label_jump_to_a_project: 选择一个项目...
 label_file_plural: 文件
 label_changeset_plural: 变更
@@ -669,6 +671,7 @@ text_enumeration_category_reassign_to: '将它们关联到新的枚举值:'
 text_enumeration_destroy_question: '%d 个对象被关联到了这个枚举值。'
 text_email_delivery_not_configured: "邮件参数尚未配置,因此邮件通知功能已被禁用。\n请在config/email.yml中配置您的SMTP服务器信息并重新启动以使其生效。"
 text_repository_usernames_mapping: "选择或更新与版本库中的用户名对应的Redmine用户。\n版本库中与Redmine中的同名用户将被自动对应。"
+text_diff_truncated: '... 差别内容超过了可显示的最大行数并已被截断'
 
 default_role_manager: 管理人员
 default_role_developper: 开发人员
@@ -695,6 +698,3 @@ default_activity_development: 开发
 enumeration_issue_priorities: 问题优先级
 enumeration_doc_categories: 文档类别
 enumeration_activities: 活动(时间跟踪)
-label_updated_time_by: Updated by %s %s ago
-text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
-setting_diff_max_lines_displayed: Max number of diff lines displayed
index 7c1f0213a2edd36656b90f772c336e2951dd3ec0..b2e7abda09ab9d917e050372a1826a5a2814a25a 100644 (file)
@@ -32,10 +32,19 @@ class DocumentsControllerTest < Test::Unit::TestCase
   end
 
   def test_index
+    # Sets a default category
+    e = Enumeration.find_by_name('Technical documentation')
+    e.update_attributes(:is_default => true)
+    
     get :index, :project_id => 'ecookbook'
     assert_response :success
     assert_template 'index'
     assert_not_nil assigns(:grouped)
+    
+    # Default category selected in the new document form
+    assert_tag :select, :attributes => {:name => 'document[category_id]'},
+                        :child => {:tag => 'option', :attributes => {:selected => 'selected'},
+                                                     :content => 'Technical documentation'}
   end
   
   def test_new_with_one_attachment
index c349200d3f7fa3e5856f964dff2d7a2ab91a33e3..c6cfd080e1c000e7606c86ed90d37ff81fd79eb7 100644 (file)
@@ -44,7 +44,7 @@ class AccountTest < ActionController::IntegrationTest
     assert_response :success
     assert_template "account/lost_password"
     
-    post "account/lost_password", :mail => 'jsmith@somenet.foo'
+    post "account/lost_password", :mail => 'jSmith@somenet.foo'
     assert_redirected_to "account/login"
     
     token = Token.find(:first)
diff --git a/test/unit/document_test.rb b/test/unit/document_test.rb
new file mode 100644 (file)
index 0000000..17a0ad6
--- /dev/null
@@ -0,0 +1,37 @@
+# Redmine - project management software
+# Copyright (C) 2006-2008  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+require File.dirname(__FILE__) + '/../test_helper'
+
+class DocumentTest < Test::Unit::TestCase
+  fixtures :projects, :enumerations, :documents
+
+  def test_create
+    doc = Document.new(:project => Project.find(1), :title => 'New document', :category => Enumeration.find_by_name('User documentation'))
+    assert doc.save
+  end
+  
+  def test_create_with_default_category
+    # Sets a default category
+    e = Enumeration.find_by_name('Technical documentation')
+    e.update_attributes(:is_default => true)
+    
+    doc = Document.new(:project => Project.find(1), :title => 'New document')
+    assert_equal e, doc.category
+    assert doc.save
+  end
+end
index 9b7bfd174633c2ce9eb56ff3e1e2254029250849..4da3f094b81783997b27d4f558beffbd5b7f1fba 100644 (file)
@@ -37,6 +37,43 @@ class EnumerationTest < Test::Unit::TestCase
     assert !Enumeration.find(7).in_use?
   end
   
+  def test_default
+    e = Enumeration.default('IPRI')
+    assert e.is_a?(Enumeration)
+    assert e.is_default?
+    assert_equal 'Normal', e.name
+  end
+  
+  def test_create
+    e = Enumeration.new(:opt => 'IPRI', :name => 'Very urgent', :is_default => false)
+    assert e.save
+    assert_equal 'Normal', Enumeration.default('IPRI').name
+  end
+  
+  def test_create_as_default
+    e = Enumeration.new(:opt => 'IPRI', :name => 'Very urgent', :is_default => true)
+    assert e.save
+    assert_equal e, Enumeration.default('IPRI')
+  end
+  
+  def test_update_default
+    e = Enumeration.default('IPRI')
+    e.update_attributes(:name => 'Changed', :is_default => true)
+    assert_equal e, Enumeration.default('IPRI')
+  end
+  
+  def test_update_default_to_non_default
+    e = Enumeration.default('IPRI')
+    e.update_attributes(:name => 'Changed', :is_default => false)
+    assert_nil Enumeration.default('IPRI')
+  end
+  
+  def test_change_default
+    e = Enumeration.find_by_name('Urgent')
+    e.update_attributes(:name => 'Urgent', :is_default => true)
+    assert_equal e, Enumeration.default('IPRI')
+  end
+  
   def test_destroy_with_reassign
     Enumeration.find(4).destroy(Enumeration.find(6))
     assert_nil Issue.find(:first, :conditions => {:priority_id => 4})
index b931501a101e6cdbe1856322e89fd6d6d64f458e..319a1c2f44d6a0bb10838b05a57f516f5f554249 100644 (file)
@@ -158,4 +158,10 @@ class UserTest < Test::Unit::TestCase
     @jsmith.pref.comments_sorting = 'desc'
     assert @jsmith.wants_comments_in_reverse_order?
   end
+  
+  def test_find_by_mail_should_be_case_insensitive
+    u = User.find_by_mail('JSmith@somenet.foo')
+    assert_not_nil u
+    assert_equal 'jsmith@somenet.foo', u.mail
+  end
 end