From fd3f69d9277cade25b17cf9879d2541d23d8a643 Mon Sep 17 00:00:00 2001 From: Marcus Ilgner Date: Sun, 31 Oct 2010 21:27:13 +0800 Subject: [PATCH] Changed code to support basic i18n. Added RubyMine configuration and rvm setup to .gitignore. --- .gitignore | 2 + app/controllers/application_controller.rb | 12 +- app/controllers/login_controller.rb | 18 +- app/controllers/recurring_todos_controller.rb | 2 +- app/controllers/stats_controller.rb | 10 +- app/helpers/recurring_todos_helper.rb | 8 +- app/helpers/todos_helper.rb | 42 +- app/models/preference.rb | 10 - app/models/project.rb | 12 +- app/models/todo.rb | 2 +- app/models/user.rb | 4 +- app/views/contexts/_context.rhtml | 2 +- app/views/contexts/_context_form.rhtml | 4 +- app/views/contexts/_context_state_group.rhtml | 4 +- app/views/contexts/destroy.js.rjs | 2 +- app/views/contexts/error.js.rjs | 2 +- app/views/contexts/index.html.erb | 8 +- app/views/contexts/index.text.erb | 2 +- app/views/contexts/index_mobile.rhtml | 4 +- app/views/contexts/show.html.erb | 2 +- app/views/contexts/update.js.rjs | 2 +- app/views/contexts/update_context_name.js.rjs | 2 +- app/views/data/index.de.html.erb | 36 ++ app/views/data/yaml_form.de.html.erb | 17 + app/views/data/yaml_import.html.erb | 6 +- app/views/feedlist/index.html.erb | 46 +- app/views/integrations/_applescript1.rhtml | 4 +- app/views/integrations/google_gadget.erb | 2 +- app/views/integrations/index.de.html.erb | 130 +++++ app/views/integrations/search_plugin.rxml | 2 +- app/views/layouts/mobile.m.erb | 26 +- app/views/layouts/standard.html.erb | 44 +- app/views/login/check_expiry.js.rjs | 2 +- app/views/login/login.html.erb | 32 +- app/views/login/login_mobile.html.erb | 20 +- app/views/notes/_mobile_notes.rhtml | 6 +- app/views/notes/_note_edit_form.rhtml | 2 +- app/views/notes/_notes.rhtml | 12 +- app/views/notes/_notes_summary.rhtml | 2 +- app/views/notes/destroy.js.rjs | 2 +- app/views/notes/index.html.erb | 2 +- app/views/preferences/_help.html.erb | 22 + app/views/preferences/edit.html.erb | 35 +- app/views/preferences/index.html.erb | 68 +-- app/views/projects/index_mobile.rhtml | 6 +- app/views/projects/project_mobile.rhtml | 16 +- app/views/projects/show.html.erb | 10 +- app/views/projects/update.js.rjs | 2 +- .../projects/update_default_context.js.rjs | 4 +- app/views/projects/update_default_tags.js.rjs | 4 +- app/views/projects/update_project_name.js.rjs | 2 +- .../recurring_todos/_recurring_todo_form.erb | 103 ++-- app/views/recurring_todos/destroy.js.rjs | 7 +- app/views/recurring_todos/index.html.erb | 12 +- app/views/recurring_todos/toggle_check.js.rjs | 4 +- app/views/recurring_todos/update.js.rjs | 6 +- app/views/search/index.rhtml | 2 +- app/views/search/results.rhtml | 12 +- app/views/shared/_add_new_item_form.rhtml | 32 +- app/views/sidebar/_context_list.rhtml | 2 +- app/views/sidebar/_project_list.rhtml | 2 +- app/views/sidebar/sidebar.html.erb | 10 +- app/views/stats/_actions.rhtml | 14 +- app/views/stats/_contexts.rhtml | 4 +- app/views/stats/_projects.rhtml | 6 +- app/views/stats/_tags.rhtml | 13 +- app/views/stats/_totals.rhtml | 30 +- .../actions_completion_time_data.html.erb | 8 +- .../actions_day_of_week_30days_data.html.erb | 10 +- .../actions_day_of_week_all_data.html.erb | 10 +- .../actions_done_last12months_data.html.erb | 18 +- .../actions_done_last30days_data.html.erb | 14 +- .../stats/actions_done_last_years.html.erb | 2 +- .../actions_done_lastyears_data.html.erb | 14 +- .../stats/actions_running_time_data.html.erb | 8 +- .../actions_time_of_day_30days_data.html.erb | 10 +- .../actions_time_of_day_all_data.html.erb | 10 +- ...actions_visible_running_time_data.html.erb | 8 +- .../context_running_actions_data.html.erb | 2 +- .../stats/context_total_actions_data.html.erb | 2 +- app/views/stats/index.html.erb | 12 +- .../stats/show_selection_from_chart.html.erb | 10 +- app/views/todos/mobile_show_notes.rhtml | 8 +- app/views/todos/mobile_tag.rhtml | 12 +- app/views/todos/new.m.erb | 4 +- app/views/todos/remove_predecessor.js.rjs | 4 +- app/views/todos/show.m.erb | 4 +- app/views/todos/tag.html.erb | 10 +- app/views/todos/toggle_check.js.rjs | 4 +- app/views/todos/update.js.rjs | 7 +- app/views/users/change_auth_type.html.erb | 10 +- app/views/users/change_password.html.erb | 10 +- app/views/users/destroy.js.rjs | 4 +- app/views/users/index.html.erb | 28 +- app/views/users/new.html.erb | 14 +- app/views/users/nosignup.de.html.erb | 5 + config/locales/en.yml | 445 ++++++++++++++++++ lib/login_system.rb | 4 +- public/_doc/index.html | 70 --- 99 files changed, 1157 insertions(+), 601 deletions(-) mode change 100755 => 100644 app/controllers/stats_controller.rb create mode 100644 app/views/data/index.de.html.erb create mode 100644 app/views/data/yaml_form.de.html.erb create mode 100644 app/views/integrations/index.de.html.erb create mode 100644 app/views/preferences/_help.html.erb create mode 100644 app/views/users/nosignup.de.html.erb create mode 100644 config/locales/en.yml delete mode 100644 public/_doc/index.html diff --git a/.gitignore b/.gitignore index d62f537c..e59296a5 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,5 @@ rerun.txt public/javascripts/jquery-all.js public/javascripts/tracks.js public/stylesheets/all.css +.idea +.rvmrc diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index e94aac3a..90395e5d 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -33,10 +33,12 @@ class ApplicationController < ActionController::Base before_filter :set_session_expiration before_filter :set_time_zone before_filter :set_zindex_counter + before_filter :set_locale prepend_before_filter :login_required prepend_before_filter :enable_mobile_content_negotiation + after_filter :set_locale after_filter :set_charset - + include ActionView::Helpers::TextHelper include ActionView::Helpers::SanitizeHelper extend ActionView::Helpers::SanitizeHelper::ClassMethods @@ -47,6 +49,12 @@ class ApplicationController < ActionController::Base headers["Content-Type"] ||= "text/html; charset=UTF-8" end + def set_locale + locale = params[:locale] || request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first + I18n.locale = I18n::available_locales.include?(locale) ? locale : I18n.default_locale + logger.debug("Selected '#{I18n.locale}' as locale") + end + def set_session_expiration # http://wiki.rubyonrails.com/rails/show/HowtoChangeSessionOptions unless session == nil @@ -196,7 +204,7 @@ class ApplicationController < ActionController::Base def admin_login_required unless User.find_by_id_and_is_admin(session['user_id'], true) - render :text => "401 Unauthorized: Only admin users are allowed access to this function.", :status => 401 + render :text => t('errors.user_unauthorized'), :status => 401 return false end end diff --git a/app/controllers/login_controller.rb b/app/controllers/login_controller.rb index 5106686f..c8b8e734 100644 --- a/app/controllers/login_controller.rb +++ b/app/controllers/login_controller.rb @@ -50,7 +50,7 @@ class LoginController < ApplicationController return else @login = params['user_login'] - notify :warning, "Login unsuccessful" + notify :warning, t('login.unsuccessful') end when :get if User.no_users_yet? @@ -73,7 +73,7 @@ class LoginController < ApplicationController CASClient::Frameworks::Rails::Filter.logout(self) else reset_session - notify :notice, "You have been logged out of Tracks." + notify :notice, t('login.logged_out') redirect_to_login end end @@ -88,7 +88,7 @@ class LoginController < ApplicationController expiry_time = session['expiry_time'] || Time.now + 10 @time_left = expiry_time - Time.now if @time_left < (10*60) # Session will time out before the next check - @msg = "Session has timed out. Please " + @msg = 'login.session_time_out' else @msg = "" end @@ -107,8 +107,8 @@ class LoginController < ApplicationController if session[:cas_user] if @user = User.find_by_login(session[:cas_user]) session['user_id'] = @user.id - msg = (should_expire_sessions?) ? "will expire after 1 hour of inactivity." : "will not expire." - notify :notice, "Login successful: session #{msg}" + msg = (should_expire_sessions?) ? t('login.session_will_expire', :hours => 1) : t('login.session_will_not_expire') + notify :notice, (t('login.successful_with_session_info') + msg) cookies[:tracks_login] = { :value => @user.login, :expires => Time.now + 1.year, :secure => SITE_CONFIG['secure_cookies'] } unless should_expire_sessions? @user.remember_me @@ -116,7 +116,7 @@ class LoginController < ApplicationController end #redirect_back_or_home else - notify :warning, "Sorry, no user by that CAS username exists (#{session[:cas_user]})" + notify :warning, t('login.cas_username_not_found', :username => session[:cas_user]) redirect_to signup_url ; return end else @@ -149,8 +149,8 @@ class LoginController < ApplicationController if result.successful? if @user = User.find_by_open_id_url(identity_url) session['user_id'] = @user.id - msg = (should_expire_sessions?) ? "will expire after 1 hour of inactivity." : "will not expire." - notify :notice, "Login successful: session #{msg}" + msg = (should_expire_sessions?) ? t('login.session_will_expire', :hours => 1) : t('login.session_will_not_expire') + notify :notice, (t('login.successful_with_session_info') + msg) cookies[:tracks_login] = { :value => @user.login, :expires => Time.now + 1.year, :secure => SITE_CONFIG['secure_cookies'] } unless should_expire_sessions? @user.remember_me @@ -158,7 +158,7 @@ class LoginController < ApplicationController end redirect_back_or_home else - notify :warning, "Sorry, no user by that identity URL exists (#{identity_url})" + notify :warning, t('login.openid_identity_url_not_found', :identity_url => identity_url) end else notify :warning, result.message diff --git a/app/controllers/recurring_todos_controller.rb b/app/controllers/recurring_todos_controller.rb index 2bfcdc3b..c696eccc 100644 --- a/app/controllers/recurring_todos_controller.rb +++ b/app/controllers/recurring_todos_controller.rb @@ -14,7 +14,7 @@ class RecurringTodosController < ApplicationController @no_completed_recurring_todos = @completed_recurring_todos.size == 0 @count = @recurring_todos.size - @page_title = "TRACKS::Recurring Actions" + @page_title = t('todos.recurring_actions_title') end def new diff --git a/app/controllers/stats_controller.rb b/app/controllers/stats_controller.rb old mode 100755 new mode 100644 index 004b335c..c87ce450 --- a/app/controllers/stats_controller.rb +++ b/app/controllers/stats_controller.rb @@ -376,7 +376,7 @@ class StatsController < ApplicationController end if size==pie_cutoff - @actions_per_context[size-1]['name']='(others)' + @actions_per_context[size-1]['name']=t('stats.other_actions_label') @actions_per_context[size-1]['total']=0 @actions_per_context[size-1]['id']=-1 (size-1).upto @all_actions_per_context.size()-1 do |i| @@ -417,7 +417,7 @@ class StatsController < ApplicationController end if size==pie_cutoff - @actions_per_context[size-1]['name']='(others)' + @actions_per_context[size-1]['name']=t('stats.other_actions_label') @actions_per_context[size-1]['total']=0 @actions_per_context[size-1]['id']=-1 (size-1).upto @all_actions_per_context.size()-1 do |i| @@ -565,7 +565,7 @@ class StatsController < ApplicationController end def show_selected_actions_from_chart - @page_title = "TRACKS::Action selection" + @page_title = t('stats.action_selection_title') @count = 99 @source_view = 'stats' @@ -582,10 +582,10 @@ class StatsController < ApplicationController week_to = week_from+1 @chart_name = "actions_visible_running_time_data" - @page_title = "Actions selected from week " + @page_title = t('stats.actions_selected_from_week') @further = false if params['id'] == 'avrt_end' - @page_title += week_from.to_s + " and further" + @page_title += week_from.to_s + t('stats.actions_further') @further = true else @page_title += week_from.to_s + " - " + week_to.to_s + "" diff --git a/app/helpers/recurring_todos_helper.rb b/app/helpers/recurring_todos_helper.rb index 5376a9cb..e36e1a7f 100644 --- a/app/helpers/recurring_todos_helper.rb +++ b/app/helpers/recurring_todos_helper.rb @@ -13,13 +13,13 @@ module RecurringTodosHelper def recurring_todo_remote_delete_icon link_to( image_tag_for_delete, recurring_todo_path(@recurring_todo), :id => "delete_icon_"+@recurring_todo.id.to_s, - :class => "icon delete_icon", :title => "delete the recurring action '#{@recurring_todo.description}'") + :class => "icon delete_icon", :title => t('todos.delete_recurring_action', :description => @recurring_todo.description)) end def recurring_todo_remote_star_icon link_to( image_tag_for_star(@recurring_todo), toggle_star_recurring_todo_path(@recurring_todo), - :class => "icon star_item", :title => "star the action '#{@recurring_todo.description}'") + :class => "icon star_item", :title => t('todos.star_action')) end def recurring_todo_remote_edit_icon @@ -41,10 +41,10 @@ module RecurringTodosHelper private def image_tag_for_delete - image_tag("blank.png", :title =>"Delete action", :class=>"delete_item") + image_tag("blank.png", :title =>t('todos.delete_action'), :class=>"delete_item") end def image_tag_for_edit(todo) - image_tag("blank.png", :title =>"Edit action", :class=>"edit_item", :id=> dom_id(todo, 'edit_icon')) + image_tag("blank.png", :title =>t('todos.edit_action'), :class=>"edit_item", :id=> dom_id(todo, 'edit_icon')) end end diff --git a/app/helpers/todos_helper.rb b/app/helpers/todos_helper.rb index adb0704a..85512d89 100644 --- a/app/helpers/todos_helper.rb +++ b/app/helpers/todos_helper.rb @@ -21,26 +21,26 @@ module TodosHelper def remote_star_icon link_to( image_tag_for_star(@todo), toggle_star_todo_path(@todo), - :class => "icon star_item", :title => "star the action '#{@todo.description}'") + :class => "icon star_item", :title => t('todos.star_action_with_description', :description => @todo.description)) end def remote_edit_button link_to( - image_tag("blank.png", :alt => "Edit", :align => "absmiddle", :id => 'edit_icon_todo_'+@todo.id.to_s, :class => 'edit_item'), + image_tag("blank.png", :alt => t('todos.edit'), :align => "absmiddle", :id => 'edit_icon_todo_'+@todo.id.to_s, :class => 'edit_item'), {:controller => 'todos', :action => 'edit', :id => @todo.id}, :class => "icon edit_item", - :title => "Edit the action '#{@todo.description}'") + :title => t('todos.edit_action_with_description', :description => @todo.description)) end def remote_delete_menu_item(parameters, todo) return link_to_remote( - image_tag("delete_off.png", :mouseover => "delete_on.png", :alt => "Delete", :align => "absmiddle")+" Delete", + image_tag("delete_off.png", :mouseover => "delete_on.png", :alt => t('todos.delete'), :align => "absmiddle")+" "+t('todos.delete'), :url => {:controller => 'todos', :action => 'destroy', :id => todo.id}, :method => 'delete', :with => "'#{parameters}'", :before => todo_start_waiting_js(todo), :complete => todo_stop_waiting_js(todo), - :confirm => "Are you sure that you want to delete the action '#{todo.description}'?") + :confirm => t('todos.confirm_delete', :description => todo.description)) end def remote_defer_menu_item(days, todo) @@ -51,12 +51,12 @@ module TodosHelper futuredate = (@todo.show_from || @todo.user.date) + days.days if @todo.due && futuredate > @todo.due return link_to_function( - image_tag("defer_#{days}_off.png", :mouseover => "defer_#{days}.png", :alt => "Defer #{pluralize(days, "day")}", :align => "absmiddle")+" Defer #{pluralize(days, "day")}", - "alert('Defer date is after due date. Please edit and adjust due date before deferring.')" + image_tag("defer_#{days}_off.png", :mouseover => "defer_#{days}.png", :alt => t('todos.defer_x_days', :count => days), :align => "absmiddle")+" "+t('todos.defer_x_days', :count => days), + "alert('#{t('todos.defer_date_after_due_date')}')" ) else return link_to_remote( - image_tag("defer_#{days}_off.png", :mouseover => "defer_#{days}.png", :alt => "Defer #{pluralize(days, "day")}", :align => "absmiddle")+" Defer #{pluralize(days, "day")}", + image_tag("defer_#{days}_off.png", :mouseover => "defer_#{days}.png", :alt => t('todos.defer_x_days', :count => days), :align => "absmiddle")+" "+t('todos.defer_x_days', :count => days), :url => url, :before => todo_start_waiting_js(todo), :complete => todo_stop_waiting_js(todo)) @@ -68,7 +68,7 @@ module TodosHelper :_source_view => (@source_view.underscore.gsub(/\s+/,'_') rescue "")} url[:_tag_name] = @tag_name if @source_view == 'tag' - return link_to(image_tag("to_project_off.png", :align => "absmiddle")+" Make project", url) + return link_to(image_tag("to_project_off.png", :align => "absmiddle")+" " + t('todos.convert_to_project'), url) end def todo_start_waiting_js(todo) @@ -93,14 +93,14 @@ module TodosHelper def remote_toggle_checkbox check_box_tag('item_id', toggle_check_todo_path(@todo), @todo.completed?, :class => 'item-checkbox', - :title => @todo.pending? ? 'Blocked by ' + @todo.uncompleted_predecessors.map(&:description).join(', ') : "", :readonly => @todo.pending?) + :title => @todo.pending? ? t('todos.blocked_by', :predecessors => @todo.uncompleted_predecessors.map(&:description).join(', ')) : "", :readonly => @todo.pending?) end def date_span if @todo.completed? "#{format_date( @todo.completed_at )}" elsif @todo.pending? - "Pending " + "#{t('todos.pending')} " elsif @todo.deferred? show_date( @todo.show_from ) else @@ -111,7 +111,7 @@ module TodosHelper def successors_span unless @todo.pending_successors.empty? pending_count = @todo.pending_successors.length - title = "Has #{pluralize(pending_count, 'pending action')}: #{@todo.pending_successors.map(&:description).join(', ')}" + title = "#{t('todos.has_x_pending', :count => pending_count)}: #{@todo.pending_successors.map(&:description).join(', ')}" image_tag( 'successor_off.png', :width=>'10', :height=>'16', :border=>'0', :title => title ) end end @@ -119,7 +119,7 @@ module TodosHelper def grip_span unless @todo.completed? image_tag('grip.png', :width => '7', :height => '16', :border => '0', - :title => 'Drag onto another action to make it depend on that action', + :title => t('todos.drag_action_title'), :class => 'grip') end end @@ -150,7 +150,7 @@ module TodosHelper def deferred_due_date if @todo.deferred? && @todo.due - "(action due on #{format_date(@todo.due)})" + t('todos.action_due_on', :date => format_date(@todo.due)) end end @@ -207,21 +207,21 @@ module TodosHelper case days # overdue or due very soon! sound the alarm! when -1000..-1 - "Scheduled to show " + (days * -1).to_s + " days ago " + "#{t('todos.scheduled_overdue', :days => (days * -1).to_s)} " when 0 - "Show Today " + "#{t('todos.show_today')} " when 1 - "Show Tomorrow " + "#{t('todos.show_tomorrow')} " # due 2-7 days away when 2..7 if prefs.due_style == Preference.due_styles[:due_on] - "Show on " + d.strftime("%A") + " " + "#{t('todos.show_on_date', :date => d.strftime("%A"))} " else - "Show in " + days.to_s + " days " + "#{t('todos.show_in_days', :days => days.to_s)} " end # more than a week away - relax else - "Show in " + days.to_s + " days " + "#{t('todos.show_in_days', :days => days.to_s)} " end end @@ -300,7 +300,7 @@ module TodosHelper def image_tag_for_star(todo) class_str = todo.starred? ? "starred_todo" : "unstarred_todo" - image_tag("blank.png", :title =>"Star action", :class => class_str) + image_tag("blank.png", :title =>t('todos.star_action'), :class => class_str) end def auto_complete_result2(entries, phrase = nil) diff --git a/app/models/preference.rb b/app/models/preference.rb index 06dd95af..3223b8ae 100644 --- a/app/models/preference.rb +++ b/app/models/preference.rb @@ -6,16 +6,6 @@ class Preference < ActiveRecord::Base { :due_in_n_days => 0, :due_on => 1} end - def self.day_number_to_name_map - { 0 => "Sunday", - 1 => "Monday", - 2 => "Tuesday", - 3 => "Wednesday", - 4 => "Thursday", - 5 => "Friday", - 6 => "Saturday"} - end - def hide_completed_actions? return show_number_completed == 0 end diff --git a/app/models/project.rb b/app/models/project.rb index 20a75f97..07af5cbe 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -36,10 +36,10 @@ class Project < ActiveRecord::Base named_scope :hidden, :conditions => { :state => 'hidden' } named_scope :completed, :conditions => { :state => 'completed'} - validates_presence_of :name, :message => "project must have a name" - validates_length_of :name, :maximum => 255, :message => "project name must be less than 256 characters" - validates_uniqueness_of :name, :message => "already exists", :scope =>"user_id" - validates_does_not_contain :name, :string => ',', :message => "cannot contain the comma (',') character" + validates_presence_of :name + validates_length_of :name, :maximum => 255 + validates_uniqueness_of :name, :scope =>"user_id" + validates_does_not_contain :name, :string => ',' acts_as_list :scope => 'user_id = #{user_id} AND state = \'#{state}\'' acts_as_state_machine :initial => :active, :column => 'state' @@ -71,8 +71,8 @@ class Project < ActiveRecord::Base def self.feed_options(user) { - :title => 'Tracks Projects', - :description => "Lists all the projects for #{user.display_name}" + :title => t('models.project.feed_title'), + :description => t('models.project.feed_description', :username => user.display_name) } end diff --git a/app/models/todo.rb b/app/models/todo.rb index 13ae14b5..1888e72b 100644 --- a/app/models/todo.rb +++ b/app/models/todo.rb @@ -135,7 +135,7 @@ class Todo < ActiveRecord::Base def validate if !show_from.blank? && show_from < user.date - errors.add("show_from", "must be a date in the future") + errors.add("show_from", t('models.todo.error_date_must_be_future')) end errors.add(:description, "may not contain \" characters") if /\"/.match(description) unless @predecessor_array.nil? # Only validate predecessors if they changed diff --git a/app/models/user.rb b/app/models/user.rb index 068c0cb3..c5dbb910 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -13,7 +13,7 @@ class User < ActiveRecord::Base def update_positions(context_ids) context_ids.each_with_index do |id, position| context = self.detect { |c| c.id == id.to_i } - raise "Context id #{id} not associated with user id #{@user.id}." if context.nil? + raise I18n.t('models.user.error_context_not_associated', :context => id, :user => @user.id) if context.nil? context.update_attribute(:position, position + 1) end end @@ -27,7 +27,7 @@ class User < ActiveRecord::Base def update_positions(project_ids) project_ids.each_with_index do |id, position| project = self.detect { |p| p.id == id.to_i } - raise "Project id #{id} not associated with user id #{@user.id}." if project.nil? + raise I18n.t('models.user.error_project_not_associated', :project => id, :user => @user.id) if project.nil? project.update_attribute(:position, position + 1) end end diff --git a/app/views/contexts/_context.rhtml b/app/views/contexts/_context.rhtml index 105b66bb..a6eb63ab 100644 --- a/app/views/contexts/_context.rhtml +++ b/app/views/contexts/_context.rhtml @@ -13,7 +13,7 @@
-

Currently there are no incomplete actions in this context

+

<%= t 'contexts.no_actions' %>

<%= render :partial => "todos/todo", :collection => @not_done, :locals => { :parent_container_type => "context" } %>
diff --git a/app/views/contexts/_context_form.rhtml b/app/views/contexts/_context_form.rhtml index fc6d18c5..e22414f4 100644 --- a/app/views/contexts/_context_form.rhtml +++ b/app/views/contexts/_context_form.rhtml @@ -14,11 +14,11 @@
<%=image_tag("cancel.png", :alt => "") %> - Cancel + <%= t 'common.cancel' %>
diff --git a/app/views/contexts/_context_state_group.rhtml b/app/views/contexts/_context_state_group.rhtml index 835d2f44..3beb3d7b 100644 --- a/app/views/contexts/_context_state_group.rhtml +++ b/app/views/contexts/_context_state_group.rhtml @@ -1,7 +1,7 @@
-

<%= context_state_group.length %><%= state.titlecase %> Contexts

+

<%= context_state_group.length %><%= state.titlecase %> <%= t('common.contexts') %>

-

Currently there are no <%= state %> contexts

+

<%= t('contexts.no_contexts', :state => state) %>

<%= render :partial => 'context_listing', :collection => context_state_group %> diff --git a/app/views/contexts/destroy.js.rjs b/app/views/contexts/destroy.js.rjs index 6eb86848..56c32f53 100644 --- a/app/views/contexts/destroy.js.rjs +++ b/app/views/contexts/destroy.js.rjs @@ -3,4 +3,4 @@ page.delay(0.5) do page[dom_id(@context, "container")].remove end page['badge_count'].replace_html @down_count -page.notify :notice, "Deleted context '#{@context.name}'", 5.0 +page.notify :notice, t('contexts.context_deleted', :name=>@context.name), 5.0 diff --git a/app/views/contexts/error.js.rjs b/app/views/contexts/error.js.rjs index 4f82b3e4..b300ea67 100644 --- a/app/views/contexts/error.js.rjs +++ b/app/views/contexts/error.js.rjs @@ -1 +1 @@ -page.notify :error, @error_message || "An error occurred on the server.", 8.0 \ No newline at end of file +page.notify :error, @error_message || t('common.server_error'), 8.0 \ No newline at end of file diff --git a/app/views/contexts/index.html.erb b/app/views/contexts/index.html.erb index edfcc710..ea1ee468 100644 --- a/app/views/contexts/index.html.erb +++ b/app/views/contexts/index.html.erb @@ -7,7 +7,7 @@
@@ -20,16 +20,16 @@
<%= error_messages_for('context') %>
-
+
<%= text_field( "context", "name" ) %>
- + <%= check_box( "context", "hide" ) %>
diff --git a/app/views/contexts/index.text.erb b/app/views/contexts/index.text.erb index a88d10ac..3d60a918 100644 --- a/app/views/contexts/index.text.erb +++ b/app/views/contexts/index.text.erb @@ -1,5 +1,5 @@ <% current_user.contexts.each do |c| -%> <%= c.name.upcase %> -<%= count_undone_todos_phrase_text(c)%>. Context is <%= c.hidden? ? "Hidden" : "Active" %>. +<%= count_undone_todos_phrase_text(c)%>. <%= c.hidden? ? t('contexts.status_hidden') : t('contexts.status_active') %>. <% end -%> diff --git a/app/views/contexts/index_mobile.rhtml b/app/views/contexts/index_mobile.rhtml index 1edd16ed..1d78e9c8 100644 --- a/app/views/contexts/index_mobile.rhtml +++ b/app/views/contexts/index_mobile.rhtml @@ -1,2 +1,2 @@ -

Visible Contexts

<%= render :partial => 'mobile_context_listing', :collection => @active_contexts %> -

Hidden Contexts

<%= render :partial => 'mobile_context_listing', :collection => @hidden_contexts %> \ No newline at end of file +

<%= t('contexts.visible_contexts') %>

<%= render :partial => 'mobile_context_listing', :collection => @active_contexts %> +

<%= t('contexts.hidden_contexts') %>

<%= render :partial => 'mobile_context_listing', :collection => @hidden_contexts %> \ No newline at end of file diff --git a/app/views/contexts/show.html.erb b/app/views/contexts/show.html.erb index 41268330..8c5aa554 100644 --- a/app/views/contexts/show.html.erb +++ b/app/views/contexts/show.html.erb @@ -1,7 +1,7 @@
<%= render :partial => "contexts/context", :locals => { :context => @context, :collapsible => false } %> <% unless @max_completed==0 -%> - <%= render :partial => "todos/completed", :locals => { :done => @done, :suppress_context => true, :collapsible => false, :append_descriptor => "in this context (last #{prefs.show_number_completed})" } %> + <%= render :partial => "todos/completed", :locals => { :done => @done, :suppress_context => true, :collapsible => false, :append_descriptor => t('contexts.last_completed_in_context', :number=>prefs.show_number_completed) } %> <% end -%>
diff --git a/app/views/contexts/update.js.rjs b/app/views/contexts/update.js.rjs index b7c0e0aa..ad999bc5 100644 --- a/app/views/contexts/update.js.rjs +++ b/app/views/contexts/update.js.rjs @@ -1,4 +1,4 @@ -status_message = 'Context saved' +status_message = t('contexts.save_status_message') page.notify :notice, status_message, 5.0 if @context_state_changed page.remove dom_id(@context, 'container') diff --git a/app/views/contexts/update_context_name.js.rjs b/app/views/contexts/update_context_name.js.rjs index 9dd1d2e9..c23e9a63 100644 --- a/app/views/contexts/update_context_name.js.rjs +++ b/app/views/contexts/update_context_name.js.rjs @@ -4,5 +4,5 @@ page['todo_context_name'].value = @context.name # renew context auto complete array page << "contextAutoCompleter.options.array = #{context_names_for_autocomplete}; contextAutoCompleter.changed = true" -status_message = "Name of context was changed" +status_message = t('contexts.update_status_message') page.notify :notice, status_message, 5.0 diff --git a/app/views/data/index.de.html.erb b/app/views/data/index.de.html.erb new file mode 100644 index 00000000..f573030a --- /dev/null +++ b/app/views/data/index.de.html.erb @@ -0,0 +1,36 @@ +
+
+
+

Daten exportieren

+

Sie können zwischen den folgenden Formaten wählen:

+
    +
  • YAML: Für den Daten-Import bevorzugt.
    Bitte beachten Sie, dass der YAML-Import zur Zeit noch experimentelle Funktionalität darstellt. Nutzen Sie diese Option also nicht. um kritische Daten zu sichern.
  • +
  • CSV: Am besten für den Export in eine Tabellen-Kalkulation oder ähnliche Auswertungs-Software geeignet
  • +
  • XML: Am besten für den Daten-Import oder automatische Weiterverarbeitung
  • +
+
+

+ + + + + + + + + + + + + + + + + + + + + +
BeschreibungDownload link
YAML-Datei mit all Ihren Aktionen, Umgebungen, Projekten, Tags und Notizen<%= link_to "YAML Datei", :controller => 'data', :action => 'yaml_export' %>
CSV-Datei mit all Ihren Aktionen, benannten Umgebungen und Projekten<%= link_to "CSV Dile (Aktionen, Umgebungen und Projekte)", :controller => 'data', :action => 'csv_actions' %>
CSV-Datei mit all Ihren Notizen<%= link_to "CSV Datei (nur Notizen)", :controller => 'data', :action => 'csv_notes' %>
XML-Datei mit all Ihren Aktionen, Umgebungen, Projekten, Tags und Notizen<%= link_to "XML file (actions only)", :controller => 'data', :action => 'xml_export' %>
+
+
diff --git a/app/views/data/yaml_form.de.html.erb b/app/views/data/yaml_form.de.html.erb new file mode 100644 index 00000000..7f6baeb7 --- /dev/null +++ b/app/views/data/yaml_form.de.html.erb @@ -0,0 +1,17 @@ +
+
+
+

Vorsicht: vor dem Import der YAML Datei werden alle Daten in Ihrer Datenbank gelöscht. + Falls Sie entsprechenden Zugriff auf Ihre Datenbank haben, empfiehlt es sich, ein Backup anzulegen, + bevor Sie fortfahren. +

+

Fügen Sie den Inhalt der kopierten YAML Datei in das untenstehende Formular ein:

+
+

+ <% form_for :import, @import, :url => {:controller => 'data', :action => 'yaml_import'} do |f| %> + <%= f.text_area :yaml %>
+ + <% end %> +

+
+
diff --git a/app/views/data/yaml_import.html.erb b/app/views/data/yaml_import.html.erb index 2e9fcd5f..fff0144e 100644 --- a/app/views/data/yaml_import.html.erb +++ b/app/views/data/yaml_import.html.erb @@ -1,7 +1,5 @@ <% if !(@errmessage == '') %> -

There were these errors: -

<%= @errmessage  %>
-

+

<%= t('data.import_errors') %>:

<%= @errmessage %>

<% else %> -

Import was successful.

+

<%= t('data.import_successful') %>

<% end %> diff --git a/app/views/feedlist/index.html.erb b/app/views/feedlist/index.html.erb index 188b5ca9..d1d761f8 100644 --- a/app/views/feedlist/index.html.erb +++ b/app/views/feedlist/index.html.erb @@ -1,80 +1,80 @@
-

Legend:

+

<%= t('feedlist.legend') %>

-
<%= image_tag("feed-icon.png", :size => "16X16", :border => 0)%>
RSS Feed
-
TXT
Plain Text Feed
-
iCal
iCal feed
+
<%= image_tag("feed-icon.png", :size => "16X16", :border => 0)%>
<%= t('feedlist.rss_feed') %>
+
TXT
<%= t('feedlist.plain_text_feed') %>
+
iCal
<%= t('feedlist.ical_feed') %>
-

Note: All feeds show only actions that have not been marked as done.

+

<%= t('feedlist.notice_incomplete_only') %>

  • <%= rss_formatted_link({ :controller => 'todos', :action => 'index', :limit => 15 }) %> <%= text_formatted_link({ :controller => 'todos', :action => 'index', :limit => 15 }) %> <%= ical_formatted_link({ :controller => 'todos', :action => 'index', :limit => 15 }) %> - Last 15 actions + <%= t('feedlist.last_fixed_number', :number=>15) %>
  • <%= rss_formatted_link( { :controller => 'todos', :action => 'index' } ) %> <%= text_formatted_link( { :controller => 'todos', :action => 'index' } ) %> <%= ical_formatted_link( { :controller => 'todos', :action => 'index' } ) %> - All actions + <%= t('feedlist.all_actions') %>
  • <%= rss_formatted_link({ :controller => 'todos', :action => 'index', :due => 0 }) %> <%= text_formatted_link({ :controller => 'todos', :action => 'index', :due => 0 }) %> <%= ical_formatted_link({ :controller => 'todos', :action => 'index', :due => 0 }) %> - Actions due today or earlier + <%= t('feedlist.actions_due_today') %>
  • <%= rss_formatted_link({ :controller => 'todos', :action => 'index', :due => 6 }) %> <%= text_formatted_link({ :controller => 'todos', :action => 'index', :due => 6 }) %> <%= ical_formatted_link({ :controller => 'todos', :action => 'index', :due => 6 }) %> - Actions due in 7 days or earlier + <%= t('feedlist.actions_due_next_week') %>
  • <%= rss_formatted_link({ :controller => 'todos', :action => 'index', :done => 7 }) %> <%= text_formatted_link({ :controller => 'todos', :action => 'index', :done => 7 }) %> - Actions completed in the last 7 days + <%= t('feedlist.actions_completed_last_week') %>
  • <%= rss_formatted_link({:controller => 'contexts', :action => 'index'}) %> <%= text_formatted_link({:controller => 'contexts', :action => 'index'}) %> - All Contexts + <%= t('feedlist.all_contexts') %>
  • <%= rss_formatted_link({:controller => 'projects', :action => 'index'}) %> <%= text_formatted_link({:controller => 'projects', :action => 'index'}) %> - All Projects + <%= t('feedlist.all_projects') %>
  • <%= rss_formatted_link({:controller => 'projects', :action => 'index', :only_active_with_no_next_actions => true}) %> <%= text_formatted_link({:controller => 'projects', :action => 'index', :only_active_with_no_next_actions => true}) %> - Active projects with no next actions + <%= t('feedlist.active_projects_wo_next') %>
  • <%= rss_formatted_link({:controller => 'todos', :action => 'index', :tag => 'starred'}) %> <%= text_formatted_link({:controller => 'todos', :action => 'index', :tag => 'starred'}) %> - All starred, active actions + <%= t('feedlist.active_starred_actions') %>
  • <%= text_formatted_link({:controller => 'projects', :action => 'index', :projects_and_actions => true}) %> - Active projects with their actions + <%= t('feedlist.projects_and_actions') %>
  • -
  • Feeds for incomplete actions in a specific context:

    +
  • <%= t('feedlist.context_centric_actions') %>:

    <% if @active_contexts.empty? && @hidden_contexts.empty? -%> -
    • There need to be at least one context before you can request a feed
    +
    • <%= t('feedlist.context_needed') %>
    <% else -%>
      -
    • Step 1 - Choose the context you want a feed of: +
    • <%= t('common.numbered_step', :number => 1) %> - <%= t('feedlist.choose_context') %>:
    • -
    • Step 2 - Select the feed for this context +
    • <%= t('common.numbered_step', :number => 2) %> - <%= t('feedlist.select_feed_for_context') %>
      <%= render :partial => 'feed_for_context', :locals => { :context => @active_contexts.empty? ? @hidden_contexts.first : @active_contexts.first } %> @@ -84,19 +84,19 @@
    <% end -%>
  • -
  • Feeds for incomplete actions in a specific project:

    +
  • <%= t('feedlist.project_centric') %>:

    <% if @active_projects.empty? && @hidden_projects.empty? -%> -
    • There need to be at least one project before you can request a feed
    +
    • <%= t('feedlist.project_needed') %>
    <% else -%>
      -
    • Step 1 - Choose the project you want a feed of: +
    • <%= t('common.numbered_step', :number => 1) %> - <%= t('feedlist.choose_project') %>:
    • -
    • Step 2 - Select the feed for this project +
    • <%= t('common.numbered_step', :number => 2) %> - <%= t('feedlist.select_feed_for_project') %>
      <%= render :partial => 'feed_for_project', :locals => { :project => @active_projects.empty? ? @hidden_projects.first : @active_projects.first } %> diff --git a/app/views/integrations/_applescript1.rhtml b/app/views/integrations/_applescript1.rhtml index 9966ae8f..a0a2e14f 100644 --- a/app/views/integrations/_applescript1.rhtml +++ b/app/views/integrations/_applescript1.rhtml @@ -7,7 +7,7 @@ set myToken to "<%= current_user.token %>" set myContextID to <%= context.id %> (* <%= context.name %> *) -- Display dialog to enter your description -display dialog "Description of next action:" default answer "" +display dialog "<%= t('integrations.applescript_next_action_prompt') %>" default answer "" set myDesc to text returned of the result -- Now send all that info to Tracks @@ -17,4 +17,4 @@ tell application "<%= home_url %>backend/api" end tell -- Show the ID of the newly created next action -display dialog "New next action with id " & returnValue & " created" \ No newline at end of file +display dialog "<%= t('integrations.applescript_success_before_id') %> " & returnValue & " <%= t('integrations.applescript_success_after_id') %>" \ No newline at end of file diff --git a/app/views/integrations/google_gadget.erb b/app/views/integrations/google_gadget.erb index b08e89fa..f9e93562 100644 --- a/app/views/integrations/google_gadget.erb +++ b/app/views/integrations/google_gadget.erb @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/app/views/integrations/index.de.html.erb b/app/views/integrations/index.de.html.erb new file mode 100644 index 00000000..927bcf41 --- /dev/null +++ b/app/views/integrations/index.de.html.erb @@ -0,0 +1,130 @@ +<% has_contexts = !current_user.contexts.empty? -%> +

      Integration

      +

      Tracks kann mit verschiedenen Werkzeugen zusammenarbeiten... + was immer Sie brauchen, um Ihre Aufgaben zu erledigen! + Auf dieser Seite finden Sie Informationen, um einige dieser Werkzeuge einzurichten. + Diese Beispiele sind nicht unbedingt auf Ihre Umgebung anwendbar oder bedürfen mehr + technisches Wissen als andere. + Weitere Informationen finden Sie in der <%= link_to "Entwickler Documentation der Tracks' REST API", url_for(:action => 'rest_api') %> (englisch).

      +

      Inhalt:

      +
      +

      Sie haben weitere Beispiele? + Berichten Sie uns + in unserem Tipps&Tricks Forum, damit wir es für die nächsten Versionen berücksichtigen können. +

      + + +

      Eine Aktion mit Applescript hinzufügen

      +

      Dieses Beispiel-Script zeigt einen Dialog, welcher nach einer Beschreibung fragt und die Aufgabe in einem festen Kontext anlegt.

      + +<% if has_contexts -%> +
        +
      1. Wählen Sie den Kontext, für welchen die Aktion erstellt werden soll: +
      2. +
      3. Kopieren Sie das AppleScript in die Zwischenablage.
        + + +
      4. +
      5. Öffnen Sie den Script Editor und fügen die Daten in ein neues Script ein.
      6. +
      7. Kompilieren und speichern Sie das Script, um es bei Bedarf einzusetzen.
      8. +
      +<% else %> +

      Sie haben noch keinen Kontext angelegt. Dieses Script ist automatisch verfügbar, sobald Sie Ihren ersten Kontext angelegt haben.

      +<% end %> + + +

      Add an Action with Applescript based on the currently selected Email in Mail.app

      +

      This script takes the sender and subject of the selected email(s) in Mail and creates a new action for each one, with the description, "Email [sender] about [subject]". The description gets truncated to 100 characters (the validation limit for the field) if it is longer than that. It also has Growl notifications if you have Growl installed.

      + +<% if has_contexts -%> +
        +
      1. Choose the context you want to add actions to: +
      2. +
      3. Copy the Applescript below to the clipboard.
        + + +
      4. +
      5. Open Script Editor and paste the script into a new document.
      6. +
      7. Compile and save the script to the ~/Library/Scriipts/Mail Scripts directory.
      8. +
      9. For more information on using AppleScript with Mail.app, see this overview. +
      +<% else %> +

      You do not have any context yet. The script will be available after you add your first context

      +<% end %> + + +

      Add Actions with Quicksilver and Applescript

      + +

      This integration will allow you to add actions to Tracks via Quicksilver.

      + +<% if has_contexts -%> +
        +
      1. Choose the context you want to add actions to: +
      2. +
      3. Copy the Applescript below to the clipboard.
        + + +
      4. +
      5. Open Script Editor and paste the script into a new document.
      6. +
      7. Compile and save the script as "Add to Tracks.scpt" in ~/Library/Application Support/Quicksilver/Actions/ (you may need to create the Actions directory)
      8. +
      9. Restart Quicksilver
      10. +
      11. Activate Quicksilver (Ctrl+Space by default)
      12. +
      13. Press "." to put quicksilver into text mode
      14. +
      15. Type the description of the next action you want to add
      16. +
      17. Press tab to switch to the action pane.
      18. +
      19. By typing or scrolling, choose the "Add to Tracks" action.
      20. +
      +<% else %> +

      You do not have any context yet. The script will be available after you add your first context

      +<% end %> + + +

      Automatically Email Yourself Upcoming Actions

      + +

      If you enter the following entry to your crontab, you will receive email every day around 5 AM with a list of the upcoming actions which are due within the next 7 days.

      + + + +

      You can of course use other text <%= link_to 'feeds provided by Tracks', feeds_path %> -- why not email a list of next actions in a particular project to a group of colleagues who are working on the project?

      + + +

      Integrated email/SMS receiver

      +

      + If Tracks is running on the same server as your mail server, you can use the integrated mail handler built into tracks. Steps to set it up: +

        +
      • Go to <%= link_to "Preferences", preferences_url %> and set your "From email" and "default email context" for todos sent in via email (which could come from an SMS message)
      • +
      • In sendmail/qmail/postfix/whatever, set up an email address alias to pipe messages to
        /PATH/TO/RUBY/ruby /PATH/TO/TRACKS/script/runner -e production 'MessageGateway.receive(STDIN.read)'
      • +
      • Send an email to your newly configured address!
      • +
      +

      You can also use the Rich Todo API to send in tasks like "do laundry @ Home" + or "Call Bill > project X". The subject of the message will fill description, + context, and project, while the body will populate the tasks's note. +

      + + +

      Add Tracks as a Google Gmail gadget

      +

      + You can now manage your projects/actions inside Gmail using Tracks Gmail Gadget. + Add Tracks Gmail gadget to the sidebar of Gmail and track your next actions + or add new action without explicitly open new browser tab for Tracks. Steps to set it up: +

      +
        +
      • Sign in to Gmail and click Settings in the top right of your Gmail page. In Gmail setting page, click Labs tab
      • +
      • Enable the "Add any gadget by URL" feature. You will find it at bottom of the list. Select Enable radio button and click Save Changes button.
      • +
      • Now you can see Gadgets tab added to Gmail Settings. Go to the Gadgets tab
      • +
      • Paste following link to the Add a gadget by its URL: and then click Add button:
        +
        <%= integrations_url + "/google_gadget" %>
      • +
      + + + + + + \ No newline at end of file diff --git a/app/views/integrations/search_plugin.rxml b/app/views/integrations/search_plugin.rxml index f0c8b256..24bdec4c 100644 --- a/app/views/integrations/search_plugin.rxml +++ b/app/views/integrations/search_plugin.rxml @@ -3,7 +3,7 @@ xml.instruct! xml.OpenSearchDescription 'xmlns' => "http://a9.com/-/spec/opensearch/1.1/" do xml.ShortName Tracks - xml.Description 'Search in Tracks' + xml.Description t('integrations.opensearch_description') xml.InputEncoding 'UTF-8' xml.Image("data:image/x-icon;base64," + @icon_data, 'width' => '16', 'height' => '16') diff --git a/app/views/layouts/mobile.m.erb b/app/views/layouts/mobile.m.erb index 8bacf7c9..68c61a61 100644 --- a/app/views/layouts/mobile.m.erb +++ b/app/views/layouts/mobile.m.erb @@ -16,25 +16,25 @@

      <%= @down_count %> <%= current_user.time.strftime(@prefs.title_date_format) -%>

      <%= yield -%>
      <% if !@prefs.nil? -%> <% end -%> <%= render :partial => "shared/mobile_footer" -%> diff --git a/app/views/layouts/standard.html.erb b/app/views/layouts/standard.html.erb index 76800ad5..0d8af775 100644 --- a/app/views/layouts/standard.html.erb +++ b/app/views/layouts/standard.html.erb @@ -24,7 +24,7 @@ <% end -%> - <%= auto_discovery_link_tag(:rss, {:controller => "todos", :action => "index", :format => 'rss', :token => "#{current_user.token}"}, {:title => "RSS feed of next actions"}) %> + <%= auto_discovery_link_tag(:rss, {:controller => "todos", :action => "index", :format => 'rss', :token => "#{current_user.token}"}, {:title => t('layouts.next_actions_rss_feed')}) %> <%= @page_title %> @@ -40,47 +40,47 @@
      <%= render_flash %> diff --git a/app/views/login/check_expiry.js.rjs b/app/views/login/check_expiry.js.rjs index 20de31aa..d9984759 100644 --- a/app/views/login/check_expiry.js.rjs +++ b/app/views/login/check_expiry.js.rjs @@ -1,3 +1,3 @@ unless @msg == "" - page.replace_html "info", content_tag("div", @msg + link_to("log in again.", :controller => "login", :action => "login"), "class" => "warning") + page.replace_html "info", content_tag("div", t(@msg, :link => link_to(t('login.log_in_again'), :controller => "login", :action => "login"), "class" => "warning")) end \ No newline at end of file diff --git a/app/views/login/login.html.erb b/app/views/login/login.html.erb index c651165a..c22eb6ab 100644 --- a/app/views/login/login.html.erb +++ b/app/views/login/login.html.erb @@ -4,30 +4,30 @@ show_cas_form = auth_schemes.include?('cas') -%> -
      +
      <%= render_flash %> -

      Please log in to use Tracks:

      +

      <%= t('login.please_login') %>:

      <% if show_database_form %>
      "> <% form_tag :action=> 'login' do %> - + - + - + - +
      <% end %> @@ -39,16 +39,16 @@ <% form_tag :action=> 'login' do %> - + - + - +
      <% end %> @@ -61,15 +61,15 @@ <% if @username && @user%> -

      Hello, <%= @username %>! You are authenticated.

      +

      <%= t('login.cas_logged_in_greeting', :username => @username) %>

      <% elsif @username %> -

      Hello, <%= @username %>! You do not have an account on Tracks. +

      <%= t('login.cas_no_user_found', :username => @username) %> <%if SITE_CONFIG['open_signups']%> - If you like to request on please go here to <%= link_to "Request Account" , signup_url %> + <%= t('login.cas_create_account', :signup_link => link_to(t('login.cas_signup_link'), signup_url)) %> <%end%>

      <% else %> -

      <%= link_to("CAS Login", login_cas_url) %>

      +

      <%= link_to(t('login.cas_login'), login_cas_url) %>

      <% end %> @@ -78,9 +78,9 @@ <% end %>
      -<% if show_openid_form %>

      or, login with an OpenId

      <% end %> -<% if show_database_form %>

      or, go back to the standard login

      <% end %> -<% if show_cas_form %>

      or, go to the CAS

      <% end %> +<% if show_openid_form %>

      <%= t('login.option_separator') %> <%= t('login.login_with_openid') %>

      <% end %> +<% if show_database_form %>

      <%= t('login.option_separator') %> <%= t('login.login_standard') %>

      <% end %> +<% if show_cas_form %>

      <%= t('login.option_separator') %> <%= t('login.login_cas')%>

      <% end %>