From eb3454072ffe168c2f3ebcb4afd91795b72b738b Mon Sep 17 00:00:00 2001 From: Bryan Helmkamp Date: Sun, 30 Jun 2013 21:38:22 -0700 Subject: [PATCH 001/213] Add Code Climate badge to README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a8185cef4f..4e8c33a37d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Fat Free CRM [![TravisCI][travis-img-url]][travis-ci-url] +# Fat Free CRM [![TravisCI][travis-img-url]][travis-ci-url] [![Code Climate](https://codeclimate.com/github/fatfreecrm/fat_free_crm.png)](https://codeclimate.com/github/fatfreecrm/fat_free_crm) [travis-img-url]: https://secure.travis-ci.org/fatfreecrm/fat_free_crm.png?branch=master [travis-ci-url]: http://travis-ci.org/fatfreecrm/fat_free_crm From 848c7a159a523debb28204519db15db454a748b8 Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Wed, 3 Jul 2013 17:34:16 +0800 Subject: [PATCH 002/213] Introducing client-side unobtrusive javascript for new comments. Includes new spinner and disables 'Add Note' button when pressed. --- app/assets/javascripts/application.js.erb | 1 + app/assets/javascripts/crm_comments.js.coffee | 66 +++++++++++++++++++ app/controllers/comments_controller.rb | 28 -------- app/views/comments/_edit.html.haml | 2 +- app/views/comments/_new.html.haml | 5 +- app/views/comments/create.js.haml | 2 + app/views/comments/new.js.haml | 13 ---- config/routes.rb | 2 +- spec/routing/comments_routing_spec.rb | 9 --- ...w.js.haml_spec.rb => edit.js.haml_spec.rb} | 21 +++--- 10 files changed, 86 insertions(+), 63 deletions(-) create mode 100644 app/assets/javascripts/crm_comments.js.coffee delete mode 100644 app/views/comments/new.js.haml rename spec/views/comments/{new.js.haml_spec.rb => edit.js.haml_spec.rb} (51%) diff --git a/app/assets/javascripts/application.js.erb b/app/assets/javascripts/application.js.erb index 557e48dcdd..71be8426a6 100644 --- a/app/assets/javascripts/application.js.erb +++ b/app/assets/javascripts/application.js.erb @@ -32,6 +32,7 @@ //= require jquery_ui_datepicker/jquery-ui-timepicker-addon //= require admin/fields //= require format_buttons +//= require crm_comments //= require_self <% diff --git a/app/assets/javascripts/crm_comments.js.coffee b/app/assets/javascripts/crm_comments.js.coffee new file mode 100644 index 0000000000..c816c83543 --- /dev/null +++ b/app/assets/javascripts/crm_comments.js.coffee @@ -0,0 +1,66 @@ +# Copyright (c) 2008-2013 Michael Dvorkin and contributors. +# +# Fat Free CRM is freely distributable under the terms of MIT license. +# See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php +#------------------------------------------------------------------------------ + +# When comments are added to an entity, disable the add button +# and add a spinner to indicate request is processing +(($j) -> + + addSpinnerToComments = -> + $j('div.new_comment').each -> + container = $j(this) + unless container.hasClass('withSpinner') + container.find('form').on 'submit', -> + container.find('form [type=submit]').attr("disabled", "disabled") + container.find('.spinner').show() + container.addClass("withSpinner") + + toggleComment = (container) -> + baseId = container.attr('id').replace('_comment_new', '') + post = container.find('#' + baseId + '_post') + ask = container.find('#' + baseId + '_ask') + comment = container.find('#' + baseId + '_comment_comment') + post.toggle() + ask.toggle() + if comment.is(":visible") + container.find('form [type=submit]').removeAttr("disabled") + container.find('.spinner').hide() + comment.focus() + + addOpenCloseToComments = -> + $j('div.new_comment').each -> + container = $j(this) + unless container.hasClass('withOpenClose') + baseId = container.attr('id').replace('_comment_new', '') + post = container.find('#' + baseId + '_post') + ask = container.find('#' + baseId + '_ask') + container.find('.cancel').on 'click', (event) -> + toggleComment(container) + false + new_comment = container.find('#' + baseId + '_post_new_note') + new_comment.on 'click', -> + toggleComment(container) + crm.textarea_user_autocomplete(baseId + '_comment_comment') + container.addClass("withOpenClose") + + # Apply when document is loaded + $j(document).ready -> + addSpinnerToComments() + addOpenCloseToComments() + + # Apply when jquery event (e.g. search) occurs + $j(document).ajaxComplete -> + addSpinnerToComments() + addOpenCloseToComments() + + # Apply when protoype event (e.g. cancel edit) occurs + Ajax.Responders.register({ + onComplete: -> + addSpinnerToComments() + addOpenCloseToComments() + + }) + +)(jQuery) diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 06781defe4..876816ba5b 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -6,8 +6,6 @@ class CommentsController < ApplicationController before_filter :require_user - - # GET /comments # GET /comments.json # GET /comments.xml @@ -31,24 +29,6 @@ def index end end - # GET /comments/new - # GET /comments/new.json - # GET /comments/new.xml AJAX - #---------------------------------------------------------------------------- - def new - @comment = Comment.new - @commentable = extract_commentable_name(params) - - if @commentable - update_commentable_session - unless @commentable.classify.constantize.my.find_by_id(params[:"#{@commentable}_id"]) - respond_to_related_not_found(@commentable) and return - end - end - - respond_with(@comment) - end - # GET /comments/1/edit AJAX #---------------------------------------------------------------------------- def edit @@ -106,12 +86,4 @@ def extract_commentable_name(params) params.keys.detect {|x| x =~ /_id$/ }.try(:sub, /_id$/, '') end - #---------------------------------------------------------------------------- - def update_commentable_session - if params[:cancel].true? - session.delete("#{@commentable}_new_comment") - else - session["#{@commentable}_new_comment"] = true - end - end end diff --git a/app/views/comments/_edit.html.haml b/app/views/comments/_edit.html.haml index c1c23fb1e0..cba37ed0d8 100644 --- a/app/views/comments/_edit.html.haml +++ b/app/views/comments/_edit.html.haml @@ -8,4 +8,4 @@ %div{:style => "padding:6px 0px 0px 40px;"} = f.submit t(:save_note) #{t :or} - = link_to(t(:cancel), edit_comment_path("#{class_name}_id" => commentable, :cancel => true), :remote => true) + = link_to(t(:cancel), edit_comment_path(@comment, "#{class_name}_id" => commentable.id, :cancel => true), :remote => true) diff --git a/app/views/comments/_new.html.haml b/app/views/comments/_new.html.haml index 6300d3ae15..8c5a246ca7 100644 --- a/app/views/comments/_new.html.haml +++ b/app/views/comments/_new.html.haml @@ -23,11 +23,12 @@ = hidden_field_tag "comment[commentable_type]", class_name.classify, :id => "#{id_prefix}_comment_commentable_type" = f.text_area :comment, :id => "#{id_prefix}_comment_comment" %div{:style => "padding:6px 0px 0px 40px;"} + = image_tag("loading.gif", :size => :thumb, :class => "spinner", :style => "display: none;") = f.submit t(:add_note), :id => "#{id_prefix}_comment_submit" #{t :or} - = link_to(t(:cancel), new_comment_path("#{class_name}_id" => commentable) + '&cancel=true', :remote => true) + = link_to(t(:cancel), '#', :class => 'cancel') %div{ {:id => "#{id_prefix}_ask"}.merge(hidden_if(false))} - = text_field_tag :post_new_note, t(:add_note_help), :onclick => remote_function(:url => new_comment_path("#{class_name}_id" => commentable), :method => :get), :id => "#{id_prefix}_post_new_note" + = text_field_tag :post_new_note, t(:add_note_help), :id => "#{id_prefix}_post_new_note" - if notification_emails_configured? = render :partial => "comments/subscription_links", :locals => {:entity => commentable} diff --git a/app/views/comments/create.js.haml b/app/views/comments/create.js.haml index 6d7fdbcb65..71160fe519 100644 --- a/app/views/comments/create.js.haml +++ b/app/views/comments/create.js.haml @@ -10,3 +10,5 @@ jQuery('##{id_prefix}_shown_notes').val('#{ j @comment.commentable.comment_ids.join(',') }'); jQuery('##{id_prefix}_comment_comment').val(''); jQuery('##{id_prefix}_comment_comment').focus(); +jQuery('##{id_prefix}_post').find('form [type=submit]').removeAttr("disabled") +jQuery('##{id_prefix}_post').find('.spinner').hide() diff --git a/app/views/comments/new.js.haml b/app/views/comments/new.js.haml deleted file mode 100644 index 6eb52c0192..0000000000 --- a/app/views/comments/new.js.haml +++ /dev/null @@ -1,13 +0,0 @@ -- id_prefix = "#{@commentable}_" + params["#{@commentable}_id"] - - -- if session["#{@commentable}_new_comment"] - jQuery('##{id_prefix}_ask').hide(); - jQuery('##{id_prefix}_post').show(); - jQuery('##{id_prefix}_comment_comment').focus(); -- else - jQuery('##{id_prefix}_post').hide(); - jQuery('##{id_prefix}_ask').show(); - - -crm.textarea_user_autocomplete('#{id_prefix}_comment_comment'); diff --git a/config/routes.rb b/config/routes.rb index 00b2c2d7ff..aeb9234feb 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -22,7 +22,7 @@ match '/home/redraw', :as => :redraw resource :authentication - resources :comments + resources :comments, :except => [:new, :show] resources :emails resources :passwords diff --git a/spec/routing/comments_routing_spec.rb b/spec/routing/comments_routing_spec.rb index b9cb4236a2..565b700f8c 100644 --- a/spec/routing/comments_routing_spec.rb +++ b/spec/routing/comments_routing_spec.rb @@ -12,14 +12,6 @@ { :get => "/comments" }.should route_to(:controller => "comments", :action => "index") end - it "recognizes and generates #new" do - { :get => "/comments/new" }.should route_to(:controller => "comments", :action => "new") - end - - it "recognizes and generates #show" do - { :get => "/comments/1" }.should route_to(:controller => "comments", :action => "show", :id => "1") - end - it "recognizes and generates #edit" do { :get => "/comments/1/edit" }.should route_to(:controller => "comments", :action => "edit", :id => "1") end @@ -37,4 +29,3 @@ end end end - diff --git a/spec/views/comments/new.js.haml_spec.rb b/spec/views/comments/edit.js.haml_spec.rb similarity index 51% rename from spec/views/comments/new.js.haml_spec.rb rename to spec/views/comments/edit.js.haml_spec.rb index a50f482bd0..e26601ca8d 100644 --- a/spec/views/comments/new.js.haml_spec.rb +++ b/spec/views/comments/edit.js.haml_spec.rb @@ -3,24 +3,27 @@ # Fat Free CRM is freely distributable under the terms of MIT license. # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php #------------------------------------------------------------------------------ -require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper') +require 'spec_helper' -describe "/comments/new" do +describe "/comments/edit" do include CommentsHelper before do assign(:comment, stub_model(Comment, - :new_record? => true + :id => 321, + :new_record? => false, + :commentable => stub_model(Contact, :id => '123') + )) + #params["contact_id"] = "123" + assign(:current_user, stub_model(User, + :email => 'test@example.com' )) - assign(:commentable, "contact") - params["contact_id"] = "123" end - it "should render new form" do + it "should render edit form" do render - rendered.should include("hide()") - rendered.should include("show()") + rendered.should include("textarea") + rendered.should include("123") end end - From fb7de4182abc71026ccc0092595a852d018b7a1c Mon Sep 17 00:00:00 2001 From: Philipp Ullmann Date: Wed, 3 Jul 2013 14:28:14 +0200 Subject: [PATCH 003/213] Only pre-select account of related entity, if not nil --- app/controllers/entities/opportunities_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/entities/opportunities_controller.rb b/app/controllers/entities/opportunities_controller.rb index 94c11f4ebd..13d5b2c48c 100644 --- a/app/controllers/entities/opportunities_controller.rb +++ b/app/controllers/entities/opportunities_controller.rb @@ -39,7 +39,7 @@ def new model, id = params[:related].split('_') if related = model.classify.constantize.my.find_by_id(id) instance_variable_set("@#{model}", related) - @account = related.account if related.respond_to?(:account) + @account = related.account if related.try(:account) else respond_to_related_not_found(model) and return end From ff23d4b8a05ee6dba8ba696b23d318a287220cf3 Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Wed, 3 Jul 2013 21:32:00 +0800 Subject: [PATCH 004/213] Fixed comments tests. --- spec/controllers/comments_controller_spec.rb | 80 +------------------- 1 file changed, 1 insertion(+), 79 deletions(-) mode change 100644 => 100755 spec/controllers/comments_controller_spec.rb diff --git a/spec/controllers/comments_controller_spec.rb b/spec/controllers/comments_controller_spec.rb old mode 100644 new mode 100755 index db173c29dc..d78e97d3d6 --- a/spec/controllers/comments_controller_spec.rb +++ b/spec/controllers/comments_controller_spec.rb @@ -3,7 +3,7 @@ # Fat Free CRM is freely distributable under the terms of MIT license. # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php #------------------------------------------------------------------------------ -require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') +require 'spec_helper' describe CommentsController do @@ -76,84 +76,6 @@ end - # GET /comments/1 - # GET /comments/1.xml not implemented - #---------------------------------------------------------------------------- - # describe "responding to GET show" do - # - # it "should expose the requested comment as @comment" do - # Comment.should_receive(:find).with("37").and_return(mock_comment) - # get :show, :id => "37" - # assigns[:comment].should equal(mock_comment) - # end - # - # describe "with mime type of xml" do - # it "should render the requested comment as xml" do - # request.env["HTTP_ACCEPT"] = "application/xml" - # Comment.should_receive(:find).with("37").and_return(mock_comment) - # mock_comment.should_receive(:to_xml).and_return("generated XML") - # get :show, :id => "37" - # response.body.should == "generated XML" - # end - # end - # - # end - - # GET /comments/new - # GET /comments/new.xml AJAX - #---------------------------------------------------------------------------- - describe "responding to GET new" do - - COMMENTABLE.each do |asset| - it "should expose a new comment as @comment for #{asset}" do - @asset = FactoryGirl.create(asset) - @comment = Comment.new - - xhr :get, :new, "#{asset}_id".to_sym => @asset.id - assigns[:comment].attributes.should == @comment.attributes - assigns[:commentable].should == asset.to_s - response.should render_template("comments/new") - end - - it "should save the fact that a comment gets added to #{asset}" do - @asset = FactoryGirl.create(asset) - @comment = Comment.new - - xhr :get, :new, "#{asset}_id".to_sym => @asset.id - session["#{asset}_new_comment"].should == true - end - - it "should clear the session if user cancels a comment for #{asset}" do - @asset = FactoryGirl.create(asset) - @comment = Comment.new - - xhr :get, :new, "#{asset}_id".to_sym => @asset.id, :cancel => "true" - session["#{asset}_new_comment"].should == nil - end - - it "should redirect to #{asset}'s index page with the message if the #{asset} got deleted" do - @asset = FactoryGirl.create(asset) - @asset.destroy - @comment = Comment.new - - xhr :get, :new, "#{asset}_id".to_sym => @asset.id - flash[:warning].should_not == nil - response.body.should =~ %r(window.location.href)m - response.body.should =~ %r(#{asset.to_s.pluralize})m - end - - it "should redirect to #{asset}'s index page with the message if the #{asset} got protected" do - @asset = FactoryGirl.create(asset, :access => "Private") - @comment = Comment.new - - xhr :get, :new, "#{asset}_id".to_sym => @asset.id - flash[:warning].should_not == nil - response.body.should =~ %r(window.location.href)m - response.body.should =~ %r(#{asset.to_s.pluralize})m - end - end - end - # GET /comments/1/edit AJAX #---------------------------------------------------------------------------- describe "responding to GET edit" do From 01bd6193b4eb60467c27be71fa8fbae3aa74a3e3 Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Thu, 4 Jul 2013 10:35:12 +0800 Subject: [PATCH 005/213] Updated ajax-chosen-rails. --- Gemfile.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index e501adbd85..f2a0071585 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -36,7 +36,7 @@ GEM sqlite3 acts_as_list (0.1.6) addressable (2.3.3) - ajax-chosen-rails (0.2.1) + ajax-chosen-rails (0.2.2) chosen-rails_ffcrm railties (~> 3.0) thor (~> 0.14) @@ -123,14 +123,14 @@ GEM haml (3.1.7) headless (1.0.1) highline (1.6.15) - hike (1.2.1) + hike (1.2.3) htmlentities (4.3.1) i18n (0.6.1) journey (1.0.4) jquery-rails (2.1.4) railties (>= 3.0, < 5.0) thor (>= 0.14, < 2.0) - json (1.7.7) + json (1.8.0) kgio (2.7.4) libv8 (3.3.10.4) listen (0.7.3) @@ -140,7 +140,7 @@ GEM treetop (~> 1.4.8) method_source (0.7.1) mime-types (1.23) - multi_json (1.7.2) + multi_json (1.7.7) net-scp (1.0.4) net-ssh (>= 1.99.1) net-sftp (2.0.5) @@ -200,7 +200,7 @@ GEM rdoc (~> 3.4) thor (>= 0.14.6, < 2.0) raindrops (0.8.0) - rake (10.0.3) + rake (10.1.0) ransack (0.7.2) actionpack (~> 3.0) activerecord (~> 3.0) @@ -273,8 +273,8 @@ GEM daemons (>= 1.0.9) eventmachine (>= 0.12.6) rack (>= 1.0.0) - thor (0.17.0) - tilt (1.3.6) + thor (0.18.1) + tilt (1.4.1) treetop (1.4.12) polyglot polyglot (>= 0.3.1) From 99b4f73cf3a99276f931c6dea7d472a1a54b4b66 Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Thu, 4 Jul 2013 14:03:58 +0800 Subject: [PATCH 006/213] respond_to? covers case where method doesn't exist. E.g. if related is an account. --- app/controllers/entities/opportunities_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/entities/opportunities_controller.rb b/app/controllers/entities/opportunities_controller.rb index 13d5b2c48c..94c11f4ebd 100644 --- a/app/controllers/entities/opportunities_controller.rb +++ b/app/controllers/entities/opportunities_controller.rb @@ -39,7 +39,7 @@ def new model, id = params[:related].split('_') if related = model.classify.constantize.my.find_by_id(id) instance_variable_set("@#{model}", related) - @account = related.account if related.try(:account) + @account = related.account if related.respond_to?(:account) else respond_to_related_not_found(model) and return end From dd211d5efc4b8fb2f12e09b580d73bcbe2baa944 Mon Sep 17 00:00:00 2001 From: Philipp Ullmann Date: Thu, 4 Jul 2013 08:16:54 +0200 Subject: [PATCH 007/213] Ensure that @account is never nil, to avoid "method not found" exception within view --- app/controllers/entities/opportunities_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/entities/opportunities_controller.rb b/app/controllers/entities/opportunities_controller.rb index 94c11f4ebd..a6e57c7d8e 100644 --- a/app/controllers/entities/opportunities_controller.rb +++ b/app/controllers/entities/opportunities_controller.rb @@ -39,7 +39,7 @@ def new model, id = params[:related].split('_') if related = model.classify.constantize.my.find_by_id(id) instance_variable_set("@#{model}", related) - @account = related.account if related.respond_to?(:account) + @account = related.account if related.respond_to?(:account) && !related.account.nil? else respond_to_related_not_found(model) and return end From 33f3db1588040f24c2be73f01a521d7f4edfb4e6 Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Thu, 4 Jul 2013 15:01:12 +0800 Subject: [PATCH 008/213] Just check once if we have email settings. --- app/models/polymorphic/comment.rb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/models/polymorphic/comment.rb b/app/models/polymorphic/comment.rb index 8a61c5da17..e713d35af7 100644 --- a/app/models/polymorphic/comment.rb +++ b/app/models/polymorphic/comment.rb @@ -44,12 +44,10 @@ def subscribe_user_to_entity(u = user) # Notify subscribed users when a comment is added, unless user created this comment def notify_subscribers + return unless Rails.application.config.action_mailer.smtp_settings.present? commentable.subscribed_users.reject{|user_id| user_id == user.id}.each do |subscriber_id| if subscriber = User.find_by_id(subscriber_id) - # Only send email if SMTP settings are configured - if Rails.application.config.action_mailer.smtp_settings.present? - SubscriptionMailer.comment_notification(subscriber, self).deliver - end + SubscriptionMailer.comment_notification(subscriber, self).deliver end end end From 1a3ba14f3f62229a6097d0d721bcc22b01f1b83f Mon Sep 17 00:00:00 2001 From: Philipp Ullmann Date: Thu, 4 Jul 2013 11:30:30 +0200 Subject: [PATCH 009/213] Added german translations for "ransack" --- lib/tasks/ffcrm/missing_translations.rake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/tasks/ffcrm/missing_translations.rake b/lib/tasks/ffcrm/missing_translations.rake index 861fa78b99..e6b111039f 100644 --- a/lib/tasks/ffcrm/missing_translations.rake +++ b/lib/tasks/ffcrm/missing_translations.rake @@ -13,7 +13,8 @@ namespace :ffcrm do base_locale = 'en-US' [[base_locale, args[:locale]], - ["#{base_locale}_fat_free_crm", "#{args[:locale]}_fat_free_crm"]].each do |locale_file_names| + ["#{base_locale}_fat_free_crm", "#{args[:locale]}_fat_free_crm"], + ["#{base_locale}_ransack", "#{args[:locale]}_ransack"]].each do |locale_file_names| detector = MissingTranslationDetector.new locale_file_names.first, locale_file_names.last detector.detect From 24460a2d00309d89bec38fea77029557d28cf22f Mon Sep 17 00:00:00 2001 From: Philipp Ullmann Date: Thu, 4 Jul 2013 11:31:07 +0200 Subject: [PATCH 010/213] Added german translations for "ransack" --- config/locales/de_ransack.yml | 92 +++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 config/locales/de_ransack.yml diff --git a/config/locales/de_ransack.yml b/config/locales/de_ransack.yml new file mode 100644 index 0000000000..71e2c10de1 --- /dev/null +++ b/config/locales/de_ransack.yml @@ -0,0 +1,92 @@ +de: + ransack: + search: "suche" + predicate: "aussage" + and: "und" + or: "oder" + any: "mindestens eins" + all: "alle" + combinator: "kombinator" + attribute: "attribut" + value: "wert" + condition: "bedingung" + sort: "sortieren" + asc: "aufsteigend" + desc: "absteigend" + + submit: Suche + add_group: Füge eine Gruppe von Filtern hinzu + group_first: Zeige Ergebnisse von %{combinator} für die folgenden Treffer + group_rest: ...und %{combinator} für die folgenden Treffer + add_condition: Füge einen Filter hinzu + remove_condition: Entferne einen Filter + + predicates: + eq: "entspricht" + eq_any: "entspricht einem" + eq_all: "entspricht allen" + not_eq: "entspricht nicht" + not_eq_any: "entspricht mindestens einem nicht" + not_eq_all: "entspricht allen nicht" + matches: "trifft zu" + matches_any: "trifft bei mindestens einem zu" + matches_all: "trifft bei allen zu" + does_not_match: "trifft nicht zu" + does_not_match_any: "trifft bei mindestens einem nicht zu" + does_not_match_all: "trifft bei keinem zu" + lt: "weniger als" + lt_any: "mindestens eins kleiner" + lt_all: "alle kleiner" + lteq: "kleiner oder gleich" + lteq_any: "mindestens eines kleiner oder gleich" + lteq_all: "alle kleiner oder gleich" + gt: "größer als" + gt_any: "mindestens eines größer" + gt_all: "alle größer" + gteq: "größer oder gleich" + gteq_any: "mindestens eines größer oder gleich" + gteq_all: "alle größer oder gleich" + in: "ist innerhalb" + in_any: "ist innerhalb von einem" + in_all: "ist innerhalb von allen" + not_in: "ist nicht enthalten" + not_in_any: "ist in einem nicht enthalten" + not_in_all: "ist in allen nicht enthalten" + cont: "enthält" + cont_any: "enthält einen" + cont_all: "enthält alle" + not_cont: "beinhaltet nicht" + not_cont_any: "beinhaltet mindestens eine nicht" + not_cont_all: "beinhaltet alle nicht" + start: "beginnt mit" + start_any: "mindestens eines beginnt mit" + start_all: "alle beginnen mit" + not_start: "beginnt nicht mit" + not_start_any: "mindestens eines beginnt nicht mit" + not_start_all: "alle beginnen nicht mit" + end: "endet mit" + end_any: "mindestens eines endet mit" + end_all: "alle enden mit" + not_end: "endet nicht mit" + not_end_any: "mindestens eines endet nicht mit" + not_end_all: "alle enden nicht mit" + 'true': "ist wahr" + 'false': "ist falsch" + present: "existiert" + blank: "ist leer" + 'null': "ist null" + not_null: "ist nicht null" + alt: + date: + lt: "ist bevor" + lt_any: "mindestens eines ist bevor" + lt_all: "alle sind bevor" + lteq: "ist bevor oder am" + lteq_any: "mindestens eines ist bevor oder am" + lteq_all: "alle sind bevor oder am" + gt: "ist nach" + gt_any: "mindestens eines ist nach" + gt_all: "alle sind nach" + gteq: "ist danach oder am" + gteq_any: "mindestens eines ist danach oder am" + gteq_all: "alle sind danach oder am" From e6f4712edc4daa1d1d3c9ad6be060eb3d5286bf6 Mon Sep 17 00:00:00 2001 From: Philipp Ullmann Date: Thu, 4 Jul 2013 13:34:57 +0200 Subject: [PATCH 011/213] Possibility to explicitly select a campaign during creation and update of an opportunity --- app/controllers/entities/opportunities_controller.rb | 1 + app/models/entities/contact.rb | 2 ++ app/views/opportunities/_new.html.haml | 1 - app/views/opportunities/_top_section.html.haml | 4 ++++ 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/controllers/entities/opportunities_controller.rb b/app/controllers/entities/opportunities_controller.rb index a6e57c7d8e..aeef779755 100644 --- a/app/controllers/entities/opportunities_controller.rb +++ b/app/controllers/entities/opportunities_controller.rb @@ -40,6 +40,7 @@ def new if related = model.classify.constantize.my.find_by_id(id) instance_variable_set("@#{model}", related) @account = related.account if related.respond_to?(:account) && !related.account.nil? + @campaign = related.campaign if related.respond_to?(:campaign) else respond_to_related_not_found(model) and return end diff --git a/app/models/entities/contact.rb b/app/models/entities/contact.rb index 74ceb0a95c..6198202f6d 100644 --- a/app/models/entities/contact.rb +++ b/app/models/entities/contact.rb @@ -49,6 +49,8 @@ class Contact < ActiveRecord::Base has_many :addresses, :dependent => :destroy, :as => :addressable, :class_name => "Address" # advanced search uses this has_many :emails, :as => :mediator + delegate :campaign, :to => :lead, :allow_nil => true + has_ransackable_associations %w(account opportunities tags activities emails addresses comments tasks) ransack_can_autocomplete diff --git a/app/views/opportunities/_new.html.haml b/app/views/opportunities/_new.html.haml index 3d1fdb2cbe..177ac162b5 100644 --- a/app/views/opportunities/_new.html.haml +++ b/app/views/opportunities/_new.html.haml @@ -2,7 +2,6 @@ = link_to_close new_opportunity_path = f.hidden_field :user_id = hidden_field_tag "contact", "#{@contact.id if @contact}" - = hidden_field_tag "campaign", "#{@campaign.id if @campaign}" = f.error_messages :object_name => t('opportunity') diff --git a/app/views/opportunities/_top_section.html.haml b/app/views/opportunities/_top_section.html.haml index 828bbbed38..dde90cf4e1 100644 --- a/app/views/opportunities/_top_section.html.haml +++ b/app/views/opportunities/_top_section.html.haml @@ -43,6 +43,10 @@ %td .label.req #{t :assigned_to}: = user_select(:opportunity, all_users, current_user) + %tr + %td + .label #{t :campaign}: + = f.collection_select "campaign_id", Campaign.all, :id, :name, { :selected => (@campaign.try(:id) || 0), :include_blank => true } - if Setting.background_info && Setting.background_info.include?(:opportunity) %tr From c733c4e93c2f7761432ff6e3d979c5baa8808b61 Mon Sep 17 00:00:00 2001 From: Reuben Salagaras Date: Fri, 5 Jul 2013 14:20:57 +0930 Subject: [PATCH 012/213] fixed missing ; in edit.js.haml --- app/views/accounts/edit.js.haml | 2 +- app/views/campaigns/edit.js.haml | 2 +- app/views/contacts/edit.js.haml | 2 +- app/views/leads/edit.js.haml | 2 +- app/views/opportunities/edit.js.haml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/views/accounts/edit.js.haml b/app/views/accounts/edit.js.haml index a767843d90..8bdc71991c 100644 --- a/app/views/accounts/edit.js.haml +++ b/app/views/accounts/edit.js.haml @@ -21,7 +21,7 @@ -# Disable onMouseOver for the list item. crm.highlight_off('#{id}'); -# Hide [Create] form if any. - crm.hide_form('create_#{entity_name}') + crm.hide_form('create_#{entity_name}'); -# Show [Edit] form. jQuery('##{id}').html('#{ j render(:partial => "edit") }'); diff --git a/app/views/campaigns/edit.js.haml b/app/views/campaigns/edit.js.haml index 779d54e1b4..b8fa0c2edd 100755 --- a/app/views/campaigns/edit.js.haml +++ b/app/views/campaigns/edit.js.haml @@ -21,7 +21,7 @@ -# Disable onMouseOver for the list item. crm.highlight_off('#{id}'); -# Hide [Create] form if any. - crm.hide_form('create_#{entity_name}') + crm.hide_form('create_#{entity_name}'); -# Show [Edit] form. jQuery('##{id}').html('#{ j render(:partial => "edit") }'); diff --git a/app/views/contacts/edit.js.haml b/app/views/contacts/edit.js.haml index aa5a5ebda4..b0a1a3ad41 100644 --- a/app/views/contacts/edit.js.haml +++ b/app/views/contacts/edit.js.haml @@ -22,7 +22,7 @@ -# Disable onMouseOver for the list item. crm.highlight_off('#{id}'); -# Hide [Create] form if any. - crm.hide_form('create_#{entity_name}') + crm.hide_form('create_#{entity_name}'); -# Show [Edit] form. jQuery('##{id}').html('#{ j render(:partial => "edit") }'); diff --git a/app/views/leads/edit.js.haml b/app/views/leads/edit.js.haml index 2bd9cff53e..62571bfbb6 100755 --- a/app/views/leads/edit.js.haml +++ b/app/views/leads/edit.js.haml @@ -21,7 +21,7 @@ -# Disable onMouseOver for the list item. crm.highlight_off('#{id}'); -# Hide [Create] form if any. - crm.hide_form('create_#{entity_name}') + crm.hide_form('create_#{entity_name}'); -# Show [Edit] form. jQuery('##{id}').html('#{ j render(:partial => "edit") }'); diff --git a/app/views/opportunities/edit.js.haml b/app/views/opportunities/edit.js.haml index ed68a4e328..c1b079b755 100644 --- a/app/views/opportunities/edit.js.haml +++ b/app/views/opportunities/edit.js.haml @@ -22,7 +22,7 @@ -# Disable onMouseOver for the list item. crm.highlight_off('#{id}'); -# Hide [Create] form if any. - crm.hide_form('create_#{entity_name}') + crm.hide_form('create_#{entity_name}'); -# Show [Edit] form. jQuery('##{id}').html('#{ j render(:partial => "edit") }'); From 6f467432b759061431da6f62f6790fcff73955d3 Mon Sep 17 00:00:00 2001 From: Reuben Salagaras Date: Fri, 5 Jul 2013 14:24:13 +0930 Subject: [PATCH 013/213] allow permissions partial to render for models with underscored names --- app/views/entities/_permissions.html.haml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/entities/_permissions.html.haml b/app/views/entities/_permissions.html.haml index 2dbb178c43..3c039e4fd1 100644 --- a/app/views/entities/_permissions.html.haml +++ b/app/views/entities/_permissions.html.haml @@ -1,5 +1,6 @@ - edit ||= false -- model = entity.class.name.downcase +-# model = entity.class.name.downcase +- model = entity.class.name.underscore # needed for models with underscored names - collapsed = session[:entity_permissions].nil? = subtitle :entity_permissions, collapsed, t(:permissions) .section From bda2ca49e4118d1c7ab5830bbeefc95b2cb8dbb9 Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Fri, 5 Jul 2013 15:29:37 +0800 Subject: [PATCH 014/213] [ci skip] Tidied up pull request. --- app/views/entities/_permissions.html.haml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/views/entities/_permissions.html.haml b/app/views/entities/_permissions.html.haml index 3c039e4fd1..a6a3123c9e 100644 --- a/app/views/entities/_permissions.html.haml +++ b/app/views/entities/_permissions.html.haml @@ -1,6 +1,5 @@ - edit ||= false --# model = entity.class.name.downcase -- model = entity.class.name.underscore # needed for models with underscored names +- model = entity.class.name.underscore - collapsed = session[:entity_permissions].nil? = subtitle :entity_permissions, collapsed, t(:permissions) .section From b905581bdc3ec90d196f38d95db509931abd063c Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Tue, 9 Jul 2013 15:39:28 +0800 Subject: [PATCH 015/213] Added hook to view_factory. --- lib/fat_free_crm/view_factory.rb | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/fat_free_crm/view_factory.rb b/lib/fat_free_crm/view_factory.rb index e1abd7df40..17a31e40b6 100644 --- a/lib/fat_free_crm/view_factory.rb +++ b/lib/fat_free_crm/view_factory.rb @@ -3,6 +3,7 @@ # Fat Free CRM is freely distributable under the terms of MIT license. # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php #------------------------------------------------------------------------------ + module FatFreeCRM # A view factory keeps track of views and the contexts in which they are available. @@ -15,7 +16,7 @@ module FatFreeCRM # Icon is optional. If specified, it will be passed to asset_path. # class ViewFactory - + include Comparable @@views = [] @@ -24,13 +25,13 @@ class ViewFactory # Class methods #---------------------------------------------------------------------------- class << self - + # Register with the view factory #---------------------------------------------------------------------------- def register(view) @@views << view unless @@views.map(&:id).include?(view.id) end - + # Return views that are available based on context #---------------------------------------------------------------------------- def views_for(options = {}) @@ -41,7 +42,7 @@ def views_for(options = {}) view.controllers.include?(controller) and view.actions.include?(action) and (name.present? ? view.name == name : true) end end - + # Return template name of the current view # pass in options[:name] to specify view name #---------------------------------------------------------------------------- @@ -72,12 +73,14 @@ def <=>(other) end private - + # This defines what it means for one view to be different to another #---------------------------------------------------------------------------- def generate_id [name, controllers.sort, actions.sort].flatten.map(&:to_s).map(&:underscore).join('_') end + ActiveSupport.run_load_hooks(:fat_free_crm_view_factory, self) + end end From e6a88c37969b1e3245f9cd373955efffeb907f5f Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Wed, 24 Jul 2013 11:43:22 +0800 Subject: [PATCH 016/213] Fixed syck to psych file --- lib/tasks/ffcrm/config.rake | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/lib/tasks/ffcrm/config.rake b/lib/tasks/ffcrm/config.rake index aeae48bef6..cebfde722d 100644 --- a/lib/tasks/ffcrm/config.rake +++ b/lib/tasks/ffcrm/config.rake @@ -25,20 +25,17 @@ namespace :ffcrm do # desc "Ensures all yaml files in the config folder are readable by Psych. If not, assumes file is in the Syck format and converts it for you [creates a new file]." task :syck_to_psych do - error_count = 0 - total_files = 0 + require 'fileutils' + require 'syck' + require 'psych' Dir[File.join(Rails.root, 'config', '**', '*.yml')].each do |file| - begin - Psych.load_file(file) - rescue Psych::SyntaxError => e - puts e # prints error message with line number - File.open("#{file}.new", 'w') {|f| f.puts Psych.dump(Syck.load_file(file)) } - puts "Have written Psych compatible file to #{file}.new" - error_count += 1 - end - total_files += 1 + YAML::ENGINE.yamler = 'syck' + puts "Converting #{file}" + yml = YAML.load( File.read(file) ) + FileUtils.cp file, "#{file}.bak" + YAML::ENGINE.yamler = 'psych' + File.open(file, 'w'){ |file| file.write(YAML.dump(yml)) } end - puts "Scanned #{total_files} yml files. Found #{error_count} problems (see above)." end end From c5eb187388752247fe8c82967506e3f9a315e933 Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Wed, 24 Jul 2013 11:49:16 +0800 Subject: [PATCH 017/213] Converted locale files to from syck to psych --- config/locales/cz.yml | 456 ++++---- config/locales/cz_fat_free_crm.yml | 286 ++--- config/locales/de.yml | 280 +++-- config/locales/de_fat_free_crm.yml | 1491 +++++++++++++------------ config/locales/de_ransack.yml | 163 ++- config/locales/en-GB.yml | 277 +++-- config/locales/en-GB_fat_free_crm.yml | 434 +++---- config/locales/en-US.yml | 279 +++-- config/locales/en-US_fat_free_crm.yml | 345 +++--- config/locales/en-US_ransack.yml | 163 ++- config/locales/es.yml | 287 +++-- config/locales/es_fat_free_crm.yml | 360 +++--- config/locales/fr-CA.yml | 297 ++--- config/locales/fr-CA_fat_free_crm.yml | 344 +++--- config/locales/fr.yml | 295 ++--- config/locales/fr_fat_free_crm.yml | 501 ++++----- config/locales/it.yml | 280 +++-- config/locales/it_fat_free_crm.yml | 273 ++--- config/locales/ja.yml | 293 ++--- config/locales/ja_fat_free_crm.yml | 306 ++--- config/locales/pl.yml | 300 ++--- config/locales/pl_fat_free_crm.yml | 301 ++--- config/locales/pt-BR.yml | 287 ++--- config/locales/pt-BR_fat_free_crm.yml | 307 +++-- config/locales/ru.yml | 489 ++++---- config/locales/ru_fat_free_crm.yml | 329 +++--- config/locales/sv-SE.yml | 345 +++--- config/locales/sv-SE_fat_free_crm.yml | 322 +++--- config/locales/th_fat_free_crm.yml | 308 ++--- config/locales/zh-CN.yml | 325 +++--- config/locales/zh-CN_fat_free_crm.yml | 245 ++-- 31 files changed, 5233 insertions(+), 5735 deletions(-) diff --git a/config/locales/cz.yml b/config/locales/cz.yml index 708afefcac..f2d2d8564c 100644 --- a/config/locales/cz.yml +++ b/config/locales/cz.yml @@ -1,213 +1,247 @@ -# Czech translations for Ruby on Rails (inspired by the Slovak localization - thanx to Jozef Fulop) -# by Jozef Chmel (chmel@jchsoft.cz) - +--- cz: - # Date - date: - formats: - default: "%d.%m.%Y" - short: "%d %b" - long: "%d. %B %Y" - rfc822: "%e %b %Y" - compact: "%y%m%d" - - day_names: [Neděle, Pondělí, Úterý, Středa, Čtvrtek, Pátek, Sobota] - abbr_day_names: [Ne, Po, Út, St, Čt, Pá, So] - - month_names: [~, Leden, Únor, Březen, Duben, Květen, Červen, Červenec, Srpen, Září, Říjen, Listopad, Prosinec] - abbr_month_names: [~, Led, Úno, Bře, Dub, Kvě, Čvn, Čvc, Srp, Zář, Říj, Lis, Pro] - order: [ day, month, year] - - # Time - time: - formats: - default: "%a %d. %B %Y %H:%M %z" - short: "%d.%m. %H:%M" - long: "%A %d. %B %Y %H:%M" - am: "dopoledne" - pm: "odpoledne" - - # ActiveSupport - support: - array: - words_connector: ", " - two_words_connector: " a " - last_word_connector: " a " - select: - prompt: "Prosím vyberte si." - - # Numbers - number: - format: - precision: 3 - separator: "." - delimiter: "," - significant: false - strip_insignificant_zeros: false - - currency: - format: - unit: "Kč" - precision: 2 - format: "%n %u" - separator: "," - delimiter: " " - significant: false - strip_insignificant_zeros: false - - percentage: - format: - delimiter: "" - - precision: - format: - delimiter: "" - - human: - format: - precision: 1 - delimiter: "" - significant: false - strip_insignificant_zeros: false - - storage_units: - format: "%n %u" - units: - byte: - other: "B" - one: "B" - kb: "KB" - mb: "MB" - gb: "GB" - tb: "TB" - decimal_units: - format: "%n %u" - units: - unit: "" - thousand: Tisíc - million: Milión - billion: Miliarda - trillion: Trilión - quadrillion: Quadrilión - - # Distance of time ... helper - datetime: - prompts: - second: "Sekunda" - minute: "Minuta" - hour: "Hodina" - day: "Den" - month: "Měsíc" - year: "Rok" - distance_in_words: - half_a_minute: 'půl minutou' - less_than_x_seconds: - one: 'asi před sekundou' - other: 'asi před %{count} sekundami' - x_seconds: - one: 'sekundou' - other: '%{count} sekundami' - less_than_x_minutes: - one: 'před necelou minutou' - other: 'před ani ne %{count} minutami' - x_minutes: - one: 'minutou' - other: '%{count} minutami' - about_x_hours: - one: 'asi hodinou' - other: 'asi %{count} hodin' - x_days: - one: '24 hodin' - other: '%{count} dny' - about_x_months: - one: 'asi měsícem' - other: 'asi %{count} měsíci' - x_months: - one: 'měsícem' - other: '%{count} měsíci' - about_x_years: - one: 'asi rokem' - other: 'asi %{count} roky' - over_x_years: - one: 'před víc jak rokem' - other: 'víc jak %{count} roky' - almost_x_years: - one: "téměř rokem" - other: "téměř %{count} roky" - - helpers: - select: - prompt: "Prosím vyberte si" - - submit: - create: 'Vytvořit %{model}' - update: 'Aktualizovat %{model}' - submit: 'Uložit %{model}' - user_exercise_sollution: - create: 'Zkontrolovat test' - update: 'Zkontrolovat up' - submit: 'Zkontrolovat su' - - destroy: - title: "Mázání" - areyousure: "Jste si jistý, že chcete smazat tuto položku?" - delete: "Smazat" - keep: "Zachovat" - publish: - title: "Publikace" - areyousure: "Jste si jistý, že chcete publikovat tento test?" - + date: + formats: + default: ! '%d.%m.%Y' + short: ! '%d %b' + long: ! '%d. %B %Y' + rfc822: ! '%e %b %Y' + compact: ! '%y%m%d' + day_names: + - Neděle + - Pondělí + - Úterý + - Středa + - Čtvrtek + - Pátek + - Sobota + abbr_day_names: + - Ne + - Po + - Út + - St + - Čt + - Pá + - So + month_names: + - + - Leden + - Únor + - Březen + - Duben + - Květen + - Červen + - Červenec + - Srpen + - Září + - Říjen + - Listopad + - Prosinec + abbr_month_names: + - + - Led + - Úno + - Bře + - Dub + - Kvě + - Čvn + - Čvc + - Srp + - Zář + - Říj + - Lis + - Pro + order: + - day + - month + - year + time: + formats: + default: ! '%a %d. %B %Y %H:%M %z' + short: ! '%d.%m. %H:%M' + long: ! '%A %d. %B %Y %H:%M' + am: dopoledne + pm: odpoledne + support: + array: + words_connector: ! ', ' + two_words_connector: ! ' a ' + last_word_connector: ! ' a ' + select: + prompt: Prosím vyberte si. + number: + format: + precision: 3 + separator: . + delimiter: ! ',' + significant: false + strip_insignificant_zeros: false + currency: + format: + unit: Kč + precision: 2 + format: ! '%n %u' + separator: ! ',' + delimiter: ! ' ' + significant: false + strip_insignificant_zeros: false + percentage: + format: + delimiter: '' + precision: + format: + delimiter: '' + human: + format: + precision: 1 + delimiter: '' + significant: false + strip_insignificant_zeros: false + storage_units: + format: ! '%n %u' + units: + byte: + other: B + one: B + kb: KB + mb: MB + gb: GB + tb: TB + decimal_units: + format: ! '%n %u' + units: + unit: '' + thousand: Tisíc + million: Milión + billion: Miliarda + trillion: Trilión + quadrillion: Quadrilión + datetime: + prompts: + second: Sekunda + minute: Minuta + hour: Hodina + day: Den + month: Měsíc + year: Rok + distance_in_words: + half_a_minute: půl minutou + less_than_x_seconds: + one: asi před sekundou + other: asi před %{count} sekundami + x_seconds: + one: sekundou + other: ! '%{count} sekundami' + less_than_x_minutes: + one: před necelou minutou + other: před ani ne %{count} minutami + x_minutes: + one: minutou + other: ! '%{count} minutami' + about_x_hours: + one: asi hodinou + other: asi %{count} hodin + x_days: + one: 24 hodin + other: ! '%{count} dny' + about_x_months: + one: asi měsícem + other: asi %{count} měsíci + x_months: + one: měsícem + other: ! '%{count} měsíci' + about_x_years: + one: asi rokem + other: asi %{count} roky + over_x_years: + one: před víc jak rokem + other: víc jak %{count} roky + almost_x_years: + one: téměř rokem + other: téměř %{count} roky + helpers: + select: + prompt: Prosím vyberte si + submit: + create: Vytvořit %{model} + update: Aktualizovat %{model} + submit: Uložit %{model} + user_exercise_sollution: + create: Zkontrolovat test + update: Zkontrolovat up + submit: Zkontrolovat su + destroy: + title: Mázání + areyousure: Jste si jistý, že chcete smazat tuto položku? + delete: Smazat + keep: Zachovat + publish: + title: Publikace + areyousure: Jste si jistý, že chcete publikovat tento test? + errors: + format: ! 'Položka: ''%{attribute}'', %{message}.' + messages: + inclusion: není v seznamu povolených hodnot + exclusion: je vyhrazeno pro jiný účel + invalid: není dobře vyplněn + confirmation: nebylo potvrzeno + accepted: musí být potvrzeno + empty: nesmí být prázdný/é + blank: je třeba vyplnit + too_long: je příliš dlouhá/ý (max. %{count} znaků) + too_short: je příliš krátký/á (min. %{count} znaků) + wrong_length: nemá správnou délku (očekáváno %{count} znaků) + taken: již databáze obsahuje + not_a_number: není číslo + not_an_integer: není je celé číslo + greater_than: musí být větší než %{count} + greater_than_or_equal_to: musí být větší nebo rovno %{count} + equal_to: musí být rovno %{count} + less_than: musí být méně než %{count} + less_than_or_equal_to: musí být méně nebo rovno %{count} + odd: musí být liché číslo + even: musí být sudé číslo + activerecord: errors: - format: "Položka: '%{attribute}', %{message}." - messages: &errors_messages - inclusion: "není v seznamu povolených hodnot" - exclusion: "je vyhrazeno pro jiný účel" - invalid: "není dobře vyplněn" - confirmation: "nebylo potvrzeno" - accepted: "musí být potvrzeno" - empty: "nesmí být prázdný/é" - blank: "je třeba vyplnit" - too_long: "je příliš dlouhá/ý (max. %{count} znaků)" - too_short: "je příliš krátký/á (min. %{count} znaků)" - wrong_length: "nemá správnou délku (očekáváno %{count} znaků)" - taken: "již databáze obsahuje" - not_a_number: "není číslo" - not_an_integer: "není je celé číslo" - greater_than: "musí být větší než %{count}" - greater_than_or_equal_to: "musí být větší nebo rovno %{count}" - equal_to: "musí být rovno %{count}" - less_than: "musí být méně než %{count}" - less_than_or_equal_to: "musí být méně nebo rovno %{count}" - odd: "musí být liché číslo" - even: "musí být sudé číslo" - - # ActiveRecord validation messages - activerecord: - errors: - template: - header: - one: "Změny na %{model} nebyly uložené. Vyskytla se 1 chyba" - other: "Změny na %{model} nebyly uložené. Vyskytlo se %{count} chyb" - body: "Vyskytly se problémy na následujících položkách:" - - messages: - taken: "jste už použili" - record_invalid: "Validáce byla neuspešná: %{errors}" - <<: *errors_messages - - full_messages: - format: "%{attribute} %{message}" - - models: - attachment: - attributes: - file: - carrierwave_processing_error: "Chyba při zpracování uploadu souboru (carrierwave)" - - activemodel: - errors: - template: - header: - one: "Při ukládání objektu %{model} došlo k chybám a nebylo jej možné uložit" - other: "Při ukládání objektu %{model} došlo ke %{count} chybám a nebylo možné jej uložit" - body: "Následující pole obsahují chybně vyplněné údaje:" + template: + header: + one: Změny na %{model} nebyly uložené. Vyskytla se 1 chyba + other: Změny na %{model} nebyly uložené. Vyskytlo se %{count} chyb + body: ! 'Vyskytly se problémy na následujících položkách:' + messages: + inclusion: není v seznamu povolených hodnot + exclusion: je vyhrazeno pro jiný účel + invalid: není dobře vyplněn + confirmation: nebylo potvrzeno + accepted: musí být potvrzeno + empty: nesmí být prázdný/é + blank: je třeba vyplnit + too_long: je příliš dlouhá/ý (max. %{count} znaků) + too_short: je příliš krátký/á (min. %{count} znaků) + wrong_length: nemá správnou délku (očekáváno %{count} znaků) + taken: jste už použili + not_a_number: není číslo + not_an_integer: není je celé číslo + greater_than: musí být větší než %{count} + greater_than_or_equal_to: musí být větší nebo rovno %{count} + equal_to: musí být rovno %{count} + less_than: musí být méně než %{count} + less_than_or_equal_to: musí být méně nebo rovno %{count} + odd: musí být liché číslo + even: musí být sudé číslo + record_invalid: ! 'Validáce byla neuspešná: %{errors}' + full_messages: + format: ! '%{attribute} %{message}' + models: + attachment: + attributes: + file: + carrierwave_processing_error: Chyba při zpracování uploadu souboru (carrierwave) + activemodel: + errors: + template: + header: + one: Při ukládání objektu %{model} došlo k chybám a nebylo jej možné uložit + other: Při ukládání objektu %{model} došlo ke %{count} chybám a nebylo možné + jej uložit + body: ! 'Následující pole obsahují chybně vyplněné údaje:' diff --git a/config/locales/cz_fat_free_crm.yml b/config/locales/cz_fat_free_crm.yml index 8367cb8e95..6f89747ff9 100644 --- a/config/locales/cz_fat_free_crm.yml +++ b/config/locales/cz_fat_free_crm.yml @@ -1,20 +1,18 @@ +# Czech translations for Ruby on Rails (inspired by the Slovak localization - thanx to Jozef Fulop) +# by Jozef Chmel (chmel@jchsoft.cz) + +--- cz: language: Český (CZ) - - # Generic terms. - #---------------------------------------------------------------------------- all: Vše at: v here: zde - no_button: 'Ne' + no_button: Ne not_implemented: Čeká na vytvoření. or: nebo - select_none: '-- nic --' - select_blank: '-- vyber --' - yes_button: 'Ano' - - # Settings. - #---------------------------------------------------------------------------- + select_none: -- nic -- + select_blank: -- vyber -- + yes_button: Ano tab_dashboard: Hlavní panel tab_tasks: Úkoly tab_campaigns: Kampaně @@ -22,30 +20,25 @@ cz: tab_accounts: Klienti tab_contacts: Kontakty tab_opportunities: Příležitosti - admin_tab_users: Uživatelé admin_tab_fields: Pole admin_tab_settings: Nastavení admin_tab_plugins: Pluginy - affiliate: Pobočka competitor: Konkurent customer: Zákazník partner: Partner reseller: Přeprodejce vendor: Prodejce - planned: Naplánováno started: Odstartováno on_hold: V čekání completed: Hotovo called_off: Odřeknuté - new: Nové contacted: Kontaktované converted: Převedené rejected: Odmítnuté - cold_call: První zavolání conference: Konference online: Online Marketing @@ -54,7 +47,6 @@ cz: web: Website word_of_mouth: O čem se mluví other: Ostatní - prospecting: Průzkum analysis: Analýza presentation: Prezentace @@ -63,16 +55,13 @@ cz: final_review: Závěrečné hodnocení won: Uzavřené/Výhra lost: Uzavřené/Prohra - call: Volání email: Email follow_up: Pokračování lunch: Oběd meeting: Schůzka money: Peníze - presentation: Prezentace trip: Cesta - overdue: Opožděný due_asap: Co nejdříve due_today: Dnes @@ -81,24 +70,17 @@ cz: due_next_week: Příští týden due_later: Někdy později due_specific_date: V konkrétní datum... - completed_today: Dnes completed_yesterday: Vřera completed_last_week: Minulý týden completed_this_month: Tento měsíc completed_last_month: Minulý měsíc - - # Models/Activity. - #---------------------------------------------------------------------------- one_hour: Jedna hodina one_day: Jeden den two_days: Dva dny one_week: Jeden týden two_weeks: Dva týdny one_month: Jeden měsíc - - # Model Validations. - #---------------------------------------------------------------------------- activerecord: errors: models: @@ -111,74 +93,71 @@ cz: account: attributes: name: - missing_account_name: "^Zadejte jméno klienta." + missing_account_name: ^Zadejte jméno klienta. access: - share_account: "^Určete uživatele pro sdílení klienta.." + share_account: ^Určete uživatele pro sdílení klienta.. campaign: attributes: name: - missing_campaign_name: "^Zadejte jméno kampaně." + missing_campaign_name: ^Zadejte jméno kampaně. ends_on: - dates_not_in_sequence: "^Ujistěte se, že počáteční datum je před konečným." + dates_not_in_sequence: ^Ujistěte se, že počáteční datum je před konečným. access: - share_campaign: "^Určete uživatele pro sdílení kampaně." + share_campaign: ^Určete uživatele pro sdílení kampaně. contact: attributes: first_name: - missing_first_name: "^Zadejte jméno." + missing_first_name: ^Zadejte jméno. last_name: - missing_last_name: "^Zadejte příjmení." + missing_last_name: ^Zadejte příjmení. access: - share_contact: "^Určete uživatele pro sdílení kontaktu." + share_contact: ^Určete uživatele pro sdílení kontaktu. lead: attributes: first_name: - missing_first_name: "^Zadejte jméno." + missing_first_name: ^Zadejte jméno. last_name: - missing_last_name: "^Zadejte příjmení." + missing_last_name: ^Zadejte příjmení. access: - share_lead: "^Určete uživatele pro sdílení s lead." + share_lead: ^Určete uživatele pro sdílení s lead. opportunity: attributes: name: - missing_opportunity_name: "^Zadejte název příležitosti." + missing_opportunity_name: ^Zadejte název příležitosti. access: - share_opportunity: "^Určete uživatele pro sdílení příležitosti." + share_opportunity: ^Určete uživatele pro sdílení příležitosti. task: attributes: name: - missing_task_name: "^Zadejte název úkolu." + missing_task_name: ^Zadejte název úkolu. calendar: - invalid_date: "^Zadejte platné datum." + invalid_date: ^Zadejte platné datum. user: attributes: username: - missing_username: "^Zadejte jméno uživatele." - username_taken: "^Takový uživatel již existuje." + missing_username: ^Zadejte jméno uživatele. + username_taken: ^Takový uživatel již existuje. email: - missing_email: "^Zadejte email." - email_in_use: "^Uživatel s tímto emailem je již v systému zaveden." - + missing_email: ^Zadejte email. + email_in_use: ^Uživatel s tímto emailem je již v systému zaveden. msg_account_suspended: Uživateslský účet byl pozastaven. password_reset_instruction: instrukce resetování hesla - - # Controllers. - #---------------------------------------------------------------------------- msg_account_created: Váš účet byl vytvořen a čeká na schválení administrátorem. msg_account_not_approved: Váš účet ještě nebyl schválen. - msg_asset_deleted: "%{value} byl smazán." + msg_asset_deleted: ! '%{value} byl smazán.' msg_asset_not_available: Toto %{value} již není dostupné. msg_asset_not_authorized: Nejste autorizován prohlížet %{value}. - msg_assets_not_available: %{value} není dostupné. - msg_asset_rejected: "%{value} byla odmítnuta." - msg_bad_image_file: "^Nahrávaný obrázek je příliš velký - upravte velikost." - msg_cant_create_related: "Nelze vytvořit %{asset} pokud %{related} již není dostupný." - msg_cant_delete_user: "^Nelze smazat uživatele pokud %{value} pokud je připárována položka aktivní." - msg_cant_do: "Nelze %{action} na %{asset} pokud tento již není dostupný." + msg_assets_not_available: ! '%{value} není dostupné.' + msg_asset_rejected: ! '%{value} byla odmítnuta.' + msg_bad_image_file: ^Nahrávaný obrázek je příliš velký - upravte velikost. + msg_cant_create_related: Nelze vytvořit %{asset} pokud %{related} již není dostupný. + msg_cant_delete_user: ^Nelze smazat uživatele pokud %{value} pokud je připárována + položka aktivní. + msg_cant_do: Nelze %{action} na %{asset} pokud tento již není dostupný. msg_email_not_found: Uživatel s tímto emailem není v sytému zadán. msg_enter_new_password: Zadejte heslo. msg_goodbye: Byl jste odhlášen. Díky za použití Fat Free CRM! - msg_invalid_password: "^Zadejte správne aktální heslo" + msg_invalid_password: ^Zadejte správne aktální heslo msg_invalig_login: Špatné jméno nebo heslo. msg_last_login: Váše poslední přihlášení bylo %{value}. msg_login_needed: Pro přístup k této stránce musíte být přihlášen. @@ -186,14 +165,12 @@ cz: msg_password_changed: Vaše heslo byl změněno. msg_password_not_changed: Vaše heslo nebylo změněno. msg_password_updated: Vaše heslo byl úspěšne upraveno. - msg_pwd_instructions_sent: Instrukce pro přenastavení hesla vám byly zaslány na email. + msg_pwd_instructions_sent: Instrukce pro přenastavení hesla vám byly zaslány na + email. msg_require_admin: Pro přístup k této stránce musíte být přihlášen jako administrátor. msg_successful_signup: Registrace byla úspěšná. Vítejte ve Fat Free CRM! msg_welcome: Vítejte ve Fat Free CRM! - - # Options. - #---------------------------------------------------------------------------- - "option_amount*probability": hodnota zvýhodnění + option_amount*probability: hodnota zvýhodnění activity_options: Zobraz %{models} %{action_type} uživatelem %{user} za období %{period}. all_users: všichni uživatelé option_after: po @@ -227,10 +204,8 @@ cz: email_past_participle: email show_per_page: Zobraz %{number} %{models} za stránku užívající %{fmt} format. sort_by: Setřiď %{models} podle %{field}. - sort_by_displaying: Setřiď %{models} podle %{field} zobrazující jméno %{position} příjmení. - - # Views -> Profile. - #---------------------------------------------------------------------------- + sort_by_displaying: Setřiď %{models} podle %{field} zobrazující jméno %{position} + příjmení. aim: AOL IM already_signed_up: Již registrováný? alt_email: Alternativní email @@ -240,12 +215,12 @@ cz: contact_info: Kontaktní informace current_password: Aktuální heslo edit_profile: Upravit profil - # email: Email # <-- Already defined as the task type if Settings. first_name: Jméno google: Google IM gravatar_help: Neznáte Gravatars? Více o Gravatars image_file: Soubor obráku - image_help: Obrázek který nahrajete bude automaticky převeden na velikost 75 x 75 pixelů. Podporované formáty jsou GIF, JPG, and PNG. + image_help: Obrázek který nahrajete bude automaticky převeden na velikost 75 x 75 + pixelů. Podporované formáty jsou GIF, JPG, and PNG. job_title: Popis last_name: Příjmění login_now_link: Přihlašte se! @@ -266,17 +241,11 @@ cz: user: Uživatel username: Uživatelské jméno yahoo: Yahoo IM - - # Views -> Authenticate. - #---------------------------------------------------------------------------- forgot_password: Zapomenuté heslo login: Přihlásit no_account: Nemá účet? remember_me: Pamatovat si mě sign_up_now: Registrovat teď! - - # Views -> Accounts. - #---------------------------------------------------------------------------- account: Klient account_small: klient account_summary: Výpis klienta @@ -304,9 +273,6 @@ cz: shipping_address: Doručovací adresa total_accounts: Celkem klientů website: Webstránka - - # Views -> Campaigns. - #---------------------------------------------------------------------------- actual: Aktuální actual_performance: Aktuální výkonnost budget: Rozpočet @@ -321,7 +287,7 @@ cz: campaigns_small: kampaně conversion: Konverze conversion_label: Konverze (%) - conversion_number: "%{value} konverze" + conversion_number: ! '%{value} konverze' create_campaign: Vytvořit kampaň end_date: Koncové datum finished_on: hotovo na %{value} @@ -329,11 +295,13 @@ cz: no_start_date: nebyl určeno počáteční datum number_of_leads: Možných klientů objectives: Cíle - objectives_help: Zadejte cílový počet budoucích možných klientů, poměr konverze z možných klientů do příležitostí, cílová tržba a rozpočet kampaně. Tato čísla pomohou určit výkonost kampaně. + objectives_help: Zadejte cílový počet budoucích možných klientů, poměr konverze + z možných klientů do příležitostí, cílová tržba a rozpočet kampaně. Tato čísla + pomohou určit výkonost kampaně. objectives_small: cíle kampaně revenue: tržba revenue_label: Tržba (CZK) - revenue_number: "%{value} tržba" + revenue_number: ! '%{value} tržba' save_campaign: Uložit kampaň start_date: Počáteční datum started_ago: spuštěno před %{value} @@ -344,9 +312,6 @@ cz: was_supposed_to_finish: má být dokončeno za %{value} was_supposed_to_start: má začít v %{time_ago} před %{start_date} was_supposed_to_start_in: má začít v %{starts_in} a %{start_date} - - # Views -> Contacts. - #---------------------------------------------------------------------------- alt_email_small: Jiné blog: Web/Blog contact: Kontakt @@ -356,37 +321,44 @@ cz: contacts_small: kontakty create_contact: Vytvořit kontakt department: Oddělení - department_small: '%{value} oddělení' + department_small: ! '%{value} oddělení' do_not_call: Nevolat extra_info: Extra informace extra_info_small: extra informace facebook: Facebook linked_in: LinkedIn myself: Já osobně - permissions_intro_private: Standardně budete mít přístup k %{value}. Oprávnění můžete změnit později. - permissions_intro_public: Standardně budou mít všichni uživatelé přístup k %{value}. Oprávnění můžete změnit později. - permissions_intro_shared: Standardně budou mít vybraní uživatelé přístup k %{value}. Oprávnění můžete změnit později. + permissions_intro_private: Standardně budete mít přístup k %{value}. Oprávnění můžete + změnit později. + permissions_intro_public: Standardně budou mít všichni uživatelé přístup k %{value}. + Oprávnění můžete změnit později. + permissions_intro_shared: Standardně budou mít vybraní uživatelé přístup k %{value}. + Oprávnění můžete změnit později. referred_by: Dodal referred_by_small: dodal save_contact: uložit kontakt twitter: Twitter web_presence: Webstránky web_presence_small: webstránky - works_at: "%{job_title} v %{company}" - - # Views -> Leads. - #---------------------------------------------------------------------------- + works_at: ! '%{job_title} v %{company}' convert: Konvertovat convert_lead: Konvertovat možného klienta - convert_lead_permissions_intro: Oprávnění kontaktu budou přenesena. Oprávnění můžete změnit později. - convert_lead_text: Zkonvertováním možného klienta %{value} vznikne kontkat pripojený na existujícího nebo nového klienta. Status možného klienta bude nastaven na konvertovaný. + convert_lead_permissions_intro: Oprávnění kontaktu budou přenesena. Oprávnění můžete + změnit později. + convert_lead_text: Zkonvertováním možného klienta %{value} vznikne kontkat pripojený + na existujícího nebo nového klienta. Status možného klienta bude nastaven na konvertovaný. create_lead: Přidat možného klienta - create_opp_for_contact: Můžete automaticky vytvořit příležitost pro kontkat %{value} tím že určíte jméno, aktuální stádium, očekávaný čas ukončení, prodejní pravděpodobnost, objem nabídky, a nabídnutý rabat. + create_opp_for_contact: Můžete automaticky vytvořit příležitost pro kontkat %{value} + tím že určíte jméno, aktuální stádium, očekávaný čas ukončení, prodejní pravděpodobnost, + objem nabídky, a nabídnutý rabat. lead: Možný klient lead_info_small: kontakt možného klienta - lead_permissions_intro_private: Standardně budou oprávnění zkopírována z kampaně nebo jako soukromá. Oprávnění můžete změnit později. - lead_permissions_intro_public: Standardně budou oprávnění zkopírována z kampaně nebo jako veřejná. Oprávnění můžete změnit později. - lead_permissions_intro_shared: Standardně budou oprávnění zkopírována z kampaně nebo sdílená s určenými uživateli. Oprávnění můžete změnit později. + lead_permissions_intro_private: Standardně budou oprávnění zkopírována z kampaně + nebo jako soukromá. Oprávnění můžete změnit později. + lead_permissions_intro_public: Standardně budou oprávnění zkopírována z kampaně + nebo jako veřejná. Oprávnění můžete změnit později. + lead_permissions_intro_shared: Standardně budou oprávnění zkopírována z kampaně + nebo sdílená s určenými uživateli. Oprávnění můžete změnit později. lead_small: možný klient lead_status_small: stav možného klienta lead_summary: Souhrn možného klienta @@ -401,9 +373,6 @@ cz: source: Zdroj status: Stav total_leads: Celkem možných klientů - - # Views -> Opportunities. - #---------------------------------------------------------------------------- amount: Množství close_date: Datum uzavření closed_ago_on: uzavřeno před %{time_ago} v %{date} @@ -425,7 +394,7 @@ cz: opportunity: Příležitost opportunity_small: příležitost opportunity_summary: Letmý náhled na příležitost - opportunity_summary_text: "%{amount} s rabatem %{discount} a %{probability} pravděpodobností" + opportunity_summary_text: ! '%{amount} s rabatem %{discount} a %{probability} pravděpodobností' past_due: zpoždění, očekávaný datum ukončení byl před %{value} probability: Pravděpodobnost probability_number: a %{value} pravděpodobnosti @@ -433,9 +402,6 @@ cz: stage: Stadium total_opportunities: Celkem příležitostí weighted_amount: Množství přízně - - # Views -> Tasks. - #---------------------------------------------------------------------------- task: Úkol task_small: úkol tasks: Úkoly @@ -451,13 +417,13 @@ cz: due: kdy feel_free: Směle můžete move_to: přesunout do - no_tasks: "Nemáte žádné %{value} úkoly" + no_tasks: Nemáte žádné %{value} úkoly no_tasks_pending: nevyřízené no_tasks_assigned: přiřazené no_tasks_completed: hotové pending_tab: Nevyřízené pending_tasks: Nevyřízené úkoly - related: 'k:' + related: ! 'k:' save_task: Uložit úkol task_assigned: Úkol byl přiřazen k %{value} task_assigned_to: a přiřazen k %{value} @@ -472,14 +438,9 @@ cz: task_from: Z %{value} task_overdue: zpozdění, v důsledku task_pending: Úkol byl převeden do dosud nevyřízených - task_small: úkol - tasks: Úkoly total_tasks: Celkem %{value} view_assigned_tasks: zobrazit přiřazené úkoly view_pending_tasks: zobrazit nevyřízené úkoly - - # Views -> Home. - #---------------------------------------------------------------------------- action_commented: zkomentoval action_completed: dokončil action_created: vytvořil @@ -501,9 +462,6 @@ cz: subject_lead: Možný klient subject_opportunity: Příležitost subject_task: Úkol - - # Views -> Common. - #---------------------------------------------------------------------------- add_note: Přidat poznámku save_note: Uložit poznámku add_note_help: Přidat novou poznámku... @@ -515,15 +473,15 @@ cz: close_form: Zavřít formulář confirm_delete: Jste si jitstý že chcete smazat %{value}? copy_permissions: Kopírovat %{value} oprávnění - could_not_find: "Nenalezeny žádné záznamy. Zde lze " - could_not_find_matching: "Nemohu nalézt odpovídající %{value}" + could_not_find: ! 'Nenalezeny žádné záznamy. Zde lze ' + could_not_find_matching: Nemohu nalézt odpovídající %{value} create_new: vytvořit create_a_new: vytvořit select_existing: vyber existující delete: Smazat discard: Vyřadit edit: Upravit - items_total: '%{count} celkem.' + items_total: ! '%{count} celkem.' less: Méně... me: mnou more: více... @@ -540,11 +498,11 @@ cz: select_task: Vyber úkol select_opportunity: Vyber příležitost search_assets: Vyhledat %{value} - time_ago: "před %{value}" + time_ago: před %{value} background_info: Pozadí address: Addresa - street1: Ulice 1 # NEW - street2: Ulice 2 # NEW + street1: Ulice 1 + street2: Ulice 2 city: Obec zipcode: PSČ state: Stát @@ -553,9 +511,6 @@ cz: collapse_all: Sbalit vše expanded: Rozvinutý collapsed: Sbalený - - # Views -> Layout. - #---------------------------------------------------------------------------- about: O webu about_dev_group: Diskuzní skupina pro vývojáře about_features: Vlastnosti a chyby @@ -564,34 +519,24 @@ cz: about_ffc_version: verze Fat Free CRM about_home_page: Domácí stránka about_project_page: Stránka projektu - about_thank_you: Díky že používíte Fat Free CRM! Vážímwe si vašeho businesu a doufáme že jste spokojeni s naším software. + about_thank_you: Díky že používíte Fat Free CRM! Vážímwe si vašeho businesu a doufáme + že jste spokojeni s naším software. about_twitter: Zprávy z Twitteru about_user_group: Diskutní skupina pro uživatele admin: Admin. logout: Odhlásit quick_find: Rychlé hledání welcome: Vítejte - - # Views -> Comments. - #---------------------------------------------------------------------------- edit_comment: Úprava komentáře show: Zobrazit update: Upravit - - # Views -> Passwords. - #---------------------------------------------------------------------------- confirm_password_intro: Zadejte vaše nové heslo a potvrďte jej. - password_intro: Zadejte váš email a následně vám budou zaslány instrukce pro obnovu hesla. + password_intro: Zadejte váš email a následně vám budou zaslány instrukce pro obnovu + hesla. reset_password: Obnovit heslo update_password_and_login: Aktualizujte přihlašovací jméno a heslo - - # Views -> Admin - #---------------------------------------------------------------------------- back_to_crm: Zpět na Fat Free CRM crm_admin_page: Fat Free CRM Administrace - - # Views -> Admin -> Users. - #---------------------------------------------------------------------------- approve: Schválit create_user: Vytvořit uživatele last_seen: naposledy viděn před %{value} @@ -604,7 +549,7 @@ cz: user_awaits_approval: čeka na schválení user_confirm_delete: Uživatel může být smazan, pokud nemá žádné návaznosti. user_is_admin: Uživatel je Administrator - user_never_logged_in: "Ještě se nepřihlásil" + user_never_logged_in: Ještě se nepřihlásil user_signed_up: Regisrován user_signed_up_on: registrován %{value} user_since: uživatelm od %{value} @@ -612,74 +557,53 @@ cz: user_suspended_on: pozastaven na %{value} users: Uživatelé users_small: uživatelé - - # Export. - #---------------------------------------------------------------------------- to_xls: Export do Excelu to_csv: Export do CSV formátu (včetně smazaných záznamů) to_rss: RSS feed to_atom: Atom feed - - # Dropbox. - #---------------------------------------------------------------------------- dropbox_notification_subject: dropbox - přidaný email - %{subject} dropbox_notification_intro: Úspěšně přidaný email jste odeslal do dropboxu dropbox_notification_to: Přidáno do subject: Předmět body: Tělo - - # Pluralizations. - #---------------------------------------------------------------------------- pluralize: comment: - one: '1 komentář' - other: '%{count} komentářů' + one: 1 komentář + other: ! '%{count} komentářů' contact: - one: '1 kontakt' - other: '%{count} kontaktů' + one: 1 kontakt + other: ! '%{count} kontaktů' opportunity: - one: '1 příležitost' - other: '%{count} příležitostí' + one: 1 příležitost + other: ! '%{count} příležitostí' lead: - one: '1 možný klient' - other: '%{count} možných klientů' + one: 1 možný klient + other: ! '%{count} možných klientů' day: - one: '1 den' - other: '%{count} dní' + one: 1 den + other: ! '%{count} dní' login: - one: '1 přihlášení' - other: '%{count} přihlášení' - - # Custom date/time formats. - #---------------------------------------------------------------------------- + one: 1 přihlášení + other: ! '%{count} přihlášení' date: formats: - mmddyyyy: "%Y-%m-%d" - mmdd: "%e %b" - mmddyy: "%e %b, %Y" - + mmddyyyy: ! '%Y-%m-%d' + mmdd: ! '%e %b' + mmddyy: ! '%e %b, %Y' time: formats: - mmddhhss: "%e %b v %H:%M" - mmddyyyy_hhmm: "%Y-%m-%d %H:%M" - - # will_paginate translations copied for 'en-US' - #---------------------------------------------------------------------------- + mmddhhss: ! '%e %b v %H:%M' + mmddyyyy_hhmm: ! '%Y-%m-%d %H:%M' will_paginate: previous_label: Předchozí next_label: Další - page_gap: "…" - + page_gap: ! '…' page_entries_info: single_page: - zero: "Žádní %{plural} nenalezeni" - one: "Zobrazen 1 %{name}" - other: "Zobrazeni %{count} %{plural}" - - multi_page: "Zobrazeni %{plural} %{from} - %{to} z %{total} celkem" - - # Views -> Admin -> Custom Fields - #---------------------------------------------------------------------------- + zero: Žádní %{plural} nenalezeni + one: Zobrazen 1 %{name} + other: Zobrazeni %{count} %{plural} + multi_page: Zobrazeni %{plural} %{from} - %{to} z %{total} celkem custom_fields: Uživatelská pole create_custom_field: Vytvořit uživatelské pole create_new_custom_field_for: Vytvořit nové uživatelské pole pro %{klass_name} diff --git a/config/locales/de.yml b/config/locales/de.yml index 1adf7728e8..3844d97d7f 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -3,121 +3,155 @@ # contributors: # - Alexander Dreher - http://github.com/alexdreher - Rails 3 update +--- de: date: formats: - default: "%d.%m.%Y" - short: "%e. %b" - long: "%e. %B %Y" - only_day: "%e" - - day_names: [Sonntag, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag] - abbr_day_names: [So, Mo, Di, Mi, Do, Fr, Sa] - month_names: [~, Jänner, Februar, März, April, Mai, Juni, Juli, August, September, Oktober, November, Dezember] - abbr_month_names: [~, Jän, Feb, Mär, Apr, Mai, Jun, Jul, Aug, Sep, Okt, Nov, Dez] + default: ! '%d.%m.%Y' + short: ! '%e. %b' + long: ! '%e. %B %Y' + only_day: ! '%e' + day_names: + - Sonntag + - Montag + - Dienstag + - Mittwoch + - Donnerstag + - Freitag + - Samstag + abbr_day_names: + - So + - Mo + - Di + - Mi + - Do + - Fr + - Sa + month_names: + - + - Jänner + - Februar + - März + - April + - Mai + - Juni + - Juli + - August + - September + - Oktober + - November + - Dezember + abbr_month_names: + - + - Jän + - Feb + - Mär + - Apr + - Mai + - Jun + - Jul + - Aug + - Sep + - Okt + - Nov + - Dez order: - - :day - - :month - - :year - + - :day + - :month + - :year time: formats: - default: "%A, %d. %B %Y, %H:%M Uhr" - short: "%d. %B, %H:%M Uhr" - long: "%A, %d. %B %Y, %H:%M Uhr" - time: "%H:%M" - - am: "vormittags" - pm: "nachmittags" - + default: ! '%A, %d. %B %Y, %H:%M Uhr' + short: ! '%d. %B, %H:%M Uhr' + long: ! '%A, %d. %B %Y, %H:%M Uhr' + time: ! '%H:%M' + am: vormittags + pm: nachmittags datetime: distance_in_words: - half_a_minute: 'eine halbe Minute' + half_a_minute: eine halbe Minute less_than_x_seconds: - one: 'weniger als eine Sekunde' - other: 'weniger als %{count} Sekunden' + one: weniger als eine Sekunde + other: weniger als %{count} Sekunden x_seconds: - one: 'eine Sekunde' - other: '%{count} Sekunden' + one: eine Sekunde + other: ! '%{count} Sekunden' less_than_x_minutes: - one: 'weniger als eine Minute' - other: 'weniger als %{count} Minuten' + one: weniger als eine Minute + other: weniger als %{count} Minuten x_minutes: - one: 'eine Minute' - other: '%{count} Minuten' + one: eine Minute + other: ! '%{count} Minuten' about_x_hours: - one: 'etwa eine Stunde' - other: 'etwa %{count} Stunden' + one: etwa eine Stunde + other: etwa %{count} Stunden x_days: - one: 'ein Tag' - other: '%{count} Tage' + one: ein Tag + other: ! '%{count} Tage' about_x_months: - one: 'etwa ein Monat' - other: 'etwa %{count} Monate' + one: etwa ein Monat + other: etwa %{count} Monate x_months: - one: 'ein Monat' - other: '%{count} Monate' + one: ein Monat + other: ! '%{count} Monate' almost_x_years: - one: 'fast ein Jahr' - other: 'fast %{count} Jahre' + one: fast ein Jahr + other: fast %{count} Jahre about_x_years: - one: 'etwa ein Jahr' - other: 'etwa %{count} Jahre' + one: etwa ein Jahr + other: etwa %{count} Jahre over_x_years: - one: 'mehr als ein Jahr' - other: 'mehr als %{count} Jahre' + one: mehr als ein Jahr + other: mehr als %{count} Jahre prompts: - second: "Sekunden" - minute: "Minuten" - hour: "Stunden" - day: "Tag" - month: "Monat" - year: "Jahr" - + second: Sekunden + minute: Minuten + hour: Stunden + day: Tag + month: Monat + year: Jahr number: format: precision: 2 - separator: ',' - delimiter: '.' + separator: ! ',' + delimiter: . significant: false strip_insignificant_zeros: false currency: format: - unit: '€' - format: '%n%u' - separator: "," - delimiter: "" + unit: € + format: ! '%n%u' + separator: ! ',' + delimiter: '' precision: 2 significant: false strip_insignificant_zeros: false percentage: format: - delimiter: "" + delimiter: '' precision: format: - delimiter: "" + delimiter: '' human: format: - delimiter: "" + delimiter: '' precision: 1 significant: true strip_insignificant_zeros: true storage_units: - # Storage units output formatting. - # %u is the storage unit, %n is the number (default: 2 MB) - format: "%n %u" + format: ! '%n %u' units: byte: - one: "Byte" - other: "Bytes" - kb: "KB" - mb: "MB" - gb: "GB" - tb: "TB" + one: Byte + other: Bytes + kb: KB + mb: MB + gb: GB + tb: TB decimal_units: - format: "%n %u" + format: ! '%n %u' units: - unit: "" + unit: '' thousand: Tausend million: Millionen billion: @@ -127,67 +161,77 @@ de: quadrillion: one: Billiarde others: Billiarden - support: array: - words_connector: ", " - two_words_connector: " und " - last_word_connector: " und " + words_connector: ! ', ' + two_words_connector: ! ' und ' + last_word_connector: ! ' und ' select: - prompt: "Bitte wählen:" - + prompt: ! 'Bitte wählen:' activemodel: errors: template: header: - one: "Konnte %{model} nicht speichern: ein Fehler." - other: "Konnte %{model} nicht speichern: %{count} Fehler." - body: "Bitte überprüfen Sie die folgenden Felder:" + one: ! 'Konnte %{model} nicht speichern: ein Fehler.' + other: ! 'Konnte %{model} nicht speichern: %{count} Fehler.' + body: ! 'Bitte überprüfen Sie die folgenden Felder:' helpers: select: - prompt: "Bitte wählen" - + prompt: Bitte wählen submit: - create: '%{model} erstellen' - update: '%{model} aktualisieren' - submit: '%{model} speichern' - + create: ! '%{model} erstellen' + update: ! '%{model} aktualisieren' + submit: ! '%{model} speichern' errors: - format: "%{attribute} %{message}" - - messages: &errors_messages - inclusion: "ist kein gültiger Wert" - exclusion: "ist nicht verfügbar" - invalid: "ist nicht gültig" - confirmation: "stimmt nicht mit der Bestätigung überein" - accepted: "muss akzeptiert werden" - empty: "muss ausgefüllt werden" - blank: "muss ausgefüllt werden" - too_long: "ist zu lang (nicht mehr als %{count} Zeichen)" - too_short: "ist zu kurz (nicht weniger als %{count} Zeichen)" - wrong_length: "hat die falsche Länge (muss genau %{count} Zeichen haben)" - not_a_number: "ist keine Zahl" - greater_than: "muss größer als %{count} sein" - greater_than_or_equal_to: "muss größer oder gleich %{count} sein" - equal_to: "muss genau %{count} sein" - less_than: "muss kleiner als %{count} sein" - less_than_or_equal_to: "muss kleiner oder gleich %{count} sein" - odd: "muss ungerade sein" - even: "muss gerade sein" - not_an_integer: "muss ganzzahlig sein" - + format: ! '%{attribute} %{message}' + messages: + inclusion: ist kein gültiger Wert + exclusion: ist nicht verfügbar + invalid: ist nicht gültig + confirmation: stimmt nicht mit der Bestätigung überein + accepted: muss akzeptiert werden + empty: muss ausgefüllt werden + blank: muss ausgefüllt werden + too_long: ist zu lang (nicht mehr als %{count} Zeichen) + too_short: ist zu kurz (nicht weniger als %{count} Zeichen) + wrong_length: hat die falsche Länge (muss genau %{count} Zeichen haben) + not_a_number: ist keine Zahl + greater_than: muss größer als %{count} sein + greater_than_or_equal_to: muss größer oder gleich %{count} sein + equal_to: muss genau %{count} sein + less_than: muss kleiner als %{count} sein + less_than_or_equal_to: muss kleiner oder gleich %{count} sein + odd: muss ungerade sein + even: muss gerade sein + not_an_integer: muss ganzzahlig sein activerecord: errors: template: header: - one: "Konnte %{model} nicht speichern: ein Fehler." - other: "Konnte %{model} nicht speichern: %{count} Fehler." - body: "Bitte überprüfen Sie die folgenden Felder:" - + one: ! 'Konnte %{model} nicht speichern: ein Fehler.' + other: ! 'Konnte %{model} nicht speichern: %{count} Fehler.' + body: ! 'Bitte überprüfen Sie die folgenden Felder:' messages: - taken: "ist bereits vergeben" - record_invalid: "Gültigkeitsprüfung ist fehlgeschlagen: %{errors}" - <<: *errors_messages - + inclusion: ist kein gültiger Wert + exclusion: ist nicht verfügbar + invalid: ist nicht gültig + confirmation: stimmt nicht mit der Bestätigung überein + accepted: muss akzeptiert werden + empty: muss ausgefüllt werden + blank: muss ausgefüllt werden + too_long: ist zu lang (nicht mehr als %{count} Zeichen) + too_short: ist zu kurz (nicht weniger als %{count} Zeichen) + wrong_length: hat die falsche Länge (muss genau %{count} Zeichen haben) + not_a_number: ist keine Zahl + greater_than: muss größer als %{count} sein + greater_than_or_equal_to: muss größer oder gleich %{count} sein + equal_to: muss genau %{count} sein + less_than: muss kleiner als %{count} sein + less_than_or_equal_to: muss kleiner oder gleich %{count} sein + odd: muss ungerade sein + even: muss gerade sein + not_an_integer: muss ganzzahlig sein + taken: ist bereits vergeben + record_invalid: ! 'Gültigkeitsprüfung ist fehlgeschlagen: %{errors}' full_messages: - format: "%{attribute} %{message}" + format: ! '%{attribute} %{message}' diff --git a/config/locales/de_fat_free_crm.yml b/config/locales/de_fat_free_crm.yml index 2695767530..24ab38bd04 100644 --- a/config/locales/de_fat_free_crm.yml +++ b/config/locales/de_fat_free_crm.yml @@ -1,812 +1,841 @@ +--- de: - all: "Alle" - contact_info: "Kontaktinformation" - leads: "Anfragen" - task_created: "Die Aufgabe wurde angelegt" - about_home_page: "Home-Page" - msg_login_needed: "Sie müssen angemeldet sein, um diese Seite zu sehen." - user_since: "Benutzer seit %{value}" - objectives_help: "Bitte geben Sie die Anzahl erwarteter Anfragen an, die erwartete Lead-Chance-Konversionsrate, Zielumsatz, und das Kampagnenbudget. Diese Angaben ermöglichen die Kontrolle der Kampagneneffizienz." - option_closes_on: "Abschlussdatum" - follow_up: "Wiedervorlage" - no_discount: "ohne Rabatt" - probability_number: "und %{value} Wahrscheinlichkeit" - msg_invalig_login: "Ungültiger Benutzername oder Passwort." - same_as_billing: "wie Rechnungsadresse" - msg_account_not_approved: "Ihr Profil wurde noch nicht freigegeben." - presentation: "Präsentation" - activities: "Aktivitäten" - fax: "Fax" - account: "Firma" - all_events_past_participle: "Aktivitäten" - facebook: "Facebook" - one_month: "Ein Monat" - one_week: "Eine Woche" - completed_this_month: "Diesen Monat" - web_presence_small: "Web-Präsenz" - list: "Liste" - no_tasks: "Sie haben keine Aufgaben, die %{value} sind" - lead_status_small: "Anfrage-Status" - account_summary: "Accountübersicht" - restrict_by_tag_info: "Nur markierte %{assets} zeigen" - password_confirmation: "Bestätige das Password" - admin_fields_info: "Benutzerdefinierte Felder werden in Gruppen angezeigt.\\nErstelle eine neue Feldgruppe, oder füge Felder zu einer der unteren Gruppen hinzu.
\\nDu kannst die Reihenfolge per drag & drop ändern oder die Felder zwischen den Gruppen bewegen." - was_supposed_to_start: "angenommener Beginn vor %{time_ago} am %{start_date}" - due_later: "Bald fällig" - action_destroy: "gelöscht" - msg_require_admin: "Sie müssen Administrator sein, um auf die Seite zu zugreifen." - budget: "Budget" - could_not_find: "Konnte %{value} nicht finden. Feel free to" - leads_small: "Anfragen" - final_review: "Abschlussprüf." - closed_ago_on: "erledigt vor %{time_ago} am %{date}" - subject_opportunity: "Chance" - create_account: "Account anlegen" - recent_activity: "Letzte Aktivitäten" - tag_small: "markiere" - background_info: "Hintergrund-Informationen" - conversion_number: "%{value} Konversion" - yes_button: "Ja" + all: Alle + contact_info: Kontaktinformation + leads: Anfragen + task_created: Die Aufgabe wurde angelegt + about_home_page: Home-Page + msg_login_needed: Sie müssen angemeldet sein, um diese Seite zu sehen. + user_since: Benutzer seit %{value} + objectives_help: Bitte geben Sie die Anzahl erwarteter Anfragen an, die erwartete + Lead-Chance-Konversionsrate, Zielumsatz, und das Kampagnenbudget. Diese Angaben + ermöglichen die Kontrolle der Kampagneneffizienz. + option_closes_on: Abschlussdatum + follow_up: Wiedervorlage + no_discount: ohne Rabatt + probability_number: und %{value} Wahrscheinlichkeit + msg_invalig_login: Ungültiger Benutzername oder Passwort. + same_as_billing: wie Rechnungsadresse + msg_account_not_approved: Ihr Profil wurde noch nicht freigegeben. + presentation: Präsentation + activities: Aktivitäten + fax: Fax + account: Firma + all_events_past_participle: Aktivitäten + facebook: Facebook + one_month: Ein Monat + one_week: Eine Woche + completed_this_month: Diesen Monat + web_presence_small: Web-Präsenz + list: Liste + no_tasks: Sie haben keine Aufgaben, die %{value} sind + lead_status_small: Anfrage-Status + account_summary: Accountübersicht + restrict_by_tag_info: Nur markierte %{assets} zeigen + password_confirmation: Bestätige das Password + admin_fields_info: Benutzerdefinierte Felder werden in Gruppen angezeigt.\nErstelle + eine neue Feldgruppe, oder füge Felder zu einer der unteren Gruppen hinzu.
\nDu + kannst die Reihenfolge per drag & drop ändern oder die Felder zwischen den Gruppen + bewegen. + was_supposed_to_start: angenommener Beginn vor %{time_ago} am %{start_date} + due_later: Bald fällig + action_destroy: gelöscht + msg_require_admin: Sie müssen Administrator sein, um auf die Seite zu zugreifen. + budget: Budget + could_not_find: Konnte %{value} nicht finden. Feel free to + leads_small: Anfragen + final_review: Abschlussprüf. + closed_ago_on: erledigt vor %{time_ago} am %{date} + subject_opportunity: Chance + create_account: Account anlegen + recent_activity: Letzte Aktivitäten + tag_small: markiere + background_info: Hintergrund-Informationen + conversion_number: ! '%{value} Konversion' + yes_button: Ja version: - create: "%{item} erstellt von %{by}" - update: "%{item} geändert von %{by}" - destroy: "%{item} gelöscht von %{by}" - set_html: "%{attr} auf %{to} geändert" - unset_html: "%{attr} nicht definiert" - change_html: "%{attr} wurde von %{from} zu %{to} geändert" - anonymous: "anonym" - password_reset_instruction: "Anleitung zum Zurücksetzen des Passwortes" - new: "Neu" - select_existing: "wähle Vorhandene aus" - upload_picture: "Bild hochladen" - body: "Körper" - tags: "Tags" - street1: "Adresszeile 1" - street2: "Adresszeile 2" - shipping_address: "Lieferadresse" - here: "hier" - select_task: "Wähle Aufgabe aus" - action_rejected: "abgelehnt" - logout: "Logout" - referred_by: "erwähnt von" - address: "Adresse" - sign_up: "Registrieren" - about_ffc: "Über Fat Free CRM" - convert: "Umwandeln" - msg_asset_not_available: "%{value} ist nicht länger verfügbar." - admin_tab_tags: "Markierungen" - about_twitter: "Twitter updates" - copy_permissions: "Kopiere %{value} Zugriffsregeln" - task_assigned: "Die Aufgabe wurde %{value} zugeordnet" - amount: "Betrag" - referred_by_small: "erwähnt von" - make_public: "für alle sichtbar" - options: "Optionen" - starts_today: "beginnt heute!" - option_brief: "kurz" - tasks: "Aufgabe" - campaign: "Kampagne" - option_target_leads: "target Anfragen" - create_user: "Erstelle Benutzer" - opportunities: "Chancen" - accounts_small: "accounts" - msg_account_suspended: "Das Benutzerkonto wurde abgelehnt." - permissions_intro_public: "Standardmäßig haben alle Benutzer Zugriff auf den %{value}. Sie können die Zugriffsregeln für den %{value} auch später ändern." - assigned_tasks: "zugeordnete Aufgaben" - objectives: "Ziele" - field_group_unrestricted: "Diese Gruppe gilt für alle %{assets}" - lead_info_small: "Anfragekontakt" - call: "Anruf" - due_asap: "So schnell wie möglich" - action_completed: "erledigt" - start_date: "Startdatum" - msg_last_login: "Sie waren zuletzt abgemeldet am %{value}." - more: "Mehr..." - option_last_name: "Nachname" - end_date: "Enddatum" - started: "Begonnen" - admin_tab_plugins: "Plugins" - company: "Firma" - to_rss: "RSS feed" - yahoo: "Yahoo IM" - phone: "Telefon" - one_day: "Ein Tag" - personal_information: "Persönliche Information" - save_opportunity: "Chance sichern" - opportunity_small: "Chancen" - me: "mir" - none: "Kein(e)" - field_group_tag_restriction: "Diese Gruppe gilt für %{assets} markiert mit \"%{tag}" - option_updated_at: "Änderungsdatum" - keep_private: "nur für mich sichtbar" - select_none: "-- Kein(e) --" - about_ffc_version: "Fat Free CRM version" - budget_label: "Budget (€)" - currency: "(€)" - close_date: "Abschlussdatum" - login_now_link: "Login!" - user_signed_up_on: "Angemeldet am %{value}" - on_hold: "Warteschleife" - gravatar_help: "Gravatar ist nicht bekannt? Lern mehr über Gravatar" - msg_asset_deleted: "%{value} wurde gelöscht." - advanced_search_group_first: "Ergebnisse zeigen, bei denen %{combinator} des Folgenden übereinstimmen" - action_view: "gesehen" - reject: "Ablehnen" - use_gravatar: "Gravatar verwenden" - profile: "Profil" - edit_field_group: "Editiere Gruppe" - contacts_options: "Kontakt-Einstellungen" - contacts_small: "Kontakte" - save_user: "Benutzer sichern" - actual_performance: "Aktuelle Leistung" + create: ! '%{item} erstellt von %{by}' + update: ! '%{item} geändert von %{by}' + destroy: ! '%{item} gelöscht von %{by}' + set_html: ! '%{attr} auf %{to} geändert' + unset_html: ! '%{attr} nicht definiert' + change_html: ! '%{attr} wurde von %{from} zu %{to} geändert' + anonymous: anonym + password_reset_instruction: Anleitung zum Zurücksetzen des Passwortes + new: Neu + select_existing: wähle Vorhandene aus + upload_picture: Bild hochladen + body: Körper + tags: Tags + street1: Adresszeile 1 + street2: Adresszeile 2 + shipping_address: Lieferadresse + here: hier + select_task: Wähle Aufgabe aus + action_rejected: abgelehnt + logout: Logout + referred_by: erwähnt von + address: Adresse + sign_up: Registrieren + about_ffc: Über Fat Free CRM + convert: Umwandeln + msg_asset_not_available: ! '%{value} ist nicht länger verfügbar.' + admin_tab_tags: Markierungen + about_twitter: Twitter updates + copy_permissions: Kopiere %{value} Zugriffsregeln + task_assigned: Die Aufgabe wurde %{value} zugeordnet + amount: Betrag + referred_by_small: erwähnt von + make_public: für alle sichtbar + options: Optionen + starts_today: beginnt heute! + option_brief: kurz + tasks: Aufgabe + campaign: Kampagne + option_target_leads: target Anfragen + create_user: Erstelle Benutzer + opportunities: Chancen + accounts_small: accounts + msg_account_suspended: Das Benutzerkonto wurde abgelehnt. + permissions_intro_public: Standardmäßig haben alle Benutzer Zugriff auf den %{value}. + Sie können die Zugriffsregeln für den %{value} auch später ändern. + assigned_tasks: zugeordnete Aufgaben + objectives: Ziele + field_group_unrestricted: Diese Gruppe gilt für alle %{assets} + lead_info_small: Anfragekontakt + call: Anruf + due_asap: So schnell wie möglich + action_completed: erledigt + start_date: Startdatum + msg_last_login: Sie waren zuletzt abgemeldet am %{value}. + more: Mehr... + option_last_name: Nachname + end_date: Enddatum + started: Begonnen + admin_tab_plugins: Plugins + company: Firma + to_rss: RSS feed + yahoo: Yahoo IM + phone: Telefon + one_day: Ein Tag + personal_information: Persönliche Information + save_opportunity: Chance sichern + opportunity_small: Chancen + me: mir + none: Kein(e) + field_group_tag_restriction: Diese Gruppe gilt für %{assets} markiert mit "%{tag} + option_updated_at: Änderungsdatum + keep_private: nur für mich sichtbar + select_none: -- Kein(e) -- + about_ffc_version: Fat Free CRM version + budget_label: Budget (€) + currency: (€) + close_date: Abschlussdatum + login_now_link: Login! + user_signed_up_on: Angemeldet am %{value} + on_hold: Warteschleife + gravatar_help: Gravatar ist nicht bekannt? Lern mehr über Gravatar + msg_asset_deleted: ! '%{value} wurde gelöscht.' + advanced_search_group_first: Ergebnisse zeigen, bei denen %{combinator} des Folgenden + übereinstimmen + action_view: gesehen + reject: Ablehnen + use_gravatar: Gravatar verwenden + profile: Profil + edit_field_group: Editiere Gruppe + contacts_options: Kontakt-Einstellungen + contacts_small: Kontakte + save_user: Benutzer sichern + actual_performance: Aktuelle Leistung date: formats: - mmddyy: " %e. %b %Y" - mmddyyyy: "%d %B %Y" - mmdd: " %e. %b" - prospecting: "Neukunde" - convert_lead: "Anfrage umwandeln" - save_note: "Notiz sichern" - task_due_in: "fällig in %{value}" - reseller: "Multiplikator" - opportunities_small: "Chancen" - no_activity_records: "Keine Aktivitäten gefunden." - reject_lead_confirm: "Sind Sie sicher, diese Anfrage abzulehnen?" - tagged: "Markiert" - msg_cant_do: "Kann %{asset} nicht %{action}, da es nicht mehr verfügbar ist." - extra_info_small: "zusätzliche Kontaktdaten" - completed_today: "Heute" - customer: "Kunde" - user_active: "Aktiv" - update_password_and_login: "Passwort ändern und Login" - task_assigned_to: "und %{value} zugeordnet" - completed_yesterday: "Gestern" - completed_tab: "Erledigt" - create_task_small: "erstellen Sie eine neue Aufgabe" - linked_in: "LinkedIn" - pipeline: "Pipeline" - option_amount*probability: "gewichteter Betrag" + mmddyy: ! ' %e. %b %Y' + mmddyyyy: ! '%d %B %Y' + mmdd: ! ' %e. %b' + prospecting: Neukunde + convert_lead: Anfrage umwandeln + save_note: Notiz sichern + task_due_in: fällig in %{value} + reseller: Multiplikator + opportunities_small: Chancen + no_activity_records: Keine Aktivitäten gefunden. + reject_lead_confirm: Sind Sie sicher, diese Anfrage abzulehnen? + tagged: Markiert + msg_cant_do: Kann %{asset} nicht %{action}, da es nicht mehr verfügbar ist. + extra_info_small: zusätzliche Kontaktdaten + completed_today: Heute + customer: Kunde + user_active: Aktiv + update_password_and_login: Passwort ändern und Login + task_assigned_to: und %{value} zugeordnet + completed_yesterday: Gestern + completed_tab: Erledigt + create_task_small: erstellen Sie eine neue Aufgabe + linked_in: LinkedIn + pipeline: Pipeline + option_amount*probability: gewichteter Betrag views: admin: plugins: - version: "Version" - description: "Beschreibung" - author: "Autor" - msg_pwd_instructions_sent: "Die Anleitung zum Zurücksetzen des Passwortes wurde Ihnen zugeschickt. Prüfen Sie Ihre Mail." - discount_number: "mit %{value} Rabatt" - lunch: "Mittag" - to_atom: "Atom feed" - option_all_users: "Alle Benutzer" - option_amount: "Betrag" - password_intro: "Bitte geben Sie Ihre E-Mailadresse an, wir senden Ihnen die Anleitung zum Zurücksetzen des Passwortes." + version: Version + description: Beschreibung + author: Autor + msg_pwd_instructions_sent: Die Anleitung zum Zurücksetzen des Passwortes wurde Ihnen + zugeschickt. Prüfen Sie Ihre Mail. + discount_number: mit %{value} Rabatt + lunch: Mittag + to_atom: Atom feed + option_all_users: Alle Benutzer + option_amount: Betrag + password_intro: Bitte geben Sie Ihre E-Mailadresse an, wir senden Ihnen die Anleitung + zum Zurücksetzen des Passwortes. simple_form: - yes: "Ja" + true: Ja required: - text: "notwendig" - mark: "*" + text: notwendig + mark: ! '*' error_notification: - default_message: "Es wurden ein paar Fehler gefunden. Bitte üperprüfen Sie Ihre Eingaben:" - no: "Nein" - permissions: "Zugriffsregeln" - no_match: "Kein %{value} Treffer" - name: "Name" - closing_date: "Abschlussdatum ist %{value}" - no_recent_items: "Es gibt hier noch nichts zum Anzeigen." - affiliate: "Verbundenes Unternehmen" - last_seen: "zuletzt eingeloggt vor %{value}" - status: "Status" - dropbox_notification_to: "Hinzugefügt zu" - related: "re:" - msg_welcome: "Willkommen bei Fat Free CRM!" - msg_bad_image_file: "^Konnte das angegebene Bild nicht hochladen oder zu zuschneiden." - save_lead: "Anfrage sichern" - custom_fields: "Benutzerdefinierte Felder" - category: "Kategorie" - create_lead: "Erstelle Anfrage" - advanced_search_add_condition: "Setze einen Filter" - due_tomorrow: "Morgen" - forgot_password: "Passwort vergessen?" - was_supposed_to_start_in: "angenommener Beginn in %{starts_in} am %{start_date}" - activity_options: "Zeige %{models} Aktivitäten, die %{user} in der/den letzten %{period} unternommen hat." - job_title: "Titel" - completed_last_month: "Letzter Monat" - campaigns: "Kampagnen" - advanced_search_submit: "Suche" - past_due: "überfällig, war vor %{value} fällig" - destroy_past_participle: "Löschungen" - create_field: "Erstelle Feld" - account_small: "Firma" - started_ago: "Gestartet vor %{value}" - language: "Deutsch" - task_from: "Von %{value}" + default_message: ! 'Es wurden ein paar Fehler gefunden. Bitte üperprüfen Sie + Ihre Eingaben:' + false: Nein + permissions: Zugriffsregeln + no_match: Kein %{value} Treffer + name: Name + closing_date: Abschlussdatum ist %{value} + no_recent_items: Es gibt hier noch nichts zum Anzeigen. + affiliate: Verbundenes Unternehmen + last_seen: zuletzt eingeloggt vor %{value} + status: Status + dropbox_notification_to: Hinzugefügt zu + related: ! 're:' + msg_welcome: Willkommen bei Fat Free CRM! + msg_bad_image_file: ^Konnte das angegebene Bild nicht hochladen oder zu zuschneiden. + save_lead: Anfrage sichern + custom_fields: Benutzerdefinierte Felder + category: Kategorie + create_lead: Erstelle Anfrage + advanced_search_add_condition: Setze einen Filter + due_tomorrow: Morgen + forgot_password: Passwort vergessen? + was_supposed_to_start_in: angenommener Beginn in %{starts_in} am %{start_date} + activity_options: Zeige %{models} Aktivitäten, die %{user} in der/den letzten %{period} + unternommen hat. + job_title: Titel + completed_last_month: Letzter Monat + campaigns: Kampagnen + advanced_search_submit: Suche + past_due: überfällig, war vor %{value} fällig + destroy_past_participle: Löschungen + create_field: Erstelle Feld + account_small: Firma + started_ago: Gestartet vor %{value} + language: Deutsch + task_from: Von %{value} activerecord: errors: models: account: attributes: access: - share_account: "^Bitte geben Sie die Benutzer an, mit denen Sie an dieser Firma arbeiten." + share_account: ^Bitte geben Sie die Benutzer an, mit denen Sie an dieser + Firma arbeiten. name: - missing_account_name: "^Bitte geben Sie den Firmennamen an." + missing_account_name: ^Bitte geben Sie den Firmennamen an. task: attributes: calendar: - invalid_date: "^Bitte geben Sie ein gültiges Datum an." + invalid_date: ^Bitte geben Sie ein gültiges Datum an. name: - missing_task_name: "^Bitte geben Sie eine Aufgabenbezeichnung an." + missing_task_name: ^Bitte geben Sie eine Aufgabenbezeichnung an. campaign: attributes: access: - share_campaign: "^Bitte geben Sie die Benutzer an, mit denen Sie an dieser Kampagne arbeiten." + share_campaign: ^Bitte geben Sie die Benutzer an, mit denen Sie an dieser + Kampagne arbeiten. ends_on: - dates_not_in_sequence: "^Bitte stellen Sie sicher, dass das Enddatum der Kampagne nach dem Startdatum liegt." + dates_not_in_sequence: ^Bitte stellen Sie sicher, dass das Enddatum + der Kampagne nach dem Startdatum liegt. name: - missing_campaign_name: "^Bitte geben Sie den Namen der Kampagne an." + missing_campaign_name: ^Bitte geben Sie den Namen der Kampagne an. lead: attributes: access: - share_lead: "^Bitte geben Sie die Benutzer an, mit denen Sie an dieser Kundenanfrage arbeiten." + share_lead: ^Bitte geben Sie die Benutzer an, mit denen Sie an dieser + Kundenanfrage arbeiten. first_name: - missing_first_name: "^Bitte geben Sie den Vornamen an." + missing_first_name: ^Bitte geben Sie den Vornamen an. last_name: - missing_last_name: "^Bitte geben Sie den Nachnamen an." + missing_last_name: ^Bitte geben Sie den Nachnamen an. authentication: attributes: password_field: - is_not_valid: "ist nicht gültig" + is_not_valid: ist nicht gültig login_field: - is_not_valid: "ist nicht gültig" + is_not_valid: ist nicht gültig contact: attributes: access: - share_contact: "^Bitte geben Sie die Benutzer an, mit denen Sie an diesem Kontakt arbeiten." + share_contact: ^Bitte geben Sie die Benutzer an, mit denen Sie an diesem + Kontakt arbeiten. first_name: - missing_first_name: "^Bitte geben Sie den Vornamen an." + missing_first_name: ^Bitte geben Sie den Vornamen an. last_name: - missing_last_name: "^Bitte geben Sie den Nachnamen an." + missing_last_name: ^Bitte geben Sie den Nachnamen an. user: attributes: username: - missing_username: "^Bitte geben Sie einen Benutzernamen an." - username_taken: "^Dieser Benutzername ist schon vergeben." + missing_username: ^Bitte geben Sie einen Benutzernamen an. + username_taken: ^Dieser Benutzername ist schon vergeben. email: - missing_email: "^Bitte geben Sie eine Mailadresse an." - email_in_use: "^Es gibt schon einen Benutzer mit dieser Mailadresse." + missing_email: ^Bitte geben Sie eine Mailadresse an. + email_in_use: ^Es gibt schon einen Benutzer mit dieser Mailadresse. opportunity: attributes: access: - share_opportunity: "^Bitte geben Sie die Benutzer an, mit denen Sie an dieser Chance arbeiten." + share_opportunity: ^Bitte geben Sie die Benutzer an, mit denen Sie an + dieser Chance arbeiten. name: - missing_opportunity_name: "^Bitte geben Sie die Bezeichnung der Chance an." + missing_opportunity_name: ^Bitte geben Sie die Bezeichnung der Chance + an. custom_field: - required: "^%{field} muss vorhanden sein." - maxlength: "^%{field} ist zu lang." - endbeforestart: "^%{field} kann nicht enden bevor es beginnt." - + required: ^%{field} muss vorhanden sein. + maxlength: ^%{field} ist zu lang. + endbeforestart: ^%{field} kann nicht enden bevor es beginnt. attribute_options: opportunity: stage: - prospecting: "Untersuchen" - analysis: "Analyse" - presentation: "Präsentation" - proposal: "Angebot" - negotiation: "Verhandlung" - final_review: "Finale Überprüfung" - won: "Geschlossen/Gewonnen" - lost: "Geschlossen/Verloren" - feel_free: "Seien Sie so frei und" - one_hour: "Eine Stunde" - change_password: "Passwort ändern" - user: "Benutzer" - msg_goodbye: "Sie wurden abgemeldet. Danke, dass Sie Fat Free CRM! benutzt haben." - option_leads_count: "aktuelle Anfragen" - suspend: "Sperren" - task_completed_ago: "vor %{value} erledigt" - probability: "Wahrscheinlk." - revenue: "Umsatz" - save_account: "Konto sichern" - all_users: "alle Benutzer" - city: "Stadt" - pending_tab: "Wartend" - sort_by_displaying: "Sortiere %{models} nach %{field}, Vorname wird %{position} dem Nachnamen angezeigt." - lead_permissions_intro_public: "Standardmäßig werden die Zugriffsregeln aus der Kampagne kopiert oder auf öffentlich gesetzt. Dies kann auch später durchgeführt werden." - msg_password_not_changed: "Ihr Passwort wurde nicht geändert." - user_never_logged_in: "hat sich bisher nicht eingeloggt" - completed_tasks: "erledigte Aufgaben" - due_next_week: "Nächste Woche" - billing_address: "Rechnungsadresse" - open_in_window: "Öffne %{value} in einem neuen Fenster" - subject_task: "Aufgabe" - completed: "Erledigt" - rejected: "Abgelehnt" - msg_password_changed: "Ihr Passwort wurde geändert." + prospecting: Untersuchen + analysis: Analyse + presentation: Präsentation + proposal: Angebot + negotiation: Verhandlung + final_review: Finale Überprüfung + won: Geschlossen/Gewonnen + lost: Geschlossen/Verloren + feel_free: Seien Sie so frei und + one_hour: Eine Stunde + change_password: Passwort ändern + user: Benutzer + msg_goodbye: Sie wurden abgemeldet. Danke, dass Sie Fat Free CRM! benutzt haben. + option_leads_count: aktuelle Anfragen + suspend: Sperren + task_completed_ago: vor %{value} erledigt + probability: Wahrscheinlk. + revenue: Umsatz + save_account: Konto sichern + all_users: alle Benutzer + city: Stadt + pending_tab: Wartend + sort_by_displaying: Sortiere %{models} nach %{field}, Vorname wird %{position} dem + Nachnamen angezeigt. + lead_permissions_intro_public: Standardmäßig werden die Zugriffsregeln aus der Kampagne + kopiert oder auf öffentlich gesetzt. Dies kann auch später durchgeführt werden. + msg_password_not_changed: Ihr Passwort wurde nicht geändert. + user_never_logged_in: hat sich bisher nicht eingeloggt + completed_tasks: erledigte Aufgaben + due_next_week: Nächste Woche + billing_address: Rechnungsadresse + open_in_window: Öffne %{value} in einem neuen Fenster + subject_task: Aufgabe + completed: Erledigt + rejected: Abgelehnt + msg_password_changed: Ihr Passwort wurde geändert. pluralize: comment: - other: "%{count} Kommentare" - one: "1 Kommentar" + other: ! '%{count} Kommentare' + one: 1 Kommentar contact: - other: "%{count} Kontakte" - one: "1 Kontakt" + other: ! '%{count} Kontakte' + one: 1 Kontakt lead: - other: "%{count} Anfragen" - one: "1 Anfrage" + other: ! '%{count} Anfragen' + one: 1 Anfrage login: - other: "%{count} logins" - one: "1 Login" + other: ! '%{count} logins' + one: 1 Login opportunity: - other: "%{count} Chancen" - one: "1 Chance" + other: ! '%{count} Chancen' + one: 1 Chance day: - other: "%{count} Tage" - one: "1 Tag" - profile_language: "Sprache" - target: "Ziel" - msg_cant_delete_field_group: "Gruppe konnte nicht gelöscht werden." - user_signed_up: "Angemeldet" - tab_campaigns: "Kampagnen" - make_current_view_list: "Erstelle Liste aus aktueller Ansicht" - no_closing_date: "kein erwartetes Abschlussdatum" - about_user_group: "Diskussionsgruppe für Benutzer" - create_contact: "Erstelle Kontakt" - msg_logout_needed: "Sie müssen abgemeldet sein, um diese Seite zu sehen." - view_past_participle: "Ansichten" - msg_email_not_found: "Es wurde kein Benutzer mit der Mailadresse gefunden." - msg_enter_new_password: "Bitte geben Sie ein neues Passwort ein." - self: "Selbst generiert" - list_name_info: "Wenn Du den Namen einer bestehenden Liste wählst, wird diese Liste mit deinen aktuellen Einstellungen überschrieben." - msg_account_created: "Ihr Account wurde angelegt und wartet auf die Freigabe durch den Systemadministrator." - contact: "Kontakt" + other: ! '%{count} Tage' + one: 1 Tag + profile_language: Sprache + target: Ziel + msg_cant_delete_field_group: Gruppe konnte nicht gelöscht werden. + user_signed_up: Angemeldet + tab_campaigns: Kampagnen + make_current_view_list: Erstelle Liste aus aktueller Ansicht + no_closing_date: kein erwartetes Abschlussdatum + about_user_group: Diskussionsgruppe für Benutzer + create_contact: Erstelle Kontakt + msg_logout_needed: Sie müssen abgemeldet sein, um diese Seite zu sehen. + view_past_participle: Ansichten + msg_email_not_found: Es wurde kein Benutzer mit der Mailadresse gefunden. + msg_enter_new_password: Bitte geben Sie ein neues Passwort ein. + self: Selbst generiert + list_name_info: Wenn Du den Namen einer bestehenden Liste wählst, wird diese Liste + mit deinen aktuellen Einstellungen überschrieben. + msg_account_created: Ihr Account wurde angelegt und wartet auf die Freigabe durch + den Systemadministrator. + contact: Kontakt ransack: predicates: - gt: "ist größer als" - cont: "enthält" - matches: "entspricht" - does_not_match: "entspricht nicht" - not_cont: "enthält nicht" - not_null: "ist nicht Null" - lt: "ist weniger als" - blank: "ist leer" - not_eq: "ist nicht" - null: "ist Null" - eq: "ist" - present: "ist vorhanden" - online: "Online Marketing" - collapsed: "Ausgeblendet" - advanced_search: "Erweiterte Suche" - basic_search: "Einfache Suche" - msg_password_updated: "Passwort wurde erfolgreich geändert." - admin_tab_settings: "Settings" - current_password: "Aktuelles Passwort" - lists: "Listen" - accounts_advanced_search: "Erweiterte Accountsuche" - option_revenue: "aktueller Umsatz" - total_opportunities: "Anzahl Chancen" - mobile: "Mobiltelefon" - image_help: "Das hochgeladene Bild wird automatisch auf eine Größe von 75 x 75 Pixels berechnet. Unterstützte Formate sind GIF, JPG, und PNG." - view_pending_tasks: "ausstehende Aufgaben anzeigen" - about_features: "Features und Fehler" - finished_on: "beendet am %{value}" - assigned_to: "Zugeordnet zu" - date_created: "Erstellungsdatum" - subject_campaign: "Kampagne" - no_account: "Sie haben noch keinen Benutzer?" - rating: "Rating" - last_name: "Nachname" - option_rating: "Rating" - collapse_all: "Alles ausblenden" - contacted: "Kontaktiert" - show: "Zeige" - date_updated: "Änderungsdatum" - total_campaigns: "Anzahl Kampagnen" - msg_cant_create_related: "Kann %{asset} nicht erstellen, da %{related} nicht länger verfügbar ist." - to_xls: "Exportiere ins Excel" - campaigns_options: "Kampagnen-Einstellungen" - subject_lead: "Anfrage" - option_company: "Firma" - opportunities_options: "Chance-Einstellungen" - finishes_in: "beendet in %{value}" - less: "Weniger..." - expected_to_close: "Abschluss erwartet in %{time} am %{date}" - select_a_country: "Wähle ein Land aus" - msg_assets_not_available: "%{value} sind nicht verfügbar." - confirm_password_intro: "Bitte geben Sie Ihr neues Passwort ein und bestätigen es." - assigned_tab: "Zugeordnet" - tab_leads: "Anfragen" - save_campaign: "Kampagne sichern" - move_to: "verschiebe auf" - add_note: "Notiz anfügen" - edit_profile: "Profil bearbeiten" - field_group_confirm_delete: "Exportiere als Comma-separiertes Dateiformat (inklusive gelöschte Datensätze)" - campaign_and_leads: "Kampagne und zugehörige Anfragen" + gt: ist größer als + cont: enthält + matches: entspricht + does_not_match: entspricht nicht + not_cont: enthält nicht + not_null: ist nicht Null + lt: ist weniger als + blank: ist leer + not_eq: ist nicht + ! '': ist Null + eq: ist + present: ist vorhanden + online: Online Marketing + collapsed: Ausgeblendet + advanced_search: Erweiterte Suche + basic_search: Einfache Suche + msg_password_updated: Passwort wurde erfolgreich geändert. + admin_tab_settings: Settings + current_password: Aktuelles Passwort + lists: Listen + accounts_advanced_search: Erweiterte Accountsuche + option_revenue: aktueller Umsatz + total_opportunities: Anzahl Chancen + mobile: Mobiltelefon + image_help: Das hochgeladene Bild wird automatisch auf eine Größe von 75 x 75 Pixels + berechnet. Unterstützte Formate sind GIF, JPG, und PNG. + view_pending_tasks: ausstehende Aufgaben anzeigen + about_features: Features und Fehler + finished_on: beendet am %{value} + assigned_to: Zugeordnet zu + date_created: Erstellungsdatum + subject_campaign: Kampagne + no_account: Sie haben noch keinen Benutzer? + rating: Rating + last_name: Nachname + option_rating: Rating + collapse_all: Alles ausblenden + contacted: Kontaktiert + show: Zeige + date_updated: Änderungsdatum + total_campaigns: Anzahl Kampagnen + msg_cant_create_related: Kann %{asset} nicht erstellen, da %{related} nicht länger + verfügbar ist. + to_xls: Exportiere ins Excel + campaigns_options: Kampagnen-Einstellungen + subject_lead: Anfrage + option_company: Firma + opportunities_options: Chance-Einstellungen + finishes_in: beendet in %{value} + less: Weniger... + expected_to_close: Abschluss erwartet in %{time} am %{date} + select_a_country: Wähle ein Land aus + msg_assets_not_available: ! '%{value} sind nicht verfügbar.' + confirm_password_intro: Bitte geben Sie Ihr neues Passwort ein und bestätigen es. + assigned_tab: Zugeordnet + tab_leads: Anfragen + save_campaign: Kampagne sichern + move_to: verschiebe auf + add_note: Notiz anfügen + edit_profile: Profil bearbeiten + field_group_confirm_delete: Exportiere als Comma-separiertes Dateiformat (inklusive + gelöschte Datensätze) + campaign_and_leads: Kampagne und zugehörige Anfragen comment_notification: - reply_instructions: "Sie können auf dieses e-Mail antworten um ein Kommentar hinzuzufügen, oder zeigen Sie %{entity} in Ihrem Browser an." - intro: "%{user_full_name} kommentierte %{entity_type}: %{entity_name}" - my_profile: "Mein Profil" - add_note_help: "Neue Notiz hinzufügen..." - select_contact: "Wähle einen Kontakt aus" - create_field_group: "Erstelle Gruppe." - create_opportunity: "Erstelle Chance" - revenue_label: "Umsatz (€)" - about_project_page: "Projekt-Page" - tab_dashboard: "Dashboard" - weighted_amount: "Gewichteter Betrag" - lead_permissions_intro_shared: "Standardmäßig werden die Zugriffsregeln aus der Kampagne kopiert oder wird vom angegebenen Benutzer übernommen. Dies kann auch später durchgeführt werden." - completed_last_week: "Letzte Woche" - department_small: "%{value} Abteilung" - subject: "Angelegenheit" - cold_call: "Cold Call" - label: "Beschriftung" - state: "Bundesland" - won: "Erfolg" - admin_tab_users: "Benutzer" - no_saved_lists: "Keine gespeicherten Listen" - days_late: "Verspätet um" - email: "Email" - tab_contacts: "Kontakte" - campaign_small: "Kampagne" - number_of_leads: "Anzahl der Anfragen" - mail_to: "Mail an %{value}" - sign_up_button: "Registrieren" - campaigns_small: "Kampagnen" - convert_lead_permissions_intro: "Die Zugriffsregeln des Kontakts werden von der Anfrage übernommen. Sie können die Zugriffsregeln auch später ändern." - referral: "Empfehlungen" - admin: "Admin" - country: "Land" - objectives_small: "Kamagnen-Ziele" - planned: "Geplant" - confirm_delete: "Sie wollen wirklich %{value} löschen?" - closes_today: "Abschluss heute erwartet!" - login: "Login" - approve: "Genehmige" - negotiation: "Vertrag" - option_before: "vor" - convert_lead_text: "Mit der Umwandlung wird %{value} zu einem Kontakt, der mit einem existierenden oder neu zu erstellenden account verbunden wird. Der Anfrage-Status wird automatisch auf umgewandelt geändert." - subscribe_via_email: "Anmeldung via e-Mail" - items_total: "%{count} total." - already_signed_up: "Schon registriert?" - works_at: "%{job_title} bei %{company}" - cancel: "Abbrechen" - subject_user: "Benutzer" - sign_up_now: "Registrieren Sie sich jetzt!" - select_opportunity: "Wähle eine Chance aus" - contact_small: "Kontakt" - conference: "Konferenz" - tab_accounts: "Firmen" - save_profile: "Profil sichern" - due: "Fällig" - create_new: "erstelle neu(e)" - revenue_number: "%{value} Umsatz" - total_leads: "Anzahl der Anfragen" - proposal: "Angebot" - do_not_call: "Nicht anrufen" - meeting: "Meeting" - opportunity_summary: "Chancen auf einen Blick" - username: "Benutzername" - option_created_at: "Erstellungsdatum" - users_small: "Benutzer" - custom_field_options: "Passe die Feldoptionen an" - about_ffc_resources: "Fat Free CRM Ressourcen (Links öffnen ein neues Fenster)" - task_due_later: "demnächst fällig" - myself: "mir" - mobile_small: "Mobiltelefon" - expanded: "Erweitert" - alt_email: "Alternative Email" - create_past_participle: "Zuletzt erstellte Datensätze" - sort_by: "Sortiere %{models} nach %{field}" - aim: "AOL IM" - update_past_participle: "Aktualisierungen" - called_off: "Abgesagt" - task_due_today: "heute fällig" - converted: "Umgewandelt" - disable_email_subscriptions: "Deaktiviere e-Mail Benachrichtigungen" - total_accounts: "Alle Accounts" - dropbox_notification_intro: "Die e-Mail wurde erfolgreich hinzugefügt, welche an die Dropbox geschickt wurde" - msg_successful_signup: "Erfolgreiche Anmeldung. Willkommen bei Fat Free CRM!" - following_users_will_be_notified: "Die folgenden Benutzer werden mittels e-Mail benachrichtigt" - skype: "Skype" - partner: "Partner" - n_a: "N/A" - extra_info: "Zusatzinformation" - option_all: "alle" - new_password: "Neues Passwort" - two_weeks: "Zwei Wochen" - campaign_summary: "Kampagnen-Zusammenfassung" - permissions_intro_shared: "Standardmäßig haben nur ausgewählte Benutzer Zugriff auf den %{value}. Sie können die Zugriffsregeln für den %{value} auch später ändern." - save_task: "Aufgabe sichern" - option_target_revenue: "Zielumsatz" - please_retry: "Versuchen Sie eine andere Abfrage." - show_per_page: "Zeige %{number} %{models} pro Seite in %{fmt}-Format." - admin_tab_fields: "Benutzerdefinierte Felder" - user_suspended_on: "Gesperrt am %{value}" - conversion: "Konversion" - due_today: "Heute fällig" - option_probability: "Wahrscheinlichkeit" - select_blank: "-- Auswahl --" - action_reassigned: "neu zugeordnet" - opportunity: "Chancen" - total_tasks: "Anzahl %{value}" - to_csv: "Exportiere als Excel-kompatibles Dateiformat (.csv) inklusive gelöschte Datensätze" - task: "Aufgaben" - analysis: "Analyse" - not_implemented: "Noch nicht implementiert." - tag_with_taggings_confirm_delete: "Wenn dieser Tag gelöscht wird, wird er von %{value} Einträgen entfernt." - search_assets: "Suche %{value}" - task_completed_by: "vor %{time_ago} von %{user} erledigt" - comment: "Kommentar" - advanced_search_remove_condition: "Entferne Filter" - user_admin: "Admin" - permissions_intro_private: "Standardmäßig haben nur Sie Zugriff auf den %{value}. Sie können die Zugriffsregeln für den %{value} auch später ändern." - money: "Geld" - zipcode: "Postleitzahl" - action_rescheduled: "neu geplant" - leads_options: "Anfrage-Einstellungen" - due_this_week: "Diese Woche" - select_an_account: "Wähle einen Account aus" - about_thank_you: "Danke, dass Sie Fat Free CRM benutzen! Wir schätzen Ihre Hilfe und hoffen, Sie finden Gefallen an der Software." - web: "Website" - accounts_options: "Firmen-Optionen" - crm_admin_page: "Fat Free CRM Administration" - tab_tasks: "Aufgaben" - blog: "Website/Blog" - source: "Quelle" - option_after: "nach" - task_overdue: "zu spät, war fällig am" - alt_email_small: "Andere" - vendor: "Verkäufer" - user_awaits_approval: "Genehmigung erforderlich" - field_group_tags: "Gruppen mit diesem Tag" - save_field: "Speichere Feld" - phone_toll_free: "kostenloses Telefon" - task_due_now: "jetzt fällig" - password: "Passwort" - recent_items: "Aktuelle Änderungen" - image_file: "Bilddatei" - about_dev_group: "Diskussionsgruppe für Entwickler" - lost: "Verloren" - expand_all: "Alles anzeigen" - back_to_crm: "Back to Fat Free CRM" - option_long: "lang" - edit: "Bearbeiten" - no_button: "Nein" - msg_asset_not_authorized: "You are not authorized to view this %{value}." - task_completed: "erledigt" - google: "Google IM" - twitter: "Twitter" - back: "Zurück" - subject_email: "Email zu" - share_with: "für folgende Personen sichtbar" - first_name: "Vorname" - competitor: "Mitbewerber" - lead: "Anfrage" - contacts: "Kontakte" - advanced_search_add_group: "Füge eine Filtergruppe hinzu" - save_tag: "Speichere Tag" - conversion_label: "Konversion (%)" - no_tasks_assigned: "zugeordnet" - select_or_create_tags: "Wähle einige Markierungen aus oder erstelle eine neue Markierung durch Drücken der \"enter\"-Taste." - phone_small: "Telefon" - user_suspended: "Gesperrt" - added_by: "hinzugefügt vor %{time_ago} durch %{user}" - avatar: "Avatar" - campaign_targets: "Kampagnen-Ziele" - msg_asset_rejected: "%{value} wurde abgelehnt." - pending_tasks: "ausstehende Aufgaben" - discount: "Rabatt" - tab_opportunities: "Chancen" - from: "von" - time_ago: "vor %{value}" - stage: "Ebene" - about: "Über" - actual: "Aktuell" - opportunity_summary_text: "%{amount} mit %{discount} Rabatt und %{probability} Wahrscheinlichkeit" - close_form: "Abschlussformular" - option_starts_on: "Startdatum" - discard: "Discard" - or: "oder" - two_days: "Zwei Tagen" - subject_comment: "Kommentar zu" - could_not_find_matching: "Konnte %{value} nicht finden - passend zu" - action_won: "gewonnen" - accounts: "Firmen" - create_opp_for_contact: "Optional können Sie eine Chance erstellen für %{value} unter Angabe des Namen, aktueller Stand, geschätztes Abschlußdatum, Erfolgswahrscheinlichkeit, Auftragswert und dem angebotenen Rabatt." - restrict_by_tag: "Schränke anhand des Tags ein" - reactivate: "Reaktivieren" - action_update: "aktualisiert" - notifications_tooltip: "Wenn ein Kommentar hinzugefügt wird, werden alle Abonnenten mittels e-Mail benachrichtigt" - option_first_name: "Vorname" - msg_invalid_password: "^Bitte geben Sie Ihr gültiges Passwort ein." - user_confirm_delete: "Ein Benutzer kann nur gelöscht werden, wenn ihm nichts mehr zugeordnet ist." - select_lead: "Wähle eine Anfrage aus" - lead_permissions_intro_private: "Standardmäßig werden die Zugriffsregeln aus der Kampagne kopiert oder auf privat gesetzt. Dies kann auch später durchgeführt werden." - remember_me: "Erinnere mich" - edit_comment: "Kommentar bearbeiten" - no_tasks_pending: "wartend" - lead_summary: "Anfrage-Zusammenfassung" - task_small: "Aufgabe" - assign_to: "Ordne zu" - due_specific_date: "An bestimmten Datum..." - versions: "History" - tasks_small: "Aufgaben" - create_task: "Erstelle Aufgabe" - reset_password: "Passwort zurücksetzen" - view_assigned_tasks: "zugeordnete Aufgaben anzeigen" - action_create: "erstellt" - was_supposed_to_finish: "angenommenes Ende am %{value}" - subject_address: "address on" - msg_cant_delete_tag: "Konnte '%{value}' nicht löschen, weil es mit Gruppen assoziiert ist. " - no_start_date: "kein Startdatum angegeben" - delete: "Löschen" - website: "Website" - create_tag: "Tag erstellen" - save_contact: "Kontakt sichern" - word_of_mouth: "Mundpropaganda" - intro: "Sie können die Informationen für %{value} später ändern." - at: "bei" - option_ends_on: "Enddatum" - recent_activity_options: "Letzte Aktivitäten Einstellungen" - trip: "Trip" - user_is_admin: "Der Benutzer ist Administrator" - days_left: "Tage verfügbar" - option_name: "Name" - no_tasks_completed: "vollständig" - other: "Andere" - advanced_search_group_rest: "...and where %{combinator} of the following match" - department: "Abteilung" - field_types: - tel: "Telefon Nummer" - string: "Kurze Antwort" - url: "URL" - text: "Lange Antwort" - decimal: "Nummer (Decimal)" - float: "Nummer (Floating Point)" - check_boxes: "Checkbox Liste" - datetime: "Datum & Uhrzeit" - multiselect: "Multi Auswahl" - boolean: "Checkbox" - radio: "Radio Buttons (Einzelauswahl)" - date: "Datum" - integer: "Nummer (Integer)" - email: "Email Adresse" - select: "Auswahl Liste (Select List)" - save_field_group: "Gruppe speichern" - subject_account: "account" - create_a_new: "neu erstellen" - dropbox_notification_subject: "dropbox - Email hinzugefügt - %{subject}" - quick_find: "Suche" - users: "Benutzer" - task_pending: "Aufgabe wurde in die Warteschlange bewegt" - welcome: "Willkommen" - update: "Ändern" - will_paginate: - page_gap: "…" - page_entries_info: - single_page: - zero: "Keine %{plural} gefunden" - other: "Zeigt alle %{count} %{plural}" - one: "Zeigt 1 %{name} an" - multi_page: "Es werden %{from} - %{to} %{plural} von insgesamt %{total} angezeigt" - next_label: "Weiter →" - previous_label: "← Zurück" - added_ago: "hinzugefügt vor %{value}" - create_campaign: "Erstelle Kampagne" - field_group_empty: "Es gibt keine Felder in dieser Gruppe." - msg_cant_delete_user: "^Kann den Benutzer nicht löschen, da %{value} noch aktive Anlagen hat." - edit_note: "Notiz bearbeiten" - web_presence: "Web-Präsenz" - lead_small: "Anfragen" - time: - formats: - mmddhhss: "%e %b %l:%M%p" - mmddyyyy_hhmm: "%d %B %Y %H:%M" - starts_in: "beginnt in %{value}" - subject_contact: "Kontakt" - overdue: "Verspätet, war fällig am" - access: "Zugang" - born_on: "Geboren am" - reports_to: "Berichtet an" - my_tasks: "Meine Aufgaben" - my_opportunities: "Meine Chancen" - my_accounts: "Meine Firmen" - no_task_records: "Sie haben keine Aufgaben" - no_opportunity_records: "Sie haben keine Chancen" - no_account_records: "Sie haben keine Firmen" - target_revenue: "Target revenue" - target_conversion: "Ziel Konversion" - account_with_title_department: "%{title}, %{department} bei %{account}" - account_with_title: "%{title} bei %{account}" - lead_statuses: "Anfragen Status" - account_categories: "Firmen Kategorien" - opportunity_stages: "Chancen Abschnitte" - search_results_count: - one: "Suche ergab %{count} Treffer." - other: "Suche ergab %{count} Treffer." - entities_per_page: "%{entity} pro Seite:" - tab_team: "Team" - admin_tab_groups: "Gruppen" - contacts_index_long: "Langes Format" - contacts_index_brief: "Kurzes Format" - contacts_index_full: "Ganzes Format" - opportunities_index_normal: "Normales Format" - accounts_index_normal: "Normales Format" - leads_index_normal: "Normales Format" - campaigns_index_normal: "Normales Format" - account_id: "Firma" - campaign_statuses: "Kampagne Status" - unassigned: "Nicht zugeordnet" - general_info: "Allgemeine Informationen" - show_general_info_small: "Zeige allgemeine Informationen zu diesem Kontakt" - show_extra_info_small: "Zeige zusätzliche Informationen zu diesem Kontakt" - tag_details: "%{tag} Einzelheiten" - show_tag_info_small: "Zeige %{tag} Informationen zu diesem Kontakt." - shared_with_everyone: "Mit jedem teilen" - title: "Titel" - subscriptions: "Beitreten" - show_status_info_small: "Zeige Status Informationen zu dieser Anfrage." - show_contact_info_small: "Zeige Kontakt Informationen zu dieser Anfrage." - closes_on: "Geschlossen am" - unassigned_opportunities: "Nicht zugeteilte Chancen" - no_opportunities_found: "Es gibt derzeit keine abgelaufenen Chancen" - tag_list: "Tags" - action_create_comment: "- "%{comment}"" - not_showing_hidden_entities: "%{count} versteckte %{entity} werden nicht angezeigt." - comment_intro: "Sie können Kommentare später hinzufügen." - create_group: "Erstelle Gruppe" - save_group: "Speichere Gruppe" - group_members: "Teilnehmer" - groups: "Gruppen" - groups_small: "Gruppen" - group_small: "Gruppe" - confirm_group_delete: "Wollen Sie wirklich diese Gruppe löschen? Sie wird noch von %{count} Einheiten referenziert." - group_memberships: "Gruppen Zugehörigkeit" - account_contact_id: "Firmen id" - account_contact_name: "Firmen Name" - user_id: "Benutzer id" - created_at: "Erstellt am" - updated_at: "Geändert am" - to_perm: "Link" - admin_fields_info2: "Es wird empfohlen den Server neu zu starten, nachdem kundenspezifische Felder hinzugefügt oder entfernt wurden." - + reply_instructions: Sie können auf dieses e-Mail antworten um ein Kommentar hinzuzufügen, + oder zeigen Sie %{entity} in Ihrem Browser an. + intro: ! '%{user_full_name} kommentierte %{entity_type}: %{entity_name}' + my_profile: Mein Profil + add_note_help: Neue Notiz hinzufügen... + select_contact: Wähle einen Kontakt aus + create_field_group: Erstelle Gruppe. + create_opportunity: Erstelle Chance + revenue_label: Umsatz (€) + about_project_page: Projekt-Page + tab_dashboard: Dashboard + weighted_amount: Gewichteter Betrag + lead_permissions_intro_shared: Standardmäßig werden die Zugriffsregeln aus der Kampagne + kopiert oder wird vom angegebenen Benutzer übernommen. Dies kann auch später durchgeführt + werden. + completed_last_week: Letzte Woche + department_small: ! '%{value} Abteilung' + subject: Angelegenheit + cold_call: Cold Call + label: Beschriftung + state: Bundesland + won: Erfolg + admin_tab_users: Benutzer + no_saved_lists: Keine gespeicherten Listen + days_late: Verspätet um + email: Email + tab_contacts: Kontakte + campaign_small: Kampagne + number_of_leads: Anzahl der Anfragen + mail_to: Mail an %{value} + sign_up_button: Registrieren + campaigns_small: Kampagnen + convert_lead_permissions_intro: Die Zugriffsregeln des Kontakts werden von der Anfrage + übernommen. Sie können die Zugriffsregeln auch später ändern. + referral: Empfehlungen + admin: Admin + country: Land + objectives_small: Kamagnen-Ziele + planned: Geplant + confirm_delete: Sie wollen wirklich %{value} löschen? + closes_today: Abschluss heute erwartet! + login: Login + approve: Genehmige + negotiation: Vertrag + option_before: vor + convert_lead_text: Mit der Umwandlung wird %{value} zu einem Kontakt, der mit einem + existierenden oder neu zu erstellenden account verbunden wird. Der Anfrage-Status + wird automatisch auf umgewandelt geändert. + subscribe_via_email: Anmeldung via e-Mail + items_total: ! '%{count} total.' + already_signed_up: Schon registriert? + works_at: ! '%{job_title} bei %{company}' + cancel: Abbrechen + subject_user: Benutzer + sign_up_now: Registrieren Sie sich jetzt! + select_opportunity: Wähle eine Chance aus + contact_small: Kontakt + conference: Konferenz + tab_accounts: Firmen + save_profile: Profil sichern + due: Fällig + create_new: erstelle neu(e) + revenue_number: ! '%{value} Umsatz' + total_leads: Anzahl der Anfragen + proposal: Angebot + do_not_call: Nicht anrufen + meeting: Meeting + opportunity_summary: Chancen auf einen Blick + username: Benutzername + option_created_at: Erstellungsdatum + users_small: Benutzer + custom_field_options: Passe die Feldoptionen an + about_ffc_resources: Fat Free CRM Ressourcen (Links öffnen ein neues Fenster) + task_due_later: demnächst fällig + myself: mir + mobile_small: Mobiltelefon + expanded: Erweitert + alt_email: Alternative Email + create_past_participle: Zuletzt erstellte Datensätze + sort_by: Sortiere %{models} nach %{field} + aim: AOL IM + update_past_participle: Aktualisierungen + called_off: Abgesagt + task_due_today: heute fällig + converted: Umgewandelt + disable_email_subscriptions: Deaktiviere e-Mail Benachrichtigungen + total_accounts: Alle Accounts + dropbox_notification_intro: Die e-Mail wurde erfolgreich hinzugefügt, welche an + die Dropbox geschickt wurde + msg_successful_signup: Erfolgreiche Anmeldung. Willkommen bei Fat Free CRM! + following_users_will_be_notified: Die folgenden Benutzer werden mittels e-Mail benachrichtigt + skype: Skype + partner: Partner + n_a: N/A + extra_info: Zusatzinformation + option_all: alle + new_password: Neues Passwort + two_weeks: Zwei Wochen + campaign_summary: Kampagnen-Zusammenfassung + permissions_intro_shared: Standardmäßig haben nur ausgewählte Benutzer Zugriff auf + den %{value}. Sie können die Zugriffsregeln für den %{value} auch später ändern. + save_task: Aufgabe sichern + option_target_revenue: Zielumsatz + please_retry: Versuchen Sie eine andere Abfrage. + show_per_page: Zeige %{number} %{models} pro Seite in %{fmt}-Format. + admin_tab_fields: Benutzerdefinierte Felder + user_suspended_on: Gesperrt am %{value} + conversion: Konversion + due_today: Heute fällig + option_probability: Wahrscheinlichkeit + select_blank: -- Auswahl -- + action_reassigned: neu zugeordnet + opportunity: Chancen + total_tasks: Anzahl %{value} + to_csv: Exportiere als Excel-kompatibles Dateiformat (.csv) inklusive gelöschte + Datensätze + task: Aufgaben + analysis: Analyse + not_implemented: Noch nicht implementiert. + tag_with_taggings_confirm_delete: Wenn dieser Tag gelöscht wird, wird er von %{value} + Einträgen entfernt. + search_assets: Suche %{value} + task_completed_by: vor %{time_ago} von %{user} erledigt + comment: Kommentar + advanced_search_remove_condition: Entferne Filter + user_admin: Admin + permissions_intro_private: Standardmäßig haben nur Sie Zugriff auf den %{value}. + Sie können die Zugriffsregeln für den %{value} auch später ändern. + money: Geld + zipcode: Postleitzahl + action_rescheduled: neu geplant + leads_options: Anfrage-Einstellungen + due_this_week: Diese Woche + select_an_account: Wähle einen Account aus + about_thank_you: Danke, dass Sie Fat Free CRM benutzen! Wir schätzen Ihre Hilfe + und hoffen, Sie finden Gefallen an der Software. + web: Website + accounts_options: Firmen-Optionen + crm_admin_page: Fat Free CRM Administration + tab_tasks: Aufgaben + blog: Website/Blog + source: Quelle + option_after: nach + task_overdue: zu spät, war fällig am + alt_email_small: Andere + vendor: Verkäufer + user_awaits_approval: Genehmigung erforderlich + field_group_tags: Gruppen mit diesem Tag + save_field: Speichere Feld + phone_toll_free: kostenloses Telefon + task_due_now: jetzt fällig + password: Passwort + recent_items: Aktuelle Änderungen + image_file: Bilddatei + about_dev_group: Diskussionsgruppe für Entwickler + lost: Verloren + expand_all: Alles anzeigen + back_to_crm: Back to Fat Free CRM + option_long: lang + edit: Bearbeiten + no_button: Nein + msg_asset_not_authorized: You are not authorized to view this %{value}. + task_completed: erledigt + google: Google IM + twitter: Twitter + back: Zurück + subject_email: Email zu + share_with: für folgende Personen sichtbar + first_name: Vorname + competitor: Mitbewerber + lead: Anfrage + contacts: Kontakte + advanced_search_add_group: Füge eine Filtergruppe hinzu + save_tag: Speichere Tag + conversion_label: Konversion (%) + no_tasks_assigned: zugeordnet + select_or_create_tags: Wähle einige Markierungen aus oder erstelle eine neue Markierung + durch Drücken der "enter"-Taste. + phone_small: Telefon + user_suspended: Gesperrt + added_by: hinzugefügt vor %{time_ago} durch %{user} + avatar: Avatar + campaign_targets: Kampagnen-Ziele + msg_asset_rejected: ! '%{value} wurde abgelehnt.' + pending_tasks: ausstehende Aufgaben + discount: Rabatt + tab_opportunities: Chancen + from: von + time_ago: vor %{value} + stage: Ebene + about: Über + actual: Aktuell + opportunity_summary_text: ! '%{amount} mit %{discount} Rabatt und %{probability} + Wahrscheinlichkeit' + close_form: Abschlussformular + option_starts_on: Startdatum + discard: Discard + or: oder + two_days: Zwei Tagen + subject_comment: Kommentar zu + could_not_find_matching: Konnte %{value} nicht finden - passend zu + action_won: gewonnen + accounts: Firmen + create_opp_for_contact: Optional können Sie eine Chance erstellen für %{value} unter + Angabe des Namen, aktueller Stand, geschätztes Abschlußdatum, Erfolgswahrscheinlichkeit, + Auftragswert und dem angebotenen Rabatt. + restrict_by_tag: Schränke anhand des Tags ein + reactivate: Reaktivieren + action_update: aktualisiert + notifications_tooltip: Wenn ein Kommentar hinzugefügt wird, werden alle Abonnenten + mittels e-Mail benachrichtigt + option_first_name: Vorname + msg_invalid_password: ^Bitte geben Sie Ihr gültiges Passwort ein. + user_confirm_delete: Ein Benutzer kann nur gelöscht werden, wenn ihm nichts mehr + zugeordnet ist. + select_lead: Wähle eine Anfrage aus + lead_permissions_intro_private: Standardmäßig werden die Zugriffsregeln aus der + Kampagne kopiert oder auf privat gesetzt. Dies kann auch später durchgeführt werden. + remember_me: Erinnere mich + edit_comment: Kommentar bearbeiten + no_tasks_pending: wartend + lead_summary: Anfrage-Zusammenfassung + task_small: Aufgabe + assign_to: Ordne zu + due_specific_date: An bestimmten Datum... + versions: History + tasks_small: Aufgaben + create_task: Erstelle Aufgabe + reset_password: Passwort zurücksetzen + view_assigned_tasks: zugeordnete Aufgaben anzeigen + action_create: erstellt + was_supposed_to_finish: angenommenes Ende am %{value} + subject_address: address on + msg_cant_delete_tag: ! 'Konnte ''%{value}'' nicht löschen, weil es mit Gruppen assoziiert + ist. ' + no_start_date: kein Startdatum angegeben + delete: Löschen + website: Website + create_tag: Tag erstellen + save_contact: Kontakt sichern + word_of_mouth: Mundpropaganda + intro: Sie können die Informationen für %{value} später ändern. + at: bei + option_ends_on: Enddatum + recent_activity_options: Letzte Aktivitäten Einstellungen + trip: Trip + user_is_admin: Der Benutzer ist Administrator + days_left: Tage verfügbar + option_name: Name + no_tasks_completed: vollständig + other: Andere + advanced_search_group_rest: ! '...and where %{combinator} of the following match' + department: Abteilung field_types: string: - title: "Kurze Antwort" + title: Kurze Antwort text: - title: "Lange Antwort" + title: Lange Antwort select: - title: "Auswahlliste" + title: Auswahlliste multiselect: - title: "Mehrfachauswahlliste" + title: Mehrfachauswahlliste radio: - title: "Radio Buttons" + title: Radio Buttons boolean: - title: "Checkbox" + title: Checkbox check_boxes: - title: "Checkbox Liste" + title: Checkbox Liste date: - title: "Datum" + title: Datum date_pair: - title: "Datum Paar" + title: Datum Paar datetime: - title: "Datum & Zeit" + title: Datum & Zeit datetime_pair: - title: "Datum & Zeit Paar" + title: Datum & Zeit Paar email: - title: "Email Adresse" + title: Email Adresse url: - title: "URL" + title: URL tel: - title: "Telefonnummer" + title: Telefonnummer decimal: - title: "Nummer (Dezimal)" + title: Nummer (Dezimal) integer: - title: "Nummer (Ganzzahl)" + title: Nummer (Ganzzahl) float: - title: "Nummer (Gleitzahl)" - + title: Nummer (Gleitzahl) + save_field_group: Gruppe speichern + subject_account: account + create_a_new: neu erstellen + dropbox_notification_subject: dropbox - Email hinzugefügt - %{subject} + quick_find: Suche + users: Benutzer + task_pending: Aufgabe wurde in die Warteschlange bewegt + welcome: Willkommen + update: Ändern + will_paginate: + page_gap: ! '…' + page_entries_info: + single_page: + zero: Keine %{plural} gefunden + other: Zeigt alle %{count} %{plural} + one: Zeigt 1 %{name} an + multi_page: Es werden %{from} - %{to} %{plural} von insgesamt %{total} angezeigt + next_label: Weiter → + previous_label: ! '← Zurück' + added_ago: hinzugefügt vor %{value} + create_campaign: Erstelle Kampagne + field_group_empty: Es gibt keine Felder in dieser Gruppe. + msg_cant_delete_user: ^Kann den Benutzer nicht löschen, da %{value} noch aktive + Anlagen hat. + edit_note: Notiz bearbeiten + web_presence: Web-Präsenz + lead_small: Anfragen + time: + formats: + mmddhhss: ! '%e %b %l:%M%p' + mmddyyyy_hhmm: ! '%d %B %Y %H:%M' + starts_in: beginnt in %{value} + subject_contact: Kontakt + overdue: Verspätet, war fällig am + access: Zugang + born_on: Geboren am + reports_to: Berichtet an + my_tasks: Meine Aufgaben + my_opportunities: Meine Chancen + my_accounts: Meine Firmen + no_task_records: Sie haben keine Aufgaben + no_opportunity_records: Sie haben keine Chancen + no_account_records: Sie haben keine Firmen + target_revenue: Target revenue + target_conversion: Ziel Konversion + account_with_title_department: ! '%{title}, %{department} bei %{account}' + account_with_title: ! '%{title} bei %{account}' + lead_statuses: Anfragen Status + account_categories: Firmen Kategorien + opportunity_stages: Chancen Abschnitte + search_results_count: + one: Suche ergab %{count} Treffer. + other: Suche ergab %{count} Treffer. + entities_per_page: ! '%{entity} pro Seite:' + tab_team: Team + admin_tab_groups: Gruppen + contacts_index_long: Langes Format + contacts_index_brief: Kurzes Format + contacts_index_full: Ganzes Format + opportunities_index_normal: Normales Format + accounts_index_normal: Normales Format + leads_index_normal: Normales Format + campaigns_index_normal: Normales Format + account_id: Firma + campaign_statuses: Kampagne Status + unassigned: Nicht zugeordnet + general_info: Allgemeine Informationen + show_general_info_small: Zeige allgemeine Informationen zu diesem Kontakt + show_extra_info_small: Zeige zusätzliche Informationen zu diesem Kontakt + tag_details: ! '%{tag} Einzelheiten' + show_tag_info_small: Zeige %{tag} Informationen zu diesem Kontakt. + shared_with_everyone: Mit jedem teilen + title: Titel + subscriptions: Beitreten + show_status_info_small: Zeige Status Informationen zu dieser Anfrage. + show_contact_info_small: Zeige Kontakt Informationen zu dieser Anfrage. + closes_on: Geschlossen am + unassigned_opportunities: Nicht zugeteilte Chancen + no_opportunities_found: Es gibt derzeit keine abgelaufenen Chancen + tag_list: Tags + action_create_comment: ! '- "%{comment}"' + not_showing_hidden_entities: ! '%{count} versteckte %{entity} werden nicht angezeigt.' + comment_intro: Sie können Kommentare später hinzufügen. + create_group: Erstelle Gruppe + save_group: Speichere Gruppe + group_members: Teilnehmer + groups: Gruppen + groups_small: Gruppen + group_small: Gruppe + confirm_group_delete: Wollen Sie wirklich diese Gruppe löschen? Sie wird noch von + %{count} Einheiten referenziert. + group_memberships: Gruppen Zugehörigkeit + account_contact_id: Firmen id + account_contact_name: Firmen Name + user_id: Benutzer id + created_at: Erstellt am + updated_at: Geändert am + to_perm: Link + admin_fields_info2: Es wird empfohlen den Server neu zu starten, nachdem kundenspezifische + Felder hinzugefügt oder entfernt wurden. pair: - start: "Start" - end: "Ende" - from_to: "Von %{from} bis %{to}" - from_only: "Von %{from}" - to_only: "Bis %{to}" - - contact_summary: "Kontakt-Zusammenfassung" + start: Start + end: Ende + from_to: Von %{from} bis %{to} + from_only: Von %{from} + to_only: Bis %{to} + contact_summary: Kontakt-Zusammenfassung diff --git a/config/locales/de_ransack.yml b/config/locales/de_ransack.yml index 71e2c10de1..1a852a3098 100644 --- a/config/locales/de_ransack.yml +++ b/config/locales/de_ransack.yml @@ -1,92 +1,91 @@ +--- de: ransack: - search: "suche" - predicate: "aussage" - and: "und" - or: "oder" - any: "mindestens eins" - all: "alle" - combinator: "kombinator" - attribute: "attribut" - value: "wert" - condition: "bedingung" - sort: "sortieren" - asc: "aufsteigend" - desc: "absteigend" - + search: suche + predicate: aussage + and: und + or: oder + any: mindestens eins + all: alle + combinator: kombinator + attribute: attribut + value: wert + condition: bedingung + sort: sortieren + asc: aufsteigend + desc: absteigend submit: Suche add_group: Füge eine Gruppe von Filtern hinzu group_first: Zeige Ergebnisse von %{combinator} für die folgenden Treffer - group_rest: ...und %{combinator} für die folgenden Treffer + group_rest: ! '...und %{combinator} für die folgenden Treffer' add_condition: Füge einen Filter hinzu remove_condition: Entferne einen Filter - predicates: - eq: "entspricht" - eq_any: "entspricht einem" - eq_all: "entspricht allen" - not_eq: "entspricht nicht" - not_eq_any: "entspricht mindestens einem nicht" - not_eq_all: "entspricht allen nicht" - matches: "trifft zu" - matches_any: "trifft bei mindestens einem zu" - matches_all: "trifft bei allen zu" - does_not_match: "trifft nicht zu" - does_not_match_any: "trifft bei mindestens einem nicht zu" - does_not_match_all: "trifft bei keinem zu" - lt: "weniger als" - lt_any: "mindestens eins kleiner" - lt_all: "alle kleiner" - lteq: "kleiner oder gleich" - lteq_any: "mindestens eines kleiner oder gleich" - lteq_all: "alle kleiner oder gleich" - gt: "größer als" - gt_any: "mindestens eines größer" - gt_all: "alle größer" - gteq: "größer oder gleich" - gteq_any: "mindestens eines größer oder gleich" - gteq_all: "alle größer oder gleich" - in: "ist innerhalb" - in_any: "ist innerhalb von einem" - in_all: "ist innerhalb von allen" - not_in: "ist nicht enthalten" - not_in_any: "ist in einem nicht enthalten" - not_in_all: "ist in allen nicht enthalten" - cont: "enthält" - cont_any: "enthält einen" - cont_all: "enthält alle" - not_cont: "beinhaltet nicht" - not_cont_any: "beinhaltet mindestens eine nicht" - not_cont_all: "beinhaltet alle nicht" - start: "beginnt mit" - start_any: "mindestens eines beginnt mit" - start_all: "alle beginnen mit" - not_start: "beginnt nicht mit" - not_start_any: "mindestens eines beginnt nicht mit" - not_start_all: "alle beginnen nicht mit" - end: "endet mit" - end_any: "mindestens eines endet mit" - end_all: "alle enden mit" - not_end: "endet nicht mit" - not_end_any: "mindestens eines endet nicht mit" - not_end_all: "alle enden nicht mit" - 'true': "ist wahr" - 'false': "ist falsch" - present: "existiert" - blank: "ist leer" - 'null': "ist null" - not_null: "ist nicht null" + eq: entspricht + eq_any: entspricht einem + eq_all: entspricht allen + not_eq: entspricht nicht + not_eq_any: entspricht mindestens einem nicht + not_eq_all: entspricht allen nicht + matches: trifft zu + matches_any: trifft bei mindestens einem zu + matches_all: trifft bei allen zu + does_not_match: trifft nicht zu + does_not_match_any: trifft bei mindestens einem nicht zu + does_not_match_all: trifft bei keinem zu + lt: weniger als + lt_any: mindestens eins kleiner + lt_all: alle kleiner + lteq: kleiner oder gleich + lteq_any: mindestens eines kleiner oder gleich + lteq_all: alle kleiner oder gleich + gt: größer als + gt_any: mindestens eines größer + gt_all: alle größer + gteq: größer oder gleich + gteq_any: mindestens eines größer oder gleich + gteq_all: alle größer oder gleich + in: ist innerhalb + in_any: ist innerhalb von einem + in_all: ist innerhalb von allen + not_in: ist nicht enthalten + not_in_any: ist in einem nicht enthalten + not_in_all: ist in allen nicht enthalten + cont: enthält + cont_any: enthält einen + cont_all: enthält alle + not_cont: beinhaltet nicht + not_cont_any: beinhaltet mindestens eine nicht + not_cont_all: beinhaltet alle nicht + start: beginnt mit + start_any: mindestens eines beginnt mit + start_all: alle beginnen mit + not_start: beginnt nicht mit + not_start_any: mindestens eines beginnt nicht mit + not_start_all: alle beginnen nicht mit + end: endet mit + end_any: mindestens eines endet mit + end_all: alle enden mit + not_end: endet nicht mit + not_end_any: mindestens eines endet nicht mit + not_end_all: alle enden nicht mit + 'true': ist wahr + 'false': ist falsch + present: existiert + blank: ist leer + 'null': ist null + not_null: ist nicht null alt: date: - lt: "ist bevor" - lt_any: "mindestens eines ist bevor" - lt_all: "alle sind bevor" - lteq: "ist bevor oder am" - lteq_any: "mindestens eines ist bevor oder am" - lteq_all: "alle sind bevor oder am" - gt: "ist nach" - gt_any: "mindestens eines ist nach" - gt_all: "alle sind nach" - gteq: "ist danach oder am" - gteq_any: "mindestens eines ist danach oder am" - gteq_all: "alle sind danach oder am" + lt: ist bevor + lt_any: mindestens eines ist bevor + lt_all: alle sind bevor + lteq: ist bevor oder am + lteq_any: mindestens eines ist bevor oder am + lteq_all: alle sind bevor oder am + gt: ist nach + gt_any: mindestens eines ist nach + gt_all: alle sind nach + gteq: ist danach oder am + gteq_any: mindestens eines ist danach oder am + gteq_all: alle sind danach oder am diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index 5bf1212c93..a44d80ec62 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -1,180 +1,219 @@ -# GB English translations for Ruby on Rails - -"en-GB": +--- +en-GB: date: formats: - default: "%d-%m-%Y" - short: "%d %b" - long: "%d %B, %Y" - - day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday] - abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat] - - month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December] - abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec] + default: ! '%d-%m-%Y' + short: ! '%d %b' + long: ! '%d %B, %Y' + day_names: + - Sunday + - Monday + - Tuesday + - Wednesday + - Thursday + - Friday + - Saturday + abbr_day_names: + - Sun + - Mon + - Tue + - Wed + - Thu + - Fri + - Sat + month_names: + - + - January + - February + - March + - April + - May + - June + - July + - August + - September + - October + - November + - December + abbr_month_names: + - + - Jan + - Feb + - Mar + - Apr + - May + - Jun + - Jul + - Aug + - Sep + - Oct + - Nov + - Dec order: - - :day - - :month - - :year - + - :day + - :month + - :year time: formats: - default: "%a, %d %b %Y %H:%M:%S %z" - short: "%d %b %H:%M" - long: "%d %B, %Y %H:%M" - am: "am" - pm: "pm" - + default: ! '%a, %d %b %Y %H:%M:%S %z' + short: ! '%d %b %H:%M' + long: ! '%d %B, %Y %H:%M' + am: am + pm: pm support: array: - words_connector: ", " - two_words_connector: " and " - last_word_connector: ", and " - + words_connector: ! ', ' + two_words_connector: ! ' and ' + last_word_connector: ! ', and ' select: - prompt: "Please select" - + prompt: Please select number: format: - separator: "." - delimiter: "," + separator: . + delimiter: ! ',' precision: 3 significant: false strip_insignificant_zeros: false - currency: format: - format: "%u%n" - unit: "£" - separator: "." - delimiter: "," + format: ! '%u%n' + unit: £ + separator: . + delimiter: ! ',' precision: 2 significant: false strip_insignificant_zeros: false - percentage: format: - delimiter: "" - + delimiter: '' precision: format: - delimiter: "" - + delimiter: '' human: format: - delimiter: "" + delimiter: '' precision: 3 significant: true strip_insignificant_zeros: true storage_units: - format: "%n %u" + format: ! '%n %u' units: byte: - one: "Byte" - other: "Bytes" - kb: "KB" - mb: "MB" - gb: "GB" - tb: "TB" + one: Byte + other: Bytes + kb: KB + mb: MB + gb: GB + tb: TB decimal_units: - format: "%n %u" + format: ! '%n %u' units: - unit: "" + unit: '' thousand: Thousand million: Million billion: Billion trillion: Trillion quadrillion: Quadrillion - datetime: distance_in_words: - half_a_minute: "half a minute" + half_a_minute: half a minute less_than_x_seconds: - one: "less than 1 second" - other: "less than %{count} seconds" + one: less than 1 second + other: less than %{count} seconds x_seconds: - one: "1 second" - other: "%{count} seconds" + one: 1 second + other: ! '%{count} seconds' less_than_x_minutes: - one: "less than a minute" - other: "less than %{count} minutes" + one: less than a minute + other: less than %{count} minutes x_minutes: - one: "1 minute" - other: "%{count} minutes" + one: 1 minute + other: ! '%{count} minutes' about_x_hours: - one: "about 1 hour" - other: "about %{count} hours" + one: about 1 hour + other: about %{count} hours x_days: - one: "1 day" - other: "%{count} days" + one: 1 day + other: ! '%{count} days' about_x_months: - one: "about 1 month" - other: "about %{count} months" + one: about 1 month + other: about %{count} months x_months: - one: "1 month" - other: "%{count} months" + one: 1 month + other: ! '%{count} months' about_x_years: - one: "about 1 year" - other: "about %{count} years" + one: about 1 year + other: about %{count} years over_x_years: - one: "over 1 year" - other: "over %{count} years" + one: over 1 year + other: over %{count} years almost_x_years: - one: "almost 1 year" - other: "almost %{count} years" + one: almost 1 year + other: almost %{count} years prompts: - year: "Year" - month: "Month" - day: "Day" - hour: "Hour" - minute: "Minute" - second: "Seconds" - + year: Year + month: Month + day: Day + hour: Hour + minute: Minute + second: Seconds helpers: select: - prompt: "Please select" - + prompt: Please select submit: - create: 'Create %{model}' - update: 'Update %{model}' - submit: 'Save %{model}' - + create: Create %{model} + update: Update %{model} + submit: Save %{model} errors: - format: "%{attribute} %{message}" - - messages: &errors_messages - inclusion: "is not included in the list" - exclusion: "is reserved" - invalid: "is invalid" - confirmation: "doesn't match confirmation" - accepted: "must be accepted" - empty: "can't be empty" - blank: "can't be blank" - too_long: "is too long (maximum is %{count} characters)" - too_short: "is too short (minimum is %{count} characters)" - wrong_length: "is the wrong length (should be %{count} characters)" - not_a_number: "is not a number" - not_an_integer: "must be an integer" - greater_than: "must be greater than %{count}" - greater_than_or_equal_to: "must be greater than or equal to %{count}" - equal_to: "must be equal to %{count}" - less_than: "must be less than %{count}" - less_than_or_equal_to: "must be less than or equal to %{count}" - odd: "must be odd" - even: "must be even" - + format: ! '%{attribute} %{message}' + messages: + inclusion: is not included in the list + exclusion: is reserved + invalid: is invalid + confirmation: doesn't match confirmation + accepted: must be accepted + empty: can't be empty + blank: can't be blank + too_long: is too long (maximum is %{count} characters) + too_short: is too short (minimum is %{count} characters) + wrong_length: is the wrong length (should be %{count} characters) + not_a_number: is not a number + not_an_integer: must be an integer + greater_than: must be greater than %{count} + greater_than_or_equal_to: must be greater than or equal to %{count} + equal_to: must be equal to %{count} + less_than: must be less than %{count} + less_than_or_equal_to: must be less than or equal to %{count} + odd: must be odd + even: must be even activerecord: errors: template: header: - one: "1 error prohibited this %{model} from being saved" - other: "%{count} errors prohibited this %{model} from being saved" - body: "There were problems with the following fields:" - + one: 1 error prohibited this %{model} from being saved + other: ! '%{count} errors prohibited this %{model} from being saved' + body: ! 'There were problems with the following fields:' messages: - taken: "has already been taken" - record_invalid: "Validation failed: %{errors}" - <<: *errors_messages - + inclusion: is not included in the list + exclusion: is reserved + invalid: is invalid + confirmation: doesn't match confirmation + accepted: must be accepted + empty: can't be empty + blank: can't be blank + too_long: is too long (maximum is %{count} characters) + too_short: is too short (minimum is %{count} characters) + wrong_length: is the wrong length (should be %{count} characters) + not_a_number: is not a number + not_an_integer: must be an integer + greater_than: must be greater than %{count} + greater_than_or_equal_to: must be greater than or equal to %{count} + equal_to: must be equal to %{count} + less_than: must be less than %{count} + less_than_or_equal_to: must be less than or equal to %{count} + odd: must be odd + even: must be even + taken: has already been taken + record_invalid: ! 'Validation failed: %{errors}' full_messages: - format: "%{attribute} %{message}" + format: ! '%{attribute} %{message}' diff --git a/config/locales/en-GB_fat_free_crm.yml b/config/locales/en-GB_fat_free_crm.yml index 8fc71e8479..62ab546ec2 100644 --- a/config/locales/en-GB_fat_free_crm.yml +++ b/config/locales/en-GB_fat_free_crm.yml @@ -1,20 +1,15 @@ +--- en-GB: language: English (UK) - - # Generic terms. - #---------------------------------------------------------------------------- all: All at: at here: here no_button: 'No' not_implemented: Not implemented yet. or: or - select_none: '-- None --' - select_blank: '-- Select --' + select_none: -- None -- + select_blank: -- Select -- yes_button: 'Yes' - - # Settings. - #---------------------------------------------------------------------------- tab_dashboard: Dashboard tab_tasks: Tasks tab_campaigns: Campaigns @@ -23,32 +18,27 @@ en-GB: tab_contacts: Contacts tab_opportunities: Opportunities tab_team: Team - admin_tab_groups: Groups admin_tab_users: Users admin_tab_fields: Custom Fields admin_tab_tags: Tags admin_tab_settings: Settings admin_tab_plugins: Plugins - affiliate: Affiliate competitor: Competitor customer: Customer partner: Partner reseller: Reseller vendor: Vendor - planned: Planned started: Started on_hold: On Hold completed: Completed called_off: Called Off - new: New contacted: Contacted converted: Converted rejected: Rejected - cold_call: Cold Call conference: Conference online: Online Marketing @@ -57,7 +47,6 @@ en-GB: web: Website word_of_mouth: Word of Mouth other: Other - prospecting: Prospecting analysis: Analysis presentation: Presentation @@ -66,16 +55,13 @@ en-GB: final_review: Final Review won: Closed/Won lost: Closed/Lost - call: Call email: Email follow_up: Follow-up lunch: Lunch meeting: Meeting money: Money - presentation: Presentation trip: Trip - overdue: Overdue due_asap: As Soon As Possible due_today: Today @@ -84,24 +70,17 @@ en-GB: due_next_week: Next Week due_later: Sometime Later due_specific_date: On Specific Date... - completed_today: Today completed_yesterday: Yesterday completed_last_week: Last week completed_this_month: This month completed_last_month: Last month - - # Models/Activity. - #---------------------------------------------------------------------------- one_hour: One Hour one_day: One Day two_days: Two Days one_week: One Week two_weeks: Two Weeks one_month: One Month - - # Model Validations. - #---------------------------------------------------------------------------- activerecord: errors: models: @@ -114,74 +93,74 @@ en-GB: account: attributes: name: - missing_account_name: "^Please specify account name." + missing_account_name: ^Please specify account name. access: - share_account: "^Please specify users to share the account with." + share_account: ^Please specify users to share the account with. campaign: attributes: name: - missing_campaign_name: "^Please specify campaign name." + missing_campaign_name: ^Please specify campaign name. ends_on: - dates_not_in_sequence: "^Please make sure the campaign end date is after the start date." + dates_not_in_sequence: ^Please make sure the campaign end date is after + the start date. access: - share_campaign: "^Please specify users to share the campaign with." + share_campaign: ^Please specify users to share the campaign with. contact: attributes: first_name: - missing_first_name: "^Please specify first name." + missing_first_name: ^Please specify first name. last_name: - missing_last_name: "^Please specify last name." + missing_last_name: ^Please specify last name. access: - share_contact: "^Please specify users to share the contact with." + share_contact: ^Please specify users to share the contact with. lead: attributes: first_name: - missing_first_name: "^Please specify first name." + missing_first_name: ^Please specify first name. last_name: - missing_last_name: "^Please specify last name." + missing_last_name: ^Please specify last name. access: - share_lead: "^Please specify users to share the lead with." + share_lead: ^Please specify users to share the lead with. opportunity: attributes: name: - missing_opportunity_name: "^Please specify opportunity name." + missing_opportunity_name: ^Please specify opportunity name. access: - share_opportunity: "^Please specify users to share the opportunity with." + share_opportunity: ^Please specify users to share the opportunity with. task: attributes: name: - missing_task_name: "^Please specify task name." + missing_task_name: ^Please specify task name. calendar: - invalid_date: "^Please specify valid date." + invalid_date: ^Please specify valid date. user: attributes: username: - missing_username: "^Please specify username." - username_taken: "^This username is already taken." + missing_username: ^Please specify username. + username_taken: ^This username is already taken. email: - missing_email: "^Please specify email address." - email_in_use: "^There is another user with the same email." - + missing_email: ^Please specify email address. + email_in_use: ^There is another user with the same email. msg_account_suspended: User account has been suspended. password_reset_instruction: password reset instructions - - # Controllers. - #---------------------------------------------------------------------------- - msg_account_created: Your account has been created and is awaiting approval by the system administrator. + msg_account_created: Your account has been created and is awaiting approval by the + system administrator. msg_account_not_approved: Your account has not been approved yet. - msg_asset_deleted: "%{value} has been deleted." + msg_asset_deleted: ! '%{value} has been deleted.' msg_asset_not_available: This %{value} is no longer available. msg_asset_not_authorized: You are not authorized to view this %{value}. msg_assets_not_available: The %{value} are not available. - msg_asset_rejected: "%{value} has been rejected." - msg_bad_image_file: "^Could't upload or resize the image file you specified." - msg_cant_create_related: "Can't create the %{asset} since the %{related} is no longer available." - msg_cant_delete_user: "^Couldn't delete the user since %{value} has related assets present." - msg_cant_do: "Can't %{action} the %{asset} since it's no longer available." + msg_asset_rejected: ! '%{value} has been rejected.' + msg_bad_image_file: ^Could't upload or resize the image file you specified. + msg_cant_create_related: Can't create the %{asset} since the %{related} is no longer + available. + msg_cant_delete_user: ^Couldn't delete the user since %{value} has related assets + present. + msg_cant_do: Can't %{action} the %{asset} since it's no longer available. msg_email_not_found: No user was found with that email address. msg_enter_new_password: Please enter your new password. msg_goodbye: You have been logged out. Thank you for using Fat Free CRM! - msg_invalid_password: "^Please specify valid current password" + msg_invalid_password: ^Please specify valid current password msg_invalig_login: Invalid username or password. msg_last_login: Your last login was on %{value}. msg_login_needed: You must be logged in to access this page. @@ -189,15 +168,14 @@ en-GB: msg_password_changed: Your password has been changed. msg_password_not_changed: Your password has not been changed. msg_password_updated: Password was successfully updated. - msg_pwd_instructions_sent: Instructions to reset your password have been sent to you. Please check your email. + msg_pwd_instructions_sent: Instructions to reset your password have been sent to + you. Please check your email. msg_require_admin: You must be Administrator to access this page. msg_successful_signup: Successful signup, welcome to Fat Free CRM! msg_welcome: Welcome to Fat Free CRM! - - # Options. - #---------------------------------------------------------------------------- - "option_amount*probability": weighted amount - activity_options: Show %{models} %{action_type} performed by %{user} in the past %{period}. + option_amount*probability: weighted amount + activity_options: Show %{models} %{action_type} performed by %{user} in the past + %{period}. all_users: all users option_after: after option_all: all @@ -223,10 +201,8 @@ en-GB: option_updated_at: date updated show_per_page: Show %{number} %{models} per page using %{fmt} format. sort_by: Sort %{models} by %{field}. - sort_by_displaying: Sort %{models} by %{field} displaying first name %{position} last name. - - # Views -> Profile. - #---------------------------------------------------------------------------- + sort_by_displaying: Sort %{models} by %{field} displaying first name %{position} + last name. aim: AOL IM already_signed_up: Already signed up? alt_email: Alternative email @@ -236,12 +212,12 @@ en-GB: contact_info: Contact Information current_password: Current password edit_profile: Edit Profile - # email: Email # <-- Already defined as the task type if Settings. first_name: First name google: Google IM gravatar_help: Not familiar with Gravatars? Learn about Gravatars image_file: Image file - image_help: The image file you upload will be automatically resized to 75 x 75 pixels. Supported formats are GIF, JPG, and PNG. + image_help: The image file you upload will be automatically resized to 75 x 75 pixels. + Supported formats are GIF, JPG, and PNG. job_title: Title last_name: Last name login_now_link: Login Now! @@ -266,17 +242,11 @@ en-GB: reports_to: Reports to access: Access contacts_account: Contact's account - - # Views -> Authenticate. - #---------------------------------------------------------------------------- forgot_password: Forgot Password login: Login no_account: Do not have an account? remember_me: Remember Me sign_up_now: Sign Up Now! - - # Views -> Accounts. - #---------------------------------------------------------------------------- account: Account select_an_account: Select an Account account_small: account @@ -305,9 +275,6 @@ en-GB: shipping_address: Shipping address total_accounts: Total Accounts website: Website - - # Views -> Campaigns. - #---------------------------------------------------------------------------- actual: Actual actual_performance: Actual Performance budget: Budget @@ -322,7 +289,7 @@ en-GB: campaigns_small: campaigns conversion: Conversion conversion_label: Conversion (%) - conversion_number: "%{value} conversion" + conversion_number: ! '%{value} conversion' create_campaign: Create Campaign end_date: End date finished_on: completed on %{value} @@ -330,11 +297,13 @@ en-GB: no_start_date: no start date specified number_of_leads: Number of leads objectives: Objectives - objectives_help: Please specify target number of leads, expected leads-to-opportunities conversion ratio, target revenue, and campaign budget. These numbers will let you track actual campaign performance. + objectives_help: Please specify target number of leads, expected leads-to-opportunities + conversion ratio, target revenue, and campaign budget. These numbers will let + you track actual campaign performance. objectives_small: campaign objectives revenue: Revenue revenue_label: Revenue (£) - revenue_number: "%{value} in revenue" + revenue_number: ! '%{value} in revenue' save_campaign: Save Campaign start_date: Start date started_ago: started %{value} ago @@ -345,9 +314,6 @@ en-GB: was_supposed_to_finish: was supposed to finish on %{value} was_supposed_to_start: was supposed to start %{time_ago} ago on %{start_date} was_supposed_to_start_in: was supposed to start in %{starts_in} on %{start_date} - - # Views -> Contacts. - #---------------------------------------------------------------------------- alt_email_small: Other blog: Website/Blog contact: Contact @@ -357,16 +323,19 @@ en-GB: contacts_small: contacts create_contact: Create Contact department: Department - department_small: '%{value} department' + department_small: ! '%{value} department' do_not_call: Do not call extra_info: Extra Information extra_info_small: extra contact facebook: Facebook linked_in: LinkedIn myself: Myself - permissions_intro_private: By default only you will have access to the %{value}. You can change permissions later. - permissions_intro_public: By default all users will have access to the %{value}. You can change permissions later. - permissions_intro_shared: By default only the selected users will have access to the %{value}. You can change permissions later. + permissions_intro_private: By default only you will have access to the %{value}. + You can change permissions later. + permissions_intro_public: By default all users will have access to the %{value}. + You can change permissions later. + permissions_intro_shared: By default only the selected users will have access to + the %{value}. You can change permissions later. referred_by: Referred by referred_by_small: referred by save_contact: Save Contact @@ -374,21 +343,26 @@ en-GB: unassigned: Unassigned web_presence: Web Presence web_presence_small: web presence - works_at: "%{job_title} at %{company}" - - # Views -> Leads. - #---------------------------------------------------------------------------- + works_at: ! '%{job_title} at %{company}' convert: Convert convert_lead: Convert Lead - convert_lead_permissions_intro: Contact permissions will be copied from the lead being converted. You can change contact permissions later. - convert_lead_text: By converting the lead %{value} will become a contact associated with the existing or newly created account. Lead status will be automatically set to converted. + convert_lead_permissions_intro: Contact permissions will be copied from the lead + being converted. You can change contact permissions later. + convert_lead_text: By converting the lead %{value} will become a contact associated + with the existing or newly created account. Lead status will be automatically + set to converted. create_lead: Create Lead - create_opp_for_contact: You can optionally create an opportunity for the %{value} contact by specifying the name, current stage, estimated closing date, sale probability, amount of the deal, and the discount offered. + create_opp_for_contact: You can optionally create an opportunity for the %{value} + contact by specifying the name, current stage, estimated closing date, sale probability, + amount of the deal, and the discount offered. lead: Lead lead_info_small: lead contact - lead_permissions_intro_private: By default permissions will be copied from the campaign or set to private. You can change lead permissions later. - lead_permissions_intro_public: By default permissions will be copied from the campaign or set to public. You can change lead permissions later. - lead_permissions_intro_shared: By default permissions will be copied from the campaign or shared with the specified users. You can change lead permissions later. + lead_permissions_intro_private: By default permissions will be copied from the campaign + or set to private. You can change lead permissions later. + lead_permissions_intro_public: By default permissions will be copied from the campaign + or set to public. You can change lead permissions later. + lead_permissions_intro_shared: By default permissions will be copied from the campaign + or shared with the specified users. You can change lead permissions later. lead_small: lead lead_status_small: lead status lead_summary: Lead Summary @@ -403,9 +377,6 @@ en-GB: source: Source status: Status total_leads: Total Leads - - # Views -> Opportunities. - #---------------------------------------------------------------------------- amount: Amount close_date: Close date closed_ago_on: closed %{time_ago} ago on %{date} @@ -427,7 +398,8 @@ en-GB: opportunity: Opportunity opportunity_small: opportunity opportunity_summary: Opportunity At a Glance - opportunity_summary_text: "%{amount} with %{discount} discount and %{probability} probability" + opportunity_summary_text: ! '%{amount} with %{discount} discount and %{probability} + probability' past_due: past due, was expected to close %{value} ago probability: Probability probability_number: and %{value} probability @@ -435,9 +407,6 @@ en-GB: stage: Stage total_opportunities: Total Opportunities weighted_amount: Weighted amount - - # Views -> Tasks. - #---------------------------------------------------------------------------- task: Task task_small: task tasks: Tasks @@ -453,13 +422,13 @@ en-GB: due: Due feel_free: Feel free to move_to: move to - no_tasks: "You don't have any %{value} tasks" + no_tasks: You don't have any %{value} tasks no_tasks_pending: pending no_tasks_assigned: assigned no_tasks_completed: completed pending_tab: Pending pending_tasks: Pending Tasks - related: 're:' + related: ! 're:' save_task: Save Task task_assigned: The task has been assigned to %{value} task_assigned_to: and assigned to %{value} @@ -474,19 +443,11 @@ en-GB: task_from: From %{value} task_overdue: late, was due on task_pending: The task has been moved to pending tasks - task_small: task - tasks: Tasks total_tasks: Total %{value} view_assigned_tasks: view assigned tasks view_pending_tasks: view pending tasks - - # Views -> Team. - #---------------------------------------------------------------------------- unassigned_opportunities: Unassigned Opportunities no_opportunities_found: There are currently no outstanding opportunities. - - # Views -> Home. - #---------------------------------------------------------------------------- action_completed: completed action_create: created action_destroy: deleted @@ -515,7 +476,6 @@ en-GB: update_past_participle: Updates destroy_past_participle: Deletions all_events_past_participle: Activities - my_tasks: My Tasks no_task_records: You have no tasks. my_opportunities: My Opportunities @@ -523,9 +483,6 @@ en-GB: my_accounts: My Accounts no_account_records: You have no accounts not_showing_hidden_entities: Not showing %{count} hidden %{entity}. - - # Views -> Common. - #---------------------------------------------------------------------------- add_note: Add Note save_note: Save Note add_note_help: Add a new note... @@ -538,15 +495,15 @@ en-GB: comment_intro: You can add comments later. confirm_delete: Are you sure you want to delete this %{value}? copy_permissions: Copy %{value} permissions - could_not_find: "Couldn't find any %{value}. Feel free to" - could_not_find_matching: "Couldn't find any %{value} matching" + could_not_find: Couldn't find any %{value}. Feel free to + could_not_find_matching: Couldn't find any %{value} matching create_new: create new create_a_new: create a new select_existing: select existing delete: Delete discard: Discard edit: Edit - items_total: '%{count} total.' + items_total: ! '%{count} total.' less: Less... me: me more: More... @@ -563,11 +520,11 @@ en-GB: select_task: Select Task select_opportunity: Select Opportunity search_assets: Search %{value} - time_ago: "%{value} ago" + time_ago: ! '%{value} ago' background_info: Background address: Address - street1: Street 1 # NEW - street2: Street 2 # NEW + street1: Street 1 + street2: Street 2 city: City zipcode: Post Code state: County @@ -577,9 +534,6 @@ en-GB: collapse_all: Collapse all expanded: Expanded collapsed: Collapsed - - # Views -> Layout. - #---------------------------------------------------------------------------- about: About about_dev_group: Discussion group for developers about_features: Features and bugs @@ -588,24 +542,22 @@ en-GB: about_ffc_version: Fat Free CRM version about_home_page: Home page about_project_page: Project page - about_thank_you: Thank you for using Fat Free CRM! We appreciate your business and hope you enjoy using the software. + about_thank_you: Thank you for using Fat Free CRM! We appreciate your business and + hope you enjoy using the software. about_twitter: Twitter commit updates about_user_group: Discussion group for users admin: Admin logout: Logout quick_find: Quick find welcome: Welcome - - # Views -> Advanced Search. accounts_advanced_search: Accounts Advanced search advanced_search: Advanced search advanced_search_submit: Search advanced_search_add_group: Add a group of filters advanced_search_group_first: Show results where %{combinator} of the following match - advanced_search_group_rest: ...and where %{combinator} of the following match + advanced_search_group_rest: ! '...and where %{combinator} of the following match' advanced_search_add_condition: Add a filter advanced_search_remove_condition: Remove filter - ransack: predicates: eq: is @@ -618,11 +570,8 @@ en-GB: not_cont: doesn't contain blank: is blank present: is present - "null": is null + 'null': is null not_null: is not null - - # Views -> Comments. - #---------------------------------------------------------------------------- comment: Comment edit_comment: Editing comment show: Show @@ -631,35 +580,21 @@ en-GB: notifications_tooltip: Subscribers will receive new comments via email subscribe_via_email: Subscribe via email disable_email_subscriptions: Disable email subscription - - # Views -> Emails. - #---------------------------------------------------------------------------- - email: Email - - # Views -> Passwords. - #---------------------------------------------------------------------------- confirm_password_intro: Please type your new password and then confirm it. - password_intro: Please specify your email address, and the instructions to reset your password will be sent to you. + password_intro: Please specify your email address, and the instructions to reset + your password will be sent to you. reset_password: Reset Password update_password_and_login: Update Password and Login - - # Views -> Admin - #---------------------------------------------------------------------------- back_to_crm: Back to Fat Free CRM crm_admin_page: Fat Free CRM Administration - - # Views -> Admin -> Groups - #---------------------------------------------------------------------------- create_group: Create Group save_group: Save Group group_members: members groups: Groups groups_small: groups group_small: group - confirm_group_delete: Are you sure you wish to delete this group? There are %{count} items that still reference it. - - # Views -> Admin -> Users. - #---------------------------------------------------------------------------- + confirm_group_delete: Are you sure you wish to delete this group? There are %{count} + items that still reference it. approve: Approve create_user: Create User last_seen: last seen %{value} ago @@ -672,7 +607,7 @@ en-GB: user_awaits_approval: awaits your approval user_confirm_delete: A user can only be deleted if no related assets are left behind. user_is_admin: The user is Administrator - user_never_logged_in: "hasn't logged in yet" + user_never_logged_in: hasn't logged in yet user_signed_up: Signed Up user_signed_up_on: signed up on %{value} user_since: user since %{value} @@ -680,100 +615,72 @@ en-GB: user_suspended_on: suspended on %{value} users: Users users_small: users - - # Views -> Versions - #---------------------------------------------------------------------------- versions: History version: - create: %{item} created by %{by} - update: %{item} modified by %{by} - destroy: %{item} destroyed by %{by} - set_html: %{attr} set to %{to} - unset_html: %{attr} unset - change_html: %{attr} changed from %{from} to %{to} + create: ! '%{item} created by %{by}' + update: ! '%{item} modified by %{by}' + destroy: ! '%{item} destroyed by %{by}' + set_html: ! '%{attr} set to %{to}' + unset_html: ! '%{attr} unset' + change_html: ! '%{attr} changed from %{from} to %{to}' anonymous: anonymous - - # Export. - #---------------------------------------------------------------------------- to_xls: Export to Excel to_csv: Export to comma-delimited file format (including deleted records) to_rss: RSS feed to_atom: Atom feed - - # Dropbox. - #---------------------------------------------------------------------------- dropbox_notification_subject: dropbox - Added email - %{subject} dropbox_notification_intro: Succesfully added the email you sent to dropbox dropbox_notification_to: Added to subject: Subject body: Body - - # Comment Inbox - #---------------------------------------------------------------------------- comment_notification: - intro: "%{user_full_name} commented on %{entity_type}: %{entity_name}" - reply_instructions: "Reply to this email directly to add a new comment, or view the %{entity} online" - - # Lists - #---------------------------------------------------------------------------- + intro: ! '%{user_full_name} commented on %{entity_type}: %{entity_name}' + reply_instructions: Reply to this email directly to add a new comment, or view + the %{entity} online lists: Lists list: List no_saved_lists: No saved lists make_current_view_list: Make current view a list - list_name_info: If you use the name of an existing list, you will overwrite that list with your current settings - - # Pluralizations. - #---------------------------------------------------------------------------- + list_name_info: If you use the name of an existing list, you will overwrite that + list with your current settings pluralize: comment: - one: '1 comment' - other: '%{count} comments' + one: 1 comment + other: ! '%{count} comments' contact: - one: '1 contact' - other: '%{count} contacts' + one: 1 contact + other: ! '%{count} contacts' opportunity: - one: '1 opportunity' - other: '%{count} opportunities' + one: 1 opportunity + other: ! '%{count} opportunities' lead: - one: '1 lead' - other: '%{count} leads' + one: 1 lead + other: ! '%{count} leads' day: - one: '1 day' - other: '%{count} days' + one: 1 day + other: ! '%{count} days' login: - one: '1 login' - other: '%{count} logins' - - # Custom date/time formats. - #---------------------------------------------------------------------------- + one: 1 login + other: ! '%{count} logins' date: formats: - mmddyyyy: "%Y-%m-%d" - mmdd: "%e %b" - mmddyy: "%e %b, %Y" - + mmddyyyy: ! '%Y-%m-%d' + mmdd: ! '%e %b' + mmddyy: ! '%e %b, %Y' time: formats: - mmddhhss: "%e %b at %l:%M%p" - mmddyyyy_hhmm: "%e %b %Y at %l:%M%p" - - # will_paginate translations copied from 'en-US' - #---------------------------------------------------------------------------- + mmddhhss: ! '%e %b at %l:%M%p' + mmddyyyy_hhmm: ! '%e %b %Y at %l:%M%p' will_paginate: - previous_label: "← Previous" - next_label: "Next →" - page_gap: "…" + previous_label: ! '← Previous' + next_label: Next → + page_gap: ! '…' page_entries_info: single_page: - zero: "No %{plural} found" - one: "Displaying 1 %{name}" - other: "Displaying all %{count} %{plural}" - - multi_page: "Displaying %{plural} %{from} - %{to} of %{total} in total" - - - # Views -> Admin -> Custom Fields - #---------------------------------------------------------------------------- + zero: No %{plural} found + one: Displaying 1 %{name} + other: Displaying all %{count} %{plural} + multi_page: Displaying %{plural} %{from} - %{to} of %{total} in total label: Label custom_fields: Custom Fields custom_field_options: Custom Field Options @@ -782,105 +689,78 @@ en-GB: create_field_group: Create field group edit_field_group: Edit field group save_field_group: Save field group - field_group_empty: There are no fields in this group. - select_or_create_tags: Select some tags, or create a new tag by pressing 'enter'. - restrict_by_tag: Restrict by Tag restrict_by_tag_info: Only show fields for %{assets} that are tagged with field_group_tag_restriction: This field group applies to %{assets} tagged with "%{tag}" field_group_unrestricted: This field group applies to all %{assets} - field_group_confirm_delete: If a field group is deleted, any fields will be moved to the default field group. + field_group_confirm_delete: If a field group is deleted, any fields will be moved + to the default field group. msg_cant_delete_field_group: Field Group could not be deleted. + admin_fields_info: ! 'Custom fields are displayed in groups. - admin_fields_info: | - Custom fields are displayed in groups. Create a new field group, or add fields to one of the groups below.
- You can drag and drop fields to change their display order or move them between field groups. - # Views -> Admin -> Tags - #---------------------------------------------------------------------------- + You can drag and drop fields to change their display order or move them between + field groups. + +' tags: Tags tag_small: tag tagged: Tagged create_tag: Create Tag save_tag: Save Tag field_group_tags: Field Groups shown for this Tag - tag_with_taggings_confirm_delete: "If this tag is deleted, it will be removed from %{value} records." - msg_cant_delete_tag: "Couldn't delete '%{value}' since it has associated Field Groups." - - - # Views -> Admin -> Plugins - #---------------------------------------------------------------------------- + tag_with_taggings_confirm_delete: If this tag is deleted, it will be removed from + %{value} records. + msg_cant_delete_tag: Couldn't delete '%{value}' since it has associated Field Groups. views: admin: plugins: author: Author version: Version description: Description - - - # Simple Form translations - #---------------------------------------------------------------------------- simple_form: - "yes": 'Yes' - "no": 'No' + 'yes': 'Yes' + 'no': 'No' required: - text: 'required' - mark: '*' - # You can uncomment the line below if you need to overwrite the whole required html. - # When using html, text and mark won't be used. - # html: '*' + text: required + mark: ! '*' error_notification: - default_message: "Some errors were found, please take a look:" - # Labels and hints examples - # labels: - # password: 'Password' - # user: - # new: - # email: 'E-mail para efetuar o sign in.' - # edit: - # email: 'E-mail.' - # hints: - # username: 'User name to sign in.' - # password: 'No special characters, please.' - - - # Form field types - #---------------------------------------------------------------------------- + default_message: ! 'Some errors were found, please take a look:' field_types: string: - title: Short Answer + title: Short Answer text: - title: Long Answer + title: Long Answer select: - title: Select List - multiselect: - title: Multi Select + title: Select List + multiselect: + title: Multi Select radio: - title: Radio Buttons + title: Radio Buttons boolean: - title: Checkbox + title: Checkbox check_boxes: - title: Checkbox List + title: Checkbox List date: - title: Date + title: Date date_pair: - title: Date Pair + title: Date Pair datetime: - title: Date & Time + title: Date & Time datetime_pair: - title: Date & Time Pair + title: Date & Time Pair email: - title: Email Address + title: Email Address url: - title: URL + title: URL tel: - title: Phone Number + title: Phone Number decimal: - title: Number (Decimal) + title: Number (Decimal) integer: - title: Number (Integer) + title: Number (Integer) float: - title: Number (Floating Point) + title: Number (Floating Point) diff --git a/config/locales/en-US.yml b/config/locales/en-US.yml index 645aefdc3b..b22cbad588 100644 --- a/config/locales/en-US.yml +++ b/config/locales/en-US.yml @@ -1,182 +1,219 @@ -# US English translations for Ruby on Rails -# -# Use this as the base for the locale file of your language. - -"en-US": +--- +en-US: date: formats: - default: "%Y-%m-%d" - short: "%b %d" - long: "%B %d, %Y" - - day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday] - abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat] - - month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December] - abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec] + default: ! '%Y-%m-%d' + short: ! '%b %d' + long: ! '%B %d, %Y' + day_names: + - Sunday + - Monday + - Tuesday + - Wednesday + - Thursday + - Friday + - Saturday + abbr_day_names: + - Sun + - Mon + - Tue + - Wed + - Thu + - Fri + - Sat + month_names: + - + - January + - February + - March + - April + - May + - June + - July + - August + - September + - October + - November + - December + abbr_month_names: + - + - Jan + - Feb + - Mar + - Apr + - May + - Jun + - Jul + - Aug + - Sep + - Oct + - Nov + - Dec order: - - :year - - :month - - :day - + - :year + - :month + - :day time: formats: - default: "%a, %d %b %Y %H:%M:%S %z" - short: "%d %b %H:%M" - long: "%B %d, %Y %H:%M" - am: "am" - pm: "pm" - + default: ! '%a, %d %b %Y %H:%M:%S %z' + short: ! '%d %b %H:%M' + long: ! '%B %d, %Y %H:%M' + am: am + pm: pm support: array: - words_connector: ", " - two_words_connector: " and " - last_word_connector: ", and " - + words_connector: ! ', ' + two_words_connector: ! ' and ' + last_word_connector: ! ', and ' select: - prompt: "Please select" - + prompt: Please select number: format: - separator: "." - delimiter: "," + separator: . + delimiter: ! ',' precision: 3 significant: false strip_insignificant_zeros: false - currency: format: - format: "%u%n" - unit: "$" - separator: "." - delimiter: "," + format: ! '%u%n' + unit: $ + separator: . + delimiter: ! ',' precision: 2 significant: false strip_insignificant_zeros: false - percentage: format: - delimiter: "" - + delimiter: '' precision: format: - delimiter: "" - + delimiter: '' human: format: - delimiter: "" + delimiter: '' precision: 3 significant: true strip_insignificant_zeros: true storage_units: - format: "%n %u" + format: ! '%n %u' units: byte: - one: "Byte" - other: "Bytes" - kb: "KB" - mb: "MB" - gb: "GB" - tb: "TB" + one: Byte + other: Bytes + kb: KB + mb: MB + gb: GB + tb: TB decimal_units: - format: "%n %u" + format: ! '%n %u' units: - unit: "" + unit: '' thousand: Thousand million: Million billion: Billion trillion: Trillion quadrillion: Quadrillion - datetime: distance_in_words: - half_a_minute: "half a minute" + half_a_minute: half a minute less_than_x_seconds: - one: "less than 1 second" - other: "less than %{count} seconds" + one: less than 1 second + other: less than %{count} seconds x_seconds: - one: "1 second" - other: "%{count} seconds" + one: 1 second + other: ! '%{count} seconds' less_than_x_minutes: - one: "less than a minute" - other: "less than %{count} minutes" + one: less than a minute + other: less than %{count} minutes x_minutes: - one: "1 minute" - other: "%{count} minutes" + one: 1 minute + other: ! '%{count} minutes' about_x_hours: - one: "about 1 hour" - other: "about %{count} hours" + one: about 1 hour + other: about %{count} hours x_days: - one: "1 day" - other: "%{count} days" + one: 1 day + other: ! '%{count} days' about_x_months: - one: "about 1 month" - other: "about %{count} months" + one: about 1 month + other: about %{count} months x_months: - one: "1 month" - other: "%{count} months" + one: 1 month + other: ! '%{count} months' about_x_years: - one: "about 1 year" - other: "about %{count} years" + one: about 1 year + other: about %{count} years over_x_years: - one: "over 1 year" - other: "over %{count} years" + one: over 1 year + other: over %{count} years almost_x_years: - one: "almost 1 year" - other: "almost %{count} years" + one: almost 1 year + other: almost %{count} years prompts: - year: "Year" - month: "Month" - day: "Day" - hour: "Hour" - minute: "Minute" - second: "Seconds" - + year: Year + month: Month + day: Day + hour: Hour + minute: Minute + second: Seconds helpers: select: - prompt: "Please select" - + prompt: Please select submit: - create: 'Create %{model}' - update: 'Update %{model}' - submit: 'Save %{model}' - + create: Create %{model} + update: Update %{model} + submit: Save %{model} errors: - format: "%{attribute} %{message}" - - messages: &errors_messages - inclusion: "is not included in the list" - exclusion: "is reserved" - invalid: "is invalid" - confirmation: "doesn't match confirmation" - accepted: "must be accepted" - empty: "can't be empty" - blank: "can't be blank" - too_long: "is too long (maximum is %{count} characters)" - too_short: "is too short (minimum is %{count} characters)" - wrong_length: "is the wrong length (should be %{count} characters)" - not_a_number: "is not a number" - not_an_integer: "must be an integer" - greater_than: "must be greater than %{count}" - greater_than_or_equal_to: "must be greater than or equal to %{count}" - equal_to: "must be equal to %{count}" - less_than: "must be less than %{count}" - less_than_or_equal_to: "must be less than or equal to %{count}" - odd: "must be odd" - even: "must be even" - + format: ! '%{attribute} %{message}' + messages: + inclusion: is not included in the list + exclusion: is reserved + invalid: is invalid + confirmation: doesn't match confirmation + accepted: must be accepted + empty: can't be empty + blank: can't be blank + too_long: is too long (maximum is %{count} characters) + too_short: is too short (minimum is %{count} characters) + wrong_length: is the wrong length (should be %{count} characters) + not_a_number: is not a number + not_an_integer: must be an integer + greater_than: must be greater than %{count} + greater_than_or_equal_to: must be greater than or equal to %{count} + equal_to: must be equal to %{count} + less_than: must be less than %{count} + less_than_or_equal_to: must be less than or equal to %{count} + odd: must be odd + even: must be even activerecord: errors: template: header: - one: "1 error prohibited this %{model} from being saved" - other: "%{count} errors prohibited this %{model} from being saved" - body: "There were problems with the following fields:" - + one: 1 error prohibited this %{model} from being saved + other: ! '%{count} errors prohibited this %{model} from being saved' + body: ! 'There were problems with the following fields:' messages: - taken: "has already been taken" - record_invalid: "Validation failed: %{errors}" - <<: *errors_messages - + inclusion: is not included in the list + exclusion: is reserved + invalid: is invalid + confirmation: doesn't match confirmation + accepted: must be accepted + empty: can't be empty + blank: can't be blank + too_long: is too long (maximum is %{count} characters) + too_short: is too short (minimum is %{count} characters) + wrong_length: is the wrong length (should be %{count} characters) + not_a_number: is not a number + not_an_integer: must be an integer + greater_than: must be greater than %{count} + greater_than_or_equal_to: must be greater than or equal to %{count} + equal_to: must be equal to %{count} + less_than: must be less than %{count} + less_than_or_equal_to: must be less than or equal to %{count} + odd: must be odd + even: must be even + taken: has already been taken + record_invalid: ! 'Validation failed: %{errors}' full_messages: - format: "%{attribute} %{message}" + format: ! '%{attribute} %{message}' diff --git a/config/locales/en-US_fat_free_crm.yml b/config/locales/en-US_fat_free_crm.yml index edc2d7cb4f..6a3ad899ec 100644 --- a/config/locales/en-US_fat_free_crm.yml +++ b/config/locales/en-US_fat_free_crm.yml @@ -1,3 +1,4 @@ +--- en-US: language: English @@ -9,8 +10,8 @@ en-US: no_button: 'No' not_implemented: Not implemented yet. or: or - select_none: '-- None --' - select_blank: '-- Select --' + select_none: -- None -- + select_blank: -- Select -- yes_button: 'Yes' @@ -20,37 +21,31 @@ en-US: tab_tasks: Tasks tab_campaigns: Campaigns tab_leads: Leads - tab_accounts: Accounts tab_contacts: Contacts tab_opportunities: Opportunities tab_team: Team - admin_tab_groups: Groups admin_tab_users: Users admin_tab_fields: Custom Fields admin_tab_tags: Tags admin_tab_settings: Settings admin_tab_plugins: Plugins - affiliate: Affiliate competitor: Competitor customer: Customer partner: Partner reseller: Reseller vendor: Vendor - planned: Planned started: Started on_hold: On Hold completed: Completed called_off: Called Off - new: New contacted: Contacted converted: Converted rejected: Rejected - cold_call: Cold Call conference: Conference online: Online Marketing @@ -59,7 +54,6 @@ en-US: web: Website word_of_mouth: Word of Mouth other: Other - prospecting: Prospecting analysis: Analysis presentation: Presentation @@ -68,16 +62,13 @@ en-US: final_review: Final Review won: Closed/Won lost: Closed/Lost - call: Call email: Email follow_up: Follow-up lunch: Lunch meeting: Meeting money: Money - presentation: Presentation trip: Trip - overdue: Overdue due_asap: As Soon As Possible due_today: Today @@ -86,7 +77,6 @@ en-US: due_next_week: Next Week due_later: Sometime Later due_specific_date: On Specific Date... - completed_today: Today completed_yesterday: Yesterday completed_last_week: Last week @@ -116,58 +106,58 @@ en-US: account: attributes: name: - missing_account_name: "^Please specify account name." + missing_account_name: ^Please specify account name. access: - share_account: "^Please specify users to share the account with." + share_account: ^Please specify users to share the account with. campaign: attributes: name: - missing_campaign_name: "^Please specify campaign name." + missing_campaign_name: ^Please specify campaign name. ends_on: - dates_not_in_sequence: "^Please make sure the campaign end date is after the start date." + dates_not_in_sequence: ^Please make sure the campaign end date is after + the start date. access: - share_campaign: "^Please specify users to share the campaign with." + share_campaign: ^Please specify users to share the campaign with. contact: attributes: first_name: - missing_first_name: "^Please specify first name." + missing_first_name: ^Please specify first name. last_name: - missing_last_name: "^Please specify last name." + missing_last_name: ^Please specify last name. access: - share_contact: "^Please specify users to share the contact with." + share_contact: ^Please specify users to share the contact with. lead: attributes: first_name: - missing_first_name: "^Please specify first name." + missing_first_name: ^Please specify first name. last_name: - missing_last_name: "^Please specify last name." + missing_last_name: ^Please specify last name. access: - share_lead: "^Please specify users to share the lead with." + share_lead: ^Please specify users to share the lead with. opportunity: attributes: name: - missing_opportunity_name: "^Please specify opportunity name." + missing_opportunity_name: ^Please specify opportunity name. access: - share_opportunity: "^Please specify users to share the opportunity with." + share_opportunity: ^Please specify users to share the opportunity with. task: attributes: name: - missing_task_name: "^Please specify task name." + missing_task_name: ^Please specify task name. calendar: - invalid_date: "^Please specify valid date." + invalid_date: ^Please specify valid date. user: attributes: username: - missing_username: "^Please specify username." - username_taken: "^This username is already taken." + missing_username: ^Please specify username. + username_taken: ^This username is already taken. email: - missing_email: "^Please specify email address." - email_in_use: "^There is another user with the same email." + missing_email: ^Please specify email address. + email_in_use: ^There is another user with the same email. custom_field: - required: "^%{field} is required." - maxlength: "^%{field} is too long." - endbeforestart: "^%{field} cannot end before it begins." - + required: ^%{field} is required. + maxlength: ^%{field} is too long. + endbeforestart: ^%{field} cannot end before it begins. attribute_options: opportunity: stage: @@ -179,27 +169,29 @@ en-US: final_review: Final Review won: Closed/Won lost: Closed/Lost - msg_account_suspended: User account has been suspended. password_reset_instruction: password reset instructions # Controllers. #---------------------------------------------------------------------------- - msg_account_created: Your account has been created and is awaiting approval by the system administrator. + msg_account_created: Your account has been created and is awaiting approval by the + system administrator. msg_account_not_approved: Your account has not been approved yet. - msg_asset_deleted: "%{value} has been deleted." + msg_asset_deleted: ! '%{value} has been deleted.' msg_asset_not_available: This %{value} is no longer available. msg_asset_not_authorized: You are not authorized to view this %{value}. msg_assets_not_available: The %{value} are not available. - msg_asset_rejected: "%{value} has been rejected." - msg_bad_image_file: "^Could't upload or resize the image file you specified." - msg_cant_create_related: "Can't create the %{asset} since the %{related} is no longer available." - msg_cant_delete_user: "^Couldn't delete the user since %{value} has related assets present." - msg_cant_do: "Can't %{action} the %{asset} since it's no longer available." + msg_asset_rejected: ! '%{value} has been rejected.' + msg_bad_image_file: ^Could't upload or resize the image file you specified. + msg_cant_create_related: Can't create the %{asset} since the %{related} is no longer + available. + msg_cant_delete_user: ^Couldn't delete the user since %{value} has related assets + present. + msg_cant_do: Can't %{action} the %{asset} since it's no longer available. msg_email_not_found: No user was found with that email address. msg_enter_new_password: Please enter your new password. msg_goodbye: You have been logged out. Thank you for using Fat Free CRM! - msg_invalid_password: "^Please specify valid current password" + msg_invalid_password: ^Please specify valid current password msg_invalig_login: Invalid username or password. msg_last_login: Your last login was on %{value}. msg_login_needed: You must be logged in to access this page. @@ -207,15 +199,17 @@ en-US: msg_password_changed: Your password has been changed. msg_password_not_changed: Your password has not been changed. msg_password_updated: Password was successfully updated. - msg_pwd_instructions_sent: Instructions to reset your password have been sent to you. Please check your email. + msg_pwd_instructions_sent: Instructions to reset your password have been sent to + you. Please check your email. msg_require_admin: You must be Administrator to access this page. msg_successful_signup: Successful signup, welcome to Fat Free CRM! msg_welcome: Welcome to Fat Free CRM! # Options. #---------------------------------------------------------------------------- - "option_amount*probability": weighted amount - activity_options: Show %{models} %{action_type} performed by %{user} in the past %{period}. + option_amount*probability: weighted amount + activity_options: Show %{models} %{action_type} performed by %{user} in the past + %{period}. all_users: all users option_after: after option_all: all @@ -241,10 +235,9 @@ en-US: option_updated_at: date updated show_per_page: Show %{number} %{models} per page using %{fmt} format. sort_by: Sort by %{field} - sort_by_displaying: Sort %{models} by %{field} displaying first name %{position} last name. - entities_per_page: "%{entity} per page:" - - # Views -> Switcher + sort_by_displaying: Sort %{models} by %{field} displaying first name %{position} + last name. + entities_per_page: ! '%{entity} per page:' contacts_index_long: Long format contacts_index_brief: Brief format contacts_index_full: Full format @@ -264,12 +257,12 @@ en-US: contact_info: Contact Information current_password: Current password edit_profile: Edit Profile - # email: Email # <-- Already defined as the task type if Settings. first_name: First name google: Google IM gravatar_help: Not familiar with Gravatars? Learn about Gravatars image_file: Image file - image_help: The image file you upload will be automatically resized to 75 x 75 pixels. Supported formats are GIF, JPG, and PNG. + image_help: The image file you upload will be automatically resized to 75 x 75 pixels. + Supported formats are GIF, JPG, and PNG. job_title: Title last_name: Last name login_now_link: Login Now! @@ -334,8 +327,8 @@ en-US: shipping_address: Shipping address total_accounts: Total Accounts website: Website - account_with_title_department: %{title}, %{department} at %{account} - account_with_title: %{title} at %{account} + account_with_title_department: ! '%{title}, %{department} at %{account}' + account_with_title: ! '%{title} at %{account}' # Views -> Campaigns. #---------------------------------------------------------------------------- @@ -354,7 +347,7 @@ en-US: campaigns_small: campaigns conversion: Conversion conversion_label: Conversion (%) - conversion_number: "%{value} conversion" + conversion_number: ! '%{value} conversion' target_conversion: Targe conversion create_campaign: Create Campaign end_date: End date @@ -363,11 +356,13 @@ en-US: no_start_date: no start date specified number_of_leads: Number of leads objectives: Objectives - objectives_help: Please specify target number of leads, expected leads-to-opportunities conversion ratio, target revenue, and campaign budget. These numbers will let you track actual campaign performance. + objectives_help: Please specify target number of leads, expected leads-to-opportunities + conversion ratio, target revenue, and campaign budget. These numbers will let + you track actual campaign performance. objectives_small: campaign objectives revenue: Revenue revenue_label: Revenue ($) - revenue_number: "%{value} in revenue" + revenue_number: ! '%{value} in revenue' save_campaign: Save Campaign start_date: Start date started_ago: started %{value} ago @@ -391,29 +386,31 @@ en-US: contact_summary: Contact Summary create_contact: Create Contact department: Department - department_small: '%{value} department' + department_small: ! '%{value} department' do_not_call: Do not call extra_info: Extra Information extra_info_small: extra contact facebook: Facebook linked_in: LinkedIn myself: Myself - permissions_intro_private: By default only you will have access to the %{value}. You can change permissions later. - permissions_intro_public: By default all users will have access to the %{value}. You can change permissions later. - permissions_intro_shared: By default only the selected users will have access to the %{value}. You can change permissions later. + permissions_intro_private: By default only you will have access to the %{value}. + You can change permissions later. + permissions_intro_public: By default all users will have access to the %{value}. + You can change permissions later. + permissions_intro_shared: By default only the selected users will have access to + the %{value}. You can change permissions later. referred_by: Referred by referred_by_small: referred by save_contact: Save Contact - skype: Skype twitter: Twitter unassigned: Unassigned web_presence: Web Presence web_presence_small: web presence - works_at: "%{job_title} at %{company}" + works_at: ! '%{job_title} at %{company}' general_info: General Information show_general_info_small: Show general information for this contact. show_extra_info_small: Show extra information for this contact. - tag_details: %{tag} Details + tag_details: ! '%{tag} Details' show_tag_info_small: Show %{tag} information for this contact. shared_with_everyone: Shared with everyone title: Title @@ -423,15 +420,23 @@ en-US: #---------------------------------------------------------------------------- convert: Convert convert_lead: Convert Lead - convert_lead_permissions_intro: Contact permissions will be copied from the lead being converted. You can change contact permissions later. - convert_lead_text: By converting the lead %{value} will become a contact associated with the existing or newly created account. Lead status will be automatically set to converted. + convert_lead_permissions_intro: Contact permissions will be copied from the lead + being converted. You can change contact permissions later. + convert_lead_text: By converting the lead %{value} will become a contact associated + with the existing or newly created account. Lead status will be automatically + set to converted. create_lead: Create Lead - create_opp_for_contact: You can optionally create an opportunity for the %{value} contact by specifying the name, current stage, estimated closing date, sale probability, amount of the deal, and the discount offered. + create_opp_for_contact: You can optionally create an opportunity for the %{value} + contact by specifying the name, current stage, estimated closing date, sale probability, + amount of the deal, and the discount offered. lead: Lead lead_info_small: lead contact - lead_permissions_intro_private: By default permissions will be copied from the campaign or set to private. You can change lead permissions later. - lead_permissions_intro_public: By default permissions will be copied from the campaign or set to public. You can change lead permissions later. - lead_permissions_intro_shared: By default permissions will be copied from the campaign or shared with the specified users. You can change lead permissions later. + lead_permissions_intro_private: By default permissions will be copied from the campaign + or set to private. You can change lead permissions later. + lead_permissions_intro_public: By default permissions will be copied from the campaign + or set to public. You can change lead permissions later. + lead_permissions_intro_shared: By default permissions will be copied from the campaign + or shared with the specified users. You can change lead permissions later. lead_small: lead lead_status_small: lead status lead_summary: Lead Summary @@ -475,7 +480,8 @@ en-US: opportunity_small: opportunity opportunity_stages: Opportunity Stages opportunity_summary: Opportunity At a Glance - opportunity_summary_text: "%{amount} with %{discount} discount and %{probability} probability" + opportunity_summary_text: ! '%{amount} with %{discount} discount and %{probability} + probability' past_due: past due, was expected to close %{value} ago probability: Probability probability_number: and %{value} probability @@ -501,13 +507,13 @@ en-US: due: Due feel_free: Feel free to move_to: move to - no_tasks: "You don't have any %{value} tasks" + no_tasks: You don't have any %{value} tasks no_tasks_pending: pending no_tasks_assigned: assigned no_tasks_completed: completed pending_tab: Pending pending_tasks: Pending Tasks - related: 're:' + related: ! 're:' save_task: Save Task task_assigned: The task has been assigned to %{value} task_assigned_to: and assigned to %{value} @@ -562,8 +568,7 @@ en-US: update_past_participle: Updates destroy_past_participle: Deletions all_events_past_participle: Activities - action_create_comment: "- "%{comment}"" - + action_create_comment: ! '- "%{comment}"' my_tasks: My Tasks no_task_records: You have no tasks. my_opportunities: My Opportunities @@ -586,15 +591,15 @@ en-US: comment_intro: You can add comments later. confirm_delete: Are you sure you want to delete this %{value}? copy_permissions: Copy %{value} permissions - could_not_find: "Couldn't find any %{value}. Feel free to" - could_not_find_matching: "Couldn't find any %{value} matching" + could_not_find: Couldn't find any %{value}. Feel free to + could_not_find_matching: Couldn't find any %{value} matching create_new: create new create_a_new: create a new select_existing: select existing delete: Delete discard: Discard edit: Edit - items_total: '%{count} total.' + items_total: ! '%{count} total.' less: Less... me: me more: More... @@ -611,11 +616,11 @@ en-US: select_task: Select Task select_opportunity: Select Opportunity search_assets: Search %{value} - time_ago: "%{value} ago" + time_ago: ! '%{value} ago' background_info: Background address: Address - street1: Street 1 # NEW - street2: Street 2 # NEW + street1: Street 1 + street2: Street 2 city: City zipcode: Zip Code state: State @@ -636,7 +641,8 @@ en-US: about_ffc_version: Fat Free CRM version about_home_page: Home page about_project_page: Project page - about_thank_you: Thank you for using Fat Free CRM! We appreciate your business and hope you enjoy using the software. + about_thank_you: Thank you for using Fat Free CRM! We appreciate your business and + hope you enjoy using the software. about_twitter: Twitter commit updates about_user_group: Discussion group for users admin: Admin @@ -665,12 +671,12 @@ en-US: # Views -> Emails. #---------------------------------------------------------------------------- - email: Email # Views -> Passwords. #---------------------------------------------------------------------------- confirm_password_intro: Please type your new password and then confirm it. - password_intro: Please specify your email address, and the instructions to reset your password will be sent to you. + password_intro: Please specify your email address, and the instructions to reset + your password will be sent to you. reset_password: Reset Password update_password_and_login: Update Password and Login @@ -687,10 +693,11 @@ en-US: groups: Groups groups_small: groups group_small: group - confirm_group_delete: Are you sure you wish to delete this group? There are %{count} items that still reference it. # Views -> Admin -> Users #---------------------------------------------------------------------------- + confirm_group_delete: Are you sure you wish to delete this group? There are %{count} + items that still reference it. approve: Approve create_user: Create User last_seen: last seen %{value} ago @@ -704,7 +711,7 @@ en-US: user_awaits_approval: awaits your approval user_confirm_delete: A user can only be deleted if no related assets are left behind. user_is_admin: The user is Administrator - user_never_logged_in: "hasn't logged in yet" + user_never_logged_in: hasn't logged in yet user_signed_up: Signed Up user_signed_up_on: signed up on %{value} user_since: user since %{value} @@ -717,12 +724,12 @@ en-US: #---------------------------------------------------------------------------- versions: History version: - create: %{item} created by %{by} - update: %{item} modified by %{by} - destroy: %{item} destroyed by %{by} - set_html: %{attr} set to %{to} - unset_html: %{attr} unset - change_html: %{attr} changed from %{from} to %{to} + create: ! '%{item} created by %{by}' + update: ! '%{item} modified by %{by}' + destroy: ! '%{item} destroyed by %{by}' + set_html: ! '%{attr} set to %{to}' + unset_html: ! '%{attr} unset' + change_html: ! '%{attr} changed from %{from} to %{to}' anonymous: anonymous account_contact_id: Account id account_contact_name: Account name @@ -749,8 +756,9 @@ en-US: # Comment Inbox #---------------------------------------------------------------------------- comment_notification: - intro: "%{user_full_name} commented on %{entity_type}: %{entity_name}" - reply_instructions: "Reply to this email directly to add a new comment, or view the %{entity} online" + intro: ! '%{user_full_name} commented on %{entity_type}: %{entity_name}' + reply_instructions: Reply to this email directly to add a new comment, or view + the %{entity} online # Lists #---------------------------------------------------------------------------- @@ -758,58 +766,55 @@ en-US: list: List no_saved_lists: No saved lists make_current_view_list: Make current view a list - list_name_info: If you use the name of an existing list, you will overwrite that list with your current settings + list_name_info: If you use the name of an existing list, you will overwrite that + list with your current settings # Pluralizations. #---------------------------------------------------------------------------- pluralize: comment: - one: '1 comment' - other: '%{count} comments' + one: 1 comment + other: ! '%{count} comments' contact: - one: '1 contact' - other: '%{count} contacts' + one: 1 contact + other: ! '%{count} contacts' opportunity: - one: '1 opportunity' - other: '%{count} opportunities' + one: 1 opportunity + other: ! '%{count} opportunities' lead: - one: '1 lead' - other: '%{count} leads' + one: 1 lead + other: ! '%{count} leads' day: - one: '1 day' - other: '%{count} days' + one: 1 day + other: ! '%{count} days' login: - one: '1 login' - other: '%{count} logins' + one: 1 login + other: ! '%{count} logins' # Custom date/time formats. #---------------------------------------------------------------------------- date: formats: - mmddyyyy: "%m/%d/%Y" - mmdd: "%b %e" - mmddyy: "%b %e, %Y" - + mmddyyyy: ! '%m/%d/%Y' + mmdd: ! '%b %e' + mmddyy: ! '%b %e, %Y' time: formats: - mmddhhss: "%b %e at %l:%M%p" - mmddyyyy_hhmm: "%e %b %Y at %l:%M%p" + mmddhhss: ! '%b %e at %l:%M%p' + mmddyyyy_hhmm: ! '%e %b %Y at %l:%M%p' # will_paginate translations copied for 'en-US' #---------------------------------------------------------------------------- will_paginate: - previous_label: "← Previous" - next_label: "Next →" - page_gap: "…" - + previous_label: ! '← Previous' + next_label: Next → + page_gap: ! '…' page_entries_info: single_page: - zero: "No %{plural} found" - one: "Displaying 1 %{name}" - other: "Displaying all %{count} %{plural}" - - multi_page: "Displaying %{plural} %{from} - %{to} of %{total} in total" - + zero: No %{plural} found + one: Displaying 1 %{name} + other: Displaying all %{count} %{plural} + multi_page: Displaying %{plural} %{from} - %{to} of %{total} in total # Views -> Admin -> Custom Fields #---------------------------------------------------------------------------- @@ -821,40 +826,41 @@ en-US: create_field_group: Create field group edit_field_group: Edit field group save_field_group: Save field group - field_group_empty: There are no fields in this group. - select_or_create_tags: Select some tags, or create a new tag by pressing 'enter'. - - restrict_by_tag: 'Restrict by Tag:' + restrict_by_tag: ! 'Restrict by Tag:' restrict_by_tag_info: (Only show fields for %{assets} that are tagged with the following) field_group_tag_restriction: This field group applies to %{assets} tagged with "%{tag}" field_group_unrestricted: This field group applies to all %{assets} - field_group_confirm_delete: If a field group is deleted, any fields will be moved to the default field group. + field_group_confirm_delete: If a field group is deleted, any fields will be moved + to the default field group. msg_cant_delete_field_group: Field Group could not be deleted. + admin_fields_info: ! 'Custom fields are displayed in groups. - admin_fields_info: | - Custom fields are displayed in groups. Create a new field group, or add fields to one of the groups below.
- You can drag and drop fields to change their display order or move them between field groups. - admin_fields_info2: | - It is strongly recommended you restart your server after adding or removing any custom field. + You can drag and drop fields to change their display order or move them between + field groups. +' # Views -> Admin -> Tags #---------------------------------------------------------------------------- + admin_fields_info2: ! 'It is strongly recommended you restart your server after + adding or removing any custom field. + +' tags: Tags tag_small: tag tagged: Tagged create_tag: Create Tag save_tag: Save Tag field_group_tags: Field Groups shown for this Tag - tag_with_taggings_confirm_delete: "If this tag is deleted, it will be removed from %{value} records." - msg_cant_delete_tag: "Couldn't delete '%{value}' since it has associated Field Groups." - # Views -> Admin -> Plugins #---------------------------------------------------------------------------- + tag_with_taggings_confirm_delete: If this tag is deleted, it will be removed from + %{value} records. + msg_cant_delete_tag: Couldn't delete '%{value}' since it has associated Field Groups. views: admin: plugins: @@ -868,67 +874,54 @@ en-US: yes: 'Yes' no: 'No' required: - text: 'required' - mark: '*' + text: required + mark: ! '*' # You can uncomment the line below if you need to overwrite the whole required html. # When using html, text and mark won't be used. # html: '*' error_notification: - default_message: "Some errors were found, please take a look:" - # Labels and hints examples - # labels: - # password: 'Password' - # user: - # new: - # email: 'E-mail para efetuar o sign in.' - # edit: - # email: 'E-mail.' - # hints: - # username: 'User name to sign in.' - # password: 'No special characters, please.' - + default_message: ! 'Some errors were found, please take a look:' # Form field types #---------------------------------------------------------------------------- field_types: string: - title: Short Answer + title: Short Answer text: - title: Long Answer + title: Long Answer select: - title: Select List + title: Select List multiselect: - title: Multi Select + title: Multi Select radio: - title: Radio Buttons + title: Radio Buttons boolean: - title: Checkbox + title: Checkbox check_boxes: - title: Checkbox List + title: Checkbox List date: - title: Date + title: Date date_pair: - title: Date Pair + title: Date Pair datetime: - title: Date & Time + title: Date & Time datetime_pair: - title: Date & Time Pair + title: Date & Time Pair email: - title: Email Address + title: Email Address url: - title: URL + title: URL tel: - title: Phone Number + title: Phone Number decimal: - title: Number (Decimal) + title: Number (Decimal) integer: - title: Number (Integer) + title: Number (Integer) float: - title: Number (Floating Point) - + title: Number (Floating Point) pair: - start: Start - end: End - from_to: From %{from} to %{to} - from_only: From %{from} - to_only: Until %{to} + start: Start + end: End + from_to: From %{from} to %{to} + from_only: From %{from} + to_only: Until %{to} diff --git a/config/locales/en-US_ransack.yml b/config/locales/en-US_ransack.yml index ed5ac1ef28..2c044c8509 100644 --- a/config/locales/en-US_ransack.yml +++ b/config/locales/en-US_ransack.yml @@ -1,92 +1,91 @@ +--- en-US: ransack: - search: "search" - predicate: "predicate" - and: "and" - or: "or" - any: "any" - all: "all" - combinator: "combinator" - attribute: "attribute" - value: "value" - condition: "condition" - sort: "sort" - asc: "ascending" - desc: "descending" - + search: search + predicate: predicate + and: and + or: or + any: any + all: all + combinator: combinator + attribute: attribute + value: value + condition: condition + sort: sort + asc: ascending + desc: descending submit: Search add_group: Add a group of filters group_first: Show results where %{combinator} of the following match - group_rest: ...and where %{combinator} of the following match + group_rest: ! '...and where %{combinator} of the following match' add_condition: Add a filter remove_condition: Remove filter - predicates: - eq: "is" - eq_any: "is any" - eq_all: "is all" - not_eq: "is not" - not_eq_any: "is not any" - not_eq_all: "is not all" - matches: "matches" - matches_any: "matches any" - matches_all: "matches all" - does_not_match: "doesn't match" - does_not_match_any: "doesn't match any" - does_not_match_all: "doesn't match all" - lt: "less than" - lt_any: "less than any" - lt_all: "less than all" - lteq: "less than or equal to" - lteq_any: "less than or equal to any" - lteq_all: "less than or equal to all" - gt: "greater than" - gt_any: "greater than any" - gt_all: "greater than all" - gteq: "greater than or equal to" - gteq_any: "greater than or equal to any" - gteq_all: "greater than or equal to all" - in: "is in" - in_any: "is in any" - in_all: "is in all" - not_in: "is not in" - not_in_any: "is not in any" - not_in_all: "is not in all" - cont: "contains" - cont_any: "contains any" - cont_all: "contains all" - not_cont: "doesn't contain" - not_cont_any: "doesn't contain any" - not_cont_all: "doesn't contain all" - start: "starts with" - start_any: "starts with any" - start_all: "starts with all" - not_start: "doesn't start with" - not_start_any: "doesn't start with any" - not_start_all: "doesn't start with all" - end: "ends with" - end_any: "ends with any" - end_all: "ends with all" - not_end: "doesn't end with" - not_end_any: "doesn't end with any" - not_end_all: "doesn't end with all" - 'true': "is true" - 'false': "is false" - present: "is present" - blank: "is blank" - 'null': "is null" - not_null: "is not null" + eq: is + eq_any: is any + eq_all: is all + not_eq: is not + not_eq_any: is not any + not_eq_all: is not all + matches: matches + matches_any: matches any + matches_all: matches all + does_not_match: doesn't match + does_not_match_any: doesn't match any + does_not_match_all: doesn't match all + lt: less than + lt_any: less than any + lt_all: less than all + lteq: less than or equal to + lteq_any: less than or equal to any + lteq_all: less than or equal to all + gt: greater than + gt_any: greater than any + gt_all: greater than all + gteq: greater than or equal to + gteq_any: greater than or equal to any + gteq_all: greater than or equal to all + in: is in + in_any: is in any + in_all: is in all + not_in: is not in + not_in_any: is not in any + not_in_all: is not in all + cont: contains + cont_any: contains any + cont_all: contains all + not_cont: doesn't contain + not_cont_any: doesn't contain any + not_cont_all: doesn't contain all + start: starts with + start_any: starts with any + start_all: starts with all + not_start: doesn't start with + not_start_any: doesn't start with any + not_start_all: doesn't start with all + end: ends with + end_any: ends with any + end_all: ends with all + not_end: doesn't end with + not_end_any: doesn't end with any + not_end_all: doesn't end with all + 'true': is true + 'false': is false + present: is present + blank: is blank + 'null': is null + not_null: is not null alt: date: - lt: "is before" - lt_any: "is before any" - lt_all: "is before all" - lteq: "is before or on" - lteq_any: "is before or on any" - lteq_all: "is before or on all" - gt: "is after" - gt_any: "is after any" - gt_all: "is after all" - gteq: "is after or on" - gteq_any: "is after or on any" - gteq_all: "is after or on all" \ No newline at end of file + lt: is before + lt_any: is before any + lt_all: is before all + lteq: is before or on + lteq_any: is before or on any + lteq_all: is before or on all + gt: is after + gt_any: is after any + gt_all: is after all + gteq: is after or on + gteq_any: is after or on any + gteq_all: is after or on all diff --git a/config/locales/es.yml b/config/locales/es.yml index 970975d90f..61b776a9f9 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -3,182 +3,223 @@ # contributors: # - Tsutomu Kuroda - http://github.com/kuroda (t-kuroda@oiax.jp) -"es": +--- +es: date: formats: - default: "%d/%m/%Y" - short: "%d de %b" - long: "%d de %B de %Y" - - day_names: [Domingo, Lunes, Martes, Miércoles, Jueves, Viernes, Sábado] - abbr_day_names: [Dom, Lun, Mar, Mie, Jue, Vie, Sab] - - month_names: [~, Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Septiembre, Octubre, Noviembre, Diciembre] - abbr_month_names: [~, Ene, Feb, Mar, Abr, May, Jun, Jul, Ago, Sep, Oct, Nov, Dic] + default: ! '%d/%m/%Y' + short: ! '%d de %b' + long: ! '%d de %B de %Y' + day_names: + - Domingo + - Lunes + - Martes + - Miércoles + - Jueves + - Viernes + - Sábado + abbr_day_names: + - Dom + - Lun + - Mar + - Mie + - Jue + - Vie + - Sab + month_names: + - + - Enero + - Febrero + - Marzo + - Abril + - Mayo + - Junio + - Julio + - Agosto + - Septiembre + - Octubre + - Noviembre + - Diciembre + abbr_month_names: + - + - Ene + - Feb + - Mar + - Abr + - May + - Jun + - Jul + - Ago + - Sep + - Oct + - Nov + - Dic order: - - :day - - :month - - :year - + - :day + - :month + - :year time: formats: - default: "%A, %d de %B de %Y %H:%M:%S %z" - short: "%d de %b %H:%M" - long: "%d de %B de %Y %H:%M" - am: "am" - pm: "pm" - + default: ! '%A, %d de %B de %Y %H:%M:%S %z' + short: ! '%d de %b %H:%M' + long: ! '%d de %B de %Y %H:%M' + am: am + pm: pm support: array: - words_connector: ", " - two_words_connector: " y " - last_word_connector: ", y " - + words_connector: ! ', ' + two_words_connector: ! ' y ' + last_word_connector: ! ', y ' select: - prompt: "Por favor seleccione" - + prompt: Por favor seleccione number: format: - separator: "." - delimiter: "," + separator: . + delimiter: ! ',' precision: 3 significant: false strip_insignificant_zeros: false - currency: format: - format: "%n %u" - unit: "€" - separator: "." - delimiter: "," + format: ! '%n %u' + unit: € + separator: . + delimiter: ! ',' precision: 2 significant: false strip_insignificant_zeros: false - percentage: format: - delimiter: "" - + delimiter: '' precision: format: - delimiter: "" - + delimiter: '' human: format: - delimiter: "" + delimiter: '' precision: 1 significant: true strip_insignificant_zeros: true storage_units: - format: "%n %u" + format: ! '%n %u' units: byte: - one: "Byte" - other: "Bytes" - kb: "KB" - mb: "MB" - gb: "GB" - tb: "TB" + one: Byte + other: Bytes + kb: KB + mb: MB + gb: GB + tb: TB decimal_units: - format: "%n %u" + format: ! '%n %u' units: - unit: "" - thousand: "Mil" - million: "Millón" - billion: "Mil millones" - trillion: "Trillón" - quadrillion: "Cuatrillón" - + unit: '' + thousand: Mil + million: Millón + billion: Mil millones + trillion: Trillón + quadrillion: Cuatrillón datetime: distance_in_words: - half_a_minute: "medio minuto" + half_a_minute: medio minuto less_than_x_seconds: - one: "menos de 1 segundo" - other: "menos de %{count} segundos" + one: menos de 1 segundo + other: menos de %{count} segundos x_seconds: - one: "1 segundo" - other: "%{count} segundos" + one: 1 segundo + other: ! '%{count} segundos' less_than_x_minutes: - one: "menos de 1 minuto" - other: "menos de %{count} minutos" + one: menos de 1 minuto + other: menos de %{count} minutos x_minutes: - one: "1 minuto" - other: "%{count} minutos" + one: 1 minuto + other: ! '%{count} minutos' about_x_hours: - one: "alrededor de 1 hora" - other: "alrededor de %{count} horas" + one: alrededor de 1 hora + other: alrededor de %{count} horas x_days: - one: "1 día" - other: "%{count} días" + one: 1 día + other: ! '%{count} días' about_x_months: - one: "alrededor de 1 mes" - other: "alrededor de %{count} meses" + one: alrededor de 1 mes + other: alrededor de %{count} meses x_months: - one: "1 mes" - other: "%{count} meses" + one: 1 mes + other: ! '%{count} meses' about_x_years: - one: "alrededor de 1 año" - other: "alrededor de %{count} años" + one: alrededor de 1 año + other: alrededor de %{count} años over_x_years: - one: "más de 1 año" - other: "más de %{count} años" + one: más de 1 año + other: más de %{count} años almost_x_years: - one: "casi 1 año" - other: "casi %{count} años" + one: casi 1 año + other: casi %{count} años prompts: - year: "Año" - month: "Mes" - day: "Día" - hour: "Hora" - minute: "Minutos" - second: "Segundos" - + year: Año + month: Mes + day: Día + hour: Hora + minute: Minutos + second: Segundos helpers: select: - prompt: "Por favor seleccione" - + prompt: Por favor seleccione submit: - create: 'Crear %{model}' - update: 'Actualizar %{model}' - submit: 'Guardar %{model}' - + create: Crear %{model} + update: Actualizar %{model} + submit: Guardar %{model} errors: - format: "%{attribute} %{message}" - - messages: &errors_messages - inclusion: "no está incluido en la lista" - exclusion: "está reservado" - invalid: "no es válido" - confirmation: "no coincide con la confirmación" - accepted: "debe ser aceptado" - empty: "no puede estar vacío" - blank: "no puede estar en blanco" - too_long: "es demasiado largo (%{count} caracteres máximo)" - too_short: "es demasiado corto (%{count} caracteres mínimo)" - wrong_length: "no tiene la longitud correcta (%{count} caracteres exactos)" - not_a_number: "no es un número" - not_an_integer: "debe ser un entero" - greater_than: "debe ser mayor que %{count}" - greater_than_or_equal_to: "debe ser mayor que o igual a %{count}" - equal_to: "debe ser igual a %{count}" - less_than: "debe ser menor que %{count}" - less_than_or_equal_to: "debe ser menor que o igual a %{count}" - odd: "debe ser impar" - even: "debe ser par" - + format: ! '%{attribute} %{message}' + messages: + inclusion: no está incluido en la lista + exclusion: está reservado + invalid: no es válido + confirmation: no coincide con la confirmación + accepted: debe ser aceptado + empty: no puede estar vacío + blank: no puede estar en blanco + too_long: es demasiado largo (%{count} caracteres máximo) + too_short: es demasiado corto (%{count} caracteres mínimo) + wrong_length: no tiene la longitud correcta (%{count} caracteres exactos) + not_a_number: no es un número + not_an_integer: debe ser un entero + greater_than: debe ser mayor que %{count} + greater_than_or_equal_to: debe ser mayor que o igual a %{count} + equal_to: debe ser igual a %{count} + less_than: debe ser menor que %{count} + less_than_or_equal_to: debe ser menor que o igual a %{count} + odd: debe ser impar + even: debe ser par activerecord: errors: template: header: - one: "No se pudo guardar este/a %{model} porque se encontró 1 error" - other: "No se pudo guardar este/a %{model} porque se encontraron %{count} errores" - # The variable :count is also available - body: "Se encontraron problemas con los siguientes campos:" - + one: No se pudo guardar este/a %{model} porque se encontró 1 error + other: No se pudo guardar este/a %{model} porque se encontraron %{count} + errores + body: ! 'Se encontraron problemas con los siguientes campos:' messages: - taken: "ya está en uso" - record_invalid: "La validación falló: %{errors}" - <<: *errors_messages - + inclusion: no está incluido en la lista + exclusion: está reservado + invalid: no es válido + confirmation: no coincide con la confirmación + accepted: debe ser aceptado + empty: no puede estar vacío + blank: no puede estar en blanco + too_long: es demasiado largo (%{count} caracteres máximo) + too_short: es demasiado corto (%{count} caracteres mínimo) + wrong_length: no tiene la longitud correcta (%{count} caracteres exactos) + not_a_number: no es un número + not_an_integer: debe ser un entero + greater_than: debe ser mayor que %{count} + greater_than_or_equal_to: debe ser mayor que o igual a %{count} + equal_to: debe ser igual a %{count} + less_than: debe ser menor que %{count} + less_than_or_equal_to: debe ser menor que o igual a %{count} + odd: debe ser impar + even: debe ser par + taken: ya está en uso + record_invalid: ! 'La validación falló: %{errors}' full_messages: - format: "%{attribute} %{message}" + format: ! '%{attribute} %{message}' diff --git a/config/locales/es_fat_free_crm.yml b/config/locales/es_fat_free_crm.yml index d54e7d70a8..5e7b45604c 100644 --- a/config/locales/es_fat_free_crm.yml +++ b/config/locales/es_fat_free_crm.yml @@ -1,23 +1,15 @@ -# Spanish translation of fat free crm -# by Beatriz Garcia Parrilla (beatriztranslations.com) - -"es": +--- +es: language: Español (España) - - # Generic terms. - #---------------------------------------------------------------------------- all: todas at: a here: aquí no_button: 'No' not_implemented: Aún no ejecutado. or: o - select_none: '-- Ninguna --' - select_blank: '-- Seleccionar --' - yes_button: 'Sí' - - # Settings. - #---------------------------------------------------------------------------- + select_none: -- Ninguna -- + select_blank: -- Seleccionar -- + yes_button: Sí tab_dashboard: Inicio tab_tasks: Tareas tab_campaigns: Campañas @@ -25,51 +17,42 @@ tab_accounts: Cuentas tab_contacts: Contactos tab_opportunities: Oportunidades - admin_tab_users: Usuarios admin_tab_settings: Configuración admin_tab_plugins: Complementos - users_small: usuarios - planned: Planificada started: Iniciada on_hold: Aplazada completed: Completada called_off: Cancelada - new: Nueva contacted: Contactada converted: Transformada rejected: Rechazada - - cold_call: Llamada publicitaria + cold_call: Llamada publicitaria conference: Conferencia online: Venta en línea referral: Referencia - self: Propia + self: Propia web: Sitio web - word_of_mouth: Boca a boca + word_of_mouth: Boca a boca other: Otra - - prospecting: Sondeo - analysis: Análisis + prospecting: Sondeo + analysis: Análisis presentation: Presentación proposal: Propuesta negotiation: Negociación final_review: Revisión Definitiva won: Cerrada/Conseguida lost: Cerrada/Perdida - call: Llamada email: Correo electrónico follow_up: Seguimiento lunch: Almuerzo meeting: Reunión - money: Dinero - presentation: Presentación + money: Dinero trip: Viaje - overdue: Atrasada due_asap: Cuanto antes due_today: Hoy @@ -77,25 +60,18 @@ due_this_week: Ésta semana due_next_week: Próxima semana due_later: En el futuro - due_specific_date: En Fecha Específica... # ?! - + due_specific_date: En Fecha Específica... completed_today: Hoy completed_yesterday: Ayer completed_last_week: La semana pasada completed_this_month: Éste mes completed_last_month: El mes pasado - - # Models/Activity. - #---------------------------------------------------------------------------- one_hour: la última hora one_day: el último día two_days: los últimos dos días one_week: la última semana two_weeks: las últimas dos semanas one_month: el último mes - - # Model Validations. - #---------------------------------------------------------------------------- activerecord: errors: models: @@ -108,83 +84,86 @@ account: attributes: name: - missing_account_name: "^Dé un nombre a la cuenta, por favor." + missing_account_name: ^Dé un nombre a la cuenta, por favor. access: - share_account: "^Especifique con qué usuarios quiere compartir ésta cuenta, por favor." + share_account: ^Especifique con qué usuarios quiere compartir ésta cuenta, + por favor. campaign: attributes: name: - missing_campaign_name: "^Dé un nombre a la campaña, por favor." + missing_campaign_name: ^Dé un nombre a la campaña, por favor. ends_on: - dates_not_in_sequence: "^Asegúrese de que la fecha de finalización de la campaña es posterior a la fecha de inicio, por favor." + dates_not_in_sequence: ^Asegúrese de que la fecha de finalización de + la campaña es posterior a la fecha de inicio, por favor. access: - share_campaign: "^Especifique con qué usuarios quiere compartir ésta campaña, por favor." + share_campaign: ^Especifique con qué usuarios quiere compartir ésta + campaña, por favor. contact: attributes: first_name: - missing_first_name: "^Introduzca el nombre, por favor." + missing_first_name: ^Introduzca el nombre, por favor. last_name: - missing_last_name: "^Introduzca los apellidos, por favor." + missing_last_name: ^Introduzca los apellidos, por favor. access: - share_contact: "^Especifique con qué usuarios quiere compartir éste contacto, por favor." + share_contact: ^Especifique con qué usuarios quiere compartir éste contacto, + por favor. lead: attributes: first_name: - missing_first_name: "^Introduzca el nombre, por favor." + missing_first_name: ^Introduzca el nombre, por favor. last_name: - missing_last_name: "^Introduzca los apellidos, por favor." + missing_last_name: ^Introduzca los apellidos, por favor. access: - share_lead: "^Especifique con qué usuarios quiere compartir éste iniciativa, por favor." + share_lead: ^Especifique con qué usuarios quiere compartir éste iniciativa, + por favor. opportunity: attributes: name: - missing_opportunity_name: "^Dé un nombre a ésta oportunidad, por favor." + missing_opportunity_name: ^Dé un nombre a ésta oportunidad, por favor. access: - share_opportunity: "^Especifique con qué usuarios quiere compartir éste oportunidad, por favor." + share_opportunity: ^Especifique con qué usuarios quiere compartir éste + oportunidad, por favor. task: attributes: name: - missing_task_name: "^Dé un nombre a ésta tarea, por favor." + missing_task_name: ^Dé un nombre a ésta tarea, por favor. calendar: - invalid_date: "^Introduzca una fecha correcta, por favor." + invalid_date: ^Introduzca una fecha correcta, por favor. user: attributes: username: - missing_username: "^Introduzca un nombre de usuario, por favor." - username_taken: "^Este nombre de usuario ya está siendo usado." + missing_username: ^Introduzca un nombre de usuario, por favor. + username_taken: ^Este nombre de usuario ya está siendo usado. email: - missing_email: "^Introduzca su dirección de correo electrónico, por favor." - email_in_use: "^Hay otro usuario con ésta misma dirección de correo electrónico." - - # dynamic_form plugin translations. - #---------------------------------------------------------------------------- + missing_email: ^Introduzca su dirección de correo electrónico, por favor. + email_in_use: ^Hay otro usuario con ésta misma dirección de correo electrónico. errors: template: header: - one: "No se pudo guardar este/a %{model} porque se encontró 1 error" - other: "No se pudo guardar este/a %{model} porque se encontraron %{count} errores" - body: "Se encontraron problemas con los siguientes campos:" - + one: No se pudo guardar este/a %{model} porque se encontró 1 error + other: No se pudo guardar este/a %{model} porque se encontraron %{count} errores + body: ! 'Se encontraron problemas con los siguientes campos:' msg_account_suspended: Esta cuenta de usuario ha sido suspendida. password_reset_instruction: Instrucciones para restaurar la contraseña - - # Controllers. - #---------------------------------------------------------------------------- - msg_account_created: Su cuenta ha sido creada y está pendiente de aprobación por el administrador del sistema. + msg_account_created: Su cuenta ha sido creada y está pendiente de aprobación por + el administrador del sistema. msg_account_not_approved: Su cuenta no ha sido aprobada todavía. - msg_asset_deleted: "Se ha eliminado %{value}." + msg_asset_deleted: Se ha eliminado %{value}. msg_asset_not_available: Ésta %{value} ya no está disponible. - msg_asset_not_authorized: You are not authorized to view this %{value}. # TODO + msg_asset_not_authorized: You are not authorized to view this %{value}. msg_assets_not_available: La %{value} no está disponible. - msg_asset_rejected: "Se ha rechazado %{value}." - msg_bad_image_file: "^No se pudo cargar o cambiar el tamaño del archivo de imagen especificado." - msg_cant_create_related: "No se puede crear la %{asset} por ya no estar disponible la %{related}" - msg_cant_delete_user: "^No se pudo eliminar el usuario porque %{value} tiene recursos relacionados." - msg_cant_do: "No se puede %{action} la %{asset} por ya no estar disponible." + msg_asset_rejected: Se ha rechazado %{value}. + msg_bad_image_file: ^No se pudo cargar o cambiar el tamaño del archivo de imagen + especificado. + msg_cant_create_related: No se puede crear la %{asset} por ya no estar disponible + la %{related} + msg_cant_delete_user: ^No se pudo eliminar el usuario porque %{value} tiene recursos + relacionados. + msg_cant_do: No se puede %{action} la %{asset} por ya no estar disponible. msg_email_not_found: No se han encontrado usuarios con esa dirección de correo electrónico. msg_enter_new_password: Por favor, introduzca su nueva contraseña, . msg_goodbye: La sesión se ha cerrado. ¡Gracias por utilizar Fat Free CRM! - msg_invalid_password: "^Por favor, introduzca correctamente su contraseña" + msg_invalid_password: ^Por favor, introduzca correctamente su contraseña msg_invalig_login: Nombre de usuario o contraseña no válida. msg_last_login: Su última conexión fue el %{value}. msg_login_needed: Debe iniciar sesión para acceder a ésta página. @@ -192,14 +171,12 @@ msg_password_changed: Su contraseña ha sido modificada. msg_password_not_changed: Su contraseña no ha sido modificada. msg_password_updated: Contraseña modificada con éxito. - msg_pwd_instructions_sent: Se le han enviado las instrucciones para restaurar su contraseña. Por favor, revise su correo electrónico. + msg_pwd_instructions_sent: Se le han enviado las instrucciones para restaurar su + contraseña. Por favor, revise su correo electrónico. msg_require_admin: Debe ser administrador para acceder a ésta página. msg_successful_signup: Registro realizado con éxito, ¡Bienvenido/a a Fat Free CRM! msg_welcome: ¡Bienvenido/a to Fat Free CRM! - - # Options. - #---------------------------------------------------------------------------- - "option_amount*probability": valor ponderado + option_amount*probability: valor ponderado activity_options: Mostrar %{models} las actividades realizadas por %{user} en %{period}. all_users: todos los usuarios option_after: después de @@ -214,22 +191,20 @@ option_ends_on: fecha de finalización option_first_name: nombre option_last_name: apellidos - option_leads_count: iniciativas reales + option_leads_count: iniciativas reales option_long: largo option_name: nombre option_probability: probabilidad option_rating: valoración option_revenue: ingresos reales option_starts_on: fecha de inicio - option_target_leads: iniciativas planeadas - option_target_revenue: ingresos planeados + option_target_leads: iniciativas planeadas + option_target_revenue: ingresos planeados option_updated_at: fecha de modificación show_per_page: Mostrar %{number} %{models} por página utilizando el formato %{fmt}. sort_by: Ordenar %{models} por %{field}. - sort_by_displaying: Ordenar %{models} por %{field} mostrando el nombre %{position} los apellidos. - - # Views -> Profile. - #---------------------------------------------------------------------------- + sort_by_displaying: Ordenar %{models} por %{field} mostrando el nombre %{position} + los apellidos. aim: AOL IM already_signed_up: ¿Ya se ha registrado? alt_email: Dirección de correo electrónico alternativa @@ -239,17 +214,17 @@ contact_info: Información de Contacto current_password: Contraseña actual edit_profile: Editar Perfil - # email: Correo electrónico # <-- Already defined as the task type if Settings. first_name: Nombre google: Google IM gravatar_help: ¿No sabe qué son Gravatars? Conózcalos image_file: Imagen de archivo - image_help: El tamaño de la imagen que cargue se reajustará automáticamente a 75 x 75 píxeles. Los formatos soportados son GIF, JPG y PNG. + image_help: El tamaño de la imagen que cargue se reajustará automáticamente a 75 + x 75 píxeles. Los formatos soportados son GIF, JPG y PNG. job_title: Profesión last_name: Apellidos login_now_link: ¡Inicie sesión! mobile: Teléfono móvil - my_profile: Mi perfil + my_profile: Mi perfil new_password: Nueva contraseña password: Contraseña password_confirmation: Confirmar contraseña @@ -265,17 +240,11 @@ user: Usuario username: Nombre de usuario yahoo: Yahoo IM - - # Views -> Authenticate. - #---------------------------------------------------------------------------- forgot_password: ¿Ha olvidado la contraseña login: Iniciar sesión no_account: ¿No tiene una cuenta? remember_me: Recordar mis datos sign_up_now: ¡Regístrese! - - # Views -> Accounts. - #---------------------------------------------------------------------------- account: Cuenta account_small: cuenta accounts: Cuentas @@ -292,7 +261,7 @@ open_in_window: Abrir %{value} en una ventana nueva mail_to: Correo electrónico a %{value} phone_small: teléfono - phone_toll_free: Llamada gratuita + phone_toll_free: Llamada gratuita keep_private: Uso privado, no compartir con otros make_public: Compartir con todos same_as_billing: la misma que la de facturación @@ -300,9 +269,6 @@ share_with: Compartir con las siguientes personas shipping_address: Dirección de envío website: Sitio web - - # Views -> Campaigns. - #---------------------------------------------------------------------------- actual: Real actual_performance: Rendimiento Real budget: Presupuesto @@ -315,9 +281,9 @@ campaigns: Campañas campaigns_options: Opciones de Campaña campaigns_small: campañas - conversion: Transformación + conversion: Transformación conversion_label: Transformación (%) - conversion_number: "Transformación %{value} " + conversion_number: ! 'Transformación %{value} ' create_campaign: Crear Campaña end_date: Fecha de finalización finished_on: completada el %{value} @@ -325,23 +291,23 @@ no_start_date: fecha de inicio sin determinar number_of_leads: Número de iniciativas objectives: Objetivos - objectives_help: Por favor, introduzca el número de iniciativas planeadas, la proporción prevista de las transformaciones de iniciativas a oportunidades, los ingresos planeados y el presupuesto de la campaña. Éstas cifras le permitirán mantenerse al tanto de los resultados reales de la campaña. + objectives_help: Por favor, introduzca el número de iniciativas planeadas, la proporción + prevista de las transformaciones de iniciativas a oportunidades, los ingresos + planeados y el presupuesto de la campaña. Éstas cifras le permitirán mantenerse + al tanto de los resultados reales de la campaña. objectives_small: objetivos de la campaña revenue: Ingresos revenue_label: Ingresos (€) - revenue_number: "%{value} de ingresos" + revenue_number: ! '%{value} de ingresos' save_campaign: Guardar Campaña start_date: Fecha de inicio - started_ago: comenzó hace %{value} + started_ago: comenzó hace %{value} starts_in: comienza en %{value} starts_today: ¡comienza hoy! target: Objetivo total_campaigns: Total Campañas - was_supposed_to_finish: finalización prevista el %{value} + was_supposed_to_finish: finalización prevista el %{value} was_supposed_to_start: was supposed to start %{time_ago} ago on %{start_date} - - # Views -> Contacts. - #---------------------------------------------------------------------------- alt_email_small: Otra blog: Sitio web/blog contact: Contacto @@ -351,37 +317,48 @@ contacts_small: contactos create_contact: Crear contacto department: Departamento - department_small: 'Departamento de %{value}' + department_small: Departamento de %{value} do_not_call: No llamar por teléfono extra_info: Información adicional - extra_info_small: éste contacto + extra_info_small: éste contacto facebook: Facebook linked_in: LinkedIn myself: Mí - permissions_intro_private: Por defecto sólo usted tendrá acceso a %{value}. Puede cambiar los permisos más tarde. - permissions_intro_public: Por defecto todos los usuarios tendrán acceso a %{value}. Puede cambiar los permisos más tarde. - permissions_intro_shared: Por defecto sólo los usuarios seleccionados tendrán acceso a %{value}. Puede cambiar los permisos más tarde. + permissions_intro_private: Por defecto sólo usted tendrá acceso a %{value}. Puede + cambiar los permisos más tarde. + permissions_intro_public: Por defecto todos los usuarios tendrán acceso a %{value}. + Puede cambiar los permisos más tarde. + permissions_intro_shared: Por defecto sólo los usuarios seleccionados tendrán acceso + a %{value}. Puede cambiar los permisos más tarde. referred_by: Referencias referred_by_small: referencias save_contact: Guardar contacto twitter: Twitter web_presence: Presencia en internet web_presence_small: presencia en internet - works_at: "%{job_title} en %{company}" - - # Views -> Leads. - #---------------------------------------------------------------------------- + works_at: ! '%{job_title} en %{company}' convert: Transformar convert_lead: Transformar Iniciativa - convert_lead_permissions_intro: Los permisos del Contacto se copiarán de la iniciativa transformada. Puede cambiar los permisos del contacto más tarde. - convert_lead_text: Al transformar la iniciativa %{value} ésta se convertirá en un contacto asociado con una cuenta existente o con una cuenta nueva. El estado de la iniciativa cambiará automáticamente a iniciativa transformada. + convert_lead_permissions_intro: Los permisos del Contacto se copiarán de la iniciativa + transformada. Puede cambiar los permisos del contacto más tarde. + convert_lead_text: Al transformar la iniciativa %{value} ésta se convertirá en un + contacto asociado con una cuenta existente o con una cuenta nueva. El estado de + la iniciativa cambiará automáticamente a iniciativa transformada. create_lead: Crear iniciativa - create_opp_for_contact: De forma opcional puede crear una oportunidad para el contacto %{value} atribuyéndole un nombre, su estado actual, una fecha de cierre estimada, la probabilidad de ventas, valor de la transacción y descuento ofertado. + create_opp_for_contact: De forma opcional puede crear una oportunidad para el contacto + %{value} atribuyéndole un nombre, su estado actual, una fecha de cierre estimada, + la probabilidad de ventas, valor de la transacción y descuento ofertado. lead: Iniciativa lead_info_small: contacto de iniciativa - lead_permissions_intro_private: Por defecto los permisos se copiarán de la campaña o estarán configurados de forma privada. Puede cambiar los permisos de la iniciativa más tarde. - lead_permissions_intro_public: Por defecto los permisos se copiarán de la campaña o estarán configurados de forma pública. Puede cambiar los permisos de la iniciativa más tarde. - lead_permissions_intro_shared: Por defecto los permisos se copiarán de la campaña o estarán compartidos con los usuarios seleccionados. Puede cambiar los permisos de la iniciativa más tarde. + lead_permissions_intro_private: Por defecto los permisos se copiarán de la campaña + o estarán configurados de forma privada. Puede cambiar los permisos de la iniciativa + más tarde. + lead_permissions_intro_public: Por defecto los permisos se copiarán de la campaña + o estarán configurados de forma pública. Puede cambiar los permisos de la iniciativa + más tarde. + lead_permissions_intro_shared: Por defecto los permisos se copiarán de la campaña + o estarán compartidos con los usuarios seleccionados. Puede cambiar los permisos + de la iniciativa más tarde. lead_small: iniciativa lead_status_small: estado de la iniciativa lead_summary: Resumen de iniciativas @@ -396,9 +373,6 @@ source: Fuente status: Estado total_leads: Total Iniciativas - - # Views -> Opportunities. - #---------------------------------------------------------------------------- amount: Cantidad close_date: Fecha de cierre closed_ago_on: cerrada hace %{time_ago} el %{date} @@ -413,24 +387,22 @@ expected_to_close: cierre previsto dentro de %{time} el %{date} from: desde no_closing_date: sin fecha de cierre prevista - no_discount: sin descuento + no_discount: sin descuento opportunities: Oportunidades opportunities_options: Opciones de Oportunidades opportunities_small: oportunidades opportunity: Oportunidad opportunity_small: oportunidad opportunity_summary: Oportunidad de un vistazo - opportunity_summary_text: "%{amount} con %{discount} de descuento y %{probability} de probabilidad" - past_due: plazo cumplido, cierre previsto hace %{value} + opportunity_summary_text: ! '%{amount} con %{discount} de descuento y %{probability} + de probabilidad' + past_due: plazo cumplido, cierre previsto hace %{value} probability: Probabilidad probability_number: y %{value} de probabilidad save_opportunity: Guardar Oportunidad stage: Estado total_opportunities: Total Oportunidades weighted_amount: Cantidad ponderada - - # Views -> Tasks. - #---------------------------------------------------------------------------- assign_to: Encargar a assigned_tab: Encargadas assigned_tasks: Tareas encargadas @@ -439,46 +411,43 @@ completed_tasks: Tareas completadas create_task: Crear tarea create_task_small: crear una nueva tarea - due: Fecha límite + due: Fecha límite feel_free: Puede move_to: mover a - no_tasks: "No tiene tareas %{value}" - no_tasks_pending: pending # TODO - no_tasks_assigned: assigned # TODO - no_tasks_completed: completed # TODO + no_tasks: No tiene tareas %{value} + no_tasks_pending: pending + no_tasks_assigned: assigned + no_tasks_completed: completed pending_tab: Pendientes pending_tasks: Tareas Pendientes - related: 're:' + related: ! 're:' save_task: Guardar Tarea task_assigned: La tarea ha sido encargada a %{value} task_assigned_to: y encargada a %{value} task_completed: completada - task_completed_ago: completada hace %{value} + task_completed_ago: completada hace %{value} task_completed_by: completada %{time_ago} por %{user} task_created: La tarea ha sido creada - task_due_in: finalización prevista en %{value} + task_due_in: finalización prevista en %{value} task_due_later: finaliza pronto task_due_now: finaliza ahora task_due_today: finaliza hoy - task_from: De %{value} + task_from: De %{value} task_overdue: fuera de plazo, finalizaba el task_pending: La tarea se ha movido a tareas pendientes task_small: tarea tasks: Tareas - total_tasks: "Total %{value}" + total_tasks: Total %{value} view_assigned_tasks: ver las tareas encargadas view_pending_tasks: ver las tareas pendientes - - # Views -> Home. - #---------------------------------------------------------------------------- action_commented: añadió nota a action_completed: completó action_created: creó action_deleted: eliminó - action_email: exchanged emails with # TODO + action_email: exchanged emails with action_reassigned: reasignó action_rejected: rechazó - action_rescheduled: modificó fecha de finalización de + action_rescheduled: modificó fecha de finalización de action_updated: actualizó action_viewed: vió action_won: conseguida @@ -491,31 +460,28 @@ subject_lead: iniciativa subject_opportunity: oportunidad subject_task: tarea - - # Views -> Common. - #---------------------------------------------------------------------------- add_note: Añadir Nota save_note: Guardar Nota add_note_help: Añadir una nueva nota... - edit_note: Editar Nota + edit_note: Editar Nota added_ago: añadida hace %{value} - added_by: añadida hace %{time_ago} por %{user} + added_by: añadida hace %{time_ago} por %{user} back: atrás cancel: Cancelar close_form: cerrar formulario confirm_delete: ¿Está seguro de que quiere eliminar éste %{value}? copy_permissions: Copiar %{value} permisos - could_not_find: "No se encontraron %{value}." - could_not_find_matching: "No se pudo encontrar coincidencia con %{value}" + could_not_find: No se encontraron %{value}. + could_not_find_matching: No se pudo encontrar coincidencia con %{value} create_new: Crear select_existing: seleccione existentes delete: Eliminar - discard: Discard # TODO + discard: Discard edit: Editar - items_total: 'total %{count}.' - less: Less... # TODO + items_total: total %{count}. + less: Less... me: mí - more: More... # TODO + more: More... n_a: N/A name: Nombre no_match: No coincidencia con %{value} @@ -525,21 +491,19 @@ please_retry: Por favor, pruebe con otra consulta recent_items: Elementos recientes search_assets: Buscar %{value} - time_ago: "hace %{value}" + time_ago: hace %{value} background_info: Información relevante address: Dirección city: Ciudad zipcode: Código postal state: Estado/Región - country: País - - # Views -> Layout. - #---------------------------------------------------------------------------- + country: País about: Sobre about_dev_group: Grupo de debate para programadores about_features: Funciones y errores about_ffc: Sobre Fat Free CRM - about_ffc_resources: Recursos de Fat Free CRM (los enlaces se abren en una ventana nueva) + about_ffc_resources: Recursos de Fat Free CRM (los enlaces se abren en una ventana + nueva) about_ffc_version: Versión Fat Free CRM about_home_page: Página del producto about_project_page: Página del proyecto @@ -550,31 +514,19 @@ logout: Cerrar sesión quick_find: Búsqueda rápida welcome: Bienvenido/a - - # Views -> Comments. - #---------------------------------------------------------------------------- edit_comment: Nota modificada show: Mostrar update: Actualizar - - # Views -> Passwords. - #---------------------------------------------------------------------------- confirm_password_intro: Por favor, introduzca su nueva contraseña y confírmela. - password_intro: Por favor, introduzca su dirección de correo electrónico y se le enviarán las instruciones para restaurar su contraseña. + password_intro: Por favor, introduzca su dirección de correo electrónico y se le + enviarán las instruciones para restaurar su contraseña. reset_password: Restaurar contraseña update_password_and_login: Modificar contraseña y nombre de usuario - - # Views -> Admin - #---------------------------------------------------------------------------- - # TODO back_to_crm: Back to Fat Free CRM crm_admin_page: Fat Free CRM Administration - - # Views -> Admin -> Users. - #---------------------------------------------------------------------------- approve: Aprobar create_user: Crear usuario - last_seen: visto por última vez hace %{value} + last_seen: visto por última vez hace %{value} personal_information: Información personal reactivate: Reactivar save_user: Guardar Usuario @@ -582,55 +534,45 @@ user_active: Activar user_admin: Admin user_awaits_approval: pendiente de aprobación - user_confirm_delete: Sólo se puede eliminar un usuario si no tiene recursos relacionados pendientes. + user_confirm_delete: Sólo se puede eliminar un usuario si no tiene recursos relacionados + pendientes. user_is_admin: El usuario es el Administrador - user_never_logged_in: "hasn't logged in yet" + user_never_logged_in: hasn't logged in yet user_signed_up: Registrado user_signed_up_on: registrado el %{value} user_since: usuario desde %{value} user_suspended: Suspendido user_suspended_on: suspendido el %{value} users: Usuarios - users_small: usuarios - - # Dropbox. - #---------------------------------------------------------------------------- dropbox_notification_subject: dropbox - Añadido email - %{subject} dropbox_notification_intro: Se ha añadido el email que envió al dropbox dropbox_notification_to: Añadido a subject: Asunto body: Cuerpo - - # Pluralizations. - #---------------------------------------------------------------------------- pluralize: comment: - one: '1 comment' # TODO - other: '%{count} comments' # TODO - contact: - one: '1 contacto' - other: '%{count} contactos' + one: 1 comment + other: ! '%{count} comments' + contact: + one: 1 contacto + other: ! '%{count} contactos' opportunity: - one: '1 opportunidad' - other: '%{count} opportunidades' + one: 1 opportunidad + other: ! '%{count} opportunidades' lead: - one: '1 iniciativa' - other: '%{count} iniciativas' + one: 1 iniciativa + other: ! '%{count} iniciativas' day: - one: '1 día' - other: '%{count} días' + one: 1 día + other: ! '%{count} días' login: - one: '1 conexión' - other: '%{count} conexiones' - - # Custom date/time formats. - #---------------------------------------------------------------------------- + one: 1 conexión + other: ! '%{count} conexiones' date: formats: - mmddyyyy: "%m/%d/%Y" - mmdd: "%b %e" - mmddyy: "%b %e, %Y" - + mmddyyyy: ! '%m/%d/%Y' + mmdd: ! '%b %e' + mmddyy: ! '%b %e, %Y' time: formats: - mmddhhss: "%b %e at %l:%M%p" + mmddhhss: ! '%b %e at %l:%M%p' diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 50157f9286..8ddc4b85f1 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -1,187 +1,224 @@ -# French translations for Ruby on Rails -# by Christian Lescuyer (christian@flyingcoders.com) -# contributors: -# - Sebastien Grosjean - ZenCocoon.com -# - Bruno Michel - http://github.com/nono -# - Tsutomu Kuroda - http://github.com/kuroda (t-kuroda@oiax.jp) -# -# French Canadian adjustments -# by Serafim Junior Dos Santos Fagundes - +--- fr-CA: date: formats: - default: "%Y-%m-%d" - short: "%y-%m-%d" - long: "%d %B %Y" - day_names: [dimanche, lundi, mardi, mercredi, jeudi, vendredi, samedi] - abbr_day_names: [dim, lun, mar, mer, jeu, ven, sam] - month_names: [~, janvier, février, mars, avril, mai, juin, juillet, août, septembre, octobre, novembre, décembre] - abbr_month_names: [~, jan., fév., mar., avr., mai, juin, juil., août, sept., oct., nov., déc.] + default: ! '%Y-%m-%d' + short: ! '%y-%m-%d' + long: ! '%d %B %Y' + day_names: + - dimanche + - lundi + - mardi + - mercredi + - jeudi + - vendredi + - samedi + abbr_day_names: + - dim + - lun + - mar + - mer + - jeu + - ven + - sam + month_names: + - + - janvier + - février + - mars + - avril + - mai + - juin + - juillet + - août + - septembre + - octobre + - novembre + - décembre + abbr_month_names: + - + - jan. + - fév. + - mar. + - avr. + - mai + - juin + - juil. + - août + - sept. + - oct. + - nov. + - déc. order: - - :year - - :month - - :day - + - :year + - :month + - :day time: formats: - default: "%H:%M:%S" - short: "%H:%M" - long: "%A %d %B %Y %H:%M" - am: 'am' - pm: 'pm' - + default: ! '%H:%M:%S' + short: ! '%H:%M' + long: ! '%A %d %B %Y %H:%M' + am: am + pm: pm datetime: distance_in_words: - half_a_minute: "une demi-minute" + half_a_minute: une demi-minute less_than_x_seconds: - zero: "moins d'une seconde" - one: "moins d'une seconde" - other: "moins de %{count} secondes" + zero: moins d'une seconde + one: moins d'une seconde + other: moins de %{count} secondes x_seconds: - one: "1 seconde" - other: "%{count} secondes" + one: 1 seconde + other: ! '%{count} secondes' less_than_x_minutes: - zero: "moins d'une minute" - one: "moins d'une minute" - other: "moins de %{count} minutes" + zero: moins d'une minute + one: moins d'une minute + other: moins de %{count} minutes x_minutes: - one: "1 minute" - other: "%{count} minutes" + one: 1 minute + other: ! '%{count} minutes' about_x_hours: - one: "environ une heure" - other: "environ %{count} heures" + one: environ une heure + other: environ %{count} heures x_days: - one: "1 jour" - other: "%{count} jours" + one: 1 jour + other: ! '%{count} jours' about_x_months: - one: "environ un mois" - other: "environ %{count} mois" + one: environ un mois + other: environ %{count} mois x_months: - one: "1 mois" - other: "%{count} mois" + one: 1 mois + other: ! '%{count} mois' about_x_years: - one: "environ un an" - other: "environ %{count} ans" + one: environ un an + other: environ %{count} ans over_x_years: - one: "plus d'un an" - other: "plus de %{count} ans" + one: plus d'un an + other: plus de %{count} ans almost_x_years: - one: "presqu'un an" - other: "presque %{count} ans" + one: presqu'un an + other: presque %{count} ans prompts: - year: "Année" - month: "Mois" - day: "Jour" - hour: "Heure" - minute: "Minute" - second: "Seconde" - + year: Année + month: Mois + day: Jour + hour: Heure + minute: Minute + second: Seconde number: format: - separator: "," - delimiter: " " + separator: ! ',' + delimiter: ! ' ' precision: 3 significant: false strip_insignificant_zeros: false currency: format: - format: "%n %u" - unit: "$" - separator: "," - delimiter: " " + format: ! '%n %u' + unit: $ + separator: ! ',' + delimiter: ! ' ' precision: 2 significant: false strip_insignificant_zeros: false percentage: format: - delimiter: "" + delimiter: '' precision: format: - delimiter: "" + delimiter: '' human: format: - delimiter: "" + delimiter: '' precision: 2 significant: true strip_insignificant_zeros: true storage_units: - format: "%n %u" + format: ! '%n %u' units: byte: - one: "Octet" - other: "Octets" - kb: "ko" - mb: "Mo" - gb: "Go" - tb: "To" + one: Octet + other: Octets + kb: ko + mb: Mo + gb: Go + tb: To decimal_units: - format: "%n %u" + format: ! '%n %u' units: - unit: "" - thousand: "Millier" - million: "Million" - billion: "Milliard" - trillion: "Mille milliard" - quadrillion: "Million de milliards" - + unit: '' + thousand: Millier + million: Million + billion: Milliard + trillion: Mille milliard + quadrillion: Million de milliards support: array: - words_connector: ", " - two_words_connector: " et " - last_word_connector: " et " + words_connector: ! ', ' + two_words_connector: ! ' et ' + last_word_connector: ! ' et ' select: - prompt: "Veuillez sélectionner" - + prompt: Veuillez sélectionner helpers: select: - prompt: "Veuillez sélectionner" + prompt: Veuillez sélectionner submit: - create: "Créer un %{model}" - update: "Modifier ce %{model}" - submit: "Enregistrer ce %{model}" - + create: Créer un %{model} + update: Modifier ce %{model} + submit: Enregistrer ce %{model} errors: - template: &errors_template - header: - one: "Impossible d'enregistrer ce %{model} : 1 erreur" - other: "Impossible d'enregistrer ce %{model} : %{count} erreurs" - body: "Veuillez vérifier les champs suivants : " - + format: Le %{attribute} %{message} + messages: + inclusion: n'est pas inclus(e) dans la liste + exclusion: n'est pas disponible + invalid: n'est pas valide + confirmation: ne concorde pas avec la confirmation + accepted: doit être accepté(e) + empty: doit être rempli(e) + blank: doit être rempli(e) + too_long: est trop long (pas plus de %{count} caractères) + too_short: est trop court (au moins %{count} caractères) + wrong_length: ne fait pas la bonne longueur (doit comporter %{count} caractères) + not_a_number: n'est pas un nombre + not_an_integer: doit être un nombre entier + greater_than: doit être supérieur à %{count} + greater_than_or_equal_to: doit être supérieur ou égal à %{count} + equal_to: doit être égal à %{count} + less_than: doit être inférieur à %{count} + less_than_or_equal_to: doit être inférieur ou égal à %{count} + odd: doit être impair + even: doit être pair attributes: - created_at: "Créé le" - updated_at: "Modifié le" - - errors: - format: "Le %{attribute} %{message}" - messages: &errors_messages - inclusion: "n'est pas inclus(e) dans la liste" - exclusion: "n'est pas disponible" - invalid: "n'est pas valide" - confirmation: "ne concorde pas avec la confirmation" - accepted: "doit être accepté(e)" - empty: "doit être rempli(e)" - blank: "doit être rempli(e)" - too_long: "est trop long (pas plus de %{count} caractères)" - too_short: "est trop court (au moins %{count} caractères)" - wrong_length: "ne fait pas la bonne longueur (doit comporter %{count} caractères)" - not_a_number: "n'est pas un nombre" - not_an_integer: "doit être un nombre entier" - greater_than: "doit être supérieur à %{count}" - greater_than_or_equal_to: "doit être supérieur ou égal à %{count}" - equal_to: "doit être égal à %{count}" - less_than: "doit être inférieur à %{count}" - less_than_or_equal_to: "doit être inférieur ou égal à %{count}" - odd: "doit être impair" - even: "doit être pair" - + created_at: Créé le + updated_at: Modifié le activerecord: errors: messages: - taken: "n'est pas disponible" - record_invalid: "La validation a échoué : %{errors}" - <<: *errors_messages + inclusion: n'est pas inclus(e) dans la liste + exclusion: n'est pas disponible + invalid: n'est pas valide + confirmation: ne concorde pas avec la confirmation + accepted: doit être accepté(e) + empty: doit être rempli(e) + blank: doit être rempli(e) + too_long: est trop long (pas plus de %{count} caractères) + too_short: est trop court (au moins %{count} caractères) + wrong_length: ne fait pas la bonne longueur (doit comporter %{count} caractères) + not_a_number: n'est pas un nombre + not_an_integer: doit être un nombre entier + greater_than: doit être supérieur à %{count} + greater_than_or_equal_to: doit être supérieur ou égal à %{count} + equal_to: doit être égal à %{count} + less_than: doit être inférieur à %{count} + less_than_or_equal_to: doit être inférieur ou égal à %{count} + odd: doit être impair + even: doit être pair + taken: n'est pas disponible + record_invalid: ! 'La validation a échoué : %{errors}' template: - <<: *errors_template + header: + one: ! 'Impossible d''enregistrer ce %{model} : 1 erreur' + other: ! 'Impossible d''enregistrer ce %{model} : %{count} erreurs' + body: ! 'Veuillez vérifier les champs suivants : ' full_messages: - format: "%{attribute} %{message}" + format: ! '%{attribute} %{message}' diff --git a/config/locales/fr-CA_fat_free_crm.yml b/config/locales/fr-CA_fat_free_crm.yml index 3d377d72ab..a761c03778 100644 --- a/config/locales/fr-CA_fat_free_crm.yml +++ b/config/locales/fr-CA_fat_free_crm.yml @@ -5,46 +5,37 @@ # French Canadian adjustments # by Serafim Junior Dos Santos Fagundes +--- fr-CA: language: Français (Canadien) - - # Generic terms. - #---------------------------------------------------------------------------- all: Tous at: à here: ici - no_button: 'Non' + no_button: Non not_implemented: Pas encore implémenté. or: ou - select_none: '-- Aucun --' - select_blank: '-- Selectionnez --' - yes_button: 'Oui' - - # Settings. - #---------------------------------------------------------------------------- + select_none: -- Aucun -- + select_blank: -- Selectionnez -- + yes_button: Oui tab_dashboard: Résumé - tab_tasks: Tâches + tab_tasks: Tâches tab_campaigns: Campagnes tab_leads: Pistes tab_accounts: Comptes tab_contacts: Contacts tab_opportunities: Opportunités - admin_tab_users: Utilisateurs admin_tab_settings: Paramètres admin_tab_plugins: Plugins - planned: Planifié started: Démarré on_hold: En attente completed: Complétée called_off: Abandonné - new: Nouveau contacted: Contacté converted: Converti rejected: Rejeté - cold_call: Appel entrant conference: Conférence online: Online Marketing @@ -53,7 +44,6 @@ fr-CA: web: Website word_of_mouth: Bouche à oreille other: Autre - prospecting: Prospection analysis: Analyse presentation: Présentation @@ -62,7 +52,6 @@ fr-CA: final_review: Examen final won: Clôturé/Gagné lost: Clôture/Perdu - call: Appel email: E-mail follow_up: Relance @@ -70,138 +59,125 @@ fr-CA: meeting: Réunion money: Argent trip: Voyage - overdue: Délai expiré due_asap: Dès que possible - due_today: "Aujourd'hui" + due_today: Aujourd'hui due_tomorrow: Demain due_this_week: Cette semaine due_next_week: La semaine prochaine due_later: Plus tard due_specific_date: A date précise... - - completed_today: "Ajourd'hui" + completed_today: Ajourd'hui completed_yesterday: Hier completed_last_week: La semaine dernière completed_this_month: Ce mois completed_last_month: Le mois dernier - - # Models/Activity. - #---------------------------------------------------------------------------- one_hour: Une heure one_day: Un jour two_days: Deux jours one_week: Une semaine two_weeks: Deux semaines one_month: Un mois - - # Model Validations. - #---------------------------------------------------------------------------- activerecord: errors: models: authentication: attributes: login_field: - is_not_valid: "n'est pas valide" + is_not_valid: n'est pas valide password_field: - is_not_valid: "n'est pas valide" + is_not_valid: n'est pas valide account: attributes: name: - missing_account_name: "^Vérifiez le nom de compte." + missing_account_name: ^Vérifiez le nom de compte. access: - share_account: "^Spécifiez un utilisateur avec qui partager le compte." + share_account: ^Spécifiez un utilisateur avec qui partager le compte. campaign: attributes: name: - missing_campaign_name: "^Précisez un nom de campagne." + missing_campaign_name: ^Précisez un nom de campagne. ends_on: - dates_not_in_sequence: "^Vérifiez que la date de fin de campagne soit avant la date de début." + dates_not_in_sequence: ^Vérifiez que la date de fin de campagne soit + avant la date de début. access: - share_campaign: "^Préciser un utilisateur avec qui partager la campagne." + share_campaign: ^Préciser un utilisateur avec qui partager la campagne. contact: attributes: first_name: - missing_first_name: "^Précisez le prénom" + missing_first_name: ^Précisez le prénom last_name: - missing_last_name: "^Précisez le nom." + missing_last_name: ^Précisez le nom. access: - share_contact: "^Précisez avec quel utilisateur partager le contact." + share_contact: ^Précisez avec quel utilisateur partager le contact. lead: attributes: first_name: - missing_first_name: "^Précisez le prénom" + missing_first_name: ^Précisez le prénom last_name: - missing_last_name: "^Précisez le nom." + missing_last_name: ^Précisez le nom. access: - share_lead: "^Précisez avec quel utilisateur partager la piste." + share_lead: ^Précisez avec quel utilisateur partager la piste. opportunity: attributes: name: - missing_opportunity_name: "^Spécifiez un nom d'opportunité." + missing_opportunity_name: ^Spécifiez un nom d'opportunité. access: - share_opportunity: "^Précisez avec quel utilisateur partager l'opportunité." + share_opportunity: ^Précisez avec quel utilisateur partager l'opportunité. task: attributes: name: - missing_task_name: "^Précisez le nom de la tâche." + missing_task_name: ^Précisez le nom de la tâche. calendar: - invalid_date: "^Précisez une date valide" + invalid_date: ^Précisez une date valide user: attributes: username: - missing_username: "^Précisez un nom d'utilisateur." - username_taken: "^Ce nom d'utilisateur est déjà pris" + missing_username: ^Précisez un nom d'utilisateur. + username_taken: ^Ce nom d'utilisateur est déjà pris email: - missing_email: "^Précisez une adresse e-mail" - email_in_use: "^Un utilisateur existe déjà avec cette adresse." - - # dynamic_form plugin translations. - #---------------------------------------------------------------------------- + missing_email: ^Précisez une adresse e-mail + email_in_use: ^Un utilisateur existe déjà avec cette adresse. errors: template: header: - one: "Impossible d'enregistrer ce %{model} : 1 erreur" - other: "Impossible d'enregistrer ce %{model} : %{count} erreurs" - body: "Veuillez vérifier les champs suivants : " - + one: ! 'Impossible d''enregistrer ce %{model} : 1 erreur' + other: ! 'Impossible d''enregistrer ce %{model} : %{count} erreurs' + body: ! 'Veuillez vérifier les champs suivants : ' msg_account_suspended: Ce compte utilisateur a été suspendu. password_reset_instruction: instruction de reinitialisation du mot de passe - - # Controllers. - #---------------------------------------------------------------------------- - msg_account_created: "Votre compte a été créé, il est en attente d'approbation par l'administrateur" - msg_account_not_approved: "Votre compte n'à pas encore été approuvé" - msg_asset_deleted: "%{value} à été supprimé" - msg_asset_not_available: "Ce %{value} n'est plus disponible." - msg_asset_not_authorized: You are not authorized to view this %{value}. # TODO - msg_assets_not_available: "Les %{value} ne sont pas disponibles." - msg_asset_rejected: "%{value} à été rejetée." - msg_bad_image_file: "^Nous n'avons pu télécharger ou redimensionner votre image." - msg_cant_create_related: "Impossible de crée le %{asset} puisque le %{related} n'est plus disponnible." - msg_cant_delete_user: "^Impossible de supprimer car %{value} a des objets présents." - msg_cant_do: "Impossible de %{action} le %{asset} puisqu'il n'est plus disponible." - msg_email_not_found: "Aucun utilisateur ne correspond a cette adresse" + msg_account_created: Votre compte a été créé, il est en attente d'approbation par + l'administrateur + msg_account_not_approved: Votre compte n'à pas encore été approuvé + msg_asset_deleted: ! '%{value} à été supprimé' + msg_asset_not_available: Ce %{value} n'est plus disponible. + msg_asset_not_authorized: You are not authorized to view this %{value}. + msg_assets_not_available: Les %{value} ne sont pas disponibles. + msg_asset_rejected: ! '%{value} à été rejetée.' + msg_bad_image_file: ^Nous n'avons pu télécharger ou redimensionner votre image. + msg_cant_create_related: Impossible de crée le %{asset} puisque le %{related} n'est + plus disponnible. + msg_cant_delete_user: ^Impossible de supprimer car %{value} a des objets présents. + msg_cant_do: Impossible de %{action} le %{asset} puisqu'il n'est plus disponible. + msg_email_not_found: Aucun utilisateur ne correspond a cette adresse msg_enter_new_password: Saisissez votre nouveau mot de passe. - msg_goodbye: "Vous avez été déconnecté, merci d'utiliser Fat Free CRM!" - msg_invalid_password: "^Saisissez votre mot de passe actuel" + msg_goodbye: Vous avez été déconnecté, merci d'utiliser Fat Free CRM! + msg_invalid_password: ^Saisissez votre mot de passe actuel msg_invalig_login: Utilisateur ou mot de passe non valide. - msg_last_login: "Votre dernière connection était le %{value}." + msg_last_login: Votre dernière connection était le %{value}. msg_login_needed: Vous devez être connecté pour accéder a cette page. msg_logout_needed: Vous devez être déconnecté pour accéder a cette page. - msg_password_changed: "Votre mot de passe a été modifié" - msg_password_not_changed: "Votre mot de passe n'a pas été modifié" + msg_password_changed: Votre mot de passe a été modifié + msg_password_not_changed: Votre mot de passe n'a pas été modifié msg_password_updated: Modification de mot de passe réussie. - msg_pwd_instructions_sent: "Les instruction de modification de mot de passe vous on été envoyées. Vérifiez vos e-mails" - msg_require_admin: Vous devez être administrateur pour accéder a cette page + msg_pwd_instructions_sent: Les instruction de modification de mot de passe vous + on été envoyées. Vérifiez vos e-mails + msg_require_admin: Vous devez être administrateur pour accéder a cette page msg_successful_signup: Enregistrement réussi. Bienvenu dans Fat Free CRM - msg_welcome: Bienvenu dans Fat Free CRM - - # Options. - #---------------------------------------------------------------------------- - "option_amount*probability": Montant pondéré - activity_options: Voir les actions %{models} effectuées par %{user} dans les derniers %{period}. + msg_welcome: Bienvenu dans Fat Free CRM + option_amount*probability: Montant pondéré + activity_options: Voir les actions %{models} effectuées par %{user} dans les derniers + %{period}. all_users: tous les utilisateurs option_after: après option_all: tous @@ -225,12 +201,10 @@ fr-CA: option_target_leads: pistes cibles option_target_revenue: revenus cibles option_updated_at: date de modification - show_per_page: Voir %{number} %{models} par page au format %{fmt}. + show_per_page: Voir %{number} %{models} par page au format %{fmt}. sort_by: Trier %{models} par %{field}. - sort_by_displaying: Trier %{models} par %{field} afficher le prénom %{position} le nom. - - # Views -> Profile. - #---------------------------------------------------------------------------- + sort_by_displaying: Trier %{models} par %{field} afficher le prénom %{position} + le nom. aim: AOL IM already_signed_up: Déjà enregistré? alt_email: e-mail secondaire @@ -240,12 +214,12 @@ fr-CA: contact_info: Informations de contact current_password: Mot de passe actuel edit_profile: Modifier le profile - # email: E-mail # <-- Already defined as the task type if Settings. first_name: Prénom google: Google IM gravatar_help: Vous ne connaissez pas Gravatar? Informations sur Gravatar image_file: Fichier image - image_help: "L'image que vous envoyez sera redimensionnée à 75 x 75 pixels. Les formats supportés sont GIF, JPEG et PNG." + image_help: L'image que vous envoyez sera redimensionnée à 75 x 75 pixels. Les formats + supportés sont GIF, JPEG et PNG. job_title: Titre/Fonction last_name: Nom login_now_link: Connectez vous maintenant! @@ -264,19 +238,13 @@ fr-CA: upload_picture: Envoyez une image use_gravatar: Utilisez Gravatar user: Utilisateur - username: "Nom d'utilisateur" + username: Nom d'utilisateur yahoo: Yahoo IM - - # Views -> Authenticate. - #---------------------------------------------------------------------------- forgot_password: Mot de passe oublié login: Connection no_account: Vous ne possédez pas de compte? remember_me: Se souvenir de moi - sign_up_now: "S'enregistrer maintenant!" - - # Views -> Accounts. - #---------------------------------------------------------------------------- + sign_up_now: S'enregistrer maintenant! account: Compte account_small: compte accounts: Comptes @@ -300,9 +268,6 @@ fr-CA: share_with: Partager avec les personnes suivantes shipping_address: Adresse de livraison website: Site Web - - # Views -> Campaigns. - #---------------------------------------------------------------------------- actual: Actuel actual_performance: Performance Actuelle budget: Budget @@ -317,7 +282,7 @@ fr-CA: campaigns_small: campagnes conversion: Conversion conversion_label: Conversion (%) - conversion_number: "%{value} conversion" + conversion_number: ! '%{value} conversion' create_campaign: Créer une Campagne end_date: Date de fin finished_on: terminé le %{value} @@ -325,23 +290,22 @@ fr-CA: no_start_date: pas de date de début spécifiée number_of_leads: Nombre de pistes objectives: Objectifs - objectives_help: "Spécifiez un objectif en nombre de pistes, taux de conversion de pistes/opportunités, revenu espéré et budget. Ces valeurs seront utilisées lors de l'évaluation des performances de la campagne" + objectives_help: Spécifiez un objectif en nombre de pistes, taux de conversion de + pistes/opportunités, revenu espéré et budget. Ces valeurs seront utilisées lors + de l'évaluation des performances de la campagne objectives_small: objectifs de la campagne revenue: Revenu revenue_label: Revenu ($) - revenue_number: "%{value} pour revenu" + revenue_number: ! '%{value} pour revenu' save_campaign: Enregistrer la campagne start_date: Date de début started_ago: démarré il y a %{value} starts_in: démarré dans %{value} - starts_today: "démarre aujourd'hui!" + starts_today: démarre aujourd'hui! target: Cible total_campaigns: Total des Campagnes was_supposed_to_finish: présumée se terminer le %{value} was_supposed_to_start: était supposée démarrer il y a %{time_ago} le %{start_date} - - # Views -> Contacts. - #---------------------------------------------------------------------------- address: Adresse alt_email_small: Autre blog: Site Web/Blog @@ -352,37 +316,47 @@ fr-CA: contacts_small: contacts create_contact: Créer un Contact department: Département - department_small: 'département %{value} ' + department_small: ! 'département %{value} ' do_not_call: ne pas appeler extra_info: Informations supplémentaires extra_info_small: contact supplémentaire facebook: Facebook linked_in: LinkedIn myself: Moi-même - permissions_intro_private: Par défaut vous seul aurez accès à %{value}. Vous pouvez modifier les permissions ultérieurement. - permissions_intro_public: Par défaut tous les utilisateurs auront accès à %{value}. Vous pouvez modifier les permissions ultérieurement. - permissions_intro_shared: Par défaut seul les utilisateurs sélectionnés auront accès à %{value}. Vous pouvez modifier les permissions ultérieurement. + permissions_intro_private: Par défaut vous seul aurez accès à %{value}. Vous pouvez + modifier les permissions ultérieurement. + permissions_intro_public: Par défaut tous les utilisateurs auront accès à %{value}. + Vous pouvez modifier les permissions ultérieurement. + permissions_intro_shared: Par défaut seul les utilisateurs sélectionnés auront accès + à %{value}. Vous pouvez modifier les permissions ultérieurement. referred_by: Référencé par referred_by_small: référence par save_contact: Enregistrer le contact twitter: Twitter - web_presence: Présence Web - web_presence_small: présence web - works_at: "%{job_title} chez %{company}" - - # Views -> Leads. - #---------------------------------------------------------------------------- + web_presence: Présence Web + web_presence_small: présence web + works_at: ! '%{job_title} chez %{company}' convert: Convertir convert_lead: Convertir la piste - convert_lead_permissions_intro: Les permissions du contact seront dupliquées depuis la piste. Vous pouvez modifier les permissions du contact ultérieurement. - convert_lead_text: En convertissant la piste %{value} il/elle deviendras un contact associé a un compte existant ou nouvellement créé. Le statut de la piste sera automatiquement positionné à converti. + convert_lead_permissions_intro: Les permissions du contact seront dupliquées depuis + la piste. Vous pouvez modifier les permissions du contact ultérieurement. + convert_lead_text: En convertissant la piste %{value} il/elle deviendras un contact + associé a un compte existant ou nouvellement créé. Le statut de la piste sera + automatiquement positionné à converti. create_lead: Créer une piste - create_opp_for_contact: "Vous pouvez éventuellement créer une opportunité pour le contact %{value} en spécifiant le nom, l'étape courante, la date de clôture estimée, la probabilité de vente, le montant de l'affaire, la remise offerte." + create_opp_for_contact: Vous pouvez éventuellement créer une opportunité pour le + contact %{value} en spécifiant le nom, l'étape courante, la date de clôture estimée, + la probabilité de vente, le montant de l'affaire, la remise offerte. lead: Piste lead_info_small: contact de la piste - lead_permissions_intro_private: Par défaut les permissions seront dupliquée depuis la campagne ou positionnées sur privé. Vous pouvez modifier les permissions ultérieurement. - lead_permissions_intro_public: Par défaut les permissions seront dupliquée depuis la campagne ou positionnées sur publique. Vous pouvez modifier les permissions ultérieurement. - lead_permissions_intro_shared: Par défaut les permissions seront dupliquée depuis la campagne ou partagées avec les utilisateurs spécifiés. Vous pouvez modifier les permissions ultérieurement. + lead_permissions_intro_private: Par défaut les permissions seront dupliquée depuis + la campagne ou positionnées sur privé. Vous pouvez modifier les permissions ultérieurement. + lead_permissions_intro_public: Par défaut les permissions seront dupliquée depuis + la campagne ou positionnées sur publique. Vous pouvez modifier les permissions + ultérieurement. + lead_permissions_intro_shared: Par défaut les permissions seront dupliquée depuis + la campagne ou partagées avec les utilisateurs spécifiés. Vous pouvez modifier + les permissions ultérieurement. lead_small: piste lead_status_small: statut de la piste lead_summary: Résumé de la piste @@ -397,13 +371,10 @@ fr-CA: source: Source status: Statut total_leads: Total des pistes - - # Views -> Opportunities. - #---------------------------------------------------------------------------- amount: Montant close_date: Date de clôture closed_ago_on: clôturé il y à%{time_ago} le %{date} - closes_today: "doit être clôturé aujourd'hui!" + closes_today: doit être clôturé aujourd'hui! closing_date: la date de clôture est %{value} create_opportunity: Créer une opportunité currency: ($) @@ -421,17 +392,15 @@ fr-CA: opportunity: Opportunité opportunity_small: opportunité opportunity_summary: Opportunité At a Glance - opportunity_summary_text: "%{amount} avec %{discount} de remise et %{probability} de probabilité" - past_due: en retard, devais être clôturé il y a %{value}. + opportunity_summary_text: ! '%{amount} avec %{discount} de remise et %{probability} + de probabilité' + past_due: en retard, devais être clôturé il y a %{value}. probability: Probabilité probability_number: et %{value} de probabilité - save_opportunity: "Enregistrer l'opportunité" + save_opportunity: Enregistrer l'opportunité stage: Etape total_opportunities: Total des opportunités weighted_amount: Montant pondéré - - # Views -> Tasks. - #---------------------------------------------------------------------------- assign_to: Assigner à assigned_tab: Assigné assigned_tasks: Tâches assignées @@ -443,13 +412,13 @@ fr-CA: due: A faire feel_free: N'hésitez pas à move_to: aller à - no_tasks: "Vous n'avez aucune tâche %{value} " + no_tasks: ! 'Vous n''avez aucune tâche %{value} ' no_tasks_pending: en attente no_tasks_assigned: assignée no_tasks_completed: complétée pending_tab: En attente pending_tasks: Taches en attente - related: 're:' + related: ! 're:' save_task: Enregistrer la tâche task_assigned: La tâche à été assignée à %{value} task_assigned_to: et assignée à %{value} @@ -460,7 +429,7 @@ fr-CA: task_due_in: échéance dans %{value} task_due_later: a faire bientôt task_due_now: échoit maintenant - task_due_today: "échoit aujourd'hui" + task_due_today: échoit aujourd'hui task_from: De %{value} task_overdue: en retard, échoyait le task_pending: La tâche à été mise en attente. @@ -469,9 +438,6 @@ fr-CA: total_tasks: Total %{value} view_assigned_tasks: voir les tâches assignées view_pending_tasks: voir les tâches en attente - - # Views -> Home. - #---------------------------------------------------------------------------- action_commented: commenté le action_completed: Complété action_created: créé @@ -492,138 +458,112 @@ fr-CA: subject_lead: piste subject_opportunity: opportunité subject_task: tache - - # Views -> Common. - #---------------------------------------------------------------------------- add_note: Ajouter une note save_note: Enregistrer la note add_note_help: Ajouter une nouvelle note... added_ago: ajoutée il y à %{value} - added_by: ajoutée il y à %{time_ago} par %{user} + added_by: ajoutée il y à %{time_ago} par %{user} back: Retour cancel: Annuler close_form: Fermer le formulaire - confirm_delete: "Êtes-vous certain de vouloir supprimer ceci : %{value}?" - copy_permissions: Copier les permissions de %{value} - could_not_find: "%{value} N'a pas été trouvé. N'hésitez pas à " - could_not_find_matching: "Aucun(e) %{value} n'a été trouvé correspondant à" + confirm_delete: ! 'Êtes-vous certain de vouloir supprimer ceci : %{value}?' + copy_permissions: Copier les permissions de %{value} + could_not_find: ! '%{value} N''a pas été trouvé. N''hésitez pas à ' + could_not_find_matching: Aucun(e) %{value} n'a été trouvé correspondant à create_new: créer un(e) select_existing: sélectionnez delete: Supprimer discard: Rejeter edit: Modifier - items_total: '%{count} total.' + items_total: ! '%{count} total.' less: Moins... me: moi more: Plus... n_a: N/A name: Nom no_match: Acun(e) %{value} ne correspond - no_recent_items: "Il n'y rien de récent à afficher" + no_recent_items: Il n'y rien de récent à afficher options: Options permissions: Permissions please_retry: tentez une autre requête. recent_items: Objets récents search_assets: Recherche de %{value} - time_ago: "il y à %{value}" - - # Views -> Layout. - #---------------------------------------------------------------------------- + time_ago: il y à %{value} about: A propos about_dev_group: Groupe de discussion développeur about_features: Fonctionnalités et bugs about_ffc: A propos Fat Free CRM about_ffc_resources: Ressources Fat Free CRM (Nouvelle fenêtre) about_ffc_version: Fat Free CRM version - about_home_page: "Page d'accueil" + about_home_page: Page d'accueil about_project_page: Page du projet - about_thank_you: "Merci d'utiliser Fat Free CRM!" + about_thank_you: Merci d'utiliser Fat Free CRM! about_twitter: Twitter commit updates about_user_group: Discussion group for users admin: Admin logout: Déconnection quick_find: Recherche rapide welcome: Bienvenu - - # Views -> Comments. - #---------------------------------------------------------------------------- edit_comment: Edition de commentaire show: Voir update: Modifier - - # Views -> Passwords. - #---------------------------------------------------------------------------- confirm_password_intro: Saisissez votre nouveau mot de passe et sa confirmation. - password_intro: Précisez votre adresse e-mail, et les instructions pour les réinitialiser vous seront communiquées. + password_intro: Précisez votre adresse e-mail, et les instructions pour les réinitialiser + vous seront communiquées. reset_password: Ré-initialisation du mot de passe - update_password_and_login: "Modification de l'identifiant et du mot de passe" - - # Views -> Admin - #---------------------------------------------------------------------------- + update_password_and_login: Modification de l'identifiant et du mot de passe back_to_crm: Retour à Fat Free CRM crm_admin_page: Administration Fat Free CRM - - # Views -> Admin -> Users. - #---------------------------------------------------------------------------- approve: Approuver create_user: Créer un utilisateur last_seen: vu pour la dernière fois il y à %{value} personal_information: Informations personnelles reactivate: Réactiver - save_user: "Enregistrer l'utilisateur" + save_user: Enregistrer l'utilisateur suspend: Suspendre user_active: Actif user_admin: Admin user_awaits_approval: en attente de votre approbation - user_confirm_delete: Un utilisateur ne peut être supprimé que si aucun objet lui appartenant existent toujours. - user_is_admin: "L'utilisateur est administrateur" - user_never_logged_in: "ne s'est pas encore connecté" + user_confirm_delete: Un utilisateur ne peut être supprimé que si aucun objet lui + appartenant existent toujours. + user_is_admin: L'utilisateur est administrateur + user_never_logged_in: ne s'est pas encore connecté user_signed_up: Est enregistré - user_signed_up_on: "s'est enregistré le %{value}" + user_signed_up_on: s'est enregistré le %{value} user_since: utilisateur depuis %{value} user_suspended: Suspendu user_suspended_on: suspendu le %{value} users: Utilisateurs users_small: utilisateurs - - # Dropbox. - #---------------------------------------------------------------------------- dropbox_notification_subject: dropbox - Ajouté email - %{subject} dropbox_notification_intro: D'ajouter l'email que vous avez envoyé à la sélection dropbox_notification_to: Ajoutés aux subject: Sujet body: Corps - - # Pluralizations. - #---------------------------------------------------------------------------- pluralize: comment: - one: '1 comment' # TODO - other: '%{count} comments' # TODO - contact: - one: '1 contact' - other: '%{count} contacts' + one: 1 comment + other: ! '%{count} comments' + contact: + one: 1 contact + other: ! '%{count} contacts' opportunity: - one: '1 opportunité' - other: '%{count} opportunités' + one: 1 opportunité + other: ! '%{count} opportunités' lead: - one: '1 piste' - other: '%{count} pistes' + one: 1 piste + other: ! '%{count} pistes' day: - one: '1 jour' - other: '%{count} jours' + one: 1 jour + other: ! '%{count} jours' login: - one: '1 identifiant' - other: '%{count} identifiants' - - # Custom date/time formats. - #---------------------------------------------------------------------------- + one: 1 identifiant + other: ! '%{count} identifiants' date: formats: - mmddyyyy: "%d/%m/%Y" - mmdd: "%e %b" - mmddyy: "%e %b, %Y" - + mmddyyyy: ! '%d/%m/%Y' + mmdd: ! '%e %b' + mmddyy: ! '%e %b, %Y' time: formats: - mmddhhss: "%e %b à %l:%M%p" + mmddhhss: ! '%e %b à %l:%M%p' diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 643edc5cb9..f68bfecee1 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1,182 +1,227 @@ -# French translations for Ruby on Rails -# by Christian Lescuyer (christian@flyingcoders.com) -# contributors: -# - Sebastien Grosjean - ZenCocoon.com -# - Bruno Michel - http://github.com/nono -# - Tsutomu Kuroda - http://github.com/kuroda (t-kuroda@oiax.jp) - +--- fr: date: formats: - default: "%d/%m/%Y" - short: "%e %b" - long: "%e %B %Y" - day_names: [dimanche, lundi, mardi, mercredi, jeudi, vendredi, samedi] - abbr_day_names: [dim, lun, mar, mer, jeu, ven, sam] - month_names: [~, janvier, février, mars, avril, mai, juin, juillet, août, septembre, octobre, novembre, décembre] - abbr_month_names: [~, jan., fév., mar., avr., mai, juin, juil., août, sept., oct., nov., déc.] + default: ! '%d/%m/%Y' + short: ! '%e %b' + long: ! '%e %B %Y' + day_names: + - dimanche + - lundi + - mardi + - mercredi + - jeudi + - vendredi + - samedi + abbr_day_names: + - dim + - lun + - mar + - mer + - jeu + - ven + - sam + month_names: + - + - janvier + - février + - mars + - avril + - mai + - juin + - juillet + - août + - septembre + - octobre + - novembre + - décembre + abbr_month_names: + - + - jan. + - fév. + - mar. + - avr. + - mai + - juin + - juil. + - août + - sept. + - oct. + - nov. + - déc. order: - - :day - - :month - - :year - + - :day + - :month + - :year time: formats: - default: "%d %B %Y %H:%M:%S" - short: "%d %b %H:%M" - long: "%A %d %B %Y %H:%M" - am: 'am' - pm: 'pm' - + default: ! '%d %B %Y %H:%M:%S' + short: ! '%d %b %H:%M' + long: ! '%A %d %B %Y %H:%M' + am: am + pm: pm datetime: distance_in_words: - half_a_minute: "une demi-minute" + half_a_minute: une demi-minute less_than_x_seconds: - zero: "moins d'une seconde" - one: "moins d'une seconde" - other: "moins de %{count} secondes" + zero: moins d'une seconde + one: moins d'une seconde + other: moins de %{count} secondes x_seconds: - one: "1 seconde" - other: "%{count} secondes" + one: 1 seconde + other: ! '%{count} secondes' less_than_x_minutes: - zero: "moins d'une minute" - one: "moins d'une minute" - other: "moins de %{count} minutes" + zero: moins d'une minute + one: moins d'une minute + other: moins de %{count} minutes x_minutes: - one: "1 minute" - other: "%{count} minutes" + one: 1 minute + other: ! '%{count} minutes' about_x_hours: - one: "environ une heure" - other: "environ %{count} heures" + one: environ une heure + other: environ %{count} heures x_days: - one: "1 jour" - other: "%{count} jours" + one: 1 jour + other: ! '%{count} jours' about_x_months: - one: "environ un mois" - other: "environ %{count} mois" + one: environ un mois + other: environ %{count} mois x_months: - one: "1 mois" - other: "%{count} mois" + one: 1 mois + other: ! '%{count} mois' about_x_years: - one: "environ un an" - other: "environ %{count} ans" + one: environ un an + other: environ %{count} ans over_x_years: - one: "plus d'un an" - other: "plus de %{count} ans" + one: plus d'un an + other: plus de %{count} ans almost_x_years: - one: "presqu'un an" - other: "presque %{count} ans" + one: presqu'un an + other: presque %{count} ans prompts: - year: "Année" - month: "Mois" - day: "Jour" - hour: "Heure" - minute: "Minute" - second: "Seconde" - + year: Année + month: Mois + day: Jour + hour: Heure + minute: Minute + second: Seconde number: format: - separator: "," - delimiter: " " + separator: ! ',' + delimiter: ! ' ' precision: 3 significant: false strip_insignificant_zeros: false currency: format: - format: "%n %u" - unit: "€" - separator: "," - delimiter: " " + format: ! '%n %u' + unit: € + separator: ! ',' + delimiter: ! ' ' precision: 2 significant: false strip_insignificant_zeros: false percentage: format: - delimiter: "" + delimiter: '' precision: format: - delimiter: "" + delimiter: '' human: format: - delimiter: "" + delimiter: '' precision: 2 significant: true strip_insignificant_zeros: true storage_units: - format: "%n %u" + format: ! '%n %u' units: byte: - one: "octet" - other: "octets" - kb: "ko" - mb: "Mo" - gb: "Go" - tb: "To" + one: octet + other: octets + kb: ko + mb: Mo + gb: Go + tb: To decimal_units: - format: "%n %u" + format: ! '%n %u' units: - unit: "" - thousand: "millier" - million: "million" - billion: "milliard" - trillion: "billion" - quadrillion: "million de milliards" - + unit: '' + thousand: millier + million: million + billion: milliard + trillion: billion + quadrillion: million de milliards support: array: - words_connector: ", " - two_words_connector: " et " - last_word_connector: " et " + words_connector: ! ', ' + two_words_connector: ! ' et ' + last_word_connector: ! ' et ' select: - prompt: "Veuillez sélectionner" - + prompt: Veuillez sélectionner helpers: select: - prompt: "Veuillez sélectionner" + prompt: Veuillez sélectionner submit: - create: "Créer un %{model}" - update: "Modifier ce %{model}" - submit: "Enregistrer ce %{model}" - + create: Créer un %{model} + update: Modifier ce %{model} + submit: Enregistrer ce %{model} attributes: - created_at: "Créé le" - updated_at: "Modifié le" - + created_at: Créé le + updated_at: Modifié le errors: - format: "Le %{attribute} %{message}" - messages: &errors_messages - inclusion: "n'est pas inclus(e) dans la liste" - exclusion: "n'est pas disponible" - invalid: "n'est pas valide" - confirmation: "ne concorde pas avec la confirmation" - accepted: "doit être accepté(e)" - empty: "doit être rempli(e)" - blank: "doit être rempli(e)" - too_long: "est trop long (pas plus de %{count} caractères)" - too_short: "est trop court (au moins %{count} caractères)" - wrong_length: "ne fait pas la bonne longueur (doit comporter %{count} caractères)" - not_a_number: "n'est pas un nombre" - not_an_integer: "doit être un nombre entier" - greater_than: "doit être supérieur à %{count}" - greater_than_or_equal_to: "doit être supérieur ou égal à %{count}" - equal_to: "doit être égal à %{count}" - less_than: "doit être inférieur à %{count}" - less_than_or_equal_to: "doit être inférieur ou égal à %{count}" - odd: "doit être impair" - even: "doit être pair" - template: &errors_template - header: - one: "Impossible d'enregistrer ce %{model} : 1 erreur" - other: "Impossible d'enregistrer ce %{model} : %{count} erreurs" - body: "Veuillez vérifier les champs suivants : " - + format: Le %{attribute} %{message} + messages: + inclusion: n'est pas inclus(e) dans la liste + exclusion: n'est pas disponible + invalid: n'est pas valide + confirmation: ne concorde pas avec la confirmation + accepted: doit être accepté(e) + empty: doit être rempli(e) + blank: doit être rempli(e) + too_long: est trop long (pas plus de %{count} caractères) + too_short: est trop court (au moins %{count} caractères) + wrong_length: ne fait pas la bonne longueur (doit comporter %{count} caractères) + not_a_number: n'est pas un nombre + not_an_integer: doit être un nombre entier + greater_than: doit être supérieur à %{count} + greater_than_or_equal_to: doit être supérieur ou égal à %{count} + equal_to: doit être égal à %{count} + less_than: doit être inférieur à %{count} + less_than_or_equal_to: doit être inférieur ou égal à %{count} + odd: doit être impair + even: doit être pair + template: + header: &73570860 + one: ! 'Impossible d''enregistrer ce %{model} : 1 erreur' + other: ! 'Impossible d''enregistrer ce %{model} : %{count} erreurs' + body: ! 'Veuillez vérifier les champs suivants : ' activerecord: errors: messages: - taken: "n'est pas disponible" - record_invalid: "La validation a échoué : %{errors}" - <<: *errors_messages + inclusion: n'est pas inclus(e) dans la liste + exclusion: n'est pas disponible + invalid: n'est pas valide + confirmation: ne concorde pas avec la confirmation + accepted: doit être accepté(e) + empty: doit être rempli(e) + blank: doit être rempli(e) + too_long: est trop long (pas plus de %{count} caractères) + too_short: est trop court (au moins %{count} caractères) + wrong_length: ne fait pas la bonne longueur (doit comporter %{count} caractères) + not_a_number: n'est pas un nombre + not_an_integer: doit être un nombre entier + greater_than: doit être supérieur à %{count} + greater_than_or_equal_to: doit être supérieur ou égal à %{count} + equal_to: doit être égal à %{count} + less_than: doit être inférieur à %{count} + less_than_or_equal_to: doit être inférieur ou égal à %{count} + odd: doit être impair + even: doit être pair + taken: n'est pas disponible + record_invalid: ! 'La validation a échoué : %{errors}' template: - <<: *errors_template + header: *73570860 + body: ! 'Veuillez vérifier les champs suivants : ' full_messages: - format: "%{attribute} %{message}" + format: ! '%{attribute} %{message}' diff --git a/config/locales/fr_fat_free_crm.yml b/config/locales/fr_fat_free_crm.yml index 6224d8cd85..5da0371020 100644 --- a/config/locales/fr_fat_free_crm.yml +++ b/config/locales/fr_fat_free_crm.yml @@ -4,24 +4,18 @@ # Updated by David Keita aka ManInGA # maninga@gmail.com +--- fr: language: Français - - # Generic terms. - #---------------------------------------------------------------------------- all: Tous at: à here: ici - no_button: 'Non' + no_button: Non not_implemented: Pas encore implémenté. or: ou - select_none: '-- Aucun --' - select_blank: '-- Sélectionnez --' - yes_button: 'Oui' - - - # Settings. - #---------------------------------------------------------------------------- + select_none: -- Aucun -- + select_blank: -- Sélectionnez -- + yes_button: Oui tab_dashboard: Tableau de bord tab_tasks: Tâches tab_campaigns: Campagnes @@ -29,31 +23,26 @@ fr: tab_accounts: Comptes tab_contacts: Contacts tab_opportunities: Opportunités - admin_tab_users: Utilisateurs admin_tab_fields: Champs Personnalisés admin_tab_tags: Tags admin_tab_settings: Paramètres admin_tab_plugins: Plugins - affiliate: Affilié competitor: Concurrent customer: Client partner: Partenaire adm reseller: Revendeur vendor: Vendeur - planned: Planifié started: Démarré on_hold: En attente completed: Complétée called_off: Abandonné - new: Nouvelle contacted: Contactée converted: Convertie rejected: Rejetée - cold_call: Appel entrant conference: Conférence online: Marketing web @@ -62,7 +51,6 @@ fr: web: Website word_of_mouth: Bouche à oreille other: Autre - prospecting: Prospection analysis: Analyse presentation: Présentation @@ -71,138 +59,127 @@ fr: final_review: Examen final won: Clôturée/Gagnée lost: Clôturée/Perdue - call: Appel email: E-mail follow_up: Suivi lunch: Dîner meeting: Réunion money: Finance - presentation: Présentation trip: Voyage - overdue: Délai expiré due_asap: Dès que possible - due_today: "Aujourd'hui" + due_today: Aujourd'hui due_tomorrow: Demain due_this_week: Cette semaine due_next_week: La semaine prochaine due_later: Plus tard due_specific_date: A la date précise... - - completed_today: "Ajourd'hui" + completed_today: Ajourd'hui completed_yesterday: Hier completed_last_week: La semaine dernière completed_this_month: Ce mois completed_last_month: Le mois dernier - - # Models/Activity. - #---------------------------------------------------------------------------- one_hour: Une heure one_day: Un jour two_days: Deux jours one_week: Une semaine two_weeks: Deux semaines one_month: Un mois - - # Model Validations. - #---------------------------------------------------------------------------- activerecord: errors: models: authentication: attributes: login_field: - is_not_valid: "n'est pas valide" + is_not_valid: n'est pas valide password_field: - is_not_valid: "n'est pas valide" + is_not_valid: n'est pas valide account: attributes: name: - missing_account_name: "^Vérifiez le nom de compte." + missing_account_name: ^Vérifiez le nom de compte. access: - share_account: "^Spécifiez un utilisateur avec qui partager le compte." + share_account: ^Spécifiez un utilisateur avec qui partager le compte. campaign: attributes: name: - missing_campaign_name: "^Précisez un nom de campagne." + missing_campaign_name: ^Précisez un nom de campagne. ends_on: - dates_not_in_sequence: "^Vérifiez que la date de fin de campagne soit avant la date de début." + dates_not_in_sequence: ^Vérifiez que la date de fin de campagne soit + avant la date de début. access: - share_campaign: "^Préciser un utilisateur avec qui partager la campagne." + share_campaign: ^Préciser un utilisateur avec qui partager la campagne. contact: attributes: first_name: - missing_first_name: "^Précisez le prénom" + missing_first_name: ^Précisez le prénom last_name: - missing_last_name: "^Précisez le nom." + missing_last_name: ^Précisez le nom. access: - share_contact: "^Précisez avec quel utilisateur partager le contact." + share_contact: ^Précisez avec quel utilisateur partager le contact. lead: attributes: first_name: - missing_first_name: "^Précisez le prénom" + missing_first_name: ^Précisez le prénom last_name: - missing_last_name: "^Précisez le nom." + missing_last_name: ^Précisez le nom. access: - share_lead: "^Précisez avec quel utilisateur partager la piste." + share_lead: ^Précisez avec quel utilisateur partager la piste. opportunity: attributes: name: - missing_opportunity_name: "^Spécifiez un nom d'opportunité." + missing_opportunity_name: ^Spécifiez un nom d'opportunité. access: - share_opportunity: "^Précisez avec quel utilisateur partager l'opportunité." + share_opportunity: ^Précisez avec quel utilisateur partager l'opportunité. task: attributes: name: - missing_task_name: "^Précisez le nom de la tâche." + missing_task_name: ^Précisez le nom de la tâche. calendar: - invalid_date: "^Précisez une date valide" + invalid_date: ^Précisez une date valide user: attributes: username: - missing_username: "^Précisez un nom d'utilisateur." - username_taken: "^Ce nom d'utilisateur est déjà pris" + missing_username: ^Précisez un nom d'utilisateur. + username_taken: ^Ce nom d'utilisateur est déjà pris email: - missing_email: "^Précisez une adresse e-mail" - email_in_use: "^Un utilisateur existe déjà avec cette adresse." - + missing_email: ^Précisez une adresse e-mail + email_in_use: ^Un utilisateur existe déjà avec cette adresse. msg_account_suspended: Ce compte utilisateur a été suspendu. password_reset_instruction: instructions de réinitialisation du mot de passe - - # Controllers. - #---------------------------------------------------------------------------- - msg_account_created: "Votre compte a été créé, il est en attente d'approbation par l'administrateur" - msg_account_not_approved: "Votre compte n'à pas encore été approuvé" - msg_asset_deleted: "%{value} à été supprimé" - msg_asset_not_available: "Ce %{value} n'est plus disponible." - msg_asset_not_authorized: "Vous n'êtes pas autorisé à accéder à ce/cette %{value}." - msg_assets_not_available: "Les %{value} ne sont pas disponibles." - msg_asset_rejected: "%{value} à été rejetée." - msg_bad_image_file: "^Nous n'avons pas pu télécharger ou redimensionner votre image." - msg_cant_create_related: "Impossible de crée le %{asset} puisque le %{related} n'est plus disponnible." - msg_cant_delete_user: "^Impossible de supprimer l'utilisateur car %{value} a des objets liés encore présents." - msg_cant_do: "Impossible de %{action} le %{asset} puisqu'il n'est plus disponible." - msg_email_not_found: "Aucun utilisateur ne correspond a cette adresse" + msg_account_created: Votre compte a été créé, il est en attente d'approbation par + l'administrateur + msg_account_not_approved: Votre compte n'à pas encore été approuvé + msg_asset_deleted: ! '%{value} à été supprimé' + msg_asset_not_available: Ce %{value} n'est plus disponible. + msg_asset_not_authorized: Vous n'êtes pas autorisé à accéder à ce/cette %{value}. + msg_assets_not_available: Les %{value} ne sont pas disponibles. + msg_asset_rejected: ! '%{value} à été rejetée.' + msg_bad_image_file: ^Nous n'avons pas pu télécharger ou redimensionner votre image. + msg_cant_create_related: Impossible de crée le %{asset} puisque le %{related} n'est + plus disponnible. + msg_cant_delete_user: ^Impossible de supprimer l'utilisateur car %{value} a des + objets liés encore présents. + msg_cant_do: Impossible de %{action} le %{asset} puisqu'il n'est plus disponible. + msg_email_not_found: Aucun utilisateur ne correspond a cette adresse msg_enter_new_password: Saisissez votre nouveau mot de passe. - msg_goodbye: "Vous avez été déconnecté, merci d'utiliser Fat Free CRM!" - msg_invalid_password: "^Saisissez votre mot de passe actuel" + msg_goodbye: Vous avez été déconnecté, merci d'utiliser Fat Free CRM! + msg_invalid_password: ^Saisissez votre mot de passe actuel msg_invalig_login: Utilisateur ou mot de passe non valide. - msg_last_login: "Votre dernière connection était le %{value}." + msg_last_login: Votre dernière connection était le %{value}. msg_login_needed: Vous devez être connecté pour accéder a cette page. msg_logout_needed: Vous devez être déconnecté pour accéder a cette page. - msg_password_changed: "Votre mot de passe a été modifié" - msg_password_not_changed: "Votre mot de passe n'a pas été modifié" + msg_password_changed: Votre mot de passe a été modifié + msg_password_not_changed: Votre mot de passe n'a pas été modifié msg_password_updated: Modification de mot de passe réussie. - msg_pwd_instructions_sent: "Les instruction de modification de mot de passe vous on été envoyées. Vérifiez vos e-mails" + msg_pwd_instructions_sent: Les instruction de modification de mot de passe vous + on été envoyées. Vérifiez vos e-mails msg_require_admin: Vous devez être administrateur pour accéder a cette page msg_successful_signup: Enregistrement réussi. Bienvenu dans Fat Free CRM - msg_welcome: Bienvenue dans Fat Free CRM - - # Options. - #---------------------------------------------------------------------------- - "option_amount*probability": Montant pondéré - activity_options: Voir les %{action_type} %{models} effectuées par %{user} dans les derniers %{period}. + msg_welcome: Bienvenue dans Fat Free CRM + option_amount*probability: Montant pondéré + activity_options: Voir les %{action_type} %{models} effectuées par %{user} dans + les derniers %{period}. all_users: tous les utilisateurs option_after: après option_all: tous @@ -228,10 +205,8 @@ fr: option_updated_at: date de modification show_per_page: Voir %{number} %{models} par page au format %{fmt}. sort_by: Trier les %{models} par %{field}. - sort_by_displaying: Trier les %{models} par %{field} et afficher le prénom %{position} le nom. - - # Views -> Profile. - #---------------------------------------------------------------------------- + sort_by_displaying: Trier les %{models} par %{field} et afficher le prénom %{position} + le nom. aim: AOL IM already_signed_up: Déjà inscrit? alt_email: e-mail secondaire @@ -241,12 +216,12 @@ fr: contact_info: Informations de contact current_password: Mot de passe actuel edit_profile: Modifier le profil - # email: E-mail # <-- Already defined as the task type if Settings. first_name: Prénom google: Google IM gravatar_help: Vous ne connaissez pas Gravatar? Informations sur Gravatar image_file: Fichier image - image_help: "L'image que vous envoyez sera redimensionnée à 75 x 75 pixels. Les formats supportés sont GIF, JPEG et PNG." + image_help: L'image que vous envoyez sera redimensionnée à 75 x 75 pixels. Les formats + supportés sont GIF, JPEG et PNG. job_title: Titre/Fonction last_name: Nom login_now_link: Connectez vous maintenant! @@ -265,19 +240,13 @@ fr: upload_picture: Envoyez une image use_gravatar: Utilisez Gravatar user: Utilisateur - username: "Nom d'utilisateur" + username: Nom d'utilisateur yahoo: Yahoo IM - - # Views -> Authenticate. - #---------------------------------------------------------------------------- forgot_password: Mot de passe oublié login: Se connecter - no_account: "Vous n'avez pas de compte?" + no_account: Vous n'avez pas de compte? remember_me: Se souvenir de moi - sign_up_now: "Créez le maintenant!" - - # Views -> Accounts. - #---------------------------------------------------------------------------- + sign_up_now: Créez le maintenant! account: Compte select_an_account: Sélectionner un compte account_small: compte @@ -306,9 +275,6 @@ fr: shipping_address: Adresse de livraison total_accounts: Total des comptes website: Site web - - # Views -> Campaigns. - #---------------------------------------------------------------------------- actual: Etat actuel actual_performance: Performance Actuelle budget: Budget @@ -323,7 +289,7 @@ fr: campaigns_small: campagnes conversion: Conversion conversion_label: Conversion (%) - conversion_number: "%{value} de conversion" + conversion_number: ! '%{value} de conversion' create_campaign: Créer une Campagne end_date: Date de fin finished_on: terminée le %{value} @@ -331,24 +297,22 @@ fr: no_start_date: pas de date de début spécifiée number_of_leads: Nombre de pistes objectives: Objectifs - objectives_help: "Spécifiez un objectif en nombre de pistes, taux de conversion de pistes/opportunités, revenu espéré et budget. Ces valeurs seront utilisées lors de l'évaluation des performances de la campagne" + objectives_help: Spécifiez un objectif en nombre de pistes, taux de conversion de + pistes/opportunités, revenu espéré et budget. Ces valeurs seront utilisées lors + de l'évaluation des performances de la campagne objectives_small: objectifs de la campagne revenue: Revenu revenue_label: Revenu (€) - revenue_number: "%{value} pour revenu" + revenue_number: ! '%{value} pour revenu' save_campaign: Enregistrer la campagne start_date: Date de début started_ago: démarré il y a %{value} starts_in: démarré dans %{value} - starts_today: "démarre aujourd'hui!" + starts_today: démarre aujourd'hui! target: Prévisionnel total_campaigns: Total des Campagnes was_supposed_to_finish: présumée se terminer le %{value} was_supposed_to_start: était supposée démarrer il y a %{time_ago} le %{start_date} - #was_supposed_to_start_in: was supposed to start in %{starts_in} on %{start_date} # Not in use in the project - - # Views -> Contacts. - #---------------------------------------------------------------------------- alt_email_small: Autre blog: Site Web/Blog contact: Contact @@ -358,38 +322,47 @@ fr: contacts_small: contacts create_contact: Créer un Contact department: Département - department_small: 'département %{value} ' + department_small: ! 'département %{value} ' do_not_call: ne pas appeler extra_info: Informations supplémentaires extra_info_small: infos supplémentaires facebook: Facebook linked_in: LinkedIn myself: Moi-même - permissions_intro_private: Par défaut vous seul aurez accès à %{value}. Vous pouvez modifier les permissions ultérieurement. - permissions_intro_public: Par défaut tous les utilisateurs auront accès à %{value}. Vous pouvez modifier les permissions ultérieurement. - permissions_intro_shared: Par défaut seul les utilisateurs sélectionnés auront accès à %{value}. Vous pouvez modifier les permissions ultérieurement. + permissions_intro_private: Par défaut vous seul aurez accès à %{value}. Vous pouvez + modifier les permissions ultérieurement. + permissions_intro_public: Par défaut tous les utilisateurs auront accès à %{value}. + Vous pouvez modifier les permissions ultérieurement. + permissions_intro_shared: Par défaut seul les utilisateurs sélectionnés auront accès + à %{value}. Vous pouvez modifier les permissions ultérieurement. referred_by: Référencé par referred_by_small: référence par save_contact: Enregistrer le contact - skype: Skype twitter: Twitter web_presence: Présence Web - web_presence_small: présence web - works_at: "%{job_title} chez %{company}" - - # Views -> Leads. - #---------------------------------------------------------------------------- + web_presence_small: présence web + works_at: ! '%{job_title} chez %{company}' convert: Convertir convert_lead: Convertir la piste - convert_lead_permissions_intro: Les permissions du contact seront dupliquées depuis la piste. Vous pouvez modifier les permissions du contact ultérieurement. - convert_lead_text: En convertissant la piste %{value} il/elle deviendra un contact associé à un compte existant ou nouvellement créé. Le statut de la piste sera automatiquement positionné à converti. + convert_lead_permissions_intro: Les permissions du contact seront dupliquées depuis + la piste. Vous pouvez modifier les permissions du contact ultérieurement. + convert_lead_text: En convertissant la piste %{value} il/elle deviendra un contact + associé à un compte existant ou nouvellement créé. Le statut de la piste sera + automatiquement positionné à converti. create_lead: Créer une piste - create_opp_for_contact: "Vous pouvez éventuellement créer une opportunité pour le contact %{value} en spécifiant le nom, l'étape courante, la date de clôture estimée, la probabilité de vente, le montant de l'affaire, la remise offerte." + create_opp_for_contact: Vous pouvez éventuellement créer une opportunité pour le + contact %{value} en spécifiant le nom, l'étape courante, la date de clôture estimée, + la probabilité de vente, le montant de l'affaire, la remise offerte. lead: Piste lead_info_small: contact de la piste - lead_permissions_intro_private: Par défaut les permissions seront dupliquée depuis la campagne ou positionnées sur privé. Vous pouvez modifier les permissions ultérieurement. - lead_permissions_intro_public: Par défaut les permissions seront dupliquée depuis la campagne ou positionnées sur publique. Vous pouvez modifier les permissions ultérieurement. - lead_permissions_intro_shared: Par défaut les permissions seront dupliquée depuis la campagne ou partagées avec les utilisateurs spécifiés. Vous pouvez modifier les permissions ultérieurement. + lead_permissions_intro_private: Par défaut les permissions seront dupliquée depuis + la campagne ou positionnées sur privé. Vous pouvez modifier les permissions ultérieurement. + lead_permissions_intro_public: Par défaut les permissions seront dupliquée depuis + la campagne ou positionnées sur publique. Vous pouvez modifier les permissions + ultérieurement. + lead_permissions_intro_shared: Par défaut les permissions seront dupliquée depuis + la campagne ou partagées avec les utilisateurs spécifiés. Vous pouvez modifier + les permissions ultérieurement. lead_small: piste lead_status_small: statut de la piste lead_summary: Résumé de la piste @@ -404,13 +377,10 @@ fr: source: Source status: Statut total_leads: Total des pistes - - # Views -> Opportunities. - #---------------------------------------------------------------------------- amount: Montant close_date: Date de clôture closed_ago_on: clôturé il y à %{time_ago} le %{date} - closes_today: "doit être clôturé aujourd'hui!" + closes_today: doit être clôturé aujourd'hui! closing_date: la date de clôture est %{value} create_opportunity: Créer une opportunité currency: (€) @@ -427,18 +397,16 @@ fr: opportunities_small: opportunités opportunity: Opportunité opportunity_small: opportunité - opportunity_summary: "Coup d'oeil sur l'opportunité" - opportunity_summary_text: "%{amount} avec %{discount} de remise et %{probability} de probabilité" + opportunity_summary: Coup d'oeil sur l'opportunité + opportunity_summary_text: ! '%{amount} avec %{discount} de remise et %{probability} + de probabilité' past_due: en retard, devait être clôturé il y a %{value} probability: Probabilité probability_number: et %{value} de probabilité - save_opportunity: "Enregistrer l'opportunité" + save_opportunity: Enregistrer l'opportunité stage: Etape total_opportunities: Total des opportunités weighted_amount: Montant pondéré - - # Views -> Tasks. - #---------------------------------------------------------------------------- task: Tâche task_small: tâche tasks: Tâches @@ -454,13 +422,13 @@ fr: due: A faire feel_free: N'hésitez pas à move_to: aller à - no_tasks: "Vous n'avez aucune tâche %{value}" + no_tasks: Vous n'avez aucune tâche %{value} no_tasks_pending: en attente no_tasks_assigned: assignée no_tasks_completed: complétée pending_tab: En attente pending_tasks: Tâches en attente - related: 're:' + related: ! 're:' save_task: Enregistrer la tâche task_assigned: La tâche à été assignée à %{value} task_assigned_to: et assignée à %{value} @@ -471,16 +439,13 @@ fr: task_due_in: échéance dans %{value} task_due_later: à faire bientôt task_due_now: à faire maintenant - task_due_today: "à faire aujourd'hui" + task_due_today: à faire aujourd'hui task_from: De %{value} task_overdue: en retard, échéance prévue le task_pending: La tâche à été mise en attente total_tasks: Total des %{value} view_assigned_tasks: voir les tâches assignées view_pending_tasks: voir les tâches en attente - - # Views -> Home. - #---------------------------------------------------------------------------- action_commented: a commenté le/la action_completed: a complété le/la action_created: a créé le/la @@ -502,16 +467,13 @@ fr: subject_lead: piste subject_opportunity: opportunité subject_task: tâche - created_past_participle: "Création d'enregistrements" + created_past_participle: Création d'enregistrements commented_past_participle: Commentaires viewed_past_participle: Consultations updated_past_participle: Modifications deleted_past_participle: Supressions email_past_participle: Emails all_events_past_participle: Activités - - # Views -> Common. - #---------------------------------------------------------------------------- add_note: Ajouter une note save_note: Enregistrer la note add_note_help: Ajouter une nouvelle note... @@ -521,24 +483,24 @@ fr: back: Retour cancel: Annuler close_form: Fermer le formulaire - confirm_delete: "Êtes-vous certain de vouloir supprimer ceci : %{value}?" + confirm_delete: ! 'Êtes-vous certain de vouloir supprimer ceci : %{value}?' copy_permissions: Copier les permissions de %{value} - could_not_find: "Aucun(e) %{value} n'a été trouvé(e). N'hésitez pas à " - could_not_find_matching: "Aucun(e) %{value} n'a été trouvé(e) correspondant à" + could_not_find: ! 'Aucun(e) %{value} n''a été trouvé(e). N''hésitez pas à ' + could_not_find_matching: Aucun(e) %{value} n'a été trouvé(e) correspondant à create_new: créer un(e) create_a_new: créer un(e) select_existing: sélectionnez un(e) delete: Supprimer discard: Abandonner edit: Modifier - items_total: '%{count} total.' + items_total: ! '%{count} total.' less: Moins... me: moi more: Plus... n_a: N/R name: Nom no_match: Aucun(e) %{value} ne correspond - no_recent_items: "Il n'y rien de récent à afficher pour l'instant." + no_recent_items: Il n'y rien de récent à afficher pour l'instant. options: Options permissions: Permissions please_retry: essayez une autre requête. @@ -548,11 +510,11 @@ fr: select_task: Choisir une tâche select_opportunity: Choisir une opportunité search_assets: Recherche de %{value} - time_ago: "il y a %{value}" + time_ago: il y a %{value} background_info: Informations address: Adresse - street1: Rue 1 # NEW - street2: Rue 2 # NEW + street1: Rue 1 + street2: Rue 2 city: Ville zipcode: Code postal state: Région @@ -562,35 +524,31 @@ fr: collapse_all: Tout replier expanded: déplier collapsed: replier - - # Views -> Layout. - #---------------------------------------------------------------------------- about: A propos about_dev_group: Groupe de discussion pour les développeurs about_features: Fonctionnalités et bugs about_ffc: A propos de Fat Free CRM about_ffc_resources: Ressources pour Fat Free CRM (Nouvelle fenêtre) about_ffc_version: version de Fat Free CRM - about_home_page: "Page d'accueil" + about_home_page: Page d'accueil about_project_page: Page du projet - about_thank_you: "Merci d'utiliser Fat Free CRM!" + about_thank_you: Merci d'utiliser Fat Free CRM! about_twitter: mises à jours sur Twitter about_user_group: Groupe de discussion pour les utilisateurs admin: Administration logout: Se déconnecter quick_find: Recherche rapide welcome: Bienvenue - - # Views -> Advanced Search. accounts_advanced_search: Recherche avancée des comptes advanced_search: Recherche avancée advanced_search_submit: Rechercher advanced_search_add_group: Ajouter un groupe de filtres - advanced_search_group_first: Afficher les enregistrement quand %{combinator} du/des critère(s) suivant(s) correspond(ent) - advanced_search_group_rest: ...et quand %{combinator} du/des critère(s) suivant(s) correspond(ent) + advanced_search_group_first: Afficher les enregistrement quand %{combinator} du/des + critère(s) suivant(s) correspond(ent) + advanced_search_group_rest: ! '...et quand %{combinator} du/des critère(s) suivant(s) + correspond(ent)' advanced_search_add_condition: Ajouter un filtre advanced_search_remove_condition: Supprimer un filtre - ransack: predicates: eq: est égal à @@ -603,139 +561,101 @@ fr: not_cont: ne contient pas blank: est vide present: est présent - "null": est nul + 'null': est nul not_null: est non nul - - - # Views -> Comments. - #---------------------------------------------------------------------------- edit_comment: Edition de commentaire show: Voir update: Modifier - - # Views -> Passwords. - #---------------------------------------------------------------------------- confirm_password_intro: Saisissez votre nouveau mot de passe et sa confirmation. - password_intro: Précisez votre adresse e-mail, et les instructions pour les réinitialiser vous seront communiquées. + password_intro: Précisez votre adresse e-mail, et les instructions pour les réinitialiser + vous seront communiquées. reset_password: Ré-initialisation du mot de passe - update_password_and_login: "Modification de l'identifiant et du mot de passe" - - # Views -> Admin - #---------------------------------------------------------------------------- + update_password_and_login: Modification de l'identifiant et du mot de passe back_to_crm: Retour à Fat Free CRM crm_admin_page: Administration de Fat Free CRM - - # Views -> Admin -> Users. - #---------------------------------------------------------------------------- approve: Approuver create_user: Créer un utilisateur last_seen: vu pour la dernière fois il y a %{value} personal_information: Informations complémentaires reactivate: Réactiver - save_user: "Enregistrer l'utilisateur" + save_user: Enregistrer l'utilisateur suspend: Suspendre user_active: Actif user_admin: Admin user_awaits_approval: en attente de votre approbation - user_confirm_delete: Un utilisateur ne peut être supprimé que si aucun objet lui appartenant existent toujours. - user_is_admin: "L'utilisateur est administrateur" - user_never_logged_in: "ne s'est pas encore connecté" + user_confirm_delete: Un utilisateur ne peut être supprimé que si aucun objet lui + appartenant existent toujours. + user_is_admin: L'utilisateur est administrateur + user_never_logged_in: ne s'est pas encore connecté user_signed_up: est enregistré - user_signed_up_on: "s'est enregistré le %{value}" + user_signed_up_on: s'est enregistré le %{value} user_since: utilisateur depuis le %{value} user_suspended: Suspendu user_suspended_on: suspendu le %{value} users: Utilisateurs users_small: utilisateurs - - # Views -> Versions - #---------------------------------------------------------------------------- versions: Historique version: create: Créé par %{by} il y a %{item}. update: Modifié par %{by} il y a %{item}. destroy: Détruit par %{by} il y a %{item}. - set: %{attr} renseigné %{to} - unset: %{attr} supprimé - change: %{attr} changé de %{from} à %{to} + set: ! '%{attr} renseigné %{to}' + unset: ! '%{attr} supprimé' + change: ! '%{attr} changé de %{from} à %{to}' anonymous: anonyme - - # Export. - #---------------------------------------------------------------------------- to_xls: Exporter au format Excel to_csv: Exporter au format CSV (enregistrements supprimés inclus) to_rss: fil RSS to_atom: fil Atom - - # Dropbox. - #---------------------------------------------------------------------------- dropbox_notification_subject: dropbox - Email ajouté - %{subject} - dropbox_notification_intro: "a ajouté l'email que vous avez envoyé à la dropbox" + dropbox_notification_intro: a ajouté l'email que vous avez envoyé à la dropbox dropbox_notification_to: ajoutés aux subject: Sujet body: Corps - - # Lists - #---------------------------------------------------------------------------- lists: Listes list: Liste no_saved_lists: Liste non sauvegardée make_current_view_list: Faire de la vue courante une liste - list_name_info: Si vous utilisez le nom d'une liste existante vous écraserez cette liste avec vos paramètres courants - - # Pluralizations. - #---------------------------------------------------------------------------- + list_name_info: Si vous utilisez le nom d'une liste existante vous écraserez cette + liste avec vos paramètres courants pluralize: comment: - one: '1 commentaire' - other: '%{count} commentaires' + one: 1 commentaire + other: ! '%{count} commentaires' contact: - one: '1 contact' - other: '%{count} contacts' + one: 1 contact + other: ! '%{count} contacts' opportunity: - one: '1 opportunité' - other: '%{count} opportunités' + one: 1 opportunité + other: ! '%{count} opportunités' lead: - one: '1 piste' - other: '%{count} pistes' + one: 1 piste + other: ! '%{count} pistes' day: - one: '1 jour' - other: '%{count} jours' + one: 1 jour + other: ! '%{count} jours' login: - one: '1 identifiant' - other: '%{count} identifiants' - - # Custom date/time formats. - #---------------------------------------------------------------------------- + one: 1 identifiant + other: ! '%{count} identifiants' date: formats: - mmddyyyy: "%d/%m/%Y" - mmdd: "%e %b" - mmddyy: "%e %b %Y" - + mmddyyyy: ! '%d/%m/%Y' + mmdd: ! '%e %b' + mmddyy: ! '%e %b %Y' time: formats: - mmddhhss: "%b %e à %H:%M%" - mmddyyyy_hhmm: "%d/%m/%Y à %H:%M" - - # will_paginate translations copied for 'fr' - #---------------------------------------------------------------------------- + mmddhhss: ! '%b %e à %H:%M%' + mmddyyyy_hhmm: ! '%d/%m/%Y à %H:%M' will_paginate: - previous_label: "← Précédent" - next_label: "Suivant →" - page_gap: "…" - + previous_label: ! '← Précédent' + next_label: Suivant → + page_gap: ! '…' page_entries_info: single_page: - zero: "Aucun(e) %{name} trouvé" - one: "Affichage de 1 %{name}" - other: "Affichage de %{count} %{plural}" - - multi_page: "Affichage des %{plural} %{from} à %{to} de %{total} au total" - - - # Views -> Admin -> Custom Fields - #---------------------------------------------------------------------------- + zero: Aucun(e) %{name} trouvé + one: Affichage de 1 %{name} + other: Affichage de %{count} %{plural} + multi_page: Affichage des %{plural} %{from} à %{to} de %{total} au total label: Etiquette custom_fields: Champs personnalisés custom_field_options: Options des champs personnalisés @@ -744,94 +664,71 @@ fr: create_field_group: Créer une section (groupe de champs) edit_field_group: Editer la section save_field_group: enregistrer la section - - field_group_empty: "Il n'y a aucun champ dans cette section" - - select_or_create_tags: "Sélectionner un tag ou créez un nouveau tag en validant par la touche entrée." - + field_group_empty: Il n'y a aucun champ dans cette section + select_or_create_tags: Sélectionner un tag ou créez un nouveau tag en validant par + la touche entrée. restrict_by_tag: Restriction par tag - restrict_by_tag_info: Cette section ne sera visible que pour les %{assets} qui seront taggé(e)s" - field_group_tag_restriction: Cette section est visible pour les %{assets} qui sont taggé(e)s "%{tag}" - field_group_unrestricted: "Cette section est visible pour l'ensemble des %{assets}" - field_group_confirm_delete: Quand une section est supprimée, tous les champs personnalisés sont déplacés vers la section par défaut. + restrict_by_tag_info: Cette section ne sera visible que pour les %{assets} qui seront + taggé(e)s" + field_group_tag_restriction: Cette section est visible pour les %{assets} qui sont + taggé(e)s "%{tag}" + field_group_unrestricted: Cette section est visible pour l'ensemble des %{assets} + field_group_confirm_delete: Quand une section est supprimée, tous les champs personnalisés + sont déplacés vers la section par défaut. msg_cant_delete_field_group: Cette section ne peut pas être supprimée. + admin_fields_info: ! 'Les champs personnalisés sont affichés dans des sections. - admin_fields_info: | - Les champs personnalisés sont affichés dans des sections. - Créez d'abord une nouvelle section, ou ajoutez les champs dans une section existante ci-dessous.
- Vous pouvez faire glisser les champs pour ordonner leur présentation ou les faire changer de section. + Créez d''abord une nouvelle section, ou ajoutez les champs dans une section existante + ci-dessous.
- # Views -> Admin -> Tags - #---------------------------------------------------------------------------- + Vous pouvez faire glisser les champs pour ordonner leur présentation ou les faire + changer de section. + +' tags: Tags tag_small: tag tagged: taggé(es) create_tag: Créer un tag save_tag: Enregistrer le tag field_group_tags: Sections visibles pour ce tag - tag_with_taggings_confirm_delete: "En supprimant ce tag, il sera supprimé de %{value} enregistrements." - msg_cant_delete_tag: "Impossible de supprimer '%{value}' car il est associé à au moins une section." - - - # Views -> Admin -> Plugins - #---------------------------------------------------------------------------- + tag_with_taggings_confirm_delete: En supprimant ce tag, il sera supprimé de %{value} + enregistrements. + msg_cant_delete_tag: Impossible de supprimer '%{value}' car il est associé à au + moins une section. views: admin: plugins: author: Auteur version: Version description: Description - - # Simple Form translations - #---------------------------------------------------------------------------- simple_form: - "yes": 'Oui' - "no": 'Non' + 'yes': Oui + 'no': Non required: - text: 'required' - mark: '*' - # You can uncomment the line below if you need to overwrite the whole required html. - # When using html, text and mark won't be used. - # html: '*' + text: required + mark: ! '*' error_notification: - default_message: "Votre demande ne peut aboutir, les erreurs suivantes se sont déclenchées:" - # Labels and hints examples - # labels: - # password: 'Password' - # user: - # new: - # email: 'E-mail para efetuar o sign in.' - # edit: - # email: 'E-mail.' - # hints: - # username: 'User name to sign in.' - # password: 'No special characters, please.' - - - # Form field types - #---------------------------------------------------------------------------- + default_message: ! 'Votre demande ne peut aboutir, les erreurs suivantes se + sont déclenchées:' field_types: - string: Texte court - text: Texte long - select: Liste de sélection + string: Texte court + text: Texte long + select: Liste de sélection multiselect: Liste de sélection (multiple) - radio: Boutons radios - boolean: Case à cocher + radio: Boutons radios + boolean: Case à cocher check_boxes: Liste de cases à cocher - date: Date - datetime: Date et heure - email: Adresse email - url: URL - tel: Numéro de téléphone - decimal: Nombre décimal - integer: Nombre entier - float: Nombre flottant - - # dynamic_form plugin translations. - #---------------------------------------------------------------------------- + date: Date + datetime: Date et heure + email: Adresse email + url: URL + tel: Numéro de téléphone + decimal: Nombre décimal + integer: Nombre entier + float: Nombre flottant errors: template: header: - one: "Impossible d'enregistrer ce %{model} : 1 erreur" - other: "Impossible d'enregistrer ce %{model} : %{count} erreurs" - body: "Veuillez vérifier les champs suivants : " + one: ! 'Impossible d''enregistrer ce %{model} : 1 erreur' + other: ! 'Impossible d''enregistrer ce %{model} : %{count} erreurs' + body: ! 'Veuillez vérifier les champs suivants : ' diff --git a/config/locales/it.yml b/config/locales/it.yml index f7470848fc..4b496461b5 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -1,183 +1,219 @@ -# IT translations for Ruby on Rails -# -# Use this as the base for the locale file of your language. - -"it": +--- +it: date: formats: - default: "%Y-%m-%d" - short: "%b %d" - long: "%B %d, %Y" - - day_names: [Domenica, Lunedi', Martedi', Mercoledi', Giovedi', Venerdi', Sabato] - abbr_day_names: [Dom, Lun, Mar, Mer, Gio, Ven, Sab] - - month_names: [~, Gennaio, Febbraio, Marzo, Aprile, Maggio, Giugno, Luglio, Agosto, Settembre, Ottobre, Novembre, Dicembre] - abbr_month_names: [~, Gen, Feb, Mar, Apr, Mag, Giu, Lug, Aug, Set, Ott, Nov, Dic] + default: ! '%Y-%m-%d' + short: ! '%b %d' + long: ! '%B %d, %Y' + day_names: + - Domenica + - Lunedi' + - Martedi' + - Mercoledi' + - Giovedi' + - Venerdi' + - Sabato + abbr_day_names: + - Dom + - Lun + - Mar + - Mer + - Gio + - Ven + - Sab + month_names: + - + - Gennaio + - Febbraio + - Marzo + - Aprile + - Maggio + - Giugno + - Luglio + - Agosto + - Settembre + - Ottobre + - Novembre + - Dicembre + abbr_month_names: + - + - Gen + - Feb + - Mar + - Apr + - Mag + - Giu + - Lug + - Aug + - Set + - Ott + - Nov + - Dic order: - - :year - - :month - - :day - + - :year + - :month + - :day time: formats: - default: "%a, %d %b %Y %H:%M:%S %z" - short: "%d %b %H:%M" - long: "%B %d, %Y %H:%M" - am: "am" - pm: "pm" - + default: ! '%a, %d %b %Y %H:%M:%S %z' + short: ! '%d %b %H:%M' + long: ! '%B %d, %Y %H:%M' + am: am + pm: pm support: array: - words_connector: ", " - two_words_connector: " e " - last_word_connector: ", e " - + words_connector: ! ', ' + two_words_connector: ! ' e ' + last_word_connector: ! ', e ' select: - prompt: "Per favore selezionare" - + prompt: Per favore selezionare number: format: - separator: "." - delimiter: "," + separator: . + delimiter: ! ',' precision: 3 significant: false strip_insignificant_zeros: false - currency: format: - format: "%u%n" - unit: "$" - separator: "." - delimiter: "," + format: ! '%u%n' + unit: $ + separator: . + delimiter: ! ',' precision: 2 significant: false strip_insignificant_zeros: false - percentage: format: - delimiter: "" - + delimiter: '' precision: format: - delimiter: "" - + delimiter: '' human: format: - delimiter: "" + delimiter: '' precision: 3 significant: true strip_insignificant_zeros: true storage_units: - format: "%n %u" + format: ! '%n %u' units: byte: - one: "Byte" - other: "Bytes" - kb: "KB" - mb: "MB" - gb: "GB" - tb: "TB" + one: Byte + other: Bytes + kb: KB + mb: MB + gb: GB + tb: TB decimal_units: - format: "%n %u" + format: ! '%n %u' units: - unit: "" + unit: '' thousand: Migliaia million: Milioni billion: Miliardi trillion: Biliardi quadrillion: Triliardi - datetime: distance_in_words: - half_a_minute: "mezzo minuto" + half_a_minute: mezzo minuto less_than_x_seconds: - one: "meno di 1 secondo" - other: "meno di %{count} secondi" + one: meno di 1 secondo + other: meno di %{count} secondi x_seconds: - one: "1 secondo" - other: "%{count} secondi" + one: 1 secondo + other: ! '%{count} secondi' less_than_x_minutes: - one: "meno di un minuto" - other: "meno di %{count} minuti" + one: meno di un minuto + other: meno di %{count} minuti x_minutes: - one: "1 minuto" - other: "%{count} minuti" + one: 1 minuto + other: ! '%{count} minuti' about_x_hours: - one: "circa 1 ora" - other: "circa %{count} ore" + one: circa 1 ora + other: circa %{count} ore x_days: - one: "1 giorno" - other: "%{count} giorni" + one: 1 giorno + other: ! '%{count} giorni' about_x_months: - one: "circa 1 mese" - other: "circa %{count} mesi" + one: circa 1 mese + other: circa %{count} mesi x_months: - one: "1 mese" - other: "%{count} mesi" + one: 1 mese + other: ! '%{count} mesi' about_x_years: - one: "circa 1 anno" - other: "circa %{count} anni" + one: circa 1 anno + other: circa %{count} anni over_x_years: - one: "oltre 1 anno" - other: "oltre %{count} anni" + one: oltre 1 anno + other: oltre %{count} anni almost_x_years: - one: "quasi 1 anno" - other: "quasi %{count} anni" + one: quasi 1 anno + other: quasi %{count} anni prompts: - year: "Anno" - month: "Mese" - day: "Giorno" - hour: "Ora" - minute: "Minuto" - second: "Secondo" - + year: Anno + month: Mese + day: Giorno + hour: Ora + minute: Minuto + second: Secondo helpers: select: - prompt: "Per favore selezionare" - + prompt: Per favore selezionare submit: - create: 'Creato %{model}' - update: 'Aggiornato %{model}' - submit: 'Salvato %{model}' - + create: Creato %{model} + update: Aggiornato %{model} + submit: Salvato %{model} errors: - format: "%{attribute} %{message}" - - messages: &errors_messages - inclusion: "non incluso nell'elenco" - exclusion: "e' riservato" - invalid: "non e' valido" - confirmation: "non corrisponde alla conferma" - accepted: "deve essere accettato" - empty: "non puo' essere vuoto" - blank: "non puo' essere nullo" - too_long: "e' troppo lungo (massimo sono %{count} caratteri)" - too_short: "e' troppo corto (minimo sono %{count} caratteri)" - wrong_length: "ha una lunghezza errata (dovrebbe essere %{count} caratteri)" - not_a_number: "non e' un numero" - not_an_integer: "deve essere un intero" - greater_than: "deve essere piu' grande di %{count}" - greater_than_or_equal_to: "deve essere piu' grande o uguale a %{count}" - equal_to: "deve essere uguale a %{count}" - less_than: "deve essere minore di %{count}" - less_than_or_equal_to: "deve essere minore o uguale a %{count}" - odd: "deve essere dispari" - even: "deve essere pari" - + format: ! '%{attribute} %{message}' + messages: + inclusion: non incluso nell'elenco + exclusion: e' riservato + invalid: non e' valido + confirmation: non corrisponde alla conferma + accepted: deve essere accettato + empty: non puo' essere vuoto + blank: non puo' essere nullo + too_long: e' troppo lungo (massimo sono %{count} caratteri) + too_short: e' troppo corto (minimo sono %{count} caratteri) + wrong_length: ha una lunghezza errata (dovrebbe essere %{count} caratteri) + not_a_number: non e' un numero + not_an_integer: deve essere un intero + greater_than: deve essere piu' grande di %{count} + greater_than_or_equal_to: deve essere piu' grande o uguale a %{count} + equal_to: deve essere uguale a %{count} + less_than: deve essere minore di %{count} + less_than_or_equal_to: deve essere minore o uguale a %{count} + odd: deve essere dispari + even: deve essere pari activerecord: errors: template: header: - one: "1 errore impedisce a questo %{model} da essere salvato" - other: "%{count} errori impediscono a questo %{model} da essere salvato" - body: "Ci sono stati problemi con i seguenti campi:" - + one: 1 errore impedisce a questo %{model} da essere salvato + other: ! '%{count} errori impediscono a questo %{model} da essere salvato' + body: ! 'Ci sono stati problemi con i seguenti campi:' messages: - taken: "e' gia' stato preso" - record_invalid: "Validazione fallita: %{errors}" - <<: *errors_messages - + inclusion: non incluso nell'elenco + exclusion: e' riservato + invalid: non e' valido + confirmation: non corrisponde alla conferma + accepted: deve essere accettato + empty: non puo' essere vuoto + blank: non puo' essere nullo + too_long: e' troppo lungo (massimo sono %{count} caratteri) + too_short: e' troppo corto (minimo sono %{count} caratteri) + wrong_length: ha una lunghezza errata (dovrebbe essere %{count} caratteri) + not_a_number: non e' un numero + not_an_integer: deve essere un intero + greater_than: deve essere piu' grande di %{count} + greater_than_or_equal_to: deve essere piu' grande o uguale a %{count} + equal_to: deve essere uguale a %{count} + less_than: deve essere minore di %{count} + less_than_or_equal_to: deve essere minore o uguale a %{count} + odd: deve essere dispari + even: deve essere pari + taken: e' gia' stato preso + record_invalid: ! 'Validazione fallita: %{errors}' full_messages: - format: "%{attribute} %{message}" - \ No newline at end of file + format: ! '%{attribute} %{message}' diff --git a/config/locales/it_fat_free_crm.yml b/config/locales/it_fat_free_crm.yml index b1d2670d65..8393faba6d 100644 --- a/config/locales/it_fat_free_crm.yml +++ b/config/locales/it_fat_free_crm.yml @@ -1,21 +1,15 @@ +--- it: language: Italian - - # Generic terms. - #---------------------------------------------------------------------------- all: Tutti at: presso here: qui no_button: 'No' not_implemented: Non ancora implementato. or: o - select_none: '-- Nessuno --' - select_blank: '-- Seleziona --' - yes_button: 'Si' - - - # Settings. - #---------------------------------------------------------------------------- + select_none: -- Nessuno -- + select_blank: -- Seleziona -- + yes_button: Si tab_dashboard: Cruscotto tab_tasks: Lavori tab_campaigns: Campagne @@ -23,29 +17,24 @@ it: tab_accounts: Conto tab_contacts: Contatti tab_opportunities: Opportunita' - admin_tab_users: Utenti admin_tab_settings: Impostazioni admin_tab_plugins: Plugins - affiliate: Affiliato competitor: Concorrente customer: Cliente partner: Partner reseller: Rivenditore vendor: Venditore - planned: Pianificato started: Iniziato on_hold: Trattenuto completed: Completato called_off: Fernato - new: Nuovo contacted: Contattato converted: Convertito rejected: Respinto - cold_call: Chiamata a freddo conference: Conferenza online: Online Marketing @@ -54,7 +43,6 @@ it: web: Website word_of_mouth: Passaparola other: Altro - prospecting: Prospetto analysis: Analisi presentation: Presentazione @@ -63,16 +51,13 @@ it: final_review: Controllo finale won: Chiuso/Vinto lost: Chiuso/Perso - call: Chiamata email: Email follow_up: Seguito lunch: Pranzo meeting: Incontro money: Soldi - presentation: Presentazione trip: Viaggio - overdue: Scaduto due_asap: Prima possibile due_today: Oggi @@ -81,24 +66,17 @@ it: due_next_week: Prossima settimana due_later: Piu' tardi due_specific_date: Il giorno indicato... - completed_today: Oggi completed_yesterday: Ieri completed_last_week: Scorsa settimana completed_this_month: Questo mese completed_last_month: Scorso mese - - # Models/Activity. - #---------------------------------------------------------------------------- one_hour: Un'ora one_day: Un giorno two_days: Due giorni one_week: Una settimana two_weeks: Due settimane one_month: Un mese - - # Model Validations. - #---------------------------------------------------------------------------- activerecord: errors: models: @@ -111,74 +89,75 @@ it: account: attributes: name: - missing_account_name: "^Specificare il nome del conto." + missing_account_name: ^Specificare il nome del conto. access: - share_account: "^Specificare gli utenti con cui condividere il conto." + share_account: ^Specificare gli utenti con cui condividere il conto. campaign: attributes: name: - missing_campaign_name: "^Specificare il nome della campagna." + missing_campaign_name: ^Specificare il nome della campagna. ends_on: - dates_not_in_sequence: "^Controllare che la data finale della campagna sia successiva a quella iniziale." + dates_not_in_sequence: ^Controllare che la data finale della campagna + sia successiva a quella iniziale. access: - share_campaign: "^Specificare gli utenti con cui condividere la campagna." + share_campaign: ^Specificare gli utenti con cui condividere la campagna. contact: attributes: first_name: - missing_first_name: "^Specificare il nome." + missing_first_name: ^Specificare il nome. last_name: - missing_last_name: "^Specificare il cognome." + missing_last_name: ^Specificare il cognome. access: - share_contact: "^Specificare gli utenti con cui contdividere il contatto." + share_contact: ^Specificare gli utenti con cui contdividere il contatto. lead: attributes: first_name: - missing_first_name: "^Specificare il nome." + missing_first_name: ^Specificare il nome. last_name: - missing_last_name: "^Specificare il cognome." + missing_last_name: ^Specificare il cognome. access: - share_lead: "^Specificare gli utenti con cui condividere il potenziale." + share_lead: ^Specificare gli utenti con cui condividere il potenziale. opportunity: attributes: name: - missing_opportunity_name: "^Specificare il nome dell'opportunita'." + missing_opportunity_name: ^Specificare il nome dell'opportunita'. access: - share_opportunity: "^Specificare gli utenti con cui condividere l'opportunita'." + share_opportunity: ^Specificare gli utenti con cui condividere l'opportunita'. task: attributes: name: - missing_task_name: "^Specificare il nome del lavoro." + missing_task_name: ^Specificare il nome del lavoro. calendar: - invalid_date: "^Specificare una data valida." + invalid_date: ^Specificare una data valida. user: attributes: username: - missing_username: "^Specificare il nome utente." - username_taken: "^Questo nome utente e' gia' assegnato." + missing_username: ^Specificare il nome utente. + username_taken: ^Questo nome utente e' gia' assegnato. email: - missing_email: "^Specificare l'indirizzo email." - email_in_use: "^C'e' un altro utente con la stessa email." - + missing_email: ^Specificare l'indirizzo email. + email_in_use: ^C'e' un altro utente con la stessa email. msg_account_suspended: Questo utente e' stato sospeso. password_reset_instruction: istruzioni per il reset della password - - # Controllers. - #---------------------------------------------------------------------------- - msg_account_created: Il tuo account e' stato creato ed e' in attesa di approvazione dall'amministratore. + msg_account_created: Il tuo account e' stato creato ed e' in attesa di approvazione + dall'amministratore. msg_account_not_approved: Il tuo account non e' ancora stato approvato. - msg_asset_deleted: "%{value} e' stato eliminato." + msg_asset_deleted: ! '%{value} e'' stato eliminato.' msg_asset_not_available: Questo %{value} non e' piu' valido. msg_asset_not_authorized: Non sei autorizzato a vedere questo %{value}. msg_assets_not_available: I %{value} non sono disponibili. - msg_asset_rejected: "%{value} e' stato respinto." - msg_bad_image_file: "^Impossibile caricare o ridimensionare il file con l'immagine specificata." - msg_cant_create_related: "Non e' possibile creare %{asset} finche' %{related} non e' piu' disponibile." - msg_cant_delete_user: "^Non e' possibilie eliminare l'utente finche' %{value} sono presenti elementi assegnati." - msg_cant_do: "Can't %{action} the %{asset} since it's no longer available." + msg_asset_rejected: ! '%{value} e'' stato respinto.' + msg_bad_image_file: ^Impossibile caricare o ridimensionare il file con l'immagine + specificata. + msg_cant_create_related: Non e' possibile creare %{asset} finche' %{related} non + e' piu' disponibile. + msg_cant_delete_user: ^Non e' possibilie eliminare l'utente finche' %{value} sono + presenti elementi assegnati. + msg_cant_do: Can't %{action} the %{asset} since it's no longer available. msg_email_not_found: Non e' stato trovato alcun utente con questa email. msg_enter_new_password: Per favore insersci la tua nuova password. msg_goodbye: Ti sei sconnesso. Grazie per aver usato Fat Free CRM! - msg_invalid_password: "^Specifica la tua password corrente" + msg_invalid_password: ^Specifica la tua password corrente msg_invalig_login: username o password non valida. msg_last_login: il tuo ultimo login risale al %{value}. msg_login_needed: Devi essere connesso per accedere a questa pagina. @@ -186,15 +165,14 @@ it: msg_password_changed: La tua password e' stata modificata. msg_password_not_changed: La tua password non e' stata modificata. msg_password_updated: Password aggiornata con successo. - msg_pwd_instructions_sent: Ti sono state inviate le istruzioni per resettare la tua password. Per favore controlla la tua email. + msg_pwd_instructions_sent: Ti sono state inviate le istruzioni per resettare la + tua password. Per favore controlla la tua email. msg_require_admin: Devi essere un Amministratore per accedere a questa pagina. msg_successful_signup: Registrazione con successo, benvenuto a Fat Free CRM! msg_welcome: Benvenuto a Fat Free CRM! - - # Options. - #---------------------------------------------------------------------------- - "option_amount*probability": ammonotare pesato - activity_options: Mostra %{models} %{action_type} eseguito da %{user} nel passato %{period}. + option_amount*probability: ammonotare pesato + activity_options: Mostra %{models} %{action_type} eseguito da %{user} nel passato + %{period}. all_users: tutti gli utenti option_after: dopo option_all: tutti @@ -221,9 +199,6 @@ it: show_per_page: Mostra %{number} %{models} per pagina usando %{fmt} formato. sort_by: Ordina %{models} per %{field}. sort_by_displaying: Ordina %{models} per %{field} mostrando nome %{position} cognome - - # Views -> Profile. - #---------------------------------------------------------------------------- aim: AOL IM already_signed_up: Gia' iscritto? alt_email: Email alternativa @@ -233,12 +208,12 @@ it: contact_info: Informazioni Contatto current_password: Password attuale edit_profile: Modifica Profilo - # email: Email # <-- Already defined as the task type if Settings. first_name: Nome google: Google IM gravatar_help: Non conosci Gravatars? Acquisisci informazioni riguardo Gravatars image_file: File immagine - image_help: Il file immagine che hai caricato sara' ridimensionato a 75 x 75 pixels. Formati supportati sono GIF, JPG e PNG. + image_help: Il file immagine che hai caricato sara' ridimensionato a 75 x 75 pixels. + Formati supportati sono GIF, JPG e PNG. job_title: Titolo last_name: Cognome login_now_link: Connettiti ora! @@ -259,17 +234,11 @@ it: user: Utente username: Username yahoo: Yahoo IM - - # Views -> Authenticate. - #---------------------------------------------------------------------------- forgot_password: Password dimenticata login: Login no_account: Hai un account? remember_me: Ricordami sign_up_now: Registrati Ora! - - # Views -> Conti. - #---------------------------------------------------------------------------- account: Conto account_small: conto account_summary: Sommario Conto @@ -297,9 +266,6 @@ it: shipping_address: Indirizzo spedizione total_accounts: Totale Conti website: Website - - # Views -> Campaigns. - #---------------------------------------------------------------------------- actual: Attuale actual_performance: Performance attuale budget: Budget @@ -314,7 +280,7 @@ it: campaigns_small: campagne conversion: Conversione conversion_label: Conversione (%) - conversion_number: "%{value} conversione" + conversion_number: ! '%{value} conversione' create_campaign: Crea Campagna end_date: Data finale finished_on: completato il %{value} @@ -322,11 +288,14 @@ it: no_start_date: data iniziale non specificata number_of_leads: Numero di Potenziali objectives: Obiettivi - objectives_help: Per favore indica il numero di potenziali obiettivo, eccetto la percentuale di conversione verso le opportunita', gettito obiettivo, e il budget della campagna. Questi numeri ti consentiranno di tracciare le performance della campagna. + objectives_help: Per favore indica il numero di potenziali obiettivo, eccetto la + percentuale di conversione verso le opportunita', gettito obiettivo, e il budget + della campagna. Questi numeri ti consentiranno di tracciare le performance della + campagna. objectives_small: obiettivi campagna revenue: Gettito revenue_label: Gettito (€) - revenue_number: "%{value} in gettito" + revenue_number: ! '%{value} in gettito' save_campaign: Salva Campagna start_date: Data Iniziale started_ago: iniziato %{value} fa @@ -337,9 +306,6 @@ it: was_supposed_to_finish: la conclusione era prevista per il %{value} was_supposed_to_start: l'inizio era prevista %{time_ago} fa, il %{start_date} was_supposed_to_start_in: l'inizio era prevista tra %{starts_in} il %{start_date} - - # Views -> Contacts. - #---------------------------------------------------------------------------- alt_email_small: Altro blog: Website/Blog contact: Contatto @@ -349,38 +315,46 @@ it: contacts_small: contatti create_contact: Crea Contatto department: Dipartimento - department_small: '%{value} dipartimento' + department_small: ! '%{value} dipartimento' do_not_call: Non chiamare extra_info: Informazioni Extra extra_info_small: contatto extra facebook: Facebook linked_in: LinkedIn myself: Me stesso - permissions_intro_private: Di default solo tu avrai accesso a %{value}. Potrai cambiare i permessi piu' tardi. - permissions_intro_public: Di default tutti gli utenti avranno accesso a %{value}. Potrai cambiare i permessi piu' tardi. - permissions_intro_shared: Di default solo gli utenti selezionati avranno accesso a %{value}. Potrai cambiare i permessi piu' tardi. + permissions_intro_private: Di default solo tu avrai accesso a %{value}. Potrai cambiare + i permessi piu' tardi. + permissions_intro_public: Di default tutti gli utenti avranno accesso a %{value}. + Potrai cambiare i permessi piu' tardi. + permissions_intro_shared: Di default solo gli utenti selezionati avranno accesso + a %{value}. Potrai cambiare i permessi piu' tardi. referred_by: Riferito da referred_by_small: riferito da save_contact: Salva Contatto - skype: Skype twitter: Twitter web_presence: Presenza Web web_presence_small: presenza web - works_at: "%{job_title} presso %{company}" - - # Views -> Leads. - #---------------------------------------------------------------------------- + works_at: ! '%{job_title} presso %{company}' convert: Converti convert_lead: Converti Potenziale - convert_lead_permissions_intro: I permessi del contatto saranno copiati dalla conversione del potenziale. Potrai cambiare i permessi piu' tardi. - convert_lead_text: Convertendo il potenziale %{value} verra' associato ad un contatto esistente oppure ad un nuovo contatto creato. Lo stato del potenziale sara' automaticamente inmpostato a Convertito. + convert_lead_permissions_intro: I permessi del contatto saranno copiati dalla conversione + del potenziale. Potrai cambiare i permessi piu' tardi. + convert_lead_text: Convertendo il potenziale %{value} verra' associato ad un contatto + esistente oppure ad un nuovo contatto creato. Lo stato del potenziale sara' automaticamente + inmpostato a Convertito. create_lead: Crea potenziale - create_opp_for_contact: E' possibile creare una opoortunita' per il %{value} contatto attraverso l'indicazione del nome, stato corrente, data chiusura stimata, probabilita' vendita, ammontare dell'affare e sconto offerto. + create_opp_for_contact: E' possibile creare una opoortunita' per il %{value} contatto + attraverso l'indicazione del nome, stato corrente, data chiusura stimata, probabilita' + vendita, ammontare dell'affare e sconto offerto. lead: Potenziale lead_info_small: contatti potenziale - lead_permissions_intro_private: Di default i permessi saranno copiati dalla campagna o impostati a privato. Potrai cambiare i permessi del potenziale piu' tardi. - lead_permissions_intro_public: Di default i permessi saranno copiati dalla campagna o impostati a pubblico. Potrai cambiare i permessi del potenziale piu' tardi. - lead_permissions_intro_shared: Di default i permessi saranno copiati dalla campagna o condivisi con gli utenti specificati. Potrai cambiare i permessi del potenziale piu' tardi. + lead_permissions_intro_private: Di default i permessi saranno copiati dalla campagna + o impostati a privato. Potrai cambiare i permessi del potenziale piu' tardi. + lead_permissions_intro_public: Di default i permessi saranno copiati dalla campagna + o impostati a pubblico. Potrai cambiare i permessi del potenziale piu' tardi. + lead_permissions_intro_shared: Di default i permessi saranno copiati dalla campagna + o condivisi con gli utenti specificati. Potrai cambiare i permessi del potenziale + piu' tardi. lead_small: potenziale lead_status_small: stato del potenziale lead_summary: Sommario del Potenziale @@ -395,9 +369,6 @@ it: source: Sorgente status: Stato total_leads: Potenziali Totali - - # Views -> Opportunities. - #---------------------------------------------------------------------------- amount: Importo close_date: Data chiusura closed_ago_on: chiuso %{time_ago} fa, il %{date} @@ -419,7 +390,7 @@ it: opportunity: Opportunita' opportunity_small: opportunita' opportunity_summary: Opportunita' a colpo d'occhio - opportunity_summary_text: "%{amount} con %{discount} sconto e %{probability} probabilita'" + opportunity_summary_text: ! '%{amount} con %{discount} sconto e %{probability} probabilita''' past_due: scadenza superata, era previsto concludersi %{value} fa probability: Probabilita' probability_number: e %{value} probabilita' @@ -427,9 +398,6 @@ it: stage: Punto total_opportunities: Totale Opportunita' weighted_amount: Importo pesato - - # Views -> Tasks. - #---------------------------------------------------------------------------- assign_to: Assegnato a assigned_tab: Assegnato assigned_tasks: Lavori Assegnati @@ -441,13 +409,13 @@ it: due: Scadenza feel_free: Liberi di move_to: spostare a - no_tasks: "Non hai lavori %{value}" + no_tasks: Non hai lavori %{value} no_tasks_pending: in attesa no_tasks_assigned: assegnati no_tasks_completed: completati pending_tab: In attesa pending_tasks: Lavori in attesa - related: 'ref:' + related: ! 'ref:' save_task: Salva Lavoro task_assigned: Il lavoro e' stato assegnato a %{value} task_assigned_to: e assegnato a %{value} @@ -467,9 +435,6 @@ it: total_tasks: Totale %{value} view_assigned_tasks: vedi i lavori assegnati view_pending_tasks: vedi i lavori pendenti - - # Views -> Home. - #---------------------------------------------------------------------------- action_commented: commentato il action_completed: completato action_created: creato @@ -491,9 +456,6 @@ it: subject_lead: potenziale subject_opportunity: opportunita' subject_task: lavoro - - # Views -> Common. - #---------------------------------------------------------------------------- add_note: Aggiungi Nota save_note: Salva Nota add_note_help: Aggiungi una nuova nota... @@ -505,15 +467,15 @@ it: close_form: Modello chisura confirm_delete: Sei sicuro di voler eliminare questo %{value}? copy_permissions: Copia %{value} permessi - could_not_find: "Non e' stato possibile trovare alcun/a %{value}. Ti e' possibile" - could_not_find_matching: "Non e' stato trovato alcuna corrispondenza con %{value}" + could_not_find: Non e' stato possibile trovare alcun/a %{value}. Ti e' possibile + could_not_find_matching: Non e' stato trovato alcuna corrispondenza con %{value} create_new: crea nuovo create_a_new: creare nuovo/a select_existing: seleziona esistente delete: Elimina discard: Rimuovi edit: Modifica - items_total: '%{count} totali.' + items_total: ! '%{count} totali.' less: Meno... me: me more: Piu'... @@ -530,11 +492,11 @@ it: select_task: Seleziona Lavoro select_opportunity: Seleziona Opportunita' search_assets: Cerca %{value} - time_ago: "%{value} fa" + time_ago: ! '%{value} fa' background_info: Informazioni background address: Indirizzo - street1: Via 1 # NUOVO - street2: Via 2 # NUOVO + street1: Via 1 + street2: Via 2 city: Citta' zipcode: CAP state: Stato @@ -543,9 +505,6 @@ it: collapse_all: Raggruppa tutti expanded: Espandi collapsed: Raggruppa - - # Views -> Layout. - #---------------------------------------------------------------------------- about: Info about_dev_group: Gruppo di discussione per gli sviluppatori about_features: Caratteristiche e bug @@ -554,34 +513,24 @@ it: about_ffc_version: Fat Free CRM versione about_home_page: Home page about_project_page: Pagina del Progetto - about_thank_you: Grazie per usare Fat Free CRM! Appreziamo il tuo business e speriamo ti sia gradito l'uso di questo programma. + about_thank_you: Grazie per usare Fat Free CRM! Appreziamo il tuo business e speriamo + ti sia gradito l'uso di questo programma. about_twitter: Aggiornamenti Twitter delle modifiche about_user_group: Gruppo di discussione per gli utenti admin: Amministrazione logout: Logout quick_find: Ricerca veloce welcome: Benvenuto - - # Views -> Comments. - #---------------------------------------------------------------------------- edit_comment: Modificando commento show: Mostra update: Aggiorna - - # Views -> Passwords. - #---------------------------------------------------------------------------- confirm_password_intro: Per favore digita la tua password e la conferma. - password_intro: Specifica il tuo indirizzo email, e le istruzioni per resettare la password ti saranno inviate. + password_intro: Specifica il tuo indirizzo email, e le istruzioni per resettare + la password ti saranno inviate. reset_password: Resetta Password update_password_and_login: Aggiorna Password e Login - - # Views -> Admin - #---------------------------------------------------------------------------- back_to_crm: Ritorna a Fat Free CRM crm_admin_page: Fat Free CRM Amministrazione - - # Views -> Admin -> Users. - #---------------------------------------------------------------------------- approve: Approva create_user: Utente creato last_seen: ultima visita %{value} fa @@ -592,9 +541,10 @@ it: user_active: Attivo user_admin: Admin user_awaits_approval: in attesa di approvazione - user_confirm_delete: Un utente puo' essere cancellato se non ha assests assegnati lasciati indietro. + user_confirm_delete: Un utente puo' essere cancellato se non ha assests assegnati + lasciati indietro. user_is_admin: L'utente e' Amministratore - user_never_logged_in: "non si e' ancora collegato" + user_never_logged_in: non si e' ancora collegato user_signed_up: Iscritto user_signed_up_on: iscritto il %{value} user_since: utente dal %{value} @@ -602,53 +552,40 @@ it: user_suspended_on: sospeso il %{value} users: Utenti users_small: utenti - - # Export. - #---------------------------------------------------------------------------- to_xls: Esporta a Excel to_csv: Esporta al formato file delimitato da virgole (inclusi i record cancellati) to_rss: RSS feed to_atom: Atom feed - - # Dropbox. - #---------------------------------------------------------------------------- dropbox_notification_subject: dropbox - Aggiunta email - %{subject} dropbox_notification_intro: Email inviata a dropbox aggiunta con successo dropbox_notification_to: Aggiunto a subject: Oggetto body: Corpo - - # Pluralizations. - #---------------------------------------------------------------------------- pluralize: comment: - one: '1 commento' - other: '%{count} commenti' + one: 1 commento + other: ! '%{count} commenti' contact: - one: '1 contatto' - other: '%{count} contatti' + one: 1 contatto + other: ! '%{count} contatti' opportunity: - one: '1 opportunity' - other: '%{count} opportunita''' + one: 1 opportunity + other: ! '%{count} opportunita''' lead: - one: '1 potenziale' - other: '%{count} potenziali' + one: 1 potenziale + other: ! '%{count} potenziali' day: - one: '1 giorno' - other: '%{count} giorni' + one: 1 giorno + other: ! '%{count} giorni' login: - one: '1 login' - other: '%{count} logins' - - # Custom date/time formats. - #---------------------------------------------------------------------------- + one: 1 login + other: ! '%{count} logins' date: formats: - mmddyyyy: "%d/%m/%Y" - mmdd: "%b %e" - mmddyy: "%b %e, %Y" - + mmddyyyy: ! '%d/%m/%Y' + mmdd: ! '%b %e' + mmddyy: ! '%b %e, %Y' time: formats: - mmddhhss: "%b %e at %l:%M%p" - mmddyyyy_hhmm: "%d/%m/%Y %H:%M" + mmddhhss: ! '%b %e at %l:%M%p' + mmddyyyy_hhmm: ! '%d/%m/%Y %H:%M' diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 72951859f4..b8243f469b 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1,188 +1,219 @@ -# Japanese translations for Ruby on Rails -# by Akira Matsuda (ronnie@dio.jp) -# AR error messages are basically taken from Ruby-GetText-Package. Thanks to Masao Mutoh. -# contributors: -# - Tsutomu Kuroda (t-kuroda@oiax.jp) - +--- ja: date: formats: - default: "%Y/%m/%d" - short: "%m/%d" - long: "%Y年%m月%d日(%a)" - - day_names: [日曜日, 月曜日, 火曜日, 水曜日, 木曜日, 金曜日, 土曜日] - abbr_day_names: [日, 月, 火, 水, 木, 金, 土] - - month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月] - abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月] - + default: ! '%Y/%m/%d' + short: ! '%m/%d' + long: ! '%Y年%m月%d日(%a)' + day_names: + - 日曜日 + - 月曜日 + - 火曜日 + - 水曜日 + - 木曜日 + - 金曜日 + - 土曜日 + abbr_day_names: + - 日 + - 月 + - 火 + - 水 + - 木 + - 金 + - 土 + month_names: + - + - 1月 + - 2月 + - 3月 + - 4月 + - 5月 + - 6月 + - 7月 + - 8月 + - 9月 + - 10月 + - 11月 + - 12月 + abbr_month_names: + - + - 1月 + - 2月 + - 3月 + - 4月 + - 5月 + - 6月 + - 7月 + - 8月 + - 9月 + - 10月 + - 11月 + - 12月 order: - - :year - - :month - - :day - + - :year + - :month + - :day time: formats: - default: "%Y/%m/%d %H:%M:%S" - short: "%y/%m/%d %H:%M" - long: "%Y年%m月%d日(%a) %H時%M分%S秒 %Z" - am: "午前" - pm: "午後" - + default: ! '%Y/%m/%d %H:%M:%S' + short: ! '%y/%m/%d %H:%M' + long: ! '%Y年%m月%d日(%a) %H時%M分%S秒 %Z' + am: 午前 + pm: 午後 support: array: - sentence_connector: "と" + sentence_connector: と skip_last_comma: true - words_connector: "と" - two_words_connector: "と" - last_word_connector: "と" - + words_connector: と + two_words_connector: と + last_word_connector: と select: - prompt: "選択してください。" - + prompt: 選択してください。 number: format: - separator: "." - delimiter: "," + separator: . + delimiter: ! ',' precision: 3 significant: false strip_insignificant_zeros: false - currency: format: - format: "%n%u" - unit: "円" - separator: "." - delimiter: "," + format: ! '%n%u' + unit: 円 + separator: . + delimiter: ! ',' precision: 3 significant: false strip_insignificant_zeros: false - percentage: format: - delimiter: "" - + delimiter: '' precision: format: - delimiter: "" - + delimiter: '' human: format: - delimiter: "" + delimiter: '' precision: 3 significant: true strip_insignificant_zeros: true - storage_units: - format: "%n%u" + format: ! '%n%u' units: - byte: "バイト" - kb: "キロバイト" - mb: "メガバイト" - gb: "ギガバイト" - tb: "テラバイト" - + byte: バイト + kb: キロバイト + mb: メガバイト + gb: ギガバイト + tb: テラバイト decimal_units: - format: "%n %u" + format: ! '%n %u' units: - unit: "" - thousand: "千" - million: "百万" - billion: "十億" - trillion: "兆" - quadrillion: "千兆" - + unit: '' + thousand: 千 + million: 百万 + billion: 十億 + trillion: 兆 + quadrillion: 千兆 datetime: distance_in_words: - half_a_minute: "30秒前後" + half_a_minute: 30秒前後 less_than_x_seconds: - one: "1秒以内" - other: "%{count}秒以内" + one: 1秒以内 + other: ! '%{count}秒以内' x_seconds: - one: "1秒" - other: "%{count}秒" + one: 1秒 + other: ! '%{count}秒' less_than_x_minutes: - one: "1分以内" - other: "%{count}分以内" + one: 1分以内 + other: ! '%{count}分以内' x_minutes: - one: "1分" - other: "%{count}分" + one: 1分 + other: ! '%{count}分' about_x_hours: - one: "約1時間" - other: "約%{count}時間" + one: 約1時間 + other: 約%{count}時間 x_days: - one: "1日" - other: "%{count}日" + one: 1日 + other: ! '%{count}日' about_x_months: - one: "約1ヶ月" - other: "約%{count}ヶ月" + one: 約1ヶ月 + other: 約%{count}ヶ月 x_months: - one: "1ヶ月" - other: "%{count}ヶ月" + one: 1ヶ月 + other: ! '%{count}ヶ月' about_x_years: - one: "約1年" - other: "約%{count}年" + one: 約1年 + other: 約%{count}年 over_x_years: - one: "1年以上" - other: "%{count}年以上" + one: 1年以上 + other: ! '%{count}年以上' almost_x_years: - one: "1年弱" - other: "%{count}年弱" - + one: 1年弱 + other: ! '%{count}年弱' prompts: - year: "年" - month: "月" - day: "日" - hour: "時" - minute: "分" - second: "秒" - + year: 年 + month: 月 + day: 日 + hour: 時 + minute: 分 + second: 秒 helpers: select: - prompt: "選択してください。" - + prompt: 選択してください。 submit: - create: "登録する" - update: "更新する" - submit: "保存する" - + create: 登録する + update: 更新する + submit: 保存する errors: - format: "%{attribute} %{message}" - - messages: &errors_messages - inclusion: "は一覧にありません。" - exclusion: "は予約されています。" - invalid: "は不正な値です。" - confirmation: "が一致しません。" - accepted: "を受諾してください。" - empty: "を入力してください。" - blank: "を入力してください。" - too_long: "は%{count}文字以内で入力してください。" - too_short: "は%{count}文字以上で入力してください。" - wrong_length: "は%{count}文字で入力してください。" - not_a_number: "は数値で入力してください。" - not_an_integer: "は整数で入力してください。" - greater_than: "は%{count}より大きい値にしてください。" - greater_than_or_equal_to: "は%{count}以上の値にしてください。" - equal_to: "は%{count}にしてください。" - less_than: "は%{count}より小さい値にしてください。" - less_than_or_equal_to: "は%{count}以下の値にしてください。" - odd: "は奇数にしてください。" - even: "は偶数にしてください。" - + format: ! '%{attribute} %{message}' + messages: + inclusion: は一覧にありません。 + exclusion: は予約されています。 + invalid: は不正な値です。 + confirmation: が一致しません。 + accepted: を受諾してください。 + empty: を入力してください。 + blank: を入力してください。 + too_long: は%{count}文字以内で入力してください。 + too_short: は%{count}文字以上で入力してください。 + wrong_length: は%{count}文字で入力してください。 + not_a_number: は数値で入力してください。 + not_an_integer: は整数で入力してください。 + greater_than: は%{count}より大きい値にしてください。 + greater_than_or_equal_to: は%{count}以上の値にしてください。 + equal_to: は%{count}にしてください。 + less_than: は%{count}より小さい値にしてください。 + less_than_or_equal_to: は%{count}以下の値にしてください。 + odd: は奇数にしてください。 + even: は偶数にしてください。 activerecord: errors: template: header: - one: "%{model}にエラーが発生しました。" - other: "%{model}に%{count}つのエラーが発生しました。" - body: "次の項目を確認してください。" - + one: ! '%{model}にエラーが発生しました。' + other: ! '%{model}に%{count}つのエラーが発生しました。' + body: 次の項目を確認してください。 messages: - taken: "はすでに存在します。" - record_invalid: "バリデーションに失敗しました。 %{errors}" - <<: *errors_messages - + inclusion: は一覧にありません。 + exclusion: は予約されています。 + invalid: は不正な値です。 + confirmation: が一致しません。 + accepted: を受諾してください。 + empty: を入力してください。 + blank: を入力してください。 + too_long: は%{count}文字以内で入力してください。 + too_short: は%{count}文字以上で入力してください。 + wrong_length: は%{count}文字で入力してください。 + not_a_number: は数値で入力してください。 + not_an_integer: は整数で入力してください。 + greater_than: は%{count}より大きい値にしてください。 + greater_than_or_equal_to: は%{count}以上の値にしてください。 + equal_to: は%{count}にしてください。 + less_than: は%{count}より小さい値にしてください。 + less_than_or_equal_to: は%{count}以下の値にしてください。 + odd: は奇数にしてください。 + even: は偶数にしてください。 + taken: はすでに存在します。 + record_invalid: バリデーションに失敗しました。 %{errors} full_messages: - format: "%{attribute} %{message}" + format: ! '%{attribute} %{message}' diff --git a/config/locales/ja_fat_free_crm.yml b/config/locales/ja_fat_free_crm.yml index 51057d9e9b..4db4abaeab 100644 --- a/config/locales/ja_fat_free_crm.yml +++ b/config/locales/ja_fat_free_crm.yml @@ -1,20 +1,15 @@ +--- ja: language: Japanese - - # Generic terms. - #---------------------------------------------------------------------------- all: 全て at: at here: こちら - no_button: 'いいえ' + no_button: いいえ not_implemented: まだ未実装です。 or: または - select_none: '-- なし --' - select_blank: '-- 選択 --' - yes_button: 'はい' - - # Settings. - #---------------------------------------------------------------------------- + select_none: -- なし -- + select_blank: -- 選択 -- + yes_button: はい tab_dashboard: ダッシュボード tab_tasks: タスク tab_campaigns: キャンペーン @@ -22,22 +17,18 @@ ja: tab_accounts: 取引先 tab_contacts: 取引先責任者 tab_opportunities: 商談 - admin_tab_users: ユーザ admin_tab_settings: 管理設定 admin_tab_plugins: プラグイン - planned: 計画済 started: 開始済 on_hold: 保留中 completed: 完了 called_off: 中止 - new: 新規 contacted: 連絡済 converted: コンバート済 rejected: 却下 - cold_call: 勧誘電話 conference: 会議 online: オンラインマーケティング @@ -46,25 +37,21 @@ ja: web: Webサイト word_of_mouth: Word of Mouth other: その他 - prospecting: 見込み analysis: 分析 - presentation: プレゼンテーション + presentation: プレゼン proposal: 提案 negotiation: 価格交渉 final_review: 最終交渉 won: 終/成立 lost: 終/失注 - call: 電話 email: Eメール follow_up: フォローアップ lunch: 昼食会 meeting: 会議 money: Money - presentation: プレゼン trip: 出張 - overdue: 期限切れ due_asap: できるだけ早く due_today: 今日中 @@ -73,24 +60,17 @@ ja: due_next_week: 来週中 due_later: 今後いつか due_specific_date: 指定日... - completed_today: 今日 completed_yesterday: 昨日 completed_last_week: 先週 completed_this_month: 今月 completed_last_month: 先月 - - # Models/Activity. - #---------------------------------------------------------------------------- one_hour: 1時間 one_day: 1日 two_days: 2日 one_week: 1週間 two_weeks: 2週間 one_month: 1ヶ月 - - # Model Validations. - #---------------------------------------------------------------------------- activerecord: errors: models: @@ -103,83 +83,77 @@ ja: account: attributes: name: - missing_account_name: "^取引先名を指定してください。" + missing_account_name: ^取引先名を指定してください。 access: - share_account: "^Please specify users to share the account with." + share_account: ^Please specify users to share the account with. campaign: attributes: name: - missing_campaign_name: "^キャンペーン名を指定してください。" + missing_campaign_name: ^キャンペーン名を指定してください。 ends_on: - dates_not_in_sequence: "^キャンペーンの終了日が開始日の後であることを確認してください。" + dates_not_in_sequence: ^キャンペーンの終了日が開始日の後であることを確認してください。 access: - share_campaign: "^Please specify users to share the campaign with." + share_campaign: ^Please specify users to share the campaign with. contact: attributes: first_name: - missing_first_name: "^名を指定してください。" + missing_first_name: ^名を指定してください。 last_name: - missing_last_name: "^姓を指定してください。" + missing_last_name: ^姓を指定してください。 access: - share_contact: "^Please specify users to share the contact with." + share_contact: ^Please specify users to share the contact with. lead: attributes: first_name: - missing_first_name: "^名を指定してください。" + missing_first_name: ^名を指定してください。 last_name: - missing_last_name: "^姓を指定してください。" + missing_last_name: ^姓を指定してください。 access: - share_lead: "^Please specify users to share the lead with." + share_lead: ^Please specify users to share the lead with. opportunity: attributes: name: - missing_opportunity_name: "^商談名を指定してください。" + missing_opportunity_name: ^商談名を指定してください。 access: - share_opportunity: "^Please specify users to share the opportunity with." + share_opportunity: ^Please specify users to share the opportunity with. task: attributes: name: - missing_task_name: "^タスク名を指定してください。" + missing_task_name: ^タスク名を指定してください。 calendar: - invalid_date: "^正しい日付を指定してください。" + invalid_date: ^正しい日付を指定してください。 user: attributes: username: - missing_username: "^ユーザ名を指定してください。" - username_taken: "^このユーザ名は既に取得されています。" + missing_username: ^ユーザ名を指定してください。 + username_taken: ^このユーザ名は既に取得されています。 email: - missing_email: "^Eメールアドレスを指定してください。" - email_in_use: "^同じEメールアドレスを持つ他のユーザがいます。" - - # dynamic_form plugin translations. - #---------------------------------------------------------------------------- + missing_email: ^Eメールアドレスを指定してください。 + email_in_use: ^同じEメールアドレスを持つ他のユーザがいます。 errors: template: header: - one: "%{model}にエラーが発生しました。" - other: "%{model}に%{count}つのエラーが発生しました。" - body: "次の項目を確認してください。" - + one: ! '%{model}にエラーが発生しました。' + other: ! '%{model}に%{count}つのエラーが発生しました。' + body: 次の項目を確認してください。 msg_account_suspended: User account has been suspended. password_reset_instruction: password reset instructions - - # Controllers. - #---------------------------------------------------------------------------- msg_account_created: あなたのアカウントは生成され、システム管理者の承認待ちです。 msg_account_not_approved: あなたのアカウントは承認されていません。 - msg_asset_deleted: "%{value} は削除されています。" + msg_asset_deleted: ! '%{value} は削除されています。' msg_asset_not_available: この %{value} は、もはや存在しません。 - msg_asset_not_authorized: You are not authorized to view this %{value}. # TODO - msg_assets_not_available: %{value} は存在しません。 - msg_asset_rejected: "%{value} は拒否されています。" - msg_bad_image_file: "^指定されたファイルのアップデートもしくはリサイズができませんでした。" - msg_cant_create_related: "%{related} がもはや存在しないため、 %{asset} を生成できません。" - msg_cant_delete_user: "Couldn't delete the user since %{value} has related assets present." - msg_cant_do: "Can't %{action} the %{asset} since it's no longer available." + msg_asset_not_authorized: You are not authorized to view this %{value}. + msg_assets_not_available: ! '%{value} は存在しません。' + msg_asset_rejected: ! '%{value} は拒否されています。' + msg_bad_image_file: ^指定されたファイルのアップデートもしくはリサイズができませんでした。 + msg_cant_create_related: ! '%{related} がもはや存在しないため、 %{asset} を生成できません。' + msg_cant_delete_user: Couldn't delete the user since %{value} has related assets + present. + msg_cant_do: Can't %{action} the %{asset} since it's no longer available. msg_email_not_found: そのEメールアドレスを持つユーザが見つかりませんでした。 msg_enter_new_password: 新しいパスワードを入力してください。 msg_goodbye: ログアウトしました。 Fat Free CRM をご利用いただき、ありがとうございます! - msg_invalid_password: "^Please specify valid current password" + msg_invalid_password: ^Please specify valid current password msg_invalig_login: ユーザ名かパスワードが不正です。 msg_last_login: あなたの最終ログインは %{value} です。 msg_login_needed: このページへのアクセスにはログインが必要です。 @@ -191,10 +165,7 @@ ja: msg_require_admin: このページへのアクセスは管理者でなければなりません。 msg_successful_signup: サインアップ成功です。 Fat Free CRM へようこそ! msg_welcome: Fat Free CRM へようこそ! - - # Options. - #---------------------------------------------------------------------------- - "option_amount*probability": weighted amount + option_amount*probability: weighted amount activity_options: Show %{models} activities performed by %{user} in the past %{period}. all_users: 全ユーザ option_after: 前 @@ -219,12 +190,9 @@ ja: option_target_leads: target leads option_target_revenue: target revenue option_updated_at: 更新日 - show_per_page: "%{fmt}書式で1ページ%{number}件ずつ%{models}を表示。" - sort_by: "%{field}で%{models}を並べ替える。" - sort_by_displaying: "姓を名の%{position}に表示にして、%{field}で%{models}を並べ替える。" - - # Views -> Profile. - #---------------------------------------------------------------------------- + show_per_page: ! '%{fmt}書式で1ページ%{number}件ずつ%{models}を表示。' + sort_by: ! '%{field}で%{models}を並べ替える。' + sort_by_displaying: 姓を名の%{position}に表示にして、%{field}で%{models}を並べ替える。 aim: AOL IM already_signed_up: サインアップ済みですか? alt_email: その他のEメール @@ -234,12 +202,12 @@ ja: contact_info: 連絡先情報 current_password: 現在のパスワード edit_profile: プロフィール編集 - # email: Eメール # <-- Already defined as the task type if Settings. first_name: 名 google: Google IM gravatar_help: Gravatarsをご存知ない? Gravatarsについては image_file: 画像ファイル - image_help: アップロードされた画像ファイルは自動的に 75 x 75 ピクセルの大きさに調整されます。対応フォーマットは GIF, JPG, PNG です。 + image_help: アップロードされた画像ファイルは自動的に 75 x 75 ピクセルの大きさに調整されます。対応フォーマットは GIF, JPG, PNG + です。 job_title: 役職 last_name: 姓 login_now_link: 今すぐログイン! @@ -260,17 +228,11 @@ ja: user: ユーザ username: ユーザ名 yahoo: Yahoo IM - - # Views -> Authenticate. - #---------------------------------------------------------------------------- forgot_password: パスワードを忘れた場合 login: ログイン no_account: アカウントがない場合 remember_me: Remember Me sign_up_now: 今すぐサインアップ! - - # Views -> Accounts. - #---------------------------------------------------------------------------- account: 取引先 account_small: 取引先 accounts: 取引先 @@ -282,10 +244,10 @@ ja: date_created: 作成日 date_updated: 更新日 fax: FAX - intro: "後で%{value}の情報を追加することができます。" + intro: 後で%{value}の情報を追加することができます。 mobile_small: 携帯電話 - open_in_window: "新しいウィンドウで%{value}を開く" - mail_to: "%{value}へのメール" + open_in_window: 新しいウィンドウで%{value}を開く + mail_to: ! '%{value}へのメール' phone_small: 電話 phone_toll_free: 通話無料 keep_private: 秘密扱いにして、他人と共有しない @@ -295,9 +257,6 @@ ja: share_with: 以下の人達と共有する shipping_address: 発送先住所 website: Webサイト - - # Views -> Campaigns. - #---------------------------------------------------------------------------- actual: Actual actual_performance: Actual Performance budget: 予算 @@ -312,7 +271,7 @@ ja: campaigns_small: キャンペーン conversion: Conversion conversion_label: Conversion (%) - conversion_number: "%{value} conversion" + conversion_number: ! '%{value} conversion' create_campaign: キャンペーンを作成 end_date: 終了日 finished_on: completed on %{value} @@ -320,23 +279,22 @@ ja: no_start_date: 開始日未設定 number_of_leads: Number of leads objectives: Objectives - objectives_help: Please specify target number of leads, expected leads-to-opportunities conversion ratio, target revenue, and campaign budget. These numbers will let you track actual campaign performance. + objectives_help: Please specify target number of leads, expected leads-to-opportunities + conversion ratio, target revenue, and campaign budget. These numbers will let + you track actual campaign performance. objectives_small: campaign objectives revenue: Revenue revenue_label: Revenue ($) - revenue_number: "%{value} in revenue" + revenue_number: ! '%{value} in revenue' save_campaign: キャンペーンを保存 start_date: 開始日 - started_ago: %{value} 前に開始 + started_ago: ! '%{value} 前に開始' starts_in: starts in %{value} starts_today: 本日開始! target: Target total_campaigns: キャンペーンの合計 was_supposed_to_finish: was supposed to finish on %{value} was_supposed_to_start: was supposed to start %{time_ago} ago on %{start_date} - - # Views -> Contacts. - #---------------------------------------------------------------------------- alt_email_small: その他 blog: Webサイト/ブログ contact: 取引先責任者 @@ -346,37 +304,42 @@ ja: contacts_small: 取引先責任者 create_contact: 取引先責任者を作成 department: 部署 - department_small: '%{value}部署' + department_small: ! '%{value}部署' do_not_call: 電話しない extra_info: 追加情報 extra_info_small: 追加取引先責任者 facebook: Facebook linked_in: LinkedIn myself: 自分自身 - permissions_intro_private: "デフォルトでは、あなただけが%{value}にアクセスできます。パーミッションは後で変更することができます。" - permissions_intro_public: "デフォルトでは、全ユーザが%{value}にアクセスできます。パーミッションは後で変更することができます。" - permissions_intro_shared: "デフォルトでは、指定ユーザが%{value}にアクセスできます。パーミッションは後で変更することができます。" + permissions_intro_private: デフォルトでは、あなただけが%{value}にアクセスできます。パーミッションは後で変更することができます。 + permissions_intro_public: デフォルトでは、全ユーザが%{value}にアクセスできます。パーミッションは後で変更することができます。 + permissions_intro_shared: デフォルトでは、指定ユーザが%{value}にアクセスできます。パーミッションは後で変更することができます。 referred_by: Referred by referred_by_small: referred by save_contact: 取引先責任者を保存 twitter: Twitter web_presence: Webサイト情報 web_presence_small: Webサイト - works_at: "%{company} の %{job_title}" - - # Views -> Leads. - #---------------------------------------------------------------------------- + works_at: ! '%{company} の %{job_title}' convert: コンバート convert_lead: Convert Lead - convert_lead_permissions_intro: Contact permissions will be copied from the lead being converted. You can change contact permissions later. - convert_lead_text: By converting the lead %{value} will become a contact associated with the existing or newly created account. Lead status will be automatically set to converted. + convert_lead_permissions_intro: Contact permissions will be copied from the lead + being converted. You can change contact permissions later. + convert_lead_text: By converting the lead %{value} will become a contact associated + with the existing or newly created account. Lead status will be automatically + set to converted. create_lead: リードを作成 - create_opp_for_contact: You can optionally create an opportunity for the %{value} contact by specifying the name, current stage, estimated closing date, sale probability, amount of the deal, and the discount offered. + create_opp_for_contact: You can optionally create an opportunity for the %{value} + contact by specifying the name, current stage, estimated closing date, sale probability, + amount of the deal, and the discount offered. lead: リード lead_info_small: リード連絡先 - lead_permissions_intro_private: By default permissions will be copied from the campaign or set to private. You can change lead permissions later. - lead_permissions_intro_public: By default permissions will be copied from the campaign or set to public. You can change lead permissions later. - lead_permissions_intro_shared: By default permissions will be copied from the campaign or shared with the specified users. You can change lead permissions later. + lead_permissions_intro_private: By default permissions will be copied from the campaign + or set to private. You can change lead permissions later. + lead_permissions_intro_public: By default permissions will be copied from the campaign + or set to public. You can change lead permissions later. + lead_permissions_intro_shared: By default permissions will be copied from the campaign + or shared with the specified users. You can change lead permissions later. lead_small: リード lead_status_small: リードステータス lead_summary: Lead Summary @@ -391,12 +354,9 @@ ja: source: Source status: Status total_leads: リードの合計 - - # Views -> Opportunities. - #---------------------------------------------------------------------------- amount: 金額 close_date: 終了日 - closed_ago_on: "%{date}の%{time_ago}前に終了" + closed_ago_on: ! '%{date}の%{time_ago}前に終了' closes_today: 本日終了の見込み closing_date: 終了日は%{value} create_opportunity: 商談を作成 @@ -404,8 +364,8 @@ ja: days_late: Late by days_left: Days left discount: 値引き - discount_number: "値引き%{value}" - expected_to_close: "%{date}の%{time}に終了の見込み" + discount_number: 値引き%{value} + expected_to_close: ! '%{date}の%{time}に終了の見込み' from: from no_closing_date: 予測終了日なし no_discount: 値引きなし @@ -415,17 +375,14 @@ ja: opportunity: 商談 opportunity_small: 商談 opportunity_summary: Opportunity At a Glance - opportunity_summary_text: "%{amount} %{discount}値引きかつ確度%{probability}" - past_due: "期限切れ、%{value}前に終了見込み" + opportunity_summary_text: ! '%{amount} %{discount}値引きかつ確度%{probability}' + past_due: 期限切れ、%{value}前に終了見込み probability: 確度 - probability_number: "かつ確度%{value}" + probability_number: かつ確度%{value} save_opportunity: 商談を保存 stage: Stage total_opportunities: 商談の合計 weighted_amount: Weighted amount - - # Views -> Tasks. - #---------------------------------------------------------------------------- assign_to: 担当 assigned_tab: 担当 assigned_tasks: 担当タスク @@ -437,19 +394,19 @@ ja: due: 期日 feel_free: どうぞお気軽に move_to: move to - no_tasks: "%{value}のタスクはありません" + no_tasks: ! '%{value}のタスクはありません' no_tasks_pending: 未完了 no_tasks_assigned: 担当 no_tasks_completed: 完了 pending_tab: 未完了 pending_tasks: 未完了タスク - related: 're:' + related: ! 're:' save_task: タスクを保存 task_assigned: The task has been assigned to %{value} task_assigned_to: and assigned to %{value} task_completed: 完了 - task_completed_ago: %{value} 前に完了 - task_completed_by: %{user} によって %{time_ago} 前に完了 + task_completed_ago: ! '%{value} 前に完了' + task_completed_by: ! '%{user} によって %{time_ago} 前に完了' task_created: タスクが作成されました task_due_in: due in %{value} task_due_later: due sometime soon @@ -460,17 +417,14 @@ ja: task_pending: The task has been moved to pending tasks task_small: タスク tasks: タスク - total_tasks: "%{value}の合計" + total_tasks: ! '%{value}の合計' view_assigned_tasks: 担当タスクを表示 view_pending_tasks: 見完了タスクを表示 - - # Views -> Home. - #---------------------------------------------------------------------------- action_commented: コメントした action_completed: 完了した action_created: 作成した action_deleted: 削除した - action_email: exchanged emails with # TODO + action_email: exchanged emails with action_reassigned: 再割り当てした action_rejected: 拒否した action_rescheduled: 再スケジュールした @@ -486,31 +440,28 @@ ja: subject_lead: リード subject_opportunity: 商談 subject_task: タスク - - # Views -> Common. - #---------------------------------------------------------------------------- add_note: ノートを追加 save_note: ノートを保存 add_note_help: 新しいノートを追加... edit_note: ノートを編集 - added_ago: "%{value} 前に追加" - added_by: "%{user} により %{time_ago} 前に追加" + added_ago: ! '%{value} 前に追加' + added_by: ! '%{user} により %{time_ago} 前に追加' back: 戻る cancel: キャンセル close_form: フォームを閉じる confirm_delete: この %{value} を削除しますか? copy_permissions: Copy %{value} permissions - could_not_find: "%{value}がありません。どうぞお気軽に" - could_not_find_matching: "マッチする%{value}がありません。" + could_not_find: ! '%{value}がありません。どうぞお気軽に' + could_not_find_matching: マッチする%{value}がありません。 create_new: 新規作成してください - select_existing: 既存から選択 delete: 削除 - discard: Discard # TODO + discard: Discard edit: 編集 - items_total: '合計 %{count}' - less: Less... # TODO + items_total: 合計 %{count} + less: Less... me: 自分 - more: More... # TODO + more: More... n_a: N/A name: 名前 no_match: No %{value} match @@ -519,8 +470,8 @@ ja: permissions: パーミッション please_retry: please try another query. recent_items: 最近のアイテム - search_assets: "%{value}を検索" - time_ago: "%{value}前" + search_assets: ! '%{value}を検索' + time_ago: ! '%{value}前' background_info: 背景 address: 住所 street1: 番地1 @@ -529,9 +480,6 @@ ja: zipcode: 郵便番号 state: 都道府県 country: 国 - - # Views -> Layout. - #---------------------------------------------------------------------------- about: About about_dev_group: 開発者のためのディスカッショングループ about_features: Features and bugs @@ -540,38 +488,27 @@ ja: about_ffc_version: Fat Free CRM バージョン about_home_page: Home page about_project_page: プロジェクトページ - about_thank_you: Thank you for using Fat Free CRM! We appreciate your business and hope you enjoy using the software. + about_thank_you: Thank you for using Fat Free CRM! We appreciate your business and + hope you enjoy using the software. about_twitter: Twitter commit updates about_user_group: ユーザのためのディスカッショングループ admin: 管理画面 logout: ログアウト quick_find: Quick find welcome: ようこそ - - # Views -> Comments. - #---------------------------------------------------------------------------- edit_comment: コメント編集中 show: 表示 update: 更新 - - # Views -> Passwords. - #---------------------------------------------------------------------------- confirm_password_intro: Please type your new password and then confirm it. - password_intro: Please specify your email address, and the instructions to reset your password will be sent to you. + password_intro: Please specify your email address, and the instructions to reset + your password will be sent to you. reset_password: Reset Password update_password_and_login: Update Password and Login - - # Views -> Admin - #---------------------------------------------------------------------------- - # TODO back_to_crm: Fat Free CRM に戻る crm_admin_page: Fat Free CRM 管理 - - # Views -> Admin -> Users. - #---------------------------------------------------------------------------- approve: Approve create_user: ユーザを作成 - last_seen: "最後に見たのは%{value}前" + last_seen: 最後に見たのは%{value}前 personal_information: 個人情報 reactivate: Reactivate save_user: ユーザを保存 @@ -581,46 +518,39 @@ ja: user_awaits_approval: awaits your approval user_confirm_delete: A user can only be deleted if no related assets are left behind. user_is_admin: このユーザは管理者 - user_never_logged_in: "hasn't logged in yet" + user_never_logged_in: hasn't logged in yet user_signed_up: Signed Up user_signed_up_on: signed up on %{value} - user_since: "%{value}からのユーザ" + user_since: ! '%{value}からのユーザ' user_suspended: Suspended user_suspended_on: suspended on %{value} users: ユーザ users_small: ユーザ - - # Pluralizations. - #---------------------------------------------------------------------------- pluralize: comment: - one: '1 件のコメント' # TODO - other: '%{count} 件のコメント' # TODO + one: 1 件のコメント + other: ! '%{count} 件のコメント' contact: - one: '1 contact' - other: '%{count} contacts' + one: 1 contact + other: ! '%{count} contacts' opportunity: - one: '1 件の商談' - other: '%{count} 件の商談' + one: 1 件の商談 + other: ! '%{count} 件の商談' lead: - one: '1 lead' - other: '%{count} leads' + one: 1 lead + other: ! '%{count} leads' day: - one: '1 日' - other: '%{count} 日' + one: 1 日 + other: ! '%{count} 日' login: - one: '1 login' - other: '%{count} logins' - - # Custom date/time formats. - #---------------------------------------------------------------------------- + one: 1 login + other: ! '%{count} logins' date: formats: - mmddyyyy: "%Y/%m/%d" - mmdd: "%b %e" - mmddyy: "%b %e, %Y" - + mmddyyyy: ! '%Y/%m/%d' + mmdd: ! '%b %e' + mmddyy: ! '%b %e, %Y' time: formats: - mmddhhss: "%b %e at %l:%M%p" - mmddyyyy_hhmm: "%m/%d/%Y %l:%M %p" + mmddhhss: ! '%b %e at %l:%M%p' + mmddyyyy_hhmm: ! '%m/%d/%Y %l:%M %p' diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 55eceb57b5..f5b35ded93 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1,194 +1,230 @@ -# Polish translations for Ruby on Rails -# by Jacek Becela (jacek.becela@gmail.com, http://github.com/ncr) -# Minor changes and adjustments for Rails 3 by Piotrek Okoński (http://github.com/pokonski) -# Minor changes and adjustments by Paweł Chojnacki (https://github.com/chojnacki) - +--- pl: date: formats: - default: "%d-%m-%Y" - short: "%d %b" - long: "%B %d, %Y" - - day_names: [niedziela, poniedziałek, wtorek, środa, czwartek, piątek, sobota] - abbr_day_names: [nie, pon, wto, śro, czw, pia, sob] - - month_names: [~, styczeń, luty, marzec, kwiecień, maj, czerwiec, lipiec, sierpień, wrzesień, październik, listopad, grudzień] - abbr_month_names: [~, sty, lut, mar, kwi, maj, cze, lip, sie, wrz, paź, lis, gru] + default: ! '%d-%m-%Y' + short: ! '%d %b' + long: ! '%B %d, %Y' + day_names: + - niedziela + - poniedziałek + - wtorek + - środa + - czwartek + - piątek + - sobota + abbr_day_names: + - nie + - pon + - wto + - śro + - czw + - pia + - sob + month_names: + - + - styczeń + - luty + - marzec + - kwiecień + - maj + - czerwiec + - lipiec + - sierpień + - wrzesień + - październik + - listopad + - grudzień + abbr_month_names: + - + - sty + - lut + - mar + - kwi + - maj + - cze + - lip + - sie + - wrz + - paź + - lis + - gru order: - - :day - - :month - - :year - + - :day + - :month + - :year time: formats: - default: "%a, %d %b %Y %H:%M:%S %z" - short: "%d %b %H:%M" - long: "%B %d, %Y %H:%M" - am: "przed południem" - pm: "po południu" - + default: ! '%a, %d %b %Y %H:%M:%S %z' + short: ! '%d %b %H:%M' + long: ! '%B %d, %Y %H:%M' + am: przed południem + pm: po południu support: array: - words_connector: ", " - two_words_connector: " i " - last_word_connector: " oraz " - + words_connector: ! ', ' + two_words_connector: ! ' i ' + last_word_connector: ! ' oraz ' select: - prompt: "Proszę wybrać" - + prompt: Proszę wybrać number: format: - separator: "," - delimiter: " " + separator: ! ',' + delimiter: ! ' ' precision: 3 significant: false strip_insignificant_zeros: false - currency: format: - format: "%u %n" - unit: "PLN" - separator: "," - delimiter: " " + format: ! '%u %n' + unit: PLN + separator: ! ',' + delimiter: ! ' ' precision: 2 significant: false strip_insignificant_zeros: true - percentage: format: - delimiter: "" - + delimiter: '' precision: format: - delimiter: "" - + delimiter: '' human: format: - delimiter: "" + delimiter: '' precision: 3 significant: true strip_insignificant_zeros: true storage_units: - format: "%n %u" + format: ! '%n %u' units: byte: - one: "bajt" - other: "bajty" - kb: "KB" - mb: "MB" - gb: "GB" - tb: "TB" + one: bajt + other: bajty + kb: KB + mb: MB + gb: GB + tb: TB decimal_units: - format: "%n %u" + format: ! '%n %u' units: - unit: "" + unit: '' thousand: Tysiąc million: Milion billion: Miliard trillion: Bilion quadrillion: Biliard - datetime: distance_in_words: - half_a_minute: "pół minuty" + half_a_minute: pół minuty less_than_x_seconds: - one: "mniej niż sekundę" - few: "mniej niż %{count} sekundy" - other: "mniej niż %{count} sekund" + one: mniej niż sekundę + few: mniej niż %{count} sekundy + other: mniej niż %{count} sekund x_seconds: - one: "1 sekunda" - few: "%{count} sekundy" - other: "%{count} sekund" + one: 1 sekunda + few: ! '%{count} sekundy' + other: ! '%{count} sekund' less_than_x_minutes: - one: "mniej niż minutę" - few: "mniej niż %{count} minuty" - other: "mniej niż %{count} minut" + one: mniej niż minutę + few: mniej niż %{count} minuty + other: mniej niż %{count} minut x_minutes: - one: "1 minuta" - few: "%{count} minuty" - other: "%{count} minut" + one: 1 minuta + few: ! '%{count} minuty' + other: ! '%{count} minut' about_x_hours: - one: "około godziny" - few: "około %{count} godziny" - other: "około %{count} godzin" + one: około godziny + few: około %{count} godziny + other: około %{count} godzin x_days: - one: "1 dzień" - few: "%{count} dni" - other: "%{count} dni" + one: 1 dzień + few: ! '%{count} dni' + other: ! '%{count} dni' about_x_months: - one: "około miesiąca" - few: "około %{count} miesiące" - other: "około %{count} miesięcy" + one: około miesiąca + few: około %{count} miesiące + other: około %{count} miesięcy x_months: - one: "1 miesiąc" - few: "%{count} miesiące" - other: "%{count} miesięcy" + one: 1 miesiąc + few: ! '%{count} miesiące' + other: ! '%{count} miesięcy' about_x_years: - one: "około rok" - few: "około %{count} lata" - other: "około %{count} lat" + one: około rok + few: około %{count} lata + other: około %{count} lat over_x_years: - one: "ponad rok" - few: "ponad %{count} lata" - other: "ponad %{count} lat" + one: ponad rok + few: ponad %{count} lata + other: ponad %{count} lat almost_x_years: - one: "prawie rok" - few: "prawie %{count} lata" - other: "prawie %{count} lat" + one: prawie rok + few: prawie %{count} lata + other: prawie %{count} lat prompts: - year: "Rok" - month: "Miesiąc" - day: "Dzień" - hour: "Godzina" - minute: "Minuta" - second: "Sekundy" - + year: Rok + month: Miesiąc + day: Dzień + hour: Godzina + minute: Minuta + second: Sekundy helpers: select: - prompt: "Proszę wybrać" - + prompt: Proszę wybrać submit: - create: 'Utwórz %{model}' - update: 'Aktualizuj %{model}' - submit: 'Zapisz %{model}' - + create: Utwórz %{model} + update: Aktualizuj %{model} + submit: Zapisz %{model} errors: - format: "%{attribute} %{message}" - - messages: &errors_messages - inclusion: "nie znajduje się na liście dopuszczalnych wartości" - exclusion: "jest zarezerwowane" - invalid: "jest nieprawidłowe" - confirmation: "nie zgadza się z potwierdzeniem" - accepted: "musi zostać zaakceptowane" - empty: "nie może być puste" - blank: "nie może być puste" - too_long: "jest za długie (maksymalnie %{count} znaków)" - too_short: "jest za krótkie (przynajmniej %{count} znaków)" - wrong_length: "ma nieprawidłową długość (powinna wynosić %{count} znaków)" - not_a_number: "nie jest liczbą" - not_an_integer: "musi być liczbą całkowitą" - greater_than: "musi być większe od %{count}" - greater_than_or_equal_to: "musi być większe lub równe %{count}" - equal_to: "musi być równe %{count}" - less_than: "musi być mniejsze od %{count}" - less_than_or_equal_to: "musi być mniejsze lub równe %{count}" - odd: "musi być nieparzyste" - even: "musi być parzyste" - + format: ! '%{attribute} %{message}' + messages: + inclusion: nie znajduje się na liście dopuszczalnych wartości + exclusion: jest zarezerwowane + invalid: jest nieprawidłowe + confirmation: nie zgadza się z potwierdzeniem + accepted: musi zostać zaakceptowane + empty: nie może być puste + blank: nie może być puste + too_long: jest za długie (maksymalnie %{count} znaków) + too_short: jest za krótkie (przynajmniej %{count} znaków) + wrong_length: ma nieprawidłową długość (powinna wynosić %{count} znaków) + not_a_number: nie jest liczbą + not_an_integer: musi być liczbą całkowitą + greater_than: musi być większe od %{count} + greater_than_or_equal_to: musi być większe lub równe %{count} + equal_to: musi być równe %{count} + less_than: musi być mniejsze od %{count} + less_than_or_equal_to: musi być mniejsze lub równe %{count} + odd: musi być nieparzyste + even: musi być parzyste activerecord: errors: template: header: - one: "%{model} nie został zachowany z powodu jednego błędu" - other: "%{model} nie został zachowany z powodu %{count} błędów" - body: "Błędy dotyczą następujących pól:" - + one: ! '%{model} nie został zachowany z powodu jednego błędu' + other: ! '%{model} nie został zachowany z powodu %{count} błędów' + body: ! 'Błędy dotyczą następujących pól:' messages: - taken: "zostało już zajęte" - record_invalid: "Negatywne sprawdzenie poprawności: %{errors}" - <<: *errors_messages - + inclusion: nie znajduje się na liście dopuszczalnych wartości + exclusion: jest zarezerwowane + invalid: jest nieprawidłowe + confirmation: nie zgadza się z potwierdzeniem + accepted: musi zostać zaakceptowane + empty: nie może być puste + blank: nie może być puste + too_long: jest za długie (maksymalnie %{count} znaków) + too_short: jest za krótkie (przynajmniej %{count} znaków) + wrong_length: ma nieprawidłową długość (powinna wynosić %{count} znaków) + not_a_number: nie jest liczbą + not_an_integer: musi być liczbą całkowitą + greater_than: musi być większe od %{count} + greater_than_or_equal_to: musi być większe lub równe %{count} + equal_to: musi być równe %{count} + less_than: musi być mniejsze od %{count} + less_than_or_equal_to: musi być mniejsze lub równe %{count} + odd: musi być nieparzyste + even: musi być parzyste + taken: zostało już zajęte + record_invalid: ! 'Negatywne sprawdzenie poprawności: %{errors}' full_messages: - format: "%{attribute} %{message}" + format: ! '%{attribute} %{message}' diff --git a/config/locales/pl_fat_free_crm.yml b/config/locales/pl_fat_free_crm.yml index 9bbf009148..b434823ae1 100644 --- a/config/locales/pl_fat_free_crm.yml +++ b/config/locales/pl_fat_free_crm.yml @@ -1,21 +1,15 @@ +--- pl: language: Polish (Polski) - - # Generic terms. - #---------------------------------------------------------------------------- all: Wszystko at: / here: tutaj - no_button: 'Nie' + no_button: Nie not_implemented: Nie zaimplementowane. or: lub - select_none: '-- Żaden --' - select_none: '-- Żaden --' - select_blank: '-- Wybierz --' - yes_button: 'Tak' - - # Settings. - #---------------------------------------------------------------------------- + select_none: -- Żaden -- + select_blank: -- Wybierz -- + yes_button: Tak tab_dashboard: Przegląd tab_tasks: Zadania tab_campaigns: Kampanie @@ -23,22 +17,18 @@ pl: tab_accounts: Klienci tab_contacts: Kontakty tab_opportunities: Szanse - admin_tab_users: Użytkownicy admin_tab_settings: Ustawienia admin_tab_plugins: Pluginy - planned: Planowane started: Rozpoczęte on_hold: Wstrzymane completed: Zakończone called_off: Odwołane - new: Nowi contacted: Skontaktowani converted: Pozyskani rejected: Straceni - cold_call: Cold Call conference: Konferencja online: Online Marketing @@ -46,9 +36,7 @@ pl: self: Własny web: WWW word_of_mouth: Marketing szeptany - other: Inne - prospecting: Prospekt analysis: Analiza presentation: Prezentacja @@ -57,16 +45,13 @@ pl: final_review: Końcówka won: Z/Wygrane lost: Z/Stracone - call: Telefon email: Email follow_up: Follow-up lunch: Lunch meeting: Spotkanie money: Pieniądze - presentation: Prezentacja trip: Podróż - overdue: Zaległe due_asap: ASAP due_today: Dziś @@ -75,24 +60,17 @@ pl: due_next_week: W nast. tygodniu due_later: Później due_specific_date: Na dany dzień... - completed_today: Dziś completed_yesterday: Wczoraj completed_last_week: W tym tygodniu completed_this_month: W tym miesiącu completed_last_month: W poprz. miesiącu - - # Models/Activity. - #---------------------------------------------------------------------------- one_hour: ostatnią godzinę one_day: ostatni dzień two_days: ostatnie dwa dni one_week: ostatni tydzień two_weeks: ostatnie dwa tygodnie one_month: ostatni miesiąc - - # Model Validations. - #---------------------------------------------------------------------------- activerecord: errors: models: @@ -105,98 +83,92 @@ pl: account: attributes: name: - missing_account_name: "^Proszę podać nazwę klienta." + missing_account_name: ^Proszę podać nazwę klienta. access: - share_account: "^Proszę podać użytkowników mających dostęp do klienta." + share_account: ^Proszę podać użytkowników mających dostęp do klienta. campaign: attributes: name: - missing_campaign_name: "^Proszę podać nazwę kampanii." + missing_campaign_name: ^Proszę podać nazwę kampanii. ends_on: - dates_not_in_sequence: "^Data końca kampanii powinna być poźniejsza niż data rozpoczęcia." + dates_not_in_sequence: ^Data końca kampanii powinna być poźniejsza niż + data rozpoczęcia. access: - share_campaign: "^Proszę podać użytkowników mających dostęp do kampanii." + share_campaign: ^Proszę podać użytkowników mających dostęp do kampanii. contact: attributes: first_name: - missing_first_name: "^Proszę podać imię." + missing_first_name: ^Proszę podać imię. last_name: - missing_last_name: "^Proszę podać nazwisko." + missing_last_name: ^Proszę podać nazwisko. access: - share_contact: "^Proszę podać użytkowników mających dostęp do kontaktu." + share_contact: ^Proszę podać użytkowników mających dostęp do kontaktu. lead: attributes: first_name: - missing_first_name: "^Proszę podać imię." + missing_first_name: ^Proszę podać imię. last_name: - missing_last_name: "^Proszę podać nazwisko." + missing_last_name: ^Proszę podać nazwisko. access: - share_lead: "^Proszę podać użytkowników mających dostęp do leada." + share_lead: ^Proszę podać użytkowników mających dostęp do leada. opportunity: attributes: name: - missing_opportunity_name: "^Proszę podać nazwę szansy." + missing_opportunity_name: ^Proszę podać nazwę szansy. access: - share_opportunity: "^Proszę podać użytkowników mających dostęp do szansy." + share_opportunity: ^Proszę podać użytkowników mających dostęp do szansy. task: attributes: name: - missing_task_name: "^Proszę podać nazwę zadania." + missing_task_name: ^Proszę podać nazwę zadania. calendar: - invalid_date: "^Proszę podać prawidłową datę." + invalid_date: ^Proszę podać prawidłową datę. user: attributes: username: - missing_username: "^Proszę podać nazwę uźytkownika." - username_taken: "^Ten użytkownik juź istnieje." + missing_username: ^Proszę podać nazwę uźytkownika. + username_taken: ^Ten użytkownik juź istnieje. email: - missing_email: "^Proszę podać email." - email_in_use: "^Istnieje już użytkownik z takim emailem." - - # dynamic_form plugin translations. - #---------------------------------------------------------------------------- + missing_email: ^Proszę podać email. + email_in_use: ^Istnieje już użytkownik z takim emailem. errors: template: header: - one: "%{model} nie został zachowany z powodu jednego błędu" - other: "%{model} nie został zachowany z powodu %{count} błędów" - body: "Błędy dotyczą następujących pól:" - + one: ! '%{model} nie został zachowany z powodu jednego błędu' + other: ! '%{model} nie został zachowany z powodu %{count} błędów' + body: ! 'Błędy dotyczą następujących pól:' msg_account_suspended: Konto użytkownika zostało zawieszone. password_reset_instruction: instrukcje odzyskania hasła - - # Controllers. - #---------------------------------------------------------------------------- msg_account_created: Twoje konto zostało utworzone i oczekuje na akceptację administratora. msg_account_not_approved: Twoje konto nie zostało jeszcze zaakceptowane. - msg_asset_deleted: "Usunięto %{value}." - msg_asset_not_available: "%{value} nie jest dostępne." - msg_asset_not_authorized: You are not authorized to view this %{value}. # TODO - msg_assets_not_available: "%{value} nie są dostępne." - msg_asset_rejected: "%{value} został oznaczony jako Stracony." - msg_bad_image_file: "^Nie można załadować ani zmienić rozmiaru obrazka." - msg_cant_create_related: "Nie można utworzyć %{asset}, gdyż powiązane %{related} nie istnieje." - msg_cant_delete_user: "^Nie można usunąć użytkownika %{value}, gdyż ma powiązane dane." - msg_cant_do: "Nie można wykonać: %{action} %{asset}, gdyż nie istnieje." + msg_asset_deleted: Usunięto %{value}. + msg_asset_not_available: ! '%{value} nie jest dostępne.' + msg_asset_not_authorized: You are not authorized to view this %{value}. + msg_assets_not_available: ! '%{value} nie są dostępne.' + msg_asset_rejected: ! '%{value} został oznaczony jako Stracony.' + msg_bad_image_file: ^Nie można załadować ani zmienić rozmiaru obrazka. + msg_cant_create_related: Nie można utworzyć %{asset}, gdyż powiązane %{related} + nie istnieje. + msg_cant_delete_user: ^Nie można usunąć użytkownika %{value}, gdyż ma powiązane + dane. + msg_cant_do: ! 'Nie można wykonać: %{action} %{asset}, gdyż nie istnieje.' msg_email_not_found: Nie znaleziono użytkownika o tym adresie email. msg_enter_new_password: Proszę wpisać nowe hasło. msg_goodbye: Zostałeś wylogowany. Dziękujemy za używanie Fat Free CRM! - msg_invalid_password: "^Proszę prawidłowo podać aktualne hasło" + msg_invalid_password: ^Proszę prawidłowo podać aktualne hasło msg_invalig_login: Nieprawidłowy użytkownik lub hasło. - msg_last_login: "Ostatnio zalogowany %{value}." + msg_last_login: Ostatnio zalogowany %{value}. msg_login_needed: Musisz być zalogowany, by mieć dostęp do tej strony. msg_logout_needed: Musisz być wylogowany, by mieć dostęp do tej strony. msg_password_changed: Twoje hasło zostało zmienione. msg_password_not_changed: Twoje hasło pozostało niezmienione. msg_password_updated: Hasło zostało zaktualizowane. - msg_pwd_instructions_sent: Instrukcja, jak odzyskać hasło zostały wysłane. Sprawdź Twoją skrzynkę emailową. + msg_pwd_instructions_sent: Instrukcja, jak odzyskać hasło zostały wysłane. Sprawdź + Twoją skrzynkę emailową. msg_require_admin: Musisz być Administratorem, by otworzyć tę stronę. msg_successful_signup: Rejestracja udana, witaj w Fat Free CRM! msg_welcome: Witaj w Fat Free CRM! - - # Options. - #---------------------------------------------------------------------------- - "option_amount*probability": kwoty ważonej + option_amount*probability: kwoty ważonej activity_options: Pokaż %{models} zmieniane przez %{user} przez %{period}. all_users: wszystkich option_after: po nazwisku @@ -204,7 +176,7 @@ pl: option_all_users: wszystkich option_amount: kwoty option_before: przed nazwiskiem - option_brief: skróconym + option_brief: skróconym option_closes_on: daty zamknięcia option_company: firmy option_created_at: daty utworzenia @@ -221,12 +193,9 @@ pl: option_target_leads: zakładanych leadów option_target_revenue: zakładanej sprzedaży option_updated_at: daty aktualizacji - show_per_page: Pokaż %{number} %{models}/stronę w widoku %{fmt}. + show_per_page: Pokaż %{number} %{models}/stronę w widoku %{fmt}. sort_by: Sortuj %{models} wg %{field}. - sort_by_displaying: Sortuj %{models} wg %{field} wyświetlając imię %{position}. - - # Views -> Profile. - #---------------------------------------------------------------------------- + sort_by_displaying: Sortuj %{models} wg %{field} wyświetlając imię %{position}. aim: AOL IM already_signed_up: Już zarejestrowany? alt_email: Alternatywny email @@ -236,12 +205,12 @@ pl: contact_info: Informacje kontaktowe current_password: Aktualne hasło edit_profile: Zmień dane - # email: Email # <-- Already defined as the task type if Settings. first_name: Imię google: Google IM gravatar_help: Nie wiesz, co to są gravatary? Dowiedz się image_file: Obrazek - image_help: Obrazek, który dołączysz, zostanie automatycznie dopasowany do wymiarów 75x75. Obrazek może być w formacie GIF, JPG lub PNG. + image_help: Obrazek, który dołączysz, zostanie automatycznie dopasowany do wymiarów + 75x75. Obrazek może być w formacie GIF, JPG lub PNG. job_title: Stanowisko last_name: Nazwisko login_now_link: Zaloguj się! @@ -262,19 +231,14 @@ pl: user: Użytkownik username: Nazwa użytkownika yahoo: Yahoo IM - - # Views -> Authenticate. - #---------------------------------------------------------------------------- forgot_password: Zapomniałem hasła login: Zaloguj no_account: Czy posiadasz konto? remember_me: Pamiętaj mnie na tym komputerze sign_up_now: Zarejestruj się! - - # Views -> Accounts. - #---------------------------------------------------------------------------- account: Klient - account_permissions_intro: Domyślnie tylko Ty będziesz miał dostęp do klienta. Można to zmienić później. + account_permissions_intro: Domyślnie tylko Ty będziesz miał dostęp do klienta. Można + to zmienić później. account_small: klient accounts: Klientów accounts_options: Opcje @@ -297,9 +261,6 @@ pl: share_with: Udostępnij następującym użytkownikom shipping_address: Adres wysyłki website: Website - - # Views -> Campaigns. - #---------------------------------------------------------------------------- actual: Bieżące actual_performance: Bieżący postęp budget: Budżet @@ -314,7 +275,7 @@ pl: campaigns_small: kampanie conversion: Konwersja conversion_label: Konwersja (%) - conversion_number: "%{value} konwersja" + conversion_number: ! '%{value} konwersja' create_campaign: Dodaj kampanię end_date: Data zakończenia finished_on: zakończona %{value} @@ -322,11 +283,13 @@ pl: no_start_date: brak daty rozpoczęcia number_of_leads: Liczba leadów objectives: Cele - objectives_help: Proszę podać planowaną liczbę leadów, oczekiwaną konwersję leads/szanse, planowaną sprzedaż otaz budżet kampanii. Te dane umoźliwią Ci śledzenie postępu kampanii. + objectives_help: Proszę podać planowaną liczbę leadów, oczekiwaną konwersję leads/szanse, + planowaną sprzedaż otaz budżet kampanii. Te dane umoźliwią Ci śledzenie postępu + kampanii. objectives_small: cele kampanii revenue: Sprzedaż revenue_label: Sprzedaż (zł) - revenue_number: "%{value} sprzedaży" + revenue_number: ! '%{value} sprzedaży' save_campaign: Zapisz kampanię start_date: Data rozpoczęcia started_ago: rozpoczęta %{value} temu @@ -336,9 +299,6 @@ pl: total_campaigns: Wszystkich kampanii was_supposed_to_finish: miała zakończyć się %{value} was_supposed_to_start: miała rozpocząć się %{time_ago} temu %{start_date} - - # Views -> Contacts. - #---------------------------------------------------------------------------- alt_email_small: Inny blog: Website/Blog contact: Kontakt @@ -348,41 +308,45 @@ pl: contacts_small: kontakty create_contact: Dodaj kontakt department: Dział - department_small: '%{value} dział' + department_small: ! '%{value} dział' do_not_call: Nie dzwonić extra_info: Dodatkowe info extra_info_small: dodatkowy kontakt facebook: Facebook linked_in: LinkedIn myself: mnie - - permissions_intro_private: Domyślnie tylko Ty będziesz miał dostęp do %{value}. Można to poźniej zmienić. - permissions_intro_public: Domyślnie wszyscy użytkownicy będą mieli dostęp do %{value}. Można to poźniej zmienić. - permissions_intro_shared: Domyślnie tylko wybrani użytkownicy będą mieli dostęp do %{value}. Można to poźniej zmienić. - + permissions_intro_private: Domyślnie tylko Ty będziesz miał dostęp do %{value}. + Można to poźniej zmienić. + permissions_intro_public: Domyślnie wszyscy użytkownicy będą mieli dostęp do %{value}. + Można to poźniej zmienić. + permissions_intro_shared: Domyślnie tylko wybrani użytkownicy będą mieli dostęp + do %{value}. Można to poźniej zmienić. referred_by: Polecony przez referred_by_small: polecony przez save_contact: Zapisz kontakt twitter: Twitter web_presence: Web web_presence_small: web - works_at: "%{job_title} / %{company}" - - # Views -> Leads. - #---------------------------------------------------------------------------- + works_at: ! '%{job_title} / %{company}' convert: Konwertuj convert_lead: Konwertuj lead - convert_lead_permissions_intro: Ograniczenia dostępu będą skopiowane z leada. Moźesz zmienić to później. - convert_lead_text: Po konwersji lead %{value} stanie się kontaktem powiązanym z istniejącym lub nowo utworzonym klientem. Status leada zostanie automatycznie ustawiony na Pozyskany. + convert_lead_permissions_intro: Ograniczenia dostępu będą skopiowane z leada. Moźesz + zmienić to później. + convert_lead_text: Po konwersji lead %{value} stanie się kontaktem powiązanym z + istniejącym lub nowo utworzonym klientem. Status leada zostanie automatycznie + ustawiony na Pozyskany. create_lead: Dodaj lead - create_opp_for_contact: Opcjonalnie możesz dodać szansę do %{value} podając nazwę, aktualną fazę, zakładaną datę zamknięcia, prawdopodobieństwo sprzedaży, kwotę sprzedaży i oferowany rabat. + create_opp_for_contact: Opcjonalnie możesz dodać szansę do %{value} podając nazwę, + aktualną fazę, zakładaną datę zamknięcia, prawdopodobieństwo sprzedaży, kwotę + sprzedaży i oferowany rabat. lead: Lead lead_info_small: lead - - lead_permissions_intro_private: Domyślnie prawa dostępu zostaną skopiowane z kampanii albo tylko Ty będziesz miał dostęp. Możesz zmienić to później. - lead_permissions_intro_public: Domyślnie prawa dostępu zostaną skopiowane z kampanii albo wszyscy użytkownicy będą mieli dostęp. Możesz zmienić to później. - lead_permissions_intro_shared: Domyślnie prawa dostępu zostaną skopiowane z kampanii albo tylko wybrani użytkownicy będą mieli dostęp. Możesz zmienić to później. - + lead_permissions_intro_private: Domyślnie prawa dostępu zostaną skopiowane z kampanii + albo tylko Ty będziesz miał dostęp. Możesz zmienić to później. + lead_permissions_intro_public: Domyślnie prawa dostępu zostaną skopiowane z kampanii + albo wszyscy użytkownicy będą mieli dostęp. Możesz zmienić to później. + lead_permissions_intro_shared: Domyślnie prawa dostępu zostaną skopiowane z kampanii + albo tylko wybrani użytkownicy będą mieli dostęp. Możesz zmienić to później. lead_small: lead lead_status_small: status leada lead_summary: Lead @@ -397,20 +361,17 @@ pl: source: Źródło status: Status total_leads: Leady razem - - # Views -> Opportunities. - #---------------------------------------------------------------------------- amount: Kwota close_date: Data zamknięcia closed_ago_on: zamknięta %{time_ago} temu, %{date} closes_today: planowane zamknięcie - dziś! - closing_date: "data zamknięcia: %{value}" + closing_date: ! 'data zamknięcia: %{value}' create_opportunity: Dodaj szansę currency: (zł) days_late: Opóźniona o days_left: Pozostało dni discount: Rabat - discount_number: "%{value} rabatu" + discount_number: ! '%{value} rabatu' expected_to_close: planowane zamknięcie za %{time}, %{date} from: od no_closing_date: brak planowanej daty zamknięcia @@ -421,7 +382,7 @@ pl: opportunity: Szansa opportunity_small: szansa opportunity_summary: Szansa - opportunity_summary_text: "%{amount} z %{discount} rabatu i %{probability} prawdopodobieństwem" + opportunity_summary_text: ! '%{amount} z %{discount} rabatu i %{probability} prawdopodobieństwem' past_due: planowana data zakończenia minęła %{value} temu probability: Prawdopodob. probability_number: i %{value} prawdopodobieństwa @@ -429,9 +390,6 @@ pl: stage: Faza total_opportunities: Szanse razem weighted_amount: Kwota ważona - - # Views -> Tasks. - #---------------------------------------------------------------------------- assign_to: Przypisz do assigned_tab: Przypisane assigned_tasks: Przypisane zadania @@ -443,13 +401,13 @@ pl: due: Termin feel_free: Możesz move_to: przesuń na - no_tasks: "Nie masz żadnych %{value} zadań" + no_tasks: Nie masz żadnych %{value} zadań no_tasks_pending: otwartych no_tasks_assigned: przypisanych no_tasks_completed: zakończonych pending_tab: Otwarte pending_tasks: otwarte zadania - related: 'pow.:' + related: ! 'pow.:' save_task: Zapisz zadanie task_assigned: Zadanie zostało przypisane do %{value} task_assigned_to: i przypisane do %{value} @@ -469,9 +427,6 @@ pl: total_tasks: Razem %{value} view_assigned_tasks: zobacz przypisane zadania view_pending_tasks: zobacz otwarte zadania - - # Views -> Home. - #---------------------------------------------------------------------------- action_commented: skomentował/a action_completed: ukończył/a action_created: utworzył/a @@ -492,9 +447,6 @@ pl: subject_lead: lead subject_opportunity: szansę subject_task: zadanie - - # Views -> Common. - #---------------------------------------------------------------------------- add_note: Dodaj notatkę save_note: Zapisz notatkę add_note_help: Dodaj nową notatkę... @@ -505,14 +457,14 @@ pl: close_form: Zamknij formularz confirm_delete: Czy jesteś pewien, że chcesz usunąć %{value}? copy_permissions: Skopiuj prawa dostępu do %{value} - could_not_find: "Nie znaleziono %{value}. Możesz" - could_not_find_matching: "Nie znaleziono pasującego %{value}" + could_not_find: Nie znaleziono %{value}. Możesz + could_not_find_matching: Nie znaleziono pasującego %{value} create_new: dodaj nowego select_existing: wybierz istniejącego delete: Usuń discard: Anuluj edit: Zmień - items_total: '%{count} razem.' + items_total: ! '%{count} razem.' less: Mniej... me: mnie more: Więcej... @@ -525,16 +477,13 @@ pl: please_retry: proszę spróbować innego wyszukania. recent_items: Ostatnio oglądane search_assets: Przeszukaj %{value} - time_ago: "%{value} temu" + time_ago: ! '%{value} temu' background_info: Informacje ogólne address: Adres city: Miasto zipcode: Kod pocztowy state: stan country: kraj - - # Views -> Layout. - #---------------------------------------------------------------------------- about: O produkcie about_dev_group: Forum dla programistów (pomóż ulepszać FFCRM!) about_features: Zgłaszanie życzeń i błędów @@ -543,35 +492,24 @@ pl: about_ffc_version: Fat Free CRM wersja about_home_page: Strona główna about_project_page: Strona projektu - about_thank_you: Dziękujemy za wybranie Fat Free CRM! Mamy nadzieję, że nasze oprogramowanie spełnia Twoje oczekiwania. + about_thank_you: Dziękujemy za wybranie Fat Free CRM! Mamy nadzieję, że nasze oprogramowanie + spełnia Twoje oczekiwania. about_twitter: Informacje o aktualizacjach (Twitter) about_user_group: Forum dla użytkowników admin: Admin logout: Wyloguj quick_find: Szybkie szukanie welcome: Witamy - - # Views -> Comments. - #---------------------------------------------------------------------------- edit_comment: Aktualizacja komentarza show: Pokaż update: Aktualizuj - - # Views -> Passwords. - #---------------------------------------------------------------------------- confirm_password_intro: Wpisz swoje hasło i potwierdź je w drugim polu. - password_intro: Proszę podaj swój adres email, a instrukje dotyczące odzyskania konta zostaną tam wysłane. + password_intro: Proszę podaj swój adres email, a instrukje dotyczące odzyskania + konta zostaną tam wysłane. reset_password: Odzyskaj hasło update_password_and_login: Zmień hasło i/lub nazwę użytkownika - - # Views -> Admin - #---------------------------------------------------------------------------- - # TODO back_to_crm: Back to Fat Free CRM crm_admin_page: Fat Free CRM Administration - - # Views -> Admin -> Users. - #---------------------------------------------------------------------------- approve: Akceptuj create_user: Dodaj użytkownika last_seen: ostatnio widziany %{value} temu @@ -582,9 +520,10 @@ pl: user_active: Aktywny user_admin: Admin user_awaits_approval: oczekuje na akceptację - user_confirm_delete: Użytkownika można usunąć tylko wtedy, gdy nie ma powiązanych danych. + user_confirm_delete: Użytkownika można usunąć tylko wtedy, gdy nie ma powiązanych + danych. user_is_admin: Użytkownik jest Adminem - user_never_logged_in: "jeszcze się nie logował" + user_never_logged_in: jeszcze się nie logował user_signed_up: Zarejestrowany user_signed_up_on: zarejestrowany %{value} user_since: użytkownik od %{value} @@ -592,49 +531,39 @@ pl: user_suspended_on: zawieszony %{value} users: Użytkownicy users_small: użytkowników - - # Dropbox. - #---------------------------------------------------------------------------- dropbox_notification_subject: dropbox - E-mail Dodano - %{subject} dropbox_notification_intro: Pomyślnie dodane e-mail wysłanych do DropBox dropbox_notification_to: Dodano do subject: Temat body: Ciało - - # Pluralizations. - #---------------------------------------------------------------------------- pluralize: comment: - one: '1 comment' # TODO - other: '%{count} comments' # TODO - contact: - one: '1 kontakt' - few: '%{count} kontakty' - other: '%{count} kontaktów' + one: 1 comment + other: ! '%{count} comments' + contact: + one: 1 kontakt + few: ! '%{count} kontakty' + other: ! '%{count} kontaktów' opportunity: - one: '1 szansa' - few: '%{count} szanse' - other: '%{count} szans' + one: 1 szansa + few: ! '%{count} szanse' + other: ! '%{count} szans' lead: - one: '1 lead' - few: '%{count} leady' - other: '%{count} leadów' + one: 1 lead + few: ! '%{count} leady' + other: ! '%{count} leadów' day: - one: '1 dzień' - other: '%{count} dni' + one: 1 dzień + other: ! '%{count} dni' login: - one: '1 logowanie' - few: '%{count} logowania' - other: '%{count} logowań' - - # Custom date/time formats. - #---------------------------------------------------------------------------- + one: 1 logowanie + few: ! '%{count} logowania' + other: ! '%{count} logowań' date: formats: - mmddyyyy: "%d.%m.%Y" - mmdd: "%e %b" - mmddyy: "%e %b %Y" - + mmddyyyy: ! '%d.%m.%Y' + mmdd: ! '%e %b' + mmddyy: ! '%e %b %Y' time: formats: - mmddhhss: "%e %b o %H:%M" + mmddhhss: ! '%e %b o %H:%M' diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 69355e5ce3..85bb04e7cc 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -1,90 +1,115 @@ -# encoding: UTF-8 -# pt-BR translations for Ruby on Rails -"pt-BR": - # formatos de data e hora +--- +pt-BR: date: formats: - default: "%d/%m/%Y" - short: "%d de %B" - long: "%d de %B de %Y" - - day_names: [Domingo, Segunda, Terça, Quarta, Quinta, Sexta, Sábado] - abbr_day_names: [Dom, Seg, Ter, Qua, Qui, Sex, Sáb] - - month_names: [~, Janeiro, Fevereiro, Março, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro] - abbr_month_names: [~, Jan, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set, Out, Nov, Dez] + default: ! '%d/%m/%Y' + short: ! '%d de %B' + long: ! '%d de %B de %Y' + day_names: + - Domingo + - Segunda + - Terça + - Quarta + - Quinta + - Sexta + - Sábado + abbr_day_names: + - Dom + - Seg + - Ter + - Qua + - Qui + - Sex + - Sáb + month_names: + - + - Janeiro + - Fevereiro + - Março + - Abril + - Maio + - Junho + - Julho + - Agosto + - Setembro + - Outubro + - Novembro + - Dezembro + abbr_month_names: + - + - Jan + - Fev + - Mar + - Abr + - Mai + - Jun + - Jul + - Ago + - Set + - Out + - Nov + - Dez order: - - :day - - :month - - :year - + - :day + - :month + - :year time: formats: - default: "%A, %d de %B de %Y, %H:%M h" - short: "%d/%m, %H:%M h" - long: "%A, %d de %B de %Y, %H:%M h" + default: ! '%A, %d de %B de %Y, %H:%M h' + short: ! '%d/%m, %H:%M h' + long: ! '%A, %d de %B de %Y, %H:%M h' am: '' pm: '' - - # Usado no Array.to_sentence support: array: - words_connector: ", " - two_words_connector: " e " - last_word_connector: " e " - + words_connector: ! ', ' + two_words_connector: ! ' e ' + last_word_connector: ! ' e ' select: - prompt: "Por favor selecione" - + prompt: Por favor selecione number: format: - separator: ',' - delimiter: '.' + separator: ! ',' + delimiter: . precision: 3 significant: false strip_insignificant_zeros: false - currency: format: - format: '%u %n' - unit: 'R$' - separator: ',' - delimiter: '.' + format: ! '%u %n' + unit: R$ + separator: ! ',' + delimiter: . precision: 2 significant: false strip_insignificant_zeros: false - percentage: format: - delimiter: '.' - + delimiter: . precision: format: - delimiter: '.' - + delimiter: . human: format: - delimiter: '.' + delimiter: . precision: 2 significant: true strip_insignificant_zeros: true storage_units: - format: "%n %u" + format: ! '%n %u' units: byte: - one: "Byte" - other: "Bytes" - kb: "KB" - mb: "MB" - gb: "GB" - tb: "TB" - # number_to_human() - # new in rails 3: please add to other locales + one: Byte + other: Bytes + kb: KB + mb: MB + gb: GB + tb: TB decimal_units: - format: "%n %u" + format: ! '%n %u' units: - unit: "" - thousand: "mil" + unit: '' + thousand: mil million: one: milhão other: milhões @@ -97,103 +122,111 @@ quadrillion: one: quatrilhão other: quatrilhões - - # distancia do tempo em palavras datetime: distance_in_words: - half_a_minute: 'meio minuto' + half_a_minute: meio minuto less_than_x_seconds: - one: 'menos de 1 segundo' - other: 'menos de %{count} segundos' + one: menos de 1 segundo + other: menos de %{count} segundos x_seconds: - one: '1 segundo' - other: '%{count} segundos' + one: 1 segundo + other: ! '%{count} segundos' less_than_x_minutes: - one: 'menos de um minuto' - other: 'menos de %{count} minutos' + one: menos de um minuto + other: menos de %{count} minutos x_minutes: - one: '1 minuto' - other: '%{count} minutos' + one: 1 minuto + other: ! '%{count} minutos' about_x_hours: - one: 'aproximadamente 1 hora' - other: 'aproximadamente %{count} horas' + one: aproximadamente 1 hora + other: aproximadamente %{count} horas x_days: - one: '1 dia' - other: '%{count} dias' + one: 1 dia + other: ! '%{count} dias' about_x_months: - one: 'aproximadamente 1 mês' - other: 'aproximadamente %{count} meses' + one: aproximadamente 1 mês + other: aproximadamente %{count} meses x_months: - one: '1 mês' - other: '%{count} meses' + one: 1 mês + other: ! '%{count} meses' about_x_years: - one: 'aproximadamente 1 ano' - other: 'aproximadamente %{count} anos' + one: aproximadamente 1 ano + other: aproximadamente %{count} anos over_x_years: - one: 'mais de 1 ano' - other: 'mais de %{count} anos' + one: mais de 1 ano + other: mais de %{count} anos almost_x_years: - one: 'quase 1 ano' - other: 'quase %{count} anos' + one: quase 1 ano + other: quase %{count} anos prompts: - year: "Ano" - month: "Mês" - day: "Dia" - hour: "Hora" - minute: "Minuto" - second: "Segundo" - + year: Ano + month: Mês + day: Dia + hour: Hora + minute: Minuto + second: Segundo helpers: select: - prompt: "Por favor selecione" - + prompt: Por favor selecione submit: - create: 'Criar %{model}' - update: 'Atualizar %{model}' - submit: 'Salvar %{model}' - + create: Criar %{model} + update: Atualizar %{model} + submit: Salvar %{model} errors: - format: "%{attribute} %{message}" - + format: ! '%{attribute} %{message}' template: header: - one: "Não foi possível gravar %{model}: 1 erro" - other: "Não foi possível gravar %{model}: %{count} erros." - body: "Por favor, verifique o(s) seguinte(s) campo(s):" - - messages: &errors_messages - inclusion: "não está incluído na lista" - exclusion: "não está disponível" - invalid: "não é válido" - confirmation: "não está de acordo com a confirmação" - accepted: "deve ser aceito" - empty: "não pode ficar vazio" - blank: "não pode ficar em branco" - too_long: "é muito longo (máximo: %{count} caracteres)" - too_short: "é muito curto (mínimo: %{count} caracteres)" - wrong_length: "não possui o tamanho esperado (%{count} caracteres)" - not_a_number: "não é um número" - not_an_integer: "não é um número inteiro" - greater_than: "deve ser maior que %{count}" - greater_than_or_equal_to: "deve ser maior ou igual a %{count}" - equal_to: "deve ser igual a %{count}" - less_than: "deve ser menor que %{count}" - less_than_or_equal_to: "deve ser menor ou igual a %{count}" - odd: "deve ser ímpar" - even: "deve ser par" - + one: ! 'Não foi possível gravar %{model}: 1 erro' + other: ! 'Não foi possível gravar %{model}: %{count} erros.' + body: ! 'Por favor, verifique o(s) seguinte(s) campo(s):' + messages: + inclusion: não está incluído na lista + exclusion: não está disponível + invalid: não é válido + confirmation: não está de acordo com a confirmação + accepted: deve ser aceito + empty: não pode ficar vazio + blank: não pode ficar em branco + too_long: ! 'é muito longo (máximo: %{count} caracteres)' + too_short: ! 'é muito curto (mínimo: %{count} caracteres)' + wrong_length: não possui o tamanho esperado (%{count} caracteres) + not_a_number: não é um número + not_an_integer: não é um número inteiro + greater_than: deve ser maior que %{count} + greater_than_or_equal_to: deve ser maior ou igual a %{count} + equal_to: deve ser igual a %{count} + less_than: deve ser menor que %{count} + less_than_or_equal_to: deve ser menor ou igual a %{count} + odd: deve ser ímpar + even: deve ser par activerecord: errors: template: header: - one: "Não foi possível gravar %{model}: 1 erro" - other: "Não foi possível gravar %{model}: %{count} erros." - body: "Por favor, verifique o(s) seguinte(s) campo(s):" - + one: ! 'Não foi possível gravar %{model}: 1 erro' + other: ! 'Não foi possível gravar %{model}: %{count} erros.' + body: ! 'Por favor, verifique o(s) seguinte(s) campo(s):' messages: - taken: "já está em uso" - record_invalid: "A validação falhou: %{errors}" - <<: *errors_messages - + inclusion: não está incluído na lista + exclusion: não está disponível + invalid: não é válido + confirmation: não está de acordo com a confirmação + accepted: deve ser aceito + empty: não pode ficar vazio + blank: não pode ficar em branco + too_long: ! 'é muito longo (máximo: %{count} caracteres)' + too_short: ! 'é muito curto (mínimo: %{count} caracteres)' + wrong_length: não possui o tamanho esperado (%{count} caracteres) + not_a_number: não é um número + not_an_integer: não é um número inteiro + greater_than: deve ser maior que %{count} + greater_than_or_equal_to: deve ser maior ou igual a %{count} + equal_to: deve ser igual a %{count} + less_than: deve ser menor que %{count} + less_than_or_equal_to: deve ser menor ou igual a %{count} + odd: deve ser ímpar + even: deve ser par + taken: já está em uso + record_invalid: ! 'A validação falhou: %{errors}' full_messages: - format: "%{attribute} %{message}" + format: ! '%{attribute} %{message}' diff --git a/config/locales/pt-BR_fat_free_crm.yml b/config/locales/pt-BR_fat_free_crm.yml index 6ac659b75f..d13ddfb0d4 100644 --- a/config/locales/pt-BR_fat_free_crm.yml +++ b/config/locales/pt-BR_fat_free_crm.yml @@ -1,20 +1,15 @@ +--- pt-BR: language: Português do Brasil - - # Generic terms. - #---------------------------------------------------------------------------- all: Tudo at: at here: aqui - no_button: 'Não' + no_button: Não not_implemented: Ainda não implementado. or: ou - select_blank: '-- Selecione --' - select_none: '-- Nenhum --' - yes_button: 'Sim' - - # Settings. - #---------------------------------------------------------------------------- + select_blank: -- Selecione -- + select_none: -- Nenhum -- + yes_button: Sim tab_dashboard: Dashboard tab_tasks: Tarefas tab_campaigns: Campanhas @@ -22,22 +17,18 @@ pt-BR: tab_accounts: Contas tab_contacts: Contatos tab_opportunities: Oportunidades - admin_tab_users: Usuários admin_tab_settings: Configurações admin_tab_plugins: Plugins - planned: Planejado started: Iniciado on_hold: Em espera completed: Terminado called_off: Called Off - new: Novo contacted: Contactado converted: Convertido rejected: Rejeitado - cold_call: Cold Call conference: Conferência online: Marketing Online @@ -46,7 +37,6 @@ pt-BR: web: Website word_of_mouth: Boca-a-Boca other: Outros - prospecting: Prospecção analysis: Análise presentation: Apresentação @@ -55,16 +45,13 @@ pt-BR: final_review: Revisão final won: Fechado/Conquistado lost: Fechado/Perdido - call: Ligação email: Email follow_up: Follow-up lunch: Almoço meeting: Encontro money: Dinheiro - presentation: Apresentação trip: Viagem - overdue: Overdue due_asap: Assim que possível due_today: Hoje @@ -72,25 +59,18 @@ pt-BR: due_this_week: Esta semana due_next_week: Próxima semana due_later: Depois - due_specific_date: Em Data Específica... # ?! - + due_specific_date: Em Data Específica... completed_today: Hoje completed_yesterday: Ontem completed_last_week: Semana passada completed_this_month: Este mês completed_last_month: Mês passado - - # Models/Activity. - #---------------------------------------------------------------------------- one_hour: Uma hora one_day: Um dia two_days: Dois dias one_week: Uma semana two_weeks: Duas semanas one_month: Um mês - - # Model Validations. - #---------------------------------------------------------------------------- activerecord: errors: models: @@ -103,83 +83,86 @@ pt-BR: account: attributes: name: - missing_account_name: "^Por favor, informe um nome para a conta" + missing_account_name: ^Por favor, informe um nome para a conta access: - share_account: "^Por favor, informe usuários com quem desejas compartilhar esta conta." + share_account: ^Por favor, informe usuários com quem desejas compartilhar + esta conta. campaign: attributes: name: - missing_campaign_name: "^Por favor, informe uma node para a campanha." + missing_campaign_name: ^Por favor, informe uma node para a campanha. ends_on: - dates_not_in_sequence: "^Por favor, certifique-se que a data de término da campanha seja posterior a data de início." + dates_not_in_sequence: ^Por favor, certifique-se que a data de término + da campanha seja posterior a data de início. access: - share_campaign: "^Por favor, informe usuários com quem desejas compartilhar esta campanha." + share_campaign: ^Por favor, informe usuários com quem desejas compartilhar + esta campanha. contact: attributes: first_name: - missing_first_name: "^Por favor, informe o primeiro nome." + missing_first_name: ^Por favor, informe o primeiro nome. last_name: - missing_last_name: "^Por favor, informe o último nome." + missing_last_name: ^Por favor, informe o último nome. access: - share_contact: "^Por favor, informe usuários com quem desejas compartilhar este contato." + share_contact: ^Por favor, informe usuários com quem desejas compartilhar + este contato. lead: attributes: first_name: - missing_first_name: "^Por favor, informe o primeiro nome." + missing_first_name: ^Por favor, informe o primeiro nome. last_name: - missing_last_name: "^Por favor, informe o último nome." + missing_last_name: ^Por favor, informe o último nome. access: - share_lead: "^Por favor, informe usuários com quem desejas compartilhar este lead." + share_lead: ^Por favor, informe usuários com quem desejas compartilhar + este lead. opportunity: attributes: name: - missing_opportunity_name: "^Por favor, informe um nome para a oportunidade." + missing_opportunity_name: ^Por favor, informe um nome para a oportunidade. access: - share_opportunity: "^Por favor, informe usuários com quem desejas compartilhar esta oportunidade." + share_opportunity: ^Por favor, informe usuários com quem desejas compartilhar + esta oportunidade. task: attributes: name: - missing_task_name: "^Por favor, informe um nome para a tarefa." + missing_task_name: ^Por favor, informe um nome para a tarefa. calendar: - invalid_date: "^Por favor, informe uma data válida." + invalid_date: ^Por favor, informe uma data válida. user: attributes: username: - missing_username: "^Por favor, informe o nome do usuário." - username_taken: "^Este usuário já está sendo usado." + missing_username: ^Por favor, informe o nome do usuário. + username_taken: ^Este usuário já está sendo usado. email: - missing_email: "^Por favor, informe o e-mail." - email_in_use: "^Já existe um usuário com este e-mail." - - # dynamic_form plugin translations. - #---------------------------------------------------------------------------- + missing_email: ^Por favor, informe o e-mail. + email_in_use: ^Já existe um usuário com este e-mail. errors: template: header: - one: "Não foi possível gravar %{model}: 1 erro" - other: "Não foi possível gravar %{model}: %{count} erros." - body: "Por favor, verifique o(s) seguinte(s) campo(s):" - + one: ! 'Não foi possível gravar %{model}: 1 erro' + other: ! 'Não foi possível gravar %{model}: %{count} erros.' + body: ! 'Por favor, verifique o(s) seguinte(s) campo(s):' msg_account_suspended: A conta do usuário foi suspensa. password_reset_instruction: Instruções de redefinição da senha - - # Controllers. - #---------------------------------------------------------------------------- - msg_account_created: Sua conta foi criada e está aguardando a aprovação do administrador do sistema. + msg_account_created: Sua conta foi criada e está aguardando a aprovação do administrador + do sistema. msg_account_not_approved: Sua conta ainda não foi aprovada. - msg_asset_deleted: "%{value} foi removido." + msg_asset_deleted: ! '%{value} foi removido.' msg_asset_not_available: Este(a) %{value} não está mais disponível. - msg_asset_not_authorized: You are not authorized to view this %{value}. # TODO + msg_asset_not_authorized: You are not authorized to view this %{value}. msg_assets_not_available: Estes(as) %{value} não estão mais disponíveis. - msg_asset_rejected: "%{value} foi rejeitado." - msg_bad_image_file: "^Não foi possível enviar ou redimensionar a imagem que você escolheu." - msg_cant_create_related: "Impossível criar %{asset} já que %{related} não está mais disponível." - msg_cant_delete_user: "^Não foi possível remover o usuário já que %{value} tem relacionamentos ativos." - msg_cant_do: "Impossível %{action} o %{asset} já que não está mais disponível." + msg_asset_rejected: ! '%{value} foi rejeitado.' + msg_bad_image_file: ^Não foi possível enviar ou redimensionar a imagem que você + escolheu. + msg_cant_create_related: Impossível criar %{asset} já que %{related} não está mais + disponível. + msg_cant_delete_user: ^Não foi possível remover o usuário já que %{value} tem relacionamentos + ativos. + msg_cant_do: Impossível %{action} o %{asset} já que não está mais disponível. msg_email_not_found: Nenhum usuário encontrado com este e-mail. msg_enter_new_password: Por favor, informe sua nova senha. msg_goodbye: Você saiu do sistema. Obrigado por usar o Fat Free CRM! - msg_invalid_password: "^Por favor informe uma senha válida" + msg_invalid_password: ^Por favor informe uma senha válida msg_invalig_login: Usuário e senha inválida. msg_last_login: Você entrou no sistema pela última vez em %{value}. msg_login_needed: Você precisa entrar no sistema para acessar esta página. @@ -187,15 +170,14 @@ pt-BR: msg_password_changed: Sua senha mudou. msg_password_not_changed: Sua senha não mudou. msg_password_updated: A senha foi atualizada com sucesso. - msg_pwd_instructions_sent: Instruções para redefinir a sua senha foram enviadas a você. Por favor, verifique seu e-mail. + msg_pwd_instructions_sent: Instruções para redefinir a sua senha foram enviadas + a você. Por favor, verifique seu e-mail. msg_require_admin: É preciso ser um administrador para acessar esta página. msg_successful_signup: Cadastrado com sucesso, bem vindo(a) ao Fat Free CRM! msg_welcome: Bem vindo(a) ao Fat Free CRM! - - # Options. - #---------------------------------------------------------------------------- - "option_amount*probability": weighted amount - activity_options: Exibir atividades em %{models} feitas por %{user} no(s) último(s) %{period}. + option_amount*probability: weighted amount + activity_options: Exibir atividades em %{models} feitas por %{user} no(s) último(s) + %{period}. all_users: todos os usuários option_after: depois option_all: todos @@ -219,12 +201,10 @@ pt-BR: option_target_leads: leads alvo option_target_revenue: receita alvo option_updated_at: data de atualização - show_per_page: Exibir %{number} %{models} por página usando o formato %{fmt}. + show_per_page: Exibir %{number} %{models} por página usando o formato %{fmt}. sort_by: Sort %{models} by %{field}. - sort_by_displaying: Ordenar %{models} por %{field} exibindo o primeiro nome %{position} do último nome. - - # Views -> Profile. - #---------------------------------------------------------------------------- + sort_by_displaying: Ordenar %{models} por %{field} exibindo o primeiro nome %{position} + do último nome. aim: AOL IM already_signed_up: Já é cadastrado? alt_email: Email alternativo @@ -234,12 +214,12 @@ pt-BR: contact_info: Informações para contato current_password: Senha atual edit_profile: Editar perfil - # email: Email # <-- Already defined as the task type if Settings. first_name: Primeiro nome google: Google IM gravatar_help: Não conhece o Gravatar? Saiba mais sobre image_file: Arquivo de imagem - image_help: A imagem que você enviar será automaticamente redimensionada para 75 x 75 pixels. Os formatos suportados são GIF, JPG, and PNG. + image_help: A imagem que você enviar será automaticamente redimensionada para 75 + x 75 pixels. Os formatos suportados são GIF, JPG, and PNG. job_title: Título last_name: Último nome login_now_link: Entre agora! @@ -260,19 +240,14 @@ pt-BR: user: Usuário username: Usuário yahoo: Yahoo IM - - # Views -> Authenticate. - #---------------------------------------------------------------------------- forgot_password: Esqueceu a senha login: Login no_account: Não tem uma conta? remember_me: Me lembrar sign_up_now: Cadastre-se Agora! - - # Views -> Accounts. - #---------------------------------------------------------------------------- account: Conta - account_permissions_intro: Por padrão, somente você terá acesso a conta. Você pode mudar as permissões da conta depois. + account_permissions_intro: Por padrão, somente você terá acesso a conta. Você pode + mudar as permissões da conta depois. account_small: conta accounts: Contas accounts_options: Opções da conta @@ -287,7 +262,7 @@ pt-BR: mobile_small: celular open_in_window: Abrir %{value} em uma nova janela phone_small: telefone - phone_toll_free: Toll-free phone + phone_toll_free: Toll-free phone keep_private: manter privado, não compartilhar com os outros make_public: Compartilhar com todos same_as_billing: mesmo da cobrança @@ -295,9 +270,6 @@ pt-BR: share_with: Compartilhar somente com algumas pessoas shipping_address: Endereço de entrega website: Website - - # Views -> Campaigns. - #---------------------------------------------------------------------------- actual: Atual actual_performance: Performance atual budget: Orçamento @@ -312,7 +284,7 @@ pt-BR: campaigns_small: campanhas conversion: Conversão conversion_label: Conversão (%) - conversion_number: "%{value} convertidos" + conversion_number: ! '%{value} convertidos' create_campaign: Nova campanha end_date: Data de término finished_on: finalizado em %{value} @@ -320,11 +292,13 @@ pt-BR: no_start_date: data de início não informada number_of_leads: Número de leads objectives: Objetivos - objectives_help: Please specify target number of leads, expected leads-to-opportunities conversion ratio, target revenue, and campaign budget. These numbers will let you track actual campaign performance. + objectives_help: Please specify target number of leads, expected leads-to-opportunities + conversion ratio, target revenue, and campaign budget. These numbers will let + you track actual campaign performance. objectives_small: objetivos da campanha revenue: Receita revenue_label: Receita ($) - revenue_number: "%{value} em receita" + revenue_number: ! '%{value} em receita' save_campaign: Salvar campanha start_date: Data de início started_ago: iniciou há %{value} atrás @@ -334,9 +308,6 @@ pt-BR: total_campaigns: Total Campaigns was_supposed_to_finish: deveria ter terminado a %{value} was_supposed_to_start: deveria ter começado há %{time_ago} atrás em %{start_date} - - # Views -> Contacts. - #---------------------------------------------------------------------------- alt_email_small: Outro blog: Website/Blog contact: Contato @@ -346,41 +317,46 @@ pt-BR: contacts_small: contatos create_contact: Novo contato department: Departamento - department_small: '%{value} departamento' + department_small: ! '%{value} departamento' do_not_call: Não ligar extra_info: Informações exttra extra_info_small: informação extra facebook: Facebook linked_in: LinkedIn myself: Eu - - permissions_intro_private: Por padrão, somente você terá acesso em %{value}. Você pode mudar as permissões depois. - permissions_intro_public: Por padrão, todos os usuários terão acesso em %{value}. Você pode mudar as permissões depois.. - permissions_intro_shared: Por padrão, somente os usuários selecionados terão acesso em %{value}. Você pode mudar as permissões depois.. - + permissions_intro_private: Por padrão, somente você terá acesso em %{value}. Você + pode mudar as permissões depois. + permissions_intro_public: Por padrão, todos os usuários terão acesso em %{value}. + Você pode mudar as permissões depois.. + permissions_intro_shared: Por padrão, somente os usuários selecionados terão acesso + em %{value}. Você pode mudar as permissões depois.. referred_by: Referred by referred_by_small: referred by save_contact: Salvar contato twitter: Twitter web_presence: Web Presence web_presence_small: web presence - works_at: "%{job_title} na %{company}" - - # Views -> Leads. - #---------------------------------------------------------------------------- + works_at: ! '%{job_title} na %{company}' convert: Converter convert_lead: Converter lead - convert_lead_permissions_intro: Contact permissions will be copied from the lead being converted. You can change contact permissions later. - convert_lead_text: By converting the lead %{value} will become a contact associated with the existing or newly created account. Lead status will be automatically set to converted. + convert_lead_permissions_intro: Contact permissions will be copied from the lead + being converted. You can change contact permissions later. + convert_lead_text: By converting the lead %{value} will become a contact associated + with the existing or newly created account. Lead status will be automatically + set to converted. create_lead: Novo lead - create_opp_for_contact: Você pode opcionalmente criar uma oportunidade para o contato %{value} especificando o nome, fase atual, data estimada de fechamento, probabilidade de venda, valor do acordo, e o desconto oferecido. + create_opp_for_contact: Você pode opcionalmente criar uma oportunidade para o contato + %{value} especificando o nome, fase atual, data estimada de fechamento, probabilidade + de venda, valor do acordo, e o desconto oferecido. lead: Lead lead_info_small: contato do lead - - lead_permissions_intro_private: Por padrão, as permissões seráo copiadas da campanha ou ficarão privadas. Você pode mudar as permissões do 'lead' depois. - lead_permissions_intro_public: Por padrão, as permissões sérão copiadas do campanha ou ficarão públicas. Você pode mudar as permissões do 'lead' depois. - lead_permissions_intro_shared: Por padrão, as permissões serão compiadas da campanha ou serão compartilhadas com os usuários especificados. Você pode mudar as permissões do 'lead' depois. - + lead_permissions_intro_private: Por padrão, as permissões seráo copiadas da campanha + ou ficarão privadas. Você pode mudar as permissões do 'lead' depois. + lead_permissions_intro_public: Por padrão, as permissões sérão copiadas do campanha + ou ficarão públicas. Você pode mudar as permissões do 'lead' depois. + lead_permissions_intro_shared: Por padrão, as permissões serão compiadas da campanha + ou serão compartilhadas com os usuários especificados. Você pode mudar as permissões + do 'lead' depois. lead_small: lead lead_status_small: situação do lead lead_summary: Lead Summary @@ -395,9 +371,6 @@ pt-BR: source: Origem status: Situação total_leads: Total de leads - - # Views -> Opportunities. - #---------------------------------------------------------------------------- amount: Valor close_date: Close date closed_ago_on: fechada há %{time_ago} atrás em %{date} @@ -419,17 +392,15 @@ pt-BR: opportunity: Oportunidade opportunity_small: oportunidade opportunity_summary: Oportunidade At a Glance - opportunity_summary_text: "%{amount} com desconto de %{discount} e probabilidade de %{probability}" + opportunity_summary_text: ! '%{amount} com desconto de %{discount} e probabilidade + de %{probability}' past_due: past due, was expected to close %{value} ago probability: Probabilidade - probability_number: e probabilidade de %{value} + probability_number: e probabilidade de %{value} save_opportunity: Salvar oportunidade stage: Fase total_opportunities: Total Opportunities weighted_amount: Weighted amount - - # Views -> Tasks. - #---------------------------------------------------------------------------- assign_to: Atribuida para assigned_tab: Atribuída assigned_tasks: Tarefas atribuídas @@ -441,13 +412,13 @@ pt-BR: due: Prazo feel_free: Sinta-se livre para move_to: mover para - no_tasks: "Você não tem nenhum atividade %{value}" + no_tasks: Você não tem nenhum atividade %{value} no_tasks_pending: pendente no_tasks_assigned: atribuída no_tasks_completed: terminada pending_tab: Pendente pending_tasks: Tarefas pendentes - related: 're:' + related: ! 're:' save_task: Salvar atividade task_assigned: As tarefas foram atribuídas para %{value} task_assigned_to: e artibuída para %{value} @@ -467,9 +438,6 @@ pt-BR: total_tasks: Total %{value} view_assigned_tasks: ver tarefas atribuídas view_pending_tasks: ver tarefas pendentes - - # Views -> Home. - #---------------------------------------------------------------------------- action_commented: comentada em action_completed: terminado action_created: criado @@ -490,49 +458,43 @@ pt-BR: subject_lead: lead subject_opportunity: oportunidade subject_task: tarefa - - # Views -> Common. - #---------------------------------------------------------------------------- add_note: Adicionar nota save_note: Salvar nota add_note_help: Adicionar nova nota... added_ago: adicionado(a) há %{value} atrás - added_by: adicionado(a) há %{time_ago} atrás por %{user} + added_by: adicionado(a) há %{time_ago} atrás por %{user} back: Voltar cancel: Cancelar close_form: Fechar formulário confirm_delete: Tem certeza que deseja remover este %{value}? - copy_permissions: Copiar permissão %{value} - could_not_find: "%{value} não encontrado. Sinta-se livre para" - could_not_find_matching: "Couldn't find %{value} matching" + copy_permissions: Copiar permissão %{value} + could_not_find: ! '%{value} não encontrado. Sinta-se livre para' + could_not_find_matching: Couldn't find %{value} matching create_new: cria um(a) novo(a) select_existing: selecione existentes delete: Remover - discard: Discard # TODO + discard: Discard edit: Editar - items_total: '%{count} total.' + items_total: ! '%{count} total.' less: Menos... me: mim more: Mais... n_a: N/A name: Nome - no_match: 'No %{value} match' + no_match: No %{value} match no_recent_items: Não existem itens recentes para exibir ainda. options: Opções permissions: Permissões please_retry: favor tente outra consulta. recent_items: Itens recentes search_assets: Buscar %{value} - time_ago: "há %{value} atrás" + time_ago: há %{value} atrás background_info: Informações gerais address: Endereço city: Ciudade zipcode: CEP state: Membro/Região country: Campo - - # Views -> Layout. - #---------------------------------------------------------------------------- about: Sobre about_dev_group: Grupo de discussão para desenvolvedores about_features: Funcionalidades e bugs @@ -541,34 +503,24 @@ pt-BR: about_ffc_version: Fat Free CRM versão about_home_page: Home page about_project_page: Página do projeto - about_thank_you: Obrigado(a) por usar o Fat Free CRM! Nós apreciamos o seu negócio e esperamos que você goste de usar nosso software. + about_thank_you: Obrigado(a) por usar o Fat Free CRM! Nós apreciamos o seu negócio + e esperamos que você goste de usar nosso software. about_twitter: Twitter about_user_group: Grupo de discussão para usuários admin: Admin logout: Sair quick_find: Busca rápida welcome: Bem vindo(a) - - # Views -> Comments. - #---------------------------------------------------------------------------- edit_comment: Editando comentário show: Exibir update: Atualizar - - # Views -> Passwords. - #---------------------------------------------------------------------------- confirm_password_intro: Por favor, digite sua nova senha e então confirme-a. - password_intro: Por favor, informe seu e-mail, e as instruções para redefinir a sua senha serão enviadas a você. + password_intro: Por favor, informe seu e-mail, e as instruções para redefinir a + sua senha serão enviadas a você. reset_password: Redefnir senha update_password_and_login: Atualizar senha e entrar. - - # Views -> Admin - #---------------------------------------------------------------------------- back_to_crm: Voltar ao Fat Free CRM crm_admin_page: Administração do Fat Free CRM - - # Views -> Admin -> Users. - #---------------------------------------------------------------------------- approve: Aprovar create_user: Novo usuário last_seen: entrou pela última vez há %{value} atrás @@ -581,7 +533,7 @@ pt-BR: user_awaits_approval: aguarda sua aprovação user_confirm_delete: Um usuário só pode ser removido se não tiver relacionamentos. user_is_admin: Este usuário é administrador - user_never_logged_in: "ainda não entrou no sistema" + user_never_logged_in: ainda não entrou no sistema user_signed_up: Cadastrar-se user_signed_up_on: cadastrou-se em %{value} user_since: usuário desde %{value} @@ -589,45 +541,36 @@ pt-BR: user_suspended_on: suspenso em %{value} users: Usuários users_small: usuários - - # Dropbox. - #---------------------------------------------------------------------------- dropbox_notification_subject: dropbox - E-mail Added - %{subject} - dropbox_notification_intro: Adicionado com sucesso o e-mail que você enviou para dropbox + dropbox_notification_intro: Adicionado com sucesso o e-mail que você enviou para + dropbox dropbox_notification_to: Adicionado a subject: Assunto body: Corpo - - # Pluralizations. - #---------------------------------------------------------------------------- pluralize: comment: - one: '1 comment' # TODO - other: '%{count} comments' # TODO - contact: - one: '1 contato' - other: '%{count} contatos' + one: 1 comment + other: ! '%{count} comments' + contact: + one: 1 contato + other: ! '%{count} contatos' opportunity: - one: '1 oportunidade' - other: '%{count} oportunidades' + one: 1 oportunidade + other: ! '%{count} oportunidades' lead: - one: '1 lead' - other: '%{count} leads' + one: 1 lead + other: ! '%{count} leads' day: - one: '1 dia' - other: '%{count} dias' + one: 1 dia + other: ! '%{count} dias' login: - one: '1 login' - other: '%{count} logins' - - # Custom date/time formats. - #---------------------------------------------------------------------------- + one: 1 login + other: ! '%{count} logins' date: formats: - mmddyyyy: "%m/%d/%Y" - mmdd: "%b %e" - mmddyy: "%b %e, %Y" - + mmddyyyy: ! '%m/%d/%Y' + mmdd: ! '%b %e' + mmddyy: ! '%b %e, %Y' time: formats: - mmddhhss: "%b %e at %l:%M%p" + mmddhhss: ! '%b %e at %l:%M%p' diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 5f52626ae5..ad17b618cc 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1,303 +1,326 @@ -# Russian localization for Ruby on Rails 2.2+ -# by Yaroslav Markin -# -# Be sure to check out "russian" gem (http://github.com/yaroslav/russian) for -# full Russian language support in Rails (month names, pluralization, etc). -# The following is an excerpt from that gem. -# -# Для полноценной поддержки русского языка (варианты названий месяцев, -# плюрализация и так далее) в Rails 2.2 нужно использовать gem "russian" -# (http://github.com/yaroslav/russian). Следующие данные -- выдержка их него, чтобы -# была возможность минимальной локализации приложения на русский язык. - +--- ru: date: formats: - default: "%d.%m.%Y" - short: "%d %b" - long: "%d %B %Y" - - day_names: [воскресенье, понедельник, вторник, среда, четверг, пятница, суббота] - standalone_day_names: [Воскресенье, Понедельник, Вторник, Среда, Четверг, Пятница, Суббота] - abbr_day_names: [Вс, Пн, Вт, Ср, Чт, Пт, Сб] - - month_names: [~, января, февраля, марта, апреля, мая, июня, июля, августа, сентября, октября, ноября, декабря] - # see russian gem for info on "standalone" day names - standalone_month_names: [~, Январь, Февраль, Март, Апрель, Май, Июнь, Июль, Август, Сентябрь, Октябрь, Ноябрь, Декабрь] - abbr_month_names: [~, янв., февр., марта, апр., мая, июня, июля, авг., сент., окт., нояб., дек.] - standalone_abbr_month_names: [~, янв., февр., март, апр., май, июнь, июль, авг., сент., окт., нояб., дек.] - + default: ! '%d.%m.%Y' + short: ! '%d %b' + long: ! '%d %B %Y' + day_names: + - воскресенье + - понедельник + - вторник + - среда + - четверг + - пятница + - суббота + standalone_day_names: + - Воскресенье + - Понедельник + - Вторник + - Среда + - Четверг + - Пятница + - Суббота + abbr_day_names: + - Вс + - Пн + - Вт + - Ср + - Чт + - Пт + - Сб + month_names: + - + - января + - февраля + - марта + - апреля + - мая + - июня + - июля + - августа + - сентября + - октября + - ноября + - декабря + standalone_month_names: + - + - Январь + - Февраль + - Март + - Апрель + - Май + - Июнь + - Июль + - Август + - Сентябрь + - Октябрь + - Ноябрь + - Декабрь + abbr_month_names: + - + - янв. + - февр. + - марта + - апр. + - мая + - июня + - июля + - авг. + - сент. + - окт. + - нояб. + - дек. + standalone_abbr_month_names: + - + - янв. + - февр. + - март + - апр. + - май + - июнь + - июль + - авг. + - сент. + - окт. + - нояб. + - дек. order: - - :day - - :month - - :year - + - :day + - :month + - :year time: formats: - default: "%a, %d %b %Y, %H:%M:%S %z" - short: "%d %b, %H:%M" - long: "%d %B %Y, %H:%M" - - am: "утра" - pm: "вечера" - + default: ! '%a, %d %b %Y, %H:%M:%S %z' + short: ! '%d %b, %H:%M' + long: ! '%d %B %Y, %H:%M' + am: утра + pm: вечера number: format: - separator: "." - delimiter: " " + separator: . + delimiter: ! ' ' precision: 3 significant: false strip_insignificant_zeros: false - currency: format: - format: "%n %u" - unit: "руб." - separator: "." - delimiter: " " + format: ! '%n %u' + unit: руб. + separator: . + delimiter: ! ' ' precision: 2 significant: false strip_insignificant_zeros: false - percentage: format: - delimiter: "" - + delimiter: '' precision: format: - delimiter: "" - + delimiter: '' human: format: - delimiter: "" + delimiter: '' precision: 1 significant: false strip_insignificant_zeros: false - - # Rails 2.2 - # storage_units: [байт, КБ, МБ, ГБ, ТБ] - - # Rails 2.3 storage_units: - # Storage units output formatting. - # %u is the storage unit, %n is the number (default: 2 MB) - format: "%n %u" + format: ! '%n %u' units: byte: - one: "байт" - few: "байта" - many: "байт" - other: "байта" - kb: "КБ" - mb: "МБ" - gb: "ГБ" - tb: "ТБ" - - # Rails 3 + one: байт + few: байта + many: байт + other: байта + kb: КБ + mb: МБ + gb: ГБ + tb: ТБ decimal_units: - format: "%n %u" + format: ! '%n %u' units: - unit: "" + unit: '' thousand: - one: "Тысяча" - few: "Тысяч" - many: "Тысяч" - other: "Тысяч" + one: Тысяча + few: Тысяч + many: Тысяч + other: Тысяч million: - one: "Миллион" - few: "Миллионов" - many: "Миллионов" - other: "Миллионов" + one: Миллион + few: Миллионов + many: Миллионов + other: Миллионов billion: - one: "Миллиард" - few: "Миллиардов" - many: "Миллиардов" - other: "Миллиардов" + one: Миллиард + few: Миллиардов + many: Миллиардов + other: Миллиардов trillion: - one: "Триллион" - few: "Триллионов" - many: "Триллионов" - other: "Триллионов" + one: Триллион + few: Триллионов + many: Триллионов + other: Триллионов quadrillion: - one: "Квадриллион" - few: "Квадриллионов" - many: "Квадриллионов" - other: "Квадриллионов" - + one: Квадриллион + few: Квадриллионов + many: Квадриллионов + other: Квадриллионов datetime: distance_in_words: - half_a_minute: "меньше минуты" + half_a_minute: меньше минуты less_than_x_seconds: - one: "меньше %{count} секунды" - few: "меньше %{count} секунд" - many: "меньше %{count} секунд" - other: "меньше %{count} секунды" + one: меньше %{count} секунды + few: меньше %{count} секунд + many: меньше %{count} секунд + other: меньше %{count} секунды x_seconds: - one: "%{count} секунда" - few: "%{count} секунды" - many: "%{count} секунд" - other: "%{count} секунды" + one: ! '%{count} секунда' + few: ! '%{count} секунды' + many: ! '%{count} секунд' + other: ! '%{count} секунды' less_than_x_minutes: - one: "меньше %{count} минуты" - few: "меньше %{count} минут" - many: "меньше %{count} минут" - other: "меньше %{count} минуты" + one: меньше %{count} минуты + few: меньше %{count} минут + many: меньше %{count} минут + other: меньше %{count} минуты x_minutes: - one: "%{count} минуту" - few: "%{count} минуты" - many: "%{count} минут" - other: "%{count} минуты" + one: ! '%{count} минуту' + few: ! '%{count} минуты' + many: ! '%{count} минут' + other: ! '%{count} минуты' about_x_hours: - one: "около %{count} часа" - few: "около %{count} часов" - many: "около %{count} часов" - other: "около %{count} часа" + one: около %{count} часа + few: около %{count} часов + many: около %{count} часов + other: около %{count} часа x_days: - one: "%{count} день" - few: "%{count} дня" - many: "%{count} дней" - other: "%{count} дня" + one: ! '%{count} день' + few: ! '%{count} дня' + many: ! '%{count} дней' + other: ! '%{count} дня' about_x_months: - one: "около %{count} месяца" - few: "около %{count} месяцев" - many: "около %{count} месяцев" - other: "около %{count} месяца" + one: около %{count} месяца + few: около %{count} месяцев + many: около %{count} месяцев + other: около %{count} месяца x_months: - one: "%{count} месяц" - few: "%{count} месяца" - many: "%{count} месяцев" - other: "%{count} месяца" + one: ! '%{count} месяц' + few: ! '%{count} месяца' + many: ! '%{count} месяцев' + other: ! '%{count} месяца' about_x_years: - one: "около %{count} года" - few: "около %{count} лет" - many: "около %{count} лет" - other: "около %{count} лет" + one: около %{count} года + few: около %{count} лет + many: около %{count} лет + other: около %{count} лет over_x_years: - one: "больше %{count} года" - few: "больше %{count} лет" - many: "больше %{count} лет" - other: "больше %{count} лет" + one: больше %{count} года + few: больше %{count} лет + many: больше %{count} лет + other: больше %{count} лет almost_x_years: - one: "почти 1 год" - other: "почти %{count} лет" - + one: почти 1 год + other: почти %{count} лет prompts: - year: "Год" - month: "Месяц" - day: "День" - hour: "Часов" - minute: "Минут" - second: "Секунд" - + year: Год + month: Месяц + day: День + hour: Часов + minute: Минут + second: Секунд helpers: select: - # Default value for :prompt => true in FormOptionsHelper - prompt: "Выберите: " - - # Default translation keys for submit FormHelper + prompt: ! 'Выберите: ' submit: - create: 'Создать %{model}' - update: 'Сохранить %{model}' - submit: 'Сохранить %{model}' - - # In rails 3 errors is top-level namespace + create: Создать %{model} + update: Сохранить %{model} + submit: Сохранить %{model} errors: - format: "%{attribute} %{message}" - + format: ! '%{attribute} %{message}' messages: - inclusion: "имеет непредусмотренное значение" - exclusion: "имеет зарезервированное значение" - invalid: "имеет неверное значение" - confirmation: "не совпадает с подтверждением" - accepted: "нужно подтвердить" - empty: "не может быть пустым" - blank: "не может быть пустым" + inclusion: имеет непредусмотренное значение + exclusion: имеет зарезервированное значение + invalid: имеет неверное значение + confirmation: не совпадает с подтверждением + accepted: нужно подтвердить + empty: не может быть пустым + blank: не может быть пустым too_long: - one: "слишком большой длины (не может быть больше чем %{count} символ)" - few: "слишком большой длины (не может быть больше чем %{count} символа)" - many: "слишком большой длины (не может быть больше чем %{count} символов)" - other: "слишком большой длины (не может быть больше чем %{count} символа)" + one: слишком большой длины (не может быть больше чем %{count} символ) + few: слишком большой длины (не может быть больше чем %{count} символа) + many: слишком большой длины (не может быть больше чем %{count} символов) + other: слишком большой длины (не может быть больше чем %{count} символа) too_short: - one: "недостаточной длины (не может быть меньше %{count} символа)" - few: "недостаточной длины (не может быть меньше %{count} символов)" - many: "недостаточной длины (не может быть меньше %{count} символов)" - other: "недостаточной длины (не может быть меньше %{count} символа)" + one: недостаточной длины (не может быть меньше %{count} символа) + few: недостаточной длины (не может быть меньше %{count} символов) + many: недостаточной длины (не может быть меньше %{count} символов) + other: недостаточной длины (не может быть меньше %{count} символа) wrong_length: - one: "неверной длины (может быть длиной ровно %{count} символ)" - few: "неверной длины (может быть длиной ровно %{count} символа)" - many: "неверной длины (может быть длиной ровно %{count} символов)" - other: "неверной длины (может быть длиной ровно %{count} символа)" - taken: "уже существует" - not_a_number: "не является числом" - not_an_integer: "не является целым числом" - greater_than: "может иметь значение большее %{count}" - greater_than_or_equal_to: "может иметь значение большее или равное %{count}" - equal_to: "может иметь лишь значение, равное %{count}" - less_than: "может иметь значение меньшее чем %{count}" - less_than_or_equal_to: "может иметь значение меньшее или равное %{count}" - odd: "может иметь лишь четное значение" - even: "может иметь лишь нечетное значение" - record_invalid: "Возникли ошибки: %{errors}" - + one: неверной длины (может быть длиной ровно %{count} символ) + few: неверной длины (может быть длиной ровно %{count} символа) + many: неверной длины (может быть длиной ровно %{count} символов) + other: неверной длины (может быть длиной ровно %{count} символа) + taken: уже существует + not_a_number: не является числом + not_an_integer: не является целым числом + greater_than: может иметь значение большее %{count} + greater_than_or_equal_to: может иметь значение большее или равное %{count} + equal_to: может иметь лишь значение, равное %{count} + less_than: может иметь значение меньшее чем %{count} + less_than_or_equal_to: может иметь значение меньшее или равное %{count} + odd: может иметь лишь четное значение + even: может иметь лишь нечетное значение + record_invalid: ! 'Возникли ошибки: %{errors}' activerecord: errors: template: header: - one: "%{model}: сохранение не удалось из-за %{count} ошибки" - few: "%{model}: сохранение не удалось из-за %{count} ошибок" - many: "%{model}: сохранение не удалось из-за %{count} ошибок" - other: "%{model}: сохранение не удалось из-за %{count} ошибки" - - body: "Проблемы возникли со следующими полями:" - + one: ! '%{model}: сохранение не удалось из-за %{count} ошибки' + few: ! '%{model}: сохранение не удалось из-за %{count} ошибок' + many: ! '%{model}: сохранение не удалось из-за %{count} ошибок' + other: ! '%{model}: сохранение не удалось из-за %{count} ошибки' + body: ! 'Проблемы возникли со следующими полями:' messages: - inclusion: "имеет непредусмотренное значение" - exclusion: "имеет зарезервированное значение" - invalid: "имеет неверное значение" - confirmation: "не совпадает с подтверждением" - accepted: "нужно подтвердить" - empty: "не может быть пустым" - blank: "не может быть пустым" + inclusion: имеет непредусмотренное значение + exclusion: имеет зарезервированное значение + invalid: имеет неверное значение + confirmation: не совпадает с подтверждением + accepted: нужно подтвердить + empty: не может быть пустым + blank: не может быть пустым too_long: - one: "слишком большой длины (не может быть больше чем %{count} символ)" - few: "слишком большой длины (не может быть больше чем %{count} символа)" - many: "слишком большой длины (не может быть больше чем %{count} символов)" - other: "слишком большой длины (не может быть больше чем %{count} символа)" + one: слишком большой длины (не может быть больше чем %{count} символ) + few: слишком большой длины (не может быть больше чем %{count} символа) + many: слишком большой длины (не может быть больше чем %{count} символов) + other: слишком большой длины (не может быть больше чем %{count} символа) too_short: - one: "недостаточной длины (не может быть меньше %{count} символа)" - few: "недостаточной длины (не может быть меньше %{count} символов)" - many: "недостаточной длины (не может быть меньше %{count} символов)" - other: "недостаточной длины (не может быть меньше %{count} символа)" + one: недостаточной длины (не может быть меньше %{count} символа) + few: недостаточной длины (не может быть меньше %{count} символов) + many: недостаточной длины (не может быть меньше %{count} символов) + other: недостаточной длины (не может быть меньше %{count} символа) wrong_length: - one: "неверной длины (может быть длиной ровно %{count} символ)" - few: "неверной длины (может быть длиной ровно %{count} символа)" - many: "неверной длины (может быть длиной ровно %{count} символов)" - other: "неверной длины (может быть длиной ровно %{count} символа)" - taken: "уже существует" - not_a_number: "не является числом" - greater_than: "может иметь значение большее %{count}" - greater_than_or_equal_to: "может иметь значение большее или равное %{count}" - equal_to: "может иметь лишь значение, равное %{count}" - less_than: "может иметь значение меньшее чем %{count}" - less_than_or_equal_to: "может иметь значение меньшее или равное %{count}" - odd: "может иметь лишь четное значение" - even: "может иметь лишь нечетное значение" - record_invalid: "Возникли ошибки: %{errors}" - + one: неверной длины (может быть длиной ровно %{count} символ) + few: неверной длины (может быть длиной ровно %{count} символа) + many: неверной длины (может быть длиной ровно %{count} символов) + other: неверной длины (может быть длиной ровно %{count} символа) + taken: уже существует + not_a_number: не является числом + greater_than: может иметь значение большее %{count} + greater_than_or_equal_to: может иметь значение большее или равное %{count} + equal_to: может иметь лишь значение, равное %{count} + less_than: может иметь значение меньшее чем %{count} + less_than_or_equal_to: может иметь значение меньшее или равное %{count} + odd: может иметь лишь четное значение + even: может иметь лишь нечетное значение + record_invalid: ! 'Возникли ошибки: %{errors}' full_messages: - format: "%{attribute} %{message}" - - + format: ! '%{attribute} %{message}' support: select: - prompt: "Выберите: " - + prompt: ! 'Выберите: ' array: - # Rails 2.2 - sentence_connector: "и" + sentence_connector: и skip_last_comma: true - - # Rails 2.3 - words_connector: ", " - two_words_connector: " и " - last_word_connector: " и " + words_connector: ! ', ' + two_words_connector: ! ' и ' + last_word_connector: ! ' и ' diff --git a/config/locales/ru_fat_free_crm.yml b/config/locales/ru_fat_free_crm.yml index 01278cd7c6..d3e00c2aa8 100644 --- a/config/locales/ru_fat_free_crm.yml +++ b/config/locales/ru_fat_free_crm.yml @@ -1,20 +1,15 @@ +--- ru: language: Russian (Русский) - - # Generic terms. - #---------------------------------------------------------------------------- all: Все at: в here: здесь - no_button: 'Нет' + no_button: Нет not_implemented: Пока не поддерживается. or: или select_blank: -- Выберите -- select_none: -- Нет -- - yes_button: 'Да' - - # Settings. - #---------------------------------------------------------------------------- + yes_button: Да tab_dashboard: Главная tab_tasks: Задания tab_campaigns: Маркетинг @@ -22,22 +17,18 @@ ru: tab_accounts: Контрагенты tab_contacts: Контакты tab_opportunities: Возможности - admin_tab_users: Пользователи admin_tab_settings: Установки admin_tab_plugins: Плагины - planned: В плане started: Начата on_hold: Остановлена completed: Завершена called_off: Прекращена - new: Новый contacted: В работе converted: Продвинут rejected: Закрыт - cold_call: Холодный Звонок conference: Конференция online: Онлайн Маркетинг @@ -46,7 +37,6 @@ ru: web: Веб-сайт word_of_mouth: Понаслышке other: Другое - prospecting: Изучение analysis: Анализ presentation: Презентация @@ -55,16 +45,13 @@ ru: final_review: Утверждение won: Выиграли lost: Проиграли - call: Звонок email: E-mail follow_up: Доработка lunch: Обед meeting: Встреча money: Деньги - presentation: Презентация trip: Поездка - overdue: Задержка due_asap: Как можно скорее due_today: Сегодня @@ -73,24 +60,17 @@ ru: due_next_week: На следующей неделе due_later: Позже due_specific_date: Конкретная дата - completed_today: Сегодня completed_yesterday: Вчера completed_last_week: На прошлой неделе completed_this_month: В этом месяце completed_last_month: В прошлом месяце - - # Models/Activity. - #---------------------------------------------------------------------------- one_hour: Один Час one_day: Один День two_days: Два Дня one_week: Одна Неделя two_weeks: Две Недели one_month: Один Месяц - - # Model Validations. - #---------------------------------------------------------------------------- activerecord: errors: models: @@ -103,85 +83,85 @@ ru: account: attributes: name: - missing_account_name: "^Пожалуйста введите название контрагента." + missing_account_name: ^Пожалуйста введите название контрагента. access: - share_account: "^Пожалуйста укажите пользователей которым разрешен доступ к данному контрагенту." + share_account: ^Пожалуйста укажите пользователей которым разрешен доступ + к данному контрагенту. campaign: attributes: name: - missing_campaign_name: "^Пожалуйста введите название кампании." + missing_campaign_name: ^Пожалуйста введите название кампании. ends_on: - dates_not_in_sequence: "^Пожалуйста укажите дату окончания кампании после ее начала." + dates_not_in_sequence: ^Пожалуйста укажите дату окончания кампании после + ее начала. access: - share_campaign: "^Пожалуйста укажите пользователей которым разрешен доступ к данной кампании." + share_campaign: ^Пожалуйста укажите пользователей которым разрешен доступ + к данной кампании. contact: attributes: first_name: - missing_first_name: "^Пожалуйста введите имя." + missing_first_name: ^Пожалуйста введите имя. last_name: - missing_last_name: "^Пожалуйста введите фамилию." + missing_last_name: ^Пожалуйста введите фамилию. access: - share_contact: "^Пожалуйста укажите пользователей которым разрешен доступ к данному контакту." + share_contact: ^Пожалуйста укажите пользователей которым разрешен доступ + к данному контакту. lead: attributes: first_name: - missing_first_name: "^Пожалуйста введите имя." + missing_first_name: ^Пожалуйста введите имя. last_name: - missing_last_name: "^Пожалуйста введите фамилию." + missing_last_name: ^Пожалуйста введите фамилию. access: - share_lead: "^Пожалуйста укажите пользователей которым разрешен доступ к данному потенциальному клиенту." + share_lead: ^Пожалуйста укажите пользователей которым разрешен доступ + к данному потенциальному клиенту. opportunity: attributes: name: - missing_opportunity_name: "^Пожалуйста введите название возможности." + missing_opportunity_name: ^Пожалуйста введите название возможности. access: - share_opportunity: "^Пожалуйста укажите пользователей которым разрешен доступ к данной возможности." + share_opportunity: ^Пожалуйста укажите пользователей которым разрешен + доступ к данной возможности. task: attributes: name: - missing_task_name: "^Пожалуйста введите название для задания." + missing_task_name: ^Пожалуйста введите название для задания. calendar: - invalid_date: "^Пожалуйста укажите правильную дату." + invalid_date: ^Пожалуйста укажите правильную дату. user: attributes: username: - missing_username: "^Пожалуйста введите имя пользователя." - username_taken: "^Данное имя пользователя уже существует." + missing_username: ^Пожалуйста введите имя пользователя. + username_taken: ^Данное имя пользователя уже существует. email: - msg_missing_email: "^Пожалуйста введите e-mail адрес." - email_in_use: "^Пользователь с данным e-mail адресом уже существует." - - # dynamic_form plugin translations. - #---------------------------------------------------------------------------- + msg_missing_email: ^Пожалуйста введите e-mail адрес. + email_in_use: ^Пользователь с данным e-mail адресом уже существует. errors: template: header: - one: "%{model}: сохранение не удалось из-за %{count} ошибки" - few: "%{model}: сохранение не удалось из-за %{count} ошибок" - many: "%{model}: сохранение не удалось из-за %{count} ошибок" - other: "%{model}: сохранение не удалось из-за %{count} ошибки" - body: "Проблемы возникли со следующими полями:" - + one: ! '%{model}: сохранение не удалось из-за %{count} ошибки' + few: ! '%{model}: сохранение не удалось из-за %{count} ошибок' + many: ! '%{model}: сохранение не удалось из-за %{count} ошибок' + other: ! '%{model}: сохранение не удалось из-за %{count} ошибки' + body: ! 'Проблемы возникли со следующими полями:' msg_account_suspended: Пользователь заблокирован. password_reset_instruction: инструкции по перемене пароля - - # Controllers. - #---------------------------------------------------------------------------- msg_account_created: Ваш аккаунт создан и ожидает активации системным администратором. msg_account_not_approved: Ваш аккаунт еще не активирован. msg_asset_deleted: Этот %{value} был удален. msg_asset_not_available: Этот %{value} более недоступен. - msg_asset_not_authorized: You are not authorized to view this %{value}. # TODO - msg_assets_not_available: Эти %{value} более недоступны. + msg_asset_not_authorized: You are not authorized to view this %{value}. + msg_assets_not_available: Эти %{value} более недоступны. msg_asset_rejected: Этот %{value} отклонен. msg_bad_image_file: ^Ошибка при загрузке или изменении размера указанного изображения. msg_cant_create_related: Невозвожно создать %{asset} так как %{related} более недоступен. - msg_cant_delete_user: "^Невозможно удалить пользователя так как к %{value} привязаны объекты." + msg_cant_delete_user: ^Невозможно удалить пользователя так как к %{value} привязаны + объекты. msg_cant_do: Нельзя %{action} %{asset}, его больше не существует. msg_email_not_found: Пользователя с таким адресом не найдено. msg_enter_new_password: Пожалуйста введите новый пароль. msg_goodbye: Вы вышли. Спасибо за использование Fat Free CRM! - msg_invalid_password: "^Введите правильный пароль." + msg_invalid_password: ^Введите правильный пароль. msg_invalig_login: Неправильный логин или пароль. msg_last_login: Последний раз Вы заходили %{value}. msg_login_needed: Для доступа к этой странице нужно войти в систему. @@ -189,15 +169,14 @@ ru: msg_password_changed: Пароль изменен. msg_password_not_changed: Пароль не был изменен. msg_password_updated: Пароль успешно изменен. - msg_pwd_instructions_sent: Инструкции по перемене пароля Вам высланы. Пожалуйста проверьте свою электронную почту. + msg_pwd_instructions_sent: Инструкции по перемене пароля Вам высланы. Пожалуйста + проверьте свою электронную почту. msg_require_admin: Для доступа к этой странице нужны права Администратора msg_successful_signup: Регистрация прошла успешно, добро пожаловать в Fat Free CRM! msg_welcome: Добро пожаловать в Fat Free CRM! - - # Options. - #---------------------------------------------------------------------------- - "option_amount*probability": взвешенной сумме - activity_options: "Показывать действия изменившие %{models} и произведенные %{user} за последние %{period}." + option_amount*probability: взвешенной сумме + activity_options: Показывать действия изменившие %{models} и произведенные %{user} + за последние %{period}. all_users: Всеми Пользователями option_after: после option_all: все @@ -223,10 +202,8 @@ ru: option_updated_at: дате обновления show_per_page: Показывать %{models} в %{fmt} формате по %{number} записей на странице. sort_by: Сортировать %{models} по %{field}. - sort_by_displaying: Сортировать %{models} по %{field} показывая имя %{position} фамилии. - - # Views -> Profile. - #---------------------------------------------------------------------------- + sort_by_displaying: Сортировать %{models} по %{field} показывая имя %{position} + фамилии. aim: AOL IM already_signed_up: Уже регистрировались? alt_email: Альтернативный E-mail @@ -236,12 +213,12 @@ ru: contact_info: Контактная Информация current_password: Текущий пароль edit_profile: Изменить Профиль - # email: E-mail # <-- Already defined as the task type if Settings. first_name: Имя google: Google IM gravatar_help: Не знаете что такое Gravatar? Почитать про Gravatar image_file: Файл с Изображением - image_help: "Размер изображения будет автоматически изменен на 75 x 75 пикселей. Поддерживаются форматы: GIF, JPG и PNG." + image_help: ! 'Размер изображения будет автоматически изменен на 75 x 75 пикселей. + Поддерживаются форматы: GIF, JPG и PNG.' job_title: Должность last_name: Фамилия login_now_link: Войти! @@ -262,19 +239,14 @@ ru: user: Пользователь username: Логин yahoo: Yahoo IM - - # Views -> Authenticate. - #---------------------------------------------------------------------------- forgot_password: Забыли пароль? login: Вход no_account: Не зарегистрированы? remember_me: Запомнить sign_up_now: Зарегистрироваться! - - # Views -> Accounts. - #---------------------------------------------------------------------------- account: Контрагент - account_permissions_intro: По умолчанию только Вы будете иметь доступ к этому контрагенту. Права доступа можно будет изменить в любое время. + account_permissions_intro: По умолчанию только Вы будете иметь доступ к этому контрагенту. + Права доступа можно будет изменить в любое время. account_small: контрагент accounts: Контрагенты accounts_options: Свойства списка контрагентов @@ -297,9 +269,6 @@ ru: share_with: Показывать перечисленным людям shipping_address: Адрес получателя website: Интернет-страница - - # Views -> Campaigns. - #---------------------------------------------------------------------------- actual: Фактически actual_performance: Фактический Результат budget: Бюджет @@ -322,11 +291,14 @@ ru: no_start_date: дата начала не указана number_of_leads: Количество потенциальных клиентов objectives: Цели - objectives_help: Пожалуйста, введите ожидаемое количество потенциальных клиентов, планируемый коэффициент конверсии потенциальных клиентов в возможность, планируемый доход и бюджет рекламной кампании. Эти цифры позволят отследить фактическую эффективность кампании. + objectives_help: Пожалуйста, введите ожидаемое количество потенциальных клиентов, + планируемый коэффициент конверсии потенциальных клиентов в возможность, планируемый + доход и бюджет рекламной кампании. Эти цифры позволят отследить фактическую эффективность + кампании. objectives_small: целях кампании revenue: Доход revenue_label: Доход (руб.) - revenue_number: "%{value} дохода" + revenue_number: ! '%{value} дохода' save_campaign: Сохранить Изменения start_date: Дата начала started_ago: начата %{value} назад @@ -336,9 +308,6 @@ ru: total_campaigns: Всего кампаний was_supposed_to_finish: должна была закончиться %{value} was_supposed_to_start: должна была начаться %{time_ago} назад %{start_date} - - # Views -> Contacts. - #---------------------------------------------------------------------------- alt_email_small: Доп. e-mail blog: Блог/Интернет-страница contact: Контакт @@ -355,37 +324,40 @@ ru: facebook: Вконтакте linked_in: Одноклассники myself: Мне - - # TODO - permissions_intro_private: By default only you will have access to the %{value}. You can change permissions later. - permissions_intro_public: By default all users will have access to the %{value}. You can change permissions later. - permissions_intro_shared: By default only the selected users will have access to the %{value}. You can change permissions later. - - permissions_intro: При создании только Вы получаете доступ к %{value}ам. Права доступа можно изменить в любое время. + permissions_intro_private: By default only you will have access to the %{value}. + You can change permissions later. + permissions_intro_public: By default all users will have access to the %{value}. + You can change permissions later. + permissions_intro_shared: By default only the selected users will have access to + the %{value}. You can change permissions later. + permissions_intro: При создании только Вы получаете доступ к %{value}ам. Права доступа + можно изменить в любое время. referred_by: По рекомендации referred_by_small: по рекомендации save_contact: Сохранить Контакт twitter: Twitter web_presence: Профили в Сети web_presence_small: профилях - works_at: "%{job_title} в %{company}" - - # Views -> Leads. - #---------------------------------------------------------------------------- + works_at: ! '%{job_title} в %{company}' convert: Конверсия convert_lead: Конвертировать потенциального клиента - convert_lead_permissions_intro: Права доступа к контакту будут скопированы от карточки конвертируемого потенциального клиента. Позже вы сможете изменить права доступа. - convert_lead_text: В результате конверсии потенциального клиента «%{value}», будет создан новый контакт привязанный к существующему или вновь созданному клиенту. Статус потенциального клиента автоматически изменится на конвертирован. + convert_lead_permissions_intro: Права доступа к контакту будут скопированы от карточки + конвертируемого потенциального клиента. Позже вы сможете изменить права доступа. + convert_lead_text: В результате конверсии потенциального клиента «%{value}», + будет создан новый контакт привязанный к существующему или вновь созданному клиенту. + Статус потенциального клиента автоматически изменится на конвертирован. create_lead: Создать потенциального клиента - create_opp_for_contact: Вы можете создать возможность, привязанную к контакту «%{value}», введя в следующих полях название возможности, стадию, предполагаему дату завершения, вероятность продажи, сумма сделки и предлагаемую скидку. + create_opp_for_contact: Вы можете создать возможность, привязанную к контакту «%{value}», + введя в следующих полях название возможности, стадию, предполагаему дату завершения, + вероятность продажи, сумма сделки и предлагаемую скидку. lead: Потенциальный клиент lead_info_small: Контактная информация потенциального клиента - - # TODO - lead_permissions_intro_private: By default permissions will be copied from the campaign or set to private. You can change lead permissions later. - lead_permissions_intro_public: By default permissions will be copied from the campaign or set to public. You can change lead permissions later. - lead_permissions_intro_shared: By default permissions will be copied from the campaign or shared with the specified users. You can change lead permissions later. - + lead_permissions_intro_private: By default permissions will be copied from the campaign + or set to private. You can change lead permissions later. + lead_permissions_intro_public: By default permissions will be copied from the campaign + or set to public. You can change lead permissions later. + lead_permissions_intro_shared: By default permissions will be copied from the campaign + or shared with the specified users. You can change lead permissions later. lead_small: потенциальный клиент lead_status_small: Статус потенциального клиента lead_summary: Информация о потенциальном клиенте @@ -395,14 +367,12 @@ ru: none: Нет rating: Оценка reject: Закрыть - reject_lead_confirm: Вы действительно хотите закрыть эту карточку потенциального клиента? + reject_lead_confirm: Вы действительно хотите закрыть эту карточку потенциального + клиента? save_lead: Сохранить Потенциального клиента source: Источник status: Статус total_leads: Всего потенциальных клиентов - - # Views -> Opportunities. - #---------------------------------------------------------------------------- amount: Сумма close_date: Дата завершения closed_ago_on: завершена %{time_ago} назад %{date} @@ -424,7 +394,8 @@ ru: opportunity: Возможность opportunity_small: возможность opportunity_summary: Краткая информация - opportunity_summary_text: "%{amount} со скидкой %{discount} и вероятностью %{probability} процентов" + opportunity_summary_text: ! '%{amount} со скидкой %{discount} и вероятностью %{probability} + процентов' past_due: просрочено, должно было завершено %{value} назад probability: Вероятность probability_number: и вероятностью %{value} @@ -432,9 +403,6 @@ ru: stage: Стадия total_opportunities: Всего возможностей weighted_amount: Взвешенная сумма - - # Views -> Tasks. - #---------------------------------------------------------------------------- assign_to: Поручить assigned_tab: Порученные assigned_tasks: Порученные Задания @@ -460,26 +428,23 @@ ru: task_completed_ago: завершено %{value} назад task_completed_by: завершил(а) %{user} %{time_ago} назад task_created: Задание добавлено - task_due_in: "срок: через %{value}" - task_due_later: "срок: скоро" - task_due_now: "срок: сейчас" - task_due_today: "срок: сегодня" - task_from: "%{value} поручил(a)" - task_overdue: "задержка, срок:" + task_due_in: ! 'срок: через %{value}' + task_due_later: ! 'срок: скоро' + task_due_now: ! 'срок: сейчас' + task_due_today: ! 'срок: сегодня' + task_from: ! '%{value} поручил(a)' + task_overdue: ! 'задержка, срок:' task_pending: Это задание поставлено в очередь на выполнение task_small: задание tasks: Задания - total_tasks: "%{value}, всего:" + total_tasks: ! '%{value}, всего:' view_assigned_tasks: показать порученные задания view_pending_tasks: показать задания на очереди - - # Views -> Home. - #---------------------------------------------------------------------------- action_commented: прокомментировал(а) action_completed: завершил(а) action_created: добавил(а) action_deleted: удалил(а) - action_email: exchanged emails with # TODO + action_email: exchanged emails with action_reassigned: перепоручил(а) action_rejected: закрыл(а) action_rescheduled: перенес(ла) @@ -495,14 +460,11 @@ ru: subject_lead: наводку subject_opportunity: перспективу subject_task: задание - - # Views -> Common. - #---------------------------------------------------------------------------- add_note: Добавить Комментарий save_note: Сохранить Комментарий add_note_help: Добавить комментарий... added_ago: добавлен %{value} назад - added_by: "%{user} добавил(а) %{time_ago} назад" + added_by: ! '%{user} добавил(а) %{time_ago} назад' back: Назад cancel: Отменить close_form: Закрыть @@ -516,64 +478,53 @@ ru: discard: Сбросить edit: Изменить items_total: Всего %{count}. - less: Less... # TODO + less: Less... me: я - more: More... # TODO - n_a: - + more: More... + n_a: + - name: Название - no_match: "%{value} не найдены" + no_match: ! '%{value} не найдены' no_recent_items: Недавно просмотренных объектов не найдено. options: Опции permissions: Права Доступа please_retry: попробуйте поискать что-нибудь другое. recent_items: Недавние Объекты search_assets: Поиск - %{value} - ago: "%{value} назад" + ago: ! '%{value} назад' background_info: Дополнительная информация address: Адрес city: деловой центр Лондона zipcode: почтовый индекс state: режим работы country: страна - - # Views -> Layout. - #---------------------------------------------------------------------------- about: О программе about_dev_group: Форум для разработчиков about_features: Багтрекер about_ffc: О программе Fat Free CRM - about_ffc_resources: Полезные ресурсы по Fat Free CRM (ссылки открываются в новом окне) + about_ffc_resources: Полезные ресурсы по Fat Free CRM (ссылки открываются в новом + окне) about_ffc_version: Fat Free CRM версия about_home_page: Домашняя страница about_project_page: Страница проекта - about_thank_you: Спасибо что Вы пользуетесь Fat Free CRM! Мы ценим ваш бизнес и надеемся что Вам нравится наше приложение. + about_thank_you: Спасибо что Вы пользуетесь Fat Free CRM! Мы ценим ваш бизнес и + надеемся что Вам нравится наше приложение. about_twitter: Следите за информацией в Twitter about_user_group: Форум для пользователей admin: Админ logout: Выход quick_find: Быстрый поиск welcome: Добро пожаловать - - # Views -> Comments. - #---------------------------------------------------------------------------- edit_comment: Изменить комментарий show: Показать update: Сохранить - - # Views -> Passwords. - #---------------------------------------------------------------------------- confirm_password_intro: Введите новый пароль, и затем подтвердите его. - password_intro: Введите адрес электронной почты, на который Вам выслать инструкции по перемене пароля. + password_intro: Введите адрес электронной почты, на который Вам выслать инструкции + по перемене пароля. reset_password: Изменить Пароль update_password_and_login: Изменить Пароль и Войти - - # Views -> Admin - #---------------------------------------------------------------------------- back_to_crm: Назад к Fat Free CRM crm_admin_page: Администрирование Fat Free CRM - - # Views -> Admin -> Users. - #---------------------------------------------------------------------------- approve: Подтвердить create_user: Создать Пользователя last_seen: последний визит %{value} назад @@ -584,7 +535,8 @@ ru: user_active: Активен user_admin: Админ. user_awaits_approval: ждет подтверждения - user_confirm_delete: Пользователя можно удалить только в том случае, если к нему не привязаны никакие объекты. + user_confirm_delete: Пользователя можно удалить только в том случае, если к нему + не привязаны никакие объекты. user_is_admin: Дать права Администратора user_never_logged_in: еще не заходил(а) user_signed_up: Зарегистрирован @@ -594,59 +546,50 @@ ru: user_suspended_on: заблокирован(а) %{value} users: Пользователи users_small: пользователи - - # Dropbox. - #---------------------------------------------------------------------------- dropbox_notification_subject: dropbox - Добавлено электронной почты - %{subject} - dropbox_notification_intro: Успешно добавлена электронной почты, который направлен Dropbox + dropbox_notification_intro: Успешно добавлена электронной почты, который направлен + Dropbox dropbox_notification_to: В дополнение к subject: Тема body: Тело - - # Pluralizations. - #---------------------------------------------------------------------------- pluralize: comment: - one: '1 comment' # TODO - other: '%{count} comments' # TODO + one: 1 comment + other: ! '%{count} comments' contact: - zero: '0 контактов' - one: '1 контакт' - few: '%{count} контакта' - many: '%{count} контактов' - other: '%{count} контакта' + zero: 0 контактов + one: 1 контакт + few: ! '%{count} контакта' + many: ! '%{count} контактов' + other: ! '%{count} контакта' opportunity: - zero: '0 перспектив' - one: '1 перспектива' - few: '%{count} перспективы' - many: '%{count} перспектив' - other: '%{count} перспектив' + zero: 0 перспектив + one: 1 перспектива + few: ! '%{count} перспективы' + many: ! '%{count} перспектив' + other: ! '%{count} перспектив' lead: - zero: '0 потенциальных клиентов' - one: '1 потенциальный клиент' - few: '%{count} потенциальных клиентов' - many: '%{count} потенциальных клиентов' - other: '%{count} потенциальных клиентов' + zero: 0 потенциальных клиентов + one: 1 потенциальный клиент + few: ! '%{count} потенциальных клиентов' + many: ! '%{count} потенциальных клиентов' + other: ! '%{count} потенциальных клиентов' day: - zero: '0 дней' - one: '%{count} день' - few: '%{count} дня' - many: '%{count} дней' - other: '%{count} дней' + zero: 0 дней + one: ! '%{count} день' + few: ! '%{count} дня' + many: ! '%{count} дней' + other: ! '%{count} дней' login: - one: 'заходил(а) %{count} раз' - few: 'заходил(а) %{count} раза' - many: 'заходил(а) %{count} раз' - other: 'заходил(а) %{count} раз' - - # Custom date/time formats. - #---------------------------------------------------------------------------- + one: заходил(а) %{count} раз + few: заходил(а) %{count} раза + many: заходил(а) %{count} раз + other: заходил(а) %{count} раз date: formats: - mmddyyyy: "%m/%d/%Y" - mmdd: "%b %e" - mmddyy: "%b %e, %Y" - + mmddyyyy: ! '%m/%d/%Y' + mmdd: ! '%b %e' + mmddyy: ! '%b %e, %Y' time: formats: - mmddhhss: "%d %B в %H:%M" + mmddhhss: ! '%d %B в %H:%M' diff --git a/config/locales/sv-SE.yml b/config/locales/sv-SE.yml index ddc835fa3b..99768a3c28 100644 --- a/config/locales/sv-SE.yml +++ b/config/locales/sv-SE.yml @@ -1,232 +1,215 @@ -# Swedish translation. -# By Johan Lundström (johanlunds@gmail.com) with parts taken from http://github.com/daniel/swe_rails. -# With contributions by: -# * Sven Dahlstrand (sven.dahlstrand@gmail.com) -# * Henrik Nyh (henrik@nyh.se) -# * Magnus Bergmark (magnus.bergmark@gmail.com) - -"sv-SE": +--- +sv-SE: number: - # Used in number_with_delimiter() - # These are also the defaults for 'currency', 'percentage', 'precision', and 'human' format: - # Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5) - separator: "," - # Delimits thousands (e.g. 1,000,000 is a million) (always in groups of three) - delimiter: " " # non-breaking space - # Number of decimals after the separator (the number 1 with a precision of 2 gives: 1.00) + separator: ! ',' + delimiter:   precision: 2 significant: false strip_insignificant_zeros: false - - # Used in number_to_currency() currency: format: - # Where is the currency sign? %u is the currency unit, %n the number (default: $5.00) - format: "%n %u" - negative_format: "-%n %u" - unit: "kr" - + format: ! '%n %u' + negative_format: -%n %u + unit: kr percentage: format: - delimiter: "" - + delimiter: '' precision: format: - delimiter: "" - - # Used in number_to_human_size() + delimiter: '' human: format: - delimiter: "" + delimiter: '' precision: 1 - storage_units: - # Storage units output formatting. - # %u is the storage unit, %n is the number (default: 2 MB) - format: "%n %u" + format: ! '%n %u' units: byte: - one: "Byte" - other: "Bytes" - kb: "KB" - mb: "MB" - gb: "GB" - tb: "TB" + one: Byte + other: Bytes + kb: KB + mb: MB + gb: GB + tb: TB decimal_units: - format: "%n %u" + format: ! '%n %u' units: - unit: "" - thousand: "Tusen" - million: "Miljon" - billion: "Miljard" - trillion: "Biljon" - quadrillion: "Triljon" - - # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words() + unit: '' + thousand: Tusen + million: Miljon + billion: Miljard + trillion: Biljon + quadrillion: Triljon datetime: distance_in_words: - half_a_minute: "en halv minut" + half_a_minute: en halv minut less_than_x_seconds: - one: "mindre än en sekund" - other: "mindre än %{count} sekunder" + one: mindre än en sekund + other: mindre än %{count} sekunder x_seconds: - one: "en sekund" - other: "%{count} sekunder" + one: en sekund + other: ! '%{count} sekunder' less_than_x_minutes: - one: "mindre än en minut" - other: "mindre än %{count} minuter" + one: mindre än en minut + other: mindre än %{count} minuter x_minutes: - one: "en minut" - other: "%{count} minuter" + one: en minut + other: ! '%{count} minuter' about_x_hours: - one: "ungefär en timme" - other: "ungefär %{count} timmar" + one: ungefär en timme + other: ungefär %{count} timmar x_days: - one: "en dag" - other: "%{count} dagar" + one: en dag + other: ! '%{count} dagar' about_x_months: - one: "ungefär en månad" - other: "ungefär %{count} månader" + one: ungefär en månad + other: ungefär %{count} månader x_months: - one: "en månad" - other: "%{count} månader" + one: en månad + other: ! '%{count} månader' about_x_years: - one: "ungefär ett år" - other: "ungefär %{count} år" + one: ungefär ett år + other: ungefär %{count} år over_x_years: - one: "mer än ett år" - other: "mer än %{count} år" + one: mer än ett år + other: mer än %{count} år almost_x_years: - one: "nästan ett år" - other: "nästan %{count} år" - + one: nästan ett år + other: nästan %{count} år prompts: - year: "År" - month: "Månad" - day: "Dag" - hour: "Timme" - minute: "Minut" - second: "Sekund" - + year: År + month: Månad + day: Dag + hour: Timme + minute: Minut + second: Sekund helpers: select: - prompt: "Välj" - + prompt: Välj submit: - create: "Skapa %{model}" - update: "Ändra %{model}" - submit: "Spara %{model}" - + create: Skapa %{model} + update: Ändra %{model} + submit: Spara %{model} errors: - format: "%{attribute} %{message}" - - messages: &errors_messages - inclusion: "finns inte i listan" - exclusion: "är reserverat" - invalid: "är ogiltigt" - confirmation: "stämmer inte överens" - accepted: "måste vara accepterad" - empty: "får ej vara tom" - blank: "måste anges" - too_long: "är för lång (maximum är %{count} tecken)" - too_short: "är för kort (minimum är %{count} tecken)" - wrong_length: "har fel längd (ska vara %{count} tecken)" - taken: "har redan tagits" - not_a_number: "är inte ett nummer" - not_an_integer: "måste vara ett heltal" - greater_than: "måste vara större än %{count}" - greater_than_or_equal_to: "måste vara större än eller lika med %{count}" - equal_to: "måste vara samma som" - less_than: "måste vara mindre än %{count}" - less_than_or_equal_to: "måste vara mindre än eller lika med %{count}" - odd: "måste vara udda" - even: "måste vara jämnt" - record_invalid: "Ett fel uppstod: %{errors}" - + format: ! '%{attribute} %{message}' + messages: + inclusion: finns inte i listan + exclusion: är reserverat + invalid: är ogiltigt + confirmation: stämmer inte överens + accepted: måste vara accepterad + empty: får ej vara tom + blank: måste anges + too_long: är för lång (maximum är %{count} tecken) + too_short: är för kort (minimum är %{count} tecken) + wrong_length: har fel längd (ska vara %{count} tecken) + taken: har redan tagits + not_a_number: är inte ett nummer + not_an_integer: måste vara ett heltal + greater_than: måste vara större än %{count} + greater_than_or_equal_to: måste vara större än eller lika med %{count} + equal_to: måste vara samma som + less_than: måste vara mindre än %{count} + less_than_or_equal_to: måste vara mindre än eller lika med %{count} + odd: måste vara udda + even: måste vara jämnt + record_invalid: ! 'Ett fel uppstod: %{errors}' activerecord: errors: - # model.errors.full_messages format. template: header: - one: "Ett fel förhindrade denna %{model} från att sparas" - other: "%{count} fel förhindrade denna %{model} från att sparas" - body: "Det var problem med följande fält:" - + one: Ett fel förhindrade denna %{model} från att sparas + other: ! '%{count} fel förhindrade denna %{model} från att sparas' + body: ! 'Det var problem med följande fält:' messages: - taken: "är upptaget" - record_invalid: "Validering misslyckades: %{errors}" - <<: *errors_messages - + inclusion: finns inte i listan + exclusion: är reserverat + invalid: är ogiltigt + confirmation: stämmer inte överens + accepted: måste vara accepterad + empty: får ej vara tom + blank: måste anges + too_long: är för lång (maximum är %{count} tecken) + too_short: är för kort (minimum är %{count} tecken) + wrong_length: har fel längd (ska vara %{count} tecken) + taken: är upptaget + not_a_number: är inte ett nummer + not_an_integer: måste vara ett heltal + greater_than: måste vara större än %{count} + greater_than_or_equal_to: måste vara större än eller lika med %{count} + equal_to: måste vara samma som + less_than: måste vara mindre än %{count} + less_than_or_equal_to: måste vara mindre än eller lika med %{count} + odd: måste vara udda + even: måste vara jämnt + record_invalid: ! 'Validering misslyckades: %{errors}' full_messages: - format: "%{attribute} %{message}" - - # The values :model, :attribute and :value are always available for interpolation - # The value :count is available when applicable. Can be used for pluralization. - # Append your own errors here or at the model/attributes scope. - - # You can define own errors for models or model attributes. - # The values :model, :attribute and :value are always available for interpolation. - # - # For example, - # models: - # user: - # blank: "This is a custom blank message for %{model}: %{attribute}" - # attributes: - # login: - # blank: "This is a custom blank message for User login" - # Will define custom blank validation message for User model and - # custom blank validation message for login attribute of User model. - # models: - - # Translate model names. Used in Model.human_name(). - #models: - # For example, - # user: "Dude" - # will translate User model name to "Dude" - - # Translate model attribute names. Used in Model.human_attribute_name(attribute). - #attributes: - # For example, - # user: - # login: "Handle" - # will translate User attribute "login" as "Handle" - + format: ! '%{attribute} %{message}' date: formats: - # Use the strftime parameters for formats. - # When no format has been given, it uses default. - # You can provide other formats here if you like! - default: "%Y-%m-%d" - short: "%e %b" - long: "%e %B %Y" - - day_names: [söndag, måndag, tisdag, onsdag, torsdag, fredag, lördag] - abbr_day_names: [sön, mån, tis, ons, tor, fre, lör] - - # Don't forget the nil at the beginning; there's no such thing as a 0th month - month_names: [~, januari, februari, mars, april, maj, juni, juli, augusti, september, oktober, november, december] - abbr_month_names: [~, jan, feb, mar, apr, maj, jun, jul, aug, sep, okt, nov, dec] - # Used in date_select and datime_select. + default: ! '%Y-%m-%d' + short: ! '%e %b' + long: ! '%e %B %Y' + day_names: + - söndag + - måndag + - tisdag + - onsdag + - torsdag + - fredag + - lördag + abbr_day_names: + - sön + - mån + - tis + - ons + - tor + - fre + - lör + month_names: + - + - januari + - februari + - mars + - april + - maj + - juni + - juli + - augusti + - september + - oktober + - november + - december + abbr_month_names: + - + - jan + - feb + - mar + - apr + - maj + - jun + - jul + - aug + - sep + - okt + - nov + - dec order: - - :day - - :month - - :year - + - :day + - :month + - :year time: formats: - default: "%a, %e %b %Y %H:%M:%S %z" - short: "%e %b %H:%M" - long: "%e %B %Y %H:%M" - am: "" - pm: "" - - # Used in array.to_sentence. + default: ! '%a, %e %b %Y %H:%M:%S %z' + short: ! '%e %b %H:%M' + long: ! '%e %B %Y %H:%M' + am: '' + pm: '' support: array: - words_connector: ", " - two_words_connector: " och " - last_word_connector: " och " + words_connector: ! ', ' + two_words_connector: ! ' och ' + last_word_connector: ! ' och ' select: - # default value for :prompt => true in FormOptionsHelper - prompt: "Välj" + prompt: Välj diff --git a/config/locales/sv-SE_fat_free_crm.yml b/config/locales/sv-SE_fat_free_crm.yml index 0945a1976a..29e16154b1 100644 --- a/config/locales/sv-SE_fat_free_crm.yml +++ b/config/locales/sv-SE_fat_free_crm.yml @@ -1,23 +1,15 @@ -# Swedish (Sweden) translation of Fat Free Crm. -# by Xug Haa (https://github.com/xughaa) -# +--- sv-SE: language: Svenska (Sverige) - - # Generic terms. - #---------------------------------------------------------------------------- all: Alla at: vid here: här - no_button: 'Nej' + no_button: Nej not_implemented: Ej implementerad. or: eller - select_none: '-- Ingen --' - select_blank: '-- Välj --' - yes_button: 'Ja' - - # Settings. - #---------------------------------------------------------------------------- + select_none: -- Ingen -- + select_blank: -- Välj -- + yes_button: Ja tab_dashboard: Kontrollpanel tab_tasks: Ärende tab_campaigns: Kampanjer @@ -25,22 +17,18 @@ sv-SE: tab_accounts: Konton tab_contacts: Kontakter tab_opportunities: Affärer - admin_tab_users: Användare admin_tab_settings: Inställningar admin_tab_plugins: Tilläggsmoduler - planned: Planerad started: Påbörjad on_hold: På is completed: Avslutad called_off: Avvisad - new: Ny contacted: Kontaktade converted: Konverterad rejected: Avslag - cold_call: Kallringning conference: Konferans online: Web-marknadsföring @@ -49,7 +37,6 @@ sv-SE: web: Hemsida word_of_mouth: Mun till mun other: Övrigt - prospecting: Prospektering analysis: Analys presentation: Presentation @@ -58,16 +45,13 @@ sv-SE: final_review: Besulttagande won: Avslutad positiv lost: Avslutad negativ - call: Samtal email: E-post follow_up: Uppföljning lunch: Lunch meeting: Möte money: Betalning - presentation: Presentation trip: Resa - overdue: Förfallen due_asap: Snarast möjligt due_today: Idag @@ -76,24 +60,17 @@ sv-SE: due_next_week: Nästa vecka due_later: Senare due_specific_date: Fast datum... - completed_today: Idag completed_yesterday: Igår completed_last_week: Förra veckan completed_this_month: Denna månaden completed_last_month: Förra månaden - - # Models/Activity. - #---------------------------------------------------------------------------- one_hour: En timma one_day: En dag two_days: Två dagar one_week: En vecka two_weeks: Två veckor one_month: En månad - - # Model Validations. - #---------------------------------------------------------------------------- activerecord: errors: models: @@ -106,89 +83,86 @@ sv-SE: account: attributes: name: - missing_account_name: "^Ange ett kontonamn." + missing_account_name: ^Ange ett kontonamn. access: - share_account: "^Ange användarna som du vill dela kontot med." + share_account: ^Ange användarna som du vill dela kontot med. campaign: attributes: name: - missing_campaign_name: "^Ange namnet på kampanjen." + missing_campaign_name: ^Ange namnet på kampanjen. ends_on: - dates_not_in_sequence: "^Kampanjens slutdatum måste vara senare än startdatumet." + dates_not_in_sequence: ^Kampanjens slutdatum måste vara senare än startdatumet. access: - share_campaign: "^Ange användarna som du vil dela kampanjen med." + share_campaign: ^Ange användarna som du vil dela kampanjen med. contact: attributes: first_name: - missing_first_name: "^Ange förnamn." + missing_first_name: ^Ange förnamn. last_name: - missing_last_name: "^Ange efternamn." + missing_last_name: ^Ange efternamn. access: - share_contact: "^Ange användarna som du vill dela kontakten med." + share_contact: ^Ange användarna som du vill dela kontakten med. lead: attributes: first_name: - missing_first_name: "^Ange förnamn." + missing_first_name: ^Ange förnamn. last_name: - missing_last_name: "^Ange efternamn." + missing_last_name: ^Ange efternamn. access: - share_lead: "^Ange användarna som du vill dela leaden med." + share_lead: ^Ange användarna som du vill dela leaden med. opportunity: attributes: name: - missing_opportunity_name: "^Ange namnet på affären." + missing_opportunity_name: ^Ange namnet på affären. access: - share_opportunity: "^Ange användarna som du vill dela affären med." + share_opportunity: ^Ange användarna som du vill dela affären med. task: attributes: name: - missing_task_name: "^Ange namnet på ärendet." + missing_task_name: ^Ange namnet på ärendet. calendar: - invalid_date: "^Ange ett giltigt datum." + invalid_date: ^Ange ett giltigt datum. user: attributes: username: - missing_username: "^Ange användarnamn." - username_taken: "^Detta användarnamn är redan taget." + missing_username: ^Ange användarnamn. + username_taken: ^Detta användarnamn är redan taget. email: - missing_email: "^Ange e-postadress." - email_in_use: "^Det finns redan en användare med samma e-postadress." - - msg_account_suspended: "Användarkontot har spärrats." - password_reset_instruction: "Instruktioner för återställandet av lösenordet." - - # Controllers. - #---------------------------------------------------------------------------- - msg_account_created: "Ditt användarkonto har skapats och skall godkännas av systemadministratorn." - msg_account_not_approved: "Ditt användarkonto har ej blivit godkännt ännu." - msg_asset_deleted: "%{value} har tagits bort." - msg_asset_not_available: "%{value} är ej längre tillgänglig/t." - msg_assets_not_available: "%{value} är ej tillgängliga." - msg_asset_rejected: "%{value} har avvisats." - msg_bad_image_file: "^Omöjligt att ladda upp eller ändra storleken på bilden." - msg_cant_create_related: "Omöjligt att skapa %{asset} därför att %{related} är ej längre tillgänglig/t." - msg_cant_delete_user: "^Omöjligt att ta bort användaren därför att %{value} äger relaterad information." - msg_cant_do: "Omöjligt att %{action} %{asset} eftersom den/det ej längre är tillgänglig/t." - msg_email_not_found: "Ingen användare hittades med den angivna e-postadressen." - msg_enter_new_password: "Ange ditt nya lösenord." - msg_goodbye: "Du har loggats ut. Tack för att du använder detta program." - msg_invalid_password: "^Ange ett giltigt lösenord." - msg_invalig_login: "Ogiltigt användarnamn eller lösenord." - msg_last_login: "Din senaste inloggning var den %{value}." - msg_login_needed: "Du måste vara inloggad för att ha tillgång till denna sida." - msg_logout_needed: "Du måste vara utloggad för att ha tillgång till denna sida." - msg_password_changed: "Ditt lösenord har ändrats." - msg_password_not_changed: "Ditt lösenord har inte ändrats." - msg_password_updated: "Lösenordet har uppdaterats." - msg_pwd_instructions_sent: "Instruktioner för att återställa ditt lösenord har skickats till dig. V.g. kontrollera din e-post." - msg_require_admin: "Du måste ha administratorrättigheter för att ha tillgång till denna sida." - msg_successful_signup: "Du är nu registrerad. Välkommen!" + missing_email: ^Ange e-postadress. + email_in_use: ^Det finns redan en användare med samma e-postadress. + msg_account_suspended: Användarkontot har spärrats. + password_reset_instruction: Instruktioner för återställandet av lösenordet. + msg_account_created: Ditt användarkonto har skapats och skall godkännas av systemadministratorn. + msg_account_not_approved: Ditt användarkonto har ej blivit godkännt ännu. + msg_asset_deleted: ! '%{value} har tagits bort.' + msg_asset_not_available: ! '%{value} är ej längre tillgänglig/t.' + msg_assets_not_available: ! '%{value} är ej tillgängliga.' + msg_asset_rejected: ! '%{value} har avvisats.' + msg_bad_image_file: ^Omöjligt att ladda upp eller ändra storleken på bilden. + msg_cant_create_related: Omöjligt att skapa %{asset} därför att %{related} är ej + längre tillgänglig/t. + msg_cant_delete_user: ^Omöjligt att ta bort användaren därför att %{value} äger + relaterad information. + msg_cant_do: Omöjligt att %{action} %{asset} eftersom den/det ej längre är tillgänglig/t. + msg_email_not_found: Ingen användare hittades med den angivna e-postadressen. + msg_enter_new_password: Ange ditt nya lösenord. + msg_goodbye: Du har loggats ut. Tack för att du använder detta program. + msg_invalid_password: ^Ange ett giltigt lösenord. + msg_invalig_login: Ogiltigt användarnamn eller lösenord. + msg_last_login: Din senaste inloggning var den %{value}. + msg_login_needed: Du måste vara inloggad för att ha tillgång till denna sida. + msg_logout_needed: Du måste vara utloggad för att ha tillgång till denna sida. + msg_password_changed: Ditt lösenord har ändrats. + msg_password_not_changed: Ditt lösenord har inte ändrats. + msg_password_updated: Lösenordet har uppdaterats. + msg_pwd_instructions_sent: Instruktioner för att återställa ditt lösenord har skickats + till dig. V.g. kontrollera din e-post. + msg_require_admin: Du måste ha administratorrättigheter för att ha tillgång till + denna sida. + msg_successful_signup: Du är nu registrerad. Välkommen! msg_welcome: Välkommen! - - # Options. - #---------------------------------------------------------------------------- - "option_amount*probability": beräknat belopp - activity_options: "Visa %{models} aktiviteterna utförda av %{user} under %{period}." + option_amount*probability: beräknat belopp + activity_options: Visa %{models} aktiviteterna utförda av %{user} under %{period}. all_users: alla användare option_after: efter option_all: alla @@ -214,10 +188,7 @@ sv-SE: option_updated_at: datum uppdaterad show_per_page: Visa %{number} %{models} per sida med formatet %{format}. sort_by: Sortera %{models} på %{field}. - sort_by_displaying: "Sortera %{models} på %{field} och visa förnamn %{position} efternamn." - - # Views -> Profile. - #---------------------------------------------------------------------------- + sort_by_displaying: Sortera %{models} på %{field} och visa förnamn %{position} efternamn. aim: AOL IM already_signed_up: Är du redan registrerad? alt_email: Alternativ e-post @@ -226,12 +197,12 @@ sv-SE: contact_info: Kontakt information current_password: Aktuellt lösenord edit_profile: Ändra profil - # email: E-post # <-- Already defined as the task type if Settings. first_name: Förnamn google: Google IM gravatar_help: Känner du inte till Gravatars? Lär dig om Gravatars image_file: Bildfil - image_help: Bildfilen som du laddar upp kommer automatiskt att ändras till storlek 75 x 75 pixlar. Godkända format är GIF, JPG och PNG. + image_help: Bildfilen som du laddar upp kommer automatiskt att ändras till storlek + 75 x 75 pixlar. Godkända format är GIF, JPG och PNG. job_title: Titel last_name: Efternamn login_now_link: Logga in nu! @@ -252,17 +223,11 @@ sv-SE: user: Användare username: Användarnamn yahoo: Yahoo IM - - # Views -> Authenticate. - #---------------------------------------------------------------------------- forgot_password: Glömt lösenord login: Logga in no_account: Har du inget konto? remember_me: Kom i håg mig sign_up_now: Registrera dig nu! - - # Views -> Accounts. - #---------------------------------------------------------------------------- account: Konto account_small: konto accounts: konton @@ -287,9 +252,6 @@ sv-SE: share_with: Dela med följande personer shipping_address: Leveransadress website: Hemsida - - # Views -> Campaigns. - #---------------------------------------------------------------------------- actual: Faktisk actual_performance: Faktisk prestanda budget: Budget @@ -304,7 +266,7 @@ sv-SE: campaigns_small: kampanjer conversion: Konvertering conversion_label: Konvertering (%) - conversion_number: "%{value} konverterinsgrad" + conversion_number: ! '%{value} konverterinsgrad' create_campaign: Skapa kampanj end_date: Slutdatum finished_on: avslutad %{value} @@ -312,11 +274,13 @@ sv-SE: no_start_date: startdatum ej angiven number_of_leads: Antal leads objectives: Målsättning - objectives_help: Ange förväntade antal leads, förväntad konverteringsgrad, förväntade intäkter och kampanjbudget. Dessa siffror tillåter dig att övervaka kampanjens faktiska prestanda. + objectives_help: Ange förväntade antal leads, förväntad konverteringsgrad, förväntade + intäkter och kampanjbudget. Dessa siffror tillåter dig att övervaka kampanjens + faktiska prestanda. objectives_small: campaign objectives revenue: Intäkter revenue_label: Intäkter (kr) - revenue_number: "%{value} intäkter" + revenue_number: ! '%{value} intäkter' save_campaign: Spara kampanj start_date: Startdatum started_ago: startade för %{value} sedan @@ -327,9 +291,6 @@ sv-SE: was_supposed_to_finish: skulle ha varit avslutad %{value} was_supposed_to_start: skulle ha varit påbörjad för %{time_ago} sedan, dvs %{start_date} was_supposed_to_start_in: påbörjas om %{starts_in}, dvs %{start_date} - - # Views -> Contacts. - #---------------------------------------------------------------------------- alt_email_small: Alternativ blog: Hemsida/Blog contact: Kontakt @@ -339,37 +300,48 @@ sv-SE: contacts_small: kontakter create_contact: Skapa kontakt department: Avdelning - department_small: '%{value} avdelning' + department_small: ! '%{value} avdelning' do_not_call: Ring ej extra_info: Övrig extra_info_small: övrig facebook: Facebook linked_in: LinkedIn myself: Mig själv - permissions_intro_private: Normalt har endast du tillgång till %{value}. Du kan ändra rättigheterna senare. - permissions_intro_public: Normalt har alla användare tillgång till %{value}. Du kan ändra rättigheterna senare. - permissions_intro_shared: Normalt har endast utvalda användare tillgågn till %{value}. Du kan ändra rättigheterna senare. + permissions_intro_private: Normalt har endast du tillgång till %{value}. Du kan + ändra rättigheterna senare. + permissions_intro_public: Normalt har alla användare tillgång till %{value}. Du + kan ändra rättigheterna senare. + permissions_intro_shared: Normalt har endast utvalda användare tillgågn till %{value}. + Du kan ändra rättigheterna senare. referred_by: Refererad av referred_by_small: refererad av save_contact: Spara kontakt twitter: Twitter web_presence: Webadresser web_presence_small: webadresser - works_at: "%{job_title} på %{company}" - - # Views -> Leads. - #---------------------------------------------------------------------------- + works_at: ! '%{job_title} på %{company}' convert: Konvertera convert_lead: Konvertera Lead - convert_lead_permissions_intro: Kontakträttigheterna kopieras från leaden som konverteras. Du kan ändra rättigheterna senare. - convert_lead_text: Genoma att konvertera leaden %{value}, så förvandlas leaden till en kontakt associerad med ett befintligt eller nyskapat konto. Statusen kommer att ändras automatiskt till konverterad. + convert_lead_permissions_intro: Kontakträttigheterna kopieras från leaden som konverteras. + Du kan ändra rättigheterna senare. + convert_lead_text: Genoma att konvertera leaden %{value}, så förvandlas leaden till + en kontakt associerad med ett befintligt eller nyskapat konto. Statusen kommer + att ändras automatiskt till konverterad. create_lead: Skapa lead - create_opp_for_contact: Du kan välja att skapa en affär med kontakten %{value} genom att namnge affären och ange nuvarande skede, beräknat avslutningsdatum, försäljningssannolikhet, affärens belopp, och erbjuden rabatt. + create_opp_for_contact: Du kan välja att skapa en affär med kontakten %{value} genom + att namnge affären och ange nuvarande skede, beräknat avslutningsdatum, försäljningssannolikhet, + affärens belopp, och erbjuden rabatt. lead: Lead lead_info_small: lead kontakt - lead_permissions_intro_private: Normalt kommer rättigheterna att bli kopierade från kampanjen eller så blir de privata rättigheter. Du kan ändra rättigherna på leaden senare. - lead_permissions_intro_public: Normalt kommer rättigheterna att bli kopierade från kampanjen eller så blir de publika rättigheter. Du kan ändra rättigheterna på leaden senare. - lead_permissions_intro_shared: Normalt kommer rättigheterna att bli kopierade från kampanjen eller så blir de delade rättigheter med specificerade användare. Du kan ändra rättigheterna på leaden senare. + lead_permissions_intro_private: Normalt kommer rättigheterna att bli kopierade från + kampanjen eller så blir de privata rättigheter. Du kan ändra rättigherna på leaden + senare. + lead_permissions_intro_public: Normalt kommer rättigheterna att bli kopierade från + kampanjen eller så blir de publika rättigheter. Du kan ändra rättigheterna på + leaden senare. + lead_permissions_intro_shared: Normalt kommer rättigheterna att bli kopierade från + kampanjen eller så blir de delade rättigheter med specificerade användare. Du + kan ändra rättigheterna på leaden senare. lead_small: lead lead_status_small: lead status lead_summary: Lead översikt @@ -384,9 +356,6 @@ sv-SE: source: Källa status: Status total_leads: Totala Leads - - # Views -> Opportunities. - #---------------------------------------------------------------------------- amount: Belopp close_date: Slutdatum closed_ago_on: avslutad %{time_ago} sedan, dvs. %{date} @@ -408,7 +377,7 @@ sv-SE: opportunity: Affär opportunity_small: affär opportunity_summary: Affärsöversikt - opportunity_summary_text: "%{amount} med rabatt %{discount} och sannolikhet %{probability}" + opportunity_summary_text: ! '%{amount} med rabatt %{discount} och sannolikhet %{probability}' past_due: förfallen, skulle ha varit avslutad %{value} sedan probability: Sannolikhet probability_number: och sannolikhet %{value} @@ -416,9 +385,6 @@ sv-SE: stage: Skede total_opportunities: Totala Affärer weighted_amount: Beräknat belopp - - # Views -> Tasks. - #---------------------------------------------------------------------------- assign_to: Tilldela till assigned_tab: Tilldelade assigned_tasks: Tilldelade Ärenden @@ -430,13 +396,13 @@ sv-SE: due: Förfaller feel_free: Tveka inte att move_to: flytta till - no_tasks: "Du har inga ärenden %{value}" + no_tasks: Du har inga ärenden %{value} no_tasks_pending: på Kö no_tasks_assigned: tilldelade no_tasks_completed: utförda pending_tab: På kö pending_tasks: Ärenden på kö - related: 'SV:' + related: ! 'SV:' save_task: Spara ärendet task_assigned: Ärendet har tilldelats till %{value} task_assigned_to: och tilldelats till %{value} @@ -456,20 +422,17 @@ sv-SE: total_tasks: Antal %{value} view_assigned_tasks: visa tilldelade ärenden view_pending_tasks: visa ärenden på kö - - # Views -> Home. - #---------------------------------------------------------------------------- - action_commented: "har kommenterat:" + action_commented: ! 'har kommenterat:' action_completed: utförd - action_created: "har skapat:" - action_deleted: "har tagit bort:" - action_email: "har utväxlat e-post med:" - action_reassigned: "vidare tilldelat:" - action_rejected: "har avvisat:" - action_rescheduled: "har omplanerat:" - action_updated: "har uppdaterat:" - action_viewed: "har undersökt:" - action_won: "har vunnit:" + action_created: ! 'har skapat:' + action_deleted: ! 'har tagit bort:' + action_email: ! 'har utväxlat e-post med:' + action_reassigned: ! 'vidare tilldelat:' + action_rejected: ! 'har avvisat:' + action_rescheduled: ! 'har omplanerat:' + action_updated: ! 'har uppdaterat:' + action_viewed: ! 'har undersökt:' + action_won: ! 'har vunnit:' no_activity_records: Aktivitet poster saknas. recent_activity: Senaste aktiviteter recent_activity_options: Aktivitetsalternativ @@ -479,9 +442,6 @@ sv-SE: subject_lead: lead subject_opportunity: affär subject_task: ärende - - # Views -> Common. - #---------------------------------------------------------------------------- add_note: Lägg till anteckning save_note: Spara anteckning add_note_help: Lägg till en ny antekning... @@ -493,20 +453,20 @@ sv-SE: close_form: Stäng sidan confirm_delete: Är du säker på att du vill ta bort denna/detta %{value}? copy_permissions: Kopiera %{value} rättigheter - could_not_find: "Kunde inte hitta: %{value}. Tveka inte att" - could_not_find_matching: "Inga %{value} hittades som matchade" + could_not_find: ! 'Kunde inte hitta: %{value}. Tveka inte att' + could_not_find_matching: Inga %{value} hittades som matchade create_new: skapa nytt select_existing: välj befintligt delete: Ta bort discard: Kasta bort edit: Ändra - items_total: 'totalt: %{count}.' + items_total: ! 'totalt: %{count}.' less: Mindre... me: mig more: Mera... n_a: saknas name: Namn - no_match: "Inga %{value} hittades som matchade" + no_match: Inga %{value} hittades som matchade no_recent_items: Det finns inga nya poster att visa ännu. options: Alternativ permissions: Rättigheter @@ -517,18 +477,15 @@ sv-SE: select_task: Välj ärende select_opportunity: Välj affär search_assets: Sök %{value} - time_ago: "%{value} sedan" + time_ago: ! '%{value} sedan' background_info: Bakgrund address: Adress - street1: Rad 1 # NEW - street2: Rad 2 # NEW + street1: Rad 1 + street2: Rad 2 city: Ort zipcode: Postkod state: Stat/region country: Land - - # Views -> Layout. - #---------------------------------------------------------------------------- about: Om about_dev_group: Diskussionsgrupp för utvecklare about_features: Funktioner och buggar @@ -544,27 +501,16 @@ sv-SE: logout: Logga ut quick_find: Snabbsökning welcome: Välkommen - - # Views -> Comments. - #---------------------------------------------------------------------------- edit_comment: Ändra kommentar show: Visa update: Uppdatera - - # Views -> Passwords. - #---------------------------------------------------------------------------- confirm_password_intro: Skriv ditt nya lösenord och bekräfta det. - password_intro: Ange din e-postadress och instruktioner för att återställa ditt lösenord kommer att skickas til dig. + password_intro: Ange din e-postadress och instruktioner för att återställa ditt + lösenord kommer att skickas til dig. reset_password: Återställ lösenord update_password_and_login: Uppdatera lösenord och inloggingsuppgifter - - # Views -> Admin - #---------------------------------------------------------------------------- back_to_crm: Tillbaks till huvudprogrammet crm_admin_page: Administration - - # Views -> Admin -> Users. - #---------------------------------------------------------------------------- approve: Godkänn create_user: Skapa användare last_seen: senast inloggad %{value} sedan @@ -575,9 +521,10 @@ sv-SE: user_active: Aktiv user_admin: Administrator user_awaits_approval: inväntar godkännandet - user_confirm_delete: En användare får tas bort endast om det inte finns relaterad kvarstående information. + user_confirm_delete: En användare får tas bort endast om det inte finns relaterad + kvarstående information. user_is_admin: Användaren är administrator - user_never_logged_in: "har inte loggat in ännu" + user_never_logged_in: har inte loggat in ännu user_signed_up: Registrerad user_signed_up_on: registrerade %{value} user_since: användare sedan %{value} @@ -585,44 +532,33 @@ sv-SE: user_suspended_on: avstängd %{value} users: Användare users_small: användare - - # Dropbox. - #---------------------------------------------------------------------------- dropbox_notification_subject: Dropbox - e-postadress tillagd - %{subject} dropbox_notification_intro: E-postmeddelandet har lagts till i Dropbox dropbox_notification_to: Lagts till subject: Ämne body: Text - - # Pluralizations. - #---------------------------------------------------------------------------- pluralize: contact: - one: '1 kontakt' - other: '%{count} kontakter' + one: 1 kontakt + other: ! '%{count} kontakter' opportunity: - one: '1 affär' - other: '%{count} affärer' + one: 1 affär + other: ! '%{count} affärer' lead: - one: '1 lead' - other: '%{count} leads' + one: 1 lead + other: ! '%{count} leads' day: - one: '1 dag' - other: '%{count} dagar' + one: 1 dag + other: ! '%{count} dagar' login: - one: '1 inloggning' - other: '%{count} inloggningar' - - # Custom date/time formats. - #---------------------------------------------------------------------------- + one: 1 inloggning + other: ! '%{count} inloggningar' date: formats: - mmddyyyy: "%Y-%m-%d" - mmdd: "%b %e" - mmddyy: "%B %e, %Y" - - + mmddyyyy: ! '%Y-%m-%d' + mmdd: ! '%b %e' + mmddyy: ! '%B %e, %Y' time: formats: - mmddhhss: "%b %e, kl %H:%M" - mmddyyyy_hhmm: "%m/%d/%Y %l:%M %p" + mmddhhss: ! '%b %e, kl %H:%M' + mmddyyyy_hhmm: ! '%m/%d/%Y %l:%M %p' diff --git a/config/locales/th_fat_free_crm.yml b/config/locales/th_fat_free_crm.yml index bb12af60ed..537269d96f 100644 --- a/config/locales/th_fat_free_crm.yml +++ b/config/locales/th_fat_free_crm.yml @@ -1,20 +1,15 @@ +--- th: language: Thai (ไทย) - - # Generic terms. - #---------------------------------------------------------------------------- all: ทั้งหมด at: ที่ here: ที่นี่ - no_button: 'ไม่ใช่' + no_button: ไม่ใช่ not_implemented: อยู่ระหว่างการพัฒนา. or: หรือ - select_blank: '-- เลือก --' - select_none: '-- ว่าง --' - yes_button: 'ใช่' - - # Settings. - #---------------------------------------------------------------------------- + select_blank: -- เลือก -- + select_none: -- ว่าง -- + yes_button: ใช่ tab_dashboard: สรุปงาน tab_tasks: ภารกิจ tab_campaigns: แคมเปญ @@ -22,22 +17,18 @@ th: tab_accounts: ลูกค้า tab_contacts: รายชื่อติดต่อ tab_opportunities: โอกาสปิดการขาย - admin_tab_users: รายชื่อผู้ใช้ admin_tab_settings: ตั้งค่า admin_tab_plugins: ส่วนเสริม - planned: วางแผน started: เริ่มต้น on_hold: ระงับ completed: เสร็จสมบูรณ์ called_off: เรียกว่าปิด - new: สร้าง contacted: เป็นผู้ติดต่อ converted: แปลงแล้ว rejected: ปฏิเสธ - cold_call: สุ่มโทร conference: สัมนา online: การตลาดออนไลท์ @@ -46,7 +37,6 @@ th: web: เว๊บไซต์ word_of_mouth: บอกต่อ other: อื่นๆ - prospecting: หวังจะได้เป็นลูกค้า analysis: วิเคระห์ presentation: นำเสนอ @@ -55,42 +45,32 @@ th: final_review: ตรวจรอบสุดท้าย won: ปิดมีกำไร lost: ปิดขาดทุน - call: โทร email: อีเมล์ follow_up: ติดตามงาน lunch: ทานข้าว meeting: ประชุม money: เก็บเงิน - presentation: นำเสนอ trip: เดินทาง - - overdue: "เกินกำหนด" - due_asap: "เร็วที่สุดเท่าที่เป็นไปได้" - due_today: "วันนี้" - due_tomorrow: "พรุ่งนี้" - due_this_week: "อาทิตย์นี้" - due_next_week: "อาทิตย์หน้า" - due_later: "วันหลัง" - due_specific_date: On Specific Date... # TODO - - completed_today: "วันนี้" - completed_yesterday: "เมื่อวานนี้" - completed_last_week: "อาทิตย์ก่อน" - completed_this_month: "เดือนนี้" - completed_last_month: "เดือนก่อน" - - # Models/Activity. - #---------------------------------------------------------------------------- + overdue: เกินกำหนด + due_asap: เร็วที่สุดเท่าที่เป็นไปได้ + due_today: วันนี้ + due_tomorrow: พรุ่งนี้ + due_this_week: อาทิตย์นี้ + due_next_week: อาทิตย์หน้า + due_later: วันหลัง + due_specific_date: On Specific Date... + completed_today: วันนี้ + completed_yesterday: เมื่อวานนี้ + completed_last_week: อาทิตย์ก่อน + completed_this_month: เดือนนี้ + completed_last_month: เดือนก่อน one_hour: หนึ่งชั่วโมง one_day: หนึ่งวัน two_days: สองวัน one_week: หนึ่งสัปดาห์ two_weeks: สองสัปดาห์ one_month: หนึ่งเดือน - - # Model Validations. - #---------------------------------------------------------------------------- activerecord: errors: models: @@ -103,83 +83,76 @@ th: account: attributes: name: - missing_account_name: "^โปรดระบุบัญชีผู้ใช้." + missing_account_name: ^โปรดระบุบัญชีผู้ใช้. access: - share_account: "^โปรดระบุผู้ใช้ที่ต้องการใช้บัญชีร่วมกัน" + share_account: ^โปรดระบุผู้ใช้ที่ต้องการใช้บัญชีร่วมกัน campaign: attributes: name: - missing_campaign_name: "^โปรดระบุชื่อแคมเปญ" + missing_campaign_name: ^โปรดระบุชื่อแคมเปญ ends_on: - dates_not_in_sequence: "^โปรดตรวจสอบอีกครั้งว่าวันสิ้นสุดแคมเปญอยู่หลังจากวันเริ่มต้น." + dates_not_in_sequence: ^โปรดตรวจสอบอีกครั้งว่าวันสิ้นสุดแคมเปญอยู่หลังจากวันเริ่มต้น. access: - share_campaign: "^โปรดระบุผู้ใช้ที่ต้องการใช้แคมเปญร่วมกัน" + share_campaign: ^โปรดระบุผู้ใช้ที่ต้องการใช้แคมเปญร่วมกัน contact: attributes: first_name: - missing_first_name: "^โปรดระบุชื่อจริง" + missing_first_name: ^โปรดระบุชื่อจริง last_name: - missing_last_name: "^โปรดระบุนามสกุล" + missing_last_name: ^โปรดระบุนามสกุล access: - share_contact: "^โปรดระบุผู้ใช้ที่ต้องการใช้ที่อยู่ติดต่อร่วมกัน" + share_contact: ^โปรดระบุผู้ใช้ที่ต้องการใช้ที่อยู่ติดต่อร่วมกัน lead: attributes: first_name: - missing_first_name: "^โปรดระบุชื่อจริง" + missing_first_name: ^โปรดระบุชื่อจริง last_name: - missing_last_name: "^โปรดระบุนามสกุล" + missing_last_name: ^โปรดระบุนามสกุล access: - share_lead: "^โปรดระบุผู้ใช้ที่ต้องการใช้รายการผู้สนใจร่วมกัน" + share_lead: ^โปรดระบุผู้ใช้ที่ต้องการใช้รายการผู้สนใจร่วมกัน opportunity: attributes: name: - missing_opportunity_name: "^โปรดระบุชื่อของโอกาสปิดการขาย" + missing_opportunity_name: ^โปรดระบุชื่อของโอกาสปิดการขาย access: - share_opportunity: "^โปรดระบุผู้ใช้ที่ต้องการใช้โอกาสปิดการขายร่วมกัน" + share_opportunity: ^โปรดระบุผู้ใช้ที่ต้องการใช้โอกาสปิดการขายร่วมกัน task: attributes: name: - missing_task_name: "^โปรดระบุชื่อภาระกิจ" + missing_task_name: ^โปรดระบุชื่อภาระกิจ calendar: - invalid_date: "^โปรดระบุวันที่ให้ถูกต้อง" + invalid_date: ^โปรดระบุวันที่ให้ถูกต้อง user: attributes: username: - missing_username: "^โปรดระบุชื่อผู้ใช้" - username_taken: "^ชื่อนี้ได้ถูกใช้แล้ว" + missing_username: ^โปรดระบุชื่อผู้ใช้ + username_taken: ^ชื่อนี้ได้ถูกใช้แล้ว email: - missing_email: "^โปรดระบุอีเมล์ที่ใช้" - email_in_use: "^มีผู้ใช้อื่นที่ใช้อีเมล์นี้แล้ว" - - # dynamic_form plugin translations. - #---------------------------------------------------------------------------- + missing_email: ^โปรดระบุอีเมล์ที่ใช้ + email_in_use: ^มีผู้ใช้อื่นที่ใช้อีเมล์นี้แล้ว errors: template: header: - one: "พบข้อผิดพลาด %{count} ประการ ทำให้ไม่สามารถบันทึก%{model}ได้" - other: "พบข้อผิดพลาด %{count} ประการ ทำให้ไม่สามารถบันทึก%{model}ได้" - body: "โปรดตรวจสอบข้อมูลในช่องต่อไปนี้:" - + one: พบข้อผิดพลาด %{count} ประการ ทำให้ไม่สามารถบันทึก%{model}ได้ + other: พบข้อผิดพลาด %{count} ประการ ทำให้ไม่สามารถบันทึก%{model}ได้ + body: ! 'โปรดตรวจสอบข้อมูลในช่องต่อไปนี้:' msg_account_suspended: บัญชีผู้ใช้ถูกระงับแล้ว. password_reset_instruction: ขั้นตอนการตั้งค่ารหัสผ่าน - - # Controllers. - #---------------------------------------------------------------------------- msg_account_created: บัญชีของคุณได้ถูกสร้างแล้ว และรอการอนุมัติโดยผู้ดูแลระบบ msg_account_not_approved: บัญชีของคุณยังไม่ได้รับการอนุมัติ - msg_asset_deleted: "%{value} ได้ถูกลบไปแล้ว" + msg_asset_deleted: ! '%{value} ได้ถูกลบไปแล้ว' msg_asset_not_available: เอกสาร %{value} ไม่มีในระบบ - msg_asset_not_authorized: You are not authorized to view this %{value}. # TODO + msg_asset_not_authorized: You are not authorized to view this %{value}. msg_assets_not_available: เอกสาร %{value} ไม่มีในระบบ. - msg_asset_rejected: "%{value} ได้ถูกปฏิเสธแล้ว" - msg_bad_image_file: "^ไม่สามารถอัปโหลดหรือเปลี่ยนขนาดของรูปภาพที่คุณระบุได้" - msg_cant_create_related: "ไม่สามารถสร้าง%{asset}ได้ เพราะ%{related}ไม่มีในระบบ" - msg_cant_delete_user: "^ไม่สามารถลบผู้ใช้ตั้งแต่ %{value} มีเอกสารที่อ้างอิงถึง" - msg_cant_do: "ไม่สามารถ%{action}ของ%{asset} เพราะไม่มีเอกสารแล้ว" + msg_asset_rejected: ! '%{value} ได้ถูกปฏิเสธแล้ว' + msg_bad_image_file: ^ไม่สามารถอัปโหลดหรือเปลี่ยนขนาดของรูปภาพที่คุณระบุได้ + msg_cant_create_related: ไม่สามารถสร้าง%{asset}ได้ เพราะ%{related}ไม่มีในระบบ + msg_cant_delete_user: ^ไม่สามารถลบผู้ใช้ตั้งแต่ %{value} มีเอกสารที่อ้างอิงถึง + msg_cant_do: ไม่สามารถ%{action}ของ%{asset} เพราะไม่มีเอกสารแล้ว msg_email_not_found: ไม่มีผู้ใช้ที่ใช้อีเมล์นี้ msg_enter_new_password: โปรดใส่ระหัสผ่านตัวใหม่ msg_goodbye: คุณได้ออกจากระบบแล้ว ขอบคุณที่ใช้งานโปรแกรม Fat Free CRM - msg_invalid_password: "^โปรดระบุรหัสผ่านตัวปัจจุบันให้ถูกต้อง" + msg_invalid_password: ^โปรดระบุรหัสผ่านตัวปัจจุบันให้ถูกต้อง msg_invalig_login: ชื่อผู้ใช้ หรือ รหัสผ่าน ไม่ถูกต้อง msg_last_login: ครั้งสุดท้านที่คุณเข้าสู่ระบบคือ %{value}. msg_login_needed: คุณต้องเข้าสู่ระบบเพื่อเข้าหน้านี้ @@ -191,10 +164,7 @@ th: msg_require_admin: คุณต้องเป็นผู้ดูแลระบบเพื่อเข้าหน้านี้ msg_successful_signup: สมัครสมาชิกเรียบร้อยแล้ว ยินดีต้อนรับสู่ Fat Free CRM msg_welcome: ยินดีต้อนรับสู่ Fat Free CRM - - # Options. - #---------------------------------------------------------------------------- - "option_amount*probability": จำนวนถ่วงน้ำหนัก + option_amount*probability: จำนวนถ่วงน้ำหนัก activity_options: แสดง%{models}ที่เกิดขึ้น โดย%{user} ในช่วง%{period}ที่ผ่านมา. all_users: ผู้ใช้ทุกคน option_after: หลัง @@ -222,9 +192,6 @@ th: show_per_page: แสดง %{number} %{models} ต่อหนึ่งหน้า ในแบบ %{fmt} sort_by: เรียงลำดับ%{models} โดย %{field}. sort_by_displaying: เรียงลำดับ%{models} โดย %{field} แสดงชื่อจริง %{position} นามสกุล. - - # Views -> Profile. - #---------------------------------------------------------------------------- aim: AOL IM already_signed_up: เป็นสมาชิกอยู่แล้ว alt_email: อีเมล์ ทางเลือก @@ -234,12 +201,12 @@ th: contact_info: ข้อมูลใช้ในการติดต่อ current_password: รหัสผ่านปัจจุบัน edit_profile: แก้ไขโพรไฟล์ - # email: อีเมล์ # <-- Already defined as the task type if Settings. first_name: ชื่อจริง google: Google IM gravatar_help: หากไม่เข้าใจ Gravatars ลองเรียนรูป Gravatars ได้ image_file: ไฟล์รูปภาพ - image_help: หลังจากอัปโหลดจะถูกเปลี่ยนขนาดเป็น 75x75 pixels และ รูปภาพที่ใช้จะต้องเป็น GIF, JPG หรือ PNG เท่านั้น + image_help: หลังจากอัปโหลดจะถูกเปลี่ยนขนาดเป็น 75x75 pixels และ รูปภาพที่ใช้จะต้องเป็น + GIF, JPG หรือ PNG เท่านั้น job_title: ตำแหน่ง last_name: นามสกุล login_now_link: เข้าสู่ระบบทันที ! @@ -260,19 +227,13 @@ th: user: ผู้ใช้ username: ชื่อผู้ใช้ yahoo: Yahoo IM - - # Views -> Authenticate. - #---------------------------------------------------------------------------- forgot_password: ลืมรหัสผ่าน login: เข้าระบบ no_account: ไม่มีชื่อในรายการสมาชิก remember_me: จำฉันไว้ sign_up_now: สมัครสามาชิกได้เลย - - # Views -> Accounts. - #---------------------------------------------------------------------------- accounts: รายการลูกค้า - account_permissions_intro: "ในเบื่องต้น จะมีเฉพาะคุณที่สามารถเข้าถึงรายการได้ แต่คุณสามารถแก้เงื่อนไขได้ในภายหลัง" + account_permissions_intro: ในเบื่องต้น จะมีเฉพาะคุณที่สามารถเข้าถึงรายการได้ แต่คุณสามารถแก้เงื่อนไขได้ในภายหลัง accounts_small: รายการลูกค้า account: ลูกค้า accounts_options: ตัวเลือกสำหรับลูกค้า @@ -295,9 +256,6 @@ th: share_with: กำหนดผู้ที่เห็นได้ดังต่อไปนี้ shipping_address: ที่อยู่สำหรับส่งของ website: เว็บไซต์ - - # Views -> Campaigns. - #---------------------------------------------------------------------------- actual: เกิดขึ้นจริง actual_performance: ประสิทธิที่เกิดขึ้นจริง budget: งบประมาณ @@ -312,7 +270,7 @@ th: campaigns_small: รายการแคมเปญ conversion: การแปลง conversion_label: แปลง (%) - conversion_number: "แปลง %{value} ราย" + conversion_number: แปลง %{value} ราย create_campaign: เพิ่มแคมเปญ end_date: วันสิ้นสุด finished_on: เสร็จสมบูรณ์ %{value} @@ -320,11 +278,13 @@ th: no_start_date: ไม่ระบุวันเริ่มต้น number_of_leads: จำนวนผู้สนใจ objectives: เป้าหมาย - objectives_help: โปรดระบุจำนวนผู้สนใจ ค่าความคาดหวังที่จะแปลงจากผู้สนใจไปเป็นผู้มีโอกาสปิดการขาย รายได้ที่จะได้รับ และ งบประมาณที่ต้องใช้ ตัวเลขเหล่านี้จะช่วยให้คุณติดตามประสิทธิภาพจริงๆ ของโครงการ + objectives_help: โปรดระบุจำนวนผู้สนใจ ค่าความคาดหวังที่จะแปลงจากผู้สนใจไปเป็นผู้มีโอกาสปิดการขาย + รายได้ที่จะได้รับ และ งบประมาณที่ต้องใช้ ตัวเลขเหล่านี้จะช่วยให้คุณติดตามประสิทธิภาพจริงๆ + ของโครงการ objectives_small: เป้าหมายของแคมเปญ revenue: รายได้ revenue_label: รายได้ (฿) - revenue_number: "รายได้ %{value}" + revenue_number: รายได้ %{value} save_campaign: บันทึกแคมเปญ start_date: วันเริ่มต้น started_ago: เริ่มต้น%{value}ที่ผ่านมา @@ -334,9 +294,6 @@ th: total_campaigns: จำนวนแคมเปณ was_supposed_to_finish: ควรจะเสร็จตั้งแต่ %{value} was_supposed_to_start: ควรจะเสร็จตั้งแต่ %{time_ago} ที่ผ่านมา คือ %{start_date} - - # Views -> Contacts. - #---------------------------------------------------------------------------- alt_email_small: อื่นๆ blog: website/blog contact: ที่อยู่ติดต่อ @@ -346,19 +303,19 @@ th: contacts_small: ที่อยู่ติดต่อ create_contact: เพิ่มผู้ติดต่อ department: แผนก - department_small: 'แผนก %{value}' + department_small: แผนก %{value} do_not_call: ห้ามโทร extra_info: ข้อมูลเพิ่มเติม extra_info_small: ที่อยู่ติดต่อเพิ่มเติม facebook: Facebook linked_in: LinkedIn myself: ตัวฉัน - - # TODO - permissions_intro_private: By default only you will have access to the %{value}. You can change permissions later. - permissions_intro_public: By default all users will have access to the %{value}. You can change permissions later. - permissions_intro_shared: By default only the selected users will have access to the %{value}. You can change permissions later. - + permissions_intro_private: By default only you will have access to the %{value}. + You can change permissions later. + permissions_intro_public: By default all users will have access to the %{value}. + You can change permissions later. + permissions_intro_shared: By default only the selected users will have access to + the %{value}. You can change permissions later. permissions_intro: เบื้องต้นจะมีเฉพาะคุณเท่านั้นที่เห็น %{value} แต่สามารถเปลี่ยนได้ในภายหลัง referred_by: แนะนำโดย referred_by_small: แนะนำโดย @@ -366,24 +323,23 @@ th: twitter: Twitter web_presence: ผ่านเว็บ web_presence_small: ผ่านเว็บ - contacts_options: กรองที่อยู่ติดต่อ - - # Views -> Leads. - #---------------------------------------------------------------------------- convert: แปลง convert_lead: แปลงผู้สนใจ - convert_lead_permissions_intro: สิทธิ์ของที่อยู่ติดต่อจะคัดลอกมาจากผู้สนใจเมื่อมีการแปลงเกิดขึ้น แต่สามารถเปลี่ยนได้ในภายหลัง - convert_lead_text: การแปลงผู้สนใจ %{value} จะกลายที่อยู่ติดต่อใหม่ หรือใช้ที่อยู่ที่มีแล้ว หรือสร้างเพิ่มได้ อย่างไรก็ตามผู้สนใจจะถูกกำหนดสถานะเป็น แปลงแล้ว + convert_lead_permissions_intro: สิทธิ์ของที่อยู่ติดต่อจะคัดลอกมาจากผู้สนใจเมื่อมีการแปลงเกิดขึ้น + แต่สามารถเปลี่ยนได้ในภายหลัง + convert_lead_text: การแปลงผู้สนใจ %{value} จะกลายที่อยู่ติดต่อใหม่ หรือใช้ที่อยู่ที่มีแล้ว + หรือสร้างเพิ่มได้ อย่างไรก็ตามผู้สนใจจะถูกกำหนดสถานะเป็น แปลงแล้ว create_lead: เพิ่มผู้สนใจ - create_opp_for_contact: คุณสามารถสร้าง โอกาศปิดการขาย สำหรับ %{value} ผู้ติดต่อ โดยกำหนดชื่อ สถานะปัจจุบัน คาดการวันปิด โอกาสปิดการขาย มูลค่า และส่วนลด + create_opp_for_contact: คุณสามารถสร้าง โอกาศปิดการขาย สำหรับ %{value} ผู้ติดต่อ + โดยกำหนดชื่อ สถานะปัจจุบัน คาดการวันปิด โอกาสปิดการขาย มูลค่า และส่วนลด lead: ผู้สนใจ lead_info_small: ที่อยู่ผู้สนใจ - - # TODO - lead_permissions_intro_private: By default permissions will be copied from the campaign or set to private. You can change lead permissions later. - lead_permissions_intro_public: By default permissions will be copied from the campaign or set to public. You can change lead permissions later. - lead_permissions_intro_shared: By default permissions will be copied from the campaign or shared with the specified users. You can change lead permissions later. - + lead_permissions_intro_private: By default permissions will be copied from the campaign + or set to private. You can change lead permissions later. + lead_permissions_intro_public: By default permissions will be copied from the campaign + or set to public. You can change lead permissions later. + lead_permissions_intro_shared: By default permissions will be copied from the campaign + or shared with the specified users. You can change lead permissions later. lead_small: ผู้สนใจ lead_status_small: สถานะของผู้สนใจ lead_summary: สรุปผู้สนใจ @@ -398,9 +354,6 @@ th: source: แหล่ง status: สถานะ total_leads: ผู้สนใจทั้งหมด - - # Views -> Opportunities. - #---------------------------------------------------------------------------- amount: รวม close_date: วันที่ปิด closed_ago_on: ปิด %{time_ago} ที่ผ่านมา ตั้งแต่ %{date} @@ -422,7 +375,8 @@ th: opportunity: โอกาสปิดการขาย opportunity_small: โอกาสปิดการขาย opportunity_summary: สรุปโอกาสที่ได้อย่างรวดเร็ว - opportunity_summary_text: "%{amount} โดยมีส่วนลด %{discount} และความน่าจะเป็น %{probability}" + opportunity_summary_text: ! '%{amount} โดยมีส่วนลด %{discount} และความน่าจะเป็น + %{probability}' past_due: เลยกำหนด, คาดว่าจะปิดได้ %{value} ที่แล้ว probability: ความน่าจะเป็น probability_number: และมีความน่าจะเป็น %{value} @@ -430,9 +384,6 @@ th: stage: ระดับสถานะ total_opportunities: โอกาสปิดการขายทั้งหมด weighted_amount: จำนวนถ่วงน้ำหนัก - - # Views -> Tasks. - #---------------------------------------------------------------------------- assign_to: มอบหมายให้ assigned_tab: มอบหมาย assigned_tasks: มอบหมายภารกิจแล้ว @@ -444,13 +395,13 @@ th: due: ครบกำหนด feel_free: กรอกข้อมูลได้เลย move_to: ย้ายไป - no_tasks: "คุณไม่มีภารกิจ%{value}" - no_tasks_pending: pending # TODO - no_tasks_assigned: assigned # TODO - no_tasks_completed: completed # TODO + no_tasks: คุณไม่มีภารกิจ%{value} + no_tasks_pending: pending + no_tasks_assigned: assigned + no_tasks_completed: completed pending_tab: งานค้าง pending_tasks: งานคงค้าง - related: 're:' + related: ! 're:' save_task: บันทึกภารกิจ task_assigned: ภารกิจได้ถูกมอบหมายให้ %{value} task_assigned_to: และได้มอบหมายให้ %{value} @@ -470,20 +421,17 @@ th: total_tasks: ทั้งหมด %{value} view_assigned_tasks: ดูงานที่มอบหมายแล้ว view_pending_tasks: ดูงานคงค้าง - - # Views -> Home. - #---------------------------------------------------------------------------- action_commented: ใส่คำแนะนำ action_completed: เสร็จสมบูรณ์ action_created: สร้าง action_deleted: ลบ - action_email: exchanged emails with # TODO + action_email: exchanged emails with action_reassigned: มอบหมายให้คนอื่น action_rejected: ยกเลิกแล้ว action_rescheduled: ใส่กำหนดการ action_updated: แก้ไข action_viewed: แสดง - action_won: won # TODO + action_won: won no_activity_records: ไม่พบบันทึกกิจกรรม recent_activity: กิจกรรมล่าสุด recent_activity_options: กิจกรรมล่าสุดเพิ่มเติม @@ -493,11 +441,8 @@ th: subject_lead: ผู้สนใจ subject_opportunity: โอกาสปิดการขาย subject_task: ภารกิจ - - # Views -> Common. - #---------------------------------------------------------------------------- add_note: เพิ่มบันทึก - save_note: Save Note # TODO + save_note: Save Note add_note_help: Add a new note... added_ago: สร้าง %{value} ที่ผ่านมา added_by: สร้าง %{time_ago} ที่ผ่านมา โดย %{user} @@ -506,17 +451,17 @@ th: close_form: ปิดฟอร์ม confirm_delete: คุณแน่ใจที่จะลบ%{value}หรือไม่ copy_permissions: คัดลอก%{value}สิทธิ์ - could_not_find: "ไม่พบ%{value} สามารถทดลอง" - could_not_find_matching: "ไม่พบ%{value}ที่ตรงกับคำค้นหา" + could_not_find: ไม่พบ%{value} สามารถทดลอง + could_not_find_matching: ไม่พบ%{value}ที่ตรงกับคำค้นหา create_new: สร้าง - select_existing: select existing # TODO + select_existing: select existing delete: ลบ - discard: Discard # TODO + discard: Discard edit: แก้ไข - items_total: '%{count} ทั้งหมด' - less: Less... # TODO + items_total: ! '%{count} ทั้งหมด' + less: Less... me: ฉัน - more: More... # TODO + more: More... n_a: N/A name: ชื่อ no_match: ไม่มี%{value}ที่ตรงกับ @@ -526,16 +471,13 @@ th: please_retry: โปรดทดลองคำค้นหาอื่น recent_items: เอกสารล่าสุด search_assets: ค้นหา%{value} - ago: "%{value}ที่ผ่านมา" + ago: ! '%{value}ที่ผ่านมา' background_info: หลัง ข้อมูล address: ที่อยู่ city: แถบค้าขายของลอนกดอน zipcode: รหัส ไปรษณีย์ state: สภาพ country: ประเทศ - - # Views -> Layout. - #---------------------------------------------------------------------------- about: เกี่ยวกับ about_dev_group: แหล่งสนทนาของนักพัฒนา about_features: คุณลักษณะ และข้อผิดพลาด @@ -544,35 +486,23 @@ th: about_ffc_version: Fat Free CRM เวอร์ชัน about_home_page: หน้าแรก about_project_page: หน้าโครงการ - about_thank_you: ขอบคุณที่ใช้งาน Fat Free CRM! เรายินดีเป็นอย่างยิ่งกับธุรกิจของคุณ และหวังว่าคุณจะสนุกกับการใช้โปรแกรม + about_thank_you: ขอบคุณที่ใช้งาน Fat Free CRM! เรายินดีเป็นอย่างยิ่งกับธุรกิจของคุณ + และหวังว่าคุณจะสนุกกับการใช้โปรแกรม about_twitter: ติดตามบน Twitter about_user_group: แหล่งสนทนาของผู้ใช้ admin: ผู้ดูแลระบบ logout: ออกจากระบบ quick_find: หาด่วน welcome: ยินดีต้อนรับ - - # Views -> Comments. - #---------------------------------------------------------------------------- edit_comment: แก้ไขข้อเสนอ show: แสดง update: ปรับปรุง - - # Views -> Passwords. - #---------------------------------------------------------------------------- confirm_password_intro: โปรดใส่รหัสผ่านใหม่ และกรอกรหัสอีกครั้งเพื่อความถูกต้อง password_intro: โปรดระบุอีเมล์ของท่าน จากนั้นขั้นตอนการเปลี่ยนรหัสผ่านจะส่งถึงท่านผ่านทางอีเมล์ reset_password: เปลี่ยนรหัสผ่าน update_password_and_login: ปรับปรุงรหัสผ่านและเข้าสู่ระบบ - - # Views -> Admin - #---------------------------------------------------------------------------- - # TODO back_to_crm: Back to Fat Free CRM crm_admin_page: Fat Free CRM Administration - - # Views -> Admin -> Users. - #---------------------------------------------------------------------------- approve: อนุมัติ create_user: เพิ่มผู้ใช้ last_seen: ดูล่าสุด%{value}ที่ผ่านมา @@ -585,53 +515,43 @@ th: user_awaits_approval: รอการอนุมัติ user_confirm_delete: จะลบผู้ใช้ได้ก็ต่อเมื่อไม่มีเอกสารใดเกี่ยวข้องกับผู้ใช้คนนั้นๆ user_is_admin: ผู้ใช้คนนี้เป็นผู้ดูแลระบบ - user_never_logged_in: "ไม่เคยเข้ามาในระบบ" + user_never_logged_in: ไม่เคยเข้ามาในระบบ user_signed_up: สมัครสมาชิก user_signed_up_on: สมัครสมาชิกตั้งแต่ %{value} user_since: user since %{value} user_suspended: ระงับผู้ใช้ user_suspended_on: ระงับตั้งแต่ %{value} users: ผู้ใช้ - users_small: ผู้ใช้ # TODO - - # Dropbox. - #---------------------------------------------------------------------------- + users_small: ผู้ใช้ dropbox_notification_subject: dropbox - อีเมล์ เพิ่ม - %{subject} dropbox_notification_intro: สำเร็จ เพิ่ม อีเมล ที่ คุณ ส่ง ไป dropbox dropbox_notification_to: เพิ่ม ลง ใน subject: สาขา วิชา body: ร่างกาย - - # Pluralizations. - #---------------------------------------------------------------------------- pluralize: comment: - one: '1 comment' # TODO - other: '%{count} comments' # TODO + one: 1 comment + other: ! '%{count} comments' contact: - one: 'ผู้ติดต่อหนึ่งคน' - other: '%{count} ผู้ติดต่อ' + one: ผู้ติดต่อหนึ่งคน + other: ! '%{count} ผู้ติดต่อ' opportunity: - one: 'โอกาศปิดการขายหนึ่งรายการ' - other: '%{count} โอกาศปิดการขาย' + one: โอกาศปิดการขายหนึ่งรายการ + other: ! '%{count} โอกาศปิดการขาย' lead: - one: 'ผู้สนใจหนึ่งคน' - other: '%{count} ผู้สนใจ' + one: ผู้สนใจหนึ่งคน + other: ! '%{count} ผู้สนใจ' day: - one: 'หนึ่งวัน' - other: '%{count} วัน' + one: หนึ่งวัน + other: ! '%{count} วัน' login: - one: 'เข้าสู่ระบบหนึ่งครั้ง' - other: 'เข้าสู่ระบบ %{count} ครั้ง' - - # Custom date/time formats. - #---------------------------------------------------------------------------- + one: เข้าสู่ระบบหนึ่งครั้ง + other: เข้าสู่ระบบ %{count} ครั้ง date: formats: - mmddyyyy: "%m/%d/%Y" - mmdd: "%b %e" - mmddyy: "%b %e, %Y" - + mmddyyyy: ! '%m/%d/%Y' + mmdd: ! '%b %e' + mmddyy: ! '%b %e, %Y' time: formats: - mmddhhss: "%b %e at %l:%M%p" + mmddhhss: ! '%b %e at %l:%M%p' diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 27ea27a65f..66c822ceac 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -1,214 +1,241 @@ -# Chinese (China) translations for Ruby on Rails -# by tsechingho (http://github.com/tsechingho) - +--- zh-CN: date: formats: - default: "%Y-%m-%d" - short: "%b%d日" - long: "%Y年%b%d日" - day_names: [星期日, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六] - abbr_day_names: [日, 一, 二, 三, 四, 五, 六] - month_names: [~, 一月, 二月, 三月, 四月, 五月, 六月, 七月, 八月, 九月, 十月, 十一月, 十二月] - abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月] + default: ! '%Y-%m-%d' + short: ! '%b%d日' + long: ! '%Y年%b%d日' + day_names: + - 星期日 + - 星期一 + - 星期二 + - 星期三 + - 星期四 + - 星期五 + - 星期六 + abbr_day_names: + - 日 + - 一 + - 二 + - 三 + - 四 + - 五 + - 六 + month_names: + - + - 一月 + - 二月 + - 三月 + - 四月 + - 五月 + - 六月 + - 七月 + - 八月 + - 九月 + - 十月 + - 十一月 + - 十二月 + abbr_month_names: + - + - 1月 + - 2月 + - 3月 + - 4月 + - 5月 + - 6月 + - 7月 + - 8月 + - 9月 + - 10月 + - 11月 + - 12月 order: - - :year - - :month - - :day - + - :year + - :month + - :day time: formats: - default: "%Y年%b%d日 %A %H:%M:%S %Z" - short: "%b%d日 %H:%M" - long: "%Y年%b%d日 %H:%M" - am: "上午" - pm: "下午" - + default: ! '%Y年%b%d日 %A %H:%M:%S %Z' + short: ! '%b%d日 %H:%M' + long: ! '%Y年%b%d日 %H:%M' + am: 上午 + pm: 下午 datetime: distance_in_words: - half_a_minute: "半分钟" + half_a_minute: 半分钟 less_than_x_seconds: - one: "不到一秒" - other: "不到 %{count} 秒" + one: 不到一秒 + other: 不到 %{count} 秒 x_seconds: - one: "一秒" - other: "%{count} 秒" + one: 一秒 + other: ! '%{count} 秒' less_than_x_minutes: - one: "不到一分钟" - other: "不到 %{count} 分钟" + one: 不到一分钟 + other: 不到 %{count} 分钟 x_minutes: - one: "一分钟" - other: "%{count} 分钟" + one: 一分钟 + other: ! '%{count} 分钟' about_x_hours: - one: "大约一小时" - other: "大约 %{count} 小时" + one: 大约一小时 + other: 大约 %{count} 小时 x_days: - one: "一天" - other: "%{count} 天" + one: 一天 + other: ! '%{count} 天' about_x_months: - one: "大约一个月" - other: "大约 %{count} 个月" + one: 大约一个月 + other: 大约 %{count} 个月 x_months: - one: "一个月" - other: "%{count} 个月" + one: 一个月 + other: ! '%{count} 个月' about_x_years: - one: "大约一年" - other: "大约 %{count} 年" + one: 大约一年 + other: 大约 %{count} 年 over_x_years: - one: "一年多" - other: "%{count} 年多" + one: 一年多 + other: ! '%{count} 年多' almost_x_years: - one: "接近一年" - other: "接近 %{count} 年" + one: 接近一年 + other: 接近 %{count} 年 prompts: - year: "年" - month: "月" - day: "日" - hour: "时" - minute: "分" - second: "秒" - + year: 年 + month: 月 + day: 日 + hour: 时 + minute: 分 + second: 秒 number: format: - separator: "." - delimiter: "," + separator: . + delimiter: ! ',' precision: 3 significant: false strip_insignificant_zeros: false currency: format: - format: "%u %n" - unit: "CN¥" - separator: "." - delimiter: "," + format: ! '%u %n' + unit: CN¥ + separator: . + delimiter: ! ',' precision: 2 significant: false strip_insignificant_zeros: false percentage: format: - delimiter: "" + delimiter: '' precision: format: - delimiter: "" + delimiter: '' human: format: - delimiter: "" + delimiter: '' precision: 1 significant: false strip_insignificant_zeros: false storage_units: - format: "%n %u" + format: ! '%n %u' units: byte: - one: "Byte" - other: "Bytes" - kb: "KB" - mb: "MB" - gb: "GB" - tb: "TB" + one: Byte + other: Bytes + kb: KB + mb: MB + gb: GB + tb: TB decimal_units: - format: "%n %u" + format: ! '%n %u' units: - # 10^-21 zepto, 10^-24 yocto - atto: "渺" # 10^-18 - femto: "飞" # 10^-15 毫微微 - pico: "漠" # 10^-12 微微 - nano: "奈" # 10^-9 毫微 - micro: "微" # 10^-6 - mili: "毫" # 10^-3 milli - centi: "厘" # 10^-2 - deci: "分" # 10^-1 - unit: "" + atto: 渺 + femto: 飞 + pico: 漠 + nano: 奈 + micro: 微 + mili: 毫 + centi: 厘 + deci: 分 + unit: '' ten: - one: "十" - other: "十" # 10^1 - hundred: "百" # 10^2 - thousand: "千" # 10^3 kilo - million: "百万" # 10^6 mega - billion: "十亿" # 10^9 giga - trillion: "兆" # 10^12 tera - quadrillion: "千兆" # 10^15 peta - # 10^18 exa, 10^21 zetta, 10^24 yotta - + one: 十 + other: 十 + hundred: 百 + thousand: 千 + million: 百万 + billion: 十亿 + trillion: 兆 + quadrillion: 千兆 support: array: - words_connector: ", " - two_words_connector: " 和 " - last_word_connector: ", 和 " + words_connector: ! ', ' + two_words_connector: ! ' 和 ' + last_word_connector: ! ', 和 ' select: - prompt: "请选择" - + prompt: 请选择 activerecord: errors: - template: # ~ 2.3.5 backward compatible + template: header: - one: "有 1 个错误发生导致「%{model}」无法被保存。" - other: "有 %{count} 个错误发生导致「%{model}」无法被保存。" - body: "如下字段出现错误:" + one: 有 1 个错误发生导致「%{model}」无法被保存。 + other: 有 %{count} 个错误发生导致「%{model}」无法被保存。 + body: 如下字段出现错误: full_messages: - format: "%{attribute} %{message}" + format: ! '%{attribute} %{message}' messages: - inclusion: "不包含于列表中" - exclusion: "是保留关键字" - invalid: "是无效的" - confirmation: "与确认值不匹配" - accepted: "必须是可被接受的" - empty: "不能留空" - blank: "不能为空字符" - too_long: "过长(最长为 %{count} 个字符)" - too_short: "过短(最短为 %{count} 个字符)" - wrong_length: "长度非法(必须为 %{count} 个字符)" - not_a_number: "不是数字" - not_an_integer: "必须是整数" - greater_than: "必须大于 %{count}" - greater_than_or_equal_to: "必须大于或等于 %{count}" - equal_to: "必须等于 %{count}" - less_than: "必须小于 %{count}" - less_than_or_equal_to: "必须小于或等于 %{count}" - odd: "必须为单数" - even: "必须为双数" - taken: "已经被使用" - record_invalid: "校验失败: %{errors}" - + inclusion: 不包含于列表中 + exclusion: 是保留关键字 + invalid: 是无效的 + confirmation: 与确认值不匹配 + accepted: 必须是可被接受的 + empty: 不能留空 + blank: 不能为空字符 + too_long: 过长(最长为 %{count} 个字符) + too_short: 过短(最短为 %{count} 个字符) + wrong_length: 长度非法(必须为 %{count} 个字符) + not_a_number: 不是数字 + not_an_integer: 必须是整数 + greater_than: 必须大于 %{count} + greater_than_or_equal_to: 必须大于或等于 %{count} + equal_to: 必须等于 %{count} + less_than: 必须小于 %{count} + less_than_or_equal_to: 必须小于或等于 %{count} + odd: 必须为单数 + even: 必须为双数 + taken: 已经被使用 + record_invalid: ! '校验失败: %{errors}' activemodel: errors: template: header: - one: "有 1 个错误发生导致「%{model}」无法被保存。" - other: "有 %{count} 个错误发生导致「%{model}」无法被保存。" - body: "如下字段出现错误:" - + one: 有 1 个错误发生导致「%{model}」无法被保存。 + other: 有 %{count} 个错误发生导致「%{model}」无法被保存。 + body: 如下字段出现错误: errors: - format: "%{attribute} %{message}" + format: ! '%{attribute} %{message}' messages: - inclusion: "不包含于列表中" - exclusion: "是保留关键字" - invalid: "是无效的" - confirmation: "与确认值不匹配" - accepted: "必须是可被接受的" - empty: "不能留空" - blank: "不能为空字符" - too_long: "过长(最长为 %{count} 个字符)" - too_short: "过短(最短为 %{count} 个字符)" - wrong_length: "长度非法(必须为 %{count} 个字符)" - not_a_number: "不是数字" - not_an_integer: "必须是整数" - greater_than: "必须大于 %{count}" - greater_than_or_equal_to: "必须大于或等于 %{count}" - equal_to: "必须等于 %{count}" - less_than: "必须小于 %{count}" - less_than_or_equal_to: "必须小于或等于 %{count}" - odd: "必须为单数" - even: "必须为双数" - + inclusion: 不包含于列表中 + exclusion: 是保留关键字 + invalid: 是无效的 + confirmation: 与确认值不匹配 + accepted: 必须是可被接受的 + empty: 不能留空 + blank: 不能为空字符 + too_long: 过长(最长为 %{count} 个字符) + too_short: 过短(最短为 %{count} 个字符) + wrong_length: 长度非法(必须为 %{count} 个字符) + not_a_number: 不是数字 + not_an_integer: 必须是整数 + greater_than: 必须大于 %{count} + greater_than_or_equal_to: 必须大于或等于 %{count} + equal_to: 必须等于 %{count} + less_than: 必须小于 %{count} + less_than_or_equal_to: 必须小于或等于 %{count} + odd: 必须为单数 + even: 必须为双数 helpers: select: - prompt: "请选择" + prompt: 请选择 submit: - create: "新增%{model}" - update: "更新%{model}" - submit: "储存%{model}" - + create: 新增%{model} + update: 更新%{model} + submit: 储存%{model} will_paginate: previous_label: 前页 next_label: 后页 diff --git a/config/locales/zh-CN_fat_free_crm.yml b/config/locales/zh-CN_fat_free_crm.yml index 0488b5cf17..c039f3fa03 100644 --- a/config/locales/zh-CN_fat_free_crm.yml +++ b/config/locales/zh-CN_fat_free_crm.yml @@ -1,48 +1,39 @@ +--- zh-CN: language: 中文(简体) - - # Generic terms. - #---------------------------------------------------------------------------- all: 所有 at: 在 here: 这里 - no_button: '否' + no_button: 否 not_implemented: 未实现 or: 或 - select_none: '-- 无 --' - select_blank: '-- 选择 --' - yes_button: '是' - - # Settings. - #---------------------------------------------------------------------------- + select_none: -- 无 -- + select_blank: -- 选择 -- + yes_button: 是 tab_dashboard: 摘要 tab_tasks: 任务 tab_campaigns: 促销 - tab_leads: 线索 + tab_leads: 线索 tab_accounts: 账号 tab_contacts: 联系人 tab_opportunities: 商机 - admin_tab_users: 用户 admin_tab_settings: 设置 admin_tab_plugins: 插件 admin_tab_groups: 分组 admin_tab_fields: 区域 admin_tab_tags: 标记 - planned: 计划 started: 已开始 on_hold: 搁置 completed: 完成 called_off: 取消 groups: 分组 - new: 新建 contacted: 已联系 converted: 已转换 rejected: 已拒绝 - - cold_call: 冷电话 + cold_call: 冷电话 conference: 会议 online: 在线营销 referral: 转来 @@ -50,7 +41,6 @@ zh-CN: web: 网站 word_of_mouth: 口头 other: 其它 - prospecting: 展望 analysis: 分析 presentation: 演示 @@ -59,16 +49,13 @@ zh-CN: final_review: 最后审查 won: 结束/赢 lost: 结束/输 - call: 电话 email: Email follow_up: 跟进 lunch: 午餐 meeting: 会议 money: 钱 - presentation: 演示 trip: 旅行 - overdue: 逾期 due_asap: 尽快 due_today: 今天 @@ -77,24 +64,17 @@ zh-CN: due_next_week: 下周 due_later: 以后 due_specific_date: 特定日期... - completed_today: 今天 completed_yesterday: 昨天 completed_last_week: 上周 completed_this_month: 本月 completed_last_month: 上月 - - # Models/Activity. - #---------------------------------------------------------------------------- one_hour: 1小时 one_day: 1天 two_days: 2天 one_week: 1周 two_weeks: 2周 one_month: 1月 - - # Model Validations. - #---------------------------------------------------------------------------- activerecord: errors: models: @@ -107,83 +87,76 @@ zh-CN: account: attributes: name: - missing_account_name: "^请指定用户名" + missing_account_name: ^请指定用户名 access: - share_account: "^请指定可以共享账号的用户" + share_account: ^请指定可以共享账号的用户 campaign: attributes: name: - missing_campaign_name: "^请指定促销活动名称" + missing_campaign_name: ^请指定促销活动名称 ends_on: - dates_not_in_sequence: "^请确认促销活动开始日期在结束日期之前" + dates_not_in_sequence: ^请确认促销活动开始日期在结束日期之前 access: - share_campaign: "^请指定可以共享促销活动的用户" + share_campaign: ^请指定可以共享促销活动的用户 contact: attributes: first_name: - missing_first_name: "^请指定用户的名" + missing_first_name: ^请指定用户的名 last_name: - missing_last_name: "^请指定用户的姓" + missing_last_name: ^请指定用户的姓 access: - share_contact: "^请指定可以共享联系人的用户" + share_contact: ^请指定可以共享联系人的用户 lead: attributes: first_name: - missing_first_name: "^请指定用户的名" + missing_first_name: ^请指定用户的名 last_name: - missing_last_name: "^请指定用户的姓" + missing_last_name: ^请指定用户的姓 access: - share_lead: "^请指定可以共享Lead的用户" + share_lead: ^请指定可以共享Lead的用户 opportunity: attributes: name: - missing_opportunity_name: "^请指定商机名称" + missing_opportunity_name: ^请指定商机名称 access: - share_opportunity: "^请指定可以共享商机的用户" + share_opportunity: ^请指定可以共享商机的用户 task: attributes: name: - missing_task_name: "^请指定任务名称" + missing_task_name: ^请指定任务名称 calendar: - invalid_date: "^请指定合法日期" + invalid_date: ^请指定合法日期 user: attributes: username: - missing_username: "^请指定用户名" - username_taken: "^此用户名已有人使用" + missing_username: ^请指定用户名 + username_taken: ^此用户名已有人使用 email: - missing_email: "^请指定邮件地址" - email_in_use: "^此邮件地址已经有人使用" - - # dynamic_form plugin translations. - #---------------------------------------------------------------------------- + missing_email: ^请指定邮件地址 + email_in_use: ^此邮件地址已经有人使用 errors: template: header: - one: "有 1 个错误发生导致「%{model}」无法被保存。" - other: "有 %{count} 个错误发生导致「%{model}」无法被保存。" - body: "如下字段出现错误:" - + one: 有 1 个错误发生导致「%{model}」无法被保存。 + other: 有 %{count} 个错误发生导致「%{model}」无法被保存。 + body: 如下字段出现错误: msg_account_suspended: 用户账号已暂停 password_reset_instruction: 密码重置方法 - - # Controllers. - #---------------------------------------------------------------------------- msg_account_created: 你的账号已经创建,正在等待管理员审核 msg_account_not_approved: 你的账号还未被批准 - msg_asset_deleted: "%{value} 已经被删除" + msg_asset_deleted: ! '%{value} 已经被删除' msg_asset_not_available: 这个 %{value} 已不存在 - msg_asset_not_authorized: You are not authorized to view this %{value}. # TODO + msg_asset_not_authorized: You are not authorized to view this %{value}. msg_assets_not_available: 这个 %{value} 不存在 - msg_asset_rejected: "%{value} 已被拒绝" - msg_bad_image_file: "^^不能将此图片上传或改变大小" - msg_cant_create_related: "不能创建 %{asset} 因为 %{related} 已不存在" - msg_cant_delete_user: "^不能删除用户,因为 %{value} 有相关 assets 存在" - msg_cant_do: "不能 %{action} %{asset} 因为它已经不存在" + msg_asset_rejected: ! '%{value} 已被拒绝' + msg_bad_image_file: ^^不能将此图片上传或改变大小 + msg_cant_create_related: 不能创建 %{asset} 因为 %{related} 已不存在 + msg_cant_delete_user: ^不能删除用户,因为 %{value} 有相关 assets 存在 + msg_cant_do: 不能 %{action} %{asset} 因为它已经不存在 msg_email_not_found: 未找到用户使用此邮件地址 msg_enter_new_password: 请输入新密码 msg_goodbye: 您已退出,感谢您使用 Fat Free CRM! - msg_invalid_password: "^^请输入正确密码" + msg_invalid_password: ^^请输入正确密码 msg_invalig_login: 用户名或密码错 msg_last_login: 您上次登录是在 %{value}. msg_login_needed: 必须登录后才可使用本页 @@ -195,10 +168,7 @@ zh-CN: msg_require_admin: 必须是管理员才能使用本页 msg_successful_signup: 成功申请,欢迎您使用 Fat Free CRM! msg_welcome: 欢迎使用 Fat Free CRM! - - # Options. - #---------------------------------------------------------------------------- - "option_amount*probability": weighted amount + option_amount*probability: weighted amount activity_options: 显示 %{models} 行业由 %{user} 在过去 %{period}. all_users: 所有用户 option_after: 之后 @@ -223,12 +193,9 @@ zh-CN: option_target_leads: 目标线索 option_target_revenue: 目标收入 option_updated_at: 更新日期 - show_per_page: 显示 %{number} %{models} 每页使用 %{fmt} 格式 + show_per_page: 显示 %{number} %{models} 每页使用 %{fmt} 格式 sort_by: 用 %{field} 排序 %{models} - sort_by_displaying: 用 %{field} 排序 %{models},显示名 %{position} 姓 - - # Views -> Profile. - #---------------------------------------------------------------------------- + sort_by_displaying: 用 %{field} 排序 %{models},显示名 %{position} 姓 aim: AOL IM already_signed_up: 已申请? alt_email: 另一个 email @@ -238,7 +205,6 @@ zh-CN: contact_info: 联系人信息 current_password: 旧密码 edit_profile: 编辑个人设置 - # email: Email # <-- Already defined as the task type if Settings. first_name: 名 google: Google IM gravatar_help: 不熟悉 Gravatars? 了解 Gravatars @@ -264,18 +230,12 @@ zh-CN: user: 用户 username: 用户名 yahoo: Yahoo IM - - # Views -> Authenticate. - #---------------------------------------------------------------------------- forgot_password: 忘记密码 login: 登录 no_account: 没有账号? remember_me: 记住我 sign_up_now: 现在申请! - - # Views -> Accounts. - #---------------------------------------------------------------------------- - account: 账号 + account: 账号 account_small: 短账号 accounts: 账号 accounts_options: 账号选项 @@ -286,9 +246,9 @@ zh-CN: date_created: 创建日期 date_updated: 更新日期 fax: 传真 - intro: 可稍后添加%{value} + intro: 可稍后添加%{value} mobile_small: 手机 - open_in_window: 在一个新窗口打开%{value} + open_in_window: 在一个新窗口打开%{value} mail_to: 发邮件给%{value} phone_small: 电话 phone_toll_free: 免费电话 @@ -302,10 +262,7 @@ zh-CN: account_summary: 账号摘要 pipeline: 渠道 select_an_account: 选择账号 - - # Views -> Campaigns. - #---------------------------------------------------------------------------- - actual: 实际 + actual: 实际 actual_performance: 实际效益 budget: 预算 budget_label: 预算(¥) @@ -319,7 +276,7 @@ zh-CN: campaigns_small: 促销 conversion: 转换 conversion_label: 转换比率(%) - conversion_number: "%{value} 转换" + conversion_number: ! '%{value} 转换' create_campaign: 创建促销 end_date: 结束日期 finished_on: 完成于 %{value} @@ -331,7 +288,7 @@ zh-CN: objectives_small: 战役目标 revenue: 收入 revenue_label: 收入(¥) - revenue_number: "收入%{value}" + revenue_number: 收入%{value} save_campaign: 保存促销 start_date: 开始日期 started_ago: 开始于 %{value} 之前 @@ -341,9 +298,6 @@ zh-CN: total_campaigns: 促销总数 was_supposed_to_finish: 预计完成于 %{value} was_supposed_to_start: 预计开始于 %{time_ago} 之前,在 %{start_date} - - # Views -> Contacts. - #---------------------------------------------------------------------------- alt_email_small: 其它 blog: Website/Blog contact: 联系人 @@ -353,14 +307,14 @@ zh-CN: contacts_small: 联系人 create_contact: 创建联系人 department: 部门 - department_small: '%{value} 部门' + department_small: ! '%{value} 部门' do_not_call: 不要打电话 extra_info: 更多信息 extra_info_small: 更多信息 facebook: Facebook linked_in: LinkedIn myself: 自己 - permissions_intro_private: 默认只有你对 %{value} 有权限。以后可修改。 + permissions_intro_private: 默认只有你对 %{value} 有权限。以后可修改。 permissions_intro_public: 默认所有用户都对 %{value} 有权限。以后可修改。 permissions_intro_shared: 默认只有选定用户对 %{value} 有权限。以后可修改。 referred_by: 引用 @@ -369,7 +323,7 @@ zh-CN: twitter: Twitter web_presence: web web_presence_small: web - works_at: "%{job_title} 在 %{company}" + works_at: ! '%{job_title} 在 %{company}' affiliate: 下属 competitor: 对手 customer: 顾客 @@ -380,9 +334,6 @@ zh-CN: select_contact: 选择账号 select_a_country: 选择国家 comment_intro: 备注或简介 - - # Views -> Leads. - #---------------------------------------------------------------------------- convert: 转换 convert_lead: 转换线索 convert_lead_permissions_intro: 联系人权限将会从被转换的线索中复制。以后可修改。 @@ -408,9 +359,6 @@ zh-CN: source: 源 status: 状态 total_leads: 线索总计 - - # Views -> Opportunities. - #---------------------------------------------------------------------------- amount: 金额 close_date: 结束日期 closed_ago_on: 结束于 %{time_ago} 之前,在 %{date} @@ -432,7 +380,7 @@ zh-CN: opportunity: 商机 opportunity_small: 商机 opportunity_summary: 商机摘要 - opportunity_summary_text: "%{amount} 有 %{discount} 折扣和 %{probability} 可能性" + opportunity_summary_text: ! '%{amount} 有 %{discount} 折扣和 %{probability} 可能性' past_due: 超过预计, 预计结束于 %{value} 之前 probability: 可能性 probability_number: 有 %{value} 可能性 @@ -442,9 +390,6 @@ zh-CN: weighted_amount: 权重数量 select_opportunity: 选择商机 Discard: 放弃 - - # Views -> Tasks. - #---------------------------------------------------------------------------- assign_to: 分配给 assigned_tab: 已分配 assigned_tasks: 已分配任务 @@ -457,13 +402,13 @@ zh-CN: due: 期限 feel_free: 可任意 move_to: 移动到 - no_tasks: "你没有任何 %{value} 任务" + no_tasks: 你没有任何 %{value} 任务 no_tasks_pending: 进行中 no_tasks_assigned: 已分配 no_tasks_completed: 完成 pending_tab: 进行中 pending_tasks: 进行中任务 - related: '相关:' + related: ! '相关:' save_task: 保存任务 task_assigned: 任务已经分配给 %{value} task_assigned_to: 并分配给 %{value} @@ -490,10 +435,6 @@ zh-CN: my_accounts: 我的账号 no_account_records: 暂无账号 select_task: 选择任务 - - - # Views -> Home. - #---------------------------------------------------------------------------- action_commented: 评论于 action_completed: 已完成 action_created: 已创建 @@ -513,28 +454,25 @@ zh-CN: subject_lead: 线索 subject_opportunity: 商机 subject_task: 任务 - - # Views -> Common. - #---------------------------------------------------------------------------- add_note: 添加注释 save_note: 保存注释 add_note_help: 添加一个新注释... edit_note: 编辑注释 added_ago: 添加于 %{value} 之前 - added_by: 添加于 %{time_ago} 之前,由 %{user} + added_by: 添加于 %{time_ago} 之前,由 %{user} back: 返回 cancel: 取消 close_form: 关闭,由 confirm_delete: 确认删除 %{value}? copy_permissions: 复制 %{value} 权限 - could_not_find: "未找到 %{value}. 请" - could_not_find_matching: "未找到 %{value} 匹配" + could_not_find: 未找到 %{value}. 请 + could_not_find_matching: 未找到 %{value} 匹配 create_new: 创建新 select_existing: 选择已有 delete: 删除 - discard: Discard # TODO + discard: Discard edit: 编辑 - items_total: '%{count} 总计' + items_total: ! '%{count} 总计' me: 自己 n_a: 无 name: 名字 @@ -545,11 +483,11 @@ zh-CN: please_retry: 请再试一次 recent_items: 最近项目 search_assets: 查找 %{value} - time_ago: "%{value} 以前" + time_ago: ! '%{value} 以前' background_info: 背景 address: 地址 - street1: 街道 1 # NEW - street2: 街道 2 # NEW + street1: 街道 1 + street2: 街道 2 city: 城市 zipcode: 邮编 state: 省 @@ -561,14 +499,8 @@ zh-CN: destroy: 删除 expand_all: 展开 collapse_all: 收起 - - # Views -> Tag. - #---------------------------------------------------------------------------- select_or_create_tags: 选择标签 tags: 标签 - - # Views -> Layout. - #---------------------------------------------------------------------------- about: 关于 about_dev_group: 开发者讨论组 about_features: 特性与bugs @@ -584,27 +516,14 @@ zh-CN: logout: 退出 quick_find: 快速查找 welcome: 欢迎 - - # Views -> Comments. - #---------------------------------------------------------------------------- edit_comment: 编辑评论 show: 显示 - update: 更新 - - # Views -> Passwords. - #---------------------------------------------------------------------------- confirm_password_intro: 请输入新密码并确认 password_intro: 请输入邮件地址,重置密码邮件将发到您的邮箱 reset_password: 重置密码 update_password_and_login: 更新密码并登录 - - # Views -> Admin - #---------------------------------------------------------------------------- back_to_crm: 返回 Fat Free CRM crm_admin_page: Fat Free CRM 管理 - - # Views -> Admin -> Users. - #---------------------------------------------------------------------------- approve: 批准 create_user: 创建用户 last_seen: 上次 %{value} 之前见到 @@ -617,7 +536,7 @@ zh-CN: user_awaits_approval: 等待您的批准 user_confirm_delete: 只有没有其它相关信息的用户才能被删除 user_is_admin: 此用户是管理员 - user_never_logged_in: "尚未登录" + user_never_logged_in: 尚未登录 user_signed_up: 已申请 user_signed_up_on: 申请于 %{value} user_since: 用户自 %{value} @@ -625,38 +544,30 @@ zh-CN: user_suspended_on: 暂停于 %{value} users: 用户 users_small: 用户 - - # Pluralizations. - #---------------------------------------------------------------------------- pluralize: comment: - one: '1 comment' # TODO - other: '%{count} comments' # TODO - contact: - one: '1 个联系人' - other: '%{count} 个联系人' + one: 1 comment + other: ! '%{count} comments' + contact: + one: 1 个联系人 + other: ! '%{count} 个联系人' opportunity: - one: '1 个商机' - other: '%{count} 个商机' + one: 1 个商机 + other: ! '%{count} 个商机' lead: - one: '1 个线索' - other: '%{count} 个线索' + one: 1 个线索 + other: ! '%{count} 个线索' day: - one: '1 天' - other: '%{count} 天' + one: 1 天 + other: ! '%{count} 天' login: - one: '1 个登录' - other: '%{count} 个登录' - - # Custom date/time formats. - #---------------------------------------------------------------------------- + one: 1 个登录 + other: ! '%{count} 个登录' date: formats: - mmddyyyy: "%Y-%m-%d" - mmdd: "%b %e" - mmddyy: "%b %e, %Y" - + mmddyyyy: ! '%Y-%m-%d' + mmdd: ! '%b %e' + mmddyy: ! '%b %e, %Y' time: formats: - mmddhhss: "%b %e at %l:%M%p" - + mmddhhss: ! '%b %e at %l:%M%p' From c5cfd442f078982c99230baeedb08a212a95cfc4 Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Tue, 30 Jul 2013 10:48:54 +0800 Subject: [PATCH 018/213] Convert settings from syck to psych and remove dependency on Syck. --- app/models/setting.rb | 12 ++---- config/application.rb | 3 -- config/settings.default.yml | 81 +++++++++++++++++++++++++++---------- 3 files changed, 63 insertions(+), 33 deletions(-) diff --git a/app/models/setting.rb b/app/models/setting.rb index 332508ccc5..14a8f56563 100644 --- a/app/models/setting.rb +++ b/app/models/setting.rb @@ -101,16 +101,10 @@ def database_and_table_exists? # Loads settings from YAML files def load_settings_from_yaml(file) - begin - YAML::ENGINE.yamler = 'syck' # remove this when files are converted to Psych - settings = YAML.load_file(file) - # Merge settings into current settings hash (recursively) - @@yaml_settings.deep_merge!(settings) - rescue Exception => ex - puts "Settings couldn't be loaded from #{file}: #{ex.message}" - end - yaml_settings + settings = YAML.load_file(file) + @@yaml_settings.deep_merge!(settings) end + end ActiveSupport.run_load_hooks(:fat_free_crm_setting, self) diff --git a/config/application.rb b/config/application.rb index 492e233948..f4417a4d54 100644 --- a/config/application.rb +++ b/config/application.rb @@ -6,9 +6,6 @@ require File.expand_path('../boot', __FILE__) require 'rubygems' -require 'yaml' -YAML::ENGINE.yamler = 'syck' - require 'rails/all' if defined?(Bundler) diff --git a/config/settings.default.yml b/config/settings.default.yml index 581c62cf73..e7cddb1d3c 100644 --- a/config/settings.default.yml +++ b/config/settings.default.yml @@ -197,27 +197,66 @@ # Main and Admin Tabs #------------------------------------------------------------------------------ -:tabs: [ - { :active : true, :text : :tab_dashboard, :url : { :controller : "home" } }, - { :active : false, :text : :tab_tasks, :url : { :controller : "tasks" } }, - { :active : false, :text : :tab_campaigns, :url : { :controller : "campaigns" } }, - { :active : false, :text : :tab_leads, :url : { :controller : "leads" } }, - { :active : false, :text : :tab_accounts, :url : { :controller : "accounts" } }, - { :active : false, :text : :tab_contacts, :url : { :controller : "contacts" } }, - { :active : false, :text : :tab_opportunities, :url : { :controller : "opportunities" } }, - { :active : false, :text : :tab_team, :url : { :controller : "users", - :action : "opportunities_overview" } } - -] - -:admin_tabs: [ - { :active : true, :text : :admin_tab_users, :url : { :controller : "admin/users" } }, - { :active : true, :text : :admin_tab_groups, :url : { :controller : "admin/groups" } }, - { :active : false, :text : :admin_tab_fields, :url : { :controller : "admin/fields" } }, - { :active : false, :text : :admin_tab_tags, :url : { :controller : "admin/tags" } }, - { :active : false, :text : :admin_tab_settings, :url : { :controller : "admin/settings" } }, - { :active : false, :text : :admin_tab_plugins, :url : { :controller : "admin/plugins" } } -] +:tabs: +- :active: true + :text: :tab_dashboard + :url: + :controller: home +- :active: false + :text: :tab_tasks + :url: + :controller: tasks +- :active: false + :text: :tab_campaigns + :url: + :controller: campaigns +- :active: false + :text: :tab_leads + :url: + :controller: leads +- :active: false + :text: :tab_accounts + :url: + :controller: accounts +- :active: false + :text: :tab_contacts + :url: + :controller: contacts +- :active: false + :text: :tab_opportunities + :url: + :controller: opportunities +- :active: false + :text: :tab_team + :url: + :controller: users + :action: opportunities_overview + +:admin_tabs: +- :active: true + :text: :admin_tab_users + :url: + :controller: admin/users +- :active: true + :text: :admin_tab_groups + :url: + :controller: admin/groups +- :active: false + :text: :admin_tab_fields + :url: + :controller: admin/fields +- :active: false + :text: :admin_tab_tags + :url: + :controller: admin/tags +- :active: false + :text: :admin_tab_settings + :url: + :controller: admin/settings +- :active: false + :text: :admin_tab_plugins + :url: + :controller: admin/plugins # Account Category. To add custom account type use string value, for example: # From 1a17fff05506f09f54ab3c3cbb9306aa16b12287 Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Wed, 31 Jul 2013 11:42:00 +0800 Subject: [PATCH 019/213] Add psych to gemspec to be explicit about using it. --- Gemfile.lock | 2 ++ fat_free_crm.gemspec | 1 + 2 files changed, 3 insertions(+) diff --git a/Gemfile.lock b/Gemfile.lock index f2a0071585..a5b52d5e1d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -173,6 +173,7 @@ GEM slop (>= 2.4.4, < 3) pry-rails (0.1.6) pry + psych (2.0.0) quiet_assets (1.0.1) railties (~> 3.1) rack (1.4.5) @@ -336,6 +337,7 @@ DEPENDENCIES premailer prototype-rails pry-rails + psych quiet_assets rails (~> 3.2.12) rails3-jquery-autocomplete diff --git a/fat_free_crm.gemspec b/fat_free_crm.gemspec index 7f52374c13..d42633151e 100644 --- a/fat_free_crm.gemspec +++ b/fat_free_crm.gemspec @@ -38,6 +38,7 @@ Gem::Specification.new do |gem| gem.add_dependency 'responds_to_parent', '>= 1.1.0' gem.add_dependency 'rails3-jquery-autocomplete' gem.add_dependency 'valium' + gem.add_dependency 'psych' # FatFreeCRM has released it's own versions of the following gems: #----------------------------------------------------------------- From cc7a441620274338c81f39d8b39edef59f8ba49e Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Tue, 13 Aug 2013 10:09:13 +0800 Subject: [PATCH 020/213] Address Issue #270. Fixed procfile command for heroku. --- Procfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Procfile b/Procfile index fd3e2d3f07..9c8237414c 100644 --- a/Procfile +++ b/Procfile @@ -1 +1 @@ -web: ./bin/unicorn -p $PORT -c config/unicorn.rb +web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb From 416aecd12342bb93bc5133ddd98eabeb8febacb5 Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Tue, 13 Aug 2013 10:09:13 +0800 Subject: [PATCH 021/213] Address Issue #270. Fixed procfile command for heroku. --- Procfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Procfile b/Procfile index fd3e2d3f07..9c8237414c 100644 --- a/Procfile +++ b/Procfile @@ -1 +1 @@ -web: ./bin/unicorn -p $PORT -c config/unicorn.rb +web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb From 19c9801b027d25f7ab515de60dafc69abc8a1096 Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Tue, 13 Aug 2013 10:20:19 +0800 Subject: [PATCH 022/213] Fixed issue #272 - tags do not exist on tasks. --- lib/fat_free_crm/export_csv.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/fat_free_crm/export_csv.rb b/lib/fat_free_crm/export_csv.rb index dae6207a76..c16808ae8a 100644 --- a/lib/fat_free_crm/export_csv.rb +++ b/lib/fat_free_crm/export_csv.rb @@ -7,7 +7,7 @@ module FatFreeCRM class ExportCSV - + # CSV export. Based on to_csv Rails plugin by Ary Djmal # https://github.com/arydjmal/to_csv #---------------------------------------------------------------------------- @@ -16,7 +16,7 @@ def self.from_array(items = []) # Infer column types from the first item in the array klass = items.first.class columns = klass.columns.map(&:name).reject { |column| column =~ /password|token/ } - columns << 'tags' + columns << 'tags' if klass.taggable? CSV.generate do |csv| csv << columns.map { |column| klass.human_attribute_name(column) } items.each do |item| @@ -30,6 +30,6 @@ def self.from_array(items = []) end end end - + end end From da75a3405ff20cd3ed275fa114cc0c4015f4d32a Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Tue, 13 Aug 2013 11:39:25 +0800 Subject: [PATCH 023/213] Converted stub! to stub. --- Gemfile.lock | 35 +++++++++++-------- .../admin/users_controller_spec.rb | 4 +-- .../applications_controller_spec.rb | 4 +-- .../authentications_controller_spec.rb | 28 +++++++-------- spec/controllers/comments_controller_spec.rb | 16 ++++----- spec/controllers/emails_controller_spec.rb | 2 +- .../entities/accounts_controller_spec.rb | 10 +++--- .../entities/campaigns_controller_spec.rb | 10 +++--- .../entities/contacts_controller_spec.rb | 10 +++--- .../entities/leads_controller_spec.rb | 24 ++++++------- .../entities/opportunities_controller_spec.rb | 10 +++--- spec/controllers/home_controller_spec.rb | 8 ++--- spec/controllers/tasks_controller_spec.rb | 10 +++--- spec/controllers/users_controller_spec.rb | 14 ++++---- spec/helpers/application_helper_spec.rb | 30 ++++++++-------- spec/lib/mail_processor/base_spec.rb | 6 ++-- spec/lib/mail_processor/dropbox_spec.rb | 6 ++-- .../fields/custom_field_date_pair_spec.rb | 4 +-- spec/models/fields/custom_field_spec.rb | 2 +- spec/models/fields/field_spec.rb | 2 +- spec/shared/models.rb | 2 +- spec/support/auth_macros.rb | 6 ++-- spec/support/mail_processor_mocks.rb | 22 ++++++------ .../admin/field_groups/create.js.haml_spec.rb | 2 +- .../field_groups/destroy.js.haml_spec.rb | 2 +- .../admin/field_groups/update.js.haml_spec.rb | 2 +- .../views/users/upload_avatar.js.haml_spec.rb | 4 +-- 27 files changed, 140 insertions(+), 135 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index a5b52d5e1d..0c2f24e0e3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -98,7 +98,7 @@ GEM debugger-ruby_core_source (~> 1.2.0) debugger-linecache (1.2.0) debugger-ruby_core_source (1.2.0) - diff-lcs (1.2.1) + diff-lcs (1.2.4) dynamic_form (1.1.4) email_reply_parser_ffcrm (0.5.0) erubis (2.7.0) @@ -117,7 +117,7 @@ GEM thor (>= 0.14.6) guard-rails (0.4.2) guard (>= 0.2.2) - guard-rspec (2.5.3) + guard-rspec (2.5.4) guard (>= 1.1) rspec (~> 2.11) haml (3.1.7) @@ -133,14 +133,17 @@ GEM json (1.8.0) kgio (2.7.4) libv8 (3.3.10.4) - listen (0.7.3) + listen (1.2.3) + rb-fsevent (>= 0.9.3) + rb-inotify (>= 0.9) + rb-kqueue (>= 0.2) mail (2.5.3) i18n (>= 0.4.0) mime-types (~> 1.16) treetop (~> 1.4.8) method_source (0.7.1) mime-types (1.23) - multi_json (1.7.7) + multi_json (1.7.9) net-scp (1.0.4) net-ssh (>= 1.99.1) net-sftp (2.0.5) @@ -221,26 +224,28 @@ GEM rb-fsevent (0.9.3) rb-inotify (0.9.0) ffi (>= 0.5.0) + rb-kqueue (0.2.0) + ffi (>= 0.5.0) rdoc (3.12.2) json (~> 1.4) responds_to_parent (1.1.0) rest-client (1.6.7) mime-types (>= 1.16) - rspec (2.13.0) - rspec-core (~> 2.13.0) - rspec-expectations (~> 2.13.0) - rspec-mocks (~> 2.13.0) - rspec-core (2.13.1) - rspec-expectations (2.13.0) + rspec (2.14.1) + rspec-core (~> 2.14.0) + rspec-expectations (~> 2.14.0) + rspec-mocks (~> 2.14.0) + rspec-core (2.14.4) + rspec-expectations (2.14.1) diff-lcs (>= 1.1.3, < 2.0) - rspec-mocks (2.13.0) - rspec-rails (2.13.0) + rspec-mocks (2.14.3) + rspec-rails (2.14.0) actionpack (>= 3.0) activesupport (>= 3.0) railties (>= 3.0) - rspec-core (~> 2.13.0) - rspec-expectations (~> 2.13.0) - rspec-mocks (~> 2.13.0) + rspec-core (~> 2.14.0) + rspec-expectations (~> 2.14.0) + rspec-mocks (~> 2.14.0) rubyzip (0.9.9) sass (3.2.1) sass-rails (3.2.5) diff --git a/spec/controllers/admin/users_controller_spec.rb b/spec/controllers/admin/users_controller_spec.rb index d934ae7e9e..8c6eac6220 100644 --- a/spec/controllers/admin/users_controller_spec.rb +++ b/spec/controllers/admin/users_controller_spec.rb @@ -117,7 +117,7 @@ it "assigns a newly created user as @user and renders [create] template" do @user = FactoryGirl.build(:user, :username => @username, :email => @email) - User.stub!(:new).and_return(@user) + User.stub(:new).and_return(@user) xhr :post, :create, :user => { :username => @username, :email => @email, :password => @password, :password_confirmation => @password } assigns[:user].should == @user @@ -140,7 +140,7 @@ describe "with invalid params" do it "assigns a newly created but unsaved user as @user and re-renders [create] template" do @user = FactoryGirl.build(:user, :username => "", :email => "") - User.stub!(:new).and_return(@user) + User.stub(:new).and_return(@user) xhr :post, :create, :user => {} assigns[:user].should == @user diff --git a/spec/controllers/applications_controller_spec.rb b/spec/controllers/applications_controller_spec.rb index c624e3966c..fcdeced037 100644 --- a/spec/controllers/applications_controller_spec.rb +++ b/spec/controllers/applications_controller_spec.rb @@ -22,7 +22,7 @@ end it "should return [6, 9] when related is 'campaigns/7'" do - controller.stub!(:controller_name).and_return('opportunities') + controller.stub(:controller_name).and_return('opportunities') campaign = mock(Campaign, :opportunities => [mock(:id => 6), mock(:id => 9)]) Campaign.should_receive(:find_by_id).with('7').and_return(campaign) controller.send(:auto_complete_ids_to_exclude, 'campaigns/7').sort.should == [6, 9] @@ -34,7 +34,7 @@ end it "should return [] when related object association is not found" do - controller.stub!(:controller_name).and_return('not_a_method_that_exists') + controller.stub(:controller_name).and_return('not_a_method_that_exists') campaign = mock(Campaign) Campaign.should_receive(:find_by_id).with('7').and_return(campaign) controller.send(:auto_complete_ids_to_exclude, 'campaigns/7').should == [] diff --git a/spec/controllers/authentications_controller_spec.rb b/spec/controllers/authentications_controller_spec.rb index 55d4cf525a..6dd7278dad 100644 --- a/spec/controllers/authentications_controller_spec.rb +++ b/spec/controllers/authentications_controller_spec.rb @@ -34,7 +34,7 @@ describe "user must not be logged in" do before(:each) do @user = FactoryGirl.create(:user, :username => "user", :password => "pass", :password_confirmation => "pass") - @controller.stub!(:current_user).and_return(@user) + @controller.stub(:current_user).and_return(@user) end describe "GET authentication (login form)" do @@ -68,13 +68,13 @@ describe "successful authentication " do before(:each) do - @authentication.stub!(:save).and_return(true) - Authentication.stub!(:new).and_return(@authentication) + @authentication.stub(:save).and_return(true) + Authentication.stub(:new).and_return(@authentication) end it "displays welcome message and redirects to the home page" do @user = FactoryGirl.create(:user, :username => "user", :password => "pass", :password_confirmation => "pass", :login_count => 0) - @authentication.stub!(:user).and_return(@user) + @authentication.stub(:user).and_return(@user) post :create, :authentication => @login flash[:notice].should_not == nil @@ -84,7 +84,7 @@ it "displays last login time if it's not the first login" do @user = FactoryGirl.create(:user, :username => "user", :password => "pass", :password_confirmation => "pass", :login_count => 42) - @authentication.stub!(:user).and_return(@user) + @authentication.stub(:user).and_return(@user) post :create, :authentication => @login flash[:notice].should =~ /last login/ @@ -96,9 +96,9 @@ describe "user is not suspended" do it "redirects to login page if username or password are invalid" do @user = FactoryGirl.create(:user, :username => "user", :password => "pass", :password_confirmation => "pass") - @authentication.stub!(:user).and_return(@user) - @authentication.stub!(:save).and_return(false) # <--- Authentication failure. - Authentication.stub!(:new).and_return(@authentication) + @authentication.stub(:user).and_return(@user) + @authentication.stub(:save).and_return(false) # <--- Authentication failure. + Authentication.stub(:new).and_return(@authentication) post :create, :authentication => @login flash[:warning].should_not == nil @@ -108,14 +108,14 @@ describe "user has been suspended" do before(:each) do - @authentication.stub!(:save).and_return(true) - Authentication.stub!(:new).and_return(@authentication) + @authentication.stub(:save).and_return(true) + Authentication.stub(:new).and_return(@authentication) end # This tests :before_save update_info callback in Authentication model. it "keeps user login attributes intact" do @user = FactoryGirl.create(:user, :username => "user", :password => "pass", :password_confirmation => "pass", :suspended_at => Date.yesterday, :login_count => 0, :last_login_at => nil, :last_login_ip => nil) - @authentication.stub!(:user).and_return(@user) + @authentication.stub(:user).and_return(@user) post :create, :authentication => @login @authentication.user.login_count.should == 0 @@ -125,7 +125,7 @@ it "redirects to login page if user is suspended" do @user = FactoryGirl.create(:user, :username => "user", :password => "pass", :password_confirmation => "pass", :suspended_at => Date.yesterday) - @authentication.stub!(:user).and_return(@user) + @authentication.stub(:user).and_return(@user) post :create, :authentication => @login flash[:warning].should_not == nil # Invalid username/password. @@ -134,9 +134,9 @@ end it "redirects to login page with the message if signup needs approval and user hasn't been activated yet" do - Setting.stub!(:user_signup).and_return(:needs_approval) + Setting.stub(:user_signup).and_return(:needs_approval) @user = FactoryGirl.create(:user, :username => "user", :password => "pass", :password_confirmation => "pass", :suspended_at => Date.yesterday, :login_count => 0) - @authentication.stub!(:user).and_return(@user) + @authentication.stub(:user).and_return(@user) post :create, :authentication => @login flash[:warning].should == nil # Invalid username/password. diff --git a/spec/controllers/comments_controller_spec.rb b/spec/controllers/comments_controller_spec.rb index d78e97d3d6..50b867910e 100755 --- a/spec/controllers/comments_controller_spec.rb +++ b/spec/controllers/comments_controller_spec.rb @@ -84,7 +84,7 @@ it "should expose the requested comment as @commment and render [edit] template" do @asset = FactoryGirl.create(asset) @comment = FactoryGirl.create(:comment, :id => 42, :commentable => @asset, :user => current_user) - Comment.stub!(:new).and_return(@comment) + Comment.stub(:new).and_return(@comment) xhr :get, :edit, :id => 42 assigns[:comment].should == @comment @@ -104,7 +104,7 @@ it "should expose a newly created comment as @comment for the #{asset}" do @asset = FactoryGirl.create(asset) @comment = FactoryGirl.build(:comment, :commentable => @asset, :user => current_user) - Comment.stub!(:new).and_return(@comment) + Comment.stub(:new).and_return(@comment) xhr :post, :create, :comment => { :commentable_type => asset.to_s.classify, :commentable_id => @asset.id, :user_id => current_user.id, :comment => "Hello" } assigns[:comment].should == @comment @@ -118,7 +118,7 @@ it "should expose a newly created but unsaved comment as @comment for #{asset}" do @asset = FactoryGirl.create(asset) @comment = FactoryGirl.build(:comment, :commentable => @asset, :user => current_user) - Comment.stub!(:new).and_return(@comment) + Comment.stub(:new).and_return(@comment) xhr :post, :create, :comment => {} assigns[:comment].should == @comment @@ -142,13 +142,13 @@ # end # # it "should expose the requested comment as @comment" do - # Comment.stub!(:find).and_return(mock_comment(:update_attributes => true)) + # Comment.stub(:find).and_return(mock_comment(:update_attributes => true)) # put :update, :id => "1" # assigns(:comment).should equal(mock_comment) # end # # it "should redirect to the comment" do - # Comment.stub!(:find).and_return(mock_comment(:update_attributes => true)) + # Comment.stub(:find).and_return(mock_comment(:update_attributes => true)) # put :update, :id => "1" # response.should redirect_to(comment_path(mock_comment)) # end @@ -162,13 +162,13 @@ # end # # it "should expose the comment as @comment" do - # Comment.stub!(:find).and_return(mock_comment(:update_attributes => false)) + # Comment.stub(:find).and_return(mock_comment(:update_attributes => false)) # put :update, :id => "1" # assigns(:comment).should equal(mock_comment) # end # # it "should re-render the 'edit' template" do - # Comment.stub!(:find).and_return(mock_comment(:update_attributes => false)) + # Comment.stub(:find).and_return(mock_comment(:update_attributes => false)) # put :update, :id => "1" # response.should render_template('edit') # end @@ -186,7 +186,7 @@ it "should destroy the requested comment and render [destroy] template" do @asset = FactoryGirl.create(asset) @comment = FactoryGirl.create(:comment, :commentable => @asset, :user => current_user) - Comment.stub!(:new).and_return(@comment) + Comment.stub(:new).and_return(@comment) xhr :delete, :destroy, :id => @comment.id lambda { Comment.find(@comment) }.should raise_error(ActiveRecord::RecordNotFound) diff --git a/spec/controllers/emails_controller_spec.rb b/spec/controllers/emails_controller_spec.rb index b0998b5772..7ee5bd847d 100644 --- a/spec/controllers/emails_controller_spec.rb +++ b/spec/controllers/emails_controller_spec.rb @@ -22,7 +22,7 @@ it "should destroy the requested email and render [destroy] template" do @asset = FactoryGirl.create(asset) @email = FactoryGirl.create(:email, :mediator => @asset, :user => current_user) - Email.stub!(:new).and_return(@email) + Email.stub(:new).and_return(@email) xhr :delete, :destroy, :id => @email.id lambda { Email.find(@email) }.should raise_error(ActiveRecord::RecordNotFound) diff --git a/spec/controllers/entities/accounts_controller_spec.rb b/spec/controllers/entities/accounts_controller_spec.rb index 784ad435c3..7261238e62 100644 --- a/spec/controllers/entities/accounts_controller_spec.rb +++ b/spec/controllers/entities/accounts_controller_spec.rb @@ -304,7 +304,7 @@ def get_data_for_sidebar it "should expose a newly created account as @account and render [create] template" do @account = FactoryGirl.build(:account, :name => "Hello world", :user => current_user) - Account.stub!(:new).and_return(@account) + Account.stub(:new).and_return(@account) xhr :post, :create, :account => { :name => "Hello world" } assigns(:account).should == @account @@ -314,7 +314,7 @@ def get_data_for_sidebar # Note: [Create Account] is shown only on Accounts index page. it "should reload accounts to update pagination" do @account = FactoryGirl.build(:account, :user => current_user) - Account.stub!(:new).and_return(@account) + Account.stub(:new).and_return(@account) xhr :post, :create, :account => { :name => "Hello" } assigns[:accounts].should == [ @account ] @@ -322,7 +322,7 @@ def get_data_for_sidebar it "should get data to update account sidebar" do @account = FactoryGirl.build(:account, :name => "Hello", :user => current_user) - Campaign.stub!(:new).and_return(@account) + Campaign.stub(:new).and_return(@account) xhr :post, :create, :account => { :name => "Hello" } assigns[:account_category_total].should be_instance_of(HashWithIndifferentAccess) @@ -330,7 +330,7 @@ def get_data_for_sidebar it "should add a new comment to the newly created account when specified" do @account = FactoryGirl.build(:account, :name => "Hello world", :user => current_user) - Account.stub!(:new).and_return(@account) + Account.stub(:new).and_return(@account) xhr :post, :create, :account => { :name => "Hello world" }, :comment_body => "Awesome comment is awesome" assigns[:account].comments.map(&:comment).should include("Awesome comment is awesome") @@ -340,7 +340,7 @@ def get_data_for_sidebar describe "with invalid params" do it "should expose a newly created but unsaved account as @account and still render [create] template" do @account = FactoryGirl.build(:account, :name => nil, :user => nil) - Account.stub!(:new).and_return(@account) + Account.stub(:new).and_return(@account) xhr :post, :create, :account => {} assigns(:account).should == @account diff --git a/spec/controllers/entities/campaigns_controller_spec.rb b/spec/controllers/entities/campaigns_controller_spec.rb index ca435ad0fb..9716bed334 100644 --- a/spec/controllers/entities/campaigns_controller_spec.rb +++ b/spec/controllers/entities/campaigns_controller_spec.rb @@ -306,7 +306,7 @@ def get_data_for_sidebar it "should expose a newly created campaign as @campaign and render [create] template" do @campaign = FactoryGirl.build(:campaign, :name => "Hello", :user => current_user) - Campaign.stub!(:new).and_return(@campaign) + Campaign.stub(:new).and_return(@campaign) xhr :post, :create, :campaign => { :name => "Hello" } assigns(:campaign).should == @campaign @@ -315,7 +315,7 @@ def get_data_for_sidebar it "should get data to update campaign sidebar" do @campaign = FactoryGirl.build(:campaign, :name => "Hello", :user => current_user) - Campaign.stub!(:new).and_return(@campaign) + Campaign.stub(:new).and_return(@campaign) xhr :post, :create, :campaign => { :name => "Hello" } assigns[:campaign_status_total].should be_instance_of(HashWithIndifferentAccess) @@ -323,7 +323,7 @@ def get_data_for_sidebar it "should reload campaigns to update pagination" do @campaign = FactoryGirl.build(:campaign, :user => current_user) - Campaign.stub!(:new).and_return(@campaign) + Campaign.stub(:new).and_return(@campaign) xhr :post, :create, :campaign => { :name => "Hello" } assigns[:campaigns].should == [ @campaign ] @@ -331,7 +331,7 @@ def get_data_for_sidebar it "should add a new comment to the newly created campaign when specified" do @campaign = FactoryGirl.build(:campaign, :name => "Hello world", :user => current_user) - Campaign.stub!(:new).and_return(@campaign) + Campaign.stub(:new).and_return(@campaign) xhr :post, :create, :campaign => { :name => "Hello world" }, :comment_body => "Awesome comment is awesome" @campaign.reload.comments.map(&:comment).should include("Awesome comment is awesome") @@ -342,7 +342,7 @@ def get_data_for_sidebar it "should expose a newly created but unsaved campaign as @campaign and still render [create] template" do @campaign = FactoryGirl.build(:campaign, :id => nil, :name => nil, :user => current_user) - Campaign.stub!(:new).and_return(@campaign) + Campaign.stub(:new).and_return(@campaign) xhr :post, :create, :campaign => nil assigns(:campaign).should == @campaign diff --git a/spec/controllers/entities/contacts_controller_spec.rb b/spec/controllers/entities/contacts_controller_spec.rb index 1a321363f7..60a024aa40 100644 --- a/spec/controllers/entities/contacts_controller_spec.rb +++ b/spec/controllers/entities/contacts_controller_spec.rb @@ -303,7 +303,7 @@ it "should expose a newly created contact as @contact and render [create] template" do @contact = FactoryGirl.build(:contact, :first_name => "Billy", :last_name => "Bones") - Contact.stub!(:new).and_return(@contact) + Contact.stub(:new).and_return(@contact) xhr :post, :create, :contact => { :first_name => "Billy", :last_name => "Bones" }, :account => { :name => "Hello world" } assigns(:contact).should == @contact @@ -314,7 +314,7 @@ it "should be able to associate newly created contact with the opportunity" do @opportunity = FactoryGirl.create(:opportunity, :id => 987); @contact = FactoryGirl.build(:contact) - Contact.stub!(:new).and_return(@contact) + Contact.stub(:new).and_return(@contact) xhr :post, :create, :contact => { :first_name => "Billy"}, :account => {}, :opportunity => 987 assigns(:contact).opportunities.should include(@opportunity) @@ -323,7 +323,7 @@ it "should reload contacts to update pagination if called from contacts index" do @contact = FactoryGirl.build(:contact, :user => current_user) - Contact.stub!(:new).and_return(@contact) + Contact.stub(:new).and_return(@contact) request.env["HTTP_REFERER"] = "http://localhost/contacts" xhr :post, :create, :contact => { :first_name => "Billy", :last_name => "Bones" }, :account => {} @@ -332,7 +332,7 @@ it "should add a new comment to the newly created contact when specified" do @contact = FactoryGirl.build(:contact, :user => current_user) - Contact.stub!(:new).and_return(@contact) + Contact.stub(:new).and_return(@contact) xhr :post, :create, :contact => { :first_name => "Testy", :last_name => "McTest" }, :account => { :name => "Hello world" }, :comment_body => "Awesome comment is awesome" assigns[:contact].comments.map(&:comment).should include("Awesome comment is awesome") @@ -343,7 +343,7 @@ before(:each) do @contact = FactoryGirl.build(:contact, :first_name => nil, :user => current_user, :lead => nil) - Contact.stub!(:new).and_return(@contact) + Contact.stub(:new).and_return(@contact) end # Redraw [create] form with selected account. diff --git a/spec/controllers/entities/leads_controller_spec.rb b/spec/controllers/entities/leads_controller_spec.rb index 0f3f050e1e..086338c64c 100644 --- a/spec/controllers/entities/leads_controller_spec.rb +++ b/spec/controllers/entities/leads_controller_spec.rb @@ -210,7 +210,7 @@ it "should expose a new lead as @lead and render [new] template" do @lead = FactoryGirl.build(:lead, :user => current_user, :campaign => nil) - Lead.stub!(:new).and_return(@lead) + Lead.stub(:new).and_return(@lead) @campaigns = [ FactoryGirl.create(:campaign, :user => current_user) ] xhr :get, :new @@ -322,7 +322,7 @@ it "should expose a newly created lead as @lead and render [create] template" do @lead = FactoryGirl.build(:lead, :user => current_user, :campaign => nil) - Lead.stub!(:new).and_return(@lead) + Lead.stub(:new).and_return(@lead) @campaigns = [ FactoryGirl.create(:campaign, :user => current_user) ] xhr :post, :create, :lead => { :first_name => "Billy", :last_name => "Bones" } @@ -341,7 +341,7 @@ @campaign.save @lead = FactoryGirl.build(:lead, :campaign => @campaign, :user => current_user, :access => "Shared") - Lead.stub!(:new).and_return(@lead) + Lead.stub(:new).and_return(@lead) xhr :post, :create, :lead => { :first_name => "Billy", :last_name => "Bones", :access => "Campaign", :user_ids => %w(7 8) }, :campaign => @campaign.id assigns(:lead).should == @lead @@ -353,7 +353,7 @@ it "should get the data to update leads sidebar if called from leads index" do @lead = FactoryGirl.build(:lead, :user => current_user, :campaign => nil) - Lead.stub!(:new).and_return(@lead) + Lead.stub(:new).and_return(@lead) request.env["HTTP_REFERER"] = "http://localhost/leads" xhr :post, :create, :lead => { :first_name => "Billy", :last_name => "Bones" } @@ -362,7 +362,7 @@ it "should reload leads to update pagination if called from leads index" do @lead = FactoryGirl.build(:lead, :user => current_user, :campaign => nil) - Lead.stub!(:new).and_return(@lead) + Lead.stub(:new).and_return(@lead) request.env["HTTP_REFERER"] = "http://localhost/leads" xhr :post, :create, :lead => { :first_name => "Billy", :last_name => "Bones" } @@ -380,7 +380,7 @@ it "should add a new comment to the newly created lead when specified" do @lead = FactoryGirl.create(:lead) - Lead.stub!(:new).and_return(@lead) + Lead.stub(:new).and_return(@lead) xhr :post, :create, :lead => { :first_name => "Test", :last_name => "Lead" }, :comment_body => "This is an important lead." @lead.reload.comments.map(&:comment).should include("This is an important lead.") end @@ -390,7 +390,7 @@ it "should expose a newly created but unsaved lead as @lead and still render [create] template" do @lead = FactoryGirl.build(:lead, :user => current_user, :first_name => nil, :campaign => nil) - Lead.stub!(:new).and_return(@lead) + Lead.stub(:new).and_return(@lead) @campaigns = [ FactoryGirl.create(:campaign, :user => current_user) ] xhr :post, :create, :lead => { :first_name => nil } @@ -730,9 +730,9 @@ @account = FactoryGirl.create(:account, :id => 123, :user => current_user) @opportunity = FactoryGirl.build(:opportunity, :user => current_user, :campaign => @lead.campaign, :account => @account) - Opportunity.stub!(:new).and_return(@opportunity) + Opportunity.stub(:new).and_return(@opportunity) @contact = FactoryGirl.build(:contact, :user => current_user, :lead => @lead) - Contact.stub!(:new).and_return(@contact) + Contact.stub(:new).and_return(@contact) xhr :put, :promote, :id => 42, :account => { :id => 123 }, :opportunity => { :name => "Hello" } @lead.reload.status.should == "converted" @@ -755,11 +755,11 @@ @account = FactoryGirl.build(:account, :user => current_user, :access => "Shared") @account.permissions << FactoryGirl.create(:permission, :user => he, :asset => @account) @account.permissions << FactoryGirl.create(:permission, :user => she, :asset => @account) - @account.stub!(:new).and_return(@account) + @account.stub(:new).and_return(@account) @opportunity = FactoryGirl.build(:opportunity, :user => current_user, :access => "Shared") @opportunity.permissions << FactoryGirl.create(:permission, :user => he, :asset => @opportunity) @opportunity.permissions << FactoryGirl.create(:permission, :user => she, :asset => @opportunity) - @opportunity.stub!(:new).and_return(@opportunity) + @opportunity.stub(:new).and_return(@opportunity) xhr :put, :promote, :id => @lead.id, :access => "Lead", :account => { :name => "Hello", :access => "Lead", :user_id => current_user.id }, :opportunity => { :name => "World", :access => "Lead", :user_id => current_user.id } @account.access.should == "Shared" @@ -809,7 +809,7 @@ @lead = FactoryGirl.create(:lead, :id => 42, :user => current_user, :status => "new") @account = FactoryGirl.create(:account, :id => 123, :user => current_user) @contact = FactoryGirl.build(:contact, :first_name => nil) # make it fail - Contact.stub!(:new).and_return(@contact) + Contact.stub(:new).and_return(@contact) xhr :put, :promote, :id => 42, :account => { :id => 123 } @lead.reload.status.should == "new" diff --git a/spec/controllers/entities/opportunities_controller_spec.rb b/spec/controllers/entities/opportunities_controller_spec.rb index e060d4464e..af8e6d6a0f 100644 --- a/spec/controllers/entities/opportunities_controller_spec.rb +++ b/spec/controllers/entities/opportunities_controller_spec.rb @@ -348,7 +348,7 @@ def get_data_for_sidebar before do @opportunity = FactoryGirl.build(:opportunity, :user => current_user) - Opportunity.stub!(:new).and_return(@opportunity) + Opportunity.stub(:new).and_return(@opportunity) @stage = Setting.unroll(:opportunity_stage) end @@ -426,7 +426,7 @@ def get_data_for_sidebar it "should update related campaign revenue if won" do @campaign = FactoryGirl.create(:campaign, :revenue => 0) @opportunity = FactoryGirl.build(:opportunity, :user => current_user, :stage => "won", :amount => 1100, :discount => 100) - Opportunity.stub!(:new).and_return(@opportunity) + Opportunity.stub(:new).and_return(@opportunity) xhr :post, :create, :opportunity => { :name => "Hello world" }, :campaign => @campaign.id, :account => { :name => "Test Account" } assigns(:opportunity).should == @opportunity @@ -436,7 +436,7 @@ def get_data_for_sidebar it "should add a new comment to the newly created opportunity when specified" do @opportunity = FactoryGirl.build(:opportunity, :user => current_user) - Opportunity.stub!(:new).and_return(@opportunity) + Opportunity.stub(:new).and_return(@opportunity) xhr :post, :create, :opportunity => { :name => "Opportunity Knocks" }, :account => { :name => "My Account" }, :comment_body => "Awesome comment is awesome" @opportunity.reload.comments.map(&:comment).should include("Awesome comment is awesome") @@ -449,7 +449,7 @@ def get_data_for_sidebar @account = Account.new(:user => current_user) @opportunity = FactoryGirl.build(:opportunity, :name => nil, :campaign => nil, :user => current_user, :account => @account) - Opportunity.stub!(:new).and_return(@opportunity) + Opportunity.stub(:new).and_return(@opportunity) @stage = Setting.unroll(:opportunity_stage) @accounts = [ FactoryGirl.create(:account, :user => current_user) ] @@ -465,7 +465,7 @@ def get_data_for_sidebar @account = FactoryGirl.create(:account, :id => 42, :user => current_user) @opportunity = FactoryGirl.build(:opportunity, :name => nil, :campaign => nil, :user => current_user, :account => @account) - Opportunity.stub!(:new).and_return(@opportunity) + Opportunity.stub(:new).and_return(@opportunity) @stage = Setting.unroll(:opportunity_stage) # Expect to redraw [create] form with selected account. diff --git a/spec/controllers/home_controller_spec.rb b/spec/controllers/home_controller_spec.rb index 222a7ede04..756bb273d5 100644 --- a/spec/controllers/home_controller_spec.rb +++ b/spec/controllers/home_controller_spec.rb @@ -162,28 +162,28 @@ end it "should find a user by email" do - @cur_user.stub!(:pref).and_return(:activity_user => 'billy@example.com') + @cur_user.stub(:pref).and_return(:activity_user => 'billy@example.com') controller.instance_variable_set(:@current_user, @cur_user) User.should_receive(:where).with(:email => 'billy@example.com').and_return([@user]) controller.send(:activity_user).should == 1 end it "should find a user by first name or last name" do - @cur_user.stub!(:pref).and_return(:activity_user => 'Billy') + @cur_user.stub(:pref).and_return(:activity_user => 'Billy') controller.instance_variable_set(:@current_user, @cur_user) User.should_receive(:where).with("upper(first_name) LIKE upper('%Billy%') OR upper(last_name) LIKE upper('%Billy%')").and_return([@user]) controller.send(:activity_user).should == 1 end it "should find a user by first name and last name" do - @cur_user.stub!(:pref).and_return(:activity_user => 'Billy Elliot') + @cur_user.stub(:pref).and_return(:activity_user => 'Billy Elliot') controller.instance_variable_set(:@current_user, @cur_user) User.should_receive(:where).with("(upper(first_name) LIKE upper('%Billy%') AND upper(last_name) LIKE upper('%Elliot%')) OR (upper(first_name) LIKE upper('%Elliot%') AND upper(last_name) LIKE upper('%Billy%'))").and_return([@user]) controller.send(:activity_user).should == 1 end it "should return nil when 'all_users' is specified" do - @cur_user.stub!(:pref).and_return(:activity_user => 'all_users') + @cur_user.stub(:pref).and_return(:activity_user => 'all_users') controller.instance_variable_set(:@current_user, @cur_user) User.should_not_receive(:where) controller.send(:activity_user).should == nil diff --git a/spec/controllers/tasks_controller_spec.rb b/spec/controllers/tasks_controller_spec.rb index 0fecc48158..a35e61d810 100644 --- a/spec/controllers/tasks_controller_spec.rb +++ b/spec/controllers/tasks_controller_spec.rb @@ -9,7 +9,7 @@ def update_sidebar @task_total = { :key => :value, :pairs => :etc } - Task.stub!(:totals).and_return(@task_total) + Task.stub(:totals).and_return(@task_total) end def produce_tasks(user, view) @@ -147,7 +147,7 @@ def produce_tasks(user, view) it "should expose a new task as @task and render [new] template" do account = FactoryGirl.create(:account, :user => current_user) @task = FactoryGirl.build(:task, :user => current_user, :asset => account) - Task.stub!(:new).and_return(@task) + Task.stub(:new).and_return(@task) @bucket = Setting.unroll(:task_bucket)[1..-1] << [ "On Specific Date...", :specific_time ] @category = Setting.unroll(:task_category) @@ -268,7 +268,7 @@ def produce_tasks(user, view) it "should expose a newly created task as @task and render [create] template" do @task = FactoryGirl.build(:task, :user => current_user) - Task.stub!(:new).and_return(@task) + Task.stub(:new).and_return(@task) xhr :post, :create, :task => { :name => "Hello world" } assigns(:task).should == @task @@ -280,7 +280,7 @@ def produce_tasks(user, view) [ "", "?view=pending", "?view=assigned", "?view=completed" ].each do |view| it "should update tasks sidebar when [create] is being called from [/tasks#{view}] page" do @task = FactoryGirl.build(:task, :user => current_user) - Task.stub!(:new).and_return(@task) + Task.stub(:new).and_return(@task) request.env["HTTP_REFERER"] = "http://localhost/tasks#{view}" xhr :post, :create, :task => { :name => "Hello world" } @@ -293,7 +293,7 @@ def produce_tasks(user, view) it "should expose a newly created but unsaved task as @lead and still render [create] template" do @task = FactoryGirl.build(:task, :name => nil, :user => current_user) - Task.stub!(:new).and_return(@task) + Task.stub(:new).and_return(@task) xhr :post, :create, :task => {} assigns(:task).should == @task diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb index 55291912a5..7e5d7f9214 100644 --- a/spec/controllers/users_controller_spec.rb +++ b/spec/controllers/users_controller_spec.rb @@ -81,7 +81,7 @@ it "should expose a new user as @user and render [new] template" do @controller.should_receive(:can_signup?).and_return(true) @user = FactoryGirl.build(:user) - User.stub!(:new).and_return(@user) + User.stub(:new).and_return(@user) get :new assigns[:user].should == @user @@ -126,7 +126,7 @@ @email = @username + "@example.com" @password = "secret" @user = FactoryGirl.build(:user, :username => @username, :email => @email) - User.stub!(:new).and_return(@user) + User.stub(:new).and_return(@user) end it "exposes a newly created user as @user and redirect to profile page" do @@ -137,7 +137,7 @@ end it "should redirect to login page if user signup needs approval" do - Setting.stub!(:user_signup).and_return(:needs_approval) + Setting.stub(:user_signup).and_return(:needs_approval) post :create, :user => { :username => @username, :email => @email, :password => @password, :password_confirmation => @password } assigns[:user].should == @user @@ -149,7 +149,7 @@ describe "with invalid params" do it "assigns a newly created but unsaved user as @user and renders [new] template" do @user = FactoryGirl.build(:user, :username => "", :email => "") - User.stub!(:new).and_return(@user) + User.stub(:new).and_return(@user) post :create, :user => {} assigns[:user].should == @user @@ -261,7 +261,7 @@ # -------------------------- Fix later -------------------------------- # it "should return errors if the avatar failed to get uploaded and resized" do # @image = fixture_file_upload("spec/fixtures/rails.png", "image/png") -# @user.stub!(:save).and_return(false) # make it fail +# @user.stub(:save).and_return(false) # make it fail # xhr :put, :upload_avatar, :id => @user.id, :avatar => { :image => @image } # @user.avatar.errors.should_not be_empty @@ -292,8 +292,8 @@ describe "responding to PUT change_password" do before(:each) do require_user - @current_user_session.stub!(:unauthorized_record=).and_return(current_user) - @current_user_session.stub!(:save).and_return(current_user) + @current_user_session.stub(:unauthorized_record=).and_return(current_user) + @current_user_session.stub(:save).and_return(current_user) @user = current_user @new_password = "secret?!" end diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb index 0808ab6429..2f81f0b32c 100644 --- a/spec/helpers/application_helper_spec.rb +++ b/spec/helpers/application_helper_spec.rb @@ -14,29 +14,29 @@ describe "link_to_emails" do it "should add Bcc: if dropbox address is set" do - Setting.stub!(:email_dropbox).and_return({ :address => "drop@example.com" }) + Setting.stub(:email_dropbox).and_return({ :address => "drop@example.com" }) helper.link_to_email("hello@example.com").should == 'hello@example.com' end it "should not add Bcc: if dropbox address is not set" do - Setting.stub!(:email_dropbox).and_return({ :address => nil }) + Setting.stub(:email_dropbox).and_return({ :address => nil }) helper.link_to_email("hello@example.com").should == 'hello@example.com' end it "should truncate long emails" do - Setting.stub!(:email_dropbox).and_return({ :address => nil }) + Setting.stub(:email_dropbox).and_return({ :address => nil }) helper.link_to_email("hello@example.com", 5).should == 'he...' end it "should escape HTML entities" do - Setting.stub!(:email_dropbox).and_return({ :address => 'dr&op@example.com' }) + Setting.stub(:email_dropbox).and_return({ :address => 'dr&op@example.com' }) helper.link_to_email("hell&o@example.com").should == 'hell&o@example.com' end end it "link_to_discard" do lead = FactoryGirl.create(:lead) - controller.request.stub!(:fullpath).and_return("http://www.example.com/leads/#{lead.id}") + controller.request.stub(:fullpath).and_return("http://www.example.com/leads/#{lead.id}") link = helper.link_to_discard(lead) link.should =~ %r|leads/#{lead.id}/discard| @@ -45,26 +45,26 @@ describe "shown_on_landing_page?" do it "should return true for Ajax request made from the asset landing page" do - controller.request.stub!(:xhr?).and_return(true) - controller.request.stub!(:referer).and_return("http://www.example.com/leads/123") + controller.request.stub(:xhr?).and_return(true) + controller.request.stub(:referer).and_return("http://www.example.com/leads/123") helper.shown_on_landing_page?.should == true end it "should return true for regular request to display asset landing page" do - controller.request.stub!(:xhr?).and_return(false) - controller.request.stub!(:fullpath).and_return("http://www.example.com/leads/123") + controller.request.stub(:xhr?).and_return(false) + controller.request.stub(:fullpath).and_return("http://www.example.com/leads/123") helper.shown_on_landing_page?.should == true end it "should return false for Ajax request made from page other than the asset landing page" do - controller.request.stub!(:xhr?).and_return(true) - controller.request.stub!(:referer).and_return("http://www.example.com/leads") + controller.request.stub(:xhr?).and_return(true) + controller.request.stub(:referer).and_return("http://www.example.com/leads") helper.shown_on_landing_page?.should == false end it "should return false for regular request to display page other than asset landing page" do - controller.request.stub!(:xhr?).and_return(false) - controller.request.stub!(:fullpath).and_return("http://www.example.com/leads") + controller.request.stub(:xhr?).and_return(false) + controller.request.stub(:fullpath).and_return("http://www.example.com/leads") helper.shown_on_landing_page?.should == false end end @@ -73,8 +73,8 @@ before(:each) do @user = mock_model(User) - helper.stub!(:current_user).and_return(@user) - controller.stub!(:params).and_return({'action' => 'show', 'controller' => 'contacts'}) + helper.stub(:current_user).and_return(@user) + controller.stub(:params).and_return({'action' => 'show', 'controller' => 'contacts'}) end it "should return the contact 'show' outline stored in the user preferences" do diff --git a/spec/lib/mail_processor/base_spec.rb b/spec/lib/mail_processor/base_spec.rb index 2933e42307..d94ef88bb6 100644 --- a/spec/lib/mail_processor/base_spec.rb +++ b/spec/lib/mail_processor/base_spec.rb @@ -116,12 +116,12 @@ end it "should be valid email if its contents type is text/plain" do - @email.stub!(:content_type).and_return("text/plain") + @email.stub(:content_type).and_return("text/plain") @crawler.send(:is_valid?, @email).should == true end it "should be invalid email if its contents type is not text/plain" do - @email.stub!(:content_type).and_return("text/html") + @email.stub(:content_type).and_return("text/html") @crawler.send(:is_valid?, @email).should == false end end @@ -131,7 +131,7 @@ before(:each) do @from = [ "Aaron@Example.Com", "Ben@Example.com" ] @email = mock - @email.stub!(:from).and_return(@from) + @email.stub(:from).and_return(@from) end it "should find non-suspended user that matches From: field" do diff --git a/spec/lib/mail_processor/dropbox_spec.rb b/spec/lib/mail_processor/dropbox_spec.rb index 646742cec3..85206fea64 100644 --- a/spec/lib/mail_processor/dropbox_spec.rb +++ b/spec/lib/mail_processor/dropbox_spec.rb @@ -288,17 +288,17 @@ describe "'access'" do it "should be 'Private' if default setting is 'Private'" do - Setting.stub!(:default_access).and_return('Private') + Setting.stub(:default_access).and_return('Private') @crawler.send(:default_access).should == "Private" end it "should be 'Public' if default setting is 'Public'" do - Setting.stub!(:default_access).and_return('Public') + Setting.stub(:default_access).and_return('Public') @crawler.send(:default_access).should == "Public" end it "should be 'Private' if default setting is 'Shared'" do - Setting.stub!(:default_access).and_return('Shared') + Setting.stub(:default_access).and_return('Shared') @crawler.send(:default_access).should == "Private" end diff --git a/spec/models/fields/custom_field_date_pair_spec.rb b/spec/models/fields/custom_field_date_pair_spec.rb index 2b52e14cde..eae03bcd36 100644 --- a/spec/models/fields/custom_field_date_pair_spec.rb +++ b/spec/models/fields/custom_field_date_pair_spec.rb @@ -12,7 +12,7 @@ before(:each) do @from = CustomFieldDatePair.new(:name => 'cf_event_from') @to = CustomFieldDatePair.new(:name => 'cf_event_to') - @from.stub!(:paired_with).and_return(@to) + @from.stub(:paired_with).and_return(@to) @today = Date.today @today_str = @today.strftime(I18n.t("date.formats.mmddyy")) end @@ -44,7 +44,7 @@ before(:each) do @from = CustomFieldDatePair.new(:name => 'cf_event_from') @to = CustomFieldDatePair.new(:name => 'cf_event_to', :pair_id => 1) - CustomFieldPair.stub!(:find).and_return(@from) + CustomFieldPair.stub(:find).and_return(@from) @today = Date.today @today_str = @today.strftime(I18n.t("date.formats.mmddyy")) end diff --git a/spec/models/fields/custom_field_spec.rb b/spec/models/fields/custom_field_spec.rb index 8a13eecf18..fba23e57df 100644 --- a/spec/models/fields/custom_field_spec.rb +++ b/spec/models/fields/custom_field_spec.rb @@ -49,7 +49,7 @@ columns = [] %w(cf_test_field cf_test_field_2 cf_test_field_3 cf_test_field_4).each do |field| c.send(:generate_column_name).should == field - c.stub!(:klass_column_names).and_return( columns << field ) + c.stub(:klass_column_names).and_return( columns << field ) end end diff --git a/spec/models/fields/field_spec.rb b/spec/models/fields/field_spec.rb index c8e0ac8846..da1cca092f 100644 --- a/spec/models/fields/field_spec.rb +++ b/spec/models/fields/field_spec.rb @@ -60,7 +60,7 @@ ["checkbox", 1, "yes"], ["date", DateTime.new(2011,4,19), DateTime.new(2011,4,19).strftime(I18n.t("date.formats.mmddyy")) ]].each do |as, value, expected| field.as = as - object.stub!(field.name).and_return(value) + object.stub(field.name).and_return(value) field.render_value(object).should == expected end end diff --git a/spec/shared/models.rb b/spec/shared/models.rb index 66d3cb4de8..3ab05db8bd 100644 --- a/spec/shared/models.rb +++ b/spec/shared/models.rb @@ -5,7 +5,7 @@ #------------------------------------------------------------------------------ require "cancan/matchers" -shared_examples "exportable" do +shared_examples_for "exportable" do it "Model#export returns all records with extra attributes added" do # User/assignee for the second record has no first/last name. diff --git a/spec/support/auth_macros.rb b/spec/support/auth_macros.rb index 8a7b6db78a..a1d8b0a218 100755 --- a/spec/support/auth_macros.rb +++ b/spec/support/auth_macros.rb @@ -17,8 +17,8 @@ def activate_authlogic #---------------------------------------------------------------------------- def login(user_stubs = {}, session_stubs = {}) User.current_user = @current_user = FactoryGirl.create(:user, user_stubs) - @current_user_session = mock(Authentication, {:record => current_user}.merge(session_stubs)) - Authentication.stub!(:find).and_return(@current_user_session) + @current_user_session = double(Authentication, {:record => current_user}.merge(session_stubs)) + Authentication.stub(:find).and_return(@current_user_session) #set_timezone end alias :require_user :login @@ -33,7 +33,7 @@ def login_and_assign(user_stubs = {}, session_stubs = {}) def logout @current_user = nil @current_user_session = nil - Authentication.stub!(:find).and_return(nil) + Authentication.stub(:find).and_return(nil) end alias :require_no_user :logout diff --git a/spec/support/mail_processor_mocks.rb b/spec/support/mail_processor_mocks.rb index df3501669a..97db14d2cb 100644 --- a/spec/support/mail_processor_mocks.rb +++ b/spec/support/mail_processor_mocks.rb @@ -8,28 +8,28 @@ def mock_imap @imap = mock @settings = @crawler.instance_variable_get("@settings") @settings[:address] = @mock_address - Net::IMAP.stub!(:new).with(@settings[:server], @settings[:port], @settings[:ssl]).and_return(@imap) + Net::IMAP.stub(:new).with(@settings[:server], @settings[:port], @settings[:ssl]).and_return(@imap) end def mock_connect mock_imap - @imap.stub!(:login).and_return(true) - @imap.stub!(:select).and_return(true) + @imap.stub(:login).and_return(true) + @imap.stub(:select).and_return(true) end def mock_disconnect - @imap.stub!(:disconnected?).and_return(false) - @imap.stub!(:logout).and_return(true) - @imap.stub!(:disconnect).and_return(true) + @imap.stub(:disconnected?).and_return(false) + @imap.stub(:logout).and_return(true) + @imap.stub(:disconnect).and_return(true) end def mock_message(body) @fetch_data = mock - @fetch_data.stub!(:attr).and_return("RFC822" => body) - @imap.stub!(:uid_search).and_return([ :uid ]) - @imap.stub!(:uid_fetch).and_return([ @fetch_data ]) - @imap.stub!(:uid_copy).and_return(true) - @imap.stub!(:uid_store).and_return(true) + @fetch_data.stub(:attr).and_return("RFC822" => body) + @imap.stub(:uid_search).and_return([ :uid ]) + @imap.stub(:uid_fetch).and_return([ @fetch_data ]) + @imap.stub(:uid_copy).and_return(true) + @imap.stub(:uid_store).and_return(true) body end end diff --git a/spec/views/admin/field_groups/create.js.haml_spec.rb b/spec/views/admin/field_groups/create.js.haml_spec.rb index cf9e515d42..a943b9726d 100644 --- a/spec/views/admin/field_groups/create.js.haml_spec.rb +++ b/spec/views/admin/field_groups/create.js.haml_spec.rb @@ -22,7 +22,7 @@ end it "renders javascript for invalid field group" do - field_group.stub!(:valid?).and_return(false) + field_group.stub(:valid?).and_return(false) render view.should render_template("admin/field_groups/create") rendered.should have_text("effect(\"shake\", { duration:250, distance: 6 });") diff --git a/spec/views/admin/field_groups/destroy.js.haml_spec.rb b/spec/views/admin/field_groups/destroy.js.haml_spec.rb index 6f088d10ff..1fddaa5bf9 100644 --- a/spec/views/admin/field_groups/destroy.js.haml_spec.rb +++ b/spec/views/admin/field_groups/destroy.js.haml_spec.rb @@ -15,7 +15,7 @@ let(:field_group) { FactoryGirl.build(:field_group) } it "renders destroy javascript" do - field_group.stub!(:destroyed?).and_return(true) + field_group.stub(:destroyed?).and_return(true) render view.should render_template("admin/field_groups/destroy") rendered.should have_text("slideUp(250)") diff --git a/spec/views/admin/field_groups/update.js.haml_spec.rb b/spec/views/admin/field_groups/update.js.haml_spec.rb index 4340bfc035..745b5ddc46 100644 --- a/spec/views/admin/field_groups/update.js.haml_spec.rb +++ b/spec/views/admin/field_groups/update.js.haml_spec.rb @@ -22,7 +22,7 @@ end it "renders javascript for invalid field group" do - field_group.errors.stub!(:empty?).and_return(false) + field_group.errors.stub(:empty?).and_return(false) render rendered.should have_text("jQuery('##{dom_id(field_group, :edit)}').effect('shake', { distance:5 }, 250);") end diff --git a/spec/views/users/upload_avatar.js.haml_spec.rb b/spec/views/users/upload_avatar.js.haml_spec.rb index 1028f64fed..ce264f8a67 100644 --- a/spec/views/users/upload_avatar.js.haml_spec.rb +++ b/spec/views/users/upload_avatar.js.haml_spec.rb @@ -15,7 +15,7 @@ describe "no errors:" do before do @avatar = FactoryGirl.create(:avatar, :entity => current_user) - current_user.stub!(:avatar).and_return(@avatar) + current_user.stub(:avatar).and_return(@avatar) assign(:user, @user = current_user) end @@ -31,7 +31,7 @@ before do @avatar = FactoryGirl.create(:avatar, :entity => current_user) @avatar.errors.add(:image, "error") - current_user.stub!(:avatar).and_return(@avatar) + current_user.stub(:avatar).and_return(@avatar) assign(:user, @user = current_user) end From 229d713f89f93bfdef0b8a52d65ffd6d78fd3731 Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Tue, 13 Aug 2013 12:07:58 +0800 Subject: [PATCH 024/213] Updated specs to rspec 2.14 --- custom_plan.rb | 11 ++ .../admin/users_controller_spec.rb | 2 +- .../applications_controller_spec.rb | 4 +- .../authentications_controller_spec.rb | 2 +- .../entities/accounts_controller_spec.rb | 4 +- .../entities/contacts_controller_spec.rb | 4 +- .../entities/leads_controller_spec.rb | 4 +- .../entities/opportunities_controller_spec.rb | 6 +- spec/controllers/home_controller_spec.rb | 4 +- spec/controllers/tasks_controller_spec.rb | 4 +- spec/controllers/users_controller_spec.rb | 4 +- spec/lib/fields_spec.rb | 58 +++---- spec/lib/mail_processor/base_spec.rb | 8 +- spec/models/entities/opportunity_spec.rb | 2 +- .../fields/custom_field_date_pair_spec.rb | 24 +-- spec/models/fields/custom_field_pair_spec.rb | 26 +-- spec/models/fields/custom_field_spec.rb | 8 +- spec/models/fields/field_spec.rb | 2 +- spec/models/observers/entity_observer_spec.rb | 4 +- spec/models/users/user_spec.rb | 10 +- spec/shared/controllers.rb | 152 +++++++++--------- spec/support/mail_processor_mocks.rb | 4 +- zeus.json | 3 +- 23 files changed, 180 insertions(+), 170 deletions(-) create mode 100644 custom_plan.rb diff --git a/custom_plan.rb b/custom_plan.rb new file mode 100644 index 0000000000..3325564099 --- /dev/null +++ b/custom_plan.rb @@ -0,0 +1,11 @@ +require 'zeus/rails' + +class CustomPlan < Zeus::Rails + + # def my_custom_command + # # see https://github.com/burke/zeus/blob/master/docs/ruby/modifying.md + # end + +end + +Zeus.plan = CustomPlan.new diff --git a/spec/controllers/admin/users_controller_spec.rb b/spec/controllers/admin/users_controller_spec.rb index 8c6eac6220..f03aae059a 100644 --- a/spec/controllers/admin/users_controller_spec.rb +++ b/spec/controllers/admin/users_controller_spec.rb @@ -241,7 +241,7 @@ xhr :delete, :destroy, :id => @user.id flash[:warning].should_not == nil - lambda { User.find(@user) }.should_not raise_error(ActiveRecord::RecordNotFound) + expect { User.find(@user) }.not_to raise_error() response.should render_template("admin/users/destroy") end end diff --git a/spec/controllers/applications_controller_spec.rb b/spec/controllers/applications_controller_spec.rb index fcdeced037..f438d14002 100644 --- a/spec/controllers/applications_controller_spec.rb +++ b/spec/controllers/applications_controller_spec.rb @@ -23,7 +23,7 @@ it "should return [6, 9] when related is 'campaigns/7'" do controller.stub(:controller_name).and_return('opportunities') - campaign = mock(Campaign, :opportunities => [mock(:id => 6), mock(:id => 9)]) + campaign = double(Campaign, :opportunities => [double(:id => 6), double(:id => 9)]) Campaign.should_receive(:find_by_id).with('7').and_return(campaign) controller.send(:auto_complete_ids_to_exclude, 'campaigns/7').sort.should == [6, 9] end @@ -35,7 +35,7 @@ it "should return [] when related object association is not found" do controller.stub(:controller_name).and_return('not_a_method_that_exists') - campaign = mock(Campaign) + campaign = double(Campaign) Campaign.should_receive(:find_by_id).with('7').and_return(campaign) controller.send(:auto_complete_ids_to_exclude, 'campaigns/7').should == [] end diff --git a/spec/controllers/authentications_controller_spec.rb b/spec/controllers/authentications_controller_spec.rb index 6dd7278dad..60ba812a71 100644 --- a/spec/controllers/authentications_controller_spec.rb +++ b/spec/controllers/authentications_controller_spec.rb @@ -63,7 +63,7 @@ describe "POST authentications" do before(:each) do @login = { :username => "user", :password => "pass", :remember_me => "0" } - @authentication = mock(Authentication, @login) + @authentication = double(Authentication, @login) end describe "successful authentication " do diff --git a/spec/controllers/entities/accounts_controller_spec.rb b/spec/controllers/entities/accounts_controller_spec.rb index 7261238e62..e2ea9807d3 100644 --- a/spec/controllers/entities/accounts_controller_spec.rb +++ b/spec/controllers/entities/accounts_controller_spec.rb @@ -96,7 +96,7 @@ def get_data_for_sidebar describe "with mime type of JSON" do it "should render all accounts as json" do - @controller.should_receive(:get_accounts).and_return(accounts = mock("Array of Accounts")) + @controller.should_receive(:get_accounts).and_return(accounts = double("Array of Accounts")) accounts.should_receive(:to_json).and_return("generated JSON") request.env["HTTP_ACCEPT"] = "application/json" @@ -107,7 +107,7 @@ def get_data_for_sidebar describe "with mime type of XML" do it "should render all accounts as xml" do - @controller.should_receive(:get_accounts).and_return(accounts = mock("Array of Accounts")) + @controller.should_receive(:get_accounts).and_return(accounts = double("Array of Accounts")) accounts.should_receive(:to_xml).and_return("generated XML") request.env["HTTP_ACCEPT"] = "application/xml" diff --git a/spec/controllers/entities/contacts_controller_spec.rb b/spec/controllers/entities/contacts_controller_spec.rb index 60a024aa40..347d1ea396 100644 --- a/spec/controllers/entities/contacts_controller_spec.rb +++ b/spec/controllers/entities/contacts_controller_spec.rb @@ -70,7 +70,7 @@ describe "with mime type of JSON" do it "should render all contacts as JSON" do - @controller.should_receive(:get_contacts).and_return(contacts = mock("Array of Contacts")) + @controller.should_receive(:get_contacts).and_return(contacts = double("Array of Contacts")) contacts.should_receive(:to_json).and_return("generated JSON") request.env["HTTP_ACCEPT"] = "application/json" @@ -81,7 +81,7 @@ describe "with mime type of XML" do it "should render all contacts as xml" do - @controller.should_receive(:get_contacts).and_return(contacts = mock("Array of Contacts")) + @controller.should_receive(:get_contacts).and_return(contacts = double("Array of Contacts")) contacts.should_receive(:to_xml).and_return("generated XML") request.env["HTTP_ACCEPT"] = "application/xml" diff --git a/spec/controllers/entities/leads_controller_spec.rb b/spec/controllers/entities/leads_controller_spec.rb index 086338c64c..331f5962f0 100644 --- a/spec/controllers/entities/leads_controller_spec.rb +++ b/spec/controllers/entities/leads_controller_spec.rb @@ -95,7 +95,7 @@ describe "with mime type of JSON" do it "should render all leads as JSON" do - @controller.should_receive(:get_leads).and_return(leads = mock("Array of Leads")) + @controller.should_receive(:get_leads).and_return(leads = double("Array of Leads")) leads.should_receive(:to_json).and_return("generated JSON") request.env["HTTP_ACCEPT"] = "application/json" @@ -106,7 +106,7 @@ describe "with mime type of XML" do it "should render all leads as xml" do - @controller.should_receive(:get_leads).and_return(leads = mock("Array of Leads")) + @controller.should_receive(:get_leads).and_return(leads = double("Array of Leads")) leads.should_receive(:to_xml).and_return("generated XML") request.env["HTTP_ACCEPT"] = "application/xml" diff --git a/spec/controllers/entities/opportunities_controller_spec.rb b/spec/controllers/entities/opportunities_controller_spec.rb index af8e6d6a0f..5b619a50c2 100644 --- a/spec/controllers/entities/opportunities_controller_spec.rb +++ b/spec/controllers/entities/opportunities_controller_spec.rb @@ -99,7 +99,7 @@ def get_data_for_sidebar describe "with mime type of JSON" do it "should render all opportunities as JSON" do - @controller.should_receive(:get_opportunities).and_return(opportunities = mock("Array of Opportunities")) + @controller.should_receive(:get_opportunities).and_return(opportunities = double("Array of Opportunities")) opportunities.should_receive(:to_json).and_return("generated JSON") request.env["HTTP_ACCEPT"] = "application/json" @@ -110,7 +110,7 @@ def get_data_for_sidebar describe "with mime type of JSON" do it "should render all opportunities as JSON" do - @controller.should_receive(:get_opportunities).and_return(opportunities = mock("Array of Opportunities")) + @controller.should_receive(:get_opportunities).and_return(opportunities = double("Array of Opportunities")) opportunities.should_receive(:to_json).and_return("generated JSON") request.env["HTTP_ACCEPT"] = "application/json" @@ -121,7 +121,7 @@ def get_data_for_sidebar describe "with mime type of XML" do it "should render all opportunities as xml" do - @controller.should_receive(:get_opportunities).and_return(opportunities = mock("Array of Opportunities")) + @controller.should_receive(:get_opportunities).and_return(opportunities = double("Array of Opportunities")) opportunities.should_receive(:to_xml).and_return("generated XML") request.env["HTTP_ACCEPT"] = "application/xml" diff --git a/spec/controllers/home_controller_spec.rb b/spec/controllers/home_controller_spec.rb index 756bb273d5..52e97b049d 100644 --- a/spec/controllers/home_controller_spec.rb +++ b/spec/controllers/home_controller_spec.rb @@ -157,8 +157,8 @@ describe "activity_user" do before(:each) do - @user = mock(User, :id => 1, :is_a? => true) - @cur_user = mock(User) + @user = double(User, :id => 1, :is_a? => true) + @cur_user = double(User) end it "should find a user by email" do diff --git a/spec/controllers/tasks_controller_spec.rb b/spec/controllers/tasks_controller_spec.rb index a35e61d810..4229fc5f90 100644 --- a/spec/controllers/tasks_controller_spec.rb +++ b/spec/controllers/tasks_controller_spec.rb @@ -120,7 +120,7 @@ def produce_tasks(user, view) TASK_STATUSES.each do |view| it "should render the requested task as JSON for #{view} view" do - Task.stub_chain(:tracked_by, :find).and_return(task = mock("Task")) + Task.stub_chain(:tracked_by, :find).and_return(task = double("Task")) task.should_receive(:to_json).and_return("generated JSON") request.env["HTTP_ACCEPT"] = "application/json" @@ -129,7 +129,7 @@ def produce_tasks(user, view) end it "should render the requested task as xml for #{view} view" do - Task.stub_chain(:tracked_by, :find).and_return(task = mock("Task")) + Task.stub_chain(:tracked_by, :find).and_return(task = double("Task")) task.should_receive(:to_xml).and_return("generated XML") request.env["HTTP_ACCEPT"] = "application/xml" diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb index 7e5d7f9214..2d46352ec6 100644 --- a/spec/controllers/users_controller_spec.rb +++ b/spec/controllers/users_controller_spec.rb @@ -35,7 +35,7 @@ end it "should render the requested user as JSON" do - User.should_receive(:find).and_return(user = mock("User")) + User.should_receive(:find).and_return(user = double("User")) user.should_receive(:to_json).and_return("generated JSON") get :show, :id => 42 @@ -56,7 +56,7 @@ end it "should render the requested user as XML" do - User.should_receive(:find).and_return(user = mock("User")) + User.should_receive(:find).and_return(user = double("User")) user.should_receive(:to_xml).and_return("generated XML") get :show, :id => 42 diff --git a/spec/lib/fields_spec.rb b/spec/lib/fields_spec.rb index 7477b26666..3bd56e5d37 100644 --- a/spec/lib/fields_spec.rb +++ b/spec/lib/fields_spec.rb @@ -21,82 +21,82 @@ class Bar it do Foo.new.should respond_to(:field_groups) end - + it do Foo.should respond_to(:serialize_custom_fields!) end - + it do Foo.should respond_to(:fields) end - + it "calling has_fields should invoke serialize_custom_fields!" do Bar.should_receive(:serialize_custom_fields!) Bar.has_fields end - + describe "field_groups" do - + it "should call FieldGroup" do ActiveRecord::Base.connection.should_receive(:table_exists?).with('field_groups').and_return(true) - dummy_scope = mock + dummy_scope = double dummy_scope.should_receive(:order).with(:position) FieldGroup.should_receive(:where).and_return(dummy_scope) Foo.new.field_groups end - + it "should not call FieldGroup if table doesn't exist (migrations not yet run)" do ActiveRecord::Base.connection.should_receive(:table_exists?).with('field_groups').and_return(false) Foo.new.field_groups.should == [] end - + end - + describe "fields" do - + before(:each) do - @f1 = mock(Field) - @f2 = mock(Field) - @f3 = mock(Field) - @field_groups = [mock(FieldGroup, :fields => [@f1, @f2]), mock(FieldGroup, :fields => [@f3])] + @f1 = double(Field) + @f2 = double(Field) + @f3 = double(Field) + @field_groups = [double(FieldGroup, :fields => [@f1, @f2]), double(FieldGroup, :fields => [@f3])] end - + it "should convert field_groups into a flattened list of fields" do Foo.should_receive(:field_groups).and_return(@field_groups) Foo.fields.should == [@f1, @f2, @f3] end - + end - + describe "serialize_custom_fields!" do - + before(:each) do - @f1 = mock(Field, :as => 'check_boxes', :name => 'field1') - @f2 = mock(Field, :as => 'date', :name => 'field2') + @f1 = double(Field, :as => 'check_boxes', :name => 'field1') + @f2 = double(Field, :as => 'date', :name => 'field2') end - + it "should serialize checkbox fields as Array" do Foo.stub(:serialized_attributes).and_return( {:field1 => @f1, :field2 => @f2} ) Foo.should_receive(:fields).and_return([@f1, @f2]) Foo.should_receive(:serialize).with(:field1, Array) Foo.serialize_custom_fields! end - + end - + it "should validate custom fields" do foo = Foo.new foo.should_receive(:custom_fields_validator) foo.should be_valid end - + describe "custom_fields_validator" do - + before(:each) do - @f1 = mock(Field) - @field_groups = [ mock(FieldGroup, :fields => [@f1]) ] + @f1 = double(Field) + @field_groups = [ double(FieldGroup, :fields => [@f1]) ] end - + it "should call custom_validator on each custom field" do foo = Foo.new @f1.should_receive(:custom_validator).with(foo) @@ -105,5 +105,5 @@ class Bar end end - + end diff --git a/spec/lib/mail_processor/base_spec.rb b/spec/lib/mail_processor/base_spec.rb index d94ef88bb6..1c5aa56d17 100644 --- a/spec/lib/mail_processor/base_spec.rb +++ b/spec/lib/mail_processor/base_spec.rb @@ -67,7 +67,7 @@ describe "Discarding a message" do before(:each) do mock_connect - @uid = mock + @uid = double @crawler.send(:connect!) end @@ -90,7 +90,7 @@ describe "Archiving a message" do before(:each) do mock_connect - @uid = mock + @uid = double @crawler.send(:connect!) end @@ -112,7 +112,7 @@ #------------------------------------------------------------------------------ describe "Validating email" do before(:each) do - @email = mock + @email = double end it "should be valid email if its contents type is text/plain" do @@ -130,7 +130,7 @@ describe "Finding email sender among users" do before(:each) do @from = [ "Aaron@Example.Com", "Ben@Example.com" ] - @email = mock + @email = double @email.stub(:from).and_return(@from) end diff --git a/spec/models/entities/opportunity_spec.rb b/spec/models/entities/opportunity_spec.rb index dbc80c7314..62f4179c1f 100644 --- a/spec/models/entities/opportunity_spec.rb +++ b/spec/models/entities/opportunity_spec.rb @@ -37,7 +37,7 @@ it "should be possible to create opportunity with the same name" do first = FactoryGirl.create(:opportunity, :name => "Hello", :user => current_user) - lambda { FactoryGirl.create(:opportunity, :name => "Hello", :user => current_user) }.should_not raise_error(ActiveRecord::RecordInvalid) + expect { FactoryGirl.create(:opportunity, :name => "Hello", :user => current_user) }.to_not raise_error() end it "have a default stage" do diff --git a/spec/models/fields/custom_field_date_pair_spec.rb b/spec/models/fields/custom_field_date_pair_spec.rb index eae03bcd36..306df37ab7 100644 --- a/spec/models/fields/custom_field_date_pair_spec.rb +++ b/spec/models/fields/custom_field_date_pair_spec.rb @@ -18,22 +18,22 @@ end it "should be from..." do - foo = mock(:cf_event_from => @today, :cf_event_to => nil) + foo = double(:cf_event_from => @today, :cf_event_to => nil) @from.render_value(foo).should == "From #{@today_str}" end it "should be until..." do - foo = mock(:cf_event_from => nil, :cf_event_to => @today) + foo = double(:cf_event_from => nil, :cf_event_to => @today) @from.render_value(foo).should == "Until #{@today_str}" end it "should be from ... to" do - foo = mock(:cf_event_from => @today, :cf_event_to => @today) + foo = double(:cf_event_from => @today, :cf_event_to => @today) @from.render_value(foo).should == "From #{@today_str} to #{@today_str}" end it "should be empty string" do - foo = mock(:cf_event_from => nil, :cf_event_to => nil) + foo = double(:cf_event_from => nil, :cf_event_to => nil) @from.render_value(foo).should == "" end @@ -50,32 +50,32 @@ end it "when from is nil it should be valid" do - foo = mock(:cf_event_from => nil, :cf_event_to => @today) + foo = double(:cf_event_from => nil, :cf_event_to => @today) foo.should_not_receive(:errors) @to.custom_validator(foo) end it "when to is nil it should be valid" do - foo = mock(:cf_event_from => @today, :cf_event_to => nil) + foo = double(:cf_event_from => @today, :cf_event_to => nil) foo.should_not_receive(:errors) @to.custom_validator(foo) end it "when from <= to it should be valid" do - foo = mock(:cf_event_from => @today, :cf_event_to => @today) + foo = double(:cf_event_from => @today, :cf_event_to => @today) foo.should_not_receive(:errors) @to.custom_validator(foo) end it "when from > to it should not be valid" do - foo = mock(:cf_event_from => @today, :cf_event_to => @today - 1.day) - err = mock(:errors); err.stub(:add) + foo = double(:cf_event_from => @today, :cf_event_to => @today - 1.day) + err = double(:errors); err.stub(:add) foo.should_receive(:errors).and_return(err) @to.custom_validator(foo) end it "should ignore validation when called on from" do - foo = mock(:cf_event_from => @today, :cf_event_to => @today - 1.day) + foo = double(:cf_event_from => @today, :cf_event_to => @today - 1.day) foo.should_not_receive(:errors) CustomFieldPair.should_not_receive(:find) @from.custom_validator(foo) @@ -83,8 +83,8 @@ it "should call custom field validation on super class" do from = CustomFieldDatePair.new(:name => 'cf_event_from', :required => true) - foo = mock(:cf_event_from => nil) - err = mock(:errors); err.stub(:add) + foo = double(:cf_event_from => nil) + err = double(:errors); err.stub(:add) foo.should_receive(:errors).and_return(err) from.custom_validator(foo) end diff --git a/spec/models/fields/custom_field_pair_spec.rb b/spec/models/fields/custom_field_pair_spec.rb index 0b6c03dd42..48fa54857c 100644 --- a/spec/models/fields/custom_field_pair_spec.rb +++ b/spec/models/fields/custom_field_pair_spec.rb @@ -13,31 +13,31 @@ class CustomFieldFooPair it "should respond to pair" do CustomFieldPair.new.should respond_to(:pair) end - + describe "create_pair" do - + before(:each) do @field = {'as' => 'foopair', 'field_group_id' => 1, 'label' => 'Event'} @pair1 = {'name' => 'pair1'} @pair2 = {'name' => 'pair2'} @params = { 'field' => @field, 'pair' => {'0' => @pair1, '1' => @pair2} } end - + it "should create the pair" do params1 = @field.merge(@pair1) - foo1 = mock(:id => 3, :required => true, :disabled => 'false') + foo1 = double(:id => 3, :required => true, :disabled => 'false') CustomFieldFooPair.should_receive(:create).with( params1 ).and_return(foo1) params2 = @field.merge(@pair2).merge('pair_id' => 3, 'required' => true, 'disabled' => 'false') - foo2 = mock(:id => 5) + foo2 = double(:id => 5) CustomFieldFooPair.should_receive(:create).with( params2 ).and_return(foo2) CustomFieldPair.create_pair(@params).should == [foo1, foo2] end - + end describe "update_pair" do - + before(:each) do @field = {'as' => 'foopair', 'field_group_id' => 1, 'label' => 'Event'} @pair1 = {'name' => 'pair1'} @@ -46,9 +46,9 @@ class CustomFieldFooPair end it "should update the pair" do - foo1 = mock(:required => true, :disabled => 'false') + foo1 = double(:required => true, :disabled => 'false') foo1.should_receive(:update_attributes).with( @field.merge(@pair1) ) - foo2 = mock + foo2 = double foo2.should_receive(:update_attributes).with( @field.merge(@pair2).merge('required' => true, 'disabled' => 'false') ) foo1.should_receive(:paired_with).and_return(foo2) CustomFieldPair.should_receive(:find).with('3').and_return(foo1) @@ -57,19 +57,19 @@ class CustomFieldFooPair end end - + describe "paired_with" do - + before(:each) do @field1 = CustomFieldDatePair.new(:name => 'cf_event_from') @field2 = CustomFieldDatePair.new(:name => 'cf_event_to') end - + it "should return the 2nd field" do @field1.should_receive(:pair).and_return(@field2) @field1.paired_with.should == @field2 end - + it "should return the 1st field" do @field2.should_receive(:pair).and_return(nil) @field2.should_receive(:id).and_return(1) diff --git a/spec/models/fields/custom_field_spec.rb b/spec/models/fields/custom_field_spec.rb index fba23e57df..61792bcbd7 100644 --- a/spec/models/fields/custom_field_spec.rb +++ b/spec/models/fields/custom_field_spec.rb @@ -112,16 +112,16 @@ it "should have errors if custom field is required" do event = CustomField.new(:name => 'cf_event', :required => true) - foo = mock(:cf_event => nil) - err = mock(:errors); err.stub(:add) + foo = double(:cf_event => nil) + err = double(:errors); err.stub(:add) foo.should_receive(:errors).and_return(err) event.custom_validator(foo) end it "should have errors if custom field is longer than maxlength" do event = CustomField.new(:name => 'cf_event', :maxlength => 5) - foo = mock(:cf_event => "This is too long") - err = mock(:errors); err.stub(:add) + foo = double(:cf_event => "This is too long") + err = double(:errors); err.stub(:add) foo.should_receive(:errors).and_return(err) event.custom_validator(foo) end diff --git a/spec/models/fields/field_spec.rb b/spec/models/fields/field_spec.rb index da1cca092f..6c7e8d2d7f 100644 --- a/spec/models/fields/field_spec.rb +++ b/spec/models/fields/field_spec.rb @@ -52,7 +52,7 @@ :label => "Availability", :name => "availability" ) - object = mock('Object') + object = double('Object') # as | value | expected [["check_boxes", [1, 2, 3], "1, 2
3"], diff --git a/spec/models/observers/entity_observer_spec.rb b/spec/models/observers/entity_observer_spec.rb index 8b7783cbd8..b0b5f4efec 100644 --- a/spec/models/observers/entity_observer_spec.rb +++ b/spec/models/observers/entity_observer_spec.rb @@ -11,7 +11,7 @@ let(:assignee) { FactoryGirl.create(:user) } let(:assigner) { FactoryGirl.create(:user) } let!(:entity) { FactoryGirl.build(entity_type, :user => assigner, :assignee => assignee) } - let(:mail) { mock('mail', :deliver => true) } + let(:mail) { double('mail', :deliver => true) } before :each do PaperTrail.stub(:whodunnit).and_return(assigner) @@ -40,7 +40,7 @@ let(:assignee) { FactoryGirl.create(:user) } let(:assigner) { FactoryGirl.create(:user) } let!(:entity) { FactoryGirl.create(entity_type, :user => FactoryGirl.create(:user)) } - let(:mail) { mock('mail', :deliver => true) } + let(:mail) { double('mail', :deliver => true) } before :each do PaperTrail.stub(:whodunnit).and_return(assigner) diff --git a/spec/models/users/user_spec.rb b/spec/models/users/user_spec.rb index 79007c20a2..bf27aa8e91 100644 --- a/spec/models/users/user_spec.rb +++ b/spec/models/users/user_spec.rb @@ -60,14 +60,14 @@ it "should not destroy the user if she owns #{asset}" do FactoryGirl.create(asset, :user => @user) @user.destroy - lambda { User.find(@user) }.should_not raise_error(ActiveRecord::RecordNotFound) + expect { User.find(@user) }.to_not raise_error() @user.destroyed?.should == false end it "should not destroy the user if she has #{asset} assigned" do FactoryGirl.create(asset, :assignee => @user) @user.destroy - lambda { User.find(@user) }.should_not raise_error(ActiveRecord::RecordNotFound) + expect { User.find(@user) }.to_not raise_error() @user.destroyed?.should == false end end @@ -77,20 +77,20 @@ account = FactoryGirl.create(:account, :user => current_user) FactoryGirl.create(:comment, :user => @user, :commentable => account) @user.destroy - lambda { User.find(@user) }.should_not raise_error(ActiveRecord::RecordNotFound) + expect { User.find(@user) }.to_not raise_error() @user.destroyed?.should == false end it "should not destroy the current user" do login current_user.destroy - lambda { current_user.reload }.should_not raise_error(ActiveRecord::RecordNotFound) + expect { current_user.reload }.to_not raise_error() current_user.should_not be_destroyed end it "should destroy the user" do @user.destroy - lambda { User.find(@user) }.should raise_error(ActiveRecord::RecordNotFound) + expect { User.find(@user) }.to raise_error(ActiveRecord::RecordNotFound) @user.should be_destroyed end diff --git a/spec/shared/controllers.rb b/spec/shared/controllers.rb index 56e60ed84e..176da4139a 100644 --- a/spec/shared/controllers.rb +++ b/spec/shared/controllers.rb @@ -3,103 +3,101 @@ # Fat Free CRM is freely distributable under the terms of MIT license. # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php #------------------------------------------------------------------------------ -module SharedControllerSpecs - shared_examples "auto complete" do - before(:each) do - @query = "Hello" - end +shared_examples "auto complete" do + before(:each) do + @query = "Hello" + end - it "should do the search and find records that match autocomplete query" do - post :auto_complete, :auto_complete_query => @query - assigns[:query].should == @query - assigns[:auto_complete].should == @auto_complete_matches # Each controller must define it. - end + it "should do the search and find records that match autocomplete query" do + post :auto_complete, :auto_complete_query => @query + assigns[:query].should == @query + assigns[:auto_complete].should == @auto_complete_matches # Each controller must define it. + end - it "should save current autocomplete controller in a session" do - post :auto_complete, :auto_complete_query => @query + it "should save current autocomplete controller in a session" do + post :auto_complete, :auto_complete_query => @query - # We don't save Admin/Users autocomplete controller in a session since Users are not - # exposed through the Jumpbox. - unless controller.class.to_s.starts_with?("Admin::") - session[:auto_complete].should == @controller.controller_name.to_sym - end + # We don't save Admin/Users autocomplete controller in a session since Users are not + # exposed through the Jumpbox. + unless controller.class.to_s.starts_with?("Admin::") + session[:auto_complete].should == @controller.controller_name.to_sym end + end - it "should render application/_auto_complete template" do - post :auto_complete, :auto_complete_query => @query - response.should render_template("application/_auto_complete") - end + it "should render application/_auto_complete template" do + post :auto_complete, :auto_complete_query => @query + response.should render_template("application/_auto_complete") end +end - shared_examples "attach" do - it "should attach existing asset to the parent asset of different type" do - xhr :put, :attach, :id => @model.id, :assets => @attachment.class.name.tableize, :asset_id => @attachment.id - @model.send(@attachment.class.name.tableize).should include(@attachment) - assigns[:attachment].should == @attachment - assigns[:attached].should == [ @attachment ] - if @model.is_a?(Campaign) && (@attachment.is_a?(Lead) || @attachment.is_a?(Opportunity)) - assigns[:campaign].should == @attachment.reload.campaign - end - if @model.is_a?(Account) && @attachment.respond_to?(:account) # Skip Tasks... - assigns[:account].should == @attachment.reload.account - end - response.should render_template("entities/attach") +shared_examples "attach" do + it "should attach existing asset to the parent asset of different type" do + xhr :put, :attach, :id => @model.id, :assets => @attachment.class.name.tableize, :asset_id => @attachment.id + @model.send(@attachment.class.name.tableize).should include(@attachment) + assigns[:attachment].should == @attachment + assigns[:attached].should == [ @attachment ] + if @model.is_a?(Campaign) && (@attachment.is_a?(Lead) || @attachment.is_a?(Opportunity)) + assigns[:campaign].should == @attachment.reload.campaign end + if @model.is_a?(Account) && @attachment.respond_to?(:account) # Skip Tasks... + assigns[:account].should == @attachment.reload.account + end + response.should render_template("entities/attach") + end - it "should not attach the asset that is already attached" do - if @model.is_a?(Campaign) && (@attachment.is_a?(Lead) || @attachment.is_a?(Opportunity)) - @attachment.update_attribute(:campaign_id, @model.id) - else - @model.send(@attachment.class.name.tableize) << @attachment - end - - xhr :put, :attach, :id => @model.id, :assets => @attachment.class.name.tableize, :asset_id => @attachment.id - assigns[:attached].should == nil - response.should render_template("entities/attach") + it "should not attach the asset that is already attached" do + if @model.is_a?(Campaign) && (@attachment.is_a?(Lead) || @attachment.is_a?(Opportunity)) + @attachment.update_attribute(:campaign_id, @model.id) + else + @model.send(@attachment.class.name.tableize) << @attachment end - it "should display flash warning when the model is no longer available" do - @model.destroy + xhr :put, :attach, :id => @model.id, :assets => @attachment.class.name.tableize, :asset_id => @attachment.id + assigns[:attached].should == nil + response.should render_template("entities/attach") + end - xhr :put, :attach, :id => @model.id, :assets => @attachment.class.name.tableize, :asset_id => @attachment.id - flash[:warning].should_not == nil - response.body.should == "window.location.reload();" - end - it "should display flash warning when the attachment is no longer available" do - @attachment.destroy + it "should display flash warning when the model is no longer available" do + @model.destroy - xhr :put, :attach, :id => @model.id, :assets => @attachment.class.name.tableize, :asset_id => @attachment.id - flash[:warning].should_not == nil - response.body.should == "window.location.reload();" - end + xhr :put, :attach, :id => @model.id, :assets => @attachment.class.name.tableize, :asset_id => @attachment.id + flash[:warning].should_not == nil + response.body.should == "window.location.reload();" end + it "should display flash warning when the attachment is no longer available" do + @attachment.destroy - shared_examples "discard" do - it "should discard the attachment without deleting it" do - xhr :post, :discard, :id => @model.id, :attachment => @attachment.class.name, :attachment_id => @attachment.id - assigns[:attachment].should == @attachment.reload # The attachment should still exist. - @model.reload.send("#{@attachment.class.name.tableize}").should == [] # But no longer associated with the model. - assigns[:account].should == @model if @model.is_a?(Account) - assigns[:campaign].should == @model if @model.is_a?(Campaign) + xhr :put, :attach, :id => @model.id, :assets => @attachment.class.name.tableize, :asset_id => @attachment.id + flash[:warning].should_not == nil + response.body.should == "window.location.reload();" + end +end - response.should render_template("entities/discard") - end +shared_examples "discard" do + it "should discard the attachment without deleting it" do + xhr :post, :discard, :id => @model.id, :attachment => @attachment.class.name, :attachment_id => @attachment.id + assigns[:attachment].should == @attachment.reload # The attachment should still exist. + @model.reload.send("#{@attachment.class.name.tableize}").should == [] # But no longer associated with the model. + assigns[:account].should == @model if @model.is_a?(Account) + assigns[:campaign].should == @model if @model.is_a?(Campaign) - it "should display flash warning when the model is no longer available" do - @model.destroy + response.should render_template("entities/discard") + end - xhr :post, :discard, :id => @model.id, :attachment => @attachment.class.name, :attachment_id => @attachment.id - flash[:warning].should_not == nil - response.body.should == "window.location.reload();" - end + it "should display flash warning when the model is no longer available" do + @model.destroy - it "should display flash warning when the attachment is no longer available" do - @attachment.destroy + xhr :post, :discard, :id => @model.id, :attachment => @attachment.class.name, :attachment_id => @attachment.id + flash[:warning].should_not == nil + response.body.should == "window.location.reload();" + end - xhr :post, :discard, :id => @model.id, :attachment => @attachment.class.name, :attachment_id => @attachment.id - flash[:warning].should_not == nil - response.body.should == "window.location.reload();" - end + it "should display flash warning when the attachment is no longer available" do + @attachment.destroy + + xhr :post, :discard, :id => @model.id, :attachment => @attachment.class.name, :attachment_id => @attachment.id + flash[:warning].should_not == nil + response.body.should == "window.location.reload();" end end diff --git a/spec/support/mail_processor_mocks.rb b/spec/support/mail_processor_mocks.rb index 97db14d2cb..a8bcc4815c 100644 --- a/spec/support/mail_processor_mocks.rb +++ b/spec/support/mail_processor_mocks.rb @@ -5,7 +5,7 @@ #------------------------------------------------------------------------------ module MockIMAP def mock_imap - @imap = mock + @imap = double @settings = @crawler.instance_variable_get("@settings") @settings[:address] = @mock_address Net::IMAP.stub(:new).with(@settings[:server], @settings[:port], @settings[:ssl]).and_return(@imap) @@ -24,7 +24,7 @@ def mock_disconnect end def mock_message(body) - @fetch_data = mock + @fetch_data = double @fetch_data.stub(:attr).and_return("RFC822" => body) @imap.stub(:uid_search).and_return([ :uid ]) @imap.stub(:uid_fetch).and_return([ @fetch_data ]) diff --git a/zeus.json b/zeus.json index 3e075d6feb..aa33e03079 100644 --- a/zeus.json +++ b/zeus.json @@ -1,5 +1,5 @@ { - "command": "ruby -rubygems -rzeus/rails -eZeus.go", + "command": "ruby -rubygems -r./custom_plan -eZeus.go", "plan": { "boot": { @@ -10,6 +10,7 @@ "console": ["c"], "server": ["s"], "generate": ["g"], + "destroy": ["d"], "dbconsole": [] }, "test_environment": { From 22b88b3ddca4094bd09b88272a8811cf1dd565d6 Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Tue, 13 Aug 2013 12:20:17 +0800 Subject: [PATCH 025/213] Update capybara and selenium. --- Gemfile | 2 +- Gemfile.lock | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Gemfile b/Gemfile index 12ef6d527b..9e50fd74b7 100644 --- a/Gemfile +++ b/Gemfile @@ -66,7 +66,7 @@ group :development, :test do end group :test do - gem 'capybara', '~> 2.0.3' + gem 'capybara' gem 'selenium-webdriver' gem 'database_cleaner' gem "acts_as_fu" diff --git a/Gemfile.lock b/Gemfile.lock index 0c2f24e0e3..0f428a608f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -55,13 +55,12 @@ GEM net-ssh (>= 2.0.14) net-ssh-gateway (>= 1.1.0) capistrano_colors (0.5.5) - capybara (2.0.3) + capybara (2.1.0) mime-types (>= 1.16) nokogiri (>= 1.3.3) rack (>= 1.0.0) rack-test (>= 0.5.4) - selenium-webdriver (~> 2.0) - xpath (~> 1.0.0) + xpath (~> 2.0) childprocess (0.3.9) ffi (~> 1.0, >= 1.0.11) chosen-rails_ffcrm (0.9.5) @@ -111,7 +110,7 @@ GEM factory_girl (~> 4.2.0) railties (>= 3.0.0) ffaker (1.14.0) - ffi (1.8.1) + ffi (1.9.0) guard (1.4.0) listen (>= 0.4.2) thor (>= 0.14.6) @@ -143,6 +142,7 @@ GEM treetop (~> 1.4.8) method_source (0.7.1) mime-types (1.23) + mini_portile (0.5.1) multi_json (1.7.9) net-scp (1.0.4) net-ssh (>= 1.99.1) @@ -151,7 +151,8 @@ GEM net-ssh (2.6.1) net-ssh-gateway (1.1.0) net-ssh (>= 1.99.1) - nokogiri (1.5.9) + nokogiri (1.6.0) + mini_portile (~> 0.5.0) paper_trail (2.6.3) activerecord (~> 3.0) railties (~> 3.0) @@ -254,7 +255,7 @@ GEM tilt (~> 1.3) select2-rails (3.2.1) thor (~> 0.14) - selenium-webdriver (2.32.1) + selenium-webdriver (2.34.0) childprocess (>= 0.2.5) multi_json (~> 1.0) rubyzip @@ -299,7 +300,7 @@ GEM activerecord (>= 3.0.2) websocket (1.0.7) will_paginate (3.0.3) - xpath (1.0.0) + xpath (2.0.0) nokogiri (~> 1.3) zeus (0.13.3) method_source (>= 0.6.7) @@ -318,7 +319,7 @@ DEPENDENCIES cancan capistrano capistrano_colors - capybara (~> 2.0.3) + capybara cocaine coffee-rails (~> 3.2.1) coveralls From 7d9d9de1eaeb9769496bc94e82b31d580eff5efc Mon Sep 17 00:00:00 2001 From: Zlatko Zahariev Date: Fri, 16 Aug 2013 11:07:32 +0300 Subject: [PATCH 026/213] Address Issues #242 and #245. Fix cohsen_select helper to be able to work on multiple select boxes with chosen --- spec/features/support/selector_helpers.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/features/support/selector_helpers.rb b/spec/features/support/selector_helpers.rb index ae90efb1ce..88c2e3a742 100644 --- a/spec/features/support/selector_helpers.rb +++ b/spec/features/support/selector_helpers.rb @@ -5,7 +5,7 @@ #------------------------------------------------------------------------------ module SelectorHelpers def chosen_select(item_text, options) - field_id = find_field(options[:from])[:id] + field_id = find_field(options[:from], :visible => false)[:id] option_value = page.evaluate_script("jQuery(\"##{field_id} option:contains('#{item_text}')\").val()")#page.evaluate_script("$(\"##{field_id} option:contains('#{item_text}')\").val()") page.execute_script("jQuery('##{field_id}').val('#{option_value}')") end From fab0690951ce8c55e0fe63253aa9241863cda4ed Mon Sep 17 00:00:00 2001 From: Philipp Ullmann Date: Wed, 21 Aug 2013 13:14:09 +0200 Subject: [PATCH 027/213] Closes #268: Replace the contents of "div#leads_pagination" and not the div itself --- app/views/entities/leads.js.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/entities/leads.js.haml b/app/views/entities/leads.js.haml index f833e96b29..64deeb8e2e 100755 --- a/app/views/entities/leads.js.haml +++ b/app/views/entities/leads.js.haml @@ -1,3 +1,3 @@ - leads = entity.leads.order('updated_at DESC').paginate(:page => params[:page], :per_page => 20) jQuery('#leads').html('#{ j render(:partial => 'leads/lead', :collection => leads) }'); -jQuery('#leads_pagination').replaceWith('#{ j will_paginate(leads, :container => false, :params => {:action => :leads}) }'); +jQuery('#leads_pagination').html('#{ j will_paginate(leads, :container => false, :params => {:action => :leads}) }'); From 202815a9a7c3f5ca8bf41fef0831e7c492aa4e8a Mon Sep 17 00:00:00 2001 From: Road Tang Date: Sun, 29 Sep 2013 00:48:39 +0800 Subject: [PATCH 028/213] fix the double render error when the comment's commentable entity is gone --- app/controllers/comments_controller.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 876816ba5b..5f444a88d8 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -53,10 +53,10 @@ def create model, id = @comment.commentable_type, @comment.commentable_id unless model.constantize.my.find_by_id(id) respond_to_related_not_found(model.downcase) + else + @comment.save + respond_with(@comment) end - - @comment.save - respond_with(@comment) end # PUT /comments/1 From 1f388fc5377e13e115f1ccfaaedf5db927d0eb06 Mon Sep 17 00:00:00 2001 From: Road Tang Date: Mon, 30 Sep 2013 00:33:19 +0800 Subject: [PATCH 029/213] fix the issue of scope 'my(other_user)' to return current_user's scope --- app/models/polymorphic/task.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/polymorphic/task.rb b/app/models/polymorphic/task.rb index fcdaf9dfac..4a41f48109 100644 --- a/app/models/polymorphic/task.rb +++ b/app/models/polymorphic/task.rb @@ -39,7 +39,7 @@ class Task < ActiveRecord::Base # what gets shown on Tasks/Pending and Tasks/Completed pages. scope :my, lambda { |*args| options = args[0] || {} - user_option = options[:user] || User.current_user + user_option = (options.is_a?(Hash) ? options[:user] : options) || User.current_user includes(:assignee). where('(user_id = ? AND assigned_to IS NULL) OR assigned_to = ?', user_option, user_option). order(options[:order] || 'name ASC'). From 3b2877c1db9072d8099f6c38599b46e45d50ae3c Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Fri, 8 Nov 2013 11:19:19 +0800 Subject: [PATCH 030/213] Updated therubyracer --- Gemfile.lock | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 0f428a608f..6d2b37d406 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -131,7 +131,7 @@ GEM thor (>= 0.14, < 2.0) json (1.8.0) kgio (2.7.4) - libv8 (3.3.10.4) + libv8 (3.16.14.3) listen (1.2.3) rb-fsevent (>= 0.9.3) rb-inotify (>= 0.9) @@ -229,6 +229,7 @@ GEM ffi (>= 0.5.0) rdoc (3.12.2) json (~> 1.4) + ref (1.0.5) responds_to_parent (1.1.0) rest-client (1.6.7) mime-types (>= 1.16) @@ -274,8 +275,9 @@ GEM rack (~> 1.0) tilt (~> 1.1, != 1.3.0) sqlite3 (1.3.7) - therubyracer (0.10.1) - libv8 (~> 3.3.10) + therubyracer (0.12.0) + libv8 (~> 3.16.14.0) + ref thin (1.5.0) daemons (>= 1.0.9) eventmachine (>= 0.12.6) From 308af6feeda8c8cccd6a440e2176a30ffa0a8dbf Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Fri, 8 Nov 2013 11:35:21 +0800 Subject: [PATCH 031/213] Fixed issue#281 - psych v2 is not supported. --- Gemfile.lock | 4 ++-- fat_free_crm.gemspec | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6d2b37d406..2d107a946b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -177,7 +177,7 @@ GEM slop (>= 2.4.4, < 3) pry-rails (0.1.6) pry - psych (2.0.0) + psych (1.3.4) quiet_assets (1.0.1) railties (~> 3.1) rack (1.4.5) @@ -345,7 +345,7 @@ DEPENDENCIES premailer prototype-rails pry-rails - psych + psych (~> 1) quiet_assets rails (~> 3.2.12) rails3-jquery-autocomplete diff --git a/fat_free_crm.gemspec b/fat_free_crm.gemspec index d42633151e..ab463a9d73 100644 --- a/fat_free_crm.gemspec +++ b/fat_free_crm.gemspec @@ -38,7 +38,7 @@ Gem::Specification.new do |gem| gem.add_dependency 'responds_to_parent', '>= 1.1.0' gem.add_dependency 'rails3-jquery-autocomplete' gem.add_dependency 'valium' - gem.add_dependency 'psych' + gem.add_dependency 'psych', '~> 1' # FatFreeCRM has released it's own versions of the following gems: #----------------------------------------------------------------- From af2988ea5709680a24afb399800588420c652a1b Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Fri, 8 Nov 2013 17:26:57 +0800 Subject: [PATCH 032/213] Fixed issue #282 --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 9e50fd74b7..22d18e7f70 100644 --- a/Gemfile +++ b/Gemfile @@ -29,7 +29,7 @@ end # Bundler no longer treats runtime dependencies as base dependencies. # The following code restores this behaviour. # (See https://github.com/carlhuda/bundler/issues/1041) -spec = Bundler.load_gemspec(Dir["./{,*}.gemspec"].first) +spec = Bundler.load_gemspec( File.expand_path("../fat_free_crm.gemspec", __FILE__) ) spec.runtime_dependencies.each do |dep| gem dep.name, *(dep.requirement.as_list) end From e3d52662a841c20a98b20cf665628f77c0a60e5b Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Wed, 20 Nov 2013 12:51:32 +0800 Subject: [PATCH 033/213] Updated to latest rails version --- Gemfile.lock | 69 ++++++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2d107a946b..cac2c90c20 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,12 +1,12 @@ GEM remote: https://rubygems.org/ specs: - actionmailer (3.2.13) - actionpack (= 3.2.13) - mail (~> 2.5.3) - actionpack (3.2.13) - activemodel (= 3.2.13) - activesupport (= 3.2.13) + actionmailer (3.2.15) + actionpack (= 3.2.15) + mail (~> 2.5.4) + actionpack (3.2.15) + activemodel (= 3.2.15) + activesupport (= 3.2.15) builder (~> 3.0.0) erubis (~> 2.7.0) journey (~> 1.0.4) @@ -14,19 +14,19 @@ GEM rack-cache (~> 1.2) rack-test (~> 0.6.1) sprockets (~> 2.2.1) - activemodel (3.2.13) - activesupport (= 3.2.13) + activemodel (3.2.15) + activesupport (= 3.2.15) builder (~> 3.0.0) - activerecord (3.2.13) - activemodel (= 3.2.13) - activesupport (= 3.2.13) + activerecord (3.2.15) + activemodel (= 3.2.15) + activesupport (= 3.2.15) arel (~> 3.0.2) tzinfo (~> 0.3.29) - activeresource (3.2.13) - activemodel (= 3.2.13) - activesupport (= 3.2.13) - activesupport (3.2.13) - i18n (= 0.6.1) + activeresource (3.2.15) + activemodel (= 3.2.15) + activesupport (= 3.2.15) + activesupport (3.2.15) + i18n (~> 0.6, >= 0.6.4) multi_json (~> 1.0) acts-as-taggable-on (2.3.3) rails (~> 3.0) @@ -40,7 +40,7 @@ GEM chosen-rails_ffcrm railties (~> 3.0) thor (~> 0.14) - arel (3.0.2) + arel (3.0.3) authlogic (3.1.0) activerecord (>= 3.0.7) activerecord (>= 3.0.7) @@ -124,26 +124,25 @@ GEM highline (1.6.15) hike (1.2.3) htmlentities (4.3.1) - i18n (0.6.1) + i18n (0.6.5) journey (1.0.4) jquery-rails (2.1.4) railties (>= 3.0, < 5.0) thor (>= 0.14, < 2.0) - json (1.8.0) + json (1.8.1) kgio (2.7.4) libv8 (3.16.14.3) listen (1.2.3) rb-fsevent (>= 0.9.3) rb-inotify (>= 0.9) rb-kqueue (>= 0.2) - mail (2.5.3) - i18n (>= 0.4.0) + mail (2.5.4) mime-types (~> 1.16) treetop (~> 1.4.8) method_source (0.7.1) - mime-types (1.23) + mime-types (1.25) mini_portile (0.5.1) - multi_json (1.7.9) + multi_json (1.8.2) net-scp (1.0.4) net-ssh (>= 1.99.1) net-sftp (2.0.5) @@ -187,19 +186,19 @@ GEM rack rack-test (0.6.2) rack (>= 1.0) - rails (3.2.13) - actionmailer (= 3.2.13) - actionpack (= 3.2.13) - activerecord (= 3.2.13) - activeresource (= 3.2.13) - activesupport (= 3.2.13) + rails (3.2.15) + actionmailer (= 3.2.15) + actionpack (= 3.2.15) + activerecord (= 3.2.15) + activeresource (= 3.2.15) + activesupport (= 3.2.15) bundler (~> 1.0) - railties (= 3.2.13) + railties (= 3.2.15) rails3-jquery-autocomplete (1.0.7) rails (~> 3.0) - railties (3.2.13) - actionpack (= 3.2.13) - activesupport (= 3.2.13) + railties (3.2.15) + actionpack (= 3.2.15) + activesupport (= 3.2.15) rack-ssl (~> 1.3.2) rake (>= 0.8.7) rdoc (~> 3.4) @@ -284,13 +283,13 @@ GEM rack (>= 1.0.0) thor (0.18.1) tilt (1.4.1) - treetop (1.4.12) + treetop (1.4.15) polyglot polyglot (>= 0.3.1) turbo-sprockets-rails3 (0.3.6) railties (> 3.2.8, < 4.0.0) sprockets (>= 2.0.0) - tzinfo (0.3.37) + tzinfo (0.3.38) uglifier (1.2.4) execjs (>= 0.3.0) multi_json (>= 1.0.2) From e502e4be69a6dc9b10e7994144f35c8ca9275a88 Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Wed, 20 Nov 2013 14:49:42 +0800 Subject: [PATCH 034/213] Remove ruby 1.9.2 from travis tests - not all gem requirements like r1.9.2 anymor. --- .travis.yml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8c47098a54..1caaed7595 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ language: ruby rvm: - 1.9.3 - - 1.9.2 env: - DB=mysql @@ -10,16 +9,6 @@ env: gemfile: Gemfile.ci -# Only run a cross-section of 4 builds majoring on r1.9.3 -matrix: - exclude: - - rvm: 1.9.2 - env: DB=sqlite - gemfile: Gemfile.ci - - rvm: 1.9.2 - env: DB=postgres - gemfile: Gemfile.ci - bundler_args: --path=vendor/bundle --without heroku before_install: From 3c40e7c74f7f8a139303564b24a799e17fd586c7 Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Wed, 20 Nov 2013 15:13:31 +0800 Subject: [PATCH 035/213] Add id to export formats. --- app/views/accounts/index.xls.builder | 16 +++++++++------- app/views/campaigns/index.xls.builder | 16 +++++++++------- app/views/contacts/index.xls.builder | 16 +++++++++------- app/views/leads/index.xls.builder | 16 +++++++++------- app/views/opportunities/index.xls.builder | 16 +++++++++------- app/views/tasks/index.xls.builder | 12 +++++++----- config/locales/en-US_fat_free_crm.yml | 1 + 7 files changed, 53 insertions(+), 40 deletions(-) diff --git a/app/views/accounts/index.xls.builder b/app/views/accounts/index.xls.builder index 54dd307094..82ca7be23b 100644 --- a/app/views/accounts/index.xls.builder +++ b/app/views/accounts/index.xls.builder @@ -3,7 +3,8 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_accounts) do unless @accounts.empty? # Header. xml.Row do - heads = [I18n.t('user'), + heads = [I18n.t('id'), + I18n.t('user'), I18n.t('assigned_to'), I18n.t('name'), I18n.t('email'), @@ -24,12 +25,12 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_accounts) do I18n.t('zipcode'), I18n.t('country'), I18n.t('address')] - + # Append custom field labels to header Account.fields.each do |field| heads << field.label end - + heads.each do |head| xml.Cell do xml.Data head, @@ -37,12 +38,13 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_accounts) do end end end - + # Account rows. @accounts.each do |account| xml.Row do address = account.billing_address - data = [account.user.try(:name), + data = [account.id, + account.user.try(:name), account.assignee.try(:name), account.name, account.email, @@ -63,12 +65,12 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_accounts) do address.try(:zipcode), address.try(:country), address.try(:full_address)] - + # Append custom field values. Account.fields.each do |field| data << account.send(field.name) end - + data.each do |value| xml.Cell do xml.Data value, diff --git a/app/views/campaigns/index.xls.builder b/app/views/campaigns/index.xls.builder index fa14f66b53..6f275f404c 100644 --- a/app/views/campaigns/index.xls.builder +++ b/app/views/campaigns/index.xls.builder @@ -3,7 +3,8 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_campaigns) do unless @campaigns.empty? # Header. xml.Row do - heads = [I18n.t('user'), + heads = [I18n.t('id'), + I18n.t('user'), I18n.t('assigned_to'), I18n.t('name'), I18n.t('access'), @@ -21,12 +22,12 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_campaigns) do I18n.t('background_info'), I18n.t('date_created'), I18n.t('date_updated')] - + # Append custom field labels to header Campaign.fields.each do |field| heads << field.label end - + heads.each do |head| xml.Cell do xml.Data head, @@ -34,11 +35,12 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_campaigns) do end end end - + # Campaign rows. @campaigns.each do |campaign| xml.Row do - data = [campaign.user.try(:name), + data = [campaign.id, + campaign.user.try(:name), campaign.assignee.try(:name), campaign.name, campaign.access, @@ -56,12 +58,12 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_campaigns) do campaign.background_info, campaign.created_at, campaign.updated_at] - + # Append custom field values. Campaign.fields.each do |field| data << campaign.send(field.name) end - + data.each do |value| xml.Cell do xml.Data value, diff --git a/app/views/contacts/index.xls.builder b/app/views/contacts/index.xls.builder index f10a6e2d17..d9df8a6bb4 100644 --- a/app/views/contacts/index.xls.builder +++ b/app/views/contacts/index.xls.builder @@ -3,7 +3,8 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_contacts) do unless @contacts.empty? # Header. xml.Row do - heads = [I18n.t('lead'), + heads = [I18n.t('id'), + I18n.t('lead'), I18n.t('job_title'), I18n.t('name'), I18n.t('first_name'), @@ -34,12 +35,12 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_contacts) do I18n.t('zipcode'), I18n.t('country'), I18n.t('address')] - + # Append custom field labels to header Contact.fields.each do |field| heads << field.label end - + heads.each do |head| xml.Cell do xml.Data head, @@ -47,12 +48,13 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_contacts) do end end end - + # Contact rows. @contacts.each do |contact| xml.Row do address = contact.business_address - data = [contact.lead.try(:name), + data = [contact.id, + contact.lead.try(:name), contact.title, contact.name, contact.first_name, @@ -83,12 +85,12 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_contacts) do address.try(:zipcode), address.try(:country), address.try(:full_address)] - + # Append custom field values. Contact.fields.each do |field| data << contact.send(field.name) end - + data.each do |value| xml.Cell do xml.Data value, diff --git a/app/views/leads/index.xls.builder b/app/views/leads/index.xls.builder index e9850dc4b3..f028717fe7 100644 --- a/app/views/leads/index.xls.builder +++ b/app/views/leads/index.xls.builder @@ -3,7 +3,8 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_leads) do unless @leads.empty? # Header. xml.Row do - heads = [I18n.t('user'), + heads = [I18n.t('id'), + I18n.t('user'), I18n.t('campaign'), I18n.t('job_title'), I18n.t('name'), @@ -33,12 +34,12 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_leads) do I18n.t('zipcode'), I18n.t('country'), I18n.t('address')] - + # Append custom field labels to header Lead.fields.each do |field| heads << field.label end - + heads.each do |head| xml.Cell do xml.Data head, @@ -46,12 +47,13 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_leads) do end end end - + # Lead rows. @leads.each do |lead| xml.Row do address = lead.business_address - data = [lead.user.try(:name), + data = [lead.id, + lead.user.try(:name), lead.campaign.try(:name), lead.title, lead.name, @@ -81,12 +83,12 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_leads) do address.try(:zipcode), address.try(:country), address.try(:full_address)] - + # Append custom field values. Lead.fields.each do |field| data << lead.send(field.name) end - + data.each do |value| xml.Cell do xml.Data value, diff --git a/app/views/opportunities/index.xls.builder b/app/views/opportunities/index.xls.builder index 43301d4291..9782b4ef1b 100644 --- a/app/views/opportunities/index.xls.builder +++ b/app/views/opportunities/index.xls.builder @@ -3,7 +3,8 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_opportunities) do unless @opportunities.empty? # Header. xml.Row do - heads = [I18n.t('user'), + heads = [I18n.t('id'), + I18n.t('user'), I18n.t('campaign'), I18n.t('assigned_to'), I18n.t('account'), @@ -18,12 +19,12 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_opportunities) do I18n.t('option_closes_on'), I18n.t('date_created'), I18n.t('date_updated')] - + # Append custom field labels to header Opportunity.fields.each do |field| heads << field.label end - + heads.each do |head| xml.Cell do xml.Data head, @@ -31,11 +32,12 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_opportunities) do end end end - + # Opportunity rows. @opportunities.each do |opportunity| xml.Row do - data = [opportunity.user.try(:name), + data = [opportunity.id, + opportunity.user.try(:name), opportunity.campaign.try(:name), opportunity.assignee.try(:name), opportunity.account.try(:name), @@ -50,12 +52,12 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_opportunities) do opportunity.closes_on, opportunity.created_at, opportunity.updated_at] - + # Append custom field values. Opportunity.fields.each do |field| data << opportunity.send(field.name) end - + data.each do |value| xml.Cell do xml.Data value, diff --git a/app/views/tasks/index.xls.builder b/app/views/tasks/index.xls.builder index ddeb1f260a..136db35bc2 100644 --- a/app/views/tasks/index.xls.builder +++ b/app/views/tasks/index.xls.builder @@ -3,7 +3,8 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_tasks) do unless @tasks.empty? # Header. xml.Row do - heads = %w{name + heads = %w{id + name due date_created date_updated @@ -12,7 +13,7 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_tasks) do assigned_to category background_info} - + heads.each do |head| xml.Cell do xml.Data I18n.t(head), @@ -20,11 +21,12 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_tasks) do end end end - + # Rows. @tasks.map(&:second).flatten.each do |task| xml.Row do - data = [task.name, + data = [task.id, + task.name, I18n.t(task.computed_bucket), task.created_at, task.updated_at, @@ -33,7 +35,7 @@ xml.Worksheet 'ss:Name' => I18n.t(:tab_tasks) do task.assignee.try(:name), task.category, task.background_info] - + data.each do |value| xml.Cell do xml.Data value, diff --git a/config/locales/en-US_fat_free_crm.yml b/config/locales/en-US_fat_free_crm.yml index 6a3ad899ec..6af81ba1ad 100644 --- a/config/locales/en-US_fat_free_crm.yml +++ b/config/locales/en-US_fat_free_crm.yml @@ -4,6 +4,7 @@ en-US: # Generic terms. #---------------------------------------------------------------------------- + id: Id all: All at: at here: here From f5bf8d0fdc971519acdfabe5f5e26fd068148bd1 Mon Sep 17 00:00:00 2001 From: Road Tang Date: Thu, 21 Nov 2013 21:49:12 +0800 Subject: [PATCH 036/213] fix the bug that hooks of inline_styles can see the locals of models variable --- app/views/shared/_inline_styles.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/shared/_inline_styles.html.haml b/app/views/shared/_inline_styles.html.haml index f0a8fb5ea4..8c84b560e3 100644 --- a/app/views/shared/_inline_styles.html.haml +++ b/app/views/shared/_inline_styles.html.haml @@ -27,5 +27,5 @@ li.user .active { background: lightgreen; } li.user .signed_up { background: lightsalmon; } - = hook(:inline_styles, self) + = hook(:inline_styles, self, local_assigns) From 057a24a8985e6220ea0fdf5a89d644e4b33dada5 Mon Sep 17 00:00:00 2001 From: Nathan Broadbent Date: Sun, 24 Nov 2013 01:07:21 -0800 Subject: [PATCH 037/213] Fixed images in README --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 4e8c33a37d..fff369d7e4 100644 --- a/README.md +++ b/README.md @@ -14,29 +14,29 @@ contact lists, and opportunity tracking.
- - Create Contacts + + Create Contacts
Contacts
- - Manage Opportunities + + Manage Opportunities
Opportunities
- - Edit Accounts + + Edit Accounts
Accounts
- - Create Tasks + + Create Tasks
Tasks From 7f66a737dd56bc9f0a658fa8881ec7db84be7b79 Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Sat, 30 Nov 2013 17:22:17 +0800 Subject: [PATCH 038/213] Added timeago library to enable future caching of search results. --- app/assets/javascripts/application.js.erb | 2 + app/assets/javascripts/timeago.js | 15 ++ app/helpers/application_helper.rb | 8 + app/views/accounts/_index_brief.html.haml | 6 +- app/views/accounts/_index_long.html.haml | 6 +- app/views/admin/fields/_field.html.haml | 2 +- app/views/admin/users/_user.html.haml | 2 +- app/views/comments/_comment.html.haml | 2 +- app/views/contacts/_index_full.html.haml | 2 +- app/views/contacts/_index_long.html.haml | 3 +- app/views/home/_account.html.haml | 6 +- app/views/home/_opportunity.html.haml | 6 +- app/views/layouts/admin/application.html.haml | 3 +- app/views/layouts/application.html.haml | 3 + app/views/leads/_index_long.html.haml | 4 +- .../opportunities/_index_brief.html.haml | 6 +- app/views/opportunities/_index_long.html.haml | 6 +- app/views/shared/_comment.html.haml | 2 +- app/views/versions/_version.html.haml | 2 +- config/locales/en-GB_fat_free_crm.yml | 4 + config/locales/en-US_fat_free_crm.yml | 4 + .../jquery_timeago/jquery.timeago.cz.js | 18 ++ .../jquery_timeago/jquery.timeago.de.js | 18 ++ .../jquery_timeago/jquery.timeago.en-GB.js | 20 ++ .../jquery_timeago/jquery.timeago.en-US.js | 20 ++ .../jquery_timeago/jquery.timeago.es.js | 18 ++ .../jquery_timeago/jquery.timeago.fr-CA.js | 17 ++ .../jquery_timeago/jquery.timeago.fr.js | 17 ++ .../jquery_timeago/jquery.timeago.it.js | 16 ++ .../jquery_timeago/jquery.timeago.ja.js | 19 ++ .../jquery_timeago/jquery.timeago.js | 193 ++++++++++++++++++ .../jquery_timeago/jquery.timeago.pl.js | 31 +++ .../jquery_timeago/jquery.timeago.pt-BR.js | 18 ++ .../jquery_timeago/jquery.timeago.ru.js | 34 +++ .../jquery_timeago/jquery.timeago.sv-SE.js | 18 ++ .../jquery_timeago/jquery.timeago.th.js | 20 ++ .../jquery_timeago/jquery.timeago.zh-CN.js | 20 ++ 37 files changed, 563 insertions(+), 28 deletions(-) create mode 100644 app/assets/javascripts/timeago.js create mode 100644 vendor/assets/javascripts/jquery_timeago/jquery.timeago.cz.js create mode 100644 vendor/assets/javascripts/jquery_timeago/jquery.timeago.de.js create mode 100644 vendor/assets/javascripts/jquery_timeago/jquery.timeago.en-GB.js create mode 100644 vendor/assets/javascripts/jquery_timeago/jquery.timeago.en-US.js create mode 100644 vendor/assets/javascripts/jquery_timeago/jquery.timeago.es.js create mode 100644 vendor/assets/javascripts/jquery_timeago/jquery.timeago.fr-CA.js create mode 100644 vendor/assets/javascripts/jquery_timeago/jquery.timeago.fr.js create mode 100644 vendor/assets/javascripts/jquery_timeago/jquery.timeago.it.js create mode 100644 vendor/assets/javascripts/jquery_timeago/jquery.timeago.ja.js create mode 100644 vendor/assets/javascripts/jquery_timeago/jquery.timeago.js create mode 100644 vendor/assets/javascripts/jquery_timeago/jquery.timeago.pl.js create mode 100644 vendor/assets/javascripts/jquery_timeago/jquery.timeago.pt-BR.js create mode 100644 vendor/assets/javascripts/jquery_timeago/jquery.timeago.ru.js create mode 100644 vendor/assets/javascripts/jquery_timeago/jquery.timeago.sv-SE.js create mode 100644 vendor/assets/javascripts/jquery_timeago/jquery.timeago.th.js create mode 100644 vendor/assets/javascripts/jquery_timeago/jquery.timeago.zh-CN.js diff --git a/app/assets/javascripts/application.js.erb b/app/assets/javascripts/application.js.erb index 71be8426a6..af194eb0eb 100644 --- a/app/assets/javascripts/application.js.erb +++ b/app/assets/javascripts/application.js.erb @@ -33,6 +33,8 @@ //= require admin/fields //= require format_buttons //= require crm_comments +//= require jquery_timeago/jquery.timeago +//= require timeago //= require_self <% diff --git a/app/assets/javascripts/timeago.js b/app/assets/javascripts/timeago.js new file mode 100644 index 0000000000..97118500d5 --- /dev/null +++ b/app/assets/javascripts/timeago.js @@ -0,0 +1,15 @@ +// Run function on page load +jQuery(document).ready(function() { + jQuery.timeago.settings.allowFuture = true; + jQuery("span.timeago").timeago(); + // update every minute + setInterval(function(){ jQuery("span.timeago").timeago(); }, 60000); +}); + +// Run after jQuery ajax event +jQuery(document).ajaxComplete( function() { jQuery("span.timeago").timeago(); } ); + +// Run after prototype ajax event +Ajax.Responders.register( { + onComplete: function(response) { jQuery("span.timeago").timeago(); } +}) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index a142cbf406..4f75f43c04 100755 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -470,4 +470,12 @@ def view_buttons end end + #---------------------------------------------------------------------------- + # Generate the html for jQuery.timeago function + # July 17, 2008 + def timeago(time, options = {}) + options[:class] ||= "timeago" + content_tag(:span, time.to_s, options.merge( title: time.getutc.iso8601)) if time + end + end diff --git a/app/views/accounts/_index_brief.html.haml b/app/views/accounts/_index_brief.html.haml index 0ac487d81a..305069094d 100644 --- a/app/views/accounts/_index_brief.html.haml +++ b/app/views/accounts/_index_brief.html.haml @@ -21,11 +21,11 @@ – %tt = account.location << ", " unless account.location.blank? - - user_name = account.user_id == current_user.id ? t(:me) : account.user.try(:full_name) + - user_name = account.user.try(:full_name) - if user_name - = t(:added_by, :time_ago => time_ago_in_words(account.created_at), :user => user_name) << " | " + = t(:added_by2, :time_ago => timeago(account.created_at), :user => h(user_name)).html_safe << " | " - else - = t(:added_ago, :value => time_ago_in_words(account.created_at)) << " | " + = t(:added, :value => timeago(account.created_at)).html_safe << " | " = t('pluralize.contact', account.contacts.count) << " | " = t('pluralize.opportunity', account.opportunities.count) diff --git a/app/views/accounts/_index_long.html.haml b/app/views/accounts/_index_long.html.haml index bca197c766..9f2167e8b4 100644 --- a/app/views/accounts/_index_long.html.haml +++ b/app/views/accounts/_index_long.html.haml @@ -21,11 +21,11 @@ – %tt = account.location << ", " unless account.location.blank? - - user_name = account.user_id == current_user.id ? t(:me) : account.user.try(:full_name) + - user_name = account.user.try(:full_name) - if user_name - = t(:added_by, :time_ago => time_ago_in_words(account.created_at), :user => user_name) << " | " + = t(:added_by2, :time_ago => timeago(account.created_at), :user => h(user_name)).html_safe << " | " - else - = t(:added_ago, :value => time_ago_in_words(account.created_at)) << " | " + = t(:added, :value => timeago(account.created_at)).html_safe << " | " = t('pluralize.contact', account.contacts.count) << " | " = t('pluralize.opportunity', account.opportunities.count) diff --git a/app/views/admin/fields/_field.html.haml b/app/views/admin/fields/_field.html.haml index a894ac6da3..2154099a60 100644 --- a/app/views/admin/fields/_field.html.haml +++ b/app/views/admin/fields/_field.html.haml @@ -11,7 +11,7 @@ %b= field.label == (#{t("field_types.#{field.as}.title")}) - == added #{time_ago_in_words(field.created_at)} ago + = t(:added, value: timeago(field.created_at)).html_safe = hook(:field_bottom, self, :field => field) .edit_field diff --git a/app/views/admin/users/_user.html.haml b/app/views/admin/users/_user.html.haml index ece213fea8..3d4a27f4c9 100644 --- a/app/views/admin/users/_user.html.haml +++ b/app/views/admin/users/_user.html.haml @@ -40,7 +40,7 @@ - if user.awaits_approval? %b.cool #{t :user_awaits_approval} - elsif user.last_request_at - %span.cool #{t(:last_seen, time_ago_in_words(user.last_request_at))} + %span.cool= t(:last_seen2, timeago(user.last_request_at)).html_safe - else %span.warn #{t :user_never_logged_in} %dt{ :style => "padding: 2px 0px 0px 0px" } diff --git a/app/views/comments/_comment.html.haml b/app/views/comments/_comment.html.haml index 0a25d33140..1d868725da 100644 --- a/app/views/comments/_comment.html.haml +++ b/app/views/comments/_comment.html.haml @@ -14,7 +14,7 @@ = link_to(comment.user.full_name, user_path(comment.user)) + "," %tt - added note #{t(:time_ago, distance_of_time_in_words(Time.now, comment.created_at))} + = t(:added_note, value: timeago(comment.created_at) ).html_safe - if collapsable && can?(:read, commentable) = " | " = link_to_function(comment.collapsed? ? t(:more) : t(:less), "crm.flip_note_or_email(this, '#{t(:more)}', '#{t(:less)}')", :class => "toggle") diff --git a/app/views/contacts/_index_full.html.haml b/app/views/contacts/_index_full.html.haml index 6943cbc7df..4c9a7c7cc6 100644 --- a/app/views/contacts/_index_full.html.haml +++ b/app/views/contacts/_index_full.html.haml @@ -41,7 +41,7 @@ == #{t :mobile_small}: %b= contact.mobile | - = t(:added_ago, time_ago_in_words(contact.created_at)) + = t(:added, value: timeago(contact.created_at)).html_safe - if contact.tag_list.present? %dt .tags= tags_for_index(contact) diff --git a/app/views/contacts/_index_long.html.haml b/app/views/contacts/_index_long.html.haml index 0ef5d58253..15558b8a8a 100644 --- a/app/views/contacts/_index_long.html.haml +++ b/app/views/contacts/_index_long.html.haml @@ -35,7 +35,8 @@ == #{t :mobile_small}: %b= contact.mobile | - = t(:added_ago, time_ago_in_words(contact.created_at)) + = t(:added, value: timeago(contact.created_at)).html_safe + - if contact.tag_list.present? %dt .tags= tags_for_index(contact) diff --git a/app/views/home/_account.html.haml b/app/views/home/_account.html.haml index 4fa7e63f8d..ceea07f6dd 100644 --- a/app/views/home/_account.html.haml +++ b/app/views/home/_account.html.haml @@ -10,11 +10,11 @@ – %tt = account.location << ", " unless account.location.blank? - - user_name = account.user_id == current_user.id ? t(:me) : account.user.try(:full_name) + - user_name = account.user.try(:full_name) - if user_name - = t(:added_by, :time_ago => time_ago_in_words(account.created_at), :user => user_name) + = t(:added_by2, :time_ago => timeago(account.created_at), :user => h(user_name)).html_safe - else - = t(:added_ago, :value => time_ago_in_words(account.created_at)) + = t(:added, :value => timeago(account.created_at)).html_safe - unless current_user.preference[:accounts_index_view] == "accounts_index_brief" %dt diff --git a/app/views/home/_opportunity.html.haml b/app/views/home/_opportunity.html.haml index 9cc028aad1..5ed8c7dbab 100644 --- a/app/views/home/_opportunity.html.haml +++ b/app/views/home/_opportunity.html.haml @@ -10,11 +10,11 @@ == #{t :from} #{link_to(h(opportunity.account.name), account_path(opportunity.account))} %tt – - - user_name = opportunity.user_id == current_user.id ? t(:me) : opportunity.user.try(:full_name) + - user_name = opportunity.user.try(:full_name) - if user_name - = t(:added_by, :time_ago => time_ago_in_words(opportunity.created_at), :user => user_name) + = t(:added_by2, :time_ago => timeago(opportunity.created_at), :user => h(user_name)).html_safe - else - = t(:added_ago, :value => time_ago_in_words(opportunity.created_at)) + = t(:added, :value => timeago(opportunity.created_at)).html_safe - unless current_user.preference[:opportunities_index_view] == "opportunities_index_brief" %dt %b= number_to_currency(opportunity.weighted_amount, :precision => 0) + " | " diff --git a/app/views/layouts/admin/application.html.haml b/app/views/layouts/admin/application.html.haml index a978afb3ea..86780892e4 100644 --- a/app/views/layouts/admin/application.html.haml +++ b/app/views/layouts/admin/application.html.haml @@ -9,6 +9,8 @@ %style= yield :styles = javascript_include_tag :application + -# include timeago locales + = javascript_include_tag "jquery_timeago/jquery.timeago.#{I18n.locale}" = hook(:javascript_includes, self) %script{:type => "text/javascript"}= yield :javascript @@ -22,4 +24,3 @@ = "crm.base_url = '#{Setting.base_url}';" unless Setting.base_url.blank? = get_browser_timezone_offset = yield :javascript_epilogue - diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index c8817b0800..250aecc5ec 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -16,6 +16,9 @@ = javascript_include_tag "jquery_ui_datepicker/jquery.ui.datepicker-#{I18n.locale}" = javascript_include_tag "jquery_ui_datepicker/jquery-ui-timepicker-#{I18n.locale}" + -# include timeago locales + = javascript_include_tag "jquery_timeago/jquery.timeago.#{I18n.locale}" + = csrf_meta_tag = hook(:javascript_includes, self) diff --git a/app/views/leads/_index_long.html.haml b/app/views/leads/_index_long.html.haml index 6bcff828aa..c50773b4e4 100644 --- a/app/views/leads/_index_long.html.haml +++ b/app/views/leads/_index_long.html.haml @@ -53,8 +53,8 @@ == #{t :mobile_small}: %b= lead.mobile | - = t(:added_ago, time_ago_in_words(lead.created_at)) - + = t(:added, value: timeago(lead.created_at)).html_safe + - if lead.tag_list.present? %dt .tags= tags_for_index(lead) diff --git a/app/views/opportunities/_index_brief.html.haml b/app/views/opportunities/_index_brief.html.haml index e4dce97614..45f5b45f21 100644 --- a/app/views/opportunities/_index_brief.html.haml +++ b/app/views/opportunities/_index_brief.html.haml @@ -20,10 +20,10 @@ == #{t :from} #{link_to_if can?(:read, account), account.name, account_path(account)} %tt – - - user_name = opportunity.user_id == current_user.id ? t(:me) : opportunity.user.try(:full_name) + - user_name = opportunity.user.try(:full_name) - if user_name - = t(:added_by, :time_ago => time_ago_in_words(opportunity.created_at), :user => user_name) + = t(:added_by2, :time_ago => timeago(opportunity.created_at), :user => h(user_name)).html_safe - else - = t(:added_ago, :value => time_ago_in_words(opportunity.created_at)) + = t(:added, :value => timeago(opportunity.created_at)).html_safe = hook(:opportunity_bottom, self, :opportunity => opportunity) diff --git a/app/views/opportunities/_index_long.html.haml b/app/views/opportunities/_index_long.html.haml index da10115ede..aded73edd4 100644 --- a/app/views/opportunities/_index_long.html.haml +++ b/app/views/opportunities/_index_long.html.haml @@ -20,11 +20,11 @@ == #{t :from} #{link_to_if can?(:read, account), account.name, account_path(account)} %tt – - - user_name = opportunity.user_id == current_user.id ? t(:me) : opportunity.user.try(:full_name) + - user_name = opportunity.user.try(:full_name) - if user_name - = t(:added_by, :time_ago => time_ago_in_words(opportunity.created_at), :user => user_name) + = t(:added_by2, :time_ago => timeago(opportunity.created_at), :user => h(user_name)).html_safe - else - = t(:added_ago, :value => time_ago_in_words(opportunity.created_at)) + = t(:added, :value => timeago(opportunity.created_at)).html_safe %dt %b= number_to_currency(opportunity.weighted_amount, :precision => 0) + " | " diff --git a/app/views/shared/_comment.html.haml b/app/views/shared/_comment.html.haml index 9a37907a4e..1ae1765a56 100644 --- a/app/views/shared/_comment.html.haml +++ b/app/views/shared/_comment.html.haml @@ -7,5 +7,5 @@ .indentslim = link_to comment.user.full_name, user_path(comment.user) - %tt= t(:time_ago, distance_of_time_in_words(Time.now, comment.created_at)) + %tt= timeago(comment.created_at).html_safe %dt= auto_link(simple_format comment.comment).html_safe diff --git a/app/views/versions/_version.html.haml b/app/views/versions/_version.html.haml index f9f8603572..5638630567 100644 --- a/app/views/versions/_version.html.haml +++ b/app/views/versions/_version.html.haml @@ -10,7 +10,7 @@ = t('version.' + version.event, :item => item_type, :by => user_name, :default => version.event) - else = auto_link(version.event).html_safe - %small= t('time_ago', time_ago_in_words(version.created_at)) + %small= timeago(version.created_at).html_safe %tt - version.changeset.each do |attr_name, change| - label, first, second = parse_version(attr_name, change) diff --git a/config/locales/en-GB_fat_free_crm.yml b/config/locales/en-GB_fat_free_crm.yml index 62ab546ec2..719f4b2d41 100644 --- a/config/locales/en-GB_fat_free_crm.yml +++ b/config/locales/en-GB_fat_free_crm.yml @@ -487,8 +487,10 @@ en-GB: save_note: Save Note add_note_help: Add a new note... edit_note: Edit Note + added: added %{value} added_ago: added %{value} ago added_by: added %{time_ago} ago by %{user} + added_by2: added %{time_ago} by %{user} back: Back cancel: Cancel close_form: Close form @@ -580,6 +582,7 @@ en-GB: notifications_tooltip: Subscribers will receive new comments via email subscribe_via_email: Subscribe via email disable_email_subscriptions: Disable email subscription + added_note: added note %{value} confirm_password_intro: Please type your new password and then confirm it. password_intro: Please specify your email address, and the instructions to reset your password will be sent to you. @@ -598,6 +601,7 @@ en-GB: approve: Approve create_user: Create User last_seen: last seen %{value} ago + last_seen2: last seen %{value} personal_information: Personal Information reactivate: Reactivate save_user: Save User diff --git a/config/locales/en-US_fat_free_crm.yml b/config/locales/en-US_fat_free_crm.yml index 6af81ba1ad..f1c2e76d91 100644 --- a/config/locales/en-US_fat_free_crm.yml +++ b/config/locales/en-US_fat_free_crm.yml @@ -584,8 +584,10 @@ en-US: save_note: Save Note add_note_help: Add a new note... edit_note: Edit Note + added: added %{value} added_ago: added %{value} ago added_by: added %{time_ago} ago by %{user} + added_by2: added %{time_ago} by %{user} back: Back cancel: Cancel close_form: Close form @@ -669,6 +671,7 @@ en-US: notifications_tooltip: Subscribers will receive new comments via email subscribe_via_email: Subscribe via email disable_email_subscriptions: Disable email subscription + added_note: added note %{value} # Views -> Emails. #---------------------------------------------------------------------------- @@ -702,6 +705,7 @@ en-US: approve: Approve create_user: Create User last_seen: last seen %{value} ago + last_seen2: last seen %{value} personal_information: Personal Information group_memberships: Group Memberships reactivate: Reactivate diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.cz.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.cz.js new file mode 100644 index 0000000000..b7137384b1 --- /dev/null +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.cz.js @@ -0,0 +1,18 @@ +// Czech +jQuery.timeago.settings.strings = { + prefixAgo: "před", + prefixFromNow: null, + suffixAgo: null, + suffixFromNow: null, + seconds: "méně než minutou", + minute: "minutou", + minutes: "%d minutami", + hour: "hodinou", + hours: "%d hodinami", + day: "1 dnem", + days: "%d dny", + month: "1 měsícem", + months: "%d měsíci", + year: "1 rokem", + years: "%d roky" +}; \ No newline at end of file diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.de.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.de.js new file mode 100644 index 0000000000..f10b06eebb --- /dev/null +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.de.js @@ -0,0 +1,18 @@ +// German +jQuery.timeago.settings.strings = { + prefixAgo: "vor", + prefixFromNow: "in", + suffixAgo: "", + suffixFromNow: "", + seconds: "wenigen Sekunden", + minute: "etwa einer Minute", + minutes: "%d Minuten", + hour: "etwa einer Stunde", + hours: "%d Stunden", + day: "etwa einem Tag", + days: "%d Tagen", + month: "etwa einem Monat", + months: "%d Monaten", + year: "etwa einem Jahr", + years: "%d Jahren" +}; \ No newline at end of file diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.en-GB.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.en-GB.js new file mode 100644 index 0000000000..3d6652c230 --- /dev/null +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.en-GB.js @@ -0,0 +1,20 @@ +// English (Template) +jQuery.timeago.settings.strings = { + prefixAgo: null, + prefixFromNow: null, + suffixAgo: "ago", + suffixFromNow: "from now", + seconds: "less than a minute", + minute: "about a minute", + minutes: "%d minutes", + hour: "about an hour", + hours: "about %d hours", + day: "a day", + days: "%d days", + month: "about a month", + months: "%d months", + year: "about a year", + years: "%d years", + wordSeparator: " ", + numbers: [] +}; diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.en-US.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.en-US.js new file mode 100644 index 0000000000..3d6652c230 --- /dev/null +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.en-US.js @@ -0,0 +1,20 @@ +// English (Template) +jQuery.timeago.settings.strings = { + prefixAgo: null, + prefixFromNow: null, + suffixAgo: "ago", + suffixFromNow: "from now", + seconds: "less than a minute", + minute: "about a minute", + minutes: "%d minutes", + hour: "about an hour", + hours: "about %d hours", + day: "a day", + days: "%d days", + month: "about a month", + months: "%d months", + year: "about a year", + years: "%d years", + wordSeparator: " ", + numbers: [] +}; diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.es.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.es.js new file mode 100644 index 0000000000..00c6d0a6cb --- /dev/null +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.es.js @@ -0,0 +1,18 @@ +// Spanish +jQuery.timeago.settings.strings = { + prefixAgo: "hace", + prefixFromNow: "dentro de", + suffixAgo: "", + suffixFromNow: "", + seconds: "menos de un minuto", + minute: "un minuto", + minutes: "unos %d minutos", + hour: "una hora", + hours: "%d horas", + day: "un día", + days: "%d días", + month: "un mes", + months: "%d meses", + year: "un año", + years: "%d años" +}; \ No newline at end of file diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.fr-CA.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.fr-CA.js new file mode 100644 index 0000000000..5028342306 --- /dev/null +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.fr-CA.js @@ -0,0 +1,17 @@ +// French +jQuery.timeago.settings.strings = { + // environ ~= about, it's optional + prefixAgo: "il y a", + prefixFromNow: "d'ici", + seconds: "moins d'une minute", + minute: "environ une minute", + minutes: "environ %d minutes", + hour: "environ une heure", + hours: "environ %d heures", + day: "environ un jour", + days: "environ %d jours", + month: "environ un mois", + months: "environ %d mois", + year: "un an", + years: "%d ans" +}; \ No newline at end of file diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.fr.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.fr.js new file mode 100644 index 0000000000..5028342306 --- /dev/null +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.fr.js @@ -0,0 +1,17 @@ +// French +jQuery.timeago.settings.strings = { + // environ ~= about, it's optional + prefixAgo: "il y a", + prefixFromNow: "d'ici", + seconds: "moins d'une minute", + minute: "environ une minute", + minutes: "environ %d minutes", + hour: "environ une heure", + hours: "environ %d heures", + day: "environ un jour", + days: "environ %d jours", + month: "environ un mois", + months: "environ %d mois", + year: "un an", + years: "%d ans" +}; \ No newline at end of file diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.it.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.it.js new file mode 100644 index 0000000000..6308dd30cc --- /dev/null +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.it.js @@ -0,0 +1,16 @@ +// Italian +jQuery.timeago.settings.strings = { + suffixAgo: "fa", + suffixFromNow: "da ora", + seconds: "meno di un minuto", + minute: "circa un minuto", + minutes: "%d minuti", + hour: "circa un'ora", + hours: "circa %d ore", + day: "un giorno", + days: "%d giorni", + month: "circa un mese", + months: "%d mesi", + year: "circa un anno", + years: "%d anni" +}; \ No newline at end of file diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.ja.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.ja.js new file mode 100644 index 0000000000..fd81f275d0 --- /dev/null +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.ja.js @@ -0,0 +1,19 @@ +// Japanese +jQuery.timeago.settings.strings = { + prefixAgo: "", + prefixFromNow: "今から", + suffixAgo: "前", + suffixFromNow: "後", + seconds: "1 分未満", + minute: "約 1 分", + minutes: "%d 分", + hour: "約 1 時間", + hours: "約 %d 時間", + day: "約 1 日", + days: "約 %d 日", + month: "約 1 月", + months: "約 %d 月", + year: "約 1 年", + years: "約 %d 年", + wordSeparator: "" +}; diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.js new file mode 100644 index 0000000000..4d58026ef9 --- /dev/null +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.js @@ -0,0 +1,193 @@ +/** + * Timeago is a jQuery plugin that makes it easy to support automatically + * updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago"). + * + * @name timeago + * @version 1.3.0 + * @requires jQuery v1.2.3+ + * @author Ryan McGeary + * @license MIT License - http://www.opensource.org/licenses/mit-license.php + * + * For usage and examples, visit: + * http://timeago.yarp.com/ + * + * Copyright (c) 2008-2013, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org) + */ + +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else { + // Browser globals + factory(jQuery); + } +}(function ($) { + $.timeago = function(timestamp) { + if (timestamp instanceof Date) { + return inWords(timestamp); + } else if (typeof timestamp === "string") { + return inWords($.timeago.parse(timestamp)); + } else if (typeof timestamp === "number") { + return inWords(new Date(timestamp)); + } else { + return inWords($.timeago.datetime(timestamp)); + } + }; + var $t = $.timeago; + + $.extend($.timeago, { + settings: { + refreshMillis: 60000, + allowFuture: false, + localeTitle: false, + cutoff: 0, + strings: { + prefixAgo: null, + prefixFromNow: null, + suffixAgo: "ago", + suffixFromNow: "from now", + seconds: "less than a minute", + minute: "about a minute", + minutes: "%d minutes", + hour: "about an hour", + hours: "about %d hours", + day: "a day", + days: "%d days", + month: "about a month", + months: "%d months", + year: "about a year", + years: "%d years", + wordSeparator: " ", + numbers: [] + } + }, + inWords: function(distanceMillis) { + var $l = this.settings.strings; + var prefix = $l.prefixAgo; + var suffix = $l.suffixAgo; + if (this.settings.allowFuture) { + if (distanceMillis < 0) { + prefix = $l.prefixFromNow; + suffix = $l.suffixFromNow; + } + } + + var seconds = Math.abs(distanceMillis) / 1000; + var minutes = seconds / 60; + var hours = minutes / 60; + var days = hours / 24; + var years = days / 365; + + function substitute(stringOrFunction, number) { + var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction; + var value = ($l.numbers && $l.numbers[number]) || number; + return string.replace(/%d/i, value); + } + + var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) || + seconds < 90 && substitute($l.minute, 1) || + minutes < 45 && substitute($l.minutes, Math.round(minutes)) || + minutes < 90 && substitute($l.hour, 1) || + hours < 24 && substitute($l.hours, Math.round(hours)) || + hours < 42 && substitute($l.day, 1) || + days < 30 && substitute($l.days, Math.round(days)) || + days < 45 && substitute($l.month, 1) || + days < 365 && substitute($l.months, Math.round(days / 30)) || + years < 1.5 && substitute($l.year, 1) || + substitute($l.years, Math.round(years)); + + var separator = $l.wordSeparator || ""; + if ($l.wordSeparator === undefined) { separator = " "; } + return $.trim([prefix, words, suffix].join(separator)); + }, + parse: function(iso8601) { + var s = $.trim(iso8601); + s = s.replace(/\.\d+/,""); // remove milliseconds + s = s.replace(/-/,"/").replace(/-/,"/"); + s = s.replace(/T/," ").replace(/Z/," UTC"); + s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400 + return new Date(s); + }, + datetime: function(elem) { + var iso8601 = $t.isTime(elem) ? $(elem).attr("datetime") : $(elem).attr("title"); + return $t.parse(iso8601); + }, + isTime: function(elem) { + // jQuery's `is()` doesn't play well with HTML5 in IE + return $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time"); + } + }); + + // functions that can be called via $(el).timeago('action') + // init is default when no action is given + // functions are called with context of a single element + var functions = { + init: function(){ + var refresh_el = $.proxy(refresh, this); + refresh_el(); + var $s = $t.settings; + if ($s.refreshMillis > 0) { + setInterval(refresh_el, $s.refreshMillis); + } + }, + update: function(time){ + $(this).data('timeago', { datetime: $t.parse(time) }); + refresh.apply(this); + }, + updateFromDOM: function(){ + $(this).data('timeago', { datetime: $t.parse( $t.isTime(this) ? $(this).attr("datetime") : $(this).attr("title") ) }); + refresh.apply(this); + } + }; + + $.fn.timeago = function(action, options) { + var fn = action ? functions[action] : functions.init; + if(!fn){ + throw new Error("Unknown function name '"+ action +"' for timeago"); + } + // each over objects here and call the requested function + this.each(function(){ + fn.call(this, options); + }); + return this; + }; + + function refresh() { + var data = prepareData(this); + var $s = $t.settings; + + if (!isNaN(data.datetime)) { + if ( $s.cutoff == 0 || distance(data.datetime) < $s.cutoff) { + $(this).text(inWords(data.datetime)); + } + } + return this; + } + + function prepareData(element) { + element = $(element); + if (!element.data("timeago")) { + element.data("timeago", { datetime: $t.datetime(element) }); + var text = $.trim(element.text()); + if ($t.settings.localeTitle) { + element.attr("title", element.data('timeago').datetime.toLocaleString()); + } else if (text.length > 0 && !($t.isTime(element) && element.attr("title"))) { + element.attr("title", text); + } + } + return element.data("timeago"); + } + + function inWords(date) { + return $t.inWords(distance(date)); + } + + function distance(date) { + return (new Date().getTime() - date.getTime()); + } + + // fix for IE6 suckage + document.createElement("abbr"); + document.createElement("time"); +})); diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.pl.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.pl.js new file mode 100644 index 0000000000..21d26fc1c1 --- /dev/null +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.pl.js @@ -0,0 +1,31 @@ +// Polish +(function() { + function numpf(n, s, t) { + // s - 2-4, 22-24, 32-34 ... + // t - 5-21, 25-31, ... + var n10 = n % 10; + if ( (n10 > 1) && (n10 < 5) && ( (n > 20) || (n < 10) ) ) { + return s; + } else { + return t; + } + } + + jQuery.timeago.settings.strings = { + prefixAgo: null, + prefixFromNow: "za", + suffixAgo: "temu", + suffixFromNow: null, + seconds: "mniej niż minutę", + minute: "minutę", + minutes: function(value) { return numpf(value, "%d minuty", "%d minut"); }, + hour: "godzinę", + hours: function(value) { return numpf(value, "%d godziny", "%d godzin"); }, + day: "dzień", + days: "%d dni", + month: "miesiąc", + months: function(value) { return numpf(value, "%d miesiące", "%d miesięcy"); }, + year: "rok", + years: function(value) { return numpf(value, "%d lata", "%d lat"); } + }; +})(); \ No newline at end of file diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.pt-BR.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.pt-BR.js new file mode 100644 index 0000000000..c72ea386a7 --- /dev/null +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.pt-BR.js @@ -0,0 +1,18 @@ +// Brazilian Portuguese +jQuery.timeago.settings.strings = { + prefixAgo: "há", + prefixFromNow: "em", + suffixAgo: null, + suffixFromNow: null, + seconds: "alguns segundos", + minute: "um minuto", + minutes: "%d minutos", + hour: "uma hora", + hours: "%d horas", + day: "um dia", + days: "%d dias", + month: "um mês", + months: "%d meses", + year: "um ano", + years: "%d anos" +}; diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.ru.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.ru.js new file mode 100644 index 0000000000..4cdc01b1ce --- /dev/null +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.ru.js @@ -0,0 +1,34 @@ +// Russian +(function() { + function numpf(n, f, s, t) { + // f - 1, 21, 31, ... + // s - 2-4, 22-24, 32-34 ... + // t - 5-20, 25-30, ... + var n10 = n % 10; + if ( (n10 == 1) && ( (n == 1) || (n > 20) ) ) { + return f; + } else if ( (n10 > 1) && (n10 < 5) && ( (n > 20) || (n < 10) ) ) { + return s; + } else { + return t; + } + } + + jQuery.timeago.settings.strings = { + prefixAgo: null, + prefixFromNow: "через", + suffixAgo: "назад", + suffixFromNow: null, + seconds: "меньше минуты", + minute: "минуту", + minutes: function(value) { return numpf(value, "%d минута", "%d минуты", "%d минут"); }, + hour: "час", + hours: function(value) { return numpf(value, "%d час", "%d часа", "%d часов"); }, + day: "день", + days: function(value) { return numpf(value, "%d день", "%d дня", "%d дней"); }, + month: "месяц", + months: function(value) { return numpf(value, "%d месяц", "%d месяца", "%d месяцев"); }, + year: "год", + years: function(value) { return numpf(value, "%d год", "%d года", "%d лет"); } + }; +})(); \ No newline at end of file diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.sv-SE.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.sv-SE.js new file mode 100644 index 0000000000..b5c3947179 --- /dev/null +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.sv-SE.js @@ -0,0 +1,18 @@ +// Swedish +jQuery.timeago.settings.strings = { + prefixAgo: "för", + prefixFromNow: "om", + suffixAgo: "sedan", + suffixFromNow: "", + seconds: "mindre än en minut", + minute: "ungefär en minut", + minutes: "%d minuter", + hour: "ungefär en timme", + hours: "ungefär %d timmar", + day: "en dag", + days: "%d dagar", + month: "ungefär en månad", + months: "%d månader", + year: "ungefär ett år", + years: "%d år" +}; \ No newline at end of file diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.th.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.th.js new file mode 100644 index 0000000000..894bf7fc83 --- /dev/null +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.th.js @@ -0,0 +1,20 @@ +// Thai +jQuery.timeago.settings.strings = { + prefixAgo: null, + prefixFromNow: null, + suffixAgo: "ที่แล้ว", + suffixFromNow: "จากตอนนี้", + seconds: "น้อยกว่าหนึ่งนาที", + minute: "ประมาณหนึ่งนาที", + minutes: "%d นาที", + hour: "ประมาณหนึ่งชั่วโมง", + hours: "ประมาณ %d ชั่วโมง", + day: "หนึ่งวัน", + days: "%d วัน", + month: "ประมาณหนึ่งเดือน", + months: "%d เดือน", + year: "ประมาณหนึ่งปี", + years: "%d ปี", + wordSeparator: "", + numbers: [] +}; diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.zh-CN.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.zh-CN.js new file mode 100644 index 0000000000..f39417ef29 --- /dev/null +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.zh-CN.js @@ -0,0 +1,20 @@ +// Simplified Chinese +jQuery.timeago.settings.strings = { + prefixAgo: null, + prefixFromNow: "从现在开始", + suffixAgo: "之前", + suffixFromNow: null, + seconds: "不到 1 分钟", + minute: "大约 1 分钟", + minutes: "%d 分钟", + hour: "大约 1 小时", + hours: "大约 %d 小时", + day: "1 天", + days: "%d 天", + month: "大约 1 个月", + months: "%d 月", + year: "大约 1 年", + years: "%d 年", + numbers: [], + wordSeparator: "" +}; \ No newline at end of file From de314d18d52eb1c550d45c79398f31ecbc6ef576 Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Tue, 3 Dec 2013 16:08:05 +0800 Subject: [PATCH 039/213] Fixed issue with timeago plugin not precompiling. Resolves issue #286 --- config/application.rb | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/config/application.rb b/config/application.rb index f4417a4d54..4a115b7749 100644 --- a/config/application.rb +++ b/config/application.rb @@ -75,6 +75,25 @@ class Application < Rails::Application # parameters by using an attr_accessible or attr_protected declaration. # config.active_record.whitelist_attributes = true + Rails.application.config.assets.precompile += %w( + jquery_timeago/jquery.timeago.cz.js + jquery_timeago/jquery.timeago.de.js + jquery_timeago/jquery.timeago.en-GB.js + jquery_timeago/jquery.timeago.en-US.js + jquery_timeago/jquery.timeago.es.js + jquery_timeago/jquery.timeago.fr-CA.js + jquery_timeago/jquery.timeago.fr.js + jquery_timeago/jquery.timeago.it.js + jquery_timeago/jquery.timeago.ja.js + jquery_timeago/jquery.timeago.js.js + jquery_timeago/jquery.timeago.pl.js + jquery_timeago/jquery.timeago.pt-BR.js + jquery_timeago/jquery.timeago.ru.js + jquery_timeago/jquery.timeago.sv-SE.js + jquery_timeago/jquery.timeago.th.js + jquery_timeago/jquery.timeago.zh-CN.js + ) + # Enable the asset pipeline config.assets.enabled = true From a80c44583d28ba65b7fa1b7344203282bdbb7943 Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Tue, 3 Dec 2013 16:22:43 +0800 Subject: [PATCH 040/213] Ensure user isn't deleted if they still have tasks. --- app/models/polymorphic/task.rb | 3 +++ app/models/users/user.rb | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/models/polymorphic/task.rb b/app/models/polymorphic/task.rb index 4a41f48109..fc16cba806 100644 --- a/app/models/polymorphic/task.rb +++ b/app/models/polymorphic/task.rb @@ -46,6 +46,9 @@ class Task < ActiveRecord::Base limit(options[:limit]) # nil selects all records } + scope :created_by, lambda { |user| where(:user_id => user.id) } + scope :assigned_to, lambda { |user| where(:assigned_to => user.id) } + # Tasks assigned by the user to others. That's what we see on Tasks/Assigned. scope :assigned_by, lambda { |user| includes(:assignee). diff --git a/app/models/users/user.rb b/app/models/users/user.rb index a6d286886f..48dde72cdb 100644 --- a/app/models/users/user.rb +++ b/app/models/users/user.rb @@ -163,7 +163,7 @@ def check_if_current_user # Prevent deleting a user unless she has no artifacts left. #---------------------------------------------------------------------------- def check_if_has_related_assets - artifacts = %w(Account Campaign Lead Contact Opportunity Comment).inject(0) do |sum, asset| + artifacts = %w(Account Campaign Lead Contact Opportunity Comment Task).inject(0) do |sum, asset| klass = asset.constantize sum += klass.assigned_to(self).count if asset != "Comment" sum += klass.created_by(self).count From e4fb89badfad7f64b961976036e54049a0caf5f1 Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Wed, 4 Dec 2013 11:08:03 +0800 Subject: [PATCH 041/213] Better solution to internationalizing jquery.timeago plugin. --- app/assets/javascripts/application.js.erb | 2 +- app/assets/javascripts/crm.js | 1 + app/assets/javascripts/timeago.js | 2 ++ app/views/accounts/_index_brief.html.haml | 4 ++-- app/views/accounts/_index_long.html.haml | 4 ++-- app/views/admin/fields/_field.html.haml | 2 +- app/views/contacts/_index_full.html.haml | 2 +- app/views/contacts/_index_long.html.haml | 2 +- app/views/home/_account.html.haml | 4 ++-- app/views/home/_opportunity.html.haml | 4 ++-- app/views/layouts/application.html.haml | 4 +--- app/views/leads/_index_long.html.haml | 2 +- .../opportunities/_index_brief.html.haml | 4 ++-- app/views/opportunities/_index_long.html.haml | 4 ++-- config/application.rb | 19 ------------------- config/locales/en-GB_fat_free_crm.yml | 6 ++---- config/locales/en-US_fat_free_crm.yml | 4 +--- .../javascripts/jquery_timeago/index.js | 17 +++++++++++++++++ .../jquery_timeago/jquery.timeago.cz.js | 4 ++-- .../jquery_timeago/jquery.timeago.de.js | 4 ++-- .../jquery_timeago/jquery.timeago.en-GB.js | 2 +- .../jquery_timeago/jquery.timeago.en-US.js | 2 +- .../jquery_timeago/jquery.timeago.es.js | 4 ++-- .../jquery_timeago/jquery.timeago.fr-CA.js | 4 ++-- .../jquery_timeago/jquery.timeago.fr.js | 4 ++-- .../jquery_timeago/jquery.timeago.it.js | 4 ++-- .../jquery_timeago/jquery.timeago.ja.js | 2 +- .../jquery_timeago/jquery.timeago.js | 1 + .../jquery_timeago/jquery.timeago.pl.js | 4 ++-- .../jquery_timeago/jquery.timeago.pt-BR.js | 4 ++-- .../jquery_timeago/jquery.timeago.ru.js | 4 ++-- .../jquery_timeago/jquery.timeago.sv-SE.js | 4 ++-- .../jquery_timeago/jquery.timeago.th.js | 2 +- .../jquery_timeago/jquery.timeago.zh-CN.js | 4 ++-- 34 files changed, 68 insertions(+), 72 deletions(-) create mode 100644 vendor/assets/javascripts/jquery_timeago/index.js diff --git a/app/assets/javascripts/application.js.erb b/app/assets/javascripts/application.js.erb index af194eb0eb..372b0437ab 100644 --- a/app/assets/javascripts/application.js.erb +++ b/app/assets/javascripts/application.js.erb @@ -33,7 +33,7 @@ //= require admin/fields //= require format_buttons //= require crm_comments -//= require jquery_timeago/jquery.timeago +//= require jquery_timeago //= require timeago //= require_self diff --git a/app/assets/javascripts/crm.js b/app/assets/javascripts/crm.js index 6a86ffbcfe..72ebad83fa 100644 --- a/app/assets/javascripts/crm.js +++ b/app/assets/javascripts/crm.js @@ -10,6 +10,7 @@ var crm = { searchRequest : null, autocompleter : null, base_url : "", + language : 'en-US', //---------------------------------------------------------------------------- find_form: function(class_name) { diff --git a/app/assets/javascripts/timeago.js b/app/assets/javascripts/timeago.js index 97118500d5..d106bd2761 100644 --- a/app/assets/javascripts/timeago.js +++ b/app/assets/javascripts/timeago.js @@ -1,6 +1,8 @@ // Run function on page load jQuery(document).ready(function() { jQuery.timeago.settings.allowFuture = true; + // our modification to choose correct language + jQuery.timeago.settings.strings = jQuery.timeago.settings.locales[crm.language] jQuery("span.timeago").timeago(); // update every minute setInterval(function(){ jQuery("span.timeago").timeago(); }, 60000); diff --git a/app/views/accounts/_index_brief.html.haml b/app/views/accounts/_index_brief.html.haml index 305069094d..99562f6094 100644 --- a/app/views/accounts/_index_brief.html.haml +++ b/app/views/accounts/_index_brief.html.haml @@ -23,9 +23,9 @@ = account.location << ", " unless account.location.blank? - user_name = account.user.try(:full_name) - if user_name - = t(:added_by2, :time_ago => timeago(account.created_at), :user => h(user_name)).html_safe << " | " + = t(:added_by, :time_ago => timeago(account.created_at), :user => h(user_name)).html_safe << " | " - else - = t(:added, :value => timeago(account.created_at)).html_safe << " | " + = t(:added_ago, :value => timeago(account.created_at)).html_safe << " | " = t('pluralize.contact', account.contacts.count) << " | " = t('pluralize.opportunity', account.opportunities.count) diff --git a/app/views/accounts/_index_long.html.haml b/app/views/accounts/_index_long.html.haml index 9f2167e8b4..c2d48d6ec2 100644 --- a/app/views/accounts/_index_long.html.haml +++ b/app/views/accounts/_index_long.html.haml @@ -23,9 +23,9 @@ = account.location << ", " unless account.location.blank? - user_name = account.user.try(:full_name) - if user_name - = t(:added_by2, :time_ago => timeago(account.created_at), :user => h(user_name)).html_safe << " | " + = t(:added_by, :time_ago => timeago(account.created_at), :user => h(user_name)).html_safe << " | " - else - = t(:added, :value => timeago(account.created_at)).html_safe << " | " + = t(:added_ago, :value => timeago(account.created_at)).html_safe << " | " = t('pluralize.contact', account.contacts.count) << " | " = t('pluralize.opportunity', account.opportunities.count) diff --git a/app/views/admin/fields/_field.html.haml b/app/views/admin/fields/_field.html.haml index 2154099a60..5916551455 100644 --- a/app/views/admin/fields/_field.html.haml +++ b/app/views/admin/fields/_field.html.haml @@ -11,7 +11,7 @@ %b= field.label == (#{t("field_types.#{field.as}.title")}) - = t(:added, value: timeago(field.created_at)).html_safe + = t(:added_ago, value: timeago(field.created_at)).html_safe = hook(:field_bottom, self, :field => field) .edit_field diff --git a/app/views/contacts/_index_full.html.haml b/app/views/contacts/_index_full.html.haml index 4c9a7c7cc6..3073832f4a 100644 --- a/app/views/contacts/_index_full.html.haml +++ b/app/views/contacts/_index_full.html.haml @@ -41,7 +41,7 @@ == #{t :mobile_small}: %b= contact.mobile | - = t(:added, value: timeago(contact.created_at)).html_safe + = t(:added_ago, value: timeago(contact.created_at)).html_safe - if contact.tag_list.present? %dt .tags= tags_for_index(contact) diff --git a/app/views/contacts/_index_long.html.haml b/app/views/contacts/_index_long.html.haml index 15558b8a8a..1256508a6a 100644 --- a/app/views/contacts/_index_long.html.haml +++ b/app/views/contacts/_index_long.html.haml @@ -35,7 +35,7 @@ == #{t :mobile_small}: %b= contact.mobile | - = t(:added, value: timeago(contact.created_at)).html_safe + = t(:added_ago, value: timeago(contact.created_at)).html_safe - if contact.tag_list.present? %dt diff --git a/app/views/home/_account.html.haml b/app/views/home/_account.html.haml index ceea07f6dd..27ff582a31 100644 --- a/app/views/home/_account.html.haml +++ b/app/views/home/_account.html.haml @@ -12,9 +12,9 @@ = account.location << ", " unless account.location.blank? - user_name = account.user.try(:full_name) - if user_name - = t(:added_by2, :time_ago => timeago(account.created_at), :user => h(user_name)).html_safe + = t(:added_by, :time_ago => timeago(account.created_at), :user => h(user_name)).html_safe - else - = t(:added, :value => timeago(account.created_at)).html_safe + = t(:added_ago, :value => timeago(account.created_at)).html_safe - unless current_user.preference[:accounts_index_view] == "accounts_index_brief" %dt diff --git a/app/views/home/_opportunity.html.haml b/app/views/home/_opportunity.html.haml index 5ed8c7dbab..0fa7bb10e1 100644 --- a/app/views/home/_opportunity.html.haml +++ b/app/views/home/_opportunity.html.haml @@ -12,9 +12,9 @@ – - user_name = opportunity.user.try(:full_name) - if user_name - = t(:added_by2, :time_ago => timeago(opportunity.created_at), :user => h(user_name)).html_safe + = t(:added_by, :time_ago => timeago(opportunity.created_at), :user => h(user_name)).html_safe - else - = t(:added, :value => timeago(opportunity.created_at)).html_safe + = t(:added_ago, :value => timeago(opportunity.created_at)).html_safe - unless current_user.preference[:opportunities_index_view] == "opportunities_index_brief" %dt %b= number_to_currency(opportunity.weighted_amount, :precision => 0) + " | " diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 250aecc5ec..a2f00bf181 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -16,13 +16,11 @@ = javascript_include_tag "jquery_ui_datepicker/jquery.ui.datepicker-#{I18n.locale}" = javascript_include_tag "jquery_ui_datepicker/jquery-ui-timepicker-#{I18n.locale}" - -# include timeago locales - = javascript_include_tag "jquery_timeago/jquery.timeago.#{I18n.locale}" - = csrf_meta_tag = hook(:javascript_includes, self) :javascript + crm.language = "#{I18n.locale}" #{yield :javascript} var _ffcrm_users = [ #{User.all.map{|u| "\"#{u.full_name} (@#{u.username})\"" }.join(",\n")} diff --git a/app/views/leads/_index_long.html.haml b/app/views/leads/_index_long.html.haml index c50773b4e4..695d446d44 100644 --- a/app/views/leads/_index_long.html.haml +++ b/app/views/leads/_index_long.html.haml @@ -53,7 +53,7 @@ == #{t :mobile_small}: %b= lead.mobile | - = t(:added, value: timeago(lead.created_at)).html_safe + = t(:added_ago, value: timeago(lead.created_at)).html_safe - if lead.tag_list.present? %dt diff --git a/app/views/opportunities/_index_brief.html.haml b/app/views/opportunities/_index_brief.html.haml index 45f5b45f21..a71e5351f0 100644 --- a/app/views/opportunities/_index_brief.html.haml +++ b/app/views/opportunities/_index_brief.html.haml @@ -22,8 +22,8 @@ – - user_name = opportunity.user.try(:full_name) - if user_name - = t(:added_by2, :time_ago => timeago(opportunity.created_at), :user => h(user_name)).html_safe + = t(:added_by, :time_ago => timeago(opportunity.created_at), :user => h(user_name)).html_safe - else - = t(:added, :value => timeago(opportunity.created_at)).html_safe + = t(:added_ago, :value => timeago(opportunity.created_at)).html_safe = hook(:opportunity_bottom, self, :opportunity => opportunity) diff --git a/app/views/opportunities/_index_long.html.haml b/app/views/opportunities/_index_long.html.haml index aded73edd4..b9eb06fe21 100644 --- a/app/views/opportunities/_index_long.html.haml +++ b/app/views/opportunities/_index_long.html.haml @@ -22,9 +22,9 @@ – - user_name = opportunity.user.try(:full_name) - if user_name - = t(:added_by2, :time_ago => timeago(opportunity.created_at), :user => h(user_name)).html_safe + = t(:added_by, :time_ago => timeago(opportunity.created_at), :user => h(user_name)).html_safe - else - = t(:added, :value => timeago(opportunity.created_at)).html_safe + = t(:added_ago, :value => timeago(opportunity.created_at)).html_safe %dt %b= number_to_currency(opportunity.weighted_amount, :precision => 0) + " | " diff --git a/config/application.rb b/config/application.rb index 4a115b7749..f4417a4d54 100644 --- a/config/application.rb +++ b/config/application.rb @@ -75,25 +75,6 @@ class Application < Rails::Application # parameters by using an attr_accessible or attr_protected declaration. # config.active_record.whitelist_attributes = true - Rails.application.config.assets.precompile += %w( - jquery_timeago/jquery.timeago.cz.js - jquery_timeago/jquery.timeago.de.js - jquery_timeago/jquery.timeago.en-GB.js - jquery_timeago/jquery.timeago.en-US.js - jquery_timeago/jquery.timeago.es.js - jquery_timeago/jquery.timeago.fr-CA.js - jquery_timeago/jquery.timeago.fr.js - jquery_timeago/jquery.timeago.it.js - jquery_timeago/jquery.timeago.ja.js - jquery_timeago/jquery.timeago.js.js - jquery_timeago/jquery.timeago.pl.js - jquery_timeago/jquery.timeago.pt-BR.js - jquery_timeago/jquery.timeago.ru.js - jquery_timeago/jquery.timeago.sv-SE.js - jquery_timeago/jquery.timeago.th.js - jquery_timeago/jquery.timeago.zh-CN.js - ) - # Enable the asset pipeline config.assets.enabled = true diff --git a/config/locales/en-GB_fat_free_crm.yml b/config/locales/en-GB_fat_free_crm.yml index 719f4b2d41..68ff63ea8f 100644 --- a/config/locales/en-GB_fat_free_crm.yml +++ b/config/locales/en-GB_fat_free_crm.yml @@ -487,10 +487,8 @@ en-GB: save_note: Save Note add_note_help: Add a new note... edit_note: Edit Note - added: added %{value} - added_ago: added %{value} ago - added_by: added %{time_ago} ago by %{user} - added_by2: added %{time_ago} by %{user} + added_ago: added %{value} + added_by: added %{time_ago} by %{user} back: Back cancel: Cancel close_form: Close form diff --git a/config/locales/en-US_fat_free_crm.yml b/config/locales/en-US_fat_free_crm.yml index f1c2e76d91..7cc770e791 100644 --- a/config/locales/en-US_fat_free_crm.yml +++ b/config/locales/en-US_fat_free_crm.yml @@ -584,10 +584,8 @@ en-US: save_note: Save Note add_note_help: Add a new note... edit_note: Edit Note - added: added %{value} - added_ago: added %{value} ago + added_ago: added %{value} added_by: added %{time_ago} ago by %{user} - added_by2: added %{time_ago} by %{user} back: Back cancel: Cancel close_form: Close form diff --git a/vendor/assets/javascripts/jquery_timeago/index.js b/vendor/assets/javascripts/jquery_timeago/index.js new file mode 100644 index 0000000000..b03464b671 --- /dev/null +++ b/vendor/assets/javascripts/jquery_timeago/index.js @@ -0,0 +1,17 @@ +//= require jquery_timeago/jquery.timeago +//= require jquery_timeago/jquery.timeago.cz +//= require jquery_timeago/jquery.timeago.de +//= require jquery_timeago/jquery.timeago.en-GB +//= require jquery_timeago/jquery.timeago.en-US +//= require jquery_timeago/jquery.timeago.es +//= require jquery_timeago/jquery.timeago.fr-CA +//= require jquery_timeago/jquery.timeago.fr +//= require jquery_timeago/jquery.timeago.it +//= require jquery_timeago/jquery.timeago.ja +//= require jquery_timeago/jquery.timeago.js +//= require jquery_timeago/jquery.timeago.pl.js +//= require jquery_timeago/jquery.timeago.pt-BR +//= require jquery_timeago/jquery.timeago.ru.js +//= require jquery_timeago/jquery.timeago.sv-SE +//= require jquery_timeago/jquery.timeago.th +//= require jquery_timeago/jquery.timeago.zh-CN diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.cz.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.cz.js index b7137384b1..85c036f17b 100644 --- a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.cz.js +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.cz.js @@ -1,5 +1,5 @@ // Czech -jQuery.timeago.settings.strings = { +jQuery.timeago.settings.locales['cz'] = { prefixAgo: "před", prefixFromNow: null, suffixAgo: null, @@ -15,4 +15,4 @@ jQuery.timeago.settings.strings = { months: "%d měsíci", year: "1 rokem", years: "%d roky" -}; \ No newline at end of file +}; diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.de.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.de.js index f10b06eebb..3e36e7508e 100644 --- a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.de.js +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.de.js @@ -1,5 +1,5 @@ // German -jQuery.timeago.settings.strings = { +jQuery.timeago.settings.locales['de'] = { prefixAgo: "vor", prefixFromNow: "in", suffixAgo: "", @@ -15,4 +15,4 @@ jQuery.timeago.settings.strings = { months: "%d Monaten", year: "etwa einem Jahr", years: "%d Jahren" -}; \ No newline at end of file +}; diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.en-GB.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.en-GB.js index 3d6652c230..4ca656ce2d 100644 --- a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.en-GB.js +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.en-GB.js @@ -1,5 +1,5 @@ // English (Template) -jQuery.timeago.settings.strings = { +jQuery.timeago.settings.locales['en-GB'] = { prefixAgo: null, prefixFromNow: null, suffixAgo: "ago", diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.en-US.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.en-US.js index 3d6652c230..d0a6b7bc2a 100644 --- a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.en-US.js +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.en-US.js @@ -1,5 +1,5 @@ // English (Template) -jQuery.timeago.settings.strings = { +jQuery.timeago.settings.locales['en-US'] = { prefixAgo: null, prefixFromNow: null, suffixAgo: "ago", diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.es.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.es.js index 00c6d0a6cb..e3c5843714 100644 --- a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.es.js +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.es.js @@ -1,5 +1,5 @@ // Spanish -jQuery.timeago.settings.strings = { +jQuery.timeago.settings.locales['es'] = { prefixAgo: "hace", prefixFromNow: "dentro de", suffixAgo: "", @@ -15,4 +15,4 @@ jQuery.timeago.settings.strings = { months: "%d meses", year: "un año", years: "%d años" -}; \ No newline at end of file +}; diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.fr-CA.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.fr-CA.js index 5028342306..4ba7240755 100644 --- a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.fr-CA.js +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.fr-CA.js @@ -1,5 +1,5 @@ // French -jQuery.timeago.settings.strings = { +jQuery.timeago.settings.locales['fr-CA'] = { // environ ~= about, it's optional prefixAgo: "il y a", prefixFromNow: "d'ici", @@ -14,4 +14,4 @@ jQuery.timeago.settings.strings = { months: "environ %d mois", year: "un an", years: "%d ans" -}; \ No newline at end of file +}; diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.fr.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.fr.js index 5028342306..7f8938bd4e 100644 --- a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.fr.js +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.fr.js @@ -1,5 +1,5 @@ // French -jQuery.timeago.settings.strings = { +jQuery.timeago.settings.locales['fr'] = { // environ ~= about, it's optional prefixAgo: "il y a", prefixFromNow: "d'ici", @@ -14,4 +14,4 @@ jQuery.timeago.settings.strings = { months: "environ %d mois", year: "un an", years: "%d ans" -}; \ No newline at end of file +}; diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.it.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.it.js index 6308dd30cc..e32f7412bb 100644 --- a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.it.js +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.it.js @@ -1,5 +1,5 @@ // Italian -jQuery.timeago.settings.strings = { +jQuery.timeago.settings.locales['it'] = { suffixAgo: "fa", suffixFromNow: "da ora", seconds: "meno di un minuto", @@ -13,4 +13,4 @@ jQuery.timeago.settings.strings = { months: "%d mesi", year: "circa un anno", years: "%d anni" -}; \ No newline at end of file +}; diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.ja.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.ja.js index fd81f275d0..7dff5bfef5 100644 --- a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.ja.js +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.ja.js @@ -1,5 +1,5 @@ // Japanese -jQuery.timeago.settings.strings = { +jQuery.timeago.settings.locales['ja'] = { prefixAgo: "", prefixFromNow: "今から", suffixAgo: "前", diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.js index 4d58026ef9..db46097744 100644 --- a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.js +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.js @@ -42,6 +42,7 @@ allowFuture: false, localeTitle: false, cutoff: 0, + locales: {}, // Added for FFCRM strings: { prefixAgo: null, prefixFromNow: null, diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.pl.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.pl.js index 21d26fc1c1..ee4bdfaa12 100644 --- a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.pl.js +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.pl.js @@ -11,7 +11,7 @@ } } - jQuery.timeago.settings.strings = { + jQuery.timeago.settings.locales['pl'] = { prefixAgo: null, prefixFromNow: "za", suffixAgo: "temu", @@ -28,4 +28,4 @@ year: "rok", years: function(value) { return numpf(value, "%d lata", "%d lat"); } }; -})(); \ No newline at end of file +})(); diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.pt-BR.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.pt-BR.js index c72ea386a7..c81e2ba1ad 100644 --- a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.pt-BR.js +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.pt-BR.js @@ -1,5 +1,5 @@ -// Brazilian Portuguese -jQuery.timeago.settings.strings = { +// Brazilian Portuguese +jQuery.timeago.settings.locales['pt-BR'] = { prefixAgo: "há", prefixFromNow: "em", suffixAgo: null, diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.ru.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.ru.js index 4cdc01b1ce..6faf05afbc 100644 --- a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.ru.js +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.ru.js @@ -14,7 +14,7 @@ } } - jQuery.timeago.settings.strings = { + jQuery.timeago.settings.locales['ru'] = { prefixAgo: null, prefixFromNow: "через", suffixAgo: "назад", @@ -31,4 +31,4 @@ year: "год", years: function(value) { return numpf(value, "%d год", "%d года", "%d лет"); } }; -})(); \ No newline at end of file +})(); diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.sv-SE.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.sv-SE.js index b5c3947179..7e59083feb 100644 --- a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.sv-SE.js +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.sv-SE.js @@ -1,5 +1,5 @@ // Swedish -jQuery.timeago.settings.strings = { +jQuery.timeago.settings.locales['sv-SE'] = { prefixAgo: "för", prefixFromNow: "om", suffixAgo: "sedan", @@ -15,4 +15,4 @@ jQuery.timeago.settings.strings = { months: "%d månader", year: "ungefär ett år", years: "%d år" -}; \ No newline at end of file +}; diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.th.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.th.js index 894bf7fc83..20ce5a7b15 100644 --- a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.th.js +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.th.js @@ -1,5 +1,5 @@ // Thai -jQuery.timeago.settings.strings = { +jQuery.timeago.settings.locales['th'] = { prefixAgo: null, prefixFromNow: null, suffixAgo: "ที่แล้ว", diff --git a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.zh-CN.js b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.zh-CN.js index f39417ef29..6c156d1867 100644 --- a/vendor/assets/javascripts/jquery_timeago/jquery.timeago.zh-CN.js +++ b/vendor/assets/javascripts/jquery_timeago/jquery.timeago.zh-CN.js @@ -1,5 +1,5 @@ // Simplified Chinese -jQuery.timeago.settings.strings = { +jQuery.timeago.settings.locales['zh-CN'] = { prefixAgo: null, prefixFromNow: "从现在开始", suffixAgo: "之前", @@ -17,4 +17,4 @@ jQuery.timeago.settings.strings = { years: "%d 年", numbers: [], wordSeparator: "" -}; \ No newline at end of file +}; From 298fbe14b6efe41d58025f835510cb85a542fa90 Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Wed, 4 Dec 2013 11:10:03 +0800 Subject: [PATCH 042/213] Updated rails --- Gemfile.lock | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index cac2c90c20..1e3a76ea5b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,12 +1,12 @@ GEM remote: https://rubygems.org/ specs: - actionmailer (3.2.15) - actionpack (= 3.2.15) + actionmailer (3.2.16) + actionpack (= 3.2.16) mail (~> 2.5.4) - actionpack (3.2.15) - activemodel (= 3.2.15) - activesupport (= 3.2.15) + actionpack (3.2.16) + activemodel (= 3.2.16) + activesupport (= 3.2.16) builder (~> 3.0.0) erubis (~> 2.7.0) journey (~> 1.0.4) @@ -14,18 +14,18 @@ GEM rack-cache (~> 1.2) rack-test (~> 0.6.1) sprockets (~> 2.2.1) - activemodel (3.2.15) - activesupport (= 3.2.15) + activemodel (3.2.16) + activesupport (= 3.2.16) builder (~> 3.0.0) - activerecord (3.2.15) - activemodel (= 3.2.15) - activesupport (= 3.2.15) + activerecord (3.2.16) + activemodel (= 3.2.16) + activesupport (= 3.2.16) arel (~> 3.0.2) tzinfo (~> 0.3.29) - activeresource (3.2.15) - activemodel (= 3.2.15) - activesupport (= 3.2.15) - activesupport (3.2.15) + activeresource (3.2.16) + activemodel (= 3.2.16) + activesupport (= 3.2.16) + activesupport (3.2.16) i18n (~> 0.6, >= 0.6.4) multi_json (~> 1.0) acts-as-taggable-on (2.3.3) @@ -124,7 +124,7 @@ GEM highline (1.6.15) hike (1.2.3) htmlentities (4.3.1) - i18n (0.6.5) + i18n (0.6.9) journey (1.0.4) jquery-rails (2.1.4) railties (>= 3.0, < 5.0) @@ -140,7 +140,7 @@ GEM mime-types (~> 1.16) treetop (~> 1.4.8) method_source (0.7.1) - mime-types (1.25) + mime-types (1.25.1) mini_portile (0.5.1) multi_json (1.8.2) net-scp (1.0.4) @@ -186,19 +186,19 @@ GEM rack rack-test (0.6.2) rack (>= 1.0) - rails (3.2.15) - actionmailer (= 3.2.15) - actionpack (= 3.2.15) - activerecord (= 3.2.15) - activeresource (= 3.2.15) - activesupport (= 3.2.15) + rails (3.2.16) + actionmailer (= 3.2.16) + actionpack (= 3.2.16) + activerecord (= 3.2.16) + activeresource (= 3.2.16) + activesupport (= 3.2.16) bundler (~> 1.0) - railties (= 3.2.15) + railties (= 3.2.16) rails3-jquery-autocomplete (1.0.7) rails (~> 3.0) - railties (3.2.15) - actionpack (= 3.2.15) - activesupport (= 3.2.15) + railties (3.2.16) + actionpack (= 3.2.16) + activesupport (= 3.2.16) rack-ssl (~> 1.3.2) rake (>= 0.8.7) rdoc (~> 3.4) From 2f38792b775f87c1ea31e099f8fc523cd7f83c8f Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Wed, 4 Dec 2013 11:13:23 +0800 Subject: [PATCH 043/213] Updated locale --- config/locales/en-US_fat_free_crm.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/en-US_fat_free_crm.yml b/config/locales/en-US_fat_free_crm.yml index 7cc770e791..933fb2a4af 100644 --- a/config/locales/en-US_fat_free_crm.yml +++ b/config/locales/en-US_fat_free_crm.yml @@ -585,7 +585,7 @@ en-US: add_note_help: Add a new note... edit_note: Edit Note added_ago: added %{value} - added_by: added %{time_ago} ago by %{user} + added_by: added %{time_ago} by %{user} back: Back cancel: Cancel close_form: Close form From 9e869349aaafe1176c207e74e5ffac289522b06c Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Thu, 5 Dec 2013 14:27:13 +0800 Subject: [PATCH 044/213] Enforce available locales in latest version of I18n. --- config/initializers/locale.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/config/initializers/locale.rb b/config/initializers/locale.rb index 791ab0321f..66f46b5fc7 100644 --- a/config/initializers/locale.rb +++ b/config/initializers/locale.rb @@ -3,6 +3,12 @@ # Fat Free CRM is freely distributable under the terms of MIT license. # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php #------------------------------------------------------------------------------ + # Set default locale from Settings +# defer setting the locale until all I18n locales have been initialized +#------------------------------------------------------------------------------ +I18n.config.enforce_available_locales = true -I18n.default_locale = Setting.locale +FatFreeCRM.application.config.after_initialize do + I18n.default_locale = Setting.locale +end From 91a0c6f7c2b4c9874edba2de65a81ee15a41ab27 Mon Sep 17 00:00:00 2001 From: Steve Kenworthy Date: Fri, 6 Dec 2013 17:48:36 +0800 Subject: [PATCH 045/213] Revert need to include separate js. --- app/views/layouts/admin/application.html.haml | 2 -- 1 file changed, 2 deletions(-) mode change 100644 => 100755 app/views/layouts/admin/application.html.haml diff --git a/app/views/layouts/admin/application.html.haml b/app/views/layouts/admin/application.html.haml old mode 100644 new mode 100755 index 86780892e4..85f278396c --- a/app/views/layouts/admin/application.html.haml +++ b/app/views/layouts/admin/application.html.haml @@ -9,8 +9,6 @@ %style= yield :styles = javascript_include_tag :application - -# include timeago locales - = javascript_include_tag "jquery_timeago/jquery.timeago.#{I18n.locale}" = hook(:javascript_includes, self) %script{:type => "text/javascript"}= yield :javascript From 2681e7e329559ed20d51686adb870c1fcd44acb4 Mon Sep 17 00:00:00 2001 From: Lincoln Lee Date: Sat, 7 Dec 2013 11:35:12 +0800 Subject: [PATCH 046/213] Add user_id to lists table --- db/migrate/20131207033244_add_user_id_to_lists.rb | 6 ++++++ db/schema.rb | 9 ++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 db/migrate/20131207033244_add_user_id_to_lists.rb diff --git a/db/migrate/20131207033244_add_user_id_to_lists.rb b/db/migrate/20131207033244_add_user_id_to_lists.rb new file mode 100644 index 0000000000..f3359ef57b --- /dev/null +++ b/db/migrate/20131207033244_add_user_id_to_lists.rb @@ -0,0 +1,6 @@ +class AddUserIdToLists < ActiveRecord::Migration + def change + add_column :lists, :user_id, :integer, :default => nil + add_index :lists, :user_id + end +end diff --git a/db/schema.rb b/db/schema.rb index 4c0b779333..787e701459 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20121221033947) do +ActiveRecord::Schema.define(:version => 20131207033244) do create_table "account_contacts", :force => true do |t| t.integer "account_id" @@ -216,10 +216,10 @@ t.string "hint" t.string "placeholder" t.string "as", :limit => 32 - t.text "collection" + t.text "collection", :limit => 255 t.boolean "disabled" t.boolean "required" - t.integer "maxlength" + t.integer "maxlength", :limit => 4 t.datetime "created_at", :null => false t.datetime "updated_at", :null => false t.integer "pair_id" @@ -282,8 +282,11 @@ t.text "url" t.datetime "created_at", :null => false t.datetime "updated_at", :null => false + t.integer "user_id" end + add_index "lists", ["user_id"], :name => "index_lists_on_user_id" + create_table "opportunities", :force => true do |t| t.integer "user_id" t.integer "campaign_id" From 87aeb54e75a22d006387732d9b5483645ad4a3c8 Mon Sep 17 00:00:00 2001 From: Lincoln Lee Date: Sat, 7 Dec 2013 11:43:06 +0800 Subject: [PATCH 047/213] Assign model relation between list and user --- app/models/list.rb | 1 + app/models/users/user.rb | 1 + 2 files changed, 2 insertions(+) diff --git a/app/models/list.rb b/app/models/list.rb index a83b9e21aa..534e097003 100644 --- a/app/models/list.rb +++ b/app/models/list.rb @@ -5,6 +5,7 @@ #------------------------------------------------------------------------------ class List < ActiveRecord::Base validates_presence_of :name + belongs_to :user # Parses the controller from the url def controller diff --git a/app/models/users/user.rb b/app/models/users/user.rb index 48dde72cdb..e4e148f79b 100644 --- a/app/models/users/user.rb +++ b/app/models/users/user.rb @@ -56,6 +56,7 @@ class User < ActiveRecord::Base has_many :assigned_opportunities, :class_name => 'Opportunity', :foreign_key => 'assigned_to' has_many :permissions, :dependent => :destroy has_many :preferences, :dependent => :destroy + has_many :lists has_and_belongs_to_many :groups has_paper_trail :ignore => [:last_request_at, :perishable_token] From 8055d5b65a4752c998a8fadc49e0f96762bd2162 Mon Sep 17 00:00:00 2001 From: Szeto Bo Date: Sat, 7 Dec 2013 11:52:26 +0800 Subject: [PATCH 048/213] fix testcase on locale change --- spec/models/users/user_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/models/users/user_spec.rb b/spec/models/users/user_spec.rb index bf27aa8e91..dfc1294e50 100644 --- a/spec/models/users/user_spec.rb +++ b/spec/models/users/user_spec.rb @@ -182,9 +182,9 @@ end it "should update I18n.locale if proference[:locale] is set" do - @user.preference[:locale] = :esperanto + @user.preference[:locale] = :es @user.set_individual_locale - I18n.locale.should == :esperanto + I18n.locale.should == :es end it "should not update I18n.locale if proference[:locale] is not set" do From b3fee0fac73a2711e314dfd5dead9462a39273aa Mon Sep 17 00:00:00 2001 From: Stanley Hansen Date: Sat, 7 Dec 2013 12:13:39 +0800 Subject: [PATCH 049/213] Revert for pg --- db/schema.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index 787e701459..0133b0ae8b 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -216,10 +216,10 @@ t.string "hint" t.string "placeholder" t.string "as", :limit => 32 - t.text "collection", :limit => 255 + t.text "collection" t.boolean "disabled" t.boolean "required" - t.integer "maxlength", :limit => 4 + t.integer "maxlength" t.datetime "created_at", :null => false t.datetime "updated_at", :null => false t.integer "pair_id" From 3c454bb2328d89328771de2ed73a5b8776c5f17e Mon Sep 17 00:00:00 2001 From: Stanley Hansen Date: Sat, 7 Dec 2013 12:13:52 +0800 Subject: [PATCH 050/213] Chagned to global list --- app/views/lists/_sidebar.html.haml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/views/lists/_sidebar.html.haml b/app/views/lists/_sidebar.html.haml index 47fc1f1bbb..ee0fcfa479 100644 --- a/app/views/lists/_sidebar.html.haml +++ b/app/views/lists/_sidebar.html.haml @@ -1,13 +1,13 @@ -- @lists = List.all +- @global_lists = List.where(:user_id => nil) - @list = List.new .panel#lists - .caption #{t :lists} + .caption #{t :global_lists} %ul - - if @lists.none? + - if @global_lists.none? %div #{t :no_saved_lists} - else - - @lists.sort.each_with_index do |list, i| - %li[list]{ :class => i < @lists.size - 1 ? "" : "last" } + - @global_lists.sort.each_with_index do |list, i| + %li[list]{ :class => i < @global_lists.size - 1 ? "" : "last" } %dt= link_to(truncate(list.name, :length => 25), list.url, :title => list.name) %tt= link_to(image_tag("/assets/tab_icons/#{list.controller}_active.png", :"data-controller" => list.controller), url_for(list), :method => :delete, :confirm => 'Are you sure?', :remote => true, :class => "list_icon delete_on_hover") @@ -22,4 +22,4 @@ %div = f.submit(t(:save), :id => "save_list", :style => "vertical-align: bottom;") #{t :or} - = link_to(t(:cancel), '#', :class => "hide_lists_save_form") + = link_to(t(:cancel), '#', :class => "hide_lists_save_form") \ No newline at end of file From 515496e990fc35529cdf2ac685c605aaf5b36a8f Mon Sep 17 00:00:00 2001 From: Stanley Hansen Date: Sat, 7 Dec 2013 12:22:35 +0800 Subject: [PATCH 051/213] Update translation file for global list --- config/locales/en-US_fat_free_crm.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/en-US_fat_free_crm.yml b/config/locales/en-US_fat_free_crm.yml index 933fb2a4af..468131aa6e 100644 --- a/config/locales/en-US_fat_free_crm.yml +++ b/config/locales/en-US_fat_free_crm.yml @@ -765,7 +765,7 @@ en-US: # Lists #---------------------------------------------------------------------------- - lists: Lists + global_lists: Global Lists list: List no_saved_lists: No saved lists make_current_view_list: Make current view a list From fffac1e13b1d36547ba2d106a3ae9cdcc25a5d9a Mon Sep 17 00:00:00 2001 From: Stanley Hansen Date: Sat, 7 Dec 2013 12:13:52 +0800 Subject: [PATCH 052/213] Change to global list --- app/views/lists/_sidebar.html.haml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/views/lists/_sidebar.html.haml b/app/views/lists/_sidebar.html.haml index 47fc1f1bbb..ee0fcfa479 100644 --- a/app/views/lists/_sidebar.html.haml +++ b/app/views/lists/_sidebar.html.haml @@ -1,13 +1,13 @@ -- @lists = List.all +- @global_lists = List.where(:user_id => nil) - @list = List.new .panel#lists - .caption #{t :lists} + .caption #{t :global_lists} %ul - - if @lists.none? + - if @global_lists.none? %div #{t :no_saved_lists} - else - - @lists.sort.each_with_index do |list, i| - %li[list]{ :class => i < @lists.size - 1 ? "" : "last" } + - @global_lists.sort.each_with_index do |list, i| + %li[list]{ :class => i < @global_lists.size - 1 ? "" : "last" } %dt= link_to(truncate(list.name, :length => 25), list.url, :title => list.name) %tt= link_to(image_tag("/assets/tab_icons/#{list.controller}_active.png", :"data-controller" => list.controller), url_for(list), :method => :delete, :confirm => 'Are you sure?', :remote => true, :class => "list_icon delete_on_hover") @@ -22,4 +22,4 @@ %div = f.submit(t(:save), :id => "save_list", :style => "vertical-align: bottom;") #{t :or} - = link_to(t(:cancel), '#', :class => "hide_lists_save_form") + = link_to(t(:cancel), '#', :class => "hide_lists_save_form") \ No newline at end of file From 151fcad56f055e0dd9aa15e86ec42249ce9d6f51 Mon Sep 17 00:00:00 2001 From: Stanley Hansen Date: Sat, 7 Dec 2013 12:46:24 +0800 Subject: [PATCH 053/213] Create Personal list translation and Add a new box --- app/views/lists/_sidebar.html.haml | 25 +++++++++++++++++++++++++ config/locales/en-US_fat_free_crm.yml | 3 ++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/app/views/lists/_sidebar.html.haml b/app/views/lists/_sidebar.html.haml index ee0fcfa479..c2c1279587 100644 --- a/app/views/lists/_sidebar.html.haml +++ b/app/views/lists/_sidebar.html.haml @@ -1,4 +1,5 @@ - @global_lists = List.where(:user_id => nil) +- @personal_lists = List.where(:user_id => current_user.id) - @list = List.new .panel#lists .caption #{t :global_lists} @@ -14,6 +15,30 @@ .show_lists_save_form{ hidden_if(!params[:q]) } = link_to(t(:make_current_view_list), '#') + .save_list{ hidden } + = simple_form_for(@list, :html => one_submit_only, :remote => true) do |f| + = f.text_field :name, :size => 25 + = image_tag("/assets/info_tiny.png", :title => t(:list_name_info), :class => "input_info") + = f.hidden_field :url + %div + = f.submit(t(:save), :id => "save_list", :style => "vertical-align: bottom;") + #{t :or} + = link_to(t(:cancel), '#', :class => "hide_lists_save_form") + +.panel#personal_lists + .caption #{t :personal_lists} + %ul + - if @personal_lists.none? + %div #{t :no_saved_lists} + - else + - @personal_lists.sort.each_with_index do |list, i| + %li[list]{ :class => i < @personal_lists.size - 1 ? "" : "last" } + %dt= link_to(truncate(list.name, :length => 25), list.url, :title => list.name) + %tt= link_to(image_tag("/assets/tab_icons/#{list.controller}_active.png", :"data-controller" => list.controller), url_for(list), :method => :delete, :confirm => 'Are you sure?', :remote => true, :class => "list_icon delete_on_hover") + + .show_lists_save_form{ hidden_if(!params[:q]) } + = link_to(t(:make_current_view_list), '#') + .save_list{ hidden } = simple_form_for(@list, :html => one_submit_only, :remote => true) do |f| = f.text_field :name, :size => 25 diff --git a/config/locales/en-US_fat_free_crm.yml b/config/locales/en-US_fat_free_crm.yml index 468131aa6e..f8ccb8bc2e 100644 --- a/config/locales/en-US_fat_free_crm.yml +++ b/config/locales/en-US_fat_free_crm.yml @@ -765,7 +765,8 @@ en-US: # Lists #---------------------------------------------------------------------------- - global_lists: Global Lists + global_lists: Global lists + personal_lists: My lists list: List no_saved_lists: No saved lists make_current_view_list: Make current view a list From 77d26511419a1ef08ae9bffba84b2eda14bcce06 Mon Sep 17 00:00:00 2001 From: Szeto Bo Date: Sat, 7 Dec 2013 13:28:35 +0800 Subject: [PATCH 054/213] replace scope with callable object - in order to prepare for rails4 migration --- app/models/entities/account.rb | 12 +++---- app/models/entities/campaign.rb | 8 ++--- app/models/entities/contact.rb | 6 ++-- app/models/entities/lead.rb | 12 +++---- app/models/entities/opportunity.rb | 24 ++++++------- app/models/fields/field.rb | 6 ++-- app/models/polymorphic/address.rb | 6 ++-- app/models/polymorphic/task.rb | 58 +++++++++++++++--------------- app/models/users/user.rb | 20 +++++------ 9 files changed, 77 insertions(+), 75 deletions(-) diff --git a/app/models/entities/account.rb b/app/models/entities/account.rb index 1b644408a8..273531b609 100644 --- a/app/models/entities/account.rb +++ b/app/models/entities/account.rb @@ -43,20 +43,20 @@ class Account < ActiveRecord::Base accepts_nested_attributes_for :billing_address, :allow_destroy => true, :reject_if => proc {|attributes| Address.reject_address(attributes)} accepts_nested_attributes_for :shipping_address, :allow_destroy => true, :reject_if => proc {|attributes| Address.reject_address(attributes)} - scope :state, lambda { |filters| + scope :state, ->(filters) { where('category IN (?)' + (filters.delete('other') ? ' OR category IS NULL' : ''), filters) } - scope :created_by, lambda { |user| where(:user_id => user.id) } - scope :assigned_to, lambda { |user| where(:assigned_to => user.id) } + scope :created_by, ->(user) { where(:user_id => user.id) } + scope :assigned_to, ->(user) { where(:assigned_to => user.id) } - scope :text_search, lambda { |query| search('name_or_email_cont' => query).result } + scope :text_search, ->(query) { search('name_or_email_cont' => query).result } - scope :visible_on_dashboard, lambda { |user| + scope :visible_on_dashboard, ->(user) { # Show accounts which either belong to the user and are unassigned, or are assigned to the user where('(user_id = :user_id AND assigned_to IS NULL) OR assigned_to = :user_id', :user_id => user.id) } - scope :by_name, order(:name) + scope :by_name, -> { order(:name) } uses_user_permissions acts_as_commentable diff --git a/app/models/entities/campaign.rb b/app/models/entities/campaign.rb index 84d283e926..59c0e62df2 100644 --- a/app/models/entities/campaign.rb +++ b/app/models/entities/campaign.rb @@ -39,13 +39,13 @@ class Campaign < ActiveRecord::Base serialize :subscribed_users, Set - scope :state, lambda { |filters| + scope :state, ->(filters) { where('status IN (?)' + (filters.delete('other') ? ' OR status IS NULL' : ''), filters) } - scope :created_by, lambda { |user| where('user_id = ?' , user.id) } - scope :assigned_to, lambda { |user| where('assigned_to = ?', user.id) } + scope :created_by, ->(user) { where('user_id = ?' , user.id) } + scope :assigned_to, ->(user) { where('assigned_to = ?', user.id) } - scope :text_search, lambda { |query| search('name_cont' => query).result } + scope :text_search, ->(query) { search('name_cont' => query).result } uses_user_permissions acts_as_commentable diff --git a/app/models/entities/contact.rb b/app/models/entities/contact.rb index 6198202f6d..3eedd915f7 100644 --- a/app/models/entities/contact.rb +++ b/app/models/entities/contact.rb @@ -58,10 +58,10 @@ class Contact < ActiveRecord::Base accepts_nested_attributes_for :business_address, :allow_destroy => true, :reject_if => proc {|attributes| Address.reject_address(attributes)} - scope :created_by, lambda { |user| { :conditions => [ "user_id = ?", user.id ] } } - scope :assigned_to, lambda { |user| { :conditions => ["assigned_to = ?", user.id ] } } + scope :created_by, ->(user) { where("user_id = ?", user.id) } + scope :assigned_to, ->(user) { where("assigned_to = ?", user.id) } - scope :text_search, lambda { |query| + scope :text_search, ->(query) { t = Contact.arel_table # We can't always be sure that names are entered in the right order, so we must # split the query into all possible first/last name permutations. diff --git a/app/models/entities/lead.rb b/app/models/entities/lead.rb index 08cf420c44..0dd7d9ae8b 100644 --- a/app/models/entities/lead.rb +++ b/app/models/entities/lead.rb @@ -50,15 +50,15 @@ class Lead < ActiveRecord::Base accepts_nested_attributes_for :business_address, :allow_destroy => true - scope :state, lambda { |filters| + scope :state, ->(filters) { where([ 'status IN (?)' + (filters.delete('other') ? ' OR status IS NULL' : ''), filters ]) } - scope :converted, where(:status => 'converted') - scope :for_campaign, lambda { |id| where('campaign_id = ?', id) } - scope :created_by, lambda { |user| where('user_id = ?' , user.id) } - scope :assigned_to, lambda { |user| where('assigned_to = ?' , user.id) } + scope :converted, -> { where(:status => 'converted') } + scope :for_campaign, ->(id) { where('campaign_id = ?', id) } + scope :created_by, ->(user) { where('user_id = ?' , user.id) } + scope :assigned_to, ->(user) { where('assigned_to = ?' , user.id) } - scope :text_search, lambda { |query| search('first_name_or_last_name_or_company_or_email_cont' => query).result } + scope :text_search, ->(query) { search('first_name_or_last_name_or_company_or_email_cont' => query).result } uses_user_permissions acts_as_commentable diff --git a/app/models/entities/opportunity.rb b/app/models/entities/opportunity.rb index 50b0540de1..16bc19b655 100644 --- a/app/models/entities/opportunity.rb +++ b/app/models/entities/opportunity.rb @@ -38,19 +38,19 @@ class Opportunity < ActiveRecord::Base serialize :subscribed_users, Set - scope :state, lambda { |filters| + scope :state, ->(filters) { where('stage IN (?)' + (filters.delete('other') ? ' OR stage IS NULL' : ''), filters) } - scope :created_by, lambda { |user| where('user_id = ?', user.id) } - scope :assigned_to, lambda { |user| where('assigned_to = ?', user.id) } - scope :won, where("opportunities.stage = 'won'") - scope :lost, where("opportunities.stage = 'lost'") - scope :not_lost, where("opportunities.stage <> 'lost'") - scope :pipeline, where("opportunities.stage IS NULL OR (opportunities.stage != 'won' AND opportunities.stage != 'lost')") - scope :unassigned, where("opportunities.assigned_to IS NULL") + scope :created_by, ->(user) { where('user_id = ?', user.id) } + scope :assigned_to, ->(user) { where('assigned_to = ?', user.id) } + scope :won, -> { where("opportunities.stage = 'won'") } + scope :lost, -> { where("opportunities.stage = 'lost'") } + scope :not_lost, -> { where("opportunities.stage <> 'lost'") } + scope :pipeline, -> { where("opportunities.stage IS NULL OR (opportunities.stage != 'won' AND opportunities.stage != 'lost')") } + scope :unassigned, -> { where("opportunities.assigned_to IS NULL") } # Search by name OR id - scope :text_search, lambda { |query| + scope :text_search, ->(query) { # postgresql does not like to compare string to integer field if query =~ /^\d+$/ query = query.gsub(/[^\w\s\-\.'\p{L}]/u, '').strip @@ -60,13 +60,13 @@ class Opportunity < ActiveRecord::Base end } - scope :visible_on_dashboard, lambda { |user| + scope :visible_on_dashboard, ->(user) { # Show opportunities which either belong to the user and are unassigned, or are assigned to the user and haven't been closed (won/lost) where('(user_id = :user_id AND assigned_to IS NULL) OR assigned_to = :user_id', :user_id => user.id).where("opportunities.stage != 'won'").where("opportunities.stage != 'lost'") } - scope :by_closes_on, order(:closes_on) - scope :by_amount, order('opportunities.amount DESC') + scope :by_closes_on, -> { order(:closes_on) } + scope :by_amount, -> { order('opportunities.amount DESC') } uses_user_permissions acts_as_commentable diff --git a/app/models/fields/field.rb b/app/models/fields/field.rb index d47c9dae90..9975be71d4 100644 --- a/app/models/fields/field.rb +++ b/app/models/fields/field.rb @@ -33,9 +33,9 @@ class Field < ActiveRecord::Base belongs_to :field_group - scope :core_fields, where(:type => 'CoreField') - scope :custom_fields, where("type != 'CoreField'") - scope :without_pairs, where(:pair_id => nil) + scope :core_fields, -> { where(:type => 'CoreField') } + scope :custom_fields, -> { where("type != 'CoreField'") } + scope :without_pairs, -> { where(:pair_id => nil) } delegate :klass, :klass_name, :klass_name=, :to => :field_group diff --git a/app/models/polymorphic/address.rb b/app/models/polymorphic/address.rb index ebbc742ab9..b4d57e913b 100644 --- a/app/models/polymorphic/address.rb +++ b/app/models/polymorphic/address.rb @@ -28,9 +28,9 @@ class Address < ActiveRecord::Base has_paper_trail :meta => { :related => :addressable } - scope :business, :conditions => "address_type='Business'" - scope :billing, :conditions => "address_type='Billing'" - scope :shipping, :conditions => "address_type='Shipping'" + scope :business, -> { where("address_type='Business'") } + scope :billing, -> { where("address_type='Billing'") } + scope :shipping, -> { where("address_type='Shipping'") } # Checks if the address is blank for both single and compound addresses. #---------------------------------------------------------------------------- diff --git a/app/models/polymorphic/task.rb b/app/models/polymorphic/task.rb index fc16cba806..7e419d426a 100644 --- a/app/models/polymorphic/task.rb +++ b/app/models/polymorphic/task.rb @@ -37,7 +37,7 @@ class Task < ActiveRecord::Base # Tasks created by the user for herself, or assigned to her by others. That's # what gets shown on Tasks/Pending and Tasks/Completed pages. - scope :my, lambda { |*args| + scope :my, ->(*args) { options = args[0] || {} user_option = (options.is_a?(Hash) ? options[:user] : options) || User.current_user includes(:assignee). @@ -46,56 +46,58 @@ class Task < ActiveRecord::Base limit(options[:limit]) # nil selects all records } - scope :created_by, lambda { |user| where(:user_id => user.id) } - scope :assigned_to, lambda { |user| where(:assigned_to => user.id) } + scope :created_by, ->(user) { where(:user_id => user.id) } + scope :assigned_to, ->(user) { where(:assigned_to => user.id) } # Tasks assigned by the user to others. That's what we see on Tasks/Assigned. - scope :assigned_by, lambda { |user| + scope :assigned_by, ->(user) { includes(:assignee). where('user_id = ? AND assigned_to IS NOT NULL AND assigned_to != ?', user.id, user.id) } # Tasks created by the user or assigned to the user, i.e. the union of the two # scopes above. That's the tasks the user is allowed to see and track. - scope :tracked_by, lambda { |user| + scope :tracked_by, ->(user) { includes(:assignee). where('user_id = ? OR assigned_to = ?', user.id, user.id) } - scope :visible_on_dashboard, lambda { |user| + scope :visible_on_dashboard, ->(user) { # Show opportunities which either belong to the user and are unassigned, or are assigned to the user where('(user_id = :user_id AND assigned_to IS NULL) OR assigned_to = :user_id', :user_id => user.id).where('completed_at IS NULL') } - scope :by_due_at, order({ - "MySQL" => "due_at NOT NULL, due_at ASC", - "PostgreSQL" => "due_at ASC NULLS FIRST" - }[ActiveRecord::Base.connection.adapter_name] || :due_at) + scope :by_due_at, -> { + order({ + "MySQL" => "due_at NOT NULL, due_at ASC", + "PostgreSQL" => "due_at ASC NULLS FIRST" + }[ActiveRecord::Base.connection.adapter_name] || :due_at) + } # Status based scopes to be combined with the due date and completion time. - scope :pending, where('completed_at IS NULL').order('tasks.due_at, tasks.id') - scope :assigned, where('completed_at IS NULL AND assigned_to IS NOT NULL').order('tasks.due_at, tasks.id') - scope :completed, where('completed_at IS NOT NULL').order('tasks.completed_at DESC') + scope :pending, -> { where('completed_at IS NULL').order('tasks.due_at, tasks.id') } + scope :assigned, -> { where('completed_at IS NULL AND assigned_to IS NOT NULL').order('tasks.due_at, tasks.id') } + scope :completed, -> { where('completed_at IS NOT NULL').order('tasks.completed_at DESC') } # Due date scopes. - scope :due_asap, lambda { where("due_at IS NULL AND bucket = 'due_asap'").order('tasks.id DESC') } - scope :overdue, lambda { where('due_at IS NOT NULL AND due_at < ?', Time.zone.now.midnight.utc).order('tasks.id DESC') } - scope :due_today, lambda { where('due_at >= ? AND due_at < ?', Time.zone.now.midnight.utc, Time.zone.now.midnight.tomorrow.utc).order('tasks.id DESC') } - scope :due_tomorrow, lambda { where('due_at >= ? AND due_at < ?', Time.zone.now.midnight.tomorrow.utc, Time.zone.now.midnight.tomorrow.utc + 1.day).order('tasks.id DESC') } - scope :due_this_week, lambda { where('due_at >= ? AND due_at < ?', Time.zone.now.midnight.tomorrow.utc + 1.day, Time.zone.now.next_week.utc).order('tasks.id DESC') } - scope :due_next_week, lambda { where('due_at >= ? AND due_at < ?', Time.zone.now.next_week.utc, Time.zone.now.next_week.end_of_week.utc + 1.day).order('tasks.id DESC') } - scope :due_later, lambda { where("(due_at IS NULL AND bucket = 'due_later') OR due_at >= ?", Time.zone.now.next_week.end_of_week.utc + 1.day).order('tasks.id DESC') } + scope :due_asap, -> { where("due_at IS NULL AND bucket = 'due_asap'").order('tasks.id DESC') } + scope :overdue, -> { where('due_at IS NOT NULL AND due_at < ?', Time.zone.now.midnight.utc).order('tasks.id DESC') } + scope :due_today, -> { where('due_at >= ? AND due_at < ?', Time.zone.now.midnight.utc, Time.zone.now.midnight.tomorrow.utc).order('tasks.id DESC') } + scope :due_tomorrow, -> { where('due_at >= ? AND due_at < ?', Time.zone.now.midnight.tomorrow.utc, Time.zone.now.midnight.tomorrow.utc + 1.day).order('tasks.id DESC') } + scope :due_this_week, -> { where('due_at >= ? AND due_at < ?', Time.zone.now.midnight.tomorrow.utc + 1.day, Time.zone.now.next_week.utc).order('tasks.id DESC') } + scope :due_next_week, -> { where('due_at >= ? AND due_at < ?', Time.zone.now.next_week.utc, Time.zone.now.next_week.end_of_week.utc + 1.day).order('tasks.id DESC') } + scope :due_later, -> { where("(due_at IS NULL AND bucket = 'due_later') OR due_at >= ?", Time.zone.now.next_week.end_of_week.utc + 1.day).order('tasks.id DESC') } # Completion time scopes. - scope :completed_today, lambda { where('completed_at >= ? AND completed_at < ?', Time.zone.now.midnight.utc, Time.zone.now.midnight.tomorrow.utc) } - scope :completed_yesterday, lambda { where('completed_at >= ? AND completed_at < ?', Time.zone.now.midnight.yesterday.utc, Time.zone.now.midnight.utc) } - scope :completed_this_week, lambda { where('completed_at >= ? AND completed_at < ?', Time.zone.now.beginning_of_week.utc , Time.zone.now.midnight.yesterday.utc) } - scope :completed_last_week, lambda { where('completed_at >= ? AND completed_at < ?', Time.zone.now.beginning_of_week.utc - 7.days, Time.zone.now.beginning_of_week.utc) } - scope :completed_this_month, lambda { where('completed_at >= ? AND completed_at < ?', Time.zone.now.beginning_of_month.utc, Time.zone.now.beginning_of_week.utc - 7.days) } - scope :completed_last_month, lambda { where('completed_at >= ? AND completed_at < ?', (Time.zone.now.beginning_of_month.utc - 1.day).beginning_of_month.utc, Time.zone.now.beginning_of_month.utc) } - - scope :text_search, lambda { |query| + scope :completed_today, -> { where('completed_at >= ? AND completed_at < ?', Time.zone.now.midnight.utc, Time.zone.now.midnight.tomorrow.utc) } + scope :completed_yesterday, -> { where('completed_at >= ? AND completed_at < ?', Time.zone.now.midnight.yesterday.utc, Time.zone.now.midnight.utc) } + scope :completed_this_week, -> { where('completed_at >= ? AND completed_at < ?', Time.zone.now.beginning_of_week.utc , Time.zone.now.midnight.yesterday.utc) } + scope :completed_last_week, -> { where('completed_at >= ? AND completed_at < ?', Time.zone.now.beginning_of_week.utc - 7.days, Time.zone.now.beginning_of_week.utc) } + scope :completed_this_month, -> { where('completed_at >= ? AND completed_at < ?', Time.zone.now.beginning_of_month.utc, Time.zone.now.beginning_of_week.utc - 7.days) } + scope :completed_last_month, -> { where('completed_at >= ? AND completed_at < ?', (Time.zone.now.beginning_of_month.utc - 1.day).beginning_of_month.utc, Time.zone.now.beginning_of_month.utc) } + + scope :text_search, ->(query) { query = query.gsub(/[^\w\s\-\.'\p{L}]/u, '').strip where('upper(name) LIKE upper(?)', "%#{query}%") } diff --git a/app/models/users/user.rb b/app/models/users/user.rb index 48dde72cdb..93c436bec0 100644 --- a/app/models/users/user.rb +++ b/app/models/users/user.rb @@ -61,22 +61,22 @@ class User < ActiveRecord::Base has_paper_trail :ignore => [:last_request_at, :perishable_token] # For some reason this does not play nice with has_paper_trail when set as default scope - scope :by_id, order('id DESC') - scope :except, lambda { |user| where('id != ?', user.id).by_name } - scope :by_name, order('first_name, last_name, email') + scope :by_id, -> { order('id DESC') } + scope :except, ->(user) { where('id != ?', user.id).by_name } + scope :by_name, -> { order('first_name, last_name, email') } - scope :text_search, lambda { |query| + scope :text_search, ->(query) { query = query.gsub(/[^\w\s\-\.'\p{L}]/u, '').strip where('upper(username) LIKE upper(:s) OR upper(first_name) LIKE upper(:s) OR upper(last_name) LIKE upper(:s)', :s => "%#{query}%") } - scope :my, lambda { - accessible_by(User.current_ability) - } + scope :my, -> { accessible_by(User.current_ability) } - scope :have_assigned_opportunities, joins("INNER JOIN opportunities ON users.id = opportunities.assigned_to"). - where("opportunities.stage <> 'lost' AND opportunities.stage <> 'won'"). - select('DISTINCT(users.id), users.*') + scope :have_assigned_opportunities, -> { + joins("INNER JOIN opportunities ON users.id = opportunities.assigned_to") + .where("opportunities.stage <> 'lost' AND opportunities.stage <> 'won'") + .select('DISTINCT(users.id), users.*') + } acts_as_authentic do |c| c.session_class = Authentication From d34e4c4b13cc865461593bcc7ae1b8ba91ec1b6c Mon Sep 17 00:00:00 2001 From: Lincoln Lee Date: Sat, 7 Dec 2013 13:33:59 +0800 Subject: [PATCH 055/213] Add personal list View and JS Similar behaviour to Global list --- app/assets/javascripts/lists.js.coffee | 17 ++++++++++++++ app/assets/javascripts/search.js.coffee | 1 + app/assets/stylesheets/common.scss | 13 +++++++++++ app/views/layouts/_sidebar.html.haml | 1 + app/views/lists/_personal_sidebar.html.haml | 25 +++++++++++++++++++++ app/views/lists/_sidebar.html.haml | 25 --------------------- 6 files changed, 57 insertions(+), 25 deletions(-) create mode 100644 app/views/lists/_personal_sidebar.html.haml diff --git a/app/assets/javascripts/lists.js.coffee b/app/assets/javascripts/lists.js.coffee index 54f4496fdd..7fd914274e 100644 --- a/app/assets/javascripts/lists.js.coffee +++ b/app/assets/javascripts/lists.js.coffee @@ -11,9 +11,16 @@ $(".save_list").show() $('.save_list #list_name').focus() + show_save_personal_form: -> + $(".save_peronal_list").show() + $('.save_peronal_list #list_name').focus() + hide_save_form: -> $(".save_list").hide() + hide_save_personal_form: -> + $(".save_peronal_list").hide() + $(document).ready -> lists = new Lists() @@ -22,11 +29,21 @@ $(".show_lists_save_form").hide() false + $(".show_personal_lists_save_form").live "click", -> + lists.show_save_personal_form() + $(".show_personal_lists_save_form").hide() + false + $(".hide_lists_save_form").live "click", -> lists.hide_save_form() $(".show_lists_save_form").show() false + $(".hide_lists_save_personal_form").live "click", -> + lists.hide_save_personal_form() + $(".show_personal_lists_save_form").show() + false + $("input#save_list").live "click", -> # Set value of hidden list_url field to serialized search form $("#list_url").val(window.location.pathname + '?' + $('form.ransack_search').serialize()) diff --git a/app/assets/javascripts/search.js.coffee b/app/assets/javascripts/search.js.coffee index f29217a439..f44b598d16 100755 --- a/app/assets/javascripts/search.js.coffee +++ b/app/assets/javascripts/search.js.coffee @@ -52,6 +52,7 @@ when 'advanced_search' $('#lists .show_lists_save_form').show() + $('#personal_lists .show_personal_lists_save_form').show() $("#advanced_search form input:submit").click() $('#filters').disable() # Disable filters panel (if present) diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index 8776b6c19f..13301b3ab3 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -687,6 +687,19 @@ span.handle img { input#save_list { margin-top: 6px; } } +#personal_lists { + .show_personal_lists_save_form { + text-align: right; } + .show_personal_lists_save_form, .save_list { + margin: 10px 0 0; } + .list_icon { + opacity: 0.5; + width: 12px; } + img.input_info { + vertical-align: middle; } + input#save_list { + margin-top: 6px; } } + .fields .subtitle { cursor: move; } diff --git a/app/views/layouts/_sidebar.html.haml b/app/views/layouts/_sidebar.html.haml index b628548316..71aaad6712 100644 --- a/app/views/layouts/_sidebar.html.haml +++ b/app/views/layouts/_sidebar.html.haml @@ -9,4 +9,5 @@ - rescue MissingTemplate = render "lists/sidebar" += render "lists/personal_sidebar" = render "shared/recently" diff --git a/app/views/lists/_personal_sidebar.html.haml b/app/views/lists/_personal_sidebar.html.haml new file mode 100644 index 0000000000..6e0510b499 --- /dev/null +++ b/app/views/lists/_personal_sidebar.html.haml @@ -0,0 +1,25 @@ +- @personal_lists = List.where(:user_id => current_user.id) +- @list = List.new +.panel#personal_lists + .caption #{t :personal_lists} + %ul + - if @personal_lists.none? + %div #{t :no_saved_lists} + - else + - @personal_lists.sort.each_with_index do |list, i| + %li[list]{ :class => i < @personal_lists.size - 1 ? "" : "last" } + %dt= link_to(truncate(list.name, :length => 25), list.url, :title => list.name) + %tt= link_to(image_tag("/assets/tab_icons/#{list.controller}_active.png", :"data-controller" => list.controller), url_for(list), :method => :delete, :confirm => 'Are you sure?', :remote => true, :class => "list_icon delete_on_hover") + + .show_personal_lists_save_form{ hidden_if(!params[:q]) } + = link_to(t(:make_current_view_list), '#') + + .save_peronal_list{ hidden } + = simple_form_for(@list, :html => one_submit_only, :remote => true) do |f| + = f.text_field :name, :size => 25 + = image_tag("/assets/info_tiny.png", :title => t(:list_name_info), :class => "input_info") + = f.hidden_field :url + %div + = f.submit(t(:save), :id => "save_list", :style => "vertical-align: bottom;") + #{t :or} + = link_to(t(:cancel), '#', :class => "hide_lists_save_personal_form") diff --git a/app/views/lists/_sidebar.html.haml b/app/views/lists/_sidebar.html.haml index c2c1279587..535bd47eb7 100644 --- a/app/views/lists/_sidebar.html.haml +++ b/app/views/lists/_sidebar.html.haml @@ -1,5 +1,4 @@ - @global_lists = List.where(:user_id => nil) -- @personal_lists = List.where(:user_id => current_user.id) - @list = List.new .panel#lists .caption #{t :global_lists} @@ -24,27 +23,3 @@ = f.submit(t(:save), :id => "save_list", :style => "vertical-align: bottom;") #{t :or} = link_to(t(:cancel), '#', :class => "hide_lists_save_form") - -.panel#personal_lists - .caption #{t :personal_lists} - %ul - - if @personal_lists.none? - %div #{t :no_saved_lists} - - else - - @personal_lists.sort.each_with_index do |list, i| - %li[list]{ :class => i < @personal_lists.size - 1 ? "" : "last" } - %dt= link_to(truncate(list.name, :length => 25), list.url, :title => list.name) - %tt= link_to(image_tag("/assets/tab_icons/#{list.controller}_active.png", :"data-controller" => list.controller), url_for(list), :method => :delete, :confirm => 'Are you sure?', :remote => true, :class => "list_icon delete_on_hover") - - .show_lists_save_form{ hidden_if(!params[:q]) } - = link_to(t(:make_current_view_list), '#') - - .save_list{ hidden } - = simple_form_for(@list, :html => one_submit_only, :remote => true) do |f| - = f.text_field :name, :size => 25 - = image_tag("/assets/info_tiny.png", :title => t(:list_name_info), :class => "input_info") - = f.hidden_field :url - %div - = f.submit(t(:save), :id => "save_list", :style => "vertical-align: bottom;") - #{t :or} - = link_to(t(:cancel), '#', :class => "hide_lists_save_form") \ No newline at end of file From 3d67d584f2e3a1e800fa70cbd38cb35c68989ca4 Mon Sep 17 00:00:00 2001 From: Lincoln Lee Date: Sat, 7 Dec 2013 13:37:58 +0800 Subject: [PATCH 056/213] Hide personal list save link when basic search --- app/assets/javascripts/search.js.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/javascripts/search.js.coffee b/app/assets/javascripts/search.js.coffee index f44b598d16..bc46c748c2 100755 --- a/app/assets/javascripts/search.js.coffee +++ b/app/assets/javascripts/search.js.coffee @@ -42,6 +42,7 @@ switch search_form when 'basic_search' $('#lists .show_lists_save_form').hide() + $('#personal_lists .show_personal_lists_save_form').hide() query_input = $('#basic_search input#query') if !query_input.is('.defaultTextActive') value = query_input.val() From ec0663291f97dfd23897d2e3d393055793216f55 Mon Sep 17 00:00:00 2001 From: Matthew Lehner Date: Sat, 7 Dec 2013 13:42:03 +0800 Subject: [PATCH 057/213] vendor ajax-chosen assets. --- .../assets/javascripts/ajax-chosen-jquery.js | 2 + .../javascripts/ajax-chosen-prototype.js | 2 + .../javascripts/ajax-chosen.jquery.coffee | 81 +++++++++++++++ .../javascripts/ajax-chosen.proto.coffee | 98 +++++++++++++++++++ 4 files changed, 183 insertions(+) create mode 100644 vendor/assets/javascripts/ajax-chosen-jquery.js create mode 100644 vendor/assets/javascripts/ajax-chosen-prototype.js create mode 100644 vendor/assets/javascripts/ajax-chosen.jquery.coffee create mode 100644 vendor/assets/javascripts/ajax-chosen.proto.coffee diff --git a/vendor/assets/javascripts/ajax-chosen-jquery.js b/vendor/assets/javascripts/ajax-chosen-jquery.js new file mode 100644 index 0000000000..2d243a36ab --- /dev/null +++ b/vendor/assets/javascripts/ajax-chosen-jquery.js @@ -0,0 +1,2 @@ +//= require chosen-jquery +//= require ajax-chosen.jquery diff --git a/vendor/assets/javascripts/ajax-chosen-prototype.js b/vendor/assets/javascripts/ajax-chosen-prototype.js new file mode 100644 index 0000000000..cc53ddcead --- /dev/null +++ b/vendor/assets/javascripts/ajax-chosen-prototype.js @@ -0,0 +1,2 @@ +//= require chosen-prototype +//= require ajax-chosen.proto diff --git a/vendor/assets/javascripts/ajax-chosen.jquery.coffee b/vendor/assets/javascripts/ajax-chosen.jquery.coffee new file mode 100644 index 0000000000..470c36c999 --- /dev/null +++ b/vendor/assets/javascripts/ajax-chosen.jquery.coffee @@ -0,0 +1,81 @@ +(($) -> + + $.fn.ajaxChosen = (options, callback) -> + # This will come in handy later. + select = this + + # Load chosen. To make things clear, I have taken the liberty + # of using the .chzn-autoselect class to specify input elements + # we want to use with ajax autocomplete. + this.chosen() + + # Now that chosen is loaded normally, we can bootstrap it with + # our ajax autocomplete code. + this.next('.chzn-container') + .find(".search-field > input") + .bind 'keyup', -> + # This code will be executed every time the user types a letter + # into the input form that chosen has created + + # Retrieve the current value of the input form + val = $.trim $(this).attr('value') + + # Some simple validation so we don't make excess ajax calls. I am + # assuming you don't want to perform a search with less than 3 + # characters. + return false if val.length < 3 or val is $(this).data('prevVal') + + # Set the current search term so we don't execute the ajax call if + # the user hits a key that isn't an input letter/number/symbol + $(this).data('prevVal', val) + + # This is a useful reference for later + field = $(this) + + # I'm assuming that it's ok to use the parameter name `term` to send + # the form value during the ajax call. Change if absolutely needed. + options.data = term: val + + # If the user provided an ajax success callback, store it so we can + # call it after our bootstrapping is finished. + success = undefined + success ?= options.success + + # Create our own callback that will be executed when the ajax call is + # finished. + options.success = (data) -> + # Exit if the data we're given is invalid + return if not data? + + # Go through all of the