diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 21594542..80694e74 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -79,9 +79,15 @@ module ApplicationHelper def format_time(time, include_date = true) return nil unless time time = time.to_time if time.is_a?(String) + zone = User.current.time_zone + if time.utc? + local = zone ? zone.adjust(time) : time.getlocal + else + local = zone ? zone.adjust(time.getutc) : time + end @date_format ||= (Setting.date_format.blank? || Setting.date_format.size < 2 ? l(:general_fmt_date) : Setting.date_format) @time_format ||= (Setting.time_format.blank? ? l(:general_fmt_time) : Setting.time_format) - include_date ? time.strftime("#{@date_format} #{@time_format}") : time.strftime(@time_format) + include_date ? local.strftime("#{@date_format} #{@time_format}") : local.strftime(@time_format) end def authoring(created, author) diff --git a/app/models/project.rb b/app/models/project.rb index 1fbab2e4..afaa049c 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -150,7 +150,7 @@ class Project < ActiveRecord::Base end def <=>(project) - name <=> project.name + name.downcase <=> project.name.downcase end def allows_to?(action) diff --git a/app/models/user.rb b/app/models/user.rb index 9c8d1d9a..2543bed1 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -130,6 +130,10 @@ class User < ActiveRecord::Base self.preference ||= UserPreference.new(:user => self) end + def time_zone + self.pref.time_zone.nil? ? nil : TimeZone[self.pref.time_zone] + end + # Return user's RSS key (a 40 chars long string), used to access feeds def rss_key token = self.rss_token || Token.create(:user => self, :action => 'feeds') @@ -231,6 +235,10 @@ class AnonymousUser < User false end + def time_zone + nil + end + # Anonymous user has no RSS key def rss_key nil diff --git a/app/views/my/account.rhtml b/app/views/my/account.rhtml index 11bba9c8..e6405177 100644 --- a/app/views/my/account.rhtml +++ b/app/views/my/account.rhtml @@ -14,6 +14,7 @@
<%= f.select :language, lang_options_for_select %>
<% fields_for :pref, @user.pref, :builder => TabularFormBuilder, :lang => current_language do |pref_fields| %> +<%= pref_fields.select :time_zone, TimeZone.all.collect {|z| [ z.to_s, z.name ]}, :include_blank => true %>
<%= pref_fields.check_box :hide_mail %>
<% end %> diff --git a/db/migrate/079_add_user_preferences_time_zone.rb b/db/migrate/079_add_user_preferences_time_zone.rb new file mode 100644 index 00000000..9e36790a --- /dev/null +++ b/db/migrate/079_add_user_preferences_time_zone.rb @@ -0,0 +1,9 @@ +class AddUserPreferencesTimeZone < ActiveRecord::Migration + def self.up + add_column :user_preferences, :time_zone, :string + end + + def self.down + remove_column :user_preferences, :time_zone + end +end diff --git a/lang/bg.yml b/lang/bg.yml index b60173ae..50b54cb7 100644 --- a/lang/bg.yml +++ b/lang/bg.yml @@ -544,3 +544,4 @@ mail_body_account_activation_request: 'A new user (%s) has registered. His accou label_registration_automatic_activation: automatic account activation label_registration_manual_activation: manual account activation notice_account_pending: "Your account was created and is now pending administrator approval." +field_time_zone: Time zone diff --git a/lang/cs.yml b/lang/cs.yml index 487ec967..d64e8d88 100644 --- a/lang/cs.yml +++ b/lang/cs.yml @@ -544,3 +544,4 @@ mail_body_account_activation_request: 'A new user (%s) has registered. His accou label_registration_automatic_activation: automatic account activation label_registration_manual_activation: manual account activation notice_account_pending: "Your account was created and is now pending administrator approval." +field_time_zone: Time zone diff --git a/lang/de.yml b/lang/de.yml index fc00753b..b25e8d93 100644 --- a/lang/de.yml +++ b/lang/de.yml @@ -544,3 +544,4 @@ mail_body_account_activation_request: 'A new user (%s) has registered. His accou label_registration_automatic_activation: automatic account activation label_registration_manual_activation: manual account activation notice_account_pending: "Your account was created and is now pending administrator approval." +field_time_zone: Time zone diff --git a/lang/en.yml b/lang/en.yml index 1df0cf7c..c1745b4e 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -169,6 +169,7 @@ field_assignable: Issues can be assigned to this role field_redirect_existing_links: Redirect existing links field_estimated_hours: Estimated time field_column_names: Columns +field_time_zone: Time zone setting_app_title: Application title setting_app_subtitle: Application subtitle diff --git a/lang/es.yml b/lang/es.yml index 5175e6c1..824c8468 100644 --- a/lang/es.yml +++ b/lang/es.yml @@ -547,3 +547,4 @@ mail_body_account_activation_request: 'A new user (%s) has registered. His accou label_registration_automatic_activation: automatic account activation label_registration_manual_activation: manual account activation notice_account_pending: "Your account was created and is now pending administrator approval." +field_time_zone: Time zone diff --git a/lang/fr.yml b/lang/fr.yml index 8e1af9a4..322ddd26 100644 --- a/lang/fr.yml +++ b/lang/fr.yml @@ -169,6 +169,7 @@ field_assignable: Demandes assignables à ce rôle field_redirect_existing_links: Rediriger les liens existants field_estimated_hours: Temps estimé field_column_names: Colonnes +field_time_zone: Fuseau horaire setting_app_title: Titre de l'application setting_app_subtitle: Sous-titre de l'application diff --git a/lang/he.yml b/lang/he.yml index 26e808e0..f630fe05 100644 --- a/lang/he.yml +++ b/lang/he.yml @@ -544,3 +544,4 @@ mail_body_account_activation_request: 'A new user (%s) has registered. His accou label_registration_automatic_activation: automatic account activation label_registration_manual_activation: manual account activation notice_account_pending: "Your account was created and is now pending administrator approval." +field_time_zone: Time zone diff --git a/lang/it.yml b/lang/it.yml index a8007089..f103e18c 100644 --- a/lang/it.yml +++ b/lang/it.yml @@ -544,3 +544,4 @@ mail_body_account_activation_request: 'A new user (%s) has registered. His accou label_registration_automatic_activation: automatic account activation label_registration_manual_activation: manual account activation notice_account_pending: "Your account was created and is now pending administrator approval." +field_time_zone: Time zone diff --git a/lang/ja.yml b/lang/ja.yml index 86a104d1..3a801fcf 100644 --- a/lang/ja.yml +++ b/lang/ja.yml @@ -545,3 +545,4 @@ mail_body_account_activation_request: 'A new user (%s) has registered. His accou label_registration_automatic_activation: automatic account activation label_registration_manual_activation: manual account activation notice_account_pending: "Your account was created and is now pending administrator approval." +field_time_zone: Time zone diff --git a/lang/ko.yml b/lang/ko.yml index e46a6395..3886d778 100644 --- a/lang/ko.yml +++ b/lang/ko.yml @@ -544,3 +544,4 @@ mail_body_account_activation_request: 'A new user (%s) has registered. His accou label_registration_automatic_activation: automatic account activation label_registration_manual_activation: manual account activation notice_account_pending: "Your account was created and is now pending administrator approval." +field_time_zone: Time zone diff --git a/lang/nl.yml b/lang/nl.yml index 1758514a..1397f4c6 100644 --- a/lang/nl.yml +++ b/lang/nl.yml @@ -545,3 +545,4 @@ mail_body_account_activation_request: 'A new user (%s) has registered. His accou label_registration_automatic_activation: automatic account activation label_registration_manual_activation: manual account activation notice_account_pending: "Your account was created and is now pending administrator approval." +field_time_zone: Time zone diff --git a/lang/pl.yml b/lang/pl.yml index e2d90de7..7796d6d2 100644 --- a/lang/pl.yml +++ b/lang/pl.yml @@ -102,12 +102,12 @@ field_value: Wartość field_category: Kategoria field_title: Tytuł field_project: Projekt -field_issue: Zgłoszenie +field_issue: Zagadnienie field_status: Status field_notes: Notatki -field_is_closed: Zgłoszenie zamknięte +field_is_closed: Zagadnienie zamknięte field_is_default: Domyślny status -field_tracker: Typ zgłoszenia +field_tracker: Typ zagadnienia field_subject: Temat field_due_date: Data oddania field_assigned_to: Przydzielony do @@ -117,9 +117,9 @@ field_user: Użytkownik field_role: Rola field_homepage: Strona www field_is_public: Publiczny -field_parent: Subprojekt -field_is_in_chlog: Zgłoszenia pokazane w zapisie zmian -field_is_in_roadmap: Zgłoszenia pokazane na mapie +field_parent: Podprojekt +field_is_in_chlog: Zagadnienie pokazywane w zapisie zmian +field_is_in_roadmap: Zagadnienie pokazywane na mapie field_login: Login field_mail_notification: Powiadomienia Email field_admin: Administrator @@ -152,8 +152,8 @@ field_hours: Godzin field_activity: Aktywność field_spent_on: Data field_identifier: Identifikator -field_is_filter: Używane jako filter -field_issue_to_id: Powiązane zgłoszenie +field_is_filter: Atrybut filtrowania +field_issue_to_id: Powiązania zagadnienia field_delay: Opóźnienie setting_app_title: Tytuł aplikacji @@ -163,7 +163,7 @@ setting_default_language: Domyślny język setting_login_required: Identyfikacja wymagana setting_self_registration: Własna rejestracja umożliwiona setting_attachment_max_size: Maks. rozm. załącznika -setting_issues_export_limit: Limit eksportu zgłoszeń +setting_issues_export_limit: Limit eksportu zagadnień setting_mail_from: Adres email wysyłki setting_host_name: Nazwa hosta setting_text_formatting: Formatowanie tekstu @@ -184,10 +184,10 @@ label_project_new: Nowy projekt label_project_plural: Projekty label_project_all: Wszystkie projekty label_project_latest: Ostatnie projekty -label_issue: Zgłoszenie -label_issue_new: Nowe zgłoszenie -label_issue_plural: Zgłoszenia -label_issue_view_all: Zobacz wszystkie zgłoszenia +label_issue: Zagadnienie +label_issue_new: Nowe zagadnienie +label_issue_plural: Zagadnienia +label_issue_view_all: Zobacz wszystkie zagadnienia label_document: Dokument label_document_new: Nowy dokument label_document_plural: Dokumenty @@ -198,15 +198,15 @@ label_role_and_permissions: Role i Uprawnienia label_member: Uczestnik label_member_new: Nowy uczestnik label_member_plural: Uczestnicy -label_tracker: Typ zgłoszenia -label_tracker_plural: Typy zgłoszeń -label_tracker_new: Nowy typ zgłoszenia +label_tracker: Typ zagadnienia +label_tracker_plural: Typy zagadnień +label_tracker_new: Nowy typ zagadnienia label_workflow: Przepływ -label_issue_status: Status zgłoszenia -label_issue_status_plural: Statusy zgłoszeń +label_issue_status: Status zagadnienia +label_issue_status_plural: Statusy zagadnień label_issue_status_new: Nowy status -label_issue_category: Kategoria zgłoszenia -label_issue_category_plural: Kategorie zgłoszeń +label_issue_category: Kategoria zagadnienia +label_issue_category_plural: Kategorie zagadnień label_issue_category_new: Nowa kategoria label_custom_field: Dowolne pole label_custom_field_plural: Dowolne pola @@ -226,8 +226,8 @@ label_administration: Administracja label_login: Login label_logout: Wylogowanie label_help: Pomoc -label_reported_issues: Zaraportowane zgłoszenia -label_assigned_to_me_issues: Zgłoszenia przypisane do mnie +label_reported_issues: Wprowadzone zagadnienia +label_assigned_to_me_issues: Zagadnienia przypisane do mnie label_last_login: Ostatnie połączenie label_last_updates: Ostatnia zmieniana label_last_updates_plural: %d ostatnie zmiany @@ -244,8 +244,8 @@ label_subproject_plural: Podprojekty label_min_max_length: Min - Maks długość label_list: Lista label_date: Data -label_integer: L. pojedyńcza -label_boolean: Wart. logiczna +label_integer: Liczba całkowita +label_boolean: Wartość logiczna label_string: Tekst label_text: Długi tekst label_attribute: Atrybut @@ -333,7 +333,7 @@ label_deleted: usunięte label_latest_revision: Ostatnia zmiana label_latest_revision_plural: Ostatnie zmiany label_view_revisions: Pokaż zmiany -label_max_size: Kamsymalny rozmiar +label_max_size: Maksymalny rozmiar label_on: 'włączone' label_sort_highest: Przesuń na górę label_sort_higher: Do góry @@ -341,7 +341,7 @@ label_sort_lower: Do dołu label_sort_lowest: Przesuń na dół label_roadmap: Mapa label_roadmap_due_in: W czasie -label_roadmap_no_issues: Brak zgłoszeń do tej wersji +label_roadmap_no_issues: Brak zagadnień do tej wersji label_search: Szukaj label_result_plural: Rezultatów label_all_words: Wszystkie słowa @@ -356,7 +356,7 @@ label_current_version: Obecna wersja label_preview: Podgląd label_feed_plural: Ilość RSS label_changes_details: Szczegóły wszystkich zmian -label_issue_tracking: Śledzenie zgłoszeń +label_issue_tracking: Śledzenie zagadnień label_spent_time: Spędzony czas label_f_hour: %.2f godzina label_f_hour_plural: %.2f godzin @@ -371,8 +371,8 @@ label_diff_side_by_side: obok siebie label_options: Opcje label_copy_workflow_from: Kopiuj przepływ z label_permissions_report: Raport uprawnień -label_watched_issues: Obserwowane zgłoszenia -label_related_issues: Powiązane zgłoszenia +label_watched_issues: Obserwowane zagadnienia +label_related_issues: Powiązane zagadnienia label_applied_status: Stosowany status label_loading: Ładowanie... label_relation_new: Nowe powiązanie @@ -446,7 +446,7 @@ text_select_mail_notifications: Zaznacz czynności przy których użytkownik pow text_regexp_info: np. ^[A-Z0-9]+$ text_min_max_length_info: 0 oznacza brak restrykcji text_project_destroy_confirmation: Jesteś pewien, że chcesz usunąć ten projekt i wszyskie powiązane dane? -text_workflow_edit: Zaznacz rolę i typ zgłoszenia do edycji przepływu +text_workflow_edit: Zaznacz rolę i typ zagadnienia do edycji przepływu text_are_you_sure: Jesteś pewien ? text_journal_changed: zmienione %s do %s text_journal_set_to: ustawione na %s @@ -457,14 +457,14 @@ text_tip_task_begin_end_day: zadanie zaczynające i kończące się dzisiaj text_project_identifier_info: 'Małe litery (a-z), liczby i myślniki dozwolone.