From 8ca627da671e7339753c5c0f92a25cfb1d1ec8d0 Mon Sep 17 00:00:00 2001 From: madumlao Date: Mon, 20 Nov 2017 02:18:31 +0800 Subject: [PATCH 001/131] Fixate ruby version to 2.3.4 --- .ruby-version | 1 + 1 file changed, 1 insertion(+) create mode 100644 .ruby-version diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000000..3f684d2d90 --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +2.3.4 From bf624a96d3d22bc8f9198505cf5a9e6cdfaac546 Mon Sep 17 00:00:00 2001 From: madumlao Date: Mon, 20 Nov 2017 02:19:00 +0800 Subject: [PATCH 002/131] Fixate node version to 7.8.0 --- .node-version | 1 + 1 file changed, 1 insertion(+) create mode 100644 .node-version diff --git a/.node-version b/.node-version new file mode 100644 index 0000000000..09a6d30847 --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +7.8.0 From 92646b3242a68ffd15312f86159ca5ff38d828f3 Mon Sep 17 00:00:00 2001 From: madumlao Date: Mon, 20 Nov 2017 02:20:13 +0800 Subject: [PATCH 003/131] Also suggest rbenv for ruby version management --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bb4d0d9c45..4e86290683 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ Would you like to set up your marketplace in one minute without touching code? [ ### Requirements Before you get started, the following needs to be installed: - * **Ruby**. Version 2.3.4 is currently used and we don't guarantee everything works with other versions. If you need multiple versions of Ruby, [RVM](https://rvm.io//) is recommended. + * **Ruby**. Version 2.3.4 is currently used and we don't guarantee everything works with other versions. If you need multiple versions of Ruby, [RVM](https://rvm.io//) or [rbenv](https://github.com/rbenv/rbenv) is recommended. * [**RubyGems**](http://rubygems.org/) * **Bundler**: `gem install bundler` * **Node**. Version 7.8 is currently used and we don't guarantee everything works with other versions. If you need multiple versions of Node, consider using [n](https://github.com/tj/n) or [nvm](https://github.com/creationix/nvm). From 9931ecb2ae6fd9fdb07cb3e9b3ce5fe9ac19267d Mon Sep 17 00:00:00 2001 From: madumlao Date: Mon, 20 Nov 2017 02:24:53 +0800 Subject: [PATCH 004/131] Also suggest nenv for node version management --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4e86290683..3c697ea8dc 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Before you get started, the following needs to be installed: * **Ruby**. Version 2.3.4 is currently used and we don't guarantee everything works with other versions. If you need multiple versions of Ruby, [RVM](https://rvm.io//) or [rbenv](https://github.com/rbenv/rbenv) is recommended. * [**RubyGems**](http://rubygems.org/) * **Bundler**: `gem install bundler` - * **Node**. Version 7.8 is currently used and we don't guarantee everything works with other versions. If you need multiple versions of Node, consider using [n](https://github.com/tj/n) or [nvm](https://github.com/creationix/nvm). + * **Node**. Version 7.8 is currently used and we don't guarantee everything works with other versions. If you need multiple versions of Node, consider using [n](https://github.com/tj/n), [nvm](https://github.com/creationix/nvm), or [nenv](https://github.com/ryuone/nenv). * [**Git**](http://help.github.com/git-installation-redirect) * **A database**. Only MySQL 5.7 has been tested, so we give no guarantees that other databases (e.g. PostgreSQL) work. You can install MySQL Community Server two ways: 1. If you are on a Mac, use homebrew: `brew install mysql` (*highly* recommended). Also consider installing the [MySQL Preference Pane](https://dev.mysql.com/doc/refman/5.1/en/osx-installation-prefpane.html) to control MySQL startup and shutdown. It is packaged with the MySQL downloadable installer, but can be easily installed as a stand-alone. From f39cc7a3b53e76830c56018055ebd6fe2e31d7b8 Mon Sep 17 00:00:00 2001 From: madumlao Date: Mon, 20 Nov 2017 04:22:10 +0800 Subject: [PATCH 005/131] Map icons from bundled fontawesome to main UI The default iconset used by the sharetribe site is Symbolset Pika, which is proprietary. Whereas sharetribe comes bundled with fontawesome + mappings of some actions to fontawesome. Problem is, a lot of icons in SS Pika are not mapped to an equivalent fontawesome icon. This commit adds mappings for SS Pika icons into the bundled fontawesome. --- app/helpers/application_helper.rb | 6 +++--- app/view_utils/icon_map.rb | 22 +++++++++++++++++++++- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 21309e50fe..3915038c6a 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -365,7 +365,7 @@ def admin_links_for(community) { :topic => :manage, :text => t("admin.communities.edit_details.invite_people"), - :icon_class => "ss-adduser", + :icon_class => icon_class("invite"), :path => new_invitation_path, :name => "invite_people" }, @@ -379,14 +379,14 @@ def admin_links_for(community) { :topic => :configure, :text => t("admin.communities.edit_details.community_details"), - :icon_class => "ss-page", + :icon_class => icon_class("details"), :path => admin_details_edit_path, :name => "tribe_details" }, { :topic => :configure, :text => t("admin.communities.edit_details.community_look_and_feel"), - :icon_class => "ss-paintroller", + :icon_class => icon_class("looknfeel"), :path => admin_look_and_feel_edit_path, :name => "tribe_look_and_feel" }, diff --git a/app/view_utils/icon_map.rb b/app/view_utils/icon_map.rb index d6550f15b7..6d2b041f01 100644 --- a/app/view_utils/icon_map.rb +++ b/app/view_utils/icon_map.rb @@ -3,6 +3,7 @@ "ss-pika" => { # Default UI icons + "details" => "ss-page", "map" => "ss-maplocation", "thumbnails" => "ss-thumbnails", "grid" => "ss-thumbnails", @@ -22,6 +23,7 @@ "mail" => "ss-mail", "notifications" => "ss-earth", "layout" => "ss-layout", + "looknfeel" => "ss-paintroller", "login" => "ss-login", "logout" => "ss-logout", "feedback" => "ss-megaphone", @@ -180,13 +182,14 @@ "mail" => "icon-envelope", "notifications" => "icon-globe", "layout" => "icon-desktop", + "looknfeel" => "icon-edit", "login" => "icon-signin", "logout" => "icon-signout", "feedback" => "icon-bullhorn", "user" => "icon-user", "settings" => " icon-cog", "facebook" => "icon-facebook", - "invite" => "icon-users", + "invite" => "icon-user", "download" => "icon-download", "link" => "icon-link", "external_link" => "icon-external-link", @@ -248,5 +251,22 @@ "edit" => "icon-edit", "reply" => "icon-reply", "topbar_menu" => "icon-minus", + + "details" => "icon-file-alt", + "profile" => "icon-file-alt", + "account_settings" => "icon-lock", + "notification_settings" => "icon-bell-alt", + "rows" => "icon-reorder", + "form" => "icon-table", + "order_types" => "icon-shopping-cart", + "payments" => "icon-money", + "social_media" => "icon-share", + "analytics" => "icon-bar-chart", + "send" => "icon-envelope", + "coins" => "icon-inbox", + "openbook" => "icon-book", + "academy" => "icon-bookmark", + "grid" => "icon-th-large", + "check" => "icon-ok", } } From a907877379b47cb72977d80c8bf722b554f49ecc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aivils=20=C5=A0toss?= Date: Tue, 21 Nov 2017 16:13:25 +0200 Subject: [PATCH 006/131] GTM - added community admin emails --- app/assets/javascripts/analytics.js | 2 +- app/helpers/analytics_helper.rb | 3 ++- app/views/analytics/_google_tag_manager.haml | 12 ++++++++---- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/app/assets/javascripts/analytics.js b/app/assets/javascripts/analytics.js index 55f2e9560b..ef53dac18b 100644 --- a/app/assets/javascripts/analytics.js +++ b/app/assets/javascripts/analytics.js @@ -105,7 +105,7 @@ window.ST.analytics = (function(){ }); $(document).on('st-analytics:setup', function(event, info) { - _gtm_identify(dataLayer, info.community_id, info.feature_flags); + _gtm_identify(dataLayer, info); }); }; diff --git a/app/helpers/analytics_helper.rb b/app/helpers/analytics_helper.rb index 0081b1c7d7..ddce35d621 100644 --- a/app/helpers/analytics_helper.rb +++ b/app/helpers/analytics_helper.rb @@ -1,9 +1,10 @@ module AnalyticsHelper def analytics_data { - community_ident: @current_commnunity.try(:ident), + community_ident: @current_community.try(:ident), community_uuid: @current_community.try(:uuid_object).to_s, community_id: @current_community.try(:id), + community_admin_email: @current_community.try(:admin_emails).try(:join, ','), user_id: @current_user.try(:id), user_uuid: @current_user.try(:uuid_object).to_s, diff --git a/app/views/analytics/_google_tag_manager.haml b/app/views/analytics/_google_tag_manager.haml index 10f81903ab..e2c12ca618 100644 --- a/app/views/analytics/_google_tag_manager.haml +++ b/app/views/analytics/_google_tag_manager.haml @@ -1,13 +1,17 @@ :plain var dataLayer = dataLayer || []; - function _gtm_identify(dl, community_id, feature_flags){ - if (community_id) { - dl.push({"event": "identify", "id": "mp-"+community_id+"-admin" }); + function _gtm_identify(dl, info ){ + if (info.community_id) { + dl.push({ + event: "identify", + id: "mp-" + info.community_id + "-admin", + communityAdminEmail: info.community_admin_email, + }); } dl.push({ event: 'feature flags', - featureFlags: feature_flags + featureFlags: info.feature_flags }); }; From 4b9fb47a27290536d91a63df9d0d137128d238be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aivils=20=C5=A0toss?= Date: Wed, 22 Nov 2017 11:06:11 +0200 Subject: [PATCH 007/131] Stripe: NZ bank account --- app/assets/javascripts/stripe_form.js | 3 +- .../payment_settings_controller.rb | 61 +++++++++++++------ 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/app/assets/javascripts/stripe_form.js b/app/assets/javascripts/stripe_form.js index 6b92f16491..9cec54da3c 100644 --- a/app/assets/javascripts/stripe_form.js +++ b/app/assets/javascripts/stripe_form.js @@ -85,8 +85,7 @@ window.ST.stripe_form_i18n = { account_number: {title: 'IBAN', format: 'NL39RABO0300065264', regexp: 'NL[0-9]{2}[A-Z]{4}[0-9]{10}', test_regexp: 'NL'+TEST_IBAN } }, NZ: { - account_number: {format: '0000000010', regexp: '[0-9]{9,10}', test_regexp: '[0-9]{9,10}' }, - routing_number: {title: 'routing_number', format: '110000', regexp: '[0-9]{6}', test_regexp: '[0-9]{6}' } + account_number: {format: '110000-0000000-010', regexp: '[0-9]{6}\-[0-9]{7}\-[0-9]{3}', test_regexp: '[0-9]{6}\-[0-9]{7}\-[0-9]{3}' }, }, NO: { account_number: {title: 'IBAN', format: 'NO9386011117947', regexp: 'NO[0-9]{2}[0-9]{11}', test_regexp: 'NO'+TEST_IBAN }, diff --git a/app/controllers/payment_settings_controller.rb b/app/controllers/payment_settings_controller.rb index 1d4a08e9f5..f26fc9e197 100644 --- a/app/controllers/payment_settings_controller.rb +++ b/app/controllers/payment_settings_controller.rb @@ -256,24 +256,7 @@ def parse_date(params) end def stripe_update_bank_account - bank_country = @parsed_seller_account[:address_country] - bank_currency = MarketplaceService::AvailableCurrencies::COUNTRY_CURRENCIES[bank_country] - form_params = params[:stripe_bank_form] - routing_number = if form_params[:bank_routing_1].present? - [form_params[:bank_routing_1], form_params[:bank_routing_2]].join("-") - else - form_params[:bank_routing_number] - end - bank_params = { - bank_country: bank_country, - bank_currency: bank_currency, - bank_account_holder_name: @parsed_seller_account[:legal_name], - bank_account_number: form_params[:bank_account_number], - bank_routing_number: routing_number, - bank_routing_1: form_params[:bank_routing_1], - bank_routing_2: form_params[:bank_routing_2], - } - + bank_params = StripeParseBankParams.new(parsed_seller_account: @parsed_seller_account, params: params).parse bank_form = StripeBankForm.new(bank_params) @extra_forms[:stripe_bank_form] = bank_form return false unless @stripe_account[:stripe_seller_id].present? @@ -291,6 +274,48 @@ def stripe_update_bank_account end end + class StripeParseBankParams + attr_reader :bank_country, :bank_currency, :form_params, :parsed_seller_account + def initialize(parsed_seller_account:, params:) + @parsed_seller_account = parsed_seller_account + @bank_country = parsed_seller_account[:address_country] + @bank_currency = MarketplaceService::AvailableCurrencies::COUNTRY_CURRENCIES[@bank_country] + @form_params = params[:stripe_bank_form] + end + + def parse + { + bank_country: bank_country, + bank_currency: bank_currency, + bank_account_holder_name: parsed_seller_account[:legal_name], + bank_account_number: parse_bank_account_number, + bank_routing_number: parse_bank_routing_number, + bank_routing_1: form_params[:bank_routing_1], + bank_routing_2: form_params[:bank_routing_2], + } + end + + def parse_bank_routing_number + if bank_country == 'NZ' + bank_branch, = form_params[:bank_account_number].split('-') + bank_branch + elsif form_params[:bank_routing_1].present? + [form_params[:bank_routing_1], form_params[:bank_routing_2]].join("-") + else + form_params[:bank_routing_number] + end + end + + def parse_bank_account_number + if bank_country == 'NZ' + _, account, sufix = form_params[:bank_account_number].split('-') + "#{account}#{sufix}" + else + form_params[:bank_account_number] + end + end + end + StripeAddressForm = FormUtils.define_form("StripeAddressForm", :address_city, :address_line1, From b26c823b18bcd881be20cf3a362080ee96090a87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aivils=20=C5=A0toss?= Date: Wed, 22 Nov 2017 14:10:56 +0200 Subject: [PATCH 008/131] Stripe: Correct keys pattern --- app/helpers/application_helper.rb | 4 ++++ .../admin/payment_preferences/_stripe_form.haml | 13 +++++++++---- config/config.defaults.yml | 12 ++++++------ 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 21309e50fe..f05b0b09fd 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -723,5 +723,9 @@ def us_states ['Wyoming', 'WY'] ] end + + def regex_definition_to_js(string) + string.gsub('\A', '^').gsub('\z', '$').gsub('\\', '\\\\') + end end # rubocop:enable Metrics/ModuleLength diff --git a/app/views/admin/payment_preferences/_stripe_form.haml b/app/views/admin/payment_preferences/_stripe_form.haml index ec2d5bae72..ecc973e1cb 100644 --- a/app/views/admin/payment_preferences/_stripe_form.haml +++ b/app/views/admin/payment_preferences/_stripe_form.haml @@ -11,13 +11,20 @@ -# Not a subject of I18n, forced fixed text = form.label :api_publishable_key, "Publishable key:" .col-8 - = form.text_field :api_publishable_key, class: 'required', placeholder: t("admin.payment_preferences.stripe_form.publishable_key_example", api_publishable_key_example: 'pk_live_67c9SwGQtbsaPkx3JeJKS&mM4') + = form.text_field :api_publishable_key, class: 'required', + placeholder: t("admin.payment_preferences.stripe_form.publishable_key_example", api_publishable_key_example: 'pk_live_67c9SwGQtbsaPkx3JeJKS&mM4'), + regex: regex_definition_to_js(APP_CONFIG.stripe_publishable_key_pattern), + data: {'msg-regex': t("admin.payment_preferences.stripe_form.invalid_publishable", publishable_key: 'publishable key')} .row .col-4 -# Not a subject of I18n, forced fixed text = form.label :api_private_key, "Secret key:" .col-8 - = form.text_field :api_private_key, class: 'required', placeholder: t("admin.payment_preferences.stripe_form.secret_key_example", api_secret_key_example: 'sk_live_c7VffYB8AwSchkxe5RfjtS7e') + = form.text_field :api_private_key, class: 'required', + placeholder: t("admin.payment_preferences.stripe_form.secret_key_example", api_secret_key_example: 'sk_live_c7VffYB8AwSchkxe5RfjtS7e'), + regex: regex_definition_to_js(APP_CONFIG.stripe_private_key_pattern), + data: {'msg-regex': t("admin.payment_preferences.stripe_form.invalid_secret", secret_key: 'secret key')} + .row = button_tag t(".save_api_keys") @@ -32,5 +39,3 @@ "Please check your input." ); $("#new_stripe_api_keys_form").validate(); - $("#stripe_api_keys_form_api_private_key").rules("add", { regex: "#{APP_CONFIG.stripe_private_key_pattern}", messages: {regex: "#{t("admin.payment_preferences.stripe_form.invalid_secret", secret_key: 'secret key')}"} }); - $("#stripe_api_keys_form_api_publishable_key").rules("add", { regex: "#{APP_CONFIG.stripe_publishable_key_pattern}", messages: {regex: "#{t("admin.payment_preferences.stripe_form..invalid_publishable", publishable_key: 'publishable key')}"} }); diff --git a/config/config.defaults.yml b/config/config.defaults.yml index 51d4a9741d..0bd8742f79 100644 --- a/config/config.defaults.yml +++ b/config/config.defaults.yml @@ -450,8 +450,8 @@ default: &default_settings stripe_payout_delay: 7.5 # Key pattern to ensure production keys - stripe_private_key_pattern: "sk_test_.{24}" - stripe_publishable_key_pattern: "pk_test_.{24}" + stripe_private_key_pattern: "\\Ask_test_.{24}\\z" + stripe_publishable_key_pattern: "\\Apk_test_.{24}\\z" # Stripe allows to hold funds up to 90 days # (85 and not 90 or 89 as a security, also because timezones are not @@ -476,16 +476,16 @@ production: &production_settings eager_load: true log_level: INFO - stripe_private_key_pattern: "sk_live_.{24}" - stripe_publishable_key_pattern: "pk_live_.{24}" + stripe_private_key_pattern: "\\Ask_live_.{24}\\z" + stripe_publishable_key_pattern: "\\Apk_live_.{24}\\z" staging: <<: *production_settings # By default staging has same settings as production, but those can be overridden here. log_level: INFO - stripe_private_key_pattern: "sk_(test|live)_.{24}" - stripe_publishable_key_pattern: "pk_(test|live)_.{24}" + stripe_private_key_pattern: "\\Ask_(test|live)_.{24}\\z" + stripe_publishable_key_pattern: "\\Apk_(test|live)_.{24}\\z" development: <<: *default_settings From 2461245748dc7c83dc2c8cfbb878dd6ddeb7e4a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aivils=20=C5=A0toss?= Date: Thu, 23 Nov 2017 08:59:26 +0200 Subject: [PATCH 009/131] Stripe: Allowed spaces in bank account form - spaces removed on submit --- app/assets/javascripts/stripe_form.js | 25 ++++++++++++++----- .../payment_settings/_stripe_wizard.haml | 1 - 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/stripe_form.js b/app/assets/javascripts/stripe_form.js index 6b92f16491..03d9a82e99 100644 --- a/app/assets/javascripts/stripe_form.js +++ b/app/assets/javascripts/stripe_form.js @@ -193,11 +193,23 @@ window.ST.stripe_form_i18n = { update_bank_number_form(country); }); $("#stripe_account_form_address_country").trigger('change'); - $(".bank-account-number input").rules("add", { country_regexp: 'account_number' } ); - $(".bank-routing-number input").rules("add", { country_regexp: 'routing_number' } ); - $(".bank-routing-1 input").rules("add", { country_regexp: 'routing_1' } ); - $(".bank-routing-2 input").rules("add", { country_regexp: 'routing_2' } ); - } + $("#stripe-account-form").validate({ + submitHandler: function(form) { + var removeSpacesInputs = [".bank-account-number input", ".bank-routing-number input", + ".bank-routing-1 input", ".bank-routing-2 input"]; + for (var index in removeSpacesInputs) { + var input = $(removeSpacesInputs[index]); + var value = input.val().replace(/\s+/g, ''); + input.val(value); + } + form.submit(); + } + }); + $(".bank-account-number input").rules("add", { country_regexp: 'account_number' } ); + $(".bank-routing-number input").rules("add", { country_regexp: 'routing_number' } ); + $(".bank-routing-1 input").rules("add", { country_regexp: 'routing_1' } ); + $(".bank-routing-2 input").rules("add", { country_regexp: 'routing_2' } ); + }; function explain_regexp(value) { var t = value; @@ -221,7 +233,8 @@ window.ST.stripe_form_i18n = { } if(re) { var rx = new RegExp("^"+re+"$"); - return rx.test(value); + var testValue = value.replace(/\s+/g, ''); + return rx.test(testValue); } return this.optional(element) || $(element).val(); }, diff --git a/app/views/payment_settings/_stripe_wizard.haml b/app/views/payment_settings/_stripe_wizard.haml index 1c3ea1767f..01924a91aa 100644 --- a/app/views/payment_settings/_stripe_wizard.haml +++ b/app/views/payment_settings/_stripe_wizard.haml @@ -100,7 +100,6 @@ - content_for :extra_javascript do :javascript $(function() { - $("#stripe-account-form").validate(); window.ST.initStripeBankForm(#{!!stripe_test_mode}); }); From e363e11f73fd52aeda231bb815ebdcfa45175172 Mon Sep 17 00:00:00 2001 From: Luis-RG Date: Fri, 24 Nov 2017 14:19:33 +0200 Subject: [PATCH 010/131] Adding some icons to CLP --- app/views/landing_page/_icon.erb | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/app/views/landing_page/_icon.erb b/app/views/landing_page/_icon.erb index 9894da8d5a..5948144d19 100644 --- a/app/views/landing_page/_icon.erb +++ b/app/views/landing_page/_icon.erb @@ -58,6 +58,9 @@ <% when "atomic-bomb" %> +<% when "baby-bed" %> + + <% when "baby-stroller" %> @@ -70,6 +73,9 @@ <% when "barn" %> +<% when "basket-1" %> + + <% when "beach" %> @@ -451,6 +457,9 @@ <% when "leaf" %> +<% when "letter-blocks" %> + + <% when "lightbulb-4" %> @@ -652,6 +661,9 @@ <% when "sherif-star" %> +<% when "shopping-bag-check" %> + + <% when "shopping-cart-1" %> @@ -667,11 +679,8 @@ <% when "shopping-cart-full" %> -<% when "shopping-bag-check" %> - - <% when "shopping-cart-favorite-heart-2" %> - + <% when "sign-for-sale-2" %> From 2e9dd026c4353c90098e242ee64ad5dc7b2d5081 Mon Sep 17 00:00:00 2001 From: Luis-RG Date: Fri, 24 Nov 2017 15:41:58 +0200 Subject: [PATCH 011/131] WTI pull 20171124 --- config/locales/ko.yml | 70 +++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/config/locales/ko.yml b/config/locales/ko.yml index d0a6dd1815..365dd3dc2a 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1371,51 +1371,51 @@ ko: create_new_listing: ~ create_one_here: "신규 작성" email_confirmation_sent_to_new_address: ~ - email_not_found: ~ - error_with_session: ~ - feedback_considered_spam: ~ - feedback_not_saved: ~ - feedback_saved: ~ - feedback_sent_to: ~ - feedback_skipped: ~ + email_not_found: "입력하신 이메을 주소를 %{service_name} 데이터베이스에서 찾을 수 없습니다." + error_with_session: "세션 중 오류가 발생했습니다." + feedback_considered_spam: "의심스러운 입력 형식때문에 피드백이 저장되지 않았습니다. 다시 시도하시거나 피드백 포럼을 이용하세요." + feedback_not_saved: "피드백이 보내지지 않았습니다." + feedback_saved: "피드백을 보내주셔서 감사합니다. 가능한 빨리 연락드리겠습니다." + feedback_sent_to: "피드백을 %{target_person}에게 발송했습니다." + feedback_skipped: "피드백이 생략되었습니다." invitation_cannot_be_sent: ~ invitation_cannot_unsubscribe: ~ invitation_limit_reached: ~ invitation_sent: ~ invitation_successfully_unsubscribed: ~ inviting_new_users_is_not_allowed_in_this_community: ~ - login_again: ~ - login_failed: ~ + login_again: "다시 로그인해주세요." + login_failed: "로그인에 실패하였습니다. 로그인정보를 올바르게 입력해주세요." account_creation_successful: ~ account_deleted: ~ - login_successful: ~ - logout_successful: ~ + login_successful: "%{person_name}님 환영합니다," + logout_successful: "%{service_name}에서 로그아웃하셨습니다. 다시 뵙기를 바랍니다." news_item_created: ~ news_item_creation_failed: ~ news_item_update_failed: ~ news_item_updated: ~ news_item_deleted: ~ - offer_accepted: ~ + offer_accepted: "제안을 받아들였습니다." offer_confirmed: ~ - offer_closed: ~ + offer_closed: "제안을 종료하였습니다." listing_created_successfully: ~ - offer_rejected: ~ + offer_rejected: "제안을 거절했습니다." offer_canceled: ~ listing_updated_successfully: ~ listing_updated_availability_management_enabled: ~ listing_updated_availability_management_disabled: ~ - only_kassi_administrators_can_access_this_area: ~ - only_listing_author_can_close_a_listing: ~ - only_listing_author_can_edit_a_listing: ~ + only_kassi_administrators_can_access_this_area: "%{service_name}팀에서만 이 영역을 접근할 수 있습니다." + only_listing_author_can_close_a_listing: "게시자만 편집할 수 있습니다." + only_listing_author_can_edit_a_listing: "게시자만 편집할 수 있습니다." payment_successful: ~ payment_canceled: ~ error_in_payment: ~ cannot_receive_payment: ~ payment_waiting_for_later_accomplishment: ~ - password_recovery_sent: ~ + password_recovery_sent: "비밀번호 변경 안내 이메일을 발송하였습니다." person_activated: ~ person_deactivated: ~ - person_updated_successfully: ~ + person_updated_successfully: "정보가 변경되었습니다." poll_answered: ~ poll_could_not_be_answered: ~ poll_created: ~ @@ -1423,38 +1423,38 @@ ko: poll_update_failed: ~ poll_updated: ~ poll_deleted: ~ - read_more: ~ + read_more: "더 보기" registration_considered_spam: ~ - reply_cannot_be_empty: ~ - reply_sent: ~ - request_accepted: ~ + reply_cannot_be_empty: "메세지가 작성되지 않아 보내실 수 없습니다." + reply_sent: "답장을 보냈습니다." + request_accepted: "요청을 받아들였습니다." request_confirmed: ~ - request_rejected: ~ + request_rejected: "요청을 거절했습니다." request_canceled: ~ message_sent: ~ message_not_sent: ~ this_content_is_not_available_in_this_community: ~ - unknown_error: ~ - update_error: ~ - you_are_not_allowed_to_give_feedback_on_this_transaction: ~ - you_are_not_authorized_to_do_this: ~ - you_are_not_authorized_to_view_this_content: ~ + unknown_error: "알 수 없는 오류입니다. \"고객센터\" 링크를 이용하여 해당 오류의 상세 내역을 보내주세요." + update_error: "회원 정보 수정 중 오류가 발생했습니다. 다시 시도해주세요." + you_are_not_allowed_to_give_feedback_on_this_transaction: "이 거래에는 피드백을 남기실 수 없습니다." + you_are_not_authorized_to_do_this: "실행 권한이 없습니다." + you_are_not_authorized_to_view_this_content: "내용 보기 권한이 없습니다." listing_closed: ~ send_instructions: ~ - you_cannot_reply_to_a_closed_offer: ~ + you_cannot_reply_to_a_closed_offer: "종료된 제안에는 답장을 보내실 수 없습니다." you_cannot_send_message_to_yourself: ~ you_followed_listing: ~ - you_have_already_given_feedback_about_this_event: ~ + you_have_already_given_feedback_about_this_event: "이미 피드백을 보내셨습니다." you_are_now_member: ~ you_are_already_member: ~ you_must_log_in_to_create_new_listing: ~ additional_email_confirmed_dashboard: ~ - you_must_log_in_to_give_feedback: ~ + you_must_log_in_to_give_feedback: "피드백을 보내시려면 로그인하셔야 합니다." you_must_log_in_to_invite_new_users: ~ - you_must_log_in_to_send_a_comment: ~ - you_must_log_in_to_send_a_message: ~ + you_must_log_in_to_send_a_comment: "의견을 보내시려면 로그인하셔야 합니다." + you_must_log_in_to_send_a_message: "다른 가입자에게 메세지를 보내시려면 %{service_name}에 로그인하셔야 합니다." you_must_log_in_to_do_a_transaction: ~ - you_must_log_in_to_view_this_content: ~ + you_must_log_in_to_view_this_content: "내용을 확인하시려면 로그인하셔야 합니다." you_must_log_in_to_view_this_page: ~ you_must_log_in_to_view_your_inbox: ~ you_must_log_in_to_view_your_settings: ~ From 1c9cb7d611bc0092aa03ed436722736003ac9bb1 Mon Sep 17 00:00:00 2001 From: Thomas Malbaux Date: Mon, 27 Nov 2017 17:05:36 +0200 Subject: [PATCH 012/131] Suffix number can be 2 or 3 digits --- app/assets/javascripts/stripe_form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/stripe_form.js b/app/assets/javascripts/stripe_form.js index 9cec54da3c..510b2990f0 100644 --- a/app/assets/javascripts/stripe_form.js +++ b/app/assets/javascripts/stripe_form.js @@ -85,7 +85,7 @@ window.ST.stripe_form_i18n = { account_number: {title: 'IBAN', format: 'NL39RABO0300065264', regexp: 'NL[0-9]{2}[A-Z]{4}[0-9]{10}', test_regexp: 'NL'+TEST_IBAN } }, NZ: { - account_number: {format: '110000-0000000-010', regexp: '[0-9]{6}\-[0-9]{7}\-[0-9]{3}', test_regexp: '[0-9]{6}\-[0-9]{7}\-[0-9]{3}' }, + account_number: {format: '110000-0000000-010', regexp: '[0-9]{6}\-[0-9]{7}\-[0-9]{2,3}', test_regexp: '[0-9]{6}\-[0-9]{7}\-[0-9]{2,3}' }, }, NO: { account_number: {title: 'IBAN', format: 'NO9386011117947', regexp: 'NO[0-9]{2}[0-9]{11}', test_regexp: 'NO'+TEST_IBAN }, From 646a17cbc2123d9c88ab34fafa6377b74fac3b73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aivils=20=C5=A0toss?= Date: Tue, 28 Nov 2017 11:51:44 +0200 Subject: [PATCH 013/131] GTM - admin email if user is admin --- app/helpers/analytics_helper.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/helpers/analytics_helper.rb b/app/helpers/analytics_helper.rb index ddce35d621..1239a2b83d 100644 --- a/app/helpers/analytics_helper.rb +++ b/app/helpers/analytics_helper.rb @@ -1,14 +1,15 @@ module AnalyticsHelper def analytics_data + user_is_admin = @current_user.try(:is_marketplace_admin?, @current_community) { community_ident: @current_community.try(:ident), community_uuid: @current_community.try(:uuid_object).to_s, community_id: @current_community.try(:id), - community_admin_email: @current_community.try(:admin_emails).try(:join, ','), + community_admin_email: (user_is_admin ? IntercomHelper.email(@current_user) : nil), user_id: @current_user.try(:id), user_uuid: @current_user.try(:uuid_object).to_s, - user_is_admin: @current_user.try(:is_marketplace_admin?, @current_community), + user_is_admin: user_is_admin, user_email: @current_user && IntercomHelper.email(@current_user) || 'null', user_name: @current_user && @current_community && PersonViewUtils.person_display_name(@current_user, @current_community) || 'null', user_hash: @current_user && IntercomHelper.user_hash(@current_user.uuid_object.to_s) || 'null', From e274ab74a2f3250580560e0747284cb87216e4ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aivils=20=C5=A0toss?= Date: Tue, 28 Nov 2017 14:28:24 +0200 Subject: [PATCH 014/131] Fixed: Feedbacks data too long for url --- app/models/feedback.rb | 2 +- db/migrate/20171128122539_change_feedbacks_url.rb | 9 +++++++++ db/structure.sql | 9 +++++---- 3 files changed, 15 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20171128122539_change_feedbacks_url.rb diff --git a/app/models/feedback.rb b/app/models/feedback.rb index 58ada0962b..a8f6bad5fa 100644 --- a/app/models/feedback.rb +++ b/app/models/feedback.rb @@ -5,7 +5,7 @@ # id :integer not null, primary key # content :text(65535) # author_id :string(255) -# url :string(255) +# url :string(2048) # created_at :datetime # updated_at :datetime # is_handled :integer default(0) diff --git a/db/migrate/20171128122539_change_feedbacks_url.rb b/db/migrate/20171128122539_change_feedbacks_url.rb new file mode 100644 index 0000000000..1d12855df0 --- /dev/null +++ b/db/migrate/20171128122539_change_feedbacks_url.rb @@ -0,0 +1,9 @@ +class ChangeFeedbacksUrl < ActiveRecord::Migration[5.1] + def up + change_column :feedbacks, :url, :string, limit: 2048 + end + + def down + change_column :feedbacks, :url, :string, limit: 255 + end +end diff --git a/db/structure.sql b/db/structure.sql index 7ea75fcf7e..e7e2e62ea5 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -523,7 +523,7 @@ CREATE TABLE `feedbacks` ( `id` int(11) NOT NULL AUTO_INCREMENT, `content` text, `author_id` varchar(255) DEFAULT NULL, - `url` varchar(255) DEFAULT NULL, + `url` varchar(2048) DEFAULT NULL, `created_at` datetime DEFAULT NULL, `updated_at` datetime DEFAULT NULL, `is_handled` int(11) DEFAULT '0', @@ -553,13 +553,13 @@ DROP TABLE IF EXISTS `invitation_unsubscribes`; CREATE TABLE `invitation_unsubscribes` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `community_id` int(11) DEFAULT NULL, - `email` varchar(255) DEFAULT NULL, + `email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, PRIMARY KEY (`id`), KEY `index_invitation_unsubscribes_on_community_id` (`community_id`), KEY `index_invitation_unsubscribes_on_email` (`email`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `invitations`; /*!40101 SET @saved_cs_client = @@character_set_client */; @@ -2210,6 +2210,7 @@ INSERT INTO `schema_migrations` (version) VALUES ('20170801125553'), ('20170814125622'), ('20170817035830'), -('20171107063241'); +('20171107063241'), +('20171128122539'); From 47dd8c1a9fc764a26d82aa718cdea81c48f700da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aivils=20=C5=A0toss?= Date: Wed, 29 Nov 2017 09:05:35 +0200 Subject: [PATCH 015/131] User confirmation form is more secure - removed unused from data - check current_user on email change --- app/controllers/confirmations_controller.rb | 4 ++++ app/views/community_memberships/_confirmation_form.haml | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/controllers/confirmations_controller.rb b/app/controllers/confirmations_controller.rb index 7fd1b47004..0633466d54 100644 --- a/app/controllers/confirmations_controller.rb +++ b/app/controllers/confirmations_controller.rb @@ -5,6 +5,10 @@ class ConfirmationsController < Devise::ConfirmationsController :ensure_consent_given, :ensure_user_belongs_to_community + before_action(only: [:create]) do |controller| + controller.ensure_logged_in t("layouts.notifications.you_must_log_in_to_view_this_page") + end + # This is overridden from Devise::ConfirmationsController # to be able to handle better the situations of resending confirmation and # confirmation attemt with wrong token. diff --git a/app/views/community_memberships/_confirmation_form.haml b/app/views/community_memberships/_confirmation_form.haml index 5358731583..32c427fb45 100644 --- a/app/views/community_memberships/_confirmation_form.haml +++ b/app/views/community_memberships/_confirmation_form.haml @@ -18,7 +18,6 @@ %p = form_for(Person, :as => "person", :url => confirmation_path(:locale => I18n.locale), :html => { :method => :put, :id => "resend_email_confirmation"} ) do |form| .form_field_container - = form.hidden_field :id, :value => @current_user.id = form.button t("sessions.confirmation_pending.resend_confirmation_instructions"), :class => "resend_email_confirmation_button send_button" %p = t("sessions.confirmation_pending.your_current_email_is", :email => email_to_confirm).html_safe @@ -27,5 +26,4 @@ = form_for(Person, :as => "person", :url => confirmation_path(:locale => I18n.locale), :html => { :method => :put, :id => "change_mistyped_email_form"} ) do |form| .form_field_container - = form.hidden_field :id, :value => @current_user.id = render :partial => "sessions/change_mistyped_email", :locals => {:email_to_confirm => email_to_confirm} From 598116bdbd0b268528c42f8ca8e13ff957a7545f Mon Sep 17 00:00:00 2001 From: Luis-RG Date: Wed, 29 Nov 2017 10:37:41 +0200 Subject: [PATCH 016/131] adds latvian to the list of unsupported languages --- config/available_locales.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/available_locales.rb b/config/available_locales.rb index 7aca4bf59d..88a4328bc9 100644 --- a/config/available_locales.rb +++ b/config/available_locales.rb @@ -58,7 +58,8 @@ module Sharetribe {ident: "sk-SK", name: "Slovenčina", language: "sk-SK", region: "SK", fallback: nil}, # Slovak {ident: "ti", name: "Tigrinya", language: "ti", region: "ER", fallback: nil}, # Tigrinya {ident: "ar", name: "Arabic", language: "ar", region: "SA", fallback: nil}, # Arabic (Saudi Arabia) - {ident: "he-IL", name: "עברית‎", language: "he", region: "IL", fallback: nil} # Hebrew (Israel) + {ident: "he-IL", name: "עברית‎", language: "he", region: "IL", fallback: nil}, # Hebrew (Israel) + {ident: "lv", name: "Latviešu valoda", language: "lv", region: "LV", fallback: nil} # Latvian ] AVAILABLE_LOCALES = SUPPORTED_LOCALES + UNSUPPORTED_LOCALES From 8ca1fd07f2b6e195819e12c866618dcb8a9c368d Mon Sep 17 00:00:00 2001 From: Luis-RG Date: Wed, 29 Nov 2017 13:55:12 +0200 Subject: [PATCH 017/131] WTI pull 20171129 --- config/locales/devise.ko.yml | 2 +- config/locales/fr.yml | 4 +- config/locales/ko.yml | 262 ++++++++++++++++++----------------- config/locales/sv.yml | 8 +- 4 files changed, 141 insertions(+), 135 deletions(-) diff --git a/config/locales/devise.ko.yml b/config/locales/devise.ko.yml index 1bc8e4fd97..aed7ee4663 100644 --- a/config/locales/devise.ko.yml +++ b/config/locales/devise.ko.yml @@ -3,7 +3,7 @@ ko: messages: expired: "만료되었습니다. 새로 요청하세요." not_found: "찾을 수 없습니다." - already_confirmed: "이미 처리되었습니다. 로그인하세요." + already_confirmed: "인증되었습니다. 로그인하세요." not_locked: "잠기지 않았습니다." not_saved: zero: "오류가 발생하여 %{resource}이/가 저장되지 않았습니다." diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 9b57616c97..c4457a97c5 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -608,8 +608,8 @@ fr: publishable_key_example: "Par exemple : %{api_publishable_key_example}" secret_key_example: "Par exemple : %{api_secret_key_example}" save_api_keys: "Sauvegarder les Stripe API keys" - invalid_secret: "Cela ne semble pas être une %{secret_key} correcte" - invalid_publishable: "Cela ne semble pas être une %{publishable_key} correcte" + invalid_secret: "Cela ne semble pas être une \"%{secret_key}\" correcte" + invalid_publishable: "Cela ne semble pas être une \"%{publishable_key}\" correcte" index: header: "Paramètres de paiement disponibles" info: "Vous pouvez configurer les plateformes de paiements disponibles dans votre place de marché. Actuellement Stripe et PayPal sont disponibles." diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 365dd3dc2a..37d6d41312 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -42,27 +42,27 @@ ko: cancel: ~ communities: edit_details: - community_details: ~ - community_look_and_feel: ~ - edit_community: ~ + community_details: "기본 정보" + community_look_and_feel: 디자인 + edit_community: "기본 정보" enabled_languages: ~ enabled_languages_description: ~ default_language: ~ language_selection_disabled: ~ - community_name: ~ + community_name: "마켓플레이스 이름" edit_community_name_description: ~ - community_slogan: ~ + community_slogan: "마켓플레이스 슬로건" edit_community_slogan_description: ~ - community_description: ~ + community_description: "마켓플레이스 설명" edit_community_description_description: ~ community_search_placeholder: ~ edit_community_search_placeholder_description: ~ private_community_homepage_content: ~ edit_private_community_homepage_content_description: ~ - update_information: ~ - invite_people: ~ - edit_signup_info: ~ - edit_signup_info_description: ~ + update_information: "설정 저장" + invite_people: "%{service_name}로 친구 초대" + edit_signup_info: "등록 정보" + edit_signup_info_description: "사용자가 신규 가입할 때 보여지는 내용입니다. 사용자에게 가입 안내와 초청장을 어디서 받을 수 있는가와 같은 정보를 제공합니다. 기본 설정에는 가입 안내가 제공되지 않습니다." edit_info: ~ see_how_it_looks_like: ~ verification_to_post_listings_info_content: ~ @@ -77,29 +77,29 @@ ko: transaction_agreement_text_header: ~ transaction_agreement_description: ~ edit_look_and_feel: - edit_community_look_and_feel: ~ - community_logo: ~ - community_logo_icon: ~ - community_cover_photo: ~ - small_community_cover_photo: ~ + edit_community_look_and_feel: "마켓플레이스 %{community_name} 꾸미기" + community_logo: 로고 + community_logo_icon: "모바일용 로고" + community_cover_photo: "표지 이미지" + small_community_cover_photo: "작은 표지 이미지" favicon: ~ favicon_info_text: ~ - community_custom_color1: ~ + community_custom_color1: "메인 컬러" community_slogan_color: ~ community_slogan_color_instructions_text: ~ community_description_color: ~ community_description_color_instructions_text: ~ new_listing_button_custom_color: ~ - logo_instructions_text_with_dimensions: ~ + logo_instructions_text_with_dimensions: "로고는 %{width} x %{height} 픽셀로 제공해주세요. 큰 화면을 사용하는 사용자에게 보여집니다." logo_instructions_text_with_dimensions_no_placing: ~ - logo_icon_instructions_text_with_dimensions: ~ + logo_icon_instructions_text_with_dimensions: "정사각형 로고는 모바일 화면 또는 페이스북을 통해 사이트를 공유할 때 사용됩니다. 가급적 %{width} x %{height}픽셀로 만들어주세요." logo_icon_instructions_text_with_dimensions_no_placing: ~ cover_photo_visibility: ~ - cover_photo_instructions_text_with_dimensions: ~ + cover_photo_instructions_text_with_dimensions: "이미지가 %{width} x %{height} 픽셀로 변경됩니다. 세로로 긴 이미지는 중간에서 잘립니다. %{see_how_it_looks_like}" small_cover_photo_visibility: ~ small_cover_photo_instructions_text_with_dimensions: ~ main_content_width: ~ - custom_color1_instructions_text: ~ + custom_color1_instructions_text: "사용자 인터페이스의 메인 컬러를 컬러 코드를 입력하여 변경하실 수 있습니다. ColorPicker.com에서 컬러 코드를 확인하신 후 코드를 복사하여 사용하세요." new_listing_button_instructions_text: ~ default_browse_view: ~ default_browse_view_instructions_text: ~ @@ -111,16 +111,16 @@ ko: full_name: ~ first_name_with_initial: ~ first_name_only: ~ - invalid_color_code: ~ + invalid_color_code: "컬러 코드는 6자리의 숫자 또는 알파벳 A-F로 구성됩니다 (예: D96E21)." custom_head_script: ~ custom_head_script_instructions_text: ~ edit_text_instructions: edit_text_instructions: ~ edit_welcome_email: - welcome_email_content: ~ - welcome_email_content_description: ~ - edit_message: ~ - send_test_message: ~ + welcome_email_content: "환영 이메일 내용" + welcome_email_content_description: "아래의 메시지는 모든 신규 가입자에게 발송됩니다. 당신의 마켓 플레이스에 맞게 커스터마이즈 해보세요. %{send_test_message_link}을 클릭하면 메시지가 당신의 이메일로 보내지고, 고객에게 어떻게 보여지는지 확인하실 수 있습니다." + edit_message: "메세지 편집" + send_test_message: "테스트 메세지 발송" outgoing_email: title: ~ info: ~ @@ -397,9 +397,9 @@ ko: date: ~ emails: new: - send_email_to_members: ~ - send_email_to_members_title: ~ - send_email: ~ + send_email_to_members: "사용자에게 이메일 발송" + send_email_to_members_title: "사용자에게 전체 이메일 발송" + send_email: "이메일 발송" send_email_or: ~ send_test_email: ~ test_sent: ~ @@ -413,13 +413,13 @@ ko: with_listing_no_payment: ~ with_payment_no_listing: ~ no_listing_no_payment: ~ - email_subject: ~ - email_content: ~ - email_content_placeholder: ~ - email_language: ~ - any_language: ~ - message_will_be_sent_only_to_people_with_this_language: ~ - email_sent: ~ + email_subject: "이메일 제목" + email_content: "이메일 본문" + email_content_placeholder: "사용자에게 발송할 내용" + email_language: "이메일 수신자의 주요 언어" + any_language: "모든 언어" + message_will_be_sent_only_to_people_with_this_language: "이 이메일은 선택한 언어로 %{service_name}를 이용 중인 사용자들에게만 발송됩니다." + email_sent: "이메일을 보냈습니다." left_hand_navigation: general: ~ users_and_transactions: ~ @@ -608,84 +608,90 @@ ko: offer: ~ inquiry: ~ common: - edit_page: ~ - default_community_slogan: ~ - default_community_description: ~ + edit_page: "페이지 편집" + default_community_slogan: "커뮤니티 마켓플레이스" + default_community_description: "커뮤니티 마켓플레이스는 다른 사용자들에게 제품 및 서비스를 판매, 대여, 교환, 공유하는 장소입니다." cancel: 취소 fields_that_are_mandatory: "별표(*)가 있는 항목은 필수 입력 항목입니다." or: 또는 - password: ~ - service_name: ~ + password: 비밀번호 + service_name: "%{service_name}" share_types: - request: ~ - offer: ~ - borrow: "대여 중" - buy: "구매 중" - give_away: "증정 중" - lend: "대출 중" - receive: "무료 증정 중" - rent: "대여 중" - rent_out: "대여 중" - sell: "판매 중" - offer_to_swap: ~ - request_to_swap: ~ - share_for_free: ~ - accept_for_free: ~ + request: 요청 + offer: 제안 + borrow: "무상 대여" + buy: 구매 + give_away: 증정 + lend: 대여 + receive: "자유 이용" + rent: 대여 + rent_out: 대여 + sell: 판매 + offer_to_swap: 교환 + request_to_swap: 교환 + share_for_free: "무료 공유" + accept_for_free: "무료 사용 요청" categories: - item: ~ - favor: ~ - rideshare: ~ - housing: ~ - tools: ~ - sports: ~ - music: ~ - books: ~ - games: ~ - furniture: ~ - outdoors: ~ - food: ~ - electronics: ~ - pets: ~ - film: ~ - clothes: ~ - garden: ~ - travel: ~ - other: ~ - username: ~ - username_or_email: ~ + item: 상품 + favor: 서비스 + rideshare: "카 쉐어링" + housing: "공간 제공" + tools: 도구 + sports: 스포츠 + music: 음악 + books: "책 & 잡지" + games: "게임 & 장난감" + furniture: 가구 + outdoors: "캠핑 & 아웃도어" + food: "요리 & 주방" + electronics: 전자기기 + pets: "애완 동물" + film: 영화 + clothes: "의류 & 악세사리" + garden: 정원 + travel: 여행 + other: 기타 + username: "사용자 이름" + username_or_email: "이메일 또는 사용자 이름" what_is_this: "이것은 무엇인가요?" - removed_user: ~ + removed_user: "삭제된 사용자" payment_fee_info: - title: ~ - title_paypal: ~ - stripe: ~ - paypal: ~ - info: ~ + title: "페이팔 수수료" + title_paypal: "페이팔 수수료" + stripe: 스트라이프 + paypal: 페이팔 + info: "%{service_name}의 결제 방식은 스트라이프 또는 페이팔 중에서 선택하실 수 있습니다. 각 결제 방식마다 이용 수수료가 부과됩니다." paypal_fee_info: - title: ~ - body_text: ~ - body_text_accept: ~ - link_to_paypal_text: ~ + title: "페이팔 수수료" + body_text: |- + %{service_name}은 수수료 %{paypal_commission}를 부과합니다. 여기에는 페이팔이 결제 처리 건마다 부과하는 이용 수수료는 포함되어 있지 않습니다. 페이팔 이용 수수료는 보통 전체 결제 금액의 2 ~ 5%이며, 월간 매출 규모와 구매자의 거주 지역에 따라 달라집니다. 일반적으로 내국인 구매이거나 매출 규모가 클수록 낮은 수수료율이 적용됩니다. + %{link_to_paypal}에서 수수료 세부 내역을 확인하실 수 있습니다. 결제 처리 후 수수료가 포함된 영수증이 발행됩니다. + body_text_accept: |- + 이 결제는 페이팔을 통해 처리됩니다. 페이팔은 결제 처리 건마다 이용 수수료를 부과합니다. 페이팔 이용 수수료는 보통 전체 결제 금액의 2 ~ 5%이며, 월간 매출 규모와 구매자의 거주 지역에 따라 달라집니다. 일반적으로 내국인 구매이거나 매출 규모가 클수록 낮은 수수료율이 적용됩니다. + %{link_to_paypal}에서 수수료 세부 내역을 확인하실 수 있습니다. 결제 처리 후 수수료가 포함된 영수증이 발행됩니다. + link_to_paypal_text: 여기 paypal_only_fee_info: - title: ~ - body_text: ~ - link_to_paypal_text: ~ + title: "페이팔 수수료" + body_text: |- + %{service_name}의 결제는 페이팔을 통해 처리됩니다. 페이팔은 결제 처리 건마다 이용 수수료를 부과합니다. 페이팔 이용 수수료는 보통 전체 결제 금액의 2 ~ 5%이며, 월간 매출 규모와 구매자의 거주 지역에 따라 달라집니다. 일반적으로 내국인 구매이거나 매출 규모가 클수록 낮은 수수료율이 적용됩니다. + %{link_to_paypal}에서 수수료 세부 내역을 확인하실 수 있습니다. 결제 처리 후 수수료가 포함된 영수증이 발행됩니다. + link_to_paypal_text: 여기 stripe_fee_info: - title: ~ - body_text: ~ - link_to_stripe_text: ~ + title: "스트라이프 수수료" + body_text: "%{service_name}은 수수료 %{stripe_commission}를 부과합니다. 여기에는 스트라이프 이용 수수료가 포함되어 있습니다." + link_to_stripe_text: 여기 conversations: accept: details: ~ order_by: ~ - accept_offer: ~ - accept_request: ~ - reject_offer: ~ - reject_request: ~ - close_listing: ~ - update_later: ~ - optional_message: ~ - price_to_pay: ~ + accept_offer: "제안 승인" + accept_request: "요청 승인" + reject_offer: "다음 기회에" + reject_request: "다음 기회에" + close_listing: "%{listing_title_link}를 비공개로 전환합니다." + update_later: "목록을 공개 상태로 유지합니다." + optional_message: "추가 메세지" + price_to_pay: "총 지불 금액" accept: ~ decline: ~ quantity_label: ~ @@ -701,8 +707,8 @@ ko: shipping_price_label: ~ stripe-fee_label: ~ confirm: - confirm_description: ~ - cancel_description: ~ + confirm_description: "피드백을 작성하시려면 거래 완료 여부를 확인해주세요." + cancel_description: "거래가 정상적으로 진행되지 않은 경우 '부적합'을 입력해주세요. 이 경우 피드백을 작성하실 수 있으며 불만 내용을 보내실 수 있습니다." cancel_payed_description: ~ canceling_payed_transaction: ~ confirm: ~ @@ -749,13 +755,13 @@ ko: message: 메세지 message_to: ~ optional_message_to: ~ - send_message: ~ + send_message: "메세지 발송" send: ~ - this_message_is_private: ~ - you_will_get_notified_of_acceptance: ~ - you_will_get_notified: ~ + this_message_is_private: "%{person}님에게 보내는 비밀 메세지입니다. %{person}님에게 알림 이메일이 발송됩니다." + you_will_get_notified_of_acceptance: "제안에 대한 %{person}님의 승인 또는 거부 여부는 이메일 알림으로 도착합니다." + you_will_get_notified: "%{person}님이 답변하시면 이메일 알림이 도착합니다." title: 제목 - send_message_to_user: ~ + send_message_to_user: "%{person}님에게 메세지 발송" about_listing: ~ author_has_to_accept_request: ~ show: @@ -764,10 +770,10 @@ ko: message_sent_to: ~ send_reply: "회신 보내기" write_a_reply: "회신 작성하기:" - conversation_about_listing: ~ - conversation_with_user: ~ + conversation_about_listing: "%{person}님과 %{listing}에 관한" + conversation_with_user: "%{person}님과" conversation_with: ~ - last_message_at: ~ + last_message_at: "(최근 메세지 %{time})" price: ~ sum: ~ total: ~ @@ -820,8 +826,8 @@ ko: status_link: accept_offer: "제안 승인" accept_request: "요청 승인" - reject_offer: "이번엔 안되겠습니다." - reject_request: "이번엔 안되겠습니다." + reject_offer: "다음 기회에" + reject_request: "다음 기회에" accept_preauthorized_offer: ~ accept_preauthorized_request: ~ reject_preauthorized_offer: ~ @@ -835,25 +841,25 @@ ko: anonymous_user: ~ community_memberships: access_denied: - access_denied: ~ - you_are_banned_in_this_community: ~ - contact_page_link: ~ + access_denied: "접근이 거부되었습니다." + you_are_banned_in_this_community: "%{service_name} 관리자가 당신의 접근을 제한하였습니다. %{link_to_contact_page}를 통해 %{service_name} 관리자에게 문의해주세요." + contact_page_link: "사용 문의" new: - welcome_fb_user: ~ - fb_join_accept_terms: ~ - join_community: ~ - you_can_join: ~ - you_can_join_email_confirmation: ~ - you_can_join_email_confirmation_multiple_addresses: ~ - you_can_join_with_invite_only: ~ - if_want_to_view_content: ~ - log_out: ~ - join_community_button: ~ + welcome_fb_user: "%{name}님, %{service_name}에 오신 것을 환영합니다." + fb_join_accept_terms: "%{service_name} 가입 절차를 마치기 위해 이용 약관에 동의해주세요." + join_community: "%{service_name} 가입" + you_can_join: "아래의 %{service_name} 이용 약관에 동의하시면 %{service_name}에 가입하실 수 있습니다." + you_can_join_email_confirmation: "%{service_name}에 가입하시려면 %{email_ending}로 끝나는 이메일 주소가 필요합니다. 이메일 주소를 입력하시고 이용 약관에 동의하신 후 '%{service_name} 가입'을 클릭하시고 메일 인증까지 완료하시면 가입하실 수 있습니다." + you_can_join_email_confirmation_multiple_addresses: "%{service_name}은 허용된 이메일 주소가 있어야만 가입하실 수 있습니다. 이메일 주소를 입력하시고 %{service_name} 이용 약관에 동의하신 후 '%{service_name} 가입'을 클릭하여 가입해주세요." + you_can_join_with_invite_only: "%{service_name}에 가입하시려면 기존 사용자에게서 초대를 받아야 합니다. 아래 양식에 초대 코드를 입력하시고 이용 약관에 동의 하신 후 '%{service_name} 가입'을 클릭하여 가입해주세요." + if_want_to_view_content: "%{service_name}에 가입하지 않고 내용을 보고 싶으신 경우" + log_out: 로그아웃 + join_community_button: "%{service_name} 가입" give_consent: - invitation_code_invalid_or_used: ~ - email_not_allowed: ~ - email_not_available: ~ - consent_not_given: ~ + invitation_code_invalid_or_used: "잘못되었거나 이미 사용된 초대 코드입니다." + email_not_allowed: "입력하신 이메일은 %{service_name}에서 사용하실 수 없습니다." + email_not_available: "입력하신 이메일은 이미 사용 중입니다." + consent_not_given: "이용 약관에 동의하지 않으셨습니다." emails: accept_reminder: remember_to_accept_offer: "%{sender_name}로부터 받은 제안을 승인 또는 거부하는걸 잊지마세요." diff --git a/config/locales/sv.yml b/config/locales/sv.yml index e6a1d89344..1244779859 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -106,7 +106,7 @@ sv: community_description_color_instructions_text: "Du kan ändra färgen på beskrivningen som syns på hemsidan genom att skriva in ett hex-värde. Beskrivningen visas åt alla som inte är inloggade. %{colorpicker} kan hjälpa dig att välja en färg och kopiera koden här. %{see_how_it_looks_like}" new_listing_button_custom_color: "Skapa en ny annons knapp färg" logo_instructions_text_with_dimensions: "Desktoplogotypens storlek ska vara %{width}x%{height}px. Den kommer att visas för användare med större skärm." - logo_instructions_text_with_dimensions_no_placing: "Logotypens storlek skall vara %{height}x%{width}pixlar" + logo_instructions_text_with_dimensions_no_placing: "Logotypens storlek skall vara %{height}x%{width} pixlar" logo_icon_instructions_text_with_dimensions: "Denna fyrkantiga logotyp kommer att visas när folk delar din sida på Facebook, när de ser din sida på en mobil enhet eller när de lägger ett bokmärke av din sida till hemmaskärmen på mobila enheter. Dimensionerna måste vara (minst) %{width}x%{height}px." logo_icon_instructions_text_with_dimensions_no_placing: "Denna fyrkantiga logotyp kommer att visas när folk delar din sida på Facebook, när de ser din sida på en mobil enhet eller när de lägger ett bokmärke av din sida till hemmaskärmen på mobila enheter. Dimensionerna måste vara (minst) %{width}x%{height}px." cover_photo_visibility: "Omslagsbild visas på startsidan för ej inloggade användare." @@ -154,7 +154,7 @@ sv: send_verification_button: "Skicka verifikationsmail" change_sender_email: "ändra avsändaradress" successfully_saved: "Avsändaradress sparades korrekt. Verifikationsmailet kommer att skickas snart." - successfully_saved_name: "Avsändar namn uppdaterat." + successfully_saved_name: "Avsändarnamn uppdaterat." set_sender_name: "Ändra avsändarnamn" change_sender_name: "Ändra avsändarnamn" change_sender_prompt: "%{change_name_link} eller %{change_email_link}" @@ -226,7 +226,7 @@ sv: twitter_handle: "Twitter handtag (används med twitterknappen på annonssidan)" update_settings: "Spara inställningar" automatically_confirmed_no_escrow: "Transaktionen kommer automatiskt att markeras som klar %{days_dropdown} dagar efter att betalningen gjorts" - automatically_confirmed_no_escrow_stripe_info: ~ + automatically_confirmed_no_escrow_stripe_info: "För transaktioner porcesserade med Stripe är utbetalningen till säljarna fördröjd tills förfrågan har marketats som klar. %{learn_more}" automatic_newsletter_frequency: "Skicka automatiskt nyhetsbrev: %{frequency_dropdown}" newsletter_daily: Dagligen newsletter_weekly: Veckovis @@ -1719,7 +1719,7 @@ sv: select_transaction_type: "Välj annonstyp" you_need_to_fill_payout_details_before_accepting: "Du måste fylla i dina utbetalningsdetaljer innan du kan skapa en annons. Gå till %{payment_settings_link} för att fylla i detaljerna." contact_admin_link_text: "kontakta administratören" - community_not_configured_for_payments: "%{service_name} har inte konfigurerats för betalningar, så du kan inte skapa nya annonser än. Vänligen %{contact_admin_link} för detaljer." + community_not_configured_for_payments: "%{service_name} har inte konfigurerats för betalningar, så du kan inte skapa nya annonser än. Vänligen %{contact_admin_link} för mer information." payment_settings_link: betalningsinställningar community_not_configured_for_payments_admin: "%{service_name} har inte konfigurerats för betalningar, så du kan inte lägga ut nya annonser än. Gå till %{payment_settings_link} för att fylla i betalningsdetaljer." quantity: From 00d2e462919761e8efde789b630128ce8b031ec0 Mon Sep 17 00:00:00 2001 From: Thomas Malbaux Date: Fri, 1 Dec 2017 11:41:29 +0200 Subject: [PATCH 018/131] wti pull --- app/assets/javascripts/locales/fr.json | 2 +- config/locales/da-DK.yml | 64 +++++++++++++------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/app/assets/javascripts/locales/fr.json b/app/assets/javascripts/locales/fr.json index 91ffaca222..687d6cd4f8 100644 --- a/app/assets/javascripts/locales/fr.json +++ b/app/assets/javascripts/locales/fr.json @@ -16,7 +16,7 @@ "range": "Veuillez saisir une valeur entre {0} et {1}.", "rangelength": "Veuillez saisir une valeur longue de {0} à {1} caractères.", "remote": "Veuillez corriger ce champ.", - "required": "Ce champ est obligatoire.", + "required": "Ce champ est obligatoire", "url": "Veuillez saisir une URL valide.", "address_validator": "L'adresse n'a pas été trouvée.", "money": "Vous devez insérer un montant correct.", diff --git a/config/locales/da-DK.yml b/config/locales/da-DK.yml index 72ad6077b2..008284205f 100644 --- a/config/locales/da-DK.yml +++ b/config/locales/da-DK.yml @@ -338,13 +338,13 @@ da-DK: free: ~ pending: ~ preauthorized: ~ - accepted: ~ - rejected: ~ - paid: ~ - confirmed: ~ - canceled: ~ - initiated: ~ - pending_ext: ~ + accepted: Accepteret + rejected: Afvist + paid: Betalt + confirmed: Bekræftet + canceled: Annulleret + initiated: "Afventer PayPal betaling" + pending_ext: "Afventer PayPal betaling" stripe: free: ~ pending: ~ @@ -570,7 +570,7 @@ da-DK: read_more_stripe: ~ you_can_use_paypal_only: ~ read_more_paypal: ~ - read_more_about_paypal_and_stripe: ~ + read_more_about_paypal_and_stripe: "Læs mere om online betalinger, Stripe og PayPal" general_settings_updated: ~ transaction_fee_settings_updated: ~ choose_popup_text: ~ @@ -579,7 +579,7 @@ da-DK: stripe_verified: ~ change_settings: ~ configure_stripe: ~ - configure_paypal: ~ + configure_paypal: "Konfigurér PayPal" transaction_fee_settings: ~ transaction_fee_save: ~ stripe_fee: ~ @@ -592,7 +592,7 @@ da-DK: disabled: ~ enable: ~ paypal_connected: - title: ~ + title: "PayPal tilknyttet" disable: ~ disabled: ~ enable: ~ @@ -686,7 +686,7 @@ da-DK: title: ~ title_paypal: ~ stripe: ~ - paypal: ~ + paypal: PayPal info: ~ paypal_fee_info: title: PayPal-gebyr @@ -696,7 +696,7 @@ da-DK: paypal_only_fee_info: title: ~ body_text: ~ - link_to_paypal_text: ~ + link_to_paypal_text: her stripe_fee_info: title: ~ body_text: ~ @@ -1510,7 +1510,7 @@ da-DK: notifications: Notifikationer profile: Profilinfo settings: Indstillinger - paypal_payments: ~ + paypal_payments: "PayPal betalinger" stripe_payments: ~ payments: Betalinger listings: @@ -1791,7 +1791,7 @@ da-DK: payment: ~ pay_with_card: ~ address: ~ - address_country: ~ + address_country: Land address_name: ~ address_city: ~ address_state: ~ @@ -1841,7 +1841,7 @@ da-DK: contact_admin_link_text: "kontakt markedspladsens administrator" you_are_ready_to_accept_payments: "Du er nu klar til at modtage betalinger!" commission: "%{commission}%" - not_now: ~ + not_now: "Jeg ønsker ikke at tilknytte min PayPal-konto nu" new: payout_info_you_need_to_connect: "For at acceptere betalinger skal du tilknytte din PayPal-konto til %{service_name}." payout_info_text: "Udfør disse to steps for at tilknytte din konto." @@ -1888,8 +1888,8 @@ da-DK: paypal_permission_granted_summary: "Tilladelse til transaktionsgebyrer bevilget" paypal: pay_with_paypal: "Fortsæt til betaling" - checkout_with: ~ - or_pay_with_paypal: ~ + checkout_with: "Check ud med" + or_pay_with_paypal: eller checkout_with_paypal: "Betal med PayPal" cancel_succesful: "Betaling annulleret." transaction: @@ -2085,7 +2085,7 @@ da-DK: first_name_with_initial: "(kun forbogstavet vil blive vist til andre brugere)" first_name_only: "(vises ikke til andre brugere)" display_name: "Vist navn" - display_name_description: ~ + display_name_description: "Hvis du repræsenterer en virksomhed eller organisation, kan du benytte dennes navn som brugernavn. Brugernavnet vises til andre brugere i stedet for dit for- og efternavn." location_description: "Angiv enten nøjagtig placering eller postnummer, eller vælg en placering på kortet." phone_number: Telefonnnummer profile_picture: Profilbillede @@ -2339,16 +2339,16 @@ da-DK: stripe_bank_connected: ~ stripe_can_accept: ~ stripe_credit_card: ~ - paypal: ~ - paypal_connected: ~ - paypal_can_accept: ~ + paypal: PayPal + paypal_connected: "PayPal-kontoen blev tilknyttet." + paypal_can_accept: "Du er nu klar til at modtage betaling på din PayPal konto" paypal_connected_give_permission: ~ form_new: need_info: ~ - select_country: ~ - legal_name: ~ + select_country: "Vælg land" + legal_name: "Kontohavers navn" country: ~ - birth_date: ~ + birth_date: Fødselsdato ssn_last_4: ~ personal_id_number: ~ address_country: ~ @@ -2396,14 +2396,14 @@ da-DK: messages: social_insurance_number: ~ payment_settings: - title: ~ - bank_account: ~ - paypal: ~ - bank_account_details: ~ - add_bank_details: ~ - can_accept_stripe_and_paypal: ~ - to_accept_paypal: ~ - connect_paypal: ~ + title: Betalingspræferencer + bank_account: Bankkonto + paypal: PayPal + bank_account_details: "For at kunne modtage betaling direkte til din bankkonto, skal du udfylde dine bankoplysninger. Dine kunder vil kunne betale med deres kreditkort." + add_bank_details: "Tilføj bankoplysninger" + can_accept_stripe_and_paypal: "Du kan modtage betaling til din bankkonto eller din PayPal-konto." + to_accept_paypal: "For at modtage betaling på din PayPal-konto, er det nødvendigt, at du tilknytter din PayPal-konto. Dine kunder vil kunne betale med Pay-Pal." + connect_paypal: "Tilknyt PayPal-konto" wrong_setup: ~ invalid_bank_account_number: ~ invalid_postal_code: ~ From 5523a74bbb4011b76cb688493c8c49ab6534801e Mon Sep 17 00:00:00 2001 From: Nikolai Date: Mon, 18 Sep 2017 12:50:45 +0300 Subject: [PATCH 019/131] added "View conversations" section in admin --- .../community_conversations_controller.rb | 82 +++++++++++++++++++ .../free_transactions_controller.rb | 1 + app/controllers/person_messages_controller.rb | 1 + app/controllers/transactions_controller.rb | 1 + app/helpers/application_helper.rb | 7 ++ app/models/conversation.rb | 11 ++- .../marketplace_service/conversation.rb | 34 ++++++++ .../marketplace_service/transaction.rb | 10 ++- .../transaction_service/store/transaction.rb | 5 +- .../admin/community_conversations/index.haml | 44 ++++++++++ .../admin/community_conversations/show.haml | 20 +++++ config/locales/en.yml | 16 +++- config/routes.rb | 1 + ...2027_add_starting_page_to_conversations.rb | 14 ++++ db/structure.sql | 27 +++++- .../admin_views_conversations.feature | 35 ++++++++ .../admin_views_transactions.feature | 4 +- .../admin_conversation_steps.rb | 26 ++++++ features/support/paths.rb | 2 + 19 files changed, 329 insertions(+), 12 deletions(-) create mode 100644 app/controllers/admin/community_conversations_controller.rb create mode 100644 app/views/admin/community_conversations/index.haml create mode 100644 app/views/admin/community_conversations/show.haml create mode 100644 db/migrate/20171129152027_add_starting_page_to_conversations.rb create mode 100644 features/admin/statistics_and_info/admin_views_conversations.feature create mode 100644 features/step_definitions/admin_conversation_steps.rb diff --git a/app/controllers/admin/community_conversations_controller.rb b/app/controllers/admin/community_conversations_controller.rb new file mode 100644 index 0000000000..c4bf0268ef --- /dev/null +++ b/app/controllers/admin/community_conversations_controller.rb @@ -0,0 +1,82 @@ +class Admin::CommunityConversationsController < Admin::AdminBaseController + ConversationQuery = MarketplaceService::Conversation::Query + + def index + @selected_left_navi_link = "conversations" + pagination_opts = PaginationViewUtils.parse_pagination_opts(params) + + conversations = ConversationQuery.conversations_for_community( + @current_community.id, + simple_sort_column(params[:sort]), + sort_direction, + pagination_opts[:limit], + pagination_opts[:offset] + ) + + count = ConversationQuery.count_for_community(@current_community.id) + + conversations = conversations.map do |conversation| + author = Maybe(conversation[:other_person]).or_else({is_deleted: true}) + starter = Maybe(conversation[:starter_person]).or_else({is_deleted: true}) + [author, starter].each { |p| + p[:url] = person_path(p[:username]) unless p[:username].nil? + p[:display_name] = PersonViewUtils.person_entity_display_name(p, "fullname") + } + conversation.merge({author: author, starter: starter}) + end + + conversations = WillPaginate::Collection.create(pagination_opts[:page], pagination_opts[:per_page], count) do |pager| + pager.replace(conversations) + end + + render "index", { locals: { community: @current_community, conversations: conversations } } + end + + def show + @selected_left_navi_link = "conversations" + conversation_id = params[:id] + conversation = Conversation.find(conversation_id) + + conversation = MarketplaceService::Conversation::Query.conversation_for_person( + conversation_id, + conversation.starter.id, + @current_community.id) + + transaction = Transaction.find_by_conversation_id(conversation[:id]) + + if transaction.present? + redirect_to person_transaction_url(@current_user, {:id => transaction.id}) and return + end + + author = Maybe(conversation[:other_person]).or_else({is_deleted: true}) + starter = Maybe(conversation[:starter_person]).or_else({is_deleted: true}) + [author, starter].each { |p| + p[:url] = person_path(p[:username]) unless p[:username].nil? + p[:display_name] = PersonViewUtils.person_entity_display_name(p, "fullname") + } + conversation = conversation.merge({author: author, starter: starter}) + + messages = TransactionViewUtils.conversation_messages(conversation[:messages], @current_community.name_display_type) + render locals: { + messages: messages.reverse, + conversation_data: conversation + } + end + + private + + def simple_sort_column(sort_column) + case sort_column + when "last_activity" + "last_message_at" + when "started" + "created_at" + else + "created_at" + end + end + + def sort_direction + params[:direction] || "desc" + end +end diff --git a/app/controllers/free_transactions_controller.rb b/app/controllers/free_transactions_controller.rb index 5987bd02de..9d53311261 100644 --- a/app/controllers/free_transactions_controller.rb +++ b/app/controllers/free_transactions_controller.rb @@ -42,6 +42,7 @@ def create_contact availability: :none, # Always none for free transactions and contacts listing_quantity: 1, content: contact_form.content, + starting_page: ::Conversation::LISTING, payment_gateway: :none, payment_process: :none} }) diff --git a/app/controllers/person_messages_controller.rb b/app/controllers/person_messages_controller.rb index 941e612e0b..f6a6a54829 100644 --- a/app/controllers/person_messages_controller.rb +++ b/app/controllers/person_messages_controller.rb @@ -50,6 +50,7 @@ def new_conversation(params) conversation_params = params.require(:conversation).permit( message_attributes: :content ) + conversation_params[:starting_page] = ::Conversation::PROFILE conversation_params[:message_attributes][:sender_id] = @current_user.id conversation = Conversation.new(conversation_params.merge(community: @current_community)) diff --git a/app/controllers/transactions_controller.rb b/app/controllers/transactions_controller.rb index 0c4ff44d4c..73309649b3 100644 --- a/app/controllers/transactions_controller.rb +++ b/app/controllers/transactions_controller.rb @@ -103,6 +103,7 @@ def create availability: listing_model.availability, listing_quantity: quantity, content: form[:message], + starting_page: ::Conversation::PAYMENT, booking_fields: booking_fields, payment_gateway: process[:process] == :none ? :none : gateway, # TODO This is a bit awkward payment_process: process[:process]} diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 4fdcf3e3e6..71744a72be 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -376,6 +376,13 @@ def admin_links_for(community) :path => admin_community_transactions_path(@current_community, sort: "last_activity", direction: "desc"), :name => "transactions" }, + { + :topic => :manage, + :text => t("admin.communities.conversations.conversations"), + :icon_class => icon_class("chat_bubble"), + :path => admin_community_conversations_path(@current_community, direction: "desc"), + :name => "conversations" + }, { :topic => :configure, :text => t("admin.communities.edit_details.community_details"), diff --git a/app/models/conversation.rb b/app/models/conversation.rb index 41827d9011..b495992c0a 100644 --- a/app/models/conversation.rb +++ b/app/models/conversation.rb @@ -9,24 +9,33 @@ # updated_at :datetime # last_message_at :datetime # community_id :integer +# starting_page :string(255) # # Indexes # # index_conversations_on_community_id (community_id) # index_conversations_on_last_message_at (last_message_at) # index_conversations_on_listing_id (listing_id) +# index_conversations_on_starting_page (starting_page) # class Conversation < ApplicationRecord + STARTING_PAGES = [ + PROFILE = 'profile', + LISTING = 'listing', + PAYMENT = 'payment' + ] has_many :messages, :dependent => :destroy has_many :participations has_many :participants, :through => :participations, :source => :person belongs_to :listing - has_one :tx, class_name: "Transaction", foreign_key: "transaction_id" + has_one :tx, class_name: "Transaction", foreign_key: "conversation_id" belongs_to :community + validates :starting_page, inclusion: { in: STARTING_PAGES }, allow_nil: true + scope :for_person, -> (person){ joins(:participations) .where( { participations: { person_id: person }} ) diff --git a/app/services/marketplace_service/conversation.rb b/app/services/marketplace_service/conversation.rb index 60d71754d9..60f56585a0 100644 --- a/app/services/marketplace_service/conversation.rb +++ b/app/services/marketplace_service/conversation.rb @@ -11,6 +11,7 @@ module Entity :messages, :transaction, :listing, + :created_at, :last_message_at, :starter_person, :other_person @@ -33,7 +34,9 @@ def conversation(conversation_model, community_id) Conversation[{ id: conversation_model.id, listing: conversation_model.listing, + transaction: conversation_model.tx, messages: messages(conversation_model.messages, community_id), + created_at: conversation_model.created_at, last_message_at: conversation_model.last_message_at, starter_person: PersonEntity.person(conversation_model.starter, community_id), other_person: PersonEntity.person(conversation_model.other_party(conversation_model.starter), community_id) @@ -132,6 +135,37 @@ def latest_messages_for_conversations(conversation_ids) SELECT id, conversation_id, content, created_at FROM messages WHERE conversation_id in (#{params[:conversation_ids].join(',')}) " } + + def conversations_for_community(community_id, sort_field, sort_direction, limit, offset) + query = <<-SQL + SELECT c.* FROM conversations c + WHERE c.community_id = #{community_id} + AND (c.starting_page IS NULL OR c.starting_page != '#{::Conversation::PAYMENT}') + AND c.id NOT IN (SELECT conversation_id FROM transactions + WHERE transactions.community_id = #{community_id} + AND transactions.current_state <> 'free') + ORDER BY #{sort_field} #{sort_direction} + LIMIT #{limit} OFFSET #{offset} + SQL + conversations = ConversationModel.find_by_sql(query) + conversations.map{|conversation| Entity.conversation(conversation, community_id) } + end + + def count_for_community(community_id) + query = <<-SQL + SELECT count(*) FROM conversations c + WHERE c.community_id = #{community_id} + AND (c.starting_page IS NULL OR c.starting_page != '#{::Conversation::PAYMENT}') + AND c.id NOT IN (SELECT conversation_id FROM transactions + WHERE transactions.community_id = #{community_id} + AND transactions.current_state <> 'free') + SQL + ActiveRecord::Base.connection.select_value(query) + end + + def base_community_conversations_query(community_id) + query + end end end end diff --git a/app/services/marketplace_service/transaction.rb b/app/services/marketplace_service/transaction.rb index 8742018a79..2528d7bff4 100644 --- a/app/services/marketplace_service/transaction.rb +++ b/app/services/marketplace_service/transaction.rb @@ -281,8 +281,11 @@ def transaction_with_conversation(transaction_id:, person_id: nil, community_id: end def transactions_for_community_sorted_by_column(community_id, sort_column, sort_direction, limit, offset) + sort_column = "transactions.#{sort_column}" if sort_column.index('.').nil? transactions = TransactionModel .where(community_id: community_id, deleted: false) + .joins('LEFT JOIN conversations c ON transactions.conversation_id = c.id') + .where('c.starting_page = ? OR c.starting_page IS NULL', ::Conversation::PAYMENT) .includes(:listing) .limit(limit) .offset(offset) @@ -303,7 +306,11 @@ def transactions_for_community_sorted_by_activity(community_id, sort_direction, end def transactions_count_for_community(community_id) - TransactionModel.where(community_id: community_id, deleted: false).count + TransactionModel + .where(community_id: community_id, deleted: false) + .joins('LEFT JOIN conversations c ON transactions.conversation_id = c.id') + .where('c.starting_page = ? OR c.starting_page IS NULL', ::Conversation::PAYMENT) + .count end def can_transition_to?(transaction_id, new_status) @@ -323,6 +330,7 @@ def sql_for_transactions_for_community_sorted_by_activity(community_id, sort_dir # (this is done by joining the transitions table to itself where created_at < created_at OR sort_key < sort_key, if created_at equals) LEFT JOIN conversations ON transactions.conversation_id = conversations.id WHERE transactions.community_id = #{community_id} AND transactions.deleted = 0 + AND conversations.starting_page = '#{::Conversation::PAYMENT}' OR conversations.starting_page IS NULL ORDER BY GREATEST(COALESCE(transactions.last_transition_at, 0), COALESCE(conversations.last_message_at, 0)) #{sort_direction} diff --git a/app/services/transaction_service/store/transaction.rb b/app/services/transaction_service/store/transaction.rb index caf3830e55..eabd995fd5 100644 --- a/app/services/transaction_service/store/transaction.rb +++ b/app/services/transaction_service/store/transaction.rb @@ -27,6 +27,7 @@ module TransactionService::Store::Transaction [:automatic_confirmation_after_days, :fixnum, :mandatory], [:minimum_commission, :money, :mandatory], [:content, :string], + [:starting_page, :string], [:booking_uuid, :string, transform_with: UUIDUtils::RAW], # :string type for raw bytes [:booking_fields, :hash]) @@ -87,7 +88,7 @@ module TransactionService::Store::Transaction def create(opts) tx_data = HashUtils.compact(NewTransaction.call(opts)) - tx_model = TransactionModel.new(tx_data.except(:content, :booking_fields)) + tx_model = TransactionModel.new(tx_data.except(:content, :starting_page, :booking_fields)) build_conversation(tx_model, tx_data) build_booking(tx_model, tx_data) @@ -204,7 +205,7 @@ def addr_fields(addr) def build_conversation(tx_model, tx_data) conversation = tx_model.build_conversation( - tx_data.slice(:community_id, :listing_id)) + tx_data.slice(:community_id, :listing_id, :starting_page)) conversation.participations.build( person_id: tx_data[:listing_author_id], diff --git a/app/views/admin/community_conversations/index.haml b/app/views/admin/community_conversations/index.haml new file mode 100644 index 0000000000..c0d9a91567 --- /dev/null +++ b/app/views/admin/community_conversations/index.haml @@ -0,0 +1,44 @@ +- content_for :title_header do + %h1 + = t("layouts.admin.admin") + = "-" + = t("admin.communities.conversations.conversations") + += render :partial => "admin/left_hand_navigation", :locals => { :links => admin_links_for(@current_community) } + +.left-navi-section + %h2= t("admin.communities.conversations.conversations", community_name: community.name(I18n.locale)) + + %span#admin_transactions_count= page_entries_info(conversations, :model => "Conversation") + + %table#admin_transactions + %thead + %tr + %th=t("admin.communities.conversations.headers.started_from") + %th=t("admin.communities.conversations.headers.status") + %th=render partial: "layouts/sort_link", locals: { column: "started", direction: sort_link_direction("started"), title: t("admin.communities.conversations.headers.started") } + %th=render partial: "layouts/sort_link", locals: { column: "last_activity", direction: sort_link_direction("last_activity"), title: t("admin.communities.conversations.headers.last_activity") } + %th=t("admin.communities.conversations.headers.initiated_by") + %th=t("admin.communities.conversations.headers.other_party") + + %tbody + - conversations.each do |conversation| + %tr + - listing = conversation[:listing] + - if listing + - listing_title = listing.title || t("admin.communities.conversations.not_available") + %td=link_to_unless listing.deleted, listing_title, listing_path(listing.id) + - else + %td=Maybe(conversation[:author]).map { |p| link_to_unless(p[:is_deleted], t("admin.communities.conversations.profile", author: p[:display_name]), p[:url]) }.or_else("") + %td + - if conversation[:transaction] && conversation[:transaction][:payment_process] == 'none' + =link_to t("admin.communities.transactions.status.conversation"), admin_community_conversation_path(@current_community.id, conversation[:id]) + - else + =link_to t("admin.communities.transactions.status.conversation"), admin_community_conversation_path(@current_community.id, conversation[:id]) + %td=l(conversation[:created_at], format: :short_date) + %td=l(conversation[:last_message_at], format: :short_date) + %td=Maybe(conversation[:starter]).map { |p| link_to_unless(p[:is_deleted], p[:display_name], p[:url]) }.or_else("") + %td=Maybe(conversation[:author]).map { |p| link_to_unless(p[:is_deleted], p[:display_name], p[:url]) }.or_else("") + .row + .col-12 + = will_paginate conversations diff --git a/app/views/admin/community_conversations/show.haml b/app/views/admin/community_conversations/show.haml new file mode 100644 index 0000000000..c2dcce3cfa --- /dev/null +++ b/app/views/admin/community_conversations/show.haml @@ -0,0 +1,20 @@ +- content_for :title_header do + %h1 + = t("layouts.admin.admin") + = "-" + = t("admin.communities.conversations.conversations") + += render :partial => "admin/left_hand_navigation", :locals => { :links => admin_links_for(@current_community) } + +.left-navi-section + %h2 + - starter = link_to_unless(conversation_data[:starter][:is_deleted], conversation_data[:starter][:display_name], conversation_data[:starter][:url]).html_safe + - author = link_to_unless(conversation_data[:author][:is_deleted], conversation_data[:author][:display_name], conversation_data[:author][:url]).html_safe + = t("admin.communities.conversations.participants", starter: starter, author: author).html_safe + - listing = conversation_data[:listing] + - if listing + - listing_title = listing.title || t("admin.communities.conversations.not_available") + %h2=link_to_unless listing.deleted, listing_title, listing_path(listing.id) + #messages + = render :partial => "conversations/message", :collection => messages, as: :message_or_action + diff --git a/config/locales/en.yml b/config/locales/en.yml index d17f6d5128..f66acd9612 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -322,7 +322,8 @@ en: initiated_by: Starter other_party: "Other party" status: - free: Conversation + conversation: Conversation + free: Free transaction pending: Pending preauthorized: Preauthorized accepted: Accepted @@ -333,7 +334,7 @@ en: initiated: "Waiting PayPal payment" pending_ext: "Waiting PayPal payment" none: - free: Conversation + free: Free transaction paypal: free: Conversation pending: Pending @@ -357,6 +358,17 @@ en: initiated: "Waiting Stripe payment" pending_ext: "Waiting Stripe payment" not_available: "Not available" + conversations: + conversations: "View conversations" + headers: + started_from: Started from + status: Status + started: Started + last_activity: Latest Activity + initiated_by: Starter + other_party: Other party + participants: "Conversation: %{starter} with %{author}" + profile: "%{author}'s Profile" custom_fields: edit: edit_listing_field: "Edit listing field '%{field_name}'" diff --git a/config/routes.rb b/config/routes.rb index 437a14f1ac..cccadc6f8c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -262,6 +262,7 @@ end resources :transactions, controller: :community_transactions, only: :index + resources :conversations, controller: :community_conversations, only: [:index, :show] resources :emails resources :community_memberships do member do diff --git a/db/migrate/20171129152027_add_starting_page_to_conversations.rb b/db/migrate/20171129152027_add_starting_page_to_conversations.rb new file mode 100644 index 0000000000..99622dc2c9 --- /dev/null +++ b/db/migrate/20171129152027_add_starting_page_to_conversations.rb @@ -0,0 +1,14 @@ +class AddStartingPageToConversations < ActiveRecord::Migration[5.1] + def up + add_column :conversations, :starting_page, :string + add_index :conversations, :starting_page + ActiveRecord::Base.connection.execute("UPDATE conversations c LEFT JOIN transactions t ON c.id = t.conversation_id SET c.starting_page = 'profile' WHERE t.id IS NULL") + ActiveRecord::Base.connection.execute("UPDATE conversations c LEFT JOIN transactions t ON c.id = t.conversation_id SET c.starting_page = 'listing' WHERE t.payment_gateway = 'none' AND t.current_state = 'free'") + ActiveRecord::Base.connection.execute("UPDATE conversations c LEFT JOIN transactions t ON c.id = t.conversation_id SET c.starting_page = 'payment' WHERE t.payment_gateway != 'none' OR t.current_state != 'free'") + end + + def down + remove_index :conversations, :starting_page + remove_column :conversations, :starting_page + end +end diff --git a/db/structure.sql b/db/structure.sql index e7e2e62ea5..5b95a1aa07 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -354,10 +354,12 @@ CREATE TABLE `conversations` ( `updated_at` datetime DEFAULT NULL, `last_message_at` datetime DEFAULT NULL, `community_id` int(11) DEFAULT NULL, + `starting_page` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), KEY `index_conversations_on_community_id` (`community_id`) USING BTREE, KEY `index_conversations_on_last_message_at` (`last_message_at`) USING BTREE, - KEY `index_conversations_on_listing_id` (`listing_id`) USING BTREE + KEY `index_conversations_on_listing_id` (`listing_id`) USING BTREE, + KEY `index_conversations_on_starting_page` (`starting_page`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `custom_field_names`; @@ -553,13 +555,13 @@ DROP TABLE IF EXISTS `invitation_unsubscribes`; CREATE TABLE `invitation_unsubscribes` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `community_id` int(11) DEFAULT NULL, - `email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `email` varchar(255) DEFAULT NULL, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, PRIMARY KEY (`id`), KEY `index_invitation_unsubscribes_on_community_id` (`community_id`), KEY `index_invitation_unsubscribes_on_email` (`email`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `invitations`; /*!40101 SET @saved_cs_client = @@character_set_client */; @@ -682,6 +684,21 @@ CREATE TABLE `listing_units` ( KEY `index_listing_units_on_listing_shape_id` (`listing_shape_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `listing_working_time_slots`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `listing_working_time_slots` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `listing_id` int(11) DEFAULT NULL, + `week_day` int(11) DEFAULT NULL, + `from` varchar(255) DEFAULT NULL, + `till` varchar(255) DEFAULT NULL, + `created_at` datetime NOT NULL, + `updated_at` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `index_listing_working_time_slots_on_listing_id` (`listing_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `listings`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; @@ -2211,6 +2228,8 @@ INSERT INTO `schema_migrations` (version) VALUES ('20170814125622'), ('20170817035830'), ('20171107063241'), -('20171128122539'); +('20171128122539'), +('20171023070523'), +('20171129152027'); diff --git a/features/admin/statistics_and_info/admin_views_conversations.feature b/features/admin/statistics_and_info/admin_views_conversations.feature new file mode 100644 index 0000000000..e732be90fd --- /dev/null +++ b/features/admin/statistics_and_info/admin_views_conversations.feature @@ -0,0 +1,35 @@ +@javascript +Feature: Admin views conversations +In order to analyze and improve my community +As an admin +I want to see see all the conversations happening in my community + + Background: + Given there are following users: + | person | given_name | family_name | email | membership_created_at | + | manager | matti | manager | manager@example.com | 2014-03-01 00:12:35 +0200 | + | kassi_testperson1 | john | doe | test2@example.com | 2013-03-01 00:12:35 +0200 | + | kassi_testperson2 | jane | doe | test1@example.com | 2012-03-01 00:00:00 +0200 | + And there is a listing with title "listing1" from "kassi_testperson1" + + Scenario: Admin views conversations started from user's profile + When I am logged in as "kassi_testperson2" + And I go to the profile page of "kassi_testperson1" + And I follow "Contact" + And I fill in "conversation[message_attributes][content]" with "contacted from listing" + And I press submit + When I am logged in as "manager" + And "manager" has admin rights in community "test" + And I am on the conversations admin page + Then I should see a conversation started from "john d's Profile" with status "Conversation" + + Scenario: Admin views conversations started from a listing + When I am logged in as "kassi_testperson2" + And I go to the listing page + And I follow "Contact" + And I fill in "listing_conversation[content]" with "contacted from listing" + And I press submit + When I am logged in as "manager" + And "manager" has admin rights in community "test" + And I am on the conversations admin page + Then I should see a conversation started from "listing1" with status "Conversation" diff --git a/features/admin/statistics_and_info/admin_views_transactions.feature b/features/admin/statistics_and_info/admin_views_transactions.feature index 097d000851..1ac6d8f036 100644 --- a/features/admin/statistics_and_info/admin_views_transactions.feature +++ b/features/admin/statistics_and_info/admin_views_transactions.feature @@ -20,7 +20,7 @@ I want to see see all the transactions happening in my community And I am on the transactions admin page Scenario: Admin views all transactions - Then I should see 3 transaction with status "Conversation" + Then I should see 3 transaction with status "Free transaction" Scenario: Admin sorts transactions by listing When I sort by "listing" @@ -38,4 +38,4 @@ I want to see see all the transactions happening in my community When I sort by "latest activity" Then I should see the transactions in ascending time order by "latest activity" When I sort by "latest activity" - Then I should see the transactions in descending time order by "latest activity" \ No newline at end of file + Then I should see the transactions in descending time order by "latest activity" diff --git a/features/step_definitions/admin_conversation_steps.rb b/features/step_definitions/admin_conversation_steps.rb new file mode 100644 index 0000000000..7f62f02f7c --- /dev/null +++ b/features/step_definitions/admin_conversation_steps.rb @@ -0,0 +1,26 @@ +module AdminConversationSteps + + def to_title(name) + name.tr("_", " ").capitalize + end + + def find_column(column) + page.all("thead > tr > th").find { |elem| elem.text.starts_with?(to_title(column)) } + end + + def find_column_index(column) + page.all("thead > tr > th").find_index { |elem| elem.text.starts_with?(to_title(column)) } + end + + def column_values(column_index) + page.all("tbody > tr").map { |row| row.all("td")[column_index].text } + end + +end + +World AdminConversationSteps + +Then(/^I should see a conversation started from "(.*?)" with status "(.*?)"$/) do |starting_page, status_text| + expect(page.all("td", :text => status_text).length).to eq 1 + expect(page.all("td", :text => starting_page).length).to eq 1 +end diff --git a/features/support/paths.rb b/features/support/paths.rb index a40b871c6b..ca8536de1a 100644 --- a/features/support/paths.rb +++ b/features/support/paths.rb @@ -86,6 +86,8 @@ def path_to(page_name) admin_topbar_edit_path when /the transactions admin page/ admin_community_transactions_path(:community_id => @current_community.id) + when /the conversations admin page/ + admin_community_conversations_path(:community_id => @current_community.id) when /the getting started guide for admins/ admin_getting_started_guide_path when /^the admin view of payment preferences of community "(.*)"$/i From 01e5de6a288ba374c14331cac987147bcce24695 Mon Sep 17 00:00:00 2001 From: Nikolai Date: Mon, 18 Sep 2017 12:50:45 +0300 Subject: [PATCH 020/131] added "View conversations" section in admin --- app/services/marketplace_service/transaction.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/marketplace_service/transaction.rb b/app/services/marketplace_service/transaction.rb index 2528d7bff4..f8cad857bf 100644 --- a/app/services/marketplace_service/transaction.rb +++ b/app/services/marketplace_service/transaction.rb @@ -330,7 +330,7 @@ def sql_for_transactions_for_community_sorted_by_activity(community_id, sort_dir # (this is done by joining the transitions table to itself where created_at < created_at OR sort_key < sort_key, if created_at equals) LEFT JOIN conversations ON transactions.conversation_id = conversations.id WHERE transactions.community_id = #{community_id} AND transactions.deleted = 0 - AND conversations.starting_page = '#{::Conversation::PAYMENT}' OR conversations.starting_page IS NULL + AND (conversations.starting_page = '#{::Conversation::PAYMENT}' OR conversations.starting_page IS NULL) ORDER BY GREATEST(COALESCE(transactions.last_transition_at, 0), COALESCE(conversations.last_message_at, 0)) #{sort_direction} From a34783548cdf76ef722091a21550a0edef040c68 Mon Sep 17 00:00:00 2001 From: Thomas Malbaux Date: Tue, 12 Dec 2017 12:59:30 +0200 Subject: [PATCH 021/131] wti pull --- app/assets/javascripts/locales/ca.json | 30 +- .../people/help_texts/_help_captcha.ca.haml | 5 + .../help_texts/_help_invitation_code.ca.haml | 8 + config/locales/ab.yml | 12 + config/locales/ar.yml | 12 + config/locales/bg.yml | 12 + config/locales/bn-BD.yml | 12 + config/locales/ca.yml | 514 +++++++++--------- config/locales/cs.yml | 12 + config/locales/da-DK.yml | 12 + config/locales/de.yml | 12 + config/locales/devise.ca.yml | 48 +- config/locales/el.yml | 12 + config/locales/en-AU.yml | 12 + config/locales/en-GB.yml | 12 + config/locales/en-NZ.yml | 12 + config/locales/es-ES.yml | 14 +- config/locales/es.yml | 12 + config/locales/et.yml | 12 + config/locales/eu-ES.yml | 12 + config/locales/fi.yml | 12 + config/locales/fr-CA.yml | 12 + config/locales/fr.yml | 16 +- config/locales/he-IL.yml | 12 + config/locales/hi-IN.yml | 12 + config/locales/hr.yml | 12 + config/locales/hu.yml | 12 + config/locales/hy-AM.yml | 12 + config/locales/id.yml | 12 + config/locales/is.yml | 12 + config/locales/it.yml | 12 + config/locales/ja.yml | 12 + config/locales/ka.yml | 12 + config/locales/km-KH.yml | 12 + config/locales/ko.yml | 138 +++-- config/locales/lv.yml | 12 + config/locales/mn.yml | 12 + config/locales/ms-MY.yml | 12 + config/locales/nb.yml | 12 + config/locales/nl.yml | 12 + config/locales/pl.yml | 12 + config/locales/pt-BR.yml | 12 + config/locales/pt-PT.yml | 12 + config/locales/ro.yml | 12 + config/locales/ru.yml | 12 + config/locales/sk-SK.yml | 12 + config/locales/sl.yml | 12 + config/locales/sq-AL.yml | 12 + config/locales/sr.yml | 12 + config/locales/sv.yml | 82 +-- config/locales/sw.yml | 12 + config/locales/ta-IN.yml | 12 + config/locales/th-TH.yml | 12 + config/locales/ti.yml | 12 + config/locales/tr-TR.yml | 12 + config/locales/uk.yml | 12 + config/locales/vi.yml | 12 + config/locales/zh-HK.yml | 12 + config/locales/zh-TW.yml | 12 + config/locales/zh.yml | 12 + 60 files changed, 1080 insertions(+), 387 deletions(-) create mode 100644 app/views/people/help_texts/_help_captcha.ca.haml create mode 100644 app/views/people/help_texts/_help_invitation_code.ca.haml diff --git a/app/assets/javascripts/locales/ca.json b/app/assets/javascripts/locales/ca.json index e4476f606b..7f1205be91 100644 --- a/app/assets/javascripts/locales/ca.json +++ b/app/assets/javascripts/locales/ca.json @@ -1,30 +1,30 @@ { "please_wait": "Si us plau espereu...", "validation_messages": { - "accept": "L'arxiu d'imatge ha d'estar en format GIF, JPG o PNG.", - "creditcard": "Si us plau, introdueix un número de targeta de crèdit vàlida.", + "accept": "L'arxiu d'imatge ha de ser en format GIF, JPG o PNG.", + "creditcard": "Si us plau, introdueix un número de targeta de crèdit vàlid.", "date": "Si us plau, introdueix una data vàlida.", "dateISO": "Si us plau, introdueix una data vàlida (en format ISO)", "digits": "Si us plau, introdueix només dígits.", "email": "Si us plau, introdueix una adreça electrònica vàlida.", "equalTo": "Si us plau, introdueix una altra vegada el mateix valor.", - "max": "Si us plau, introdueix un valor inferior o igual a {0}.", - "maxlength": "Si us plau, introdueix menys de {0} caràcters.", - "min": "Si us plau, introdueix un valor major o igual a {0} .", - "minlength": "Si us plau, introdueix com a mínim {0} caràcters.", + "max": "Si us plau, introdueix un valor inferior o igual a {0}.", + "maxlength": "Si us plau, no introdueixis més de {0} caràcters.", + "min": "Si us plau, introdueix un valor major o igual a {0} .", + "minlength": "Si us plau, introdueix com a mínim {0} caràcters.", "number": "Si us plau, introdueix un número vàlid.", - "range": "Si us plau, introdueix un valor entre {0} i {1} .", - "rangelength": "Si us plau, introdueix un valor entre {0} i {1} caràcters de llargària.", + "range": "Si us plau, introdueix un valor entre {0} i {1}.", + "rangelength": "Si us plau, introdueix un valor entre {0} i {1} caràcters de longitud.", "remote": "Si us plau arregla aquest camp.", "required": "Aquest camp és obligatori.", "url": "Si us plau, introdueix una adreça URL vàlida.", "address_validator": "No s'ha trobat la ubicació.", - "money": "You need to insert a valid monetary value.", - "night_selected": null, - "availability_range": null, - "min_bound": "Please enter a value less than max value ({0})", - "max_bound": "Please enter a value more than min value ({0})", - "number_no_decimals": "Please enter a whole number", - "number_decimals": "Please enter a valid number with either dot (.) or comma (,) as a decimal separator" + "money": "S'ha d'introduïr una quantitat vàlida.", + "night_selected": "Has de seleccionar almenys una nit", + "availability_range": "L'interval seleccionat inclou dates que no estan disponibles", + "min_bound": "Si us plau, introduiex un valor inferior al valor màxim ({0})", + "max_bound": "Si us plau, introdueix un valor superior al valor mínim ({0})", + "number_no_decimals": "Si us plau, introdueix un nombre sencer", + "number_decimals": "Si us plau, introdueix un nombre vàlid amb punt (.) o coma (,) com a separador decimal." } } \ No newline at end of file diff --git a/app/views/people/help_texts/_help_captcha.ca.haml b/app/views/people/help_texts/_help_captcha.ca.haml new file mode 100644 index 0000000000..7a5b524584 --- /dev/null +++ b/app/views/people/help_texts/_help_captcha.ca.haml @@ -0,0 +1,5 @@ +%p + Aquesta confirmació assegura que només les persones poden crear comptes nous en #{service_name}. La confirmació impideix que tot tipus de robots malintencionats creïn comptes en #{service_name} i envïin correu spam als usuaris. + +%p + La confirmació és molt senzilla: heu d'omplir les dues paraules escrites amb escriptura manuscrita una mica ambigua. Si no les esriviu correctament, no passa res : podeu tornar a fer-ho tantes vegades com vulgueu, i no perdreu cap de la informació que heu omplert en els altres camps en el procés. \ No newline at end of file diff --git a/app/views/people/help_texts/_help_invitation_code.ca.haml b/app/views/people/help_texts/_help_invitation_code.ca.haml new file mode 100644 index 0000000000..4a84bd6fd1 --- /dev/null +++ b/app/views/people/help_texts/_help_invitation_code.ca.haml @@ -0,0 +1,8 @@ +%p + Per unir-te a + %strong + = @current_community.full_name(I18n.locale) + necessites una invitació. Si tens una invitació, si us plau introdueix el codi en el quadre següent. + +%p + Utilitzant codis d'invitació, intentem assegurar-nos que tots els usuaris de #{service_name} siguin fiables. \ No newline at end of file diff --git a/config/locales/ab.yml b/config/locales/ab.yml index be07b02f97..503472f3fd 100644 --- a/config/locales/ab.yml +++ b/config/locales/ab.yml @@ -307,6 +307,7 @@ ab: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ ab: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 786ff5aff3..887ac5e7ed 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -307,6 +307,7 @@ ar: initiated_by: البداية other_party: "جهة أخرى" status: + conversation: محادثه free: محادثة pending: "قيد الإنتظار" preauthorized: مخول @@ -342,6 +343,17 @@ ar: initiated: "انتظار دفع سترب" pending_ext: "انتظار دفع سترب" not_available: "غير متوفر" + conversations: + conversations: "أظهر المحادثات" + headers: + started_from: "بدأت من" + status: الحاله + started: بدأت + last_activity: "آخر نشاط" + initiated_by: البداية + other_party: "الجهة الأخرى" + participants: "‎%{author}‎ مع ‎%{starter}‎ :المحادثه" + profile: "الشخصي ‎%{author}‎‎ ملف" custom_fields: edit: edit_listing_field: "‎%{field_name}‎ تعديل حقل الإعلان" diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 4404652472..ebf8551f3c 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -307,6 +307,7 @@ bg: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ bg: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/bn-BD.yml b/config/locales/bn-BD.yml index dfbd87f6e5..e9cfd24fd0 100644 --- a/config/locales/bn-BD.yml +++ b/config/locales/bn-BD.yml @@ -307,6 +307,7 @@ bn-BD: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ bn-BD: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 979ef7bad0..53fe0c7f40 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -4,7 +4,7 @@ ca: format: separator: ~ delimiter: ~ - format: ~ + format: "%u%n" admin: categories: edit: @@ -39,7 +39,7 @@ ca: select_new_category: ~ buttons: remove: ~ - cancel: ~ + cancel: Canceŀla communities: edit_details: community_details: ~ @@ -79,10 +79,10 @@ ca: edit_look_and_feel: edit_community_look_and_feel: ~ community_logo: ~ - community_logo_icon: ~ + community_logo_icon: "Logo per a xarxes socials i dispositius mòbils" community_cover_photo: ~ small_community_cover_photo: ~ - favicon: ~ + favicon: Favicon favicon_info_text: ~ community_custom_color1: ~ community_slogan_color: ~ @@ -103,9 +103,9 @@ ca: new_listing_button_instructions_text: ~ default_browse_view: ~ default_browse_view_instructions_text: ~ - grid: ~ - list: ~ - map: ~ + grid: Graella + list: Llista + map: Mapa name_display_type: ~ name_display_type_instructions_text: ~ full_name: ~ @@ -132,7 +132,7 @@ ca: set_sender_address: ~ sender_name_label: ~ sender_name_placeholder: ~ - sender_email_label: ~ + sender_email_label: "Correu electrònic" sender_email_placeholder: ~ amazon_ses_notification: ~ this_is_how_it_will_look: ~ @@ -164,24 +164,24 @@ ca: en: ~ en-AU: ~ en-GB: ~ - fr: ~ + fr: Francès fr-CA: ~ es: ~ - es-ES: ~ + es-ES: Castellà pt-PT: ~ pt-BR: ~ nb: ~ - sv: ~ - da-DK: ~ - fi: ~ - ru: ~ - de: ~ - el: ~ - nl: ~ - tr-TR: ~ - zh: ~ - ja: ~ - it: ~ + sv: Suec + da-DK: Danès + fi: Finlandès + ru: Rus + de: Alemany + el: Grec + nl: Holandès + tr-TR: Turc + zh: Xinès + ja: Japonès + it: Italià settings: settings: ~ general: ~ @@ -196,8 +196,8 @@ ca: keyword_and_location_search: ~ location_search: ~ select_distance_unit: ~ - km: ~ - miles: ~ + km: km + miles: milles show_only_nearby: ~ listing_preferences: ~ transaction_preferences: ~ @@ -231,12 +231,12 @@ ca: name: ~ display_name: ~ join_date: ~ - admin: ~ + admin: Admin posting_allowed: ~ ban_user: ~ - saving_user_status: ~ + saving_user_status: Desant... save_user_status_successful: ~ - export_all_as_csv: ~ + export_all_as_csv: "Exportar-ho tot com CSV" save_user_status_error: ~ ban_user_confirmation: ~ unban_user_confirmation: ~ @@ -260,7 +260,7 @@ ca: twitter_instructions_link_text: ~ twitter_handle_placeholder: ~ invalid_twitter_handle: ~ - facebook_connect: ~ + facebook_connect: Facebook facebook_connect_info_text: ~ facebook_connect_info_text_with_instructions: ~ facebook_instructions_link_text: ~ @@ -289,13 +289,13 @@ ca: max_number_of_links: ~ all: ~ max_number_of_links_info: ~ - about_page: ~ + about_page: "sobre la pàgina" topbar: topbar: ~ new_listing_button_label: ~ invalid_post_listing_button_label: ~ transactions: - export_all_as_csv: ~ + export_all_as_csv: "Exportar-ho tot com CSV" transactions: ~ headers: conversation: ~ @@ -307,12 +307,13 @@ ca: initiated_by: ~ other_party: ~ status: + conversation: Conversa free: ~ pending: ~ preauthorized: ~ accepted: ~ rejected: ~ - paid: ~ + paid: Pagat confirmed: ~ canceled: ~ initiated: ~ @@ -325,8 +326,8 @@ ca: preauthorized: ~ accepted: ~ rejected: ~ - paid: ~ - confirmed: ~ + paid: Pagat + confirmed: Confirmat canceled: ~ initiated: ~ pending_ext: ~ @@ -341,7 +342,18 @@ ca: canceled: ~ initiated: ~ pending_ext: ~ - not_available: ~ + not_available: "No disponible" + conversations: + conversations: "Visualitzar converses" + headers: + started_from: "Iniciat des de" + status: Estat + started: Iniciat + last_activity: "Última activitat" + initiated_by: "Iniciat per" + other_party: "Altre participant" + participants: "Conversa: %{starter} amb %{author}" + profile: "Perfil del %{author}" custom_fields: edit: edit_listing_field: ~ @@ -377,30 +389,30 @@ ca: categories: ~ select_all: ~ clear_all: ~ - options: ~ + options: Opcions add_option: ~ saving_order: ~ save_order_successful: ~ save_order_error: ~ select_one: ~ - continue: ~ + continue: Continuar minimum_value: ~ maximum_value: ~ allow_decimals: ~ new: new_listing_field: ~ field_types: - text: ~ + text: Text number: ~ dropdown: ~ checkbox_group: ~ - date: ~ + date: Data emails: new: send_email_to_members: ~ send_email_to_members_title: ~ send_email: ~ - send_email_or: ~ + send_email_or: o send_test_email: ~ test_sent: ~ send_email_article_title: ~ @@ -415,25 +427,25 @@ ca: no_listing_no_payment: ~ email_subject: ~ email_content: ~ - email_content_placeholder: ~ + email_content_placeholder: "Què vols dir als teus usuaris?" email_language: ~ - any_language: ~ + any_language: "Qualsevol idioma" message_will_be_sent_only_to_people_with_this_language: ~ email_sent: ~ left_hand_navigation: - general: ~ + general: General users_and_transactions: ~ configure: ~ emails_title: ~ subscription: ~ preview: ~ listing_shapes: - availability_title: ~ + availability_title: Disponibilitat read_more: ~ read_more_availability_management: ~ allow_providers_to_manage_availability: ~ - per_day_availability: ~ - per_night_availability: ~ + per_day_availability: "Disponibilitat \"per dia\"" + per_night_availability: "Disponibilitat \"per nit\"" pricing_units_disabled_info: ~ can_not_find_name: ~ index: @@ -468,14 +480,14 @@ ca: create_failure: ~ edit: edit_listing_shape: ~ - update: ~ - cancel: ~ + update: Desar + cancel: Cancel·lar update_success: ~ update_failure: ~ delete: ~ can_not_delete_last: ~ can_not_delete_only_one_in_categories: ~ - listing_shape_name: ~ + listing_shape_name: Nom listing_shape_name_placeholder: ~ action_button_label: ~ action_button_placeholder: ~ @@ -483,16 +495,16 @@ ca: successfully_deleted: ~ pricing_and_checkout_title: ~ online_payments_label: ~ - shipping_label: ~ + shipping_label: "Permetre als venedors definir una tarifa d'enviament" price_label: ~ units_title: ~ units_desc: ~ units: - piece: ~ - hour: ~ - day: ~ - night: ~ - week: ~ + piece: "Per peça" + hour: "Per hora" + day: "Per dia" + night: "Per nit" + week: "Per setmana" month: ~ can_not_find: ~ add_custom_unit: ~ @@ -503,15 +515,15 @@ ca: selector_label_heading: ~ label_placeholder: ~ selector_placeholder: ~ - per: ~ + per: Per unit_type: - heading: ~ + heading: "Tipus d'unitat" quantity_label: ~ time_label: ~ paypal_accounts: marketplace_paypal_integration: ~ preferences_updated: ~ - contact_support_link_text: ~ + contact_support_link_text: "Contactar amb suport" integration_info_text: ~ link_paypal_personal_account_label: ~ link_paypal_personal_account: ~ @@ -554,7 +566,7 @@ ca: configure_stripe: ~ configure_paypal: ~ transaction_fee_settings: ~ - transaction_fee_save: ~ + transaction_fee_save: Desa stripe_fee: ~ stripe_fee_notice: ~ fee_should_be_less_than_minimum_price: ~ @@ -589,7 +601,7 @@ ca: minimum_price: ~ minimum_fee: ~ api_verified: ~ - actions: ~ + actions: Accions payments_not_enabled: ~ transaction_types: sell: ~ @@ -615,7 +627,7 @@ ca: fields_that_are_mandatory: "Els camps marcats amb (*) són obligatoris" or: o password: Contrasenya - service_name: ~ + service_name: "%{service_name}" share_types: request: ~ offer: ~ @@ -637,20 +649,20 @@ ca: rideshare: ~ housing: ~ tools: ~ - sports: ~ + sports: Esports music: ~ - books: ~ - games: ~ - furniture: ~ + books: "Llibres i revistes" + games: "Jocs i joguines" + furniture: Mobles outdoors: ~ food: ~ electronics: ~ pets: ~ film: ~ clothes: ~ - garden: ~ - travel: ~ - other: ~ + garden: Jardí + travel: Viatge + other: Altre username: Usuari username_or_email: ~ what_is_this: "Què és això?" @@ -669,25 +681,25 @@ ca: paypal_only_fee_info: title: ~ body_text: ~ - link_to_paypal_text: ~ + link_to_paypal_text: aquí stripe_fee_info: title: ~ body_text: ~ - link_to_stripe_text: ~ + link_to_stripe_text: aquí conversations: accept: details: ~ order_by: ~ - accept_offer: ~ + accept_offer: "Acceptar l'oferta" accept_request: ~ - reject_offer: ~ - reject_request: ~ - close_listing: ~ - update_later: ~ - optional_message: ~ - price_to_pay: ~ - accept: ~ - decline: ~ + reject_offer: "Aquesta vegada no" + reject_request: "Aquesta vegada no" + close_listing: "Tancar la llista %{listing_title_link}" + update_later: "Deixar la llista oberta" + optional_message: "Missatge opcional" + price_to_pay: "Preu total a pagar" + accept: Acceptar + decline: Declinar quantity_label: ~ sum_label: ~ service_fee_label: ~ @@ -695,7 +707,7 @@ ca: total_label: ~ total_value: ~ total_value_paypal: ~ - total_value_stripe: ~ + total_value_stripe: "%{seller_gets}" paypal_fee_info: ~ payment_fee_info: ~ shipping_price_label: ~ @@ -712,23 +724,23 @@ ca: do_not_give_feedback: ~ details: day: ~ - days: ~ + days: dies price_per_day: ~ index: loading_more_messages: "Carregant més missatges" - message_partitive: Missatge - messages_partitive: Missatges + message_partitive: missatge + messages_partitive: missatges no_received_messages: "No hi ha missatges rebuts" no_sent_messages: "No hi ha missatges enviats" conversation: accepted_request: ~ - accepted_offer: ~ - rejected_request: ~ - rejected_offer: ~ + accepted_offer: "Oferta acceptada" + rejected_request: "Sol·licitud rebutjada." + rejected_offer: "Oferta rebutjada" confirmed_request: ~ confirmed_offer: ~ canceled_request: ~ - canceled_offer: ~ + canceled_offer: "Oferta cancel·lada" message_from: ~ about_listing: ~ free_message: ~ @@ -747,10 +759,10 @@ ca: payment_preauthorized: ~ new: message: Missatge - message_to: ~ + message_to: "Missatge a %{author_name}" optional_message_to: ~ send_message: ~ - send: ~ + send: Envia this_message_is_private: "Aquest missatge és privat entre tu i %{person}." you_will_get_notified_of_acceptance: ~ you_will_get_notified: ~ @@ -765,12 +777,12 @@ ca: send_reply: "Envia resposta" write_a_reply: "Escriu una resposta:" conversation_about_listing: ~ - conversation_with_user: ~ + conversation_with_user: "Amb %{person}" conversation_with: ~ last_message_at: ~ price: ~ sum: ~ - total: ~ + total: "Total: %{total}" status: payment_errored: ~ payment_errored_starter: ~ @@ -822,24 +834,24 @@ ca: accept_request: "Acceptar sol·licitud" reject_offer: "Rebutjar oferta" reject_request: "Rebutjar la sol·licitud" - accept_preauthorized_offer: ~ + accept_preauthorized_offer: "Acceptar l'oferta" accept_preauthorized_request: ~ - reject_preauthorized_offer: ~ - reject_preauthorized_request: ~ + reject_preauthorized_offer: "Aquesta vegada no" + reject_preauthorized_request: "Aquesta vegada no" confirm: ~ cancel: ~ feedback: feedback_subject: ~ feedback_body: ~ - unlogged_user: ~ - anonymous_user: ~ + unlogged_user: "Usuari desconnectat" + anonymous_user: "Usuari anònim" community_memberships: access_denied: access_denied: ~ you_are_banned_in_this_community: ~ contact_page_link: ~ new: - welcome_fb_user: ~ + welcome_fb_user: "Benvingut a %{service_name}, %{name}!" fb_join_accept_terms: ~ join_community: ~ you_can_join: ~ @@ -856,12 +868,12 @@ ca: consent_not_given: ~ emails: accept_reminder: - remember_to_accept_offer: "Recorda acceptar o rebutjar una oferta" - remember_to_accept_request: "Recorda acceptar o rebutjar una sol·licitud" - you_can_accept_or_reject_offer_at: "Pots acceptar o rebutjar l'oferta de" - you_can_accept_or_reject_request_at: "Pots acceptar o rebutjar la sol·licitud de" - you_have_not_yet_accepted_or_rejected_offer: "Encara no has acceptat o rebutjat l'oferta %{title} que vas rebre el %{date} ." - you_have_not_yet_accepted_or_rejected_request: "Encara no has acceptat o rebutjat la sol·licitud %{title} que vas rebre al %{date} ." + remember_to_accept_offer: "Recorda acceptar o rebutjar una oferta de %{sender_name}" + remember_to_accept_request: "Recorda acceptar o rebutjar una sol·licitud de %{sender_name}" + you_can_accept_or_reject_offer_at: "Pots acceptar o rebutjar l'oferta a" + you_can_accept_or_reject_request_at: "Pots acceptar o rebutjar la sol·licitud a" + you_have_not_yet_accepted_or_rejected_offer: "Encara no has acceptat o rebutjat l'oferta %{title} rebuda el %{date}." + you_have_not_yet_accepted_or_rejected_request: "Encara no has acceptat o rebutjat la sol·licitud %{title} rebuda el %{date}." show_thread: ~ branding: powered_by: ~ @@ -909,19 +921,19 @@ ca: edit_your_email_settings_here: ~ message_not_displaying_correctly: ~ view_it_in_your_browser: ~ - or: ~ + or: o unsubscribe_from_these_emails_info: ~ unsubscribe_from_these_emails: ~ unsubscribe_from_invitation_emails_info: ~ unsubscribe_from_invitation_emails: ~ conversation_status_changed: - has_accepted_your_offer: "%{accepter} ha acceptat la teva oferta considerant la sol·licitud %{listing}" - has_accepted_your_request: "%{accepter} ha acceptat la teva sol·licitud considerant l'oferta %{listing}" + has_accepted_your_offer: "%{accepter} ha acceptat la teva oferta %{listing}." + has_accepted_your_request: "%{accepter} ha acceptat la teva sol·licitud %{listing}." has_rejected_your_offer: "%{accepter} ha rebutjat la teva oferta considerant la sol·licitud %{listing}" - has_rejected_your_request: "%{accepter} ha rebutjat la vostra sol·licitud considerant l'oferta %{listing}" + has_rejected_your_request: "%{accepter} ha rebutjat la vostra sol·licitud %{listing}" view_thread: ~ - your_offer_was_accepted: "Felicitats! L'oferta ha estat acceptada" - your_offer_was_rejected: "L'oferta ha estat rebutjada. Gràcies de totes formes!" + your_offer_was_accepted: "L'oferta ha estat acceptada" + your_offer_was_rejected: "L'oferta ha estat rebutjada." your_request_was_accepted: "La teva sol·licitud ha estat acceptada" your_request_was_rejected: "La teva sol·licitud ha estat rebutjada" you_can_now_pay_to: ~ @@ -936,16 +948,16 @@ ca: new_comment: has_commented_your_listing_in_kassi: ~ view_comment: ~ - you_have_a_new_comment: "%{author} ha comentat la teva llista de %{service_name}" + you_have_a_new_comment: "%{author} ha comentat la teva llista en %{service_name}" listing_you_follow_has_a_new_comment: "%{author} ha comentat un anunci que segueixes a Kassi" has_commented_listing_you_follow_in_kassi: ~ new_message: view_message: ~ - has_sent_you_a_message_in_kassi: "%{sender} t'ha enviat un missatge a %{service_name}:" - you_have_a_new_message: "Tens un nou missatge a %{service_name}" + has_sent_you_a_message_in_kassi: "%{sender} t'ha enviat un missatge en %{service_name}." + you_have_a_new_message: "Tens un nou missatge en %{service_name} de %{sender_name}" new_payment: new_payment: ~ - price_per_unit_type: ~ + price_per_unit_type: "Preu per %{unit_type}" quantity: ~ you_have_received_new_payment: ~ payment_receipt_to_seller: @@ -982,10 +994,10 @@ ca: service_fee: ~ you_will_get: ~ receipt_to_payer: - receipt_of_payment: ~ + receipt_of_payment: "Rebut de pagament" you_have_made_new_payment: ~ product: ~ - price_per_unit_type: ~ + price_per_unit_type: "Preu per %{unit_type}" duration: ~ quantity: ~ subtotal: ~ @@ -996,8 +1008,8 @@ ca: paypal_gateway_fee: ~ money_will_be_transferred: ~ new_testimonial: - has_given_you_feedback_in_kassi: "%{name} t'ha fet un suggeriment a %{service_name}" - you_can_give_feedback_to: "Pots donar-li un suggeriment a %{name} en" + has_given_you_feedback_in_kassi: "%{name} t'ha fet un suggeriment en %{service_name}" + you_can_give_feedback_to: "Encara no has fet un suggeriment a %{name}." view_feedback: ~ new_update_to_listing: listing_you_follow_has_been_updated: "La llista que segueixes ha estat actualitzada" @@ -1020,16 +1032,14 @@ ca: newest_requests: "Que necessita la gent?" text_version_text: "Tens alguna cosa que la resta puguin necessitar? O necessites alguna cosa que altra gent pugui tenir? Afegeix una oferta o sol·licitud, o revisa tot allò que s'ofereix a %{url}" reset_password_instructions: - change_my_password: ~ + change_my_password: "Canviar la meva clau" reset_password_instructions: ~ testimonial_reminder: remember_to_give_feedback_to: "Recordatori: Recorda fer un suggeriment a %{name}" - you_have_not_given_feedback_yet: |- - Encara no has enviat un suggeriment a %{name} sobre l'esdeveniment '%{event}'. - Recorda fer un suggeriment de com %{given_name} va actuar a l'esdeveniment. + you_have_not_given_feedback_yet: "Encara no has fet un suggeriment a %{name} sobre l'esdeveniment '%{event}'. Recorda fer un suggeriment de com %{given_name} va actuar a l'esdeveniment." transaction_preauthorized: - subject: ~ - transaction_requested_by_user: ~ + subject: "%{requester} està interessat i ha autoritzat el pagament de %{listing_title} publicat en %{service_name}" + transaction_requested_by_user: "Bona notícia! %{requester} està interessat en \"%{listing_title}\" i ha autoritzat el pagament." you_have_time_to_accept: ~ if_you_do_accept: ~ if_you_do_accept_stripe: ~ @@ -1041,7 +1051,7 @@ ca: one_day_left: ~ click_here_to_reply: ~ welcome_email: - welcome_email_subject: ~ + welcome_email_subject: "Benvingut a %{service_name}" welcome_to_marketplace: ~ love_marketplace_crew: ~ welcome_email_footer_text: ~ @@ -1063,13 +1073,13 @@ ca: onboarding: server_rendering: ~ listings: - departure_time: "L'hora de sortida ha desituar-se entre la data actual i un any a contar des d'avui." + departure_time: "L'hora de sortida ha de ser entre la data actual i un any a partir d'avui." share_type: "Has de seleccionar almenys una de les caselles anteriors." - valid_until: "La data ha de situar-se entre la data actual i un any a contar des d'avui." + valid_until: "La data ha de ser entre la data actual i un any a partir d'avui." price: ~ - minimum_price: ~ + minimum_price: "El preu mínim és %{minimum_price} %{currency}." testimonials: - you_must_explain_not_neutral_feedback: "Si desitges fer un suggeriment no neutral has de raonar-lo" + you_must_explain_not_neutral_feedback: "Si desitges fer un suggeriment no neutral, has de raonar-lo." you_must_select_a_grade: "Recorda avaluar als usuaris clicant en una de les icones de sobre (pot veure les explicacions de cada icona passant el ratolí per sobre d'elles)" transaction_agreement: required_error: ~ @@ -1087,10 +1097,10 @@ ca: error_pages: back_to_kassi_front_page: "Tornar a la pàgina principal" error_404: - if_you_believe: "Si creus que l'adreça és correcta i hauria de funcionar, llavors, si us plau, ajuda'ns a trobar l'error fent-nos saber en el següent formulari quina adreça ha causat l'error i que hauria d'aparèixer a la pàgina." + if_you_believe: "Si creus que l'adreça és correcta i hauria de funcionar, llavors, si us plau, ajuda'ns a trobar l'error fent-nos saber en el següent formulari quina adreça ha causat l'error i què hauria d'aparèixer a la pàgina." page_can_not_be_found: "Pàgina no trobada." - page_you_requested_can_not_be_found: "Pàgina no trobada. Esteu segurs de que està correctament escrita?" - error_404_title: "Pàgina no trobada" + page_you_requested_can_not_be_found: "Pàgina no trobada. Esteu segurs de que l'adreça està correctament escrita?" + error_404_title: "pàgina no trobada" error_410: page_removed: ~ page_you_requested_has_been_removed: ~ @@ -1104,13 +1114,13 @@ ca: error_500_title: "La pàgina no s'ha carregat" error_description: "Descripció de l'error" no_javascript: - javascript_is_disabled_in_your_browser: "Javascript està inhabilitat al teu navegador" - kassi_does_not_currently_work_without_javascript: "Malauradament %{service_name} no funciona sense javascript. Intenta activar javascript en els opcions del navegador i torna a carregar la pàgina. Si desitges utilitzar Kassi sense javascript, siusplau, envia'ns un suggeriment utilitzant el formulari que apareix a continuació." + javascript_is_disabled_in_your_browser: "Javascript està inhabilitat en el teu navegador" + kassi_does_not_currently_work_without_javascript: "Malauradament %{service_name} no funciona correctament sense javascript. Intenta activar javascript en les opcions del navegador i torna a carregar la pàgina." contact_us: ~ - send_feedback: ~ - your_feedback_to_admins: ~ + send_feedback: "Enviar missatge" + your_feedback_to_admins: "El teu missatge al equip de %{service_name}" send: Enviar - your_email_address: "Correu electrònic" + your_email_address: "La teva direcció de correu electrònic" errors: messages: invalid_date: ~ @@ -1151,7 +1161,7 @@ ca: about: Sobre home: Inici members: ~ - new_listing: ~ + new_listing: "Nova llista" mobile_version: "Versió mòbil" offers: Ofertes requests: Sol·licituds @@ -1166,33 +1176,33 @@ ca: menu: ~ homepage: additional_private_listings_slate: - additionally_one_private_offer_exists: "A més existeix i aquesta altra oferta ," - additionally_one_private_request_exists: "A més existeix i aquesta altra sol·licitud," - additionally_some_private_offers_exist: "A més existeixen %{number_of_listings} altres ofertes," - additionally_some_private_requests_exist: "A més existeixen %{number_of_listings} altres sol·licituds," + additionally_one_private_offer_exists: "A més hi a aquesta altra oferta," + additionally_one_private_request_exists: "A més hi a aquesta altra sol·licitud," + additionally_some_private_offers_exist: "A més hi han %{number_of_listings} altres ofertes," + additionally_some_private_requests_exist: "A més hi han %{number_of_listings} altres sol·licituds," blank_slate: add_first: Afegeix-ne! - but_that_is_visible_only_to_registered_members: "Només disponible per a usuaris registrats." - but_those_are_visible_only_to_registered_members: "Només disponible per a usuaris registrats." + but_that_is_visible_only_to_registered_members: "però això només és visible per als membres registrats." + but_those_are_visible_only_to_registered_members: "però aquests només són visibles per als membres registrats." create_new_account_for_yourself: "Crea un compte nou" examples_of_what_you_could_offer_to_others: "Què pots oferir als altres?" examples_of_what_you_could_request_to_others: "Què pots demanar als altres?" favor_offer_list: "Assistència informàtica, costura de roba, mecànica de bicicletes, llibres" - favor_request_list: "Cura de nens, classes de piano, passejar a gossos, tallar la gespa" + favor_request_list: "Cura de nens, classes de piano, passejar gossos, tallar la gespa" favors_to_offer: "Ajuda: " favors_to_request: "Ajuda: " - item_offer_list: "Eines, equip esportiu, disfresses, equip de camping" - item_request_list: "Eines, equip esportiu, disfresses, equip de camping" + item_offer_list: "Eines, equip esportiu, disfresses, material de càmping" + item_request_list: "Eines, material esportiu, disfresses, material de càmping" items_to_offer: "Coses per regalar: " items_to_request: "Coses per prestar: " - log_in: Entra + log_in: Entra! no_offers_visible_unless_logged_in: "Els articles, serveis o viatges compartits no són visibles pels usuaris no registrats." no_open_offers_currently: "No hi ha ofertes de productes, serveis o viatges compartits." no_open_requests_currently: "No hi ha sol·licituds de productes, serveis o viatges compartits." no_requests_visible_unless_logged_in: "Els articles, serveis o viatges compartits no són visibles pels usuaris no registrats." one_private_offer_exists: "Ja existeix una oferta," one_private_request_exists: "Ja existeix una sol·licitud," - ride_offer: "Porta als fills d'altres a fer les seves aficions" + ride_offer: "Porta els nens d'altres famílies als seus extra-escolars" ride_request: "Viatge compartit a la feina" some_private_offers_exist: "Ja hi han %{number_of_listings} ofertes," some_private_requests_exist: "Ja hi han %{number_of_listings} sol·licituds," @@ -1207,19 +1217,19 @@ ca: index: no_listings_with_your_search_criteria: ~ no_listings_notification: ~ - add_listing_link_text: ~ + add_listing_link_text: "Afegir una nova llista" open_listing: ~ - open_listings: ~ - private_listing_notification_log_in: ~ - is: ~ + open_listings: "obrir llistes" + private_listing_notification_log_in: "Inicia sessió" + is: és are: ~ what_do_you_need: ~ post_new_listing: ~ are_offering: ofereixen add_news_item: "Afegeix un article" - lend_rent_help_carpool: "Ven, regala o ajuda a altres! Comparteix els teus viatges!" + lend_rent_help_carpool: "Ven, regala, ajuda, comparteix el cotxe" loading_more_content: "S'estan carregant més continguts" - more_events: "Més esdeveniments" + more_events: "Més esdeveniments..." news: Notícies no_news: "No hi ha cap notícia" more_news: "Més notícies" @@ -1229,8 +1239,8 @@ ca: requesting: necessiten tell_it_here: "Diga-ho aquí!" welcome_to_new_kassi: "Benvingut al nou %{service_name}!" - no_reviews: ~ - no_image: ~ + no_reviews: "No hi ha cap comentaris" + no_image: "No hi ha cap imatge" filter: ~ this_is_private_community: ~ invitation_form: @@ -1246,7 +1256,7 @@ ca: list_item: review: ~ reviews: ~ - distance_away: ~ + distance_away: "A %{distance} %{distance_unit} de distància" news_item: show_less: "Menys de" show_more: "Més de" @@ -1257,8 +1267,8 @@ ca: add_your_info_link: "Afegeix la teva informació ara" recent_listing: please_offer: Oferta - comment: ~ - comments: ~ + comment: comentari + comments: comentaris filters: show: ~ search: ~ @@ -1277,8 +1287,8 @@ ca: default_about_text: ~ click_here_link_text: ~ how_to_use: - default_title: ~ - default_content: ~ + default_title: "Com funciona" + default_content: "Aquí pots trobar informació sobre com funciona %{marketplace_name}" landing_page: hero: search: ~ @@ -1301,18 +1311,18 @@ ca: application: join_this_community: ~ read_more: ~ - feedback: ~ + feedback: "El seu missatge al equip de %{service_name}" dont_use_to_contact_support: ~ feedback_forum: "Fòrum de suggeriments" feedback_handle: Suggeriment give_feedback: "Fes un suggeriment" or_check_our: "...o comprova el nostre" - send_feedback_to_admin: ~ - to_see_what_others_have_suggested: "per veure els suggeriments d'altres usuaris." - your_email_address: "Correu electrònic (no obligatori)" + send_feedback_to_admin: "Enviar missatge" + to_see_what_others_have_suggested: "per veure els suggeriments d'altres usuaris, i votar per les vostres funcionalitats preferides." + your_email_address: "Correu electrònic (per contactar amb tu)" connect: ~ invite_your_friends: ~ - invite_your_neighbors: ~ + invite_your_neighbors: "Invita els teus veïns!" invite_your_friends_description: ~ invite_your_friends_invite_only_description: ~ join_without_facebook: ~ @@ -1325,11 +1335,11 @@ ca: global-header: select_language: ~ infos: - about: "Què és Kassi" + about: Sobre how_to_use: "Com funciona" - info_about_kassi: "Informació sobre Kassi" + info_about_kassi: "Informació sobre %{service_name}" news: Novetats - register_details: "Detalls del registre" + register_details: Privacitat terms: "Termes d'ús" logged_in: admin: Admin @@ -1373,12 +1383,12 @@ ca: create_new_listing: ~ create_one_here: "Crear-ne un aquí" email_confirmation_sent_to_new_address: ~ - email_not_found: "No s'ha trobat el correu electrònic dins de la base de dades de Kassi" + email_not_found: "No s'ha trobat el correu electrònic dins de la base de dades de %{service_name}." error_with_session: "Error amb la sessió." feedback_considered_spam: "Suggeriment no enviat degut al format. Intenti-ho de nou o utilitzi el fòrum per a suggeriments." feedback_not_saved: "No es pot enviar el suggeriment." - feedback_saved: ~ - feedback_sent_to: "Comentari enviat a" + feedback_saved: "Moltes gràcies pel teu missatge! Ens posarem en contacte amb tu el més aviat possible." + feedback_sent_to: "Comentari enviat a %{target_person}." feedback_skipped: "Suggeriment omès" invitation_cannot_be_sent: "No s'ha pogut enviar la invitació" invitation_cannot_unsubscribe: ~ @@ -1386,12 +1396,12 @@ ca: invitation_sent: "Invitació enviada amb èxit" invitation_successfully_unsubscribed: ~ inviting_new_users_is_not_allowed_in_this_community: "Convidar a nous usuaris no està permès en aquesta comunitat" - login_again: "Siusplau, torna a iniciar sessió" - login_failed: "Error. Siusplau comprova que les dades són correctes." - account_creation_successful: ~ + login_again: "Si us plau, torna a iniciar sessió" + login_failed: "Error. Si us plau comprova que les dades són correctes." + account_creation_successful: "Benvingut a %{service_name}, %{person_name}!" account_deleted: ~ - login_successful: "Benvingut a Kassi, " - logout_successful: "Benvingut de nou!" + login_successful: "Benvingut, %{person_name}!" + logout_successful: "Ja heu tancat la sessió de %{service_name}. Fins aviat!" news_item_created: "Article creat" news_item_creation_failed: "Error en l'article creat" news_item_update_failed: "Error en l'actualització de l'article" @@ -1406,9 +1416,9 @@ ca: listing_updated_successfully: ~ listing_updated_availability_management_enabled: ~ listing_updated_availability_management_disabled: ~ - only_kassi_administrators_can_access_this_area: "Només els administradors poden accedir aquí" + only_kassi_administrators_can_access_this_area: "Només els administradors de %{service_name} poden accedir aquí" only_listing_author_can_close_a_listing: "Només el creador d'una llista pot tancar-la" - only_listing_author_can_edit_a_listing: "Només el creador d'una llista pot editar" + only_listing_author_can_edit_a_listing: "Només el creador d'una llista pot editar-la" payment_successful: ~ payment_canceled: ~ error_in_payment: ~ @@ -1433,33 +1443,33 @@ ca: request_confirmed: ~ request_rejected: "Sol·licitud rebutjada" request_canceled: ~ - message_sent: ~ + message_sent: "Missatge enviat" message_not_sent: ~ this_content_is_not_available_in_this_community: "Aquest contingut no està disponible en aquesta comunitat." unknown_error: "Error desconegut. Si us plau utilitza l'enllaç de suggeriments per donar-nos detalls del que ha succeït." - update_error: "S'ha produït un error quan durant l'actualització de la informació, si us plau intenta-ho de nou." + update_error: "S'ha produït un error durant l'actualització de la informació, si us plau intenta-ho de nou." you_are_not_allowed_to_give_feedback_on_this_transaction: "No tens autorització per donar suggeriments en aquest esdeveniment." you_are_not_authorized_to_do_this: "No tens autorització per dur a terme aquesta acció." you_are_not_authorized_to_view_this_content: "No tens autorització per veure aquest contingut" listing_closed: ~ send_instructions: ~ you_cannot_reply_to_a_closed_offer: "No pots respondre a una oferta finalitzada" - you_cannot_send_message_to_yourself: ~ + you_cannot_send_message_to_yourself: "No pots enviar un missatge" you_followed_listing: "Ara està seguint aquesta llista" you_have_already_given_feedback_about_this_event: "Ja has enviat un suggeriment sobre aquest esdeveniment" you_are_now_member: ~ you_are_already_member: ~ you_must_log_in_to_create_new_listing: ~ additional_email_confirmed_dashboard: ~ - you_must_log_in_to_give_feedback: "Iniciar sessió per a fer una suggerència" + you_must_log_in_to_give_feedback: "Has d'iniciar una sessió per fer una suggerència" you_must_log_in_to_invite_new_users: "Cal que inicis sessió per convida a nous usuaris" - you_must_log_in_to_send_a_comment: "Iniciar sessió per a comentar" - you_must_log_in_to_send_a_message: "Iniciar sessió per a enviar un missatge a un usuari" + you_must_log_in_to_send_a_comment: "Has d'iniciar una sessió per enviar un nou comentari" + you_must_log_in_to_send_a_message: "Has d'iniciar una sessió en %{service_name} per a enviar un missatge a un usuari." you_must_log_in_to_do_a_transaction: ~ - you_must_log_in_to_view_this_content: "Iniciar sessió per a veure el contingut" + you_must_log_in_to_view_this_content: "Has d'iniciar una sessión per a veure aquest contingut" you_must_log_in_to_view_this_page: ~ - you_must_log_in_to_view_your_inbox: "Iniciar sessió per a revisar la safata d'entrada" - you_must_log_in_to_view_your_settings: "Iniciar sessió per a veure la teva configuració" + you_must_log_in_to_view_your_inbox: "Has d'iniciar una sessión en %{service_name} per a revisar la safata d'entrada" + you_must_log_in_to_view_your_settings: "Has d'iniciar una sessió en %{service_name} per a veure la teva configuració" you_must_log_in_to_add_news_item: "Has d'iniciar sesió per afegir un nou article" you_must_log_in_to_change_profile_settings: ~ you_must_log_in_to_accept_or_reject: ~ @@ -1487,15 +1497,15 @@ ca: listing_not_visible: "No tens autorització per veure aquest anunci." comment: wrote: ~ - send_private_message: ~ + send_private_message: "Enviar missatge privat a %{person}" delete: ~ are_you_sure: ~ comment_form: ask_a_question: ~ - log_in: Registre - send_comment: "Envia el comentari" - to_send_a_comment: "Envia un nou comentari" - write_comment: "Escriu un comentari nou" + log_in: "Iniciar sessió" + send_comment: "Enviar comentari" + to_send_a_comment: "Per a enviar un nou comentari." + write_comment: "Escriu un nou comentari:" you_cannot_send_a_new_comment_because_listing_is_closed: ~ you_must: "Hauries de" subscribe_to_comments: "Avisa'm dels nous comentaris i actualitzacions" @@ -1503,11 +1513,11 @@ ca: edit_listing: ~ edit_links: close_listing: ~ - edit_listing: ~ + edit_listing: "Editar la llista" reopen_listing: ~ move_to_top: ~ show_in_updates_email: ~ - show_in_updates_email_loading: ~ + show_in_updates_email_loading: Carregant... show_in_updates_email_error: ~ show_in_updates_email_success: ~ map: @@ -1525,7 +1535,7 @@ ca: dropdown: select_one___: ~ departure_time: - at: "a les" + at: a departure_time: "Hora de sortida" departure_time_radio_buttons: repeated: "Repetit (afegir temps i dies en el camp \"descripció detallada\")" @@ -1550,13 +1560,13 @@ ca: images: image: Imatge best_result: ~ - no_file_selected: "No hi han fitxers seleccionats" + no_file_selected: "No hi ha fitxer seleccionat" remove_image: "Elimina la imatge" - select_file: "Trieu el fitxer" + select_file: "Tria un fitxer" add_more: ~ removing: ~ processing: ~ - loading_image: ~ + loading_image: Carregant... image_uploading_in_progress: ~ processing_takes_a_while: ~ this_may_take_a_while: ~ @@ -1600,7 +1610,7 @@ ca: give_away: Regalar lend: Prestar offer_type: "Tipus d'oferta" - receive: Gratuït + receive: "Accepta de forma gratuïta" rent: Lloguer rent_out: Arrendament request_type: "Tipus de sol·licitud" @@ -1618,7 +1628,7 @@ ca: valid_until_radio_buttons: for_the_time_being: "De moment" privacy: - privacy: ~ + privacy: Privacitat private: ~ public: ~ help_texts: @@ -1627,8 +1637,8 @@ ca: help_valid_until_title: "Data de caducitat" index: all_categories: "Totes les categories" - all_offer_types: "Tipus d'ofertes" - all_request_types: "Tipus de sol·licitud" + all_offer_types: "Tots tipus d'ofertes" + all_request_types: "Tots tipus de sol·licitud" category: Categoria did_not_found_what_you_were_looking_for: "No trobes el que busques?" favors: Serveis @@ -1673,7 +1683,7 @@ ca: selected_category: ~ selected_subcategory: ~ selected_transaction_type: ~ - select_category: ~ + select_category: "Selecciona una categoria" select_subcategory: ~ select_transaction_type: ~ you_need_to_fill_payout_details_before_accepting: ~ @@ -1704,11 +1714,11 @@ ca: item_offer_trade: ~ item_request_trade: ~ no_description: "Sense descripció" - no_image: ~ + no_image: "No hi ha cap imatge" no_reviews: ~ offer: Oferta listing_created: ~ - open_until: ~ + open_until: "Obert fins %{date}" feedback: ~ qr_code: "Codi QR" request: Sol·licitud @@ -1732,21 +1742,21 @@ ca: pickup_no_price: ~ youtube_video_player: ~ unit_types: - piece: ~ - hour: ~ - day: ~ - night: ~ - week: ~ - month: ~ + piece: peça + hour: hora + day: dia + night: nit + week: setmana + month: mes verification_required: verification_required: ~ listing_conversations: preauthorize: dates_not_available: ~ error_in_checking_availability: ~ - details: ~ + details: Detalls by: ~ - payment: ~ + payment: Pagament exp: ~ you_will_be_charged: ~ day: ~ @@ -1779,7 +1789,7 @@ ca: items: Articles list_view: "Mostra la llista" map_view: "Mostra el mapa" - offer_something: "Comparteix-ho amb els demés!" + offer_something: "Comparteix-ho amb els altres!" offer_type: "Tipus d'oferta" offers: Ofertes request_something: "Demana-ho aquí!" @@ -1834,7 +1844,7 @@ ca: paypal_account_billing_agreement_info_none: ~ paypal_info_link_text: ~ billing_agreement_description: ~ - billing_agreement: ~ + billing_agreement: Autoritzar permissions_not_granted: ~ could_not_fetch_redirect_url: ~ paypal_not_enabled: ~ @@ -1850,7 +1860,7 @@ ca: missing: ~ from_your_payment_settings_link_text: ~ redirect_message: ~ - redirect_link_text: ~ + redirect_link_text: aquí paypal_account_all_set_up: ~ can_receive_payments: ~ paypal_account_connected_summary: ~ @@ -1858,7 +1868,7 @@ ca: paypal: pay_with_paypal: ~ checkout_with: ~ - or_pay_with_paypal: ~ + or_pay_with_paypal: o checkout_with_paypal: ~ cancel_succesful: ~ transaction: @@ -1873,7 +1883,7 @@ ca: help_texts: feedback_description_title: Suggeriment help_invitation_code_title: "Necessites una invitació per unir-te a" - terms_title: "Termes d'ús de Kassi" + terms_title: "Termes d'ús de %{service_name}" invite_only_help_text: ~ invite_only_help_text_title: ~ inactive_notification: @@ -1895,14 +1905,14 @@ ca: notification_is_mandatory: ~ password_again: "Confirma la contrasenya:" show_my_name_to_others: "Mostra el meu nom real als altres usuaris" - sign_up: "Crea un compte" + sign_up: "Crea un nou compte en %{service_name}" terms: "Termes d'ús" username_is_in_use: "Aquest usuari ja existeix" username_is_invalid: "El nom d'usuari no és vàlid. Els caràcters permesos són lletres, números i guió baix." visible_only_to_you: "visible només per a tu i l'administrador de la comunitat" visible_to_everybody: "Visible per a tothom" create_account_with_facebook: ~ - OR: ~ + OR: O signup_with_email: ~ profile_feedback: grade: "puntuació:" @@ -1910,15 +1920,15 @@ ca: profile_listings: show_also_closed: "Mostra com tancada" show_only_open: "Mostra com oberta" - no_image: ~ + no_image: "No hi ha cap imatge" show: contact: ~ - about_me: "Quant a mi:" + about_me: "Sobre mi:" add_description: "Digues alguna cosa sobre tu" add_location: "Afegir ubicació" add_phone_number: "Afegir número de telèfon" address: "Ubicació:" - as_expected: L'esperat + as_expected: "Com era d'esperar" edit_profile_info: "Edita la informació" exceeded_expectations: "Expectatives superades" positive: ~ @@ -1933,19 +1943,19 @@ ca: what_are_these: "Què són aquests?" review: ~ reviews: ~ - listing: ~ - listings: ~ + listing: llista + listings: llistes open_listing: ~ open_listings: ~ no_listings: ~ no_open_listings: ~ no_reviews: ~ - show_all_listings: ~ + show_all_listings: "Mostrar totes les llistes" show_all_open_listings: ~ show_all_reviews: ~ followed_people: - you_follow_plural: ~ - you_follow_singular: ~ + you_follow_plural: "Segueixes a %{count} persones" + you_follow_singular: "Segueixes a %{count} persones" they_follow_plural: ~ they_follow_singular: ~ show_all_followed_people: ~ @@ -1961,7 +1971,7 @@ ca: login: "Inicia sessió" login_to_kassi: "Inicia sessió a Kassi" connect_your_facebook_to_kassi: ~ - facebook_account: ~ + facebook_account: "Compte de Facebook" log_in_to_link_account: ~ you_can_also_create_new_account: ~ account_creation_link_text: ~ @@ -1980,10 +1990,10 @@ ca: check_your_email: "Revisa la safata d'entrada" resend_confirmation_instructions: "Reenviament de les instruccions de confirmació" your_current_email_is: ~ - change_email: ~ - confirm_your_email: ~ + change_email: Canvia + confirm_your_email: "Si us plau confirma el teu correu electrònic" account_confirmation_instructions: ~ - account_confirmation_instructions_title_admin: ~ + account_confirmation_instructions_title_admin: "Confirma la teva adreça de correu electrònic" before_full_access_you_need_to_confirm_email: ~ before_confirmation_only_access_admin_dashboard: ~ admin_dashboard_link_text: ~ @@ -2161,7 +2171,7 @@ ca: december: Des today: Avui clear: ~ - format: ~ + format: mm/dd/aaaa time: formats: short: "%e %b %Y al %H:%M" @@ -2189,15 +2199,15 @@ ca: subtotal: ~ shipping-price: ~ stripe-fee: ~ - price_per_quantity: ~ - price: ~ + price_per_quantity: "Preu per %{unit_type}" + price: "Preu:" quantity: ~ unit_price: ~ - total: ~ + total: "Total:" total_to_pay: ~ unit: - day: ~ - days: ~ + day: dia + days: dies web: listings: errors: @@ -2205,12 +2215,12 @@ ca: something_went_wrong: ~ saving_failed: ~ pricing_units: - piece: ~ - hour: ~ - day: ~ - night: ~ - week: ~ - month: ~ + piece: peça + hour: hora + day: dia + night: nit + week: setmana + month: mes edit_availability_header: ~ save_and_close_availability_editing: ~ confirm_discarding_unsaved_availability_changes_explanation: ~ @@ -2221,9 +2231,9 @@ ca: try_other_search_terms: ~ listing_card: add_picture: ~ - no_picture: ~ + no_picture: "No hi ha cap imatge" search: - page: ~ + page: Pàgina page_of_pages: ~ topbar: menu: ~ @@ -2277,15 +2287,15 @@ ca: form_new: need_info: ~ select_country: ~ - legal_name: ~ - country: ~ + legal_name: "Nom legal" + country: País birth_date: ~ ssn_last_4: ~ - personal_id_number: ~ - address_country: ~ + personal_id_number: "NIF/NIE/Número de Passaport" + address_country: País address_state: ~ - address_city: ~ - address_postal_code: ~ + address_city: Ciutat + address_postal_code: "Codi postal" address_line1: ~ tos_link: ~ tos_link_title: ~ @@ -2331,7 +2341,7 @@ ca: bank_account: ~ paypal: ~ bank_account_details: ~ - add_bank_details: ~ + add_bank_details: "Afegeix detalls bancaris" can_accept_stripe_and_paypal: ~ to_accept_paypal: ~ connect_paypal: ~ diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 899ed3ef7b..643a768953 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -327,6 +327,7 @@ cs: initiated_by: Spouštěč other_party: "Další strana" status: + conversation: ~ free: Konverzace pending: "Čeká na vyřízení" preauthorized: Předschváleno @@ -362,6 +363,17 @@ cs: initiated: ~ pending_ext: ~ not_available: Nedostupné + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: "Upravit pole inzerát %{field_name}" diff --git a/config/locales/da-DK.yml b/config/locales/da-DK.yml index 008284205f..aca347b7ea 100644 --- a/config/locales/da-DK.yml +++ b/config/locales/da-DK.yml @@ -322,6 +322,7 @@ da-DK: initiated_by: Starter other_party: "Tredje part" status: + conversation: ~ free: ~ pending: Venter preauthorized: Preauthorized @@ -357,6 +358,17 @@ da-DK: initiated: ~ pending_ext: ~ not_available: "Ikke tilgængelig" + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: "Rediger annoncefelt '%{field_name}'" diff --git a/config/locales/de.yml b/config/locales/de.yml index 51f3f7ccb3..4ef99546bd 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -322,6 +322,7 @@ de: initiated_by: Starter other_party: "Anderer Beteiligter" status: + conversation: Unterhaltung free: Unterhaltung pending: Ausstehend preauthorized: Vorautorisiert @@ -357,6 +358,17 @@ de: initiated: "Warte auf Stripe-Bezahlung" pending_ext: "Warte auf Stripe-Bezahlung" not_available: "nicht verfügbar" + conversations: + conversations: "Unterhaltungen ansehen" + headers: + started_from: "Gestartet von" + status: Status + started: Gestartet + last_activity: "Neueste Aktivität" + initiated_by: "Begonnen von" + other_party: "Anderer Beteiligter" + participants: "Unterhaltung: %{starter} mit %{author}" + profile: "%{author}s Profil" custom_fields: edit: edit_listing_field: "Eintragsfeld '%{field_name}' bearbeiten" diff --git a/config/locales/devise.ca.yml b/config/locales/devise.ca.yml index 6ffb0d642a..6f6257d890 100644 --- a/config/locales/devise.ca.yml +++ b/config/locales/devise.ca.yml @@ -3,55 +3,55 @@ ca: messages: expired: "ha caducat, demana'n un de nou" not_found: "no s'ha trobat" - already_confirmed: "ja està confirmat" - not_locked: "no està bloquejat" + already_confirmed: "ja estava confirmat, intenta iniciar la sessió" + not_locked: "no estava bloquejat" not_saved: - one: "1 error ha evitat que %{resource} es pugui desar:" - other: "%{count} errors han evitat que %{resource} es pugui desar:" + one: "1 error ha impedit que es desi aquest(a) %{resource}:" + other: "%{count} errors han impedit desar %{resource}:" devise: failure: - already_authenticated: "Ja estàs identificat." - unauthenticated: "Has d'iniciar sessió o bé registrar-te abans de continuar." + already_authenticated: "Ja estàs connectat." + unauthenticated: "Has d'iniciar una sessió o bé registrar-te abans de continuar." unconfirmed: "Has de confirmar el teu compte abans de continuar." locked: "El teu compte està bloquejat." - invalid: "Correu electrònic o contrasenya invàlids." + invalid: "Correu electrònic o contrasenya invàlid." invalid_token: "Codi d'autenticació invàlid." - timeout: "La teva sessió ha caducat. Si us plau, torna a iniciar sessió per a continuar." - inactive: "El teu compte encara no ha estat activat." + timeout: "La teva sessió ha caducat. Si us plau, torna a iniciar una sessió per continuar." + inactive: "El teu compte encara no està activat." passwords: updated_not_active: "La teva contrasenya ha estat canviada correctament." - send_paranoid_instructions: "Si la teva adreça electrònica existeix a la base de dades, rebràs un correu electrònic amb un enllaç per reestablir la contrasenya." - send_instructions: "En breu rebràs un correu electrònic amb instruccions sobre com restablir la teva contrasenya." + send_paranoid_instructions: "Si la teva adreça electrònica existeix en la nostra base de dades, rebràs un correu electrònic amb un enllaç per reestablir la contrasenya." + send_instructions: "En breu rebràs un correu electrònic amb instruccions sobre com reinicialitzar la teva contrasenya." updated: "La teva contrasenya ha estat canviada correctament. S'ha iniciat la sessió." sessions: signed_in: "Sessió iniciada correctament." signed_out: "Sessió tancada correctament." confirmations: - send_paranoid_instructions: "Si la teva adreça electrònica existeix a la base de dades, rebràs un correu electrònic amb instruccions sobre com confirmar el teu compte." + send_paranoid_instructions: "Si la teva adreça electrònica existeix en la base de dades, rebràs un correu electrònic amb instruccions sobre com confirmar el teu compte." send_instructions: "En breu rebràs un correu electrònic amb instruccions sobre com confirmar el teu compte." - confirmed: "El teu compte ha estat confirmat correctament. S'ha iniciat la sessió." + confirmed: "El teu compte s'ha confirmat correctament." registrations: - signed_up_but_unconfirmed: ~ - signed_up_but_inactive: ~ - signed_up_but_locked: ~ + signed_up_but_unconfirmed: "Un missatge amb un enllaç de confirmació s'ha enviat al teu correu electrònic. Si us plau, segueix l'enllaç per activar el teu compte." + signed_up_but_inactive: "T'has registrat amb èxit però no s'ha iniciat la sessió perquè el teu compte encara no està activat." + signed_up_but_locked: "T'has registrat amb èxit però no s'ha iniciat la sessió perquè el teu compte està bloquejat." reasons: inactive: inactiu - unconfirmed: "no confirmat" + unconfirmed: "sense confirmar" locked: bloquejat - update_needs_confirmation: ~ - signed_up: "Has estat registrat correctament." + update_needs_confirmation: "Has actualitzat el teu compte correctament, però has de comprovar la teva nova direcció de correu electrònic. Si us plau, consulta el teu correu i segueix l'enllaç per acabar de confirmar-la." + signed_up: "Benvingut! T'has registrat correctament." updated: "Has actualitzat el teu compte correctament." - destroyed: "Adéu! El teu compte ha estat cancel·lat correctament. Esperem tornar-te a veure!" + destroyed: "Adéu! El teu compte ha estat cancel·lat correctament. Esperem tornar a veure't aviat!" unlocks: - send_paranoid_instructions: "Si el teu compte existeix, rebràs un correu electrònic amb instruccions sobre com desbloquejar-lo." + send_paranoid_instructions: "Si el teu compte existeix, en breu rebràs un correu electrònic amb instruccions sobre com desbloquejar-lo." send_instructions: "En breu rebràs un correu electrònic amb instruccions sobre com desbloquejar el teu compte." - unlocked: "El teu compte ha estat desbloquejat correctament. S'ha iniciat la sessió." + unlocked: "El teu compte ha estat desbloquejat correctament. Si us plau, inicia la sessió per continuar." omniauth_callbacks: - success: "Autoritzat satisfactoriament el compte des de %{kind}." + success: "Autoritzat satisfactòriament des del compte %{kind}." failure: "No hem pogut autoritzar el compte des de %{kind} perquè \"%{reason}\"." mailer: confirmation_instructions: - subject: "Instruccions de confirmació" + subject: "Instruccions de confirmació per unir-se a %{service_name}." reset_password_instructions: subject: "Instruccions de regeneració de contrasenya" unlock_instructions: diff --git a/config/locales/el.yml b/config/locales/el.yml index 32d25eb05b..ded408f153 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -307,6 +307,7 @@ el: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ el: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/en-AU.yml b/config/locales/en-AU.yml index 31c3955e70..b0c8b5c845 100644 --- a/config/locales/en-AU.yml +++ b/config/locales/en-AU.yml @@ -307,6 +307,7 @@ en-AU: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ en-AU: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index 7ae8e96a53..08d9325891 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -307,6 +307,7 @@ en-GB: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ en-GB: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/en-NZ.yml b/config/locales/en-NZ.yml index 32e20a1042..06b8cca337 100644 --- a/config/locales/en-NZ.yml +++ b/config/locales/en-NZ.yml @@ -307,6 +307,7 @@ en-NZ: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ en-NZ: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/es-ES.yml b/config/locales/es-ES.yml index f3b67c592e..5960641804 100644 --- a/config/locales/es-ES.yml +++ b/config/locales/es-ES.yml @@ -322,6 +322,7 @@ es-ES: initiated_by: "Iniciada por" other_party: "Otra parte" status: + conversation: ~ free: Conversación pending: Pendiente preauthorized: Pre-autorizada @@ -357,6 +358,17 @@ es-ES: initiated: "Esperando el pago de Stripe" pending_ext: "Esperando el pago de Stripe" not_available: "No disponible" + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: "Editar campo '%{field_name}'" @@ -1956,7 +1968,7 @@ es-ES: show: contact: "Contactar a %{person}" about_me: "Acerca de mí:" - add_description: "Comparte algo acerca ti" + add_description: "Comparte algo sobre ti" add_location: "Agregar ubicación" add_phone_number: "Agregar número de teléfono" address: "Ubicación:" diff --git a/config/locales/es.yml b/config/locales/es.yml index fef41cc0e9..02fc3a617a 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -307,6 +307,7 @@ es: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ es: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/et.yml b/config/locales/et.yml index 3dd48a21ac..8f2db7de54 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -307,6 +307,7 @@ et: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ et: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/eu-ES.yml b/config/locales/eu-ES.yml index 08e3eb6d1b..593994a251 100644 --- a/config/locales/eu-ES.yml +++ b/config/locales/eu-ES.yml @@ -307,6 +307,7 @@ eu-ES: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ eu-ES: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 8eaff121f6..74ab745c89 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -322,6 +322,7 @@ fi: initiated_by: Aloittaja other_party: "Toinen osapuoli" status: + conversation: ~ free: Keskustelu pending: Odottaa preauthorized: "Katevaraus tehty" @@ -357,6 +358,17 @@ fi: initiated: "Odottaa Stripe-maksua" pending_ext: "Odottaa Stripe-maksua" not_available: "Ei saatavilla" + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: "Muokkaa ilmoituskenttää '%{field_name}'" diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 245ccc05e4..e54867b08a 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -322,6 +322,7 @@ fr-CA: initiated_by: Initiateur other_party: "Autre participant" status: + conversation: ~ free: Conversation pending: "En attente" preauthorized: Pré-autorisée @@ -357,6 +358,17 @@ fr-CA: initiated: ~ pending_ext: ~ not_available: "Non disponible" + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: "Modifier le champ d'annonce '%{field_name}'" diff --git a/config/locales/fr.yml b/config/locales/fr.yml index c4457a97c5..1b6c9843c8 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -322,7 +322,8 @@ fr: initiated_by: Initiateur other_party: "Autre participant" status: - free: Conversation + conversation: Conversation + free: "Transaction gratuite" pending: "En attente" preauthorized: Pré-autorisée accepted: Acceptée @@ -333,7 +334,7 @@ fr: initiated: "En attente du paiement PayPal" pending_ext: "En attente du paiement PayPal" none: - free: Conversation + free: "Transaction gratuite" paypal: free: Conversation pending: "En attente" @@ -357,6 +358,17 @@ fr: initiated: "En attente du paiement Stripe" pending_ext: "En attente du paiement Stripe" not_available: "Non disponible" + conversations: + conversations: "Voir les conversations" + headers: + started_from: "Commencée le" + status: Statut + started: Commencée + last_activity: "Dernière activité" + initiated_by: Initiateur + other_party: "Autre participant" + participants: "Conversation : %{starter} avec %{author}" + profile: "Profil de %{author}" custom_fields: edit: edit_listing_field: "Modifier le champ d'annonce '%{field_name}'" diff --git a/config/locales/he-IL.yml b/config/locales/he-IL.yml index 1b8812c295..45d386a840 100644 --- a/config/locales/he-IL.yml +++ b/config/locales/he-IL.yml @@ -313,6 +313,7 @@ he-IL: initiated_by: ~ other_party: ~ status: + conversation: שיחה free: שיחה pending: ממתין preauthorized: "מורשה מראש" @@ -348,6 +349,17 @@ he-IL: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: "בדוק שיחות" + headers: + started_from: "התחיל מ" + status: סטאטוס + started: התחיל + last_activity: "פעילות אחרונה" + initiated_by: התחלה + other_party: "צד אחר" + participants: שיחה + profile: "‎%{author}‎ פרופיל" custom_fields: edit: edit_listing_field: "ערוך את ‎%{field_name}‎" diff --git a/config/locales/hi-IN.yml b/config/locales/hi-IN.yml index d6af38e32d..3219a43458 100644 --- a/config/locales/hi-IN.yml +++ b/config/locales/hi-IN.yml @@ -307,6 +307,7 @@ hi-IN: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ hi-IN: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/hr.yml b/config/locales/hr.yml index 007bcd4cb4..63e832a092 100644 --- a/config/locales/hr.yml +++ b/config/locales/hr.yml @@ -307,6 +307,7 @@ hr: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ hr: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 0a705d9e4c..e8cc4a4e5b 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -323,6 +323,7 @@ hu: initiated_by: Kezdő other_party: "Egyéb party" status: + conversation: ~ free: Üzenetváltás pending: Folyamatban preauthorized: "Előzetesen engedélyezett" @@ -358,6 +359,17 @@ hu: initiated: ~ pending_ext: ~ not_available: "Nem elérhető" + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: "Mező szerkesztése %{field_name}" diff --git a/config/locales/hy-AM.yml b/config/locales/hy-AM.yml index 360f17b044..66f34fdf9e 100644 --- a/config/locales/hy-AM.yml +++ b/config/locales/hy-AM.yml @@ -307,6 +307,7 @@ hy-AM: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ hy-AM: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/id.yml b/config/locales/id.yml index cbf37ef70e..cd4ad9821d 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -307,6 +307,7 @@ id: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ id: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/is.yml b/config/locales/is.yml index b74c166cee..414f4c089c 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -307,6 +307,7 @@ is: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ is: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/it.yml b/config/locales/it.yml index 66713ed15d..bf6c1308a8 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -307,6 +307,7 @@ it: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: "In corso" preauthorized: Preautorizzata @@ -342,6 +343,17 @@ it: initiated: ~ pending_ext: ~ not_available: "Non disponibile" + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 3e57907553..817436a971 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -317,6 +317,7 @@ ja: initiated_by: 買い手 other_party: 相手 status: + conversation: ~ free: 会話 pending: 保留中 preauthorized: 仮承認済み @@ -352,6 +353,17 @@ ja: initiated: ~ pending_ext: ~ not_available: ご利用できません + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: "「%{field_name}」項目を編集する" diff --git a/config/locales/ka.yml b/config/locales/ka.yml index d1b5859278..dda60600fe 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -317,6 +317,7 @@ ka: initiated_by: დამწყები other_party: "სხვა მხარე" status: + conversation: ~ free: მიმოწერა pending: "მოლოდინის რეჟიმში" preauthorized: "პრე ავტორიზებული" @@ -352,6 +353,17 @@ ka: initiated: ~ pending_ext: ~ not_available: "არ არის ხელმისაწვდომი" + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: "დაარედაქტირე ჩამონათვალის დარგი %{field_name}" diff --git a/config/locales/km-KH.yml b/config/locales/km-KH.yml index c232df0a0f..996bad3874 100644 --- a/config/locales/km-KH.yml +++ b/config/locales/km-KH.yml @@ -307,6 +307,7 @@ km-KH: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ km-KH: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 37d6d41312..d0a3dc6ec5 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -8,38 +8,48 @@ ko: admin: categories: edit: - edit_listing_category: ~ + edit_listing_category: "분류 '%{category}' 편집" index: - listing_categories: ~ - create_a_new_category: ~ - remove_category_confirmation: ~ - saving_order: ~ - save_order_successful: ~ - save_order_error: ~ + listing_categories: "목록 분류" + create_a_new_category: "+ 새로운 분류 추가" + remove_category_confirmation: "분류 '%{category_name}'을/를 정말로 삭제하시겠습니까?" + saving_order: "분류 순서 저장" + save_order_successful: "분류 순서가 저장되었습니다." + save_order_error: "분류 순서 저장 중 오류가 발생하였습니다. 페이지를 새로고침하신 후에 다시 시도하세요." new: - new_listing_category: ~ + new_listing_category: "새로운 분류" form: category_name: - category_title: ~ + category_title: "분류 이름" category_parent: - category_parent: ~ - no_parent: ~ + category_parent: "상위 분류" + no_parent: "상위 분류 없음" category_transaction_types: - transaction_types: ~ - transaction_types_description: ~ + transaction_types: "구매 종류" + transaction_types_description: "구매 종류는 이 분류의 목록들이 어떤 구매 절차를 따를 것인지 정합니다. 예를 들면, 판매만인지 아니면 대여 포함인지." select_all: ~ clear_all: ~ buttons: - save: ~ - cancel: ~ + save: 저장 + cancel: 취소 remove: - remove_category: ~ - remove_category_name: ~ - warning_remove_effects: ~ - select_new_category: ~ + remove_category: "분류 삭제" + remove_category_name: "분류 '%{category_name}' 삭제" + warning_remove_effects: "주의: 분류 '%{category_name}'를 삭제하시면 다음과 같은 영향이 있습니다:" + warning_listing_will_be_moved: + other: "해당 분류에 %{count}개의 목록이 있습니다. 해당 목록은 선택하신 분류로 옮겨집니다." + warning_custom_field_will_be_moved: + other: "해당 분류에 %{count}개의 커스텀 항목이 있습니다. 해당 항목은 선택하신 분류로 옮겨집니다." + warning_subcategory_will_be_removed: + other: "해당 분류에 %{count}개의 하위 분류가 있습니다. 해당 하위 분류도 삭제됩니다." + warning_with_subcategories_listing_will_be_moved: + other: "해당 분류와 하위 분류에 %{count}개의 목록이 있습니다. 해당 목록은 선택하신 분류로 옮겨집니다." + warning_with_subcategories_custom_field_will_be_moved: + other: "해당 분류와 하위 분류에 %{count}개의 커스텀 항목이 있습니다. 해당 항목은 선택하신 분류로 옮겨집니다." + select_new_category: "옮겨질 새로운 분류를 선택하세요:" buttons: - remove: ~ - cancel: ~ + remove: 삭제 + cancel: 취소 communities: edit_details: community_details: "기본 정보" @@ -50,21 +60,21 @@ ko: default_language: ~ language_selection_disabled: ~ community_name: "마켓플레이스 이름" - edit_community_name_description: ~ + edit_community_name_description: "마켓플레이스 이름입니다. 이메일 및 다양한 페이지에서 사용자에게 보여집니다." community_slogan: "마켓플레이스 슬로건" - edit_community_slogan_description: ~ + edit_community_slogan_description: "로그인하지 않은 사용자에게 마켓 플레이스 상단에 보여집니다. %{see_how_it_looks_like}." community_description: "마켓플레이스 설명" - edit_community_description_description: ~ + edit_community_description_description: "로그인하지 않은 사용자에게 마켓 플레이스 상단에 보여집니다. %{see_how_it_looks_like}." community_search_placeholder: ~ edit_community_search_placeholder_description: ~ - private_community_homepage_content: ~ - edit_private_community_homepage_content_description: ~ + private_community_homepage_content: "개인 마켓플레이스 홈페이지 컨텐츠" + edit_private_community_homepage_content_description: "이 컨텐츠는 개인 마켓플레이스에 로그인하지 않은 사용자에게 보여집니다. 당신의 마켓플레이스 및 가입 절차를 설명하실 수 있습니다. 이미지, 비디오, HTML 등의 컨턴츠를 추가하실 수 있습니다. %{see_how_it_looks_like}." update_information: "설정 저장" invite_people: "%{service_name}로 친구 초대" edit_signup_info: "등록 정보" edit_signup_info_description: "사용자가 신규 가입할 때 보여지는 내용입니다. 사용자에게 가입 안내와 초청장을 어디서 받을 수 있는가와 같은 정보를 제공합니다. 기본 설정에는 가입 안내가 제공되지 않습니다." - edit_info: ~ - see_how_it_looks_like: ~ + edit_info: "정보 변경" + see_how_it_looks_like: 미리보기 verification_to_post_listings_info_content: ~ verification_to_post_listings_info_content_description: ~ verification_to_post_listings_info_content_default: ~ @@ -94,11 +104,11 @@ ko: logo_instructions_text_with_dimensions_no_placing: ~ logo_icon_instructions_text_with_dimensions: "정사각형 로고는 모바일 화면 또는 페이스북을 통해 사이트를 공유할 때 사용됩니다. 가급적 %{width} x %{height}픽셀로 만들어주세요." logo_icon_instructions_text_with_dimensions_no_placing: ~ - cover_photo_visibility: ~ + cover_photo_visibility: "표지 이미지는 로그인하지 않은 사용자에게 보여지는 홈페이지에 나타납니다." cover_photo_instructions_text_with_dimensions: "이미지가 %{width} x %{height} 픽셀로 변경됩니다. 세로로 긴 이미지는 중간에서 잘립니다. %{see_how_it_looks_like}" - small_cover_photo_visibility: ~ - small_cover_photo_instructions_text_with_dimensions: ~ - main_content_width: ~ + small_cover_photo_visibility: "작은 표지 이미지는 로그인하지 않은 사용자에게 보여지는 홈페이지 이외의 모든 페이지에 나타납니다." + small_cover_photo_instructions_text_with_dimensions: "이미지가 %{width} x %{height} 픽셀로 변경됩니다. 세로로 긴 이미지는 중간에서 잘립니다." + main_content_width: "표지 사진은 가로 최대 %{main_width} 픽셀까지 허용됩니다. 또한, 작은 화면에서 표지 사진이 어떻게 보여지는지 확인하세요 (브라우저 창의 크기를 줄여서 확인 가능합니다)." custom_color1_instructions_text: "사용자 인터페이스의 메인 컬러를 컬러 코드를 입력하여 변경하실 수 있습니다. ColorPicker.com에서 컬러 코드를 확인하신 후 코드를 복사하여 사용하세요." new_listing_button_instructions_text: ~ default_browse_view: ~ @@ -307,6 +317,7 @@ ko: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,9 +353,20 @@ ko: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: - edit_listing_field: ~ + edit_listing_field: "항목 '%{field_name}' 편집" edit_price: description: ~ edit_price_field: ~ @@ -359,40 +381,40 @@ ko: enable: ~ form: field_required: - this_field_is_required: ~ + this_field_is_required: "새로운 목록 작성 시 필수 입력 항목으로 지정" this_field_is_required_checkbox: ~ search_filter: search_filter: ~ date_cant_be_filtered: ~ text_cant_be_filtered: ~ index: - listing_fields: ~ + listing_fields: "목록의 항목과 검색조건 설정" listing_fields_help: ~ - add_new_field: ~ - remove_field_confirmation: ~ - cancel: ~ - save: ~ - field_title: ~ - field_type: ~ - categories: ~ + add_new_field: "새로운 항목 추가" + remove_field_confirmation: "항목 %{field_name}을/를 정말 삭제하시겠습니까?" + cancel: 취소 + save: 저장 + field_title: "항목 이름" + field_type: "항목 종류" + categories: "해당 항목이 사용되는 목록의 분류" select_all: ~ clear_all: ~ options: ~ - add_option: ~ - saving_order: ~ - save_order_successful: ~ - save_order_error: ~ - select_one: ~ - continue: ~ + add_option: "+ 옵션 추가" + saving_order: "항목 순서 저장" + save_order_successful: "항목 순서를 저장하였습니다." + save_order_error: "항목 순서 저장 중 오류가 발생하였습니다. 페이지를 새로고침하신 후에 다시 시도하세요." + select_one: "항목 유형 선택" + continue: 계속하기 minimum_value: ~ maximum_value: ~ allow_decimals: ~ new: - new_listing_field: ~ + new_listing_field: "새로운 항목" field_types: text: ~ number: ~ - dropdown: ~ + dropdown: 드롭다운 checkbox_group: ~ date: ~ emails: @@ -592,15 +614,15 @@ ko: actions: ~ payments_not_enabled: ~ transaction_types: - sell: ~ - rent: ~ - give: ~ - lend: ~ - swap: ~ - service: ~ - request: ~ + sell: 판매 + rent: 대여 + give: 증정 + lend: 대여 + swap: 교환 + service: 제안 + request: 요청 inquiry: ~ - share_for_free: ~ + share_for_free: "무료 공유" default_action_button_labels: sell: ~ rent: ~ diff --git a/config/locales/lv.yml b/config/locales/lv.yml index bcaaaf6d3a..84d568f25e 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -307,6 +307,7 @@ lv: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ lv: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/mn.yml b/config/locales/mn.yml index 473f541675..37783980a4 100644 --- a/config/locales/mn.yml +++ b/config/locales/mn.yml @@ -307,6 +307,7 @@ mn: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ mn: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/ms-MY.yml b/config/locales/ms-MY.yml index 0f3a581ed8..df69be8e24 100644 --- a/config/locales/ms-MY.yml +++ b/config/locales/ms-MY.yml @@ -307,6 +307,7 @@ ms-MY: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ ms-MY: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/nb.yml b/config/locales/nb.yml index 8e187ea996..7099235de8 100644 --- a/config/locales/nb.yml +++ b/config/locales/nb.yml @@ -322,6 +322,7 @@ nb: initiated_by: "Startet av" other_party: "Andre part" status: + conversation: ~ free: Samtale pending: Venter preauthorized: Forhåndsautorisert @@ -357,6 +358,17 @@ nb: initiated: ~ pending_ext: ~ not_available: "Ikke tilgjengelig" + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: "Rediger annonse felt'%{field_name}'" diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 2ffd9d07de..34750891a3 100755 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -324,6 +324,7 @@ nl: initiated_by: Door other_party: "Andere partij" status: + conversation: ~ free: Conversatie pending: Hangende preauthorized: "Vooraf geauthoriseerd" @@ -359,6 +360,17 @@ nl: initiated: "In afwachting van Stripe betaling" pending_ext: "In afwachting van Stripe betaling" not_available: "Niet beschikbaar" + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: "Edit advertentie veld '%{field_name}'" diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 68fb9d6aa3..0eb70d6ecf 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -332,6 +332,7 @@ pl: initiated_by: Starter other_party: "Inna strona" status: + conversation: ~ free: Konwersacja pending: "W trakcie" preauthorized: Pre-autoryzacja @@ -367,6 +368,17 @@ pl: initiated: ~ pending_ext: ~ not_available: "Nie dostępne" + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: "Edytuje pole %{field_name} oferty" diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 9ada378ae0..2f07bdb0ee 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -322,6 +322,7 @@ pt-BR: initiated_by: Iniciante other_party: "Outra parte" status: + conversation: ~ free: "Mensagem livre" pending: Pendente preauthorized: "Pagamento efetuado com sucesso" @@ -357,6 +358,17 @@ pt-BR: initiated: ~ pending_ext: ~ not_available: Indisponível + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: "Alterar anúncio '%{field_name}'" diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index c1454135bb..583864764c 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -313,6 +313,7 @@ pt-PT: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -348,6 +349,17 @@ pt-PT: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: "Alterar anúncio '%{field_name}'" diff --git a/config/locales/ro.yml b/config/locales/ro.yml index b79af78ce4..b8339a83be 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -307,6 +307,7 @@ ro: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ ro: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 4d4a75acad..6d308d95ce 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -332,6 +332,7 @@ ru: initiated_by: Создатель other_party: "Другая сторона" status: + conversation: ~ free: Диалог pending: Ожидание preauthorized: Предавторизация @@ -367,6 +368,17 @@ ru: initiated: ~ pending_ext: ~ not_available: "Не доступно" + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: "Редактировать поле публикации \"%{field_name}\"" diff --git a/config/locales/sk-SK.yml b/config/locales/sk-SK.yml index 285124184b..6372b51208 100644 --- a/config/locales/sk-SK.yml +++ b/config/locales/sk-SK.yml @@ -327,6 +327,7 @@ sk-SK: initiated_by: Zahájené other_party: "Ďalšia strana" status: + conversation: ~ free: Konverzácia pending: "Čaká na vybavenie" preauthorized: Predschválené @@ -362,6 +363,17 @@ sk-SK: initiated: ~ pending_ext: ~ not_available: "Teraz k dispozicií" + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: "Upraviť pole inzerátu '%{field_name}'" diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 8c42a53b50..f75036dc90 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -307,6 +307,7 @@ sl: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ sl: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/sq-AL.yml b/config/locales/sq-AL.yml index 25809a8640..f92dab3f1e 100644 --- a/config/locales/sq-AL.yml +++ b/config/locales/sq-AL.yml @@ -307,6 +307,7 @@ sq-AL: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ sq-AL: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 941b9632d9..c994ffc03b 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -307,6 +307,7 @@ sr: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ sr: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 1244779859..a6672c03f3 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -75,7 +75,7 @@ sv: private_community_homepage_content: "Privat marknadsplats startsidans innehåll" edit_private_community_homepage_content_description: "Detta visas på startsidan av den privata marknadsplatsen för användarna som inte är inloggade. Här kan du beskriva din marknadsplats och processen hur man går med. Du kan även lägga till bilder, videos och HTML-innehåll här. %{see_how_it_looks_like}" update_information: "Spara inställningar" - invite_people: "Bjud in nya användare" + invite_people: "Bjud in nya användare till %{service_name}" edit_signup_info: Registreringsinformation edit_signup_info_description: "Detta är en infotext som kan visas till användarna på registreringssidan. Där kan du ge användarna instruktioner för hur man registrerar sig, information hur du får en inbjudan osv. Som standard så finns det inga instruktioner." edit_info: "Redigera information" @@ -114,7 +114,7 @@ sv: small_cover_photo_visibility: "Liten omslagsbild visas på alla sidor förutom på startsidan för ej inloggade användare." small_cover_photo_instructions_text_with_dimensions: "Bilden kommer att skalas ner till %{width}x%{height} pixlar och större bilder kommer att beskäras i mitten." main_content_width: "När du väljer en omslagsbild så notera att huvudsidans innehåll är %{main_width} pixlar brett som mest. Kom även ihåg att se hur omslagsbilden ser ut på mindre skärmar (t ex så kan du göra din webbläsares fönster mindre)." - custom_color1_instructions_text: "Du kan ändra huvudfärgen på användargränssnittet genom att skriva in ett hex-värde. ColorPicker.com kan hjälpa dig att välja en färg och kopiera koden här." + custom_color1_instructions_text: "Du kan ändra huvudfärgen på användargränssnittet genom att skriva in ett hex-värde. ColorPicker.com kan hjälpa dig att välja en färg och du kan sendan kopiera koden här." new_listing_button_instructions_text: "Du kan ändra färgen på \"Skapa ny annons\" knappen genom att sätta in ett hex färgvärde. %{link_to_colorpicker} kan hjälpa dig att välja färg och ge dig hexvärdet. Du kan sedan kopiera koden hit." default_browse_view: "Standard bläddervy" default_browse_view_instructions_text: "Standard visningsläge används på startsidan för att se hur annonserna visas som standard." @@ -225,8 +225,8 @@ sv: google_analytics_key: "Google Analytics tracking ID" twitter_handle: "Twitter handtag (används med twitterknappen på annonssidan)" update_settings: "Spara inställningar" - automatically_confirmed_no_escrow: "Transaktionen kommer automatiskt att markeras som klar %{days_dropdown} dagar efter att betalningen gjorts" - automatically_confirmed_no_escrow_stripe_info: "För transaktioner porcesserade med Stripe är utbetalningen till säljarna fördröjd tills förfrågan har marketats som klar. %{learn_more}" + automatically_confirmed_no_escrow: "Transaktionen kommer automatiskt att markeras som slutförd %{days_dropdown} dagar efter att betalningen gjorts" + automatically_confirmed_no_escrow_stripe_info: "För transaktioner porcesserade med Stripe är utbetalningen till säljarna fördröjd tills förfrågan har marketats som slutförd. %{learn_more}" automatic_newsletter_frequency: "Skicka automatiskt nyhetsbrev: %{frequency_dropdown}" newsletter_daily: Dagligen newsletter_weekly: Veckovis @@ -322,6 +322,7 @@ sv: initiated_by: Startar other_party: Motpart status: + conversation: ~ free: Konversation pending: Väntar preauthorized: Auktoriserad @@ -357,6 +358,17 @@ sv: initiated: "Väntar på Stripe betalning" pending_ext: "Väntar på Stripe betalning" not_available: "Inte tillgänglig" + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: "Redigera annonsfält %{field_name}" @@ -738,11 +750,11 @@ sv: shipping_price_label: "Frakt:" stripe-fee_label: Betalningshanteringsavgift confirm: - confirm_description: "Om din förfrågan har uppfyllts ska du bekräfta den som klar. Då kan du ge din feedback till den andra parten." - cancel_description: "Om din förfrågan inte har uppfyllts så kan du markera som \"hände inte\". Du kan ändå ge feedback till den andra parten och beskriva vad som hände." + confirm_description: "Om din förfrågan har uppfyllts ska du bekräfta den som slutförd. Då kan du ge din feedback till den andra parten." + cancel_description: "Om din förfrågan inte har uppfyllts så kan du markera som \"Avbryten\" och kontakta den andra partern. Du kan ändå ge feedback till den andra parten och beskriva vad som hände." cancel_payed_description: "Om din förfrågan var accepterad men du har några andra funderingar, så kan du fortfarande avbryta förfrågan innan betalning." canceling_payed_transaction: "Avbryt transaktion" - confirm: "Markera klar" + confirm: "Markera som slutförd" cancel: Avbryt continue: Forsätt give_feedback_to: "Lämna feedback till %{person_link}" @@ -762,8 +774,8 @@ sv: accepted_offer: "Erbjudande accepterades." rejected_request: "Förfrågan avslagen." rejected_offer: "Erbjudande nekades." - confirmed_request: "Förfrågan klar." - confirmed_offer: "Erbjudande klar." + confirmed_request: "Förfrågan är slutförd" + confirmed_offer: "Erbjudandet avslutat." canceled_request: "Förfrågan avbruten." canceled_offer: "Erbjudande avbrutet." message_from: "Meddelande från %{person}" @@ -776,8 +788,8 @@ sv: accepted_offer: "acceptera erbjudandet" rejected_request: "avslagit förfrågan" rejected_offer: "avslagit erbjudandet" - confirmed_request: "Markerat förfrågan som klar" - confirmed_offer: "markerat erbjudandet som klar" + confirmed_request: "markerat förfrågan som slutförd" + confirmed_offer: "markerat erbjudandet som avklarat" canceled_request: "avbröt förfrågan" canceled_offer: "avbröt erbjudandet" paid: "Betalt %{sum}" @@ -819,7 +831,7 @@ sv: offer_accepted: Godkänt offer_rejected: Avslagen offer_canceled: Avbruten - offer_confirmed: Klar + offer_confirmed: Slutfört offer_paid: "Betalning lyckad" offer_preauthorized: "Betalning lyckad" offer_waiting_for_payment: "Väntar på att %{requester_name} ska betala" @@ -835,7 +847,7 @@ sv: waiting_for_listing_author_to_deliver_listing: "Väntar på att %{listing_author_name} ska skicka %{listing_title}" request_accepted: Godkänt request_rejected: Avslagen - request_confirmed: Klar + request_confirmed: Slutfört request_canceled: Avbruten request_paid: "Betalning lyckad" request_preauthorized: "Betalning lyckad" @@ -843,8 +855,8 @@ sv: waiting_for_listing_author_to_accept_offer: "Väntar på att %{listing_author_name} ska acceptera erbjudandet" waiting_for_listing_author_to_accept_request: "Väntar på att %{listing_author_name} ska acceptera förfrågan. Så snart %{listing_author_name} accepterar så kommer du att bli debiterad." waiting_for_you_to_accept_request: "Väntar på att du ska acceptera förfrågan" - waiting_confirmation_from_requester: "Väntar på att %{requester_name} ska markera förfrågan klar" - waiting_confirmation_from_you: "Väntar på att du ska markera förfrågan som klar" + waiting_confirmation_from_requester: "Väntar på att %{requester_name} ska markera förfrågan slutförd" + waiting_confirmation_from_you: "Väntar på att du ska markera förfrågan som slutförd" waiting_payment_from_requester: "Väntar på att %{requester_name} ska betala" waiting_payment_from_you: "Väntar på att du ska betala" waiting_feedback_from_you: "Väntar på att du ska ge feedback" @@ -863,7 +875,7 @@ sv: accept_preauthorized_request: "Acceptera förfrågan" reject_preauthorized_offer: "Inte den här gången" reject_preauthorized_request: "Inte den här gången" - confirm: "Markera klar" + confirm: "Markera slutförd" cancel: Avbryt feedback: feedback_subject: "Ny feedback från %{service_name}" @@ -905,11 +917,11 @@ sv: create_own: "Vill du skapa din egeb online marknadsplats som %{service_name}? %{learn_more}." learn_more: "Lär dig mera" confirm_reminder: - you_have_not_yet_confirmed_or_canceled_request: "Du har inte än bekräftat eller avbrutit förfrågan %{request_link}. Om förfrågan är klar så måste du bekräfta det. Efter det så kan du lämna feedback till %{other_party_given_name}." + you_have_not_yet_confirmed_or_canceled_request: "Du har inte ännu bekräftat eller avbrutit förfrågan %{request_link}. Om förfrågan är uppfylld så måste du bekräfta den. Efter det så kan du lämna feedback till %{other_party_given_name}." remember_to_confirm_request: "Kom ihåg att godkänna eller avbryta din förfrågan" - if_will_not_happen_you_should_cancel: "Om du tror att förfrågan inte skulle bli klar för någon anledning så kan du %{cancel_it_link}." + if_will_not_happen_you_should_cancel: "Om du tror att förfrågan inte kommer uppfyllas för någon anledning så kan du %{cancel_it_link}." cancel_it_link_text: "avbryt den" - automatic_confirmation: "Om du inte accepterar eller avbryter förfrågan inom %{days_to_automatic_confirmation} dagar efter förfrågan var accepterad så kommer den automatiskt markeras som klar." + automatic_confirmation: "Om du inte accepterar eller avbryter förfrågan inom %{days_to_automatic_confirmation} dagar efter förfrågan var accepterad så kommer den automatiskt markeras som slutförd." payment_settings_reminder: remember_to_add_payment_details: "Kom ihåg att ange betalningsdetaljer för att få betalt." you_have_added_listing_with_payment: "Du har skapat annons %{listing_link} med betalning. Men du har inte angett dina betalningsdetaljer. För att du ska kunna få betalt så måste du lägga till betalningsinformationen." @@ -917,18 +929,18 @@ sv: payment_settings_link: betalningsinställningar transaction_confirmed: here_is_a_message_from: "Här är ett meddelande från %{other_party_given_name}:" - request_marked_as_confirmed: "Förfrågan klar - kom ihåg att ge feedback" + request_marked_as_confirmed: "Förfrågan slutförd - kom ihåg att ge feedback" request_marked_as_canceled: "Förfrågan avbruten" - has_marked_request_as_confirmed: "%{other_party_full_name} har markerat denna förfrågan om %{request} som klar. Du kan nu ge feedback till %{other_party_given_name}." + has_marked_request_as_confirmed: "%{other_party_full_name} har markerat denna förfrågan om %{request} som slutförd. Du kan nu ge feedback till %{other_party_given_name}." has_marked_request_as_canceled: "%{other_party_full_name} har avbrutit förfrågan om %{request}. Du kan fortfarande ge feedback till %{other_party_given_name}." giving_feedback_is_good_idea: "Att ge feedback är alltid en bra idé. Om något gick bra så borde du låta andra få veta att %{other_party_given_name} är trovärdig. Om det blev något problem så är det bra att nämna det också." give_feedback_to: "Ge feedback till %{other_party_given_name}" transaction_automatically_confirmed: - subject: "Förfrågan är klar - kom ihåg att ge feedback" - we_have_marked_request_as_confirmed: "Vi har markerat förfrågan om %{request} klar. Förfrågan blev automatisk klar eftersom %{days_passed} har passerat sedan förfrågan accepterades." + subject: "Förfrågan har automatiskt marketats som slutförd - kom ihåg att ge feedback" + we_have_marked_request_as_confirmed: "Vi har markerat förfrågan om %{request} som slutförd. Förfrågan blev automatisk markerad som slutförd eftersom %{days_passed} har passerat sedan förfrågan accepterades." booking_transaction_automatically_confirmed: - subject: "Förfrågan är klar - kom ihåg att ge feedback" - we_have_marked_request_as_confirmed: "Du har markerat förfrågan om %{request} som klar. Förfrågan blev automatiskt klar eftersom en dag har passerat sen bokningsperioden slutade." + subject: "Förfrågan var automatiskt markerad som slutförd - kom ihåg att ge feedback" + we_have_marked_request_as_confirmed: "Vi har markerat förfrågan om %{request} som slutförd. Förfrågan blev automatiskt markerad som slutförd eftersom en dag har passerat sen bokningsperioden slutade." automatically_confirmed_footer: giving_feedback_is_good_idea: "Du kan nu ge feedback till %{other_party_given_name}. Att ge feedback är alltid en bra idé. Om något gick bra så borde du låta andra få veta att %{other_party_given_name} är trovärdig. Om det blev något problem så är det bra att nämna det också." give_feedback_to: "Ge feedback till %{other_party_given_name}" @@ -963,7 +975,7 @@ sv: your_request_was_rejected: "Din förfrågan avslogs" you_can_now_pay_to: "Du kan nu betala det begärda beloppet till %{payment_receiver}." pay_now: "Betala nu" - remember_to_confirm: "När förfrågan är uppfylld, kom ihåg att markera den som klar. Om förfrågan inte är uppfylld så har du %{days_to_automatic_confirmation} dagar som du kan avbryta den. Annars vill den automatiskt markeras som klar." + remember_to_confirm: "När förfrågan är uppfylld, kom ihåg att markera den som slutförd. Om förfrågan inte är uppfylld så har du %{days_to_automatic_confirmation} dagar på dig att avbryta den. Annars kommer den att automatiskt markeras som slutförd." invitation_to_kassi: hi: Hej! you_have_been_invited_to_kassi: "%{inviter} har bjudit in dig till %{service_name}." @@ -1009,7 +1021,7 @@ sv: service_fee: Serviceavgift stripe_gateway_fee: "Stripes avgift:" paypal_gateway_fee: "PayPals avgift:" - money_will_be_transferred: "Pengarna kommer att överföras till %{recipient_name} när a) du har markerat förfrågan som klar eller b)%{automatic_confirmation_days} dagar har passerat sedan du betalade." + money_will_be_transferred: "Pengarna kommer att överföras till %{recipient_name} när a) du har markerat förfrågan som slutförd eller b)%{automatic_confirmation_days} dagar har passerat sedan du betalade." paypal_new_payment: paypal_gateway_fee: "PayPals avgift:" shipping_total: "Frakt:" @@ -1031,7 +1043,7 @@ sv: service_fee: Serviceavgift stripe_gateway_fee: "Stripes avgift:" paypal_gateway_fee: "PayPals avgift:" - money_will_be_transferred: "Pengarna kommer att överföras till %{recipient_name} när a) du har markerat förfrågan som klar eller b)%{automatic_confirmation_days} dagar har passerat sedan du betalade." + money_will_be_transferred: "Pengarna kommer att överföras till %{recipient_name} när a) du har markerat förfrågan som slutförd eller b)%{automatic_confirmation_days} dagar har passerat sedan du betalade." new_testimonial: has_given_you_feedback_in_kassi: "%{name} har givit dig feedback på %{service_name}" you_can_give_feedback_to: "Du har inget gett feedback till %{name}." @@ -1279,7 +1291,7 @@ sv: this_article_link: "denna artikel" invitation_emails_field_placeholder: "kompis1@exempel.com, kompis2@exempel.com, ..." invitation_message_field_placeholder: "Jag gick med denna fantastiska marknadsplats. Det borde du också göra!" - errors_in_emails: "Kontrollera att e-postadresserna som du la till är giltiga. Om du la till flera adresser, kontrollera så att de är separerade med kommatecken." + errors_in_emails: "Kontrollera att e-postadresserna som du lade till är giltiga och inte innehåller några otillåtna tecken. Om du lade till flera adresser, kontrollera så att de är separerade med kommatecken." list_item: review: granska reviews: recensioner @@ -1435,7 +1447,7 @@ sv: news_item_updated: "Artikel uppdaterad" news_item_deleted: "Artikel borttagen" offer_accepted: "Erbjudande accepterades" - offer_confirmed: "Erbjudande bekräftat" + offer_confirmed: "Erbjudandet bekräftat" offer_closed: "Erbjudande stängt" listing_created_successfully: "Annonsen skapades. %{new_listing_link}." offer_rejected: "Erbjudandet nekades" @@ -1467,7 +1479,7 @@ sv: reply_cannot_be_empty: "Du kan inte skicka ett tomt meddelande" reply_sent: "Svar skickades" request_accepted: "Förfrågan accepterad" - request_confirmed: "Förfrågan klar" + request_confirmed: "Förfrågan slutförd" request_rejected: "Förfrågan avslagen" request_canceled: "Förfrågan avbruten" message_sent: "Meddelande skickat" @@ -1661,7 +1673,7 @@ sv: privacy: privacy: Sekretess private: "Privat (bara synlig för inloggade användare)" - public: "Publik (synlig för ej inloggade användare)" + public: "Publik (synlig för icke inloggade användare)" help_texts: help_share_type_title: "Typ av erbjudande eller förfrågan" help_tags_title: Taggar @@ -2064,11 +2076,11 @@ sv: status_confirmed: Bekräftad status_pending: Väntar notifications: - email_from_admins: "Jag är villig att ta emot sporadiska uppdateringar från administratören." + email_from_admins: "Jag är villig att ta emot enstaka uppdateringar från administratören.n" i_want_to_get_email_notification_when: "Jag vill få e-post aviseringar när..." newsletters: "Epost meddelanden från administratörer" community_updates: Nyhetsbrev - email_about_confirm_reminders: "...jag har glömt att bekräfta en förfrågan som avslutad" + email_about_confirm_reminders: "...jag har glömt att bekräfta en förfrågan som slutförd" email_about_new_comments_to_own_listing: "...någon kommenterar mitt erbjudande eller efterfrågan" email_about_new_messages: "...någon skickar mig ett meddelande" email_about_new_received_testimonials: "...någon ger mig feedback" @@ -2078,7 +2090,7 @@ sv: do_not_email_community_updates: "Skicka mig inte nyhetsbrev" email_when_conversation_accepted: "...någon accepterar mitt erbjudande eller efterfrågan" email_when_conversation_rejected: "...någon avböjer mitt erbjudande eller efterfrågan" - email_about_completed_transactions: "...när någon markerat mitt erbjudande som klar" + email_about_completed_transactions: "...någon markerar min förfrågan som slutförd" email_about_new_payments: "...jag har fått en ny betalning" email_about_new_listings_by_followed_people: "...någon jag följer har skapat en annons" unsubscribe_succesful: "Avprenumeration lyckades" diff --git a/config/locales/sw.yml b/config/locales/sw.yml index 3035769128..efb870a4d3 100644 --- a/config/locales/sw.yml +++ b/config/locales/sw.yml @@ -307,6 +307,7 @@ sw: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ sw: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/ta-IN.yml b/config/locales/ta-IN.yml index 52dd626f5a..5ef2cd71fa 100644 --- a/config/locales/ta-IN.yml +++ b/config/locales/ta-IN.yml @@ -307,6 +307,7 @@ ta-IN: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ ta-IN: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/th-TH.yml b/config/locales/th-TH.yml index cf3e6f1739..0dbaf46cf3 100644 --- a/config/locales/th-TH.yml +++ b/config/locales/th-TH.yml @@ -317,6 +317,7 @@ th-TH: initiated_by: ตัวเริ่ม other_party: กลุ่มอื่น status: + conversation: ~ free: การสนทนา pending: กำลังรอดำเนินการ preauthorized: ให้อนุญาตมาก่อนแล้ว @@ -352,6 +353,17 @@ th-TH: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: "แก้ไขข้อมูลรายการ '%{field_name}'" diff --git a/config/locales/ti.yml b/config/locales/ti.yml index c9086dae4b..7104ba724a 100644 --- a/config/locales/ti.yml +++ b/config/locales/ti.yml @@ -307,6 +307,7 @@ ti: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ ti: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/tr-TR.yml b/config/locales/tr-TR.yml index d93138eb13..a8f42f715e 100644 --- a/config/locales/tr-TR.yml +++ b/config/locales/tr-TR.yml @@ -319,6 +319,7 @@ tr-TR: initiated_by: Başlatan other_party: "Diğer taraf" status: + conversation: ~ free: Konuşma pending: Bekleyen preauthorized: "İzin verilmiş" @@ -354,6 +355,17 @@ tr-TR: initiated: ~ pending_ext: ~ not_available: "Mevcut değil" + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: "'%{field_name}' listeleme alanını düzenle" diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 757b3406c5..d96ad97216 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -307,6 +307,7 @@ uk: initiated_by: ~ other_party: ~ status: + conversation: ~ free: ~ pending: ~ preauthorized: ~ @@ -342,6 +343,17 @@ uk: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 78854e9399..8fe68f8744 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -317,6 +317,7 @@ vi: initiated_by: "Người khởi xướng" other_party: "Bên thứ 3" status: + conversation: ~ free: ~ pending: "Đang chờ xử lý" preauthorized: "Được phép" @@ -352,6 +353,17 @@ vi: initiated: "Đang chờ thanh toán Stripe" pending_ext: "Đang chờ thanh toán Stripe" not_available: "Lịch bận" + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: "Chỉnh sửa trường liệt kê %{field_name}" diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index 0ed7c79d2e..45d6269cc4 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -317,6 +317,7 @@ zh-HK: initiated_by: 發起人 other_party: 其他參與者 status: + conversation: ~ free: 對話 pending: 等待中 preauthorized: 已預先授權 @@ -352,6 +353,17 @@ zh-HK: initiated: ~ pending_ext: ~ not_available: ~ + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: ~ diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 8990aec805..b0e8cba417 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -317,6 +317,7 @@ zh-TW: initiated_by: 发起者 other_party: 其他参与方 status: + conversation: ~ free: 会话 pending: 待定 preauthorized: 预授权的 @@ -352,6 +353,17 @@ zh-TW: initiated: ~ pending_ext: ~ not_available: 无 + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: "编辑信息字段“%{field_name}”" diff --git a/config/locales/zh.yml b/config/locales/zh.yml index a60e395726..e3f1b9ffbe 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -317,6 +317,7 @@ zh: initiated_by: 发起者 other_party: 其他参与方 status: + conversation: ~ free: 会话 pending: 待定 preauthorized: 预授权的 @@ -352,6 +353,17 @@ zh: initiated: ~ pending_ext: ~ not_available: 无 + conversations: + conversations: ~ + headers: + started_from: ~ + status: ~ + started: ~ + last_activity: ~ + initiated_by: ~ + other_party: ~ + participants: ~ + profile: ~ custom_fields: edit: edit_listing_field: "编辑信息字段“%{field_name}”" From 8c9005da72dcb3d4cb7deb1d105f59649d4cc7fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aivils=20=C5=A0toss?= Date: Tue, 12 Dec 2017 17:48:35 +0200 Subject: [PATCH 022/131] Paypal IPN - commission denied --- app/services/paypal_service/data_types/ipn.rb | 33 ++++++++ app/services/paypal_service/ipn.rb | 3 +- .../paypal_service/store/paypal_payment.rb | 19 +++-- spec/factories.rb | 16 ++++ .../handle_paypal_ipn_message_job_spec.rb | 77 +++++++++++++++++++ 5 files changed, 140 insertions(+), 8 deletions(-) create mode 100644 spec/jobs/handle_paypal_ipn_message_job_spec.rb diff --git a/app/services/paypal_service/data_types/ipn.rb b/app/services/paypal_service/data_types/ipn.rb index 50fef85549..e3e0ee883d 100644 --- a/app/services/paypal_service/data_types/ipn.rb +++ b/app/services/paypal_service/data_types/ipn.rb @@ -158,6 +158,15 @@ module IPN [:invnum, :string, :mandatory] ) + CommissionDenied = EntityUtils.define_builder( + [:type, const_value: :commission_denied], + [:commission_status, :string, :mandatory], + [:commission_payment_id, :string, :mandatory], + [:commission_total, :money, :mandatory], + [:commission_fee_total, :money, :mandatory], + [:invnum, :string, :mandatory] + ) + CommissionPendingExt = EntityUtils.define_builder( [:type, const_value: :commission_pending_ext], [:commission_status, :string, :mandatory], @@ -181,6 +190,7 @@ def create_payment_pending_ext(opts); PaymentPendingExt.call(opts) end def create_payment_voided(opts); PaymentVoided.call(opts) end def create_payment_denied(opts); PaymentDenied.call(opts) end def create_commission_paid(opts); CommissionPaid.call(opts) end + def create_commission_denied(opts); CommissionDenied.call(opts) end def create_commission_pending_ext(opts); CommissionPendingExt.call(opts) end def from_params(params) @@ -200,6 +210,8 @@ def from_params(params) to_commission_pending_ext(p) when :commission_paid to_commission_paid(p) + when :commission_denied + to_commission_denied(p) when :payment_completed to_payment_completed(p) when :payment_refunded @@ -250,6 +262,8 @@ def msg_type(txn_type, payment_status, pending_reason, invoice_num) return :payment_refunded elsif status == "voided" return :payment_voided + elsif status == "denied" && inv_type == :commission + return :commission_denied elsif status == "denied" return :payment_denied else @@ -424,6 +438,25 @@ def to_commission_paid(params) end private_class_method :to_commission_paid + def to_commission_denied(params) + p = HashUtils.rename_keys( + { + invoice: :invnum, + txn_id: :commission_payment_id, + payment_status: :commission_status + }, + params + ) + + mc_fee = params[:mc_fee] ? params[:mc_fee] : 0 + create_commission_denied( + p.merge({ + commission_total: to_money(params[:mc_gross], params[:mc_currency]), + commission_fee_total: to_money(mc_fee, params[:mc_currency]) + })) + end + private_class_method :to_commission_denied + def to_commission_pending_ext(params) p = HashUtils.rename_keys( { diff --git a/app/services/paypal_service/ipn.rb b/app/services/paypal_service/ipn.rb index 1b4d0c4ac5..444de7a2c4 100644 --- a/app/services/paypal_service/ipn.rb +++ b/app/services/paypal_service/ipn.rb @@ -17,6 +17,7 @@ def initialize(events) :payment_voided, :payment_denied, :commission_paid, + :commission_denied, :commission_pending_ext ] @@ -63,7 +64,7 @@ def handle_payment_update(ipn_msg) end def identity_opts(ipn_msg) - if [:commission_paid, :commission_pending_ext].include?(ipn_msg[:type]) + if [:commission_paid, :commission_pending_ext, :commission_denied].include?(ipn_msg[:type]) { community_id: Invnum.community_id(ipn_msg[:invnum]), transaction_id: Invnum.transaction_id(ipn_msg[:invnum]) } else { authorization_id: ipn_msg[:authorization_id], order_id: ipn_msg[:order_id] } diff --git a/app/services/paypal_service/store/paypal_payment.rb b/app/services/paypal_service/store/paypal_payment.rb index cf7169f5df..07aef67fb3 100644 --- a/app/services/paypal_service/store/paypal_payment.rb +++ b/app/services/paypal_service/store/paypal_payment.rb @@ -124,13 +124,18 @@ def from_model(paypal_payment) end def find_payment(opts) - PaypalPaymentModel.where( - "(community_id = ? and transaction_id = ?) or authorization_id = ? or order_id = ?", - opts[:community_id], - opts[:transaction_id], - opts[:authorization_id], - opts[:order_id] - ).first + commission_payment_id = opts[:data].try(:[], :commission_payment_id) + if commission_payment_id + PaypalPaymentModel.where(commission_payment_id: commission_payment_id).first + else + PaypalPaymentModel.where( + "(community_id = ? and transaction_id = ?) or authorization_id = ? or order_id = ?", + opts[:community_id], + opts[:transaction_id], + opts[:authorization_id], + opts[:order_id] + ).first + end end def data_changed?(old_data, new_data) diff --git a/spec/factories.rb b/spec/factories.rb index 874f4df936..32cdc551a2 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -425,4 +425,20 @@ def build_association(association, opts = {}) build_association(:community) email 'sherry@example.com' end + + factory :paypal_ipn_message do + body {} + status nil + end + + factory :paypal_payment do + community_id 123 + transaction_id 321 + payer_id 'ABC' + receiver_id 'DEF' + merchant_id 'ZZZ' + currency 'EUR' + payment_status 'pending' + commission_status 'pending' + end end diff --git a/spec/jobs/handle_paypal_ipn_message_job_spec.rb b/spec/jobs/handle_paypal_ipn_message_job_spec.rb new file mode 100644 index 0000000000..f8bc7e502d --- /dev/null +++ b/spec/jobs/handle_paypal_ipn_message_job_spec.rb @@ -0,0 +1,77 @@ +require "spec_helper" + +RSpec.describe HandlePaypalIpnMessageJob, type: :job do + let(:community) { FactoryGirl.create(:community) } + let(:transaction_process) { FactoryGirl.create(:transaction_process) } + let(:listing) { + FactoryGirl.create(:listing, community_id: community.id, + listing_shape_id: 123, + transaction_process_id: transaction_process.id) + } + let(:transaction) { FactoryGirl.create(:transaction, community: community, listing: listing, current_state: 'initiated') } + + context '#perform' do + it 'performs errored IPN message - commission denied' do + body = { + "mp_custom"=>"", + "mc_gross"=>"50", + "invoice"=>"#{community.id}-#{transaction.id}-commission", + "mp_currency"=>"USD", + "protection_eligibility"=>"Ineligible", + "item_number1"=>"0", + "payer_id"=>"EX3M7RJJ7ZZZZ", + "tax"=>"0", + "payment_date"=>"06:30:30 Oct 27, 2017 PDT", + "mp_id"=>"B-3Y387433BA753ZZZZ", + "payment_status"=>"Denied", + "charset"=>"windows-1252", + "mc_shipping"=>"0", + "mc_handling"=>"0", + "first_name"=>"Yosaton", + "mp_status"=>"0", + "notify_version"=>"3.8", + "custom"=>"", + "payer_status"=>"verified", + "business"=>"nicolas@example.com", + "num_cart_items"=>"1", + "mc_handling1"=>"0", + "verify_sign"=>"AESWI3GOfTYxKEwR5JMr8czKZUNdAmmdH4DvHAk5Ho8YBr1SUtSTZZZZ", + "payer_email"=>"y.smith@example.com", + "mc_shipping1"=>"0", + "tax1"=>"0", + "txn_id"=>"4N811936LY433ZZZZ", + "payment_type"=>"instant", + "last_name"=>"Smith", + "mp_desc"=>"Grant Trezure permission to charge a transaction fee.", + "item_name1"=>"Commission payment for Christmas Tree", + "receiver_email"=>"nicolas@example.com", + "mp_cycle_start"=>"15", + "quantity1"=>"1", + "receiver_id"=>"8WAHAZYS5ZZZZ", + "txn_type"=>"merch_pmt", + "mc_gross_1"=>"50", + "mc_currency"=>"JPY", + "residence_country"=>"US", + "transaction_subject"=>"Marketplace vetterview took this commission from transaction regarding Christmas Tree", + "payment_gross"=>"", + "ipn_track_id"=>"22d763a05cccc", + "controller"=>"paypal_ipn", + "action"=>"ipn_hook" + } + paypal_ipn_message = FactoryGirl.create(:paypal_ipn_message, body: body, status: 'errored') + paypal_payment = FactoryGirl.create(:paypal_payment, + community_id: community.id, + transaction_id: transaction.id, + payment_status: 'completed', + pending_reason: 'none', + commission_payment_id: body["txn_id"]) + + expect(paypal_payment.payment_status).to eq 'completed' + expect(paypal_payment.commission_status).to eq 'pending' + HandlePaypalIpnMessageJob.new(paypal_ipn_message.id).perform + paypal_payment.reload + expect(paypal_payment.payment_status).to eq 'completed' + expect(paypal_payment.commission_status).to eq 'denied' + end + end +end From ac846b799feb4ad49535008c181c82d67e5fb867 Mon Sep 17 00:00:00 2001 From: Luis-RG Date: Tue, 12 Dec 2017 22:16:30 +0200 Subject: [PATCH 023/131] adds icons to CLP file --- app/views/landing_page/_icon.erb | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/app/views/landing_page/_icon.erb b/app/views/landing_page/_icon.erb index 5948144d19..5702ccffb6 100644 --- a/app/views/landing_page/_icon.erb +++ b/app/views/landing_page/_icon.erb @@ -76,6 +76,9 @@ <% when "basket-1" %> +<% when "basket-remove" %> + + <% when "beach" %> @@ -373,6 +376,9 @@ <% when "garage" %> +<% when "glasses-round-1" %> + + <% when "globe-1" %> @@ -445,6 +451,12 @@ <% when "house-search-1" %> +<% when "id-card-2" %> + + +<% when "inbox-heart" %> + + <% when "island" %> @@ -544,9 +556,15 @@ <% when "network-computers-1" %> +<% when "network-user" %> + + <% when "noodle-bowl" %> +<% when "party-mask" %> + + <% when "party-popper" %> From 03a13f99ebc673d2b73e57d6cf57bd211954f290 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aivils=20=C5=A0toss?= Date: Wed, 13 Dec 2017 11:25:11 +0200 Subject: [PATCH 024/131] Paypal IPN - adjustment --- app/services/paypal_service/data_types/ipn.rb | 27 +++++++++++ app/services/paypal_service/ipn.rb | 3 +- .../paypal_service/store/paypal_payment.rb | 27 ++++++----- spec/factories.rb | 2 +- .../handle_paypal_ipn_message_job_spec.rb | 45 ++++++++++++++++++- spec/models/factories_spec.rb | 2 + 6 files changed, 92 insertions(+), 14 deletions(-) diff --git a/app/services/paypal_service/data_types/ipn.rb b/app/services/paypal_service/data_types/ipn.rb index e3e0ee883d..67514c0239 100644 --- a/app/services/paypal_service/data_types/ipn.rb +++ b/app/services/paypal_service/data_types/ipn.rb @@ -176,6 +176,12 @@ module IPN [:invnum, :string, :mandatory] ) + PaymentAdjustment = EntityUtils.define_builder( + [:type, const_value: :payment_adjustment], + [:payment_id, :string, :mandatory], + [:adjustment_total, :money, :mandatory] + ) + module_function def create_order_created(opts); OrderCreated.call(opts) end @@ -192,6 +198,7 @@ def create_payment_denied(opts); PaymentDenied.call(opts) end def create_commission_paid(opts); CommissionPaid.call(opts) end def create_commission_denied(opts); CommissionDenied.call(opts) end def create_commission_pending_ext(opts); CommissionPendingExt.call(opts) end + def create_payment_adjustment(opts); PaymentAdjustment.call(opts) end def from_params(params) p = HashUtils.symbolize_keys(params) @@ -226,6 +233,8 @@ def from_params(params) to_payment_voided(p) when :payment_denied to_payment_denied(p) + when :payment_adjustment + to_payment_adjustment(p) else { type: type } end @@ -233,6 +242,7 @@ def from_params(params) ## Privates # + # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity def msg_type(txn_type, payment_status, pending_reason, invoice_num) txn_type = txn_type.to_s.downcase status, reason = payment_status.to_s.downcase, pending_reason.to_s.downcase @@ -242,6 +252,8 @@ def msg_type(txn_type, payment_status, pending_reason, invoice_num) return :billing_agreement_cancelled elsif txn_type == "mp_signup" return :billing_agreement_created + elsif txn_type == "adjustment" + return :payment_adjustment elsif status == "pending" && reason == "order" return :order_created elsif status == "pending" && (reason == "paymentreview" || reason == "payment-review") @@ -271,6 +283,7 @@ def msg_type(txn_type, payment_status, pending_reason, invoice_num) end end private_class_method :msg_type + # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity def to_money(sum, currency) sum.to_money(currency) @@ -502,6 +515,20 @@ def to_authorization_expired(params) end private_class_method :to_authorization_expired + def to_payment_adjustment(params) + p = HashUtils.rename_keys( + { + parent_txn_id: :payment_id, + }, + params) + + create_payment_adjustment( + p.merge({ + adjustment_total: to_money(p[:mc_gross], p[:mc_currency]) + })) + end + private_class_method :to_payment_adjustment + end end end diff --git a/app/services/paypal_service/ipn.rb b/app/services/paypal_service/ipn.rb index 444de7a2c4..7e33346465 100644 --- a/app/services/paypal_service/ipn.rb +++ b/app/services/paypal_service/ipn.rb @@ -18,7 +18,8 @@ def initialize(events) :payment_denied, :commission_paid, :commission_denied, - :commission_pending_ext + :commission_pending_ext, + :payment_adjustment ] def handle_msg(ipn_msg) diff --git a/app/services/paypal_service/store/paypal_payment.rb b/app/services/paypal_service/store/paypal_payment.rb index 07aef67fb3..1cbda5dd28 100644 --- a/app/services/paypal_service/store/paypal_payment.rb +++ b/app/services/paypal_service/store/paypal_payment.rb @@ -125,16 +125,16 @@ def from_model(paypal_payment) def find_payment(opts) commission_payment_id = opts[:data].try(:[], :commission_payment_id) - if commission_payment_id + payment_id = opts[:data].try(:[], :payment_id) + if opts[:community_id] && opts[:transaction_id] + PaypalPaymentModel.where(community_id: opts[:community_id], transaction_id: opts[:transaction_id]).first + elsif opts[:authorization_id] || opts[:order_id] + PaypalPaymentModel.where(authorization_id: opts[:authorization_id]).or( + PaypalPaymentModel.where(order_id: opts[:order_id])).first + elsif payment_id + PaypalPaymentModel.where(payment_id: payment_id).first + elsif commission_payment_id PaypalPaymentModel.where(commission_payment_id: commission_payment_id).first - else - PaypalPaymentModel.where( - "(community_id = ? and transaction_id = ?) or authorization_id = ? or order_id = ?", - opts[:community_id], - opts[:transaction_id], - opts[:authorization_id], - opts[:order_id] - ).first end end @@ -155,7 +155,7 @@ def initial(order) InitialPaymentData.call(order.merge(total)) end - def create_payment_update(update, current_state) + def create_payment_update(payment, update, current_state) cent_totals = [:order_total, :authorization_total, :fee_total, :payment_total, :commission_total, :commission_fee_total] .reduce({}) do |cent_totals, m_key| m = update[m_key] @@ -163,6 +163,11 @@ def create_payment_update(update, current_state) cent_totals end + adjustment_total = update[:adjustment_total] + if adjustment_total && payment.payment_total.currency == adjustment_total.currency + cent_totals[:payment_total_cents] = (payment.payment_total + adjustment_total).cents + end + payment_update = {} new_status = transform_status(update[:payment_status]) if update[:payment_status] @@ -206,7 +211,7 @@ def transform_pending_reason(reason) def update_payment!(payment, data) current_state = to_state(payment.payment_status.to_sym, payment.pending_reason.to_sym) - payment_update = create_payment_update(data, current_state) + payment_update = create_payment_update(payment, data, current_state) if payment.nil? raise ArgumentError.new("No matching payment to update.") diff --git a/spec/factories.rb b/spec/factories.rb index 32cdc551a2..5d7f828e88 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -427,7 +427,7 @@ def build_association(association, opts = {}) end factory :paypal_ipn_message do - body {} + body { { abc: 123 } } status nil end diff --git a/spec/jobs/handle_paypal_ipn_message_job_spec.rb b/spec/jobs/handle_paypal_ipn_message_job_spec.rb index f8bc7e502d..0453379c66 100644 --- a/spec/jobs/handle_paypal_ipn_message_job_spec.rb +++ b/spec/jobs/handle_paypal_ipn_message_job_spec.rb @@ -11,7 +11,7 @@ let(:transaction) { FactoryGirl.create(:transaction, community: community, listing: listing, current_state: 'initiated') } context '#perform' do - it 'performs errored IPN message - commission denied' do + it 'IPN message - commission denied' do body = { "mp_custom"=>"", "mc_gross"=>"50", @@ -73,5 +73,48 @@ expect(paypal_payment.payment_status).to eq 'completed' expect(paypal_payment.commission_status).to eq 'denied' end + + it 'IPN message - adjustment' do + body = { + "txn_type"=>"adjustment", + "payment_date"=>"22:41:28 Nov 20, 2017 PST", + "payment_gross"=>"-400.00", + "mc_currency"=>"USD", + "verify_sign"=>"Asm02AZo2GgXAq5vuJQw4xf2prDoA1AFaUqo9ytiIepWaLb.XyPciM1q", + "payer_status"=>"verified", + "payer_email"=>"thesubmarine@example.com", + "txn_id"=>"4JJ10040D4671ZZZZ", + "parent_txn_id"=>"1SS87354FT252ZZZZ", + "payer_id"=>"LCLFGUWLCZZZZ", + "invoice"=>"#{community.id}-#{transaction.id}-payment", + "reason_code"=>"chargeback_settlement", + "payment_status"=>"Completed", + "payment_fee"=>"-20.00", + "mc_gross"=>"-400.00", + "charset"=>"windows-1252", + "notify_version"=>"3.8", + "ipn_track_id"=>"efc01da41aaaa", + "controller"=>"paypal_ipn", + "action"=>"ipn_hook", + } + paypal_ipn_message = FactoryGirl.create(:paypal_ipn_message, body: body, status: 'errored') + paypal_payment = FactoryGirl.create(:paypal_payment, + community_id: community.id, + transaction_id: transaction.id, + payment_status: 'completed', + pending_reason: 'none', + payment_id: body["parent_txn_id"], + currency: 'USD', + payment_total_cents: 40000, + fee_total_cents: 1190, + commission_status: 'completed', + commission_pending_reason: 'none', + commission_total_cents: 1200, + commission_fee_total_cents: 65) + + HandlePaypalIpnMessageJob.new(paypal_ipn_message.id).perform + paypal_payment.reload + expect(paypal_payment.payment_total.cents).to eq 0 + end end end diff --git a/spec/models/factories_spec.rb b/spec/models/factories_spec.rb index 08a8bb4368..96039faab4 100644 --- a/spec/models/factories_spec.rb +++ b/spec/models/factories_spec.rb @@ -1,3 +1,5 @@ +require "spec_helper" + # See https://github.com/thoughtbot/factory_girl/wiki/Testing-all-Factories-(with-RSpec) describe "Factory Girl", type: :model do From 277edcf07365e007096df3c5059a89ccf5f583a3 Mon Sep 17 00:00:00 2001 From: Luis-RG Date: Wed, 13 Dec 2017 14:10:31 +0200 Subject: [PATCH 025/131] WTI pull 20171213 --- config/locales/en.yml | 10 +++++----- config/locales/es-ES.yml | 24 ++++++++++++------------ config/locales/fr.yml | 2 +- config/locales/pt-BR.yml | 4 ++-- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index f66acd9612..c40e4b4ad7 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -323,7 +323,7 @@ en: other_party: "Other party" status: conversation: Conversation - free: Free transaction + free: "Free transaction" pending: Pending preauthorized: Preauthorized accepted: Accepted @@ -334,7 +334,7 @@ en: initiated: "Waiting PayPal payment" pending_ext: "Waiting PayPal payment" none: - free: Free transaction + free: "Free transaction" paypal: free: Conversation pending: Pending @@ -361,12 +361,12 @@ en: conversations: conversations: "View conversations" headers: - started_from: Started from + started_from: "Started from" status: Status started: Started - last_activity: Latest Activity + last_activity: "Latest Activity" initiated_by: Starter - other_party: Other party + other_party: "Other party" participants: "Conversation: %{starter} with %{author}" profile: "%{author}'s Profile" custom_fields: diff --git a/config/locales/es-ES.yml b/config/locales/es-ES.yml index 5960641804..61c795976c 100644 --- a/config/locales/es-ES.yml +++ b/config/locales/es-ES.yml @@ -322,8 +322,8 @@ es-ES: initiated_by: "Iniciada por" other_party: "Otra parte" status: - conversation: ~ - free: Conversación + conversation: Conversación + free: "Transacción gratuita" pending: Pendiente preauthorized: Pre-autorizada accepted: Aceptada @@ -334,7 +334,7 @@ es-ES: initiated: "Esperando al pago de PayPal" pending_ext: "Esperando al pago de PayPal" none: - free: Conversación + free: "Transacción gratuita" paypal: free: Conversación pending: Pendiente @@ -359,16 +359,16 @@ es-ES: pending_ext: "Esperando el pago de Stripe" not_available: "No disponible" conversations: - conversations: ~ + conversations: "Ver conversaciones" headers: - started_from: ~ - status: ~ - started: ~ - last_activity: ~ - initiated_by: ~ - other_party: ~ - participants: ~ - profile: ~ + started_from: "Creada desde" + status: Status + started: Iniciada + last_activity: "Ultima Actividad" + initiated_by: Iniciador + other_party: "Otro usuario" + participants: "Conversación: %{starter} con %{author}" + profile: "Perfil de %{author}" custom_fields: edit: edit_listing_field: "Editar campo '%{field_name}'" diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 1b6c9843c8..061e32286c 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -361,7 +361,7 @@ fr: conversations: conversations: "Voir les conversations" headers: - started_from: "Commencée le" + started_from: "Commencée sur" status: Statut started: Commencée last_activity: "Dernière activité" diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 2f07bdb0ee..55e3536c67 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -1892,7 +1892,7 @@ pt-BR: paypal_account_connected_title: "Conta PayPal conectada" paypal_account_connected: "A conta PayPal <%{email}> foi conectada com o %{service_name}." change_account: "Mudar conta" - missing: "Você têm anúncios ativos mas não pode receber pagamentos porque sua conta no PayPal ainda não foi configurada. Por favor conecte sua conta do PayPal em %{settings_link}, você também também precisa dar permissão para que %{service_name} cobre taxa de transação." + missing: "Você tem anúncios ativos mas não pode receber pagamentos porque sua conta no PayPal ainda não foi configurada. Por favor conecte sua conta do PayPal em %{settings_link}, você também também precisa dar permissão para que %{service_name} cobre taxa de transação." from_your_payment_settings_link_text: "configurações de pagamento" redirect_message: "Estamos redirecionando você para o PayPal. Se nada acontecer, clique %{redirect_link}" redirect_link_text: aqui @@ -2349,7 +2349,7 @@ pt-BR: pay_with_stripe: ~ add_and_pay: ~ card_not_stored: ~ - missing_payment: ~ + missing_payment: "Você tem anúncios ativos mas sua conta ainda não foi configurada para receber pagamentos. Para configurar o recebimento de pagamentos, visite %{settings_link}" stripe_bank_connected: ~ stripe_can_accept: ~ stripe_credit_card: ~ From 316016d471dac564c90080dbc302c473c078d347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aivils=20=C5=A0toss?= Date: Wed, 13 Dec 2017 14:40:01 +0200 Subject: [PATCH 026/131] Paypal IPN - commission pending --- app/services/paypal_service/data_types/ipn.rb | 4 +- .../handle_paypal_ipn_message_job_spec.rb | 68 +++++++++++++++++++ 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/app/services/paypal_service/data_types/ipn.rb b/app/services/paypal_service/data_types/ipn.rb index 67514c0239..234640eeda 100644 --- a/app/services/paypal_service/data_types/ipn.rb +++ b/app/services/paypal_service/data_types/ipn.rb @@ -256,14 +256,14 @@ def msg_type(txn_type, payment_status, pending_reason, invoice_num) return :payment_adjustment elsif status == "pending" && reason == "order" return :order_created + elsif status == "pending" && txn_type == "merch_pmt" && inv_type == :commission + return :commission_pending_ext elsif status == "pending" && (reason == "paymentreview" || reason == "payment-review") return :payment_review elsif status == "pending" && reason == "authorization" return :authorization_created elsif status == "expired" return :authorization_expired - elsif status == "pending" && txn_type == "merch_pmt" - return :commission_pending_ext elsif status == "pending" return :payment_pending_ext elsif status == "completed" && inv_type == :payment diff --git a/spec/jobs/handle_paypal_ipn_message_job_spec.rb b/spec/jobs/handle_paypal_ipn_message_job_spec.rb index 0453379c66..3335939798 100644 --- a/spec/jobs/handle_paypal_ipn_message_job_spec.rb +++ b/spec/jobs/handle_paypal_ipn_message_job_spec.rb @@ -116,5 +116,73 @@ paypal_payment.reload expect(paypal_payment.payment_total.cents).to eq 0 end + + it 'IPN message - commission pending' do + body = { + "mp_custom"=>"", + "mc_gross"=>"14.24", + "invoice"=>"#{community.id}-#{transaction.id}-commission", + "mp_currency"=>"EUR", + "protection_eligibility"=>"Ineligible", + "item_number1"=>"0", + "tax"=>"0.00", + "payer_id"=>"VRQ77S93WZZZZ", + "payment_date"=>"04:55:19 Nov 22, 2017 PST", + "mp_id"=>"B-92E30987Y6745ZZZZ", + "payment_status"=>"Pending", + "charset"=>"windows-1252", + "mc_shipping"=>"0.00", + "mc_handling"=>"0.00", + "first_name"=>"Christophe", + "mp_status"=>"0", + "mc_fee"=>"0.73", + "notify_version"=>"3.8", + "custom"=>"", + "payer_status"=>"unverified", + "business"=>"morgane.regnier@example.com", + "num_cart_items"=>"1", + "mc_handling1"=>"0.00", + "verify_sign"=>"AxGBlNtIj4ayGxxruDHIY.uLHHMXAyRZ-MtRqGDHKdl-ZMsWaxlb.qz0", + "payer_email"=>"contact@example.com", + "mc_shipping1"=>"0.00", + "tax1"=>"0.00", + "txn_id"=>"7B0631626J114ZZZZ", + "payment_type"=>"instant", + "payer_business_name"=>"chris-creation", + "last_name"=>"Boury", + "mp_desc"=>"Autoriser Experiences cours photo à prélever des frais de service.", + "item_name1"=>"Paiement des frais de service pour Cours Lightroom - les bases - Bordeaux ou en ligne", + "receiver_email"=>"morgane.regnier@photosqware.com", + "payment_fee"=>"", + "mp_cycle_start"=>"21", + "quantity1"=>"1", + "receiver_id"=>"K9D9EQZCWZZZZ", + "pending_reason"=>"paymentreview", + "txn_type"=>"merch_pmt", + "mc_gross_1"=>"14.24", + "mc_currency"=>"EUR", + "residence_country"=>"FR", + "transaction_subject"=>"La place de marché Experiences cours photo a prélevéces frais de service sur une transaction de Cours Lightroom - les bases", + "payment_gross"=>"", + "ipn_track_id"=>"84212dcfffff", + "controller"=>"paypal_ipn", + "action"=>"ipn_hook", + } + paypal_ipn_message = FactoryGirl.create(:paypal_ipn_message, body: body, status: 'errored') + paypal_payment = FactoryGirl.create(:paypal_payment, + community_id: community.id, + transaction_id: transaction.id, + payment_status: 'completed', + pending_reason: 'none', + commission_payment_id: body["txn_id"], + commission_status: 'completed', + commission_pending_reason: 'none') + + expect(paypal_payment.commission_pending_reason).to eq 'none' + HandlePaypalIpnMessageJob.new(paypal_ipn_message.id).perform + paypal_payment.reload + expect(paypal_payment.commission_status).to eq 'pending' + expect(paypal_payment.commission_pending_reason).to eq 'paymentreview' + end end end From 638b4b8fcb63b4d89198354e8c5c37ec4cc8c223 Mon Sep 17 00:00:00 2001 From: Valdis Pornieks Date: Thu, 14 Dec 2017 11:58:49 +0200 Subject: [PATCH 027/131] Fixed: db structure cleaned up --- db/structure.sql | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/db/structure.sql b/db/structure.sql index 5b95a1aa07..2bc74d319f 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -684,21 +684,6 @@ CREATE TABLE `listing_units` ( KEY `index_listing_units_on_listing_shape_id` (`listing_shape_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `listing_working_time_slots`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `listing_working_time_slots` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `listing_id` int(11) DEFAULT NULL, - `week_day` int(11) DEFAULT NULL, - `from` varchar(255) DEFAULT NULL, - `till` varchar(255) DEFAULT NULL, - `created_at` datetime NOT NULL, - `updated_at` datetime NOT NULL, - PRIMARY KEY (`id`), - KEY `index_listing_working_time_slots_on_listing_id` (`listing_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `listings`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; @@ -2229,7 +2214,6 @@ INSERT INTO `schema_migrations` (version) VALUES ('20170817035830'), ('20171107063241'), ('20171128122539'), -('20171023070523'), ('20171129152027'); From 9fbf8d166ea61709b2c432b1082982b7eb29272d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aivils=20=C5=A0toss?= Date: Fri, 15 Dec 2017 08:45:19 +0200 Subject: [PATCH 028/131] Paypal IPN fixes --- app/services/paypal_service/store/paypal_payment.rb | 7 ++++--- spec/services/paypal_service/store/paypal_payment_spec.rb | 2 ++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/services/paypal_service/store/paypal_payment.rb b/app/services/paypal_service/store/paypal_payment.rb index 1cbda5dd28..f594c28d57 100644 --- a/app/services/paypal_service/store/paypal_payment.rb +++ b/app/services/paypal_service/store/paypal_payment.rb @@ -128,9 +128,10 @@ def find_payment(opts) payment_id = opts[:data].try(:[], :payment_id) if opts[:community_id] && opts[:transaction_id] PaypalPaymentModel.where(community_id: opts[:community_id], transaction_id: opts[:transaction_id]).first - elsif opts[:authorization_id] || opts[:order_id] - PaypalPaymentModel.where(authorization_id: opts[:authorization_id]).or( - PaypalPaymentModel.where(order_id: opts[:order_id])).first + elsif opts[:order_id] + PaypalPaymentModel.where(order_id: opts[:order_id]).first + elsif opts[:authorization_id] + PaypalPaymentModel.where(authorization_id: opts[:authorization_id]).first elsif payment_id PaypalPaymentModel.where(payment_id: payment_id).first elsif commission_payment_id diff --git a/spec/services/paypal_service/store/paypal_payment_spec.rb b/spec/services/paypal_service/store/paypal_payment_spec.rb index d5cdb80776..d311ca7adc 100644 --- a/spec/services/paypal_service/store/paypal_payment_spec.rb +++ b/spec/services/paypal_service/store/paypal_payment_spec.rb @@ -1,3 +1,5 @@ +require "spec_helper" + describe PaypalService::Store::PaypalPayment do order = { community_id: 1, From 3836000727441507da9c59949af743d3a30707f4 Mon Sep 17 00:00:00 2001 From: Thomas Malbaux Date: Fri, 15 Dec 2017 11:43:17 +0200 Subject: [PATCH 029/131] wti pull --- app/assets/javascripts/locales/en-NZ.json | 4 +- .../help_texts/_help_valid_until.en-NZ.haml | 2 + .../help_texts/_help_captcha.en-NZ.haml | 5 + .../_help_invitation_code.en-NZ.haml | 8 + config/locales/de.yml | 4 +- config/locales/devise.en-NZ.yml | 81 +- config/locales/en-NZ.yml | 4153 +++++++++-------- config/locales/fi.yml | 46 +- config/locales/nl.yml | 24 +- config/locales/tr-TR.yml | 28 +- 10 files changed, 2237 insertions(+), 2118 deletions(-) create mode 100644 app/views/listings/help_texts/_help_valid_until.en-NZ.haml create mode 100644 app/views/people/help_texts/_help_captcha.en-NZ.haml create mode 100644 app/views/people/help_texts/_help_invitation_code.en-NZ.haml diff --git a/app/assets/javascripts/locales/en-NZ.json b/app/assets/javascripts/locales/en-NZ.json index 39f54d0196..62c396b3d4 100644 --- a/app/assets/javascripts/locales/en-NZ.json +++ b/app/assets/javascripts/locales/en-NZ.json @@ -20,8 +20,8 @@ "url": "Please enter a valid URL.", "address_validator": "The location was not found.", "money": "You need to insert a valid monetary value.", - "night_selected": null, - "availability_range": null, + "night_selected": "You need to select at least one night", + "availability_range": "The selected range includes dates that are not available", "min_bound": "Please enter a value less than max value ({0})", "max_bound": "Please enter a value more than min value ({0})", "number_no_decimals": "Please enter a whole number", diff --git a/app/views/listings/help_texts/_help_valid_until.en-NZ.haml b/app/views/listings/help_texts/_help_valid_until.en-NZ.haml new file mode 100644 index 0000000000..984d383a72 --- /dev/null +++ b/app/views/listings/help_texts/_help_valid_until.en-NZ.haml @@ -0,0 +1,2 @@ +%p + You can determine how long your listing is open. After the expiration date the listing will close automatically. Closed listings are not visible in any normal listing views. You can change the expiration date any time from the "edit listing" menu. You can also reopen the listing after it has closed from the same menu, if it is still topical. \ No newline at end of file diff --git a/app/views/people/help_texts/_help_captcha.en-NZ.haml b/app/views/people/help_texts/_help_captcha.en-NZ.haml new file mode 100644 index 0000000000..e5f084c2a3 --- /dev/null +++ b/app/views/people/help_texts/_help_captcha.en-NZ.haml @@ -0,0 +1,5 @@ +%p + This confirmation assures, that only people can create new accounts in #{service_name}. The confirmation keeps all kinds of nasty web-crawling spammer robots away from creating accounts in #{service_name} and sending spam to users. + +%p + The confirmation is very simple: you need to fill in the two words written in a bit ambiguous handwriting. If you misspell the words, fear not: you can try again as many times as you like, and you will not lose any of the information you filled in the other fields in the process. \ No newline at end of file diff --git a/app/views/people/help_texts/_help_invitation_code.en-NZ.haml b/app/views/people/help_texts/_help_invitation_code.en-NZ.haml new file mode 100644 index 0000000000..4705d318dc --- /dev/null +++ b/app/views/people/help_texts/_help_invitation_code.en-NZ.haml @@ -0,0 +1,8 @@ +%p + To join + %strong + = @current_community.full_name(I18n.locale) + you need to have an invite. If you have an invite, please enter the code in the box below. + +%p + By using invitation codes we try to make sure that all #{service_name} users are trustworthy parties. \ No newline at end of file diff --git a/config/locales/de.yml b/config/locales/de.yml index 4ef99546bd..70a7b8d4fd 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -359,9 +359,9 @@ de: pending_ext: "Warte auf Stripe-Bezahlung" not_available: "nicht verfügbar" conversations: - conversations: "Unterhaltungen ansehen" + conversations: "Unterhaltungen anzeigen" headers: - started_from: "Gestartet von" + started_from: "Gestartet aus" status: Status started: Gestartet last_activity: "Neueste Aktivität" diff --git a/config/locales/devise.en-NZ.yml b/config/locales/devise.en-NZ.yml index e4688b3400..30c9614c75 100644 --- a/config/locales/devise.en-NZ.yml +++ b/config/locales/devise.en-NZ.yml @@ -1,55 +1,58 @@ en-NZ: errors: messages: - expired: ~ - not_found: ~ - already_confirmed: ~ - not_locked: ~ + expired: "has expired, please request a new one" + not_found: "not found" + already_confirmed: "was already confirmed, please try signing in" + not_locked: "was not locked" + not_saved: + one: "1 error prohibited this %{resource} from being saved:" + other: "%{count} errors prohibited this %{resource} from being saved:" devise: failure: - already_authenticated: ~ - unauthenticated: ~ - unconfirmed: ~ - locked: ~ - invalid: ~ - invalid_token: ~ - timeout: ~ - inactive: ~ + already_authenticated: "You are already signed in." + unauthenticated: "You need to log in or sign up before continuing." + unconfirmed: "You have to confirm your account before continuing." + locked: "Your account is locked." + invalid: "Invalid email or password." + invalid_token: "Invalid authentication token." + timeout: "Your session has expired. Please log in again to continue." + inactive: "Your account was not activated yet." passwords: - updated_not_active: ~ - send_paranoid_instructions: ~ - send_instructions: ~ - updated: ~ + updated_not_active: "Your password was changed successfully." + send_paranoid_instructions: "If your e-mail exists on our database, you will receive a password recovery link on your e-mail" + send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes." + updated: "Your password was changed successfully. You are now signed in." sessions: - signed_in: ~ - signed_out: ~ + signed_in: "Signed in successfully." + signed_out: "Signed out successfully." confirmations: - send_paranoid_instructions: ~ - send_instructions: ~ - confirmed: ~ + send_paranoid_instructions: "If your e-mail exists on our database, you will receive an email with instructions about how to confirm your account in a few minutes." + send_instructions: "You will receive an email with instructions about how to confirm your account in a few minutes." + confirmed: "Your account was successfully confirmed." registrations: - signed_up_but_unconfirmed: ~ - signed_up_but_inactive: ~ - signed_up_but_locked: ~ + signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please open the link to activate your account." + signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated." + signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked." reasons: - inactive: ~ - unconfirmed: ~ - locked: ~ - update_needs_confirmation: ~ - signed_up: ~ - updated: ~ - destroyed: ~ + inactive: inactive + unconfirmed: unconfirmed + locked: locked + update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and click on the confirm link to finalize confirming your new email address." + signed_up: "Welcome! You have signed up successfully." + updated: "You updated your account successfully." + destroyed: "Bye! Your account was successfully cancelled. We hope to see you again soon." unlocks: - send_paranoid_instructions: ~ - send_instructions: ~ - unlocked: ~ + send_paranoid_instructions: "If your account exists, you will receive an email with instructions about how to unlock it in a few minutes." + send_instructions: "You will receive an email with instructions about how to unlock your account in a few minutes." + unlocked: "Your account has been unlocked successfully. Please log in to continue." omniauth_callbacks: - success: ~ - failure: ~ + success: "Successfully authorized from %{kind} account." + failure: "Could not authorize you from %{kind} because \"%{reason}\"." mailer: confirmation_instructions: - subject: ~ + subject: "Confirmation instructions to join %{service_name}" reset_password_instructions: - subject: ~ + subject: "Reset password instructions" unlock_instructions: - subject: ~ + subject: "Unlock Instructions" diff --git a/config/locales/en-NZ.yml b/config/locales/en-NZ.yml index 06b8cca337..639e905576 100644 --- a/config/locales/en-NZ.yml +++ b/config/locales/en-NZ.yml @@ -2,2349 +2,2442 @@ en-NZ: number: currency: format: - separator: ~ - delimiter: ~ - format: ~ + separator: "." + delimiter: "," + format: "%u%n" admin: categories: edit: - edit_listing_category: ~ + edit_listing_category: "Edit category '%{category}'" index: - listing_categories: ~ - create_a_new_category: ~ - remove_category_confirmation: ~ - saving_order: ~ - save_order_successful: ~ - save_order_error: ~ + listing_categories: "Listing categories" + create_a_new_category: "+ Create a new category" + remove_category_confirmation: "Are you sure you want to remove category '%{category_name}'?" + saving_order: "Saving category order" + save_order_successful: "Successfully saved category order" + save_order_error: "An error occurred while saving category order. Please refresh the page and try again." new: - new_listing_category: ~ + new_listing_category: "New listing category" form: category_name: - category_title: ~ + category_title: "Category title" category_parent: - category_parent: ~ - no_parent: ~ + category_parent: "Parent category" + no_parent: "No parent" category_transaction_types: - transaction_types: ~ - transaction_types_description: ~ - select_all: ~ - clear_all: ~ + transaction_types: "Order types" + transaction_types_description: "Order types determine what kind of order process is allowed with listings in this category. For example, is it only selling, or are renting and giving away for free also allowed." + select_all: "Select all" + clear_all: "Clear all" buttons: - save: ~ - cancel: ~ + save: Save + cancel: Cancel remove: - remove_category: ~ - remove_category_name: ~ - warning_remove_effects: ~ - select_new_category: ~ + remove_category: "Remove category" + remove_category_name: "Remove category '%{category_name}'" + warning_remove_effects: "Warning! Removing category '%{category_name}' will have the following effects:" + warning_listing_will_be_moved: + one: "There is %{count} listing in the category. It will be moved to the selected category." + other: "There are %{count} listings in the category. They will be moved to the selected category." + warning_custom_field_will_be_moved: + one: "There is %{count} custom field in the category. It will be moved to the selected category." + other: "There are %{count} custom field in the category. They will be moved to the selected category." + warning_subcategory_will_be_removed: + one: "There is %{count} subcategory in the category. It will be removed." + other: "There are %{count} subcategories in the category. They will be removed." + warning_with_subcategories_listing_will_be_moved: + one: "There is %{count} listing in the category and subcategories. It will be moved to the selected category." + other: "There are %{count} listings in the category and subcategories. They will be moved to the selected category." + warning_with_subcategories_custom_field_will_be_moved: + one: "There is %{count} custom field in the category and subcategories. It will be moved to the selected category." + other: "There are %{count} custom field in the category and subcategories. They will be moved to the selected category." + select_new_category: "Select a new category where the items listed above will be moved:" buttons: - remove: ~ - cancel: ~ + remove: Remove + cancel: Cancel communities: edit_details: - community_details: ~ - community_look_and_feel: ~ - edit_community: ~ - enabled_languages: ~ - enabled_languages_description: ~ - default_language: ~ - language_selection_disabled: ~ - community_name: ~ - edit_community_name_description: ~ - community_slogan: ~ - edit_community_slogan_description: ~ - community_description: ~ - edit_community_description_description: ~ - community_search_placeholder: ~ - edit_community_search_placeholder_description: ~ - private_community_homepage_content: ~ - edit_private_community_homepage_content_description: ~ - update_information: ~ - invite_people: ~ - edit_signup_info: ~ - edit_signup_info_description: ~ - edit_info: ~ - see_how_it_looks_like: ~ - verification_to_post_listings_info_content: ~ - verification_to_post_listings_info_content_description: ~ - verification_to_post_listings_info_content_default: ~ - contact_admin_link_text: ~ - save: ~ - transaction_agreement: ~ - transaction_agreement_checkbox: ~ - transaction_agreement_checkbox_header: ~ - transaction_agreement_checkbox_label_description: ~ - transaction_agreement_text_header: ~ - transaction_agreement_description: ~ + community_details: "Basic details" + community_look_and_feel: Design + edit_community: "Basic details" + enabled_languages: "Enabled languages" + enabled_languages_description: "The set of languages available for users. The first one is used as default." + default_language: "Default language" + language_selection_disabled: "Language selection is disabled for your marketplace because you are using following unofficial languages: %{languages}. Please contact Sharetribe support if you want to modify your language settings." + community_name: "Marketplace name" + edit_community_name_description: "The name of your marketplace. This is shown to users in emails and various other places." + community_slogan: "Marketplace slogan" + edit_community_slogan_description: "This is shown on the homepage of the marketplace for the users who are not logged in. %{see_how_it_looks_like}." + community_description: "Marketplace description" + edit_community_description_description: "This is shown on the homepage of the marketplace for the users who are not logged in. %{see_how_it_looks_like}." + community_search_placeholder: "Search help text" + edit_community_search_placeholder_description: "This is shown on the homepage of the marketplace as a placeholder text in the search bar. %{see_how_it_looks_like}." + private_community_homepage_content: "Private marketplace homepage content" + edit_private_community_homepage_content_description: "This content is shown on the homepage of private marketplaces to users who are not logged in. Here you can describe your marketplace and the process to join it. You can also add images, videos and HTML content here. %{see_how_it_looks_like}." + update_information: "Save settings" + invite_people: "Invite new users to %{service_name}" + edit_signup_info: "Signup info" + edit_signup_info_description: "This is an info text that can be shown to users in the signup page. There you can give the users instructions for signing up, information like where to get an invite, etc. By default there are no instructions." + edit_info: "Edit information" + see_how_it_looks_like: "See how it looks" + verification_to_post_listings_info_content: "Info text to non-verified users" + verification_to_post_listings_info_content_description: "You currently require your users to be verified manually by you before they can post listings. Here you can set the default text that is shown to non-verified users when they try to post a new listing." + verification_to_post_listings_info_content_default: "%{service_name} requires people to be verified manually by admin before they can post listings. You have not yet been verified. Please %{contact_admin_link} to be verified." + contact_admin_link_text: "contact the %{service_name} team" + save: "Save settings" + transaction_agreement: "Transaction agreement" + transaction_agreement_checkbox: "Require users to accept an agreement before transaction" + transaction_agreement_checkbox_header: "Agreement label" + transaction_agreement_checkbox_label_description: "This text will be shown next to a checkbox in the checkout form. The user needs to check the box to proceed with the transaction. An example label would be something like \"By clicking this box I accept the agreement.\"" + transaction_agreement_text_header: "Agreement text" + transaction_agreement_description: "This is the content of the actual agreement that the user needs to accept. The agreement content is displayed when the user clicks the \"%{read_more}\" link next to the agreement label." edit_look_and_feel: - edit_community_look_and_feel: ~ - community_logo: ~ - community_logo_icon: ~ - community_cover_photo: ~ - small_community_cover_photo: ~ - favicon: ~ - favicon_info_text: ~ - community_custom_color1: ~ - community_slogan_color: ~ - community_slogan_color_instructions_text: ~ - community_description_color: ~ - community_description_color_instructions_text: ~ - new_listing_button_custom_color: ~ - logo_instructions_text_with_dimensions: ~ - logo_instructions_text_with_dimensions_no_placing: ~ - logo_icon_instructions_text_with_dimensions: ~ - logo_icon_instructions_text_with_dimensions_no_placing: ~ - cover_photo_visibility: ~ - cover_photo_instructions_text_with_dimensions: ~ - small_cover_photo_visibility: ~ - small_cover_photo_instructions_text_with_dimensions: ~ - main_content_width: ~ - custom_color1_instructions_text: ~ - new_listing_button_instructions_text: ~ - default_browse_view: ~ - default_browse_view_instructions_text: ~ - grid: ~ - list: ~ - map: ~ - name_display_type: ~ - name_display_type_instructions_text: ~ - full_name: ~ - first_name_with_initial: ~ - first_name_only: ~ - invalid_color_code: ~ - custom_head_script: ~ - custom_head_script_instructions_text: ~ + edit_community_look_and_feel: "Edit marketplace \"%{community_name}\" look and feel" + community_logo: Logo + community_logo_icon: "Logo for social networks and mobile devices" + community_cover_photo: "Cover photo" + small_community_cover_photo: "Small cover photo" + favicon: Favicon + favicon_info_text: "Favicon will replace the default Sharetribe logo. The dimensions should be 32x32 pixels and the uploaded image will be resized to these dimensions." + community_custom_color1: "Main color" + community_slogan_color: "Marketplace slogan color" + community_slogan_color_instructions_text: "You can change the color of the slogan on the homepage by entering a hex color value. The slogan is shown to users that are not logged in. %{colorpicker} can help you choose the color and give you the hex color code. You can then copy the code here. %{see_how_it_looks_like}." + community_description_color: "Marketplace description color" + community_description_color_instructions_text: "You can change the color of the description on the homepage by entering a hex color value. The description is shown to users that are not logged in. %{colorpicker} can help you choose the color and give you the hex color code. You can then copy the code here. %{see_how_it_looks_like}." + new_listing_button_custom_color: "Post a new listing button color" + logo_instructions_text_with_dimensions: "The logo size should be %{width}x%{height}px. It will be shown to users with bigger screens." + logo_instructions_text_with_dimensions_no_placing: "The logo size should be %{width}x%{height}px." + logo_icon_instructions_text_with_dimensions: "This square logo will be shown when people share your site in Facebook, when they view your site on a mobile device or when they bookmark your site to the home screen of their mobile device. The dimensions should be (at least) %{width}x%{height}px." + logo_icon_instructions_text_with_dimensions_no_placing: "This square logo will be shown when people share your site in Facebook or when they bookmark your site to the home screen of their mobile device. The dimensions should be (at least) %{width}x%{height}px." + cover_photo_visibility: "Cover photo is shown in the homepage for users who are not logged in." + cover_photo_instructions_text_with_dimensions: "The photo will be resized to %{width}x%{height} pixel size and taller images will be cut in the middle. %{see_how_it_looks_like}." + small_cover_photo_visibility: "Small cover photo is shown in all pages except in the homepage for users who are not logged in." + small_cover_photo_instructions_text_with_dimensions: "The photo will be resized to %{width}x%{height} pixel size and taller images will be cut in the middle." + main_content_width: "When choosing cover photos please note that the page main content is %{main_width} pixels wide at most. Remember to also check how your cover photo looks on the smaller screens (e.g. by using a more narrow browser window)." + custom_color1_instructions_text: "You can change the main color of the user interface by entering a hex color value. ColorPicker.com can help you choose the color and give you the hex color code. You can then copy the code here." + new_listing_button_instructions_text: "You can change the color of the Post a new listing button by entering a hex color value. %{link_to_colorpicker} can help you choose the color and give you the hex color code. You can then copy the code here." + default_browse_view: "Default browse view" + default_browse_view_instructions_text: "Default browse view is used on the homepage to set how the listings are displayed by default." + grid: Grid + list: List + map: Map + name_display_type: "Name display type" + name_display_type_instructions_text: "Choose how the name of each user is shown on the site." + full_name: "Full name (First Last)" + first_name_with_initial: "First name with initial (First L)" + first_name_only: "First name only (First)" + invalid_color_code: "Color code should contain 6 numbers or letters A-F, for example D96E21" + custom_head_script: "Custom script" + custom_head_script_instructions_text: "This script is injected inside the tag of every page and can be used to insert custom CSS, JavaScript or HTML. Please note that future changes to Sharetribe may render your script incompatible." edit_text_instructions: - edit_text_instructions: ~ + edit_text_instructions: "Instruction texts" edit_welcome_email: - welcome_email_content: ~ - welcome_email_content_description: ~ - edit_message: ~ - send_test_message: ~ + welcome_email_content: "Welcome email content" + welcome_email_content_description: "The message below will be sent to every new user when they join. You can customize the message to fit your marketplace. By clicking '%{send_test_message_link}' you can send a preview message to your email address, so you can see how it looks in an email client." + edit_message: "Edit message" + send_test_message: "Send test message" outgoing_email: - title: ~ - info: ~ - read_more: ~ - sender_address: ~ - sender_address_default: ~ - need_to_change: ~ - contact_support_link_text: ~ - set_sender_address: ~ - sender_name_label: ~ - sender_name_placeholder: ~ - sender_email_label: ~ - sender_email_placeholder: ~ - amazon_ses_notification: ~ - this_is_how_it_will_look: ~ - send_verification_button: ~ - change_sender_email: ~ - successfully_saved: ~ - successfully_saved_name: ~ - set_sender_name: ~ - change_sender_name: ~ - change_sender_prompt: ~ - status: ~ - status_verified: ~ - status_error: ~ - status_requested: ~ - status_expired: ~ - status_resent: ~ - resend_link: ~ - invalid_email_error: ~ - invalid_email_domain: ~ - invalid_email_domain_read_more_link: ~ - unknown_error: ~ - white_label_offer: ~ - upgrade_plan_link: ~ - verification_sent_from: ~ - follow_the_instructions: ~ + title: "Outgoing email address" + info: "This name and address is used for emails sent from your marketplace to members." + read_more: "Read more about outgoing email address" + sender_address: "Sender address: %{sender_address}" + sender_address_default: "Sender address: not set (using default address %{sender_address})" + need_to_change: "If you need to change the email address, please %{contact_support_link}." + contact_support_link_text: "contact Sharetribe support" + set_sender_address: "Set sender address" + sender_name_label: Name + sender_name_placeholder: "Sender name" + sender_email_label: "Email address" + sender_email_placeholder: sender-email@example.com + amazon_ses_notification: "You will receive an email from %{email_sender} to confirm your e-mail address. The email subject is '%{email_subject}'. Follow the instructions to verify your email." + this_is_how_it_will_look: "This is how it will look:" + send_verification_button: "Send verification email" + change_sender_email: "change sender email" + successfully_saved: "Sender address saved successfully. The verification email will be sent soon." + successfully_saved_name: "Sender name updated successfully." + set_sender_name: "Change sender name" + change_sender_name: "Change sender name" + change_sender_prompt: "%{change_name_link} or %{change_email_link}" + status: "Status: %{status}" + status_verified: "Verified - in use" + status_error: "An error occurred. Please refresh the page." + status_requested: "Unverified - verification email sent to %{email} %{time_ago}. %{resend_link}" + status_expired: "Verification of %{email} expired. %{resend_link}" + status_resent: "Verification email resent to %{email}. %{resend_link}" + resend_link: Resend + invalid_email_error: "Invalid email format for '%{email}'" + invalid_email_domain: "The '%{email}' email address is using an unsupported email provider: '%{domain}'. %{invalid_email_domain_read_more_link}" + invalid_email_domain_read_more_link: "Read the Help Center article for more information." + unknown_error: "Something went wrong" + white_label_offer: "Set your own email address as the sender and remove all Sharetribe branding from outgoing email messages by %{upgrade_pro_plan_link}." + upgrade_plan_link: "upgrading to the Pro plan or higher" + verification_sent_from: "The verification email was sent from %{verification_sender_name}." + follow_the_instructions: "Please follow the instructions in the email to verify your address." getting_started: - getting_started: ~ + getting_started: "Get started" available_languages: - en: ~ - en-AU: ~ - en-GB: ~ - fr: ~ - fr-CA: ~ - es: ~ - es-ES: ~ - pt-PT: ~ - pt-BR: ~ - nb: ~ - sv: ~ - da-DK: ~ - fi: ~ - ru: ~ - de: ~ - el: ~ - nl: ~ - tr-TR: ~ - zh: ~ - ja: ~ - it: ~ + en: English + en-AU: "English (Australia)" + en-GB: "English (United Kingdom)" + fr: French + fr-CA: "French (Canada)" + es: "Spanish (Chile)" + es-ES: Spanish + pt-PT: Portuguese + pt-BR: "Portuguese (Brazil)" + nb: "Norwegian Bokmål" + sv: Swedish + da-DK: Danish + fi: Finnish + ru: Russian + de: German + el: Greek + nl: Dutch + tr-TR: Turkish + zh: Chinese + ja: Japanese + it: Italian settings: - settings: ~ - general: ~ - access: ~ - join_with_invite_only: ~ - users_can_invite_new_users: ~ - private: ~ - require_verification_to_post_listings: ~ - search_preferences: ~ - default_search_type: ~ - keyword_search: ~ - keyword_and_location_search: ~ - location_search: ~ - select_distance_unit: ~ - km: ~ - miles: ~ - show_only_nearby: ~ - listing_preferences: ~ - transaction_preferences: ~ - show_listing_publishing_date: ~ - show_category_in_listing_list: ~ - listing_comments_in_use: ~ - email_preferences: ~ - automatic_newsletters: ~ - email_admins_about_new_members: ~ - google_analytics_key: ~ - twitter_handle: ~ - update_settings: ~ - automatically_confirmed_no_escrow: ~ - automatically_confirmed_no_escrow_stripe_info: ~ - automatic_newsletter_frequency: ~ - newsletter_daily: ~ - newsletter_weekly: ~ - delete_marketplace_title: ~ - type_marketplace_domain: ~ - type_marketplace_domain_placeholder: ~ - once_you_delete: ~ - are_you_sure: ~ - i_understand_button: ~ - last_community_updates: ~ - you_will_be_redirected_to: ~ - delete_this_marketplace: ~ - payment_preferences: ~ + settings: Settings + general: General + access: "Access preferences" + join_with_invite_only: "Allow users to join only with an invite from another user" + users_can_invite_new_users: "Allow all users to invite new users" + private: "Allow only registered users to see listings and user profiles (make marketplace private)" + require_verification_to_post_listings: "Allow only users verified by admin to post new listings" + search_preferences: "Search preferences" + default_search_type: "Search type: %{select_search_type}" + keyword_search: "Keyword search" + keyword_and_location_search: "Keyword and location search" + location_search: "Location search" + select_distance_unit: "Show distance in %{distance_units_selector}" + km: km + miles: miles + show_only_nearby: "Show only nearby listings with location search" + listing_preferences: "Listing preferences" + transaction_preferences: "Order preferences" + show_listing_publishing_date: "Display publishing date of the listing on the listing page" + show_category_in_listing_list: "Display listing type in list view" + listing_comments_in_use: "Allow users to post comments to listings (viewable to all other users)" + email_preferences: "Email preferences" + automatic_newsletters: "Send automatic daily / weekly newsletters to all users (unless they opt out)" + email_admins_about_new_members: "Send admins an email whenever a new user signs up" + google_analytics_key: "Google Analytics tracking ID" + twitter_handle: "Twitter handle (used with tweet button in listing page)" + update_settings: "Save settings" + automatically_confirmed_no_escrow: "Order will be automatically marked as completed %{days_dropdown} days after the payment has been made" + automatically_confirmed_no_escrow_stripe_info: "For transactions processed by Stripe, payments to providers are delayed until the order is marked as completed. %{learn_more}." + automatic_newsletter_frequency: "Send automatic newsletter: %{frequency_dropdown}" + newsletter_daily: Daily + newsletter_weekly: Weekly + delete_marketplace_title: "Delete marketplace" + type_marketplace_domain: "Type your marketplace domain (%{domain}) to the text field below:" + type_marketplace_domain_placeholder: "Type your marketplace domain here" + once_you_delete: "Once you delete the marketplace, you will not be able to access it anymore. Be careful." + are_you_sure: "Are you sure?" + i_understand_button: "I understand that by clicking this button my marketplace will be deleted" + last_community_updates: "Please note that after deletion, you and your marketplace users may still receive the last marketplace update emails." + you_will_be_redirected_to: "After you have deleted your marketplace you will be redirected to %{destination}. You will not be able to access your marketplace anymore." + delete_this_marketplace: "Delete this marketplace" + payment_preferences: "Payment system" manage_members: - manage_members: ~ - email: ~ - name: ~ - display_name: ~ - join_date: ~ - admin: ~ - posting_allowed: ~ - ban_user: ~ - saving_user_status: ~ - save_user_status_successful: ~ - export_all_as_csv: ~ - save_user_status_error: ~ - ban_user_confirmation: ~ - unban_user_confirmation: ~ - ban_me_error: ~ - search: ~ - search_by_name_email: ~ - reset_search: ~ - for_search_terms: ~ + manage_members: "Manage users" + email: Email + name: Name + display_name: "Display name" + join_date: Joined + admin: Admin + posting_allowed: "Posting allowed" + ban_user: Ban + saving_user_status: Saving... + save_user_status_successful: Saved + export_all_as_csv: "Export all as CSV" + save_user_status_error: "Saving failed. Please refresh the page and try again." + ban_user_confirmation: "This removes the user from the marketplace and prevents them from accessing the site again with this account. Are you sure you want to proceed?" + unban_user_confirmation: "This unbans the user in the marketplace and allows them to access the site again with this account. Are you sure you want to proceed?" + ban_me_error: "You cannot ban yourself." + search: Search + search_by_name_email: "Search for a name, email or display name" + reset_search: "Show all" + for_search_terms: "for: %{terms}" new_layout: - new_layout: ~ - description_roadmap_new: ~ - enabled_for_you: ~ - enabled_for_all: ~ - new_topbar: ~ - searchpage: ~ + new_layout: "New layout" + description_roadmap_new: "When new layout components are made available for your marketplace, you can choose whether you want to start using the new component or continue using the old one. You can toggle the selection at any point from this page. It's recommended to always be using the new version, as the old components might be phased out at some point. In case a component you're currently using is going to be phased out, you will be contacted in advance." + enabled_for_you: "Enabled for you" + enabled_for_all: "Enabled for all" + new_topbar: "New top bar (visible on every page)" + searchpage: "New search page (requires the new top bar)" social_media: - social_media: ~ - twitter_handle: ~ - twitter_handle_info_text: ~ - twitter_handle_info_text_with_instructions: ~ - twitter_instructions_link_text: ~ - twitter_handle_placeholder: ~ - invalid_twitter_handle: ~ - facebook_connect: ~ - facebook_connect_info_text: ~ - facebook_connect_info_text_with_instructions: ~ - facebook_instructions_link_text: ~ - facebook_connect_id: ~ - invalid_facebook_connect_id: ~ - facebook_connect_secret: ~ - invalid_facebook_connect_secret: ~ - save: ~ + social_media: "Social media" + twitter_handle: "Twitter handle" + twitter_handle_info_text: "Username of the Twitter account of your marketplace (if you have one). It will be mentioned when people use the tweet button on the listing page." + twitter_handle_info_text_with_instructions: "Username of the Twitter account of your marketplace (if you have one). It will be mentioned when people use the tweet button on the listing page. %{instructions_link}." + twitter_instructions_link_text: "Read more" + twitter_handle_placeholder: username + invalid_twitter_handle: "Twitter handle should contain only at maximum 15 alphanumeric (letters A-Z and numbers 0-9) characters." + facebook_connect: Facebook + facebook_connect_info_text: "In order to enable Facebook Login, create an application for your marketplace in the Facebook developers dashboard. Add the generated id and secret key of the application here." + facebook_connect_info_text_with_instructions: "In order to enable Facebook Login, create an application for your marketplace in the Facebook developers dashboard. Add the generated id and secret key of the application here. %{instructions_link}" + facebook_instructions_link_text: "See instructions for configuring Facebook Connect." + facebook_connect_id: "Facebook client id" + invalid_facebook_connect_id: "Client id should contain only numbers." + facebook_connect_secret: "Facebook client secret" + invalid_facebook_connect_secret: "Client secret should contain only numbers and letters from a to f." + save: "Save settings" analytics: - analytics: ~ - google_analytics_key: ~ - google_analytics_key_info_text: ~ - google_analytics_key_info_text_with_instructions: ~ - google_analytics_instructions_link_text: ~ - save: ~ + analytics: Analytics + google_analytics_key: "Google Analytics tracking ID" + google_analytics_key_info_text: "Tracking ID of your Google Analytics account." + google_analytics_key_info_text_with_instructions: "Tracking ID of your Google Analytics account. %{instructions_link}." + google_analytics_instructions_link_text: "Read more about connecting Google Analytics" + save: "Save settings" menu_links: - menu_links: ~ - save: ~ - add_menu_link: ~ - title_placeholder: ~ - url_placeholder: ~ - title: ~ - language: ~ - url: ~ - empty: ~ - max_number_of_links: ~ - all: ~ - max_number_of_links_info: ~ - about_page: ~ + menu_links: "Menu links" + save: "Save settings" + add_menu_link: "Add a new link to menu" + title_placeholder: "Link title" + url_placeholder: "http://example.com/en" + title: Title + language: Language + url: URL + empty: "You don't have any additional menu links" + max_number_of_links: "Maximum number of links displayed in the top bar: %{select_max_number}" + all: All + max_number_of_links_info: "Link to %{about_page} is always displayed as the first menu link" + about_page: "about page" topbar: - topbar: ~ - new_listing_button_label: ~ - invalid_post_listing_button_label: ~ + topbar: "Top bar" + new_listing_button_label: "Post a new listing button text" + invalid_post_listing_button_label: "Please provide a valid text for \"Post a new listing\" button" transactions: - export_all_as_csv: ~ - transactions: ~ + export_all_as_csv: "Export all as CSV" + transactions: "View transactions" headers: - conversation: ~ - listing: ~ - status: ~ - sum: ~ - started: ~ - last_activity: ~ - initiated_by: ~ - other_party: ~ + conversation: "Conversation thread" + listing: Listing + status: Status + sum: Sum + started: Started + last_activity: "Latest activity" + initiated_by: Starter + other_party: "Other party" status: - conversation: ~ - free: ~ - pending: ~ - preauthorized: ~ - accepted: ~ - rejected: ~ - paid: ~ - confirmed: ~ + conversation: Conversation + free: "Free transaction" + pending: Pending + preauthorized: Preauthorized + accepted: Accepted + rejected: Rejected + paid: Paid + confirmed: Completed canceled: Cancelled - initiated: ~ - pending_ext: ~ + initiated: "Waiting PayPal payment" + pending_ext: "Waiting PayPal payment" none: - free: ~ + free: "Free transaction" paypal: - free: ~ - pending: ~ - preauthorized: ~ - accepted: ~ - rejected: ~ - paid: ~ - confirmed: ~ - canceled: ~ - initiated: ~ - pending_ext: ~ + free: Conversation + pending: Pending + preauthorized: Preauthorized + accepted: Accepted + rejected: Rejected + paid: Paid + confirmed: Confirmed + canceled: Canceled + initiated: "Waiting PayPal payment" + pending_ext: "Waiting PayPal payment" stripe: - free: ~ - pending: ~ - preauthorized: ~ - accepted: ~ - rejected: ~ - paid: ~ - confirmed: ~ - canceled: ~ - initiated: ~ - pending_ext: ~ - not_available: ~ + free: Conversation + pending: Pending + preauthorized: Preauthorized + accepted: Accepted + rejected: Rejected + paid: Paid + confirmed: Confirmed + canceled: Canceled + initiated: "Waiting Stripe payment" + pending_ext: "Waiting Stripe payment" + not_available: "Not available" conversations: - conversations: ~ + conversations: "View conversations" headers: - started_from: ~ - status: ~ - started: ~ - last_activity: ~ - initiated_by: ~ - other_party: ~ - participants: ~ - profile: ~ + started_from: "Started from" + status: Status + started: Started + last_activity: "Latest Activity" + initiated_by: Starter + other_party: "Other party" + participants: "Conversation: %{starter} with %{author}" + profile: "%{author}'s Profile" custom_fields: edit: - edit_listing_field: ~ + edit_listing_field: "Edit listing field '%{field_name}'" edit_price: - description: ~ - edit_price_field: ~ - show_price_filter_homepage: ~ - price_min: ~ - price_max: ~ + description: "The minimum and maximum price only affect the filter. They do not set a limit for listing prices." + edit_price_field: "Edit listing field 'Price'" + show_price_filter_homepage: "Show price filter on homepage" + price_min: "Filter minimum price" + price_max: "Filter maximum price" edit_location: - edit_location_field: ~ - this_field_is_required: ~ + edit_location_field: "Edit listing field 'Location'" + this_field_is_required: "This field is required" edit_expiration: - edit_expiration_field: ~ - enable: ~ + edit_expiration_field: "Edit listing field 'Expiration date'" + enable: "Enable expiration date" form: field_required: - this_field_is_required: ~ - this_field_is_required_checkbox: ~ + this_field_is_required: "Make it mandatory to fill in this field when creating a new listing" + this_field_is_required_checkbox: "Make it mandatory to fill in this field when creating a new listing (user has to select at least one option)" search_filter: - search_filter: ~ - date_cant_be_filtered: ~ - text_cant_be_filtered: ~ + search_filter: "Display a filter based on this field on the homepage" + date_cant_be_filtered: "There's no filter available for date field." + text_cant_be_filtered: "There's no filter for text field. The main text search searches from text fields." index: - listing_fields: ~ - listing_fields_help: ~ - add_new_field: ~ - remove_field_confirmation: ~ - cancel: ~ - save: ~ - field_title: ~ - field_type: ~ - categories: ~ - select_all: ~ - clear_all: ~ - options: ~ - add_option: ~ - saving_order: ~ - save_order_successful: ~ - save_order_error: ~ - select_one: ~ - continue: ~ - minimum_value: ~ - maximum_value: ~ - allow_decimals: ~ + listing_fields: "Listing fields & filters" + listing_fields_help: "Here you can edit the fields that users have to fill in when they create a new listing. Please note that some fields are predefined and cannot be edited." + add_new_field: "Add new field:" + remove_field_confirmation: "Are you sure you want to remove field '%{field_name}'?" + cancel: Cancel + save: Save + field_title: "Field title" + field_type: "Field type" + categories: "Listing categories where the field is used" + select_all: "Select all" + clear_all: "Clear all" + options: Options + add_option: "+ Add option" + saving_order: "Saving field order" + save_order_successful: "Successfully saved field order" + save_order_error: "An error occurred while saving field order. Please refresh the page and try again." + select_one: "Select field type..." + continue: Continue + minimum_value: Minimum + maximum_value: Maximum + allow_decimals: "Allow decimals" new: - new_listing_field: ~ + new_listing_field: "New listing field" field_types: - text: ~ - number: ~ - dropdown: ~ - checkbox_group: ~ - date: ~ + text: Text + number: Number + dropdown: Dropdown + checkbox_group: "Checkbox group" + date: Date emails: new: - send_email_to_members: ~ - send_email_to_members_title: ~ - send_email: ~ - send_email_or: ~ - send_test_email: ~ - test_sent: ~ - send_email_article_title: ~ - send_email_article_text: ~ + send_email_to_members: "Send email to users" + send_email_to_members_title: "Send email to your users" + send_email: "Send the email" + send_email_or: or + send_test_email: "Send a test email to yourself" + test_sent: "Test email was sent to your inbox" + send_email_article_title: "this article" + send_email_article_text: "You can learn more about the user segments in %{article_link}." recipients: - title: ~ + title: "Who do you want to email?" options: - all_users: ~ - with_listing: ~ - with_listing_no_payment: ~ - with_payment_no_listing: ~ - no_listing_no_payment: ~ - email_subject: ~ - email_content: ~ - email_content_placeholder: ~ - email_language: ~ - any_language: ~ - message_will_be_sent_only_to_people_with_this_language: ~ - email_sent: ~ + all_users: "All users" + with_listing: "Users who have posted at least one listing" + with_listing_no_payment: "Users who have posted at least one listing but haven't added their payment details" + with_payment_no_listing: "Users who have added their payment details but haven't posted a listing" + no_listing_no_payment: "Users who haven't posted a listing and haven't added their payment details" + email_subject: "Email subject" + email_content: "Email content" + email_content_placeholder: "What do you want to say to your users?" + email_language: "Language of the email receivers" + any_language: "Any language" + message_will_be_sent_only_to_people_with_this_language: "The email will be sent only to the users who are using %{service_name} in the language you choose." + email_sent: "Email sent." left_hand_navigation: - general: ~ - users_and_transactions: ~ - configure: ~ - emails_title: ~ - subscription: ~ - preview: ~ + general: General + users_and_transactions: "Users & transactions" + configure: Configuration + emails_title: Emails + subscription: Subscription + preview: "Preview site" listing_shapes: - availability_title: ~ - read_more: ~ - read_more_availability_management: ~ - allow_providers_to_manage_availability: ~ - per_day_availability: ~ - per_night_availability: ~ - pricing_units_disabled_info: ~ - can_not_find_name: ~ + availability_title: Availability + read_more: "Read more about automatic availability management." + read_more_availability_management: "Read more about availability management." + allow_providers_to_manage_availability: "Allow providers to manage their availability from a calendar" + per_day_availability: "\"Per day\" availability" + per_night_availability: "\"Per night\" availability" + pricing_units_disabled_info: "Pricing units cannot be used when availability calendar is enabled." + can_not_find_name: "Can not find order type with given name: %{name}" index: - listing_shapes: ~ - description: ~ - read_more_about_order_types: ~ - add_new_shape: ~ - select_template: ~ - all_categories: ~ - no_categories: ~ - category_count: ~ + listing_shapes: "Order types" + description: "Order types determine how the order process works in your site. You can decide whether your users are renting or selling, or perhaps just posting announcements and communicating via direct messages." + read_more_about_order_types: "Read more about order types" + add_new_shape: "Add new order type: " + select_template: "Select template..." + all_categories: "All categories" + no_categories: "No categories" + category_count: "%{category_count} categories" header: - listing_shape_name: ~ - listing_shape_categories: ~ + listing_shape_name: "Order type name" + listing_shape_categories: "Categories where it's used" order: - saving_order: ~ - save_order_successful: ~ - save_order_error: ~ + saving_order: "Saving order" + save_order_successful: "Successfully saved order type order" + save_order_error: "An error occurred while saving order. Please refresh the page and try again." templates: - selling_products: ~ - renting_products: ~ - offering_services: ~ - giving_things_away: ~ - requesting: ~ - announcement: ~ - custom: ~ + selling_products: "Selling products" + renting_products: "Renting products" + offering_services: "Offering services" + giving_things_away: "Giving things away" + requesting: Requesting + announcement: "Posting announcements" + custom: Custom new: - create_listing_shape: ~ - create: ~ - cancel: ~ - create_success: ~ - create_failure: ~ + create_listing_shape: "Create order type" + create: Create + cancel: Cancel + create_success: "New order type '%{shape}' created" + create_failure: "Could not create new order type. Error: %{error_msg}" edit: - edit_listing_shape: ~ - update: ~ - cancel: ~ - update_success: ~ - update_failure: ~ - delete: ~ - can_not_delete_last: ~ - can_not_delete_only_one_in_categories: ~ - listing_shape_name: ~ - listing_shape_name_placeholder: ~ - action_button_label: ~ - action_button_placeholder: ~ - successfully_closed: ~ - successfully_deleted: ~ - pricing_and_checkout_title: ~ - online_payments_label: ~ - shipping_label: ~ - price_label: ~ - units_title: ~ - units_desc: ~ + edit_listing_shape: "Edit order type '%{shape}'" + update: Save + cancel: Cancel + update_success: "Changes to order type '%{shape}' saved" + update_failure: "Could not save changes. Error: %{error_msg}" + delete: "Delete order type" + confirm_delete_order_type: + one: "There is %{count} listing with this order type. If you delete the order type, this listing will be closed. Are you sure you want to delete the order type?" + other: "There are %{count} listings with this order type. If you delete the order type, those listings will be closed. Are you sure you want to delete the order type?" + can_not_delete_last: "You can't delete this order type because it's the only type in your marketplace." + can_not_delete_only_one_in_categories: "You can't delete this order type because in following categories this order type is the only one in use: %{categories}" + listing_shape_name: Name + listing_shape_name_placeholder: "E.g. Sell" + action_button_label: "Checkout button label" + action_button_placeholder: "E.g. Buy" + open_listings_warning: + one: "There is %{count} open listing with this order type. If you change any of the settings below, that listing will retain the old settings. The listing can be changed to the new settings by editing it manually. If you don't want to have the listing with the old settings visible on your site, you can close it by clicking the button below." + other: "There are %{count} open listings with this order type. If you change any of the settings below, those listings will retain the old settings. Those listings can be changed to the new settings by editing them manually. If you don't want to have any listings with the old settings visible on your site, you can close them by clicking the button below." + close_listings_action: + one: "Close %{count} listing" + other: "Close %{count} listings" + confirm_close_listings_action: + one: "Are you sure you want to close %{count} listing?" + other: "Are you sure you want to close %{count} listings?" + successfully_closed: "Successfully closed listings" + successfully_deleted: "Successfully deleted order type '%{order_type}'" + pricing_and_checkout_title: "Pricing & checkout" + online_payments_label: "Allow sellers to accept payments online" + shipping_label: "Allow sellers to define a shipping fee" + price_label: "Allow sellers to add a price to their listings" + units_title: "Pricing units" + units_desc: "If you have enabled pricing units, the listing price is displayed as \"price per pricing unit\". An example: \"$39 per hour\"." units: - piece: ~ - hour: ~ - day: ~ - night: ~ - week: ~ - month: ~ - can_not_find: ~ - add_custom_unit: ~ - delete_custom_unit: ~ + piece: "Per piece" + hour: "Per hour" + day: "Per day" + night: "Per night" + week: "Per week" + month: "Per month" + can_not_find: "Can't find order type with id: %{id}" + add_custom_unit: "+ Add a custom pricing unit…" + delete_custom_unit: delete custom_unit_form: - title: ~ - label_heading: ~ - selector_label_heading: ~ - label_placeholder: ~ - selector_placeholder: ~ - per: ~ + title: "New pricing unit" + label_heading: Label + selector_label_heading: "Selector label" + label_placeholder: "eg. \"kg\", \"30 minutes\", \"person\", \"class\"" + selector_placeholder: "eg. \"Number of people\", \"Amount in kg\"" + per: Per unit_type: - heading: ~ - quantity_label: ~ - time_label: ~ + heading: "Unit type" + quantity_label: "Quantity (per piece, per kg, per person, per 2 hour tour...)" + time_label: "Time (per 30 minutes, per 2 weeks, per year...)" paypal_accounts: - marketplace_paypal_integration: ~ - preferences_updated: ~ - contact_support_link_text: ~ - integration_info_text: ~ - link_paypal_personal_account_label: ~ - link_paypal_personal_account: ~ - link_stripe_personal_account: ~ - link_paypal_and_stripe_personal_account: ~ - personal_payment_preferences_link_text: ~ - read_more_about_paypal: ~ - edit_payment_settings: ~ - supported_currencies_information_text: ~ - currency_change_warning_text: ~ - marketplace_currency_label: ~ - minimum_listing_price_label: ~ - transaction_fee_label: ~ - minimum_transaction_fee_label: ~ - save_settings: ~ - minimum_listing_price_below_tx_fee: ~ - minimum_listing_price_below_min: ~ + marketplace_paypal_integration: "Payment system preferences" + preferences_updated: "Payment system preferences updated" + contact_support_link_text: "contact support" + integration_info_text: "The payment system of your marketplace is powered by PayPal. To allow your users to pay using your marketplace, you must connect your PayPal account. Once you have connected your PayPal account, you can choose a minimum transaction size and a possible commission fee." + link_paypal_personal_account_label: "Are you providing products or services yourself?" + link_paypal_personal_account: "If so, you will also need to connect your PayPal account to %{personal_payment_preferences_link}." + link_stripe_personal_account: "If so, you will also need to add your payout details to %{personal_payment_preferences_link}." + link_paypal_and_stripe_personal_account: "If so, you will also need to connect your PayPal or Stripe account to %{personal_payment_preferences_link}." + personal_payment_preferences_link_text: "your personal marketplace account" + read_more_about_paypal: "Read more about the payment system" + edit_payment_settings: "Edit payment settings" + supported_currencies_information_text: "Sharetribe's online payment system supports 24 currencies. If your currency is not on the list, please %{contact_support_link}. If you change the marketplace currency, existing listings will retain their old currency. You need to edit those listings individually to convert them to the new currency." + currency_change_warning_text: "Heads up: if you move forward with this currency change, don't forget to ask your sellers to manually edit their existing listings to get the currency update." + marketplace_currency_label: "Marketplace currency:" + minimum_listing_price_label: "Minimum transaction size:" + transaction_fee_label: "Transaction fee:" + minimum_transaction_fee_label: "Minimum transaction fee:" + save_settings: "Save settings" + minimum_listing_price_below_tx_fee: "The minimum transaction size has to be greater than or equal to the minimum transaction fee: %{minimum_transaction_fee}." + minimum_listing_price_below_min: "The minimum transaction size has to be greater than the minimum commission %{minimum_commission}." payment_preferences: - title: ~ - general_settings: ~ - connect_a_payment_provider: ~ - contact_support: ~ - no_payments_link_text: ~ - your_country: ~ - you_cannot_use_online_payments: ~ - which_to_choose: ~ - you_can_use_stripe_or_paypal: ~ - you_can_use_stripe_only: ~ - read_more_stripe: ~ - you_can_use_paypal_only: ~ - read_more_paypal: ~ - read_more_about_paypal_and_stripe: ~ - general_settings_updated: ~ - transaction_fee_settings_updated: ~ - choose_popup_text: ~ - invalid_api_keys: ~ - missing_api_keys: ~ - stripe_verified: ~ - change_settings: ~ - configure_stripe: ~ - configure_paypal: ~ - transaction_fee_settings: ~ - transaction_fee_save: ~ - stripe_fee: ~ - stripe_fee_notice: ~ - fee_should_be_less_than_minimum_price: ~ - confirm_disable: ~ + title: "Payment system preferences" + general_settings: "1. General settings" + connect_a_payment_provider: "2. Connect a payment provider" + contact_support: "contact support" + no_payments_link_text: here + your_country: "Your country:" + you_cannot_use_online_payments: "You cannot use online payments in %{country_name} with %{currency}. Please choose a different currency or %{support_link} to change your country. You can read more about supported countries and currencies %{help_link}. In the future we might add more payment providers and support more currencies" + which_to_choose: "Which one to choose?" + you_can_use_stripe_or_paypal: "You can use either Stripe, PayPal or both as your payment providers. %{choose_link}" + you_can_use_stripe_only: "You can use Stripe as your payment provider. %{read_more_link}" + read_more_stripe: "Read more about Stripe payments." + you_can_use_paypal_only: "You can use PayPal as your payment provider. %{read_more_link}" + read_more_paypal: "Read more about PayPal payments." + read_more_about_paypal_and_stripe: "Read more about online payments, Stripe and PayPal" + general_settings_updated: "Payment system general settings updated" + transaction_fee_settings_updated: "Transaction fee settings updated" + choose_popup_text: |- + If you want to allow your users to accept online payments, you need to choose the currency for your marketplace and then connect at least one of the two payment providers supported by Sharetribe: Stripe and PayPal. You can also choose to use both, which means your users will be able to accept payments with either payment method. + You can create a new account with either service if you don't have one already. Once you have connected an account, you can choose a possible fee you're charging from each transaction. + What's the difference between Stripe and PayPal? Stripe allows you to delay payout to the seller up to 3 months and offers one payment method (credit/debit card). Stripe also allows your providers to receive money directly to their bank account simply by providing their bank details. PayPal provides two payment methods (credit card and PayPal account) and offers a protection program for buyers and sellers. It requires your providers to create a PayPal Business Account to accept payments. + If you use Stripe, its fees will be deducted from your transaction fee, so remember to set a high enough minimum fee. If you use PayPal, its fees will be charged from the provider separately, in addition to your transaction fee. Stripe and PayPal have a bit different fee structure. In most cases Stripe's fees are a bit lower. + invalid_api_keys: "Invalid Stripe API keys" + missing_api_keys: "Missing Stripe API keys" + stripe_verified: "Stripe API access verified" + change_settings: "Change settings and fees" + configure_stripe: "Configure Stripe" + configure_paypal: "Configure PayPal" + transaction_fee_settings: "Transaction fee settings" + transaction_fee_save: Save + stripe_fee: "Stripe's fees" + stripe_fee_notice: "%{stripe_fee_link} will be deducted from the transaction fee you are charging." + fee_should_be_less_than_minimum_price: "Minimum transaction fee must be lower than minimum transaction size" + confirm_disable: "Are you sure you want to disable %{gateway}? If you disable it, providers will no longer be able to receive money and buyers will no longer be able to pay through this payment method. If providers haven't configured another payment method, buyers will not be able to buy from them." stripe_connected: - title: ~ - disable: ~ - disabled: ~ - enable: ~ + title: "Stripe connected" + disable: "Disable Stripe" + disabled: "Stripe disabled" + enable: "Enable Stripe again" paypal_connected: - title: ~ - disable: ~ - disabled: ~ - enable: ~ - cannot_enable_gateway: ~ - cannot_disable_gateway: ~ + title: "PayPal connected" + disable: "Disable PayPal" + disabled: "PayPal disabled" + enable: "Enable PayPal again" + cannot_enable_gateway: "Cannot enable payment gateway %{gateway}." + cannot_disable_gateway: "Cannot disable payment gateway %{gateway}." stripe_form: - add_your_api_keys: ~ - how_to_get_these: ~ - publishable_key_example: ~ - secret_key_example: ~ - save_api_keys: ~ - invalid_secret: ~ - invalid_publishable: ~ + add_your_api_keys: "Add your Stripe API keys" + how_to_get_these: "How to get these?" + publishable_key_example: "For example: %{api_publishable_key_example}" + secret_key_example: "For example: %{api_secret_key_example}" + save_api_keys: "Save Stripe API keys" + invalid_secret: "That doesn't look like a correct %{secret_key}" + invalid_publishable: "That doesn't look like a correct %{publishable_key}" index: - header: ~ - info: ~ - active: ~ - gateway: ~ - process: ~ - commission: ~ - minimum_price: ~ - minimum_fee: ~ - api_verified: ~ - actions: ~ - payments_not_enabled: ~ + header: "Available Payment Settings" + info: "You can configure available payment gateways for use in your marketplace. Currently PayPal and Stripe are supported." + active: Active + gateway: Gateway + process: Process + commission: Commission + minimum_price: Min.price + minimum_fee: Min.fee + api_verified: "API verified?" + actions: Actions + payments_not_enabled: "Payments are not enabled for your marketplace" transaction_types: - sell: ~ - rent: ~ - give: ~ - lend: ~ - swap: ~ - service: ~ - request: ~ - inquiry: ~ - share_for_free: ~ + sell: Selling + rent: "Renting out" + give: "Giving away" + lend: Lending + swap: Swapping + service: Offering + request: Requesting + inquiry: Announcement + share_for_free: "Sharing for free" default_action_button_labels: - sell: ~ - rent: ~ - request: ~ - offer: ~ - inquiry: ~ + sell: Buy + rent: Rent + request: Offer + offer: Request + inquiry: Contact common: - edit_page: ~ - default_community_slogan: ~ - default_community_description: ~ - cancel: ~ - fields_that_are_mandatory: ~ - or: ~ - password: ~ - service_name: ~ + edit_page: "Edit page" + default_community_slogan: "Community marketplace" + default_community_description: "This is a place to sell, rent, swap and share goods and services with the other members of the marketplace." + cancel: Cancel + fields_that_are_mandatory: "Fields marked with star (*) are mandatory." + or: or + password: Password + service_name: "%{service_name}" share_types: - request: ~ - offer: ~ - borrow: ~ - buy: ~ - give_away: ~ - lend: ~ - receive: ~ - rent: ~ - rent_out: ~ - sell: ~ - offer_to_swap: ~ - request_to_swap: ~ - share_for_free: ~ - accept_for_free: ~ + request: request + offer: offer + borrow: borrowing + buy: buying + give_away: "giving away" + lend: lending + receive: "taking for free" + rent: renting + rent_out: "renting out" + sell: selling + offer_to_swap: swapping + request_to_swap: swapping + share_for_free: "sharing for free" + accept_for_free: "wanting to use for free" categories: - item: ~ - favor: ~ - rideshare: ~ - housing: ~ - tools: ~ - sports: ~ - music: ~ - books: ~ - games: ~ - furniture: ~ - outdoors: ~ - food: ~ - electronics: ~ - pets: ~ - film: ~ - clothes: ~ - garden: ~ - travel: ~ - other: ~ - username: ~ - username_or_email: ~ - what_is_this: ~ - removed_user: ~ + item: Items + favor: Services + rideshare: Rideshare + housing: Spaces + tools: Tools + sports: Sports + music: Music + books: "Books & Magazines" + games: "Games & Toys" + furniture: Furniture + outdoors: "Camping & Outdoors" + food: "Food & Kitchen" + electronics: Electronics + pets: "Pets & Animals" + film: "Film & Movies" + clothes: "Clothes & Accessories" + garden: Garden + travel: Travel + other: Other + username: Username + username_or_email: "Email or username" + what_is_this: "What's this?" + removed_user: "Removed user" payment_fee_info: - title: ~ - title_paypal: ~ - stripe: ~ - paypal: ~ - info: ~ + title: "Payment processing fee" + title_paypal: "PayPal's processing fee" + stripe: Stripe + paypal: PayPal + info: "Payments in %{service_name} are processed by either Stripe or PayPal. They both charge a fee from each payment." paypal_fee_info: - title: ~ - body_text: ~ - body_text_accept: ~ - link_to_paypal_text: ~ + title: "PayPal's payment processing fee" + body_text: |- + For PayPal payments, %{service_name} charges a commission of %{paypal_commission}%. PayPal's fees are not included in this commission, so in addition to %{service_name} commission, you also need to pay PayPal's fees from each payment processed by PayPal. PayPal's fee is between 2% and 5% of the total sales price, depending on your monthly sales volume and the country of residence of the buyer. In general, domestic purchases have lower fees than international ones, and higher monthly sales give you a discount on fees. + You can see the exact fees by logging in to your PayPal account and going %{link_to_paypal}. After each purchase you will get a receipt displaying the exact fee. + body_text_accept: |- + This transaction is processed by PayPal. PayPal charges a processing fee from each payment. This fee is between 2% and 5% of the total sales price, depending on your monthly sales volume and the country of residence of the buyer. In general, domestic purchases have lower fees than international ones, and higher monthly sales give you a discount on fees. + You can see the exact fees by logging in to your PayPal account and going %{link_to_paypal}. After each purchase you will get a receipt displaying the exact fee. + link_to_paypal_text: here paypal_only_fee_info: - title: ~ - body_text: ~ - link_to_paypal_text: ~ + title: "PayPal's payment processing fee" + body_text: |- + Payments in %{service_name} are processed by PayPal. PayPal charges a processing fee from each payment. This fee is between 2% and 5% of the total sales price, depending on your monthly sales volume and the country of residence of the buyer. In general, domestic purchases have lower fees than international ones, and higher monthly sales give you a discount on fees. + You can see the exact fees by logging in to your PayPal account and going %{link_to_paypal}. After each purchase you will get a receipt displaying the exact fee. + link_to_paypal_text: here stripe_fee_info: - title: ~ - body_text: ~ - link_to_stripe_text: ~ + title: "Stripe's payment processing fee" + body_text: "For Stripe payments, %{service_name} charges a commission of %{stripe_commission}%. Stripe's fees are included in this commission." + link_to_stripe_text: here conversations: accept: - details: ~ - order_by: ~ - accept_offer: ~ - accept_request: ~ - reject_offer: ~ - reject_request: ~ - close_listing: ~ - update_later: ~ - optional_message: ~ - price_to_pay: ~ - accept: ~ - decline: ~ - quantity_label: ~ - sum_label: ~ - service_fee_label: ~ - you_will_get_label: ~ - total_label: ~ - total_value: ~ - total_value_paypal: ~ - total_value_stripe: ~ - paypal_fee_info: ~ - payment_fee_info: ~ - shipping_price_label: ~ - stripe-fee_label: ~ + details: "Order details" + order_by: "Order by %{orderer_link}" + accept_offer: "Accept the offer" + accept_request: "Accept the request" + reject_offer: "Not this time" + reject_request: "Not this time" + close_listing: "Close the listing %{listing_title_link}" + update_later: "Leave the listing open" + optional_message: "Optional message" + price_to_pay: "Total price to be paid" + accept: Accept + decline: Decline + quantity_label: "Quantity:" + sum_label: "Subtotal:" + service_fee_label: "%{service_name} fee:" + you_will_get_label: "You will get:" + total_label: "Total:" + total_value: "%{seller_gets}*" + total_value_paypal: "%{seller_gets}*" + total_value_stripe: "%{seller_gets}" + paypal_fee_info: "* Excludes PayPal's payment processing fee" + payment_fee_info: "* Excludes payment processing fee" + shipping_price_label: "Shipping:" + stripe-fee_label: "Payment processing fee" confirm: - confirm_description: ~ - cancel_description: ~ - cancel_payed_description: ~ - canceling_payed_transaction: ~ - confirm: ~ - cancel: ~ - continue: ~ - give_feedback_to: ~ - do_not_give_feedback: ~ + confirm_description: "If your order has been fulfilled you should confirm it as done. Then you can give feedback to the other party." + cancel_description: "If your order was not fulfilled, you can mark it as 'disputed'. You can still give feedback to the other party and describe what happened." + cancel_payed_description: "If your request was accepted but you're having second thoughts, you can still cancel the request before the payment." + canceling_payed_transaction: "Cancel transaction" + confirm: "Mark completed" + cancel: Dispute + continue: Continue + give_feedback_to: "Give feedback to %{person_link}" + do_not_give_feedback: "Skip feedback" details: - day: ~ - days: ~ - price_per_day: ~ + day: day + days: days + price_per_day: "Price per day: %{price}" index: - loading_more_messages: ~ - message_partitive: ~ - messages_partitive: ~ - no_received_messages: ~ - no_sent_messages: ~ + loading_more_messages: "Loading more messages" + message_partitive: message + messages_partitive: messages + no_received_messages: "No messages" + no_sent_messages: "No sent messages" conversation: - accepted_request: ~ - accepted_offer: ~ - rejected_request: ~ - rejected_offer: ~ - confirmed_request: ~ - confirmed_offer: ~ + accepted_request: "Request accepted." + accepted_offer: "Offer accepted." + rejected_request: "Request rejected." + rejected_offer: "Offer rejected." + confirmed_request: "Order completed." + confirmed_offer: "Offer completed." canceled_request: "Order cancelled." canceled_offer: "Offer cancelled." - message_from: ~ - about_listing: ~ - free_message: ~ - message_content_not_available: ~ + message_from: "Message from %{person}" + about_listing: "About listing %{listing_title}" + free_message: "Direct message" + message_content_not_available: "Message content not available" message: - accepted_request: ~ - received_payment: ~ - accepted_offer: ~ + accepted_request: "accepted the request" + received_payment: "accepted the request, received payment for %{sum}" + accepted_offer: "accepted the offer" rejected_request: "rejected the request, cancelled the payment" - rejected_offer: ~ - confirmed_request: ~ - confirmed_offer: ~ + rejected_offer: "rejected the offer" + confirmed_request: "marked the order as completed" + confirmed_offer: "marked the offer as completed" canceled_request: "cancelled the order" canceled_offer: "cancelled the offer" - paid: ~ - payment_preauthorized: ~ + paid: "paid %{sum}" + payment_preauthorized: "Payment authorized: %{sum}" new: - message: ~ - message_to: ~ - optional_message_to: ~ - send_message: ~ - send: ~ - this_message_is_private: ~ - you_will_get_notified_of_acceptance: ~ - you_will_get_notified: ~ - title: ~ - send_message_to_user: ~ - about_listing: ~ - author_has_to_accept_request: ~ + message: Message + message_to: "Message to %{author_name}" + optional_message_to: "Optional message to %{author_name}" + send_message: "Send message" + send: Send + this_message_is_private: "This message is private between you and %{person}. %{person} will be notified of this message by email." + you_will_get_notified_of_acceptance: "You will get an email notification when %{person} accepts or rejects your proposal." + you_will_get_notified: "You will get an email notification when %{person} answers you." + title: Title + send_message_to_user: "Send message to %{person}" + about_listing: "About listing %{listing_title}" + author_has_to_accept_request: "%{author_name} needs to accept the request before you can pay" show: - in_response_to_listing: ~ - message_sent_by: ~ - message_sent_to: ~ - send_reply: ~ - write_a_reply: ~ - conversation_about_listing: ~ - conversation_with_user: ~ - conversation_with: ~ - last_message_at: ~ - price: ~ - sum: ~ - total: ~ + in_response_to_listing: "about listing" + message_sent_by: "Message sent by" + message_sent_to: "Message sent to" + send_reply: "Send reply" + write_a_reply: "Write a reply:" + conversation_about_listing: "With %{person} about %{listing}" + conversation_with_user: "With %{person}" + conversation_with: "Conversation with %{person}" + last_message_at: "(latest message %{time})" + price: "Price: %{price}" + sum: "Total: %{sum}" + total: "Total: %{total}" status: - payment_errored: ~ - payment_errored_starter: ~ - payment_errored_author: ~ - cancel_payed_transaction: ~ - feedback_given: ~ - feedback_skipped: ~ - give_feedback: ~ - offer_accepted: ~ - offer_rejected: ~ + payment_errored: "Payment failed. Please try again." + payment_errored_starter: "Payment failed. Please try again. If the problem continues, please contact Sharetribe support." + payment_errored_author: "Payment failed. Please contact %{starter_name} and ask them to try the payment again." + cancel_payed_transaction: Cancel + feedback_given: "Feedback given" + feedback_skipped: "Feedback skipped" + give_feedback: "Give feedback" + offer_accepted: Accepted + offer_rejected: Rejected offer_canceled: Cancelled - offer_confirmed: ~ - offer_paid: ~ - offer_preauthorized: ~ - offer_waiting_for_payment: ~ - pay: ~ - preauthorized: ~ - paid: ~ + offer_confirmed: Completed + offer_paid: "Payment successful" + offer_preauthorized: "Payment successful" + offer_waiting_for_payment: "Waiting for %{requester_name} to pay" + pay: Pay + preauthorized: "Payment successful" + paid: "Payment successful" pending_external: paypal: - multicurrency: ~ - verify: ~ - intl: ~ - waiting_for_current_user_to_deliver_listing: ~ - waiting_for_listing_author_to_deliver_listing: ~ - request_accepted: ~ - request_rejected: ~ - request_confirmed: ~ + multicurrency: "We couldn't process the PayPal payment because your PayPal account has not been set up to receive money in %{currency}. Go to %{paypal_url} and log in to your account to manually accept or reject the payment." + verify: "You cannot accept this transaction because you haven't verified your PayPal account. Go to %{paypal_url} to verify your account." + intl: "We couldn't process the PayPal payment because your PayPal account does not have a withdrawal mechanism. Go to %{paypal_url} and log in to your account to manually accept or reject the payment." + waiting_for_current_user_to_deliver_listing: "Waiting for you to fulfill the order for %{listing_title}" + waiting_for_listing_author_to_deliver_listing: "Waiting for %{listing_author_name} to fulfill the order for %{listing_title}" + request_accepted: Accepted + request_rejected: Rejected + request_confirmed: Completed request_canceled: Cancelled - request_paid: ~ - request_preauthorized: ~ - skip_feedback: ~ - waiting_for_listing_author_to_accept_offer: ~ - waiting_for_listing_author_to_accept_request: ~ - waiting_for_you_to_accept_request: ~ - waiting_confirmation_from_requester: ~ - waiting_confirmation_from_you: ~ - waiting_payment_from_requester: ~ - waiting_payment_from_you: ~ - waiting_feedback_from_you: ~ + request_paid: "Payment successful" + request_preauthorized: "Payment authorized" + skip_feedback: "Skip feedback" + waiting_for_listing_author_to_accept_offer: "Waiting for %{listing_author_name} to accept the offer" + waiting_for_listing_author_to_accept_request: "Waiting for %{listing_author_name} to accept the request. As soon as %{listing_author_name} accepts, you will be charged." + waiting_for_you_to_accept_request: "Waiting for you to accept the request" + waiting_confirmation_from_requester: "Waiting for %{requester_name} to mark the order completed" + waiting_confirmation_from_you: "Waiting for you to mark the order completed" + waiting_payment_from_requester: "Waiting for %{requester_name} to pay" + waiting_payment_from_you: "Waiting for you to pay" + waiting_feedback_from_you: "Waiting for you to give feedback" pending_external_inbox: paypal: - multicurrency: ~ - intl: ~ - unknown_reason: ~ - verify: ~ + multicurrency: "Waiting for you to accept the PayPal payment" + intl: "Waiting for you to accept the PayPal payment" + unknown_reason: "Payment is pending. Log in to your PayPal account to see more details." + verify: "Waiting for you to verify your PayPal account" status_link: - accept_offer: ~ - accept_request: ~ - reject_offer: ~ - reject_request: ~ - accept_preauthorized_offer: ~ - accept_preauthorized_request: ~ - reject_preauthorized_offer: ~ - reject_preauthorized_request: ~ - confirm: ~ - cancel: ~ + accept_offer: "Accept offer" + accept_request: "Accept request" + reject_offer: "Not this time" + reject_request: "Not this time" + accept_preauthorized_offer: "Accept offer" + accept_preauthorized_request: "Accept request" + reject_preauthorized_offer: "Not this time" + reject_preauthorized_request: "Not this time" + confirm: "Mark completed" + cancel: Dispute feedback: - feedback_subject: ~ - feedback_body: ~ - unlogged_user: ~ - anonymous_user: ~ + feedback_subject: "New feedback from %{service_name}" + feedback_body: "%{author_name_and_email} has sent the following feedback from %{service_name}" + unlogged_user: "Unlogged user" + anonymous_user: "Anonymous user" community_memberships: access_denied: - access_denied: ~ - you_are_banned_in_this_community: ~ - contact_page_link: ~ + access_denied: "Access denied" + you_are_banned_in_this_community: "The team has prevented you from accessing %{service_name}. If you want to contact the %{service_name} team, you can %{link_to_contact_page}." + contact_page_link: "contact them" new: - welcome_fb_user: ~ - fb_join_accept_terms: ~ - join_community: ~ - you_can_join: ~ - you_can_join_email_confirmation: ~ - you_can_join_email_confirmation_multiple_addresses: ~ - you_can_join_with_invite_only: ~ - if_want_to_view_content: ~ - log_out: ~ - join_community_button: ~ + welcome_fb_user: "Welcome to %{service_name}, %{name}!" + fb_join_accept_terms: "There's one more step to join %{service_name}: you need to accept the terms of use." + join_community: "Join %{service_name}" + you_can_join: "You can join %{service_name} by accepting the terms of use and clicking 'Join %{service_name}' below." + you_can_join_email_confirmation: "To join %{service_name} you need to have a valid email address that ends with %{email_ending}. You can join by filling in your email address, accepting the terms of use and clicking 'Join %{service_name}' below, and confirming your email." + you_can_join_email_confirmation_multiple_addresses: "%{service_name} has email restrictions. You can only join if you have an allowed email address. You can join by filling in your email address, accepting the terms of use of %{service_name} and clicking 'Join %{service_name}' below." + you_can_join_with_invite_only: "You have to have an invitation from another member to join %{service_name}. If you have an invitation code, you can join by typing the code to the field below, accepting the terms of use and clicking 'Join %{service_name}' below." + if_want_to_view_content: "If you want to view the content in %{service_name} without joining it as a member you need to" + log_out: "log out" + join_community_button: "Join %{service_name}" give_consent: - invitation_code_invalid_or_used: ~ - email_not_allowed: ~ - email_not_available: ~ - consent_not_given: ~ + invitation_code_invalid_or_used: "The invitation code was invalid or already used." + email_not_allowed: "This email is not allowed in %{service_name}." + email_not_available: "The email you gave is already in use." + consent_not_given: "The terms were not accepted." emails: accept_reminder: - remember_to_accept_offer: ~ - remember_to_accept_request: ~ - you_can_accept_or_reject_offer_at: ~ - you_can_accept_or_reject_request_at: ~ - you_have_not_yet_accepted_or_rejected_offer: ~ - you_have_not_yet_accepted_or_rejected_request: ~ - show_thread: ~ + remember_to_accept_offer: "Remember to accept or reject an offer from %{sender_name}" + remember_to_accept_request: "Remember to accept or reject a request from %{sender_name}" + you_can_accept_or_reject_offer_at: "You can accept or reject the offer at" + you_can_accept_or_reject_request_at: "You can accept or reject the request at" + you_have_not_yet_accepted_or_rejected_offer: "You have not yet accepted or rejected the offer %{title} you received %{date}." + you_have_not_yet_accepted_or_rejected_request: "You have not yet accepted or rejected the request %{title} you received %{date}." + show_thread: "Show conversation" branding: - powered_by: ~ - create_own: ~ - learn_more: ~ + powered_by: "%{service_name} is powered by the %{sharetribe_link} marketplace platform." + create_own: "Want to create your own online marketplace website like %{service_name}? %{learn_more}." + learn_more: "Learn more" confirm_reminder: you_have_not_yet_confirmed_or_canceled_request: "You have not yet confirmed or cancelled the order %{request_link}. If the order has been completed, you should confirm that. After that you can give feedback to %{other_party_given_name}" - remember_to_confirm_request: ~ - if_will_not_happen_you_should_cancel: ~ - cancel_it_link_text: ~ - automatic_confirmation: ~ + remember_to_confirm_request: "Remember to confirm or cancel a request" + if_will_not_happen_you_should_cancel: "If you think this order will not be completed for one reason or another, you can %{cancel_it_link}." + cancel_it_link_text: "cancel it" + automatic_confirmation: "If you don't confirm or cancel the order within %{days_to_automatic_confirmation} days after the request was accepted, we will mark it automatically as completed." payment_settings_reminder: - remember_to_add_payment_details: ~ - you_have_added_listing_with_payment: ~ - please_go_to_payment_settings: ~ - payment_settings_link: ~ + remember_to_add_payment_details: "Remember to add your payment details to receive payments" + you_have_added_listing_with_payment: "You have added a listing %{listing_link} with payment. However, you haven't yet added your payment details. In order to receive the payment you have to add your payment information." + please_go_to_payment_settings: "Please go to your %{payment_settings_link} and fill in the required payment information." + payment_settings_link: "payment settings" transaction_confirmed: - here_is_a_message_from: ~ - request_marked_as_confirmed: ~ - request_marked_as_canceled: ~ - has_marked_request_as_confirmed: ~ + here_is_a_message_from: "Here's a message from %{other_party_given_name}:" + request_marked_as_confirmed: "Order completed - remember to give feedback" + request_marked_as_canceled: "Order canceled" + has_marked_request_as_confirmed: "%{other_party_full_name} has marked the order about '%{request}' completed. You can now give feedback to %{other_party_given_name}." has_marked_request_as_canceled: "%{other_party_full_name} has cancelled the order about '%{request}'. You can still give feedback to %{other_party_given_name}." - giving_feedback_is_good_idea: ~ - give_feedback_to: ~ + giving_feedback_is_good_idea: "Giving feedback is always a good idea. If everything went well, you should let others know that %{other_party_given_name} can be trusted. If there were any problems, it's good to mention those as well." + give_feedback_to: "Give feedback to %{other_party_given_name}" transaction_automatically_confirmed: - subject: ~ - we_have_marked_request_as_confirmed: ~ + subject: "Order automatically completed - remember to give feedback" + we_have_marked_request_as_confirmed: "We have marked the order about '%{request}' completed. The order was automatically completed because %{days_passed} days have passed since the request was accepted." booking_transaction_automatically_confirmed: - subject: ~ - we_have_marked_request_as_confirmed: ~ + subject: "Order automatically completed - remember to give feedback" + we_have_marked_request_as_confirmed: "We have marked the order about '%{request}' completed. The request was automatically completed because one day has passed since the booking period ended." automatically_confirmed_footer: - giving_feedback_is_good_idea: ~ - give_feedback_to: ~ - show_thread: ~ + giving_feedback_is_good_idea: "You can now give feedback to %{other_party_given_name}. Giving feedback is always a good idea. If everything went well, you should let others know that %{other_party_given_name} can be trusted. If there were any problems, it's good to mention those as well." + give_feedback_to: "Give feedback to %{other_party_given_name}" + show_thread: "Show conversation" confirmation_instructions: - confirmation_instructions_signature: ~ - need_to_confirm: ~ - confirmation_link_text: ~ - or_paste_link: ~ + confirmation_instructions_signature: "Best regards,
The %{service_name} Team" + need_to_confirm: "To join %{service_name}, confirm your email address by clicking the button below." + confirmation_link_text: "Confirm my address" + or_paste_link: "Alternatively, you can copy the following link to your browser's address bar:" common: - hey: ~ - kassi_team: ~ - thanks: ~ - dont_want_to_receive_these_emails: ~ - edit_your_email_settings_here: ~ - message_not_displaying_correctly: ~ - view_it_in_your_browser: ~ - or: ~ - unsubscribe_from_these_emails_info: ~ - unsubscribe_from_these_emails: ~ - unsubscribe_from_invitation_emails_info: ~ - unsubscribe_from_invitation_emails: ~ + hey: "Hello %{name}," + kassi_team: "The %{service_name} Team" + thanks: "Thanks," + dont_want_to_receive_these_emails: "Don't want to receive these emails?" + edit_your_email_settings_here: "Edit your email settings here" + message_not_displaying_correctly: "Is this email not displaying correctly?" + view_it_in_your_browser: "View it in your browser" + or: or + unsubscribe_from_these_emails_info: "You have received this email because you are a member of %{service_name}." + unsubscribe_from_these_emails: "unsubscribe from these emails" + unsubscribe_from_invitation_emails_info: "You have received this email because a member of %{service_name} has invited you to join them." + unsubscribe_from_invitation_emails: "Unsubscribe from invitation emails to join %{service_name}" conversation_status_changed: - has_accepted_your_offer: ~ - has_accepted_your_request: ~ - has_rejected_your_offer: ~ - has_rejected_your_request: ~ - view_thread: ~ - your_offer_was_accepted: ~ - your_offer_was_rejected: ~ - your_request_was_accepted: ~ - your_request_was_rejected: ~ - you_can_now_pay_to: ~ - pay_now: ~ - remember_to_confirm: ~ + has_accepted_your_offer: "%{accepter} has accepted your offer %{listing}." + has_accepted_your_request: "%{accepter} has accepted your request %{listing}." + has_rejected_your_offer: "%{accepter} has rejected your offer %{listing}." + has_rejected_your_request: "%{accepter} has rejected your request %{listing}." + view_thread: "View conversation" + your_offer_was_accepted: "Your offer was accepted" + your_offer_was_rejected: "Your offer was rejected" + your_request_was_accepted: "Your request was accepted" + your_request_was_rejected: "Your request was rejected" + you_can_now_pay_to: "You can now pay the requested amount to %{payment_receiver}." + pay_now: "Pay now" + remember_to_confirm: "When the order is fulfilled, remember to mark it as completed. If the order is not fulfilled your have %{days_to_automatic_confirmation} days to cancel it. Otherwise it will be automatically marked as completed." invitation_to_kassi: - hi: ~ - you_have_been_invited_to_kassi: ~ - here_is_a_message_from: ~ - join_now: ~ - invitation_code: ~ + hi: Hi! + you_have_been_invited_to_kassi: "%{inviter} has invited you to %{service_name}" + here_is_a_message_from: "Here is a personal message from %{inviter}:" + join_now: "Join now" + invitation_code: "Invitation code: %{code}" new_comment: - has_commented_your_listing_in_kassi: ~ - view_comment: ~ - you_have_a_new_comment: ~ - listing_you_follow_has_a_new_comment: ~ - has_commented_listing_you_follow_in_kassi: ~ + has_commented_your_listing_in_kassi: "%{author} has commented on your listing '%{listing}'." + view_comment: "View comment" + you_have_a_new_comment: "%{author} has commented on your listing in %{service_name}" + listing_you_follow_has_a_new_comment: "%{author} has commented on a listing you follow in %{service_name}" + has_commented_listing_you_follow_in_kassi: "%{author} has commented on the listing '%{listing}' you are following in %{service_name}." new_message: - view_message: ~ - has_sent_you_a_message_in_kassi: ~ - you_have_a_new_message: ~ + view_message: "View message" + has_sent_you_a_message_in_kassi: "%{sender} has sent you a message in %{service_name}." + you_have_a_new_message: "A new message in %{service_name} from %{sender_name}" new_payment: - new_payment: ~ - price_per_unit_type: ~ - quantity: ~ - you_have_received_new_payment: ~ + new_payment: "You have received a new payment" + price_per_unit_type: "Price per %{unit_type}" + quantity: "Quantity:" + you_have_received_new_payment: "You have been paid %{payment_sum} for %{listing_title} by %{payer_full_name}. Here is your receipt." payment_receipt_to_seller: - payment_gateway_fee: ~ - shipping_total: ~ - product: ~ - price_payer_paid: ~ - service_fee: ~ - you_will_get: ~ - new_payment: ~ - price_per_unit_type: ~ - quantity: ~ - you_have_received_new_payment: ~ + payment_gateway_fee: "Payment processing fee:" + shipping_total: "Shipping:" + product: "Product:" + price_payer_paid: "Price %{payer_full_name} paid:" + service_fee: "%{service_name} service fee:" + you_will_get: "Total:" + new_payment: "You have received a new payment" + price_per_unit_type: "Price per %{unit_type}" + quantity: "Quantity:" + you_have_received_new_payment: "You have been paid %{payment_sum} for %{listing_title} by %{payer_full_name}. Here is your receipt." payment_receipt_to_payer: - receipt_of_payment: ~ - you_have_made_new_payment: ~ - product: ~ - price_per_unit_type: ~ - duration: ~ - quantity: ~ - subtotal: ~ - total: ~ - price: ~ - service_fee: ~ - stripe_gateway_fee: ~ - paypal_gateway_fee: ~ - money_will_be_transferred: ~ + receipt_of_payment: "Receipt of payment" + you_have_made_new_payment: "You have paid %{payment_sum} for %{listing_title} to %{recipient_full_name}. Here is a receipt of the payment." + product: Product + price_per_unit_type: "Price per %{unit_type}" + duration: Duration + quantity: Quantity + subtotal: Subtotal + total: Total + price: Price + service_fee: "Service fee" + stripe_gateway_fee: "Stripe's fee:" + paypal_gateway_fee: "PayPal's fee:" + money_will_be_transferred: "The money will be transferred to %{recipient_name} when a) you have marked the request completed or b) %{automatic_confirmation_days} days have passed since you paid." paypal_new_payment: - paypal_gateway_fee: ~ - shipping_total: ~ + paypal_gateway_fee: "PayPal's fee:" + shipping_total: "Shipping:" braintree_new_payment: - product: ~ - price_payer_paid: ~ - service_fee: ~ - you_will_get: ~ + product: "Product:" + price_payer_paid: "Price %{payer_full_name} paid:" + service_fee: "%{service_name} service fee:" + you_will_get: "Total:" receipt_to_payer: - receipt_of_payment: ~ - you_have_made_new_payment: ~ - product: ~ - price_per_unit_type: ~ - duration: ~ - quantity: ~ - subtotal: ~ - total: ~ - price: ~ - service_fee: ~ - stripe_gateway_fee: ~ - paypal_gateway_fee: ~ - money_will_be_transferred: ~ + receipt_of_payment: "Receipt of payment" + you_have_made_new_payment: "You have paid %{payment_sum} for %{listing_title} to %{recipient_full_name}. Here is a receipt of the payment." + product: Product + price_per_unit_type: "Price per %{unit_type}" + duration: Duration + quantity: Quantity + subtotal: Subtotal + total: Total + price: Price + service_fee: "Service fee" + stripe_gateway_fee: "Stripe's fee:" + paypal_gateway_fee: "PayPal's fee:" + money_will_be_transferred: "The money will be transferred to %{recipient_name} when a) you have marked the request completed or b) %{automatic_confirmation_days} days have passed since you paid." new_testimonial: - has_given_you_feedback_in_kassi: ~ - you_can_give_feedback_to: ~ - view_feedback: ~ + has_given_you_feedback_in_kassi: "%{name} has given you feedback in %{service_name}" + you_can_give_feedback_to: "You haven't yet given feedback to %{name}." + view_feedback: "View feedback" new_update_to_listing: - listing_you_follow_has_been_updated: ~ - has_updated_listing_you_follow_in_kassi: ~ - view_changes: ~ + listing_you_follow_has_been_updated: "Listing you follow has been updated" + has_updated_listing_you_follow_in_kassi: "%{author} has updated the listing '%{listing}' you are following in %{service_name}." + view_changes: "View changes" community_updates: - added_offer: ~ - added_request: ~ - added_listing: ~ - update_mail_title: ~ - title_link_text: ~ - intro_paragraph: ~ - intro_paragraph_link_text: ~ - reduce_email_footer_text: ~ - settings_link_text: ~ - unsubscribe_link_text: ~ + added_offer: "%{name_link} added a listing:" + added_request: "%{name_link} added a listing:" + added_listing: "%{name_link} added a listing:" + update_mail_title: "%{title_link} update" + title_link_text: "%{community_name}" + intro_paragraph: "Here are some of the things that happened on %{community_link} during the past %{time_since_last_update}." + intro_paragraph_link_text: "%{community_name}" + reduce_email_footer_text: "Too much email? %{settings_link} or %{unsubscribe_link}." + settings_link_text: "Edit your email settings here" + unsubscribe_link_text: unsubscribe newsletter: - hi: ~ - newest_offers: ~ - newest_requests: ~ - text_version_text: ~ + hi: "Hi %{name}," + newest_offers: "What people currently offer to others" + newest_requests: "What people currently need" + text_version_text: "Could you share something that others might need? Or do you need something that others might have? Add an offer or a request or check everything that the others are offering or requesting at %{url}" reset_password_instructions: - change_my_password: ~ - reset_password_instructions: ~ + change_my_password: "Change my password" + reset_password_instructions: "

You have indicated that you have forgotten either your password or username in the %{service_name} service.

Your username is: %{username}

If you need to reset your password, click the following link: %{password_reset_link}


If you didn't request this, please ignore this email. Your password won't change until you access the link above and create a new one.

" testimonial_reminder: - remember_to_give_feedback_to: ~ - you_have_not_given_feedback_yet: ~ + remember_to_give_feedback_to: "Reminder: remember to give feedback to %{name}" + you_have_not_given_feedback_yet: "You have not yet given feedback to %{name} about event '%{event}'. Remember to give feedback on how %{given_name} performed in the event." transaction_preauthorized: - subject: ~ - transaction_requested_by_user: ~ - you_have_time_to_accept: ~ - if_you_do_accept: ~ - if_you_do_accept_stripe: ~ - if_you_do_not_accept: ~ - click_here_to_reply: ~ + subject: "%{requester} is interested and has authorized payment for %{listing_title} published in %{service_name}" + transaction_requested_by_user: "Great news! %{requester} is interested in \"%{listing_title}\" and has authorized payment for this listing." + you_have_time_to_accept: "You need to accept or reject the request within %{payment_expires_in}. If you accept within this timeframe, the payment will go through. If you don't accept, the request will be automatically rejected and you will not get paid." + if_you_do_accept: "If you accept the request within this timeframe, you will receive the money immediately to your account." + if_you_do_accept_stripe: "If you accept the request within this timeframe, the payment will go through. You will receive the money directly to your bank account after you have delivered %{listing_title} to %{requester}." + if_you_do_not_accept: "If you reject the request or don't accept it within this timeframe, the transaction will be automatically cancelled, %{requester} will not be charged and you will not get paid." + click_here_to_reply: "Click here to respond to the request" transaction_preauthorized_reminder: - subject: ~ - remember_to_accept: ~ - one_day_left: ~ - click_here_to_reply: ~ + subject: "Remember to accept the request from %{requester} about listing %{listing_title}" + remember_to_accept: "Remember to accept the request from %{requester} about listing \"%{listing_title}\". %{requester} has already paid for the listing. You have to accept the request in order to receive the payment." + one_day_left: "If you don't accept the request within one day the request will be automatically rejected and you will not get paid." + click_here_to_reply: "Click here to respond to the request" welcome_email: - welcome_email_subject: ~ - welcome_to_marketplace: ~ - love_marketplace_crew: ~ - welcome_email_footer_text: ~ - settings_link_text: ~ + welcome_email_subject: "Welcome to %{service_name}" + welcome_to_marketplace: "Welcome to %{service_name}! Glad to have you on board." + love_marketplace_crew: "Love,
%{service_name} crew" + welcome_email_footer_text: "What kind of emails do you want to receive from %{service_name}? %{settings_link}" + settings_link_text: "Check your settings" new_listing_by_followed_person: - subject: ~ - has_posted_a_new_listing: ~ - you_are_receiving_this_because: ~ - view_listing: ~ + subject: "%{author_name} has posted a new listing in %{service_name}" + has_posted_a_new_listing: "%{author_name} has posted a new listing:" + you_are_receiving_this_because: "You received this notification because you follow %{author_name}." + view_listing: "View listing" new_member_notification: - new_member_has_joined: ~ - this_is_automatic_message: ~ - person_name: ~ - person_email: ~ + new_member_has_joined: "A new member has joined %{community}. They may still have to confirm their email address." + this_is_automatic_message: "This is an automatic message sent to administrators of %{community}." + person_name: "Name:" + person_email: "Email:" error_messages: booking: - booking_failed_payment_voided: ~ - double_booking_payment_voided: ~ + booking_failed_payment_voided: "Booking failed due to an unexpected error. Please try again later. You haven't been charged." + double_booking_payment_voided: "Unfortunately the dates you chose are no longer available. Please choose different dates. You haven’t been charged." onboarding: - server_rendering: ~ + server_rendering: "Getting started guide failed to load. We have been informed about the situation and we are fixing it." listings: - departure_time: ~ - share_type: ~ - valid_until: ~ - price: ~ - minimum_price: ~ + departure_time: "Departure time must be between current time and one year from now." + share_type: "You must select one." + valid_until: "This date must be between current time and 6 months from now." + price: "Price must be a whole number." + minimum_price: "Minimum price is %{minimum_price} %{currency}." testimonials: - you_must_explain_not_neutral_feedback: ~ - you_must_select_a_grade: ~ + you_must_explain_not_neutral_feedback: "If you want to give non-neutral feedback, you must explain why." + you_must_select_a_grade: "Remember to tell whether your experience was positive or negative." transaction_agreement: - required_error: ~ + required_error: "You need to accept the agreement" paypal: - transaction_cannot_complete: ~ - buyer_cannot_pay_error: ~ - pending_review_error: ~ - seller_express_checkout_disabled: ~ - generic_error: ~ - cancel_error: ~ - accept_authorization_error: ~ - reject_authorization_error: ~ + transaction_cannot_complete: "Transaction cannot complete. This is most likely caused by the credit card failing bank authorization. Please, try purchasing again with an alternative payment method." + buyer_cannot_pay_error: "The payment has been declined by PayPal. Please contact their Customer Service for more information: %{customer_service_link}" + pending_review_error: "The payment was submitted but was flagged by PayPal as 'requiring a review'. When PayPal completes the review, the payment will be automatically authorized." + seller_express_checkout_disabled: "PayPal Express Checkout has been disabled for the listing author's PayPal account. Please contact the author and let them know that there's an issue with their PayPal account, and advise them to contact PayPal Customer Service." + generic_error: "An error occurred during the payment process. Could not finalize your PayPal payment." + cancel_error: "An error occurred during cancellation. Could not finalize cancel." + accept_authorization_error: "An error occurred while trying to accept preauthorized Paypal payment. Please, try again." + reject_authorization_error: "An error occurred while trying to reject preauthorized Paypal payment. Please, try again." stripe: - generic_error: ~ + generic_error: "An error occurred during the payment process. Could not finalize your Stripe payment." error_pages: - back_to_kassi_front_page: ~ + back_to_kassi_front_page: "Back to the front page" error_404: - if_you_believe: ~ - page_can_not_be_found: ~ - page_you_requested_can_not_be_found: ~ - error_404_title: ~ + if_you_believe: "If you believe that the address is correct and it should be working, please help us locate the error by letting us know what address caused the error and what should be seen on the page with the form below." + page_can_not_be_found: "Page not found!" + page_you_requested_can_not_be_found: "The page you requested cannot be found. Are you sure you spelled the address correctly?" + error_404_title: "page not found" error_410: - page_removed: ~ - page_you_requested_has_been_removed: ~ - page_removed_reason: ~ - error_410_title: ~ + page_removed: "Page removed" + page_you_requested_has_been_removed: "The page you requested has been removed." + page_removed_reason: "There are a few possible reasons for this. For example, a user might have removed their account or a listing might have been removed." + error_410_title: "page removed" error_500: - temporary_unavailable: ~ - unable_to_process: ~ - we_hate_this: ~ - refer_to_error_id: ~ - error_500_title: ~ - error_description: ~ + temporary_unavailable: "Marketplace temporarily unavailable" + unable_to_process: "The service is unable to process your request right now. Please try again in few moments." + we_hate_this: "We hate when this happens! We have been informed about the situation and we are fixing it." + refer_to_error_id: "If you wish to contact the support regarding this issue, please include an error ID \"%{error_id}\" in your message." + error_500_title: "page loading failed" + error_description: "Error description" no_javascript: - javascript_is_disabled_in_your_browser: ~ - kassi_does_not_currently_work_without_javascript: ~ - contact_us: ~ - send_feedback: ~ - your_feedback_to_admins: ~ - send: ~ - your_email_address: ~ + javascript_is_disabled_in_your_browser: "Javascript is disabled in your browser" + kassi_does_not_currently_work_without_javascript: "%{service_name} does not work properly without javascript. Try to enable javascript from your browser's preferences and then reload this page again." + contact_us: "contact us" + send_feedback: "Send message" + your_feedback_to_admins: "Your message to %{service_name} team" + send: Send + your_email_address: "Your email address" errors: messages: - invalid_date: ~ - invalid_time: ~ - invalid_datetime: ~ - is_at: ~ - before: ~ - on_or_before: ~ - after: ~ - on_or_after: ~ - positive_number: ~ + invalid_date: "is not a valid date" + invalid_time: "is not a valid time" + invalid_datetime: "is not a valid datetime" + is_at: "must be at %{restriction}" + before: "must be before %{restriction}" + on_or_before: "must be on or before %{restriction}" + after: "must be after %{restriction}" + on_or_after: "must be on or after %{restriction}" + positive_number: "Insert a number." event_feed_events: accept: - has_accepted_lend_item: ~ - has_accepted_borrow_item: ~ - has_accepted_rent_out_item: ~ - has_accepted_rent_item: ~ - has_accepted_give_away_item: ~ - has_accepted_receive_item: ~ - has_accepted_sell_item: ~ - has_accepted_buy_item: ~ - has_accepted_trade_item: ~ - has_accepted_sell_housing: ~ - has_accepted_buy_housing: ~ - has_accepted_rent_out_housing: ~ - has_accepted_rent_housing: ~ - has_accepted_favor: ~ - has_accepted_rideshare: ~ + has_accepted_lend_item: "%{offerer_name} agreed to lend %{listing_title} to %{requester_name} %{time_ago}." + has_accepted_borrow_item: "%{offerer_name} agreed to lend %{listing_title} to %{requester_name} %{time_ago}." + has_accepted_rent_out_item: "%{offerer_name} agreed to rent %{listing_title} to %{requester_name} %{time_ago}." + has_accepted_rent_item: "%{offerer_name} agreed to rent %{listing_title} to %{requester_name} %{time_ago}." + has_accepted_give_away_item: "%{offerer_name} agreed to give %{listing_title} to %{requester_name} %{time_ago}." + has_accepted_receive_item: "%{offerer_name} agreed to give %{listing_title} to %{requester_name} %{time_ago}." + has_accepted_sell_item: "%{offerer_name} agreed to sell %{listing_title} to %{requester_name} %{time_ago}." + has_accepted_buy_item: "%{offerer_name} agreed to sell %{listing_title} to %{requester_name} %{time_ago}." + has_accepted_trade_item: "%{offerer_name} agreed to swap %{listing_title} with %{requester_name} %{time_ago}." + has_accepted_sell_housing: "%{offerer_name} agreed to sell %{listing_title} to %{requester_name} %{time_ago}." + has_accepted_buy_housing: "%{offerer_name} agreed to sell %{listing_title} to %{requester_name} %{time_ago}." + has_accepted_rent_out_housing: "%{offerer_name} agreed to rent %{listing_title} to %{requester_name} %{time_ago}." + has_accepted_rent_housing: "%{offerer_name} agreed to rent %{listing_title} to %{requester_name} %{time_ago}." + has_accepted_favor: "%{offerer_name} agreed to offer %{listing_title} to %{requester_name} %{time_ago}." + has_accepted_rideshare: "%{offerer_name} agreed on sharing a ride %{listing_title} with %{requester_name} %{time_ago}." join: - joined_kassi: ~ + joined_kassi: "%{name} joined %{service_name} %{time_ago}." login: - logged_in_to_kassi: ~ + logged_in_to_kassi: "%{name} logged in to %{service_name} %{time_ago}." comment: - commented: ~ - offer_partitive: ~ - request_partitive: ~ + commented: "%{commenter_name} commented on listing %{listing_title} %{time_ago}." + offer_partitive: offer + request_partitive: request header: - about: ~ - home: ~ - members: ~ - new_listing: ~ - mobile_version: ~ - offers: ~ - requests: ~ - search_kassi: ~ - create_new_marketplace: ~ - contact_us: ~ - profile: ~ - manage_listings: ~ - invite: ~ - login: ~ - signup: ~ - menu: ~ + about: About + home: Home + members: Community + new_listing: "New listing" + mobile_version: "Mobile version" + offers: Offers + requests: Requests + search_kassi: "Search %{service_name}" + create_new_marketplace: "Create a new marketplace" + contact_us: "Contact us" + profile: Profile + manage_listings: "Manage listings" + invite: "Invite new members" + login: "Log in" + signup: "Sign up" + menu: Menu homepage: additional_private_listings_slate: - additionally_one_private_offer_exists: ~ - additionally_one_private_request_exists: ~ - additionally_some_private_offers_exist: ~ - additionally_some_private_requests_exist: ~ + additionally_one_private_offer_exists: "Additionally there is one other offer," + additionally_one_private_request_exists: "Additionally there is one other request," + additionally_some_private_offers_exist: "Additionally there are %{number_of_listings} other offers," + additionally_some_private_requests_exist: "Additionally there are %{number_of_listings} other requests," blank_slate: - add_first: ~ - but_that_is_visible_only_to_registered_members: ~ - but_those_are_visible_only_to_registered_members: ~ - create_new_account_for_yourself: ~ - examples_of_what_you_could_offer_to_others: ~ - examples_of_what_you_could_request_to_others: ~ - favor_offer_list: ~ - favor_request_list: ~ - favors_to_offer: ~ - favors_to_request: ~ - item_offer_list: ~ - item_request_list: ~ - items_to_offer: ~ - items_to_request: ~ - log_in: ~ - no_offers_visible_unless_logged_in: ~ - no_open_offers_currently: ~ - no_open_requests_currently: ~ - no_requests_visible_unless_logged_in: ~ - one_private_offer_exists: ~ - one_private_request_exists: ~ - ride_offer: ~ - ride_request: ~ - some_private_offers_exist: ~ - some_private_requests_exist: ~ + add_first: "Add one!" + but_that_is_visible_only_to_registered_members: "but that is visible only to registered members." + but_those_are_visible_only_to_registered_members: "but those are visible only to registered members." + create_new_account_for_yourself: "Create yourself a new account" + examples_of_what_you_could_offer_to_others: "What could you offer to others" + examples_of_what_you_could_request_to_others: "What could you request from the others" + favor_offer_list: "computer assistance, clothes repair, baking, bike fixing" + favor_request_list: "babysitting, piano lessons, walking dogs, mowing lawn" + favors_to_offer: "Help: " + favors_to_request: "Help: " + item_offer_list: "tools, sports equipment, costumes, camping equipment" + item_request_list: "tools, sports equipment, costumes, camping equipment" + items_to_offer: "Goods to lend: " + items_to_request: "Goods to borrow: " + log_in: "log in!" + no_offers_visible_unless_logged_in: "No item, service or rideshare offers visible to users who are not logged in." + no_open_offers_currently: "No open item, service or rideshare offers." + no_open_requests_currently: "No open item, service or rideshare requests." + no_requests_visible_unless_logged_in: "No item, service or rideshare requests visible to users who are not logged in." + one_private_offer_exists: "There is already one offer," + one_private_request_exists: "There is already one request," + ride_offer: "Take others' kids to their hobbies" + ride_request: "A ride to work" + some_private_offers_exist: "There are already %{number_of_listings} offers," + some_private_requests_exist: "There are already %{number_of_listings} requests," custom_filters: - update_view: ~ - min: ~ - max: ~ + update_view: "Update view" + min: "Min:" + max: "Max:" event_feed: - latest_events: ~ + latest_events: "What's going on" grid_item: - processing_uploaded_image: ~ + processing_uploaded_image: "(Processing uploaded image...)" index: - no_listings_with_your_search_criteria: ~ - no_listings_notification: ~ - add_listing_link_text: ~ - open_listing: ~ - open_listings: ~ - private_listing_notification_log_in: ~ - is: ~ - are: ~ - what_do_you_need: ~ - post_new_listing: ~ - are_offering: ~ - add_news_item: ~ - lend_rent_help_carpool: ~ - loading_more_content: ~ - more_events: ~ - news: ~ - no_news: ~ - more_news: ~ - or: ~ - or_see_what_the_others: ~ - recent_events: ~ - requesting: ~ - tell_it_here: ~ - welcome_to_new_kassi: ~ - no_reviews: ~ - no_image: ~ - filter: ~ - this_is_private_community: ~ + no_listings_with_your_search_criteria: "Sorry, no listings could be found for your search criteria. Maybe try other search terms?" + no_listings_notification: "No listings. %{add_listing_link}." + add_listing_link_text: "Add new listing" + open_listing: "open listing" + open_listings: "open listings" + private_listing_notification_log_in: "log in" + is: is + are: are + what_do_you_need: "What are you looking for?" + post_new_listing: "Post a new listing" + are_offering: offer + add_news_item: "Add an article" + lend_rent_help_carpool: "Sell, lend, help, share rides" + loading_more_content: "Loading more content" + more_events: "More events..." + news: News + no_news: "No news" + more_news: "More news" + or: and + or_see_what_the_others: "...or see what the others" + recent_events: "Recent events" + requesting: need + tell_it_here: "Tell it here!" + welcome_to_new_kassi: "Welcome to new %{service_name}!" + no_reviews: "No reviews" + no_image: "No image" + filter: Filter + this_is_private_community: "You need to sign up before you can view the content." invitation_form: - email: ~ - message: ~ - send_invitation: ~ - add_email_addresses_description: ~ - add_lots_of_email_addresses: ~ - this_article_link: ~ - invitation_emails_field_placeholder: ~ - invitation_message_field_placeholder: ~ - errors_in_emails: ~ + email: "Email address(es)" + message: "A personal message" + send_invitation: "Send invitation" + add_email_addresses_description: "Add the email addresses of the people you are inviting to the field below. To add multiple email addresses, separate them with comma." + add_lots_of_email_addresses: "As you are an administrator, here is a tip: if you plan to send lots of invitations, you should use an emailing tool. Check out %{this_article_link} to find out resources about suitable email services." + this_article_link: "this article" + invitation_emails_field_placeholder: "friend1@example.com, friend2@example.com, ..." + invitation_message_field_placeholder: "I joined this amazing marketplace. You should too!" + errors_in_emails: "Check that the email addresses you added are valid and don't contain any unusual characters. If you added multiple addresses, make sure they are separated with comma." list_item: - review: ~ - reviews: ~ - distance_away: ~ + review: review + reviews: reviews + distance_away: "%{distance} %{distance_unit} away" news_item: - show_less: ~ - show_more: ~ + show_less: "Show less" + show_more: "Show more" profile_info_empty_notification: - add_your_info: ~ - add_a_profile_picture: ~ - you_have_not_added_your_info: ~ - add_your_info_link: ~ + add_your_info: "Add your contact info" + add_a_profile_picture: "Add a profile picture" + you_have_not_added_your_info: "You have not added your contact information. Please do, so others can get in touch with you more easily. Also add a profile picture so it's easier for others to trust you." + add_your_info_link: "Add your info now" recent_listing: - please_offer: ~ - comment: ~ - comments: ~ + please_offer: Offer + comment: comment + comments: comments filters: - show: ~ - search: ~ - map: ~ - list: ~ - map_button: ~ - grid_button: ~ - list_button: ~ - all_listing_types: ~ - all_categories: ~ + show: "Filter:" + search: Search + map: "Show map" + list: "Show list" + map_button: Map + grid_button: Grid + list_button: List + all_listing_types: "All listing types" + all_categories: "All categories" errors: - search_engine_not_responding: ~ + search_engine_not_responding: "Search is currently unavailable. Try searching again soon." infos: about: - default_about_text_title: ~ - default_about_text: ~ - click_here_link_text: ~ + default_about_text_title: "What is Sharetribe?" + default_about_text: "This marketplace is powered by Sharetribe platform. With Sharetribe you can easily create your own marketplace website. It's free and only takes a minute. %{click_here_link} to learn more!" + click_here_link_text: "Click here" how_to_use: - default_title: ~ - default_content: ~ + default_title: "How it works" + default_content: "Here you can find information about how %{marketplace_name} works." landing_page: hero: - search: ~ - signup: ~ - search_placeholder: ~ - search_location_placeholder: ~ + search: Search + signup: "Sign up" + search_placeholder: "What are you looking for?" + search_location_placeholder: Location listings: - no_listing_image: ~ + no_listing_image: "No picture" layouts: admin: - admin: ~ + admin: "%{service_name} admin panel" branding: - powered_by: ~ - create_own: ~ - learn_more: ~ + powered_by: "%{service_name} is powered by the %{sharetribe_link} marketplace platform." + create_own: "Want to create your own online marketplace website like %{service_name}? %{learn_more}." + learn_more: "Learn more" no_tribe: - inbox: ~ - settings: ~ - feedback: ~ + inbox: Inbox + settings: Settings + feedback: "Contact %{service_name} team" application: - join_this_community: ~ - read_more: ~ - feedback: ~ - dont_use_to_contact_support: ~ - feedback_forum: ~ - feedback_handle: ~ - give_feedback: ~ - or_check_our: ~ - send_feedback_to_admin: ~ - to_see_what_others_have_suggested: ~ - your_email_address: ~ - connect: ~ - invite_your_friends: ~ - invite_your_neighbors: ~ - invite_your_friends_description: ~ - invite_your_friends_invite_only_description: ~ - join_without_facebook: ~ - join_without_facebook_link: ~ + join_this_community: "Join marketplace" + read_more: "Read more" + feedback: "Your message to %{service_name} team" + dont_use_to_contact_support: "We noticed you're an admin of %{service_name}. This form is what your users use to contact you. You cannot use this form to contact Sharetribe support. You can do that via the support widget in the bottom right corner of the admin panel instead." + feedback_forum: "feedback forum" + feedback_handle: Feedback + give_feedback: "Contact us" + or_check_our: "...or check our" + send_feedback_to_admin: "Send message" + to_see_what_others_have_suggested: "to see what other users have suggested, and vote for the ideas there." + your_email_address: "Your email address (to contact you)" + connect: "Sign up" + invite_your_friends: "Invite friends!" + invite_your_neighbors: "Invite neighbors!" + invite_your_friends_description: "The more people there are in %{service_name}, the more useful it is." + invite_your_friends_invite_only_description: "People cannot join %{service_name} unless they are invited." + join_without_facebook: "...or alternatively %{join_without_facebook_link}" + join_without_facebook_link: "sign up without using Facebook" conversations: - messages: ~ - notifications: ~ - received: ~ - sent: ~ + messages: Messages + notifications: Notifications + received: Received + sent: Sent global-header: - select_language: ~ + select_language: "Select language" infos: - about: ~ - how_to_use: ~ - info_about_kassi: ~ - news: ~ - register_details: ~ - terms: ~ + about: About + how_to_use: "How it works" + info_about_kassi: "Information about %{service_name}" + news: News + register_details: Privacy + terms: "Terms of use" logged_in: - admin: ~ - go_to_your_profile_page: ~ - hi: ~ - login: ~ - logout: ~ - notifications: ~ - requests: ~ - settings: ~ - sign_up: ~ + admin: Admin + go_to_your_profile_page: Profile + hi: Hi + login: "Log in" + logout: "Log out" + notifications: Notifications + requests: "Friend requests" + settings: Settings + sign_up: "Create account" logged_in_messages_icon: - messages: ~ + messages: Messages logged_in_notifications_icon: - notifications: ~ + notifications: Notifications mobile_logged_in: - admin: ~ - go_to_your_profile_page: ~ - hi: ~ - login: ~ - logout: ~ - notifications: ~ - requests: ~ - settings: ~ - sign_up: ~ + admin: Admin + go_to_your_profile_page: Profile + hi: Hi + login: "Log in" + logout: "Log out" + notifications: Notifications + requests: "Friend requests" + settings: Settings + sign_up: "Sign up" notifications: - listing_could_not_be_saved: ~ - contact_admin_link_text: ~ - test_welcome_email_delivered_to: ~ - something_went_wrong: ~ - community_updated: ~ - community_update_failed: ~ - account_creation_succesful_you_still_need_to_confirm_your_email: ~ - community_joined_succesfully_you_still_need_to_confirm_your_email: ~ - comment_cannot_be_empty: ~ - comment_sent: ~ - confirmation_link_is_wrong_or_used: ~ - additional_email_confirmed: ~ - could_not_get_email_from_facebook: ~ - facebook_email_unconfirmed: ~ - create_new_listing: ~ - create_one_here: ~ - email_confirmation_sent_to_new_address: ~ - email_not_found: ~ - error_with_session: ~ - feedback_considered_spam: ~ - feedback_not_saved: ~ - feedback_saved: ~ - feedback_sent_to: ~ - feedback_skipped: ~ - invitation_cannot_be_sent: ~ - invitation_cannot_unsubscribe: ~ - invitation_limit_reached: ~ - invitation_sent: ~ - invitation_successfully_unsubscribed: ~ - inviting_new_users_is_not_allowed_in_this_community: ~ - login_again: ~ - login_failed: ~ - account_creation_successful: ~ - account_deleted: ~ - login_successful: ~ - logout_successful: ~ - news_item_created: ~ - news_item_creation_failed: ~ - news_item_update_failed: ~ - news_item_updated: ~ - news_item_deleted: ~ - offer_accepted: ~ - offer_confirmed: ~ - offer_closed: ~ - listing_created_successfully: ~ - offer_rejected: ~ + listing_could_not_be_saved: "Listing could not be saved. Please try again. If the problem persists, please %{contact_admin_link}." + contact_admin_link_text: "contact the %{service_name} team" + test_welcome_email_delivered_to: "A test email was sent to %{email}." + something_went_wrong: "Something went wrong" + community_updated: "Details updated." + community_update_failed: "Detail update failed." + account_creation_succesful_you_still_need_to_confirm_your_email: "Your account was created successfully. Now you need to confirm your email address." + community_joined_succesfully_you_still_need_to_confirm_your_email: "Thanks for joining %{service_name}. Now you need to confirm your email address." + comment_cannot_be_empty: "Comment cannot be empty" + comment_sent: "Comment sent" + confirmation_link_is_wrong_or_used: "The confirmation link is already used or otherwise broken. Try logging in, or send feedback if the problem persists." + additional_email_confirmed: "The email you entered is now confirmed." + could_not_get_email_from_facebook: "Could not get email address from Facebook and can't create an account without email." + facebook_email_unconfirmed: "The email address '%{email}' associated with your Facebook account is already used but it hasn't been confirmed yet. Please confirm the email address before logging in with Facebook." + create_new_listing: "Create another listing" + create_one_here: "create one here" + email_confirmation_sent_to_new_address: "Email confirmation is now sent to the new address." + email_not_found: "The email you gave was not found from %{service_name} database." + error_with_session: "Error with session." + feedback_considered_spam: "Feedback not saved, due to its formatting. Try again or use the feedback forum." + feedback_not_saved: "Feedback could not be sent." + feedback_saved: "Thanks a lot for your message! We'll get back to you as soon as possible." + feedback_sent_to: "Feedback sent to %{target_person}." + feedback_skipped: "Feedback skipped" + invitation_cannot_be_sent: "Invitation could not be sent" + invitation_cannot_unsubscribe: "Cannot unsubscribe from invitation emails" + invitation_limit_reached: "You were trying to send too many invitations. Daily limit reached." + invitation_sent: "Invitation sent successfully" + invitation_successfully_unsubscribed: "Successfully unsubscribed from invitation emails" + inviting_new_users_is_not_allowed_in_this_community: "Inviting new users is not allowed." + login_again: "Please log in again." + login_failed: "Login failed. Please enter the correct credentials." + account_creation_successful: "Welcome to %{service_name}, %{person_name}!" + account_deleted: "Your account is now deleted." + login_successful: "Welcome, %{person_name}!" + logout_successful: "You have now been logged out of %{service_name}. See you soon!" + news_item_created: "Article created" + news_item_creation_failed: "Article creation failed" + news_item_update_failed: "Article update failed" + news_item_updated: "Article updated" + news_item_deleted: "Article removed" + offer_accepted: "Offer accepted" + offer_confirmed: "Offer completed" + offer_closed: "Offer closed" + listing_created_successfully: "Listing created successfully. %{new_listing_link}." + offer_rejected: "Offer rejected" offer_canceled: "Offer cancelled" - listing_updated_successfully: ~ - listing_updated_availability_management_enabled: ~ - listing_updated_availability_management_disabled: ~ - only_kassi_administrators_can_access_this_area: ~ - only_listing_author_can_close_a_listing: ~ - only_listing_author_can_edit_a_listing: ~ - payment_successful: ~ + listing_updated_successfully: "Listing updated successfully" + listing_updated_availability_management_enabled: "Listing updated successfully. Availability management enabled." + listing_updated_availability_management_disabled: "Listing updated successfully. Availability management disabled." + only_kassi_administrators_can_access_this_area: "Only the %{service_name} team can access this area" + only_listing_author_can_close_a_listing: "Only listing author can close a listing" + only_listing_author_can_edit_a_listing: "Only listing author can edit a listing" + payment_successful: "Payment successful" payment_canceled: "Payment cancelled" - error_in_payment: ~ - cannot_receive_payment: ~ - payment_waiting_for_later_accomplishment: ~ - password_recovery_sent: ~ - person_activated: ~ - person_deactivated: ~ - person_updated_successfully: ~ - poll_answered: ~ - poll_could_not_be_answered: ~ - poll_created: ~ - poll_creation_failed: ~ - poll_update_failed: ~ - poll_updated: ~ - poll_deleted: ~ - read_more: ~ - registration_considered_spam: ~ - reply_cannot_be_empty: ~ - reply_sent: ~ - request_accepted: ~ - request_confirmed: ~ - request_rejected: ~ + error_in_payment: "Error in payment. If you didn't complete the payment yet, try again. If you did, please send us feedback." + cannot_receive_payment: "The other party can't receive the payment due some error. Please contact the %{service_name} team to clarify the situation" + payment_waiting_for_later_accomplishment: "When you have paid, we'll notify the seller and you will get a receipt in email" + password_recovery_sent: "Instructions to change your password were sent to your email." + person_activated: "User activated" + person_deactivated: "User deactivated" + person_updated_successfully: "Information updated" + poll_answered: "Poll answered" + poll_could_not_be_answered: "Poll could not be answered" + poll_created: "Poll created" + poll_creation_failed: "Poll creation failed" + poll_update_failed: "Poll update failed" + poll_updated: "Poll updated" + poll_deleted: "Poll removed" + read_more: "Read more!" + registration_considered_spam: "Registration did not work, please contact us from header menu and mention \"email2 error\"." + reply_cannot_be_empty: "You can't send an empty message" + reply_sent: "Reply sent successfully" + request_accepted: "Request accepted" + request_confirmed: "Order completed" + request_rejected: "Request rejected" request_canceled: "Order cancelled" - message_sent: ~ - message_not_sent: ~ - this_content_is_not_available_in_this_community: ~ - unknown_error: ~ - update_error: ~ - you_are_not_allowed_to_give_feedback_on_this_transaction: ~ - you_are_not_authorized_to_do_this: ~ - you_are_not_authorized_to_view_this_content: ~ - listing_closed: ~ - send_instructions: ~ - you_cannot_reply_to_a_closed_offer: ~ - you_cannot_send_message_to_yourself: ~ - you_followed_listing: ~ - you_have_already_given_feedback_about_this_event: ~ - you_are_now_member: ~ - you_are_already_member: ~ - you_must_log_in_to_create_new_listing: ~ - additional_email_confirmed_dashboard: ~ - you_must_log_in_to_give_feedback: ~ - you_must_log_in_to_invite_new_users: ~ - you_must_log_in_to_send_a_comment: ~ - you_must_log_in_to_send_a_message: ~ - you_must_log_in_to_do_a_transaction: ~ - you_must_log_in_to_view_this_content: ~ - you_must_log_in_to_view_this_page: ~ - you_must_log_in_to_view_your_inbox: ~ - you_must_log_in_to_view_your_settings: ~ - you_must_log_in_to_add_news_item: ~ - you_must_log_in_to_change_profile_settings: ~ - you_must_log_in_to_accept_or_reject: ~ - you_must_log_in_to_confirm_or_cancel: ~ - you_need_to_confirm_your_account_first: ~ - you_must_fill_all_the_fields: ~ - you_unfollowed_listing: ~ - joining_community_failed: ~ - can_not_delete_email: ~ - user_does_not_have_email_to_delete: ~ - email_deleted: ~ - listing_author_payment_details_missing: ~ - images_are_processing: ~ - automatically_logged_out_please_sign_in: ~ + message_sent: "Message sent" + message_not_sent: "Sending the message failed. Please try again." + this_content_is_not_available_in_this_community: "This content is not available." + unknown_error: "Unknown error. Please use the Contact us link to send details about what happened." + update_error: "An error occurred when trying to update your information, please try again" + you_are_not_allowed_to_give_feedback_on_this_transaction: "You are not authorized to give feedback on this event" + you_are_not_authorized_to_do_this: "You are not authorized to do this" + you_are_not_authorized_to_view_this_content: "You are not authorized to view this content" + listing_closed: "This listing has been closed" + send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes." + you_cannot_reply_to_a_closed_offer: "You cannot reply to a closed offer" + you_cannot_send_message_to_yourself: "You cannot send a message to yourself" + you_followed_listing: "You are now following this listing" + you_have_already_given_feedback_about_this_event: "You have already given feedback about this event" + you_are_now_member: "Welcome to %{service_name}!" + you_are_already_member: "You are already a member of %{service_name}. Welcome back!" + you_must_log_in_to_create_new_listing: "You must log in to %{service_name} to create a new listing. If you don't have an account you can %{sign_up_link}." + additional_email_confirmed_dashboard: "Your email is now confirmed." + you_must_log_in_to_give_feedback: "You must log in to give feedback" + you_must_log_in_to_invite_new_users: "You must log in to invite new users to %{service_name}" + you_must_log_in_to_send_a_comment: "You must log in to send a new comment" + you_must_log_in_to_send_a_message: "You must log in to %{service_name} to send a message to another user." + you_must_log_in_to_do_a_transaction: "You must log in to %{service_name} to do a transaction." + you_must_log_in_to_view_this_content: "You must log in to view this content" + you_must_log_in_to_view_this_page: "You must log in to view this page" + you_must_log_in_to_view_your_inbox: "You must log in to %{service_name} to view your inbox." + you_must_log_in_to_view_your_settings: "You must log in to %{service_name} to view your settings." + you_must_log_in_to_add_news_item: "You must log in to %{service_name} to add a new article." + you_must_log_in_to_change_profile_settings: "You must log in to %{service_name} to change profile settings" + you_must_log_in_to_accept_or_reject: "You must log in to accept or reject the transaction" + you_must_log_in_to_confirm_or_cancel: "You must log in to cancel or confirm the transaction" + you_need_to_confirm_your_account_first: "You need to confirm your email." + you_must_fill_all_the_fields: "You must fill all the fields" + you_unfollowed_listing: "You are no longer following this listing" + joining_community_failed: "Joining failed" + can_not_delete_email: "You cannot remove the email address" + user_does_not_have_email_to_delete: "You don't have the email address you're trying to remove" + email_deleted: "Email removed" + listing_author_payment_details_missing: "Please contact the author by pressing the 'Contact' button below. They need to update their payment details to receive payments." + images_are_processing: "We are processing your images. Give us a minute or two and they'll be visible." + maintenance_mode: + zero: "The website will now go offline for maintenance" + one: "The website will be offline for maintenance in %{count} minute" + other: "The website will be offline for maintenance in %{count} minutes" + automatically_logged_out_please_sign_in: "You have been automatically logged out. Please log in again." settings: - account: ~ - notifications: ~ - profile: ~ - settings: ~ - paypal_payments: ~ - stripe_payments: ~ - payments: ~ + account: Account + notifications: Notifications + profile: "Profile info" + settings: Settings + paypal_payments: "PayPal Payments" + stripe_payments: "Stripe Payments" + payments: Payments listings: bubble_listing_not_visible: - listing_not_visible: ~ + listing_not_visible: "You do not have permission to view this listing." comment: - wrote: ~ - send_private_message: ~ - delete: ~ - are_you_sure: ~ + wrote: wrote + send_private_message: "Send private message to %{person}" + delete: delete + are_you_sure: "Are you sure you want to delete the comment?" comment_form: - ask_a_question: ~ - log_in: ~ - send_comment: ~ - to_send_a_comment: ~ - write_comment: ~ - you_cannot_send_a_new_comment_because_listing_is_closed: ~ - you_must: ~ - subscribe_to_comments: ~ + ask_a_question: "Comment on the listing or ask for more details. All the other users will be able to see your comment." + log_in: "log in" + send_comment: "Send comment" + to_send_a_comment: "to send a new comment." + write_comment: "Write a new comment:" + you_cannot_send_a_new_comment_because_listing_is_closed: "You cannot send new comments because this listing is closed." + you_must: "You must" + subscribe_to_comments: "Notify me of new comments and updates" edit: - edit_listing: ~ + edit_listing: "Edit listing" edit_links: - close_listing: ~ - edit_listing: ~ - reopen_listing: ~ - move_to_top: ~ - show_in_updates_email: ~ - show_in_updates_email_loading: ~ - show_in_updates_email_error: ~ - show_in_updates_email_success: ~ + close_listing: "Close listing" + edit_listing: "Edit listing" + reopen_listing: "Reopen listing" + move_to_top: "Move to top of homepage" + show_in_updates_email: "Show in the next newsletter" + show_in_updates_email_loading: Loading... + show_in_updates_email_error: "Couldn't reach server. Try again after page refresh." + show_in_updates_email_success: "This listing will be shown in the next automatic update email sent to the users" map: - open_in_google_maps: ~ + open_in_google_maps: "Open in Google Maps" error: - something_went_wrong: ~ - something_went_wrong_plain: ~ - create_failed_to_connect_to_booking_service: ~ - update_failed_to_connect_to_booking_service: ~ + something_went_wrong: "Something went wrong, error code: %{error_code}" + something_went_wrong_plain: "Something went wrong" + create_failed_to_connect_to_booking_service: "Listing creation failed: Failed to connect to the booking service. Please try again." + update_failed_to_connect_to_booking_service: "Listing update failed: Failed to connect to the booking service. Please try again." follow_links: - follow: ~ - unfollow: ~ + follow: "Get emails about new comments" + unfollow: "Don't get emails about new comments" form: custom_field_partials: dropdown: - select_one___: ~ + select_one___: "Select one..." departure_time: - at: ~ - departure_time: ~ + at: At + departure_time: "Departure time" departure_time_radio_buttons: - repeated: ~ + repeated: "Repeated (add times and days in the field 'detailed description')" description: - detailed_description: ~ - youtube_info: ~ + detailed_description: "Detailed description" + youtube_info: "If your description contains YouTube links, the videos will be shown below the description." destination: - destination: ~ + destination: Destination form_content: - favor: ~ - housing: ~ - item: ~ - offer_something: ~ - request_something: ~ - rideshare: ~ - i_want_to_offer: ~ - i_want_to_request: ~ + favor: "a service" + housing: "a space" + item: "an item" + offer_something: "Offer something" + request_something: "Request something" + rideshare: "a ride" + i_want_to_offer: "I want to offer..." + i_want_to_request: "I need..." googlemap: - googlemap_copy: ~ - googlemap_description: ~ - googlemap_updatemap: ~ + googlemap_copy: "End Points From Map" + googlemap_description: Mapview + googlemap_updatemap: "Update Map" images: - image: ~ - best_result: ~ - no_file_selected: ~ - remove_image: ~ - select_file: ~ - add_more: ~ - removing: ~ - processing: ~ - loading_image: ~ - image_uploading_in_progress: ~ - processing_takes_a_while: ~ - this_may_take_a_while: ~ - percentage_loaded: ~ - uploading_failed: ~ - image_processing_failed: ~ - file_too_large: ~ - accepted_formats: ~ - images_not_uploaded_confirm: ~ + image: Image + best_result: "For best results, use JPG, GIF or PNG images that are %{width} by %{height} pixels" + no_file_selected: "No file selected" + remove_image: "Remove image" + select_file: "Select file" + add_more: "+ Add more" + removing: Removing... + processing: Processing... + loading_image: Loading... + image_uploading_in_progress: "Image upload in progress..." + processing_takes_a_while: "All images uploaded! Processing them will take a bit of time, but it's ok to save the listing and move on." + this_may_take_a_while: "this only takes a second" + percentage_loaded: "%{percentage}%" + uploading_failed: "Image uploading failed" + image_processing_failed: "Image processing failed" + file_too_large: "The file is too large" + accepted_formats: "The image format must be either GIF, JPG or PNG." + images_not_uploaded_confirm: "All images have not finished uploading. Do you really want to continue?" location: - location: ~ + location: Location price: - price: ~ - per: ~ - per_day: ~ - mass: ~ - time: ~ - long_time: ~ - after_service_fee_you_will_get: ~ - no_service_fee_you_will_get_paypal_text: ~ - no_service_fee_you_will_get_payment_text: ~ - after_service_fee_you_will_get_payment_text: ~ - after_service_fee_you_will_get_paypal_text: ~ - after_service_fee_you_will_get_stripe_text: ~ - payment_fee_info_link_text: ~ - paypal_fee_info_link_text: ~ - delivery: ~ - shipping: ~ - shipping_price: ~ - shipping_price_additional: ~ - pickup: ~ + price: Price + per: per + per_day: "per day" + mass: "piece, kg, l, m2, ..." + time: "hour, day, month, ..." + long_time: "week, month, ..." + after_service_fee_you_will_get: "After %{service_name} and a payment processor fees you will get %{sum_with_currency}" + no_service_fee_you_will_get_paypal_text: "%{paypal_fee_info_link} will be deducted from the price." + no_service_fee_you_will_get_payment_text: "%{payment_fee_info_link} will be deducted from the price." + after_service_fee_you_will_get_payment_text: "Once someone makes an order, %{service_name} fee (%{sum_with_currency}) and a %{payment_fee_info_link} will be deducted from the price." + after_service_fee_you_will_get_paypal_text: "Once someone makes an order, %{service_name} fee (%{sum_with_currency}) and a %{paypal_fee_info_link} will be deducted from the price." + after_service_fee_you_will_get_stripe_text: "Once someone makes an order, %{service_name} fee (%{sum_with_currency}) will be deducted from the price." + payment_fee_info_link_text: "payment processing fee" + paypal_fee_info_link_text: "PayPal's payment processing fee" + delivery: "Delivery method" + shipping: Shipping + shipping_price: "Shipping fee" + shipping_price_additional: "Additional items" + pickup: Pickup origin: - location: ~ - origin: ~ + location: Location + origin: Origin send_button: - save_listing: ~ + save_listing: "Save listing" share_type: - select: ~ - borrow: ~ - buy: ~ - give_away: ~ - lend: ~ - offer_type: ~ - receive: ~ - rent: ~ - rent_out: ~ - request_type: ~ - sell: ~ - share_for_free: ~ - accept_for_free: ~ - trade: ~ + select: Select + borrow: Borrowing + buy: Buying + give_away: "Giving away" + lend: Lending + offer_type: "Offer type" + receive: "Accepting for free" + rent: Renting + rent_out: "Renting out" + request_type: "Request type" + sell: Selling + share_for_free: "Sharing for free" + accept_for_free: "Accepting for free" + trade: Swapping tag_list: - comma_separate: ~ - tags: ~ + comma_separate: "(comma separate)" + tags: Tags title: - listing_title: ~ + listing_title: "Listing title" valid_until: - valid_until: ~ + valid_until: "Expiration date" valid_until_radio_buttons: - for_the_time_being: ~ + for_the_time_being: "For the time being" privacy: - privacy: ~ - private: ~ - public: ~ + privacy: Privacy + private: "Private (only users who are logged in can see)" + public: "Public (visible to users who are not logged in)" help_texts: - help_share_type_title: ~ - help_tags_title: ~ - help_valid_until_title: ~ + help_share_type_title: "Type of the offer or request" + help_tags_title: Tags + help_valid_until_title: "Expiration date" index: - all_categories: ~ - all_offer_types: ~ - all_request_types: ~ - category: ~ - did_not_found_what_you_were_looking_for: ~ - favors: ~ - housing: ~ - items: ~ - list_view: ~ - listings: ~ - map_view: ~ - offer_something: ~ - offer_type: ~ - offers: ~ - request_something: ~ - request_type: ~ - requests: ~ - rideshare: ~ - you_have_something_others_do_not: ~ - feed_title: ~ + all_categories: "All categories" + all_offer_types: "All offer types" + all_request_types: "All request types" + category: Category + did_not_found_what_you_were_looking_for: "Didn't find what you need?" + favors: Services + housing: Spaces + items: Items + list_view: "List view" + listings: Listings + map_view: "Map view" + offer_something: "Let others know!" + offer_type: "Offer type" + offers: Offers + request_something: "Request something!" + request_type: "Request type" + requests: Requests + rideshare: Rideshare + you_have_something_others_do_not: "Have something to offer?" + feed_title: "%{listing_type} in %{service_name} %{optional_category}" left_panel_link: - borrows: ~ - buys: ~ - favors: ~ - give_aways: ~ - housings: ~ - items: ~ - lends: ~ - receives: ~ - rent_outs: ~ - rents: ~ - rideshares: ~ - sells: ~ - share_for_frees: ~ - accept_for_frees: ~ - trades: ~ + borrows: Borrowing + buys: Buying + favors: Services + give_aways: "Giving away" + housings: Spaces + items: Items + lends: Lending + receives: "Taking for free" + rent_outs: "Renting out" + rents: Renting + rideshares: Rideshare + sells: Selling + share_for_frees: "Sharing for free" + accept_for_frees: "Accepting for free" + trades: Swapping listing_actions: - booking_from: ~ - booking_to: ~ - how_paypal_works: ~ - payment_help: ~ - unable_load_availability: ~ + booking_from: From + booking_to: To + how_paypal_works: "How PayPal Works" + payment_help: "Payment help" + unable_load_availability: "Could not load availability information. Please try again later." new: - listing: ~ - selected_category: ~ - selected_subcategory: ~ - selected_transaction_type: ~ - select_category: ~ - select_subcategory: ~ - select_transaction_type: ~ - you_need_to_fill_payout_details_before_accepting: ~ - contact_admin_link_text: ~ - community_not_configured_for_payments: ~ - payment_settings_link: ~ - community_not_configured_for_payments_admin: ~ + listing: listing + selected_category: "Category: %{category}" + selected_subcategory: "Subcategory: %{subcategory}" + selected_transaction_type: "Listing type: %{transaction_type}" + select_category: "Select category" + select_subcategory: "Select subcategory" + select_transaction_type: "Select listing type" + you_need_to_fill_payout_details_before_accepting: "You need to fill in payout details before you can post a listing. Go to %{payment_settings_link} to fill in the details." + contact_admin_link_text: "contact the %{service_name} team" + community_not_configured_for_payments: "%{service_name} hasn't been configured for payments, so you cannot post new listings yet. Please %{contact_admin_link} for details." + payment_settings_link: "payment settings" + community_not_configured_for_payments_admin: "%{service_name} hasn't been configured for payments, so you cannot post new listings yet. Go to %{payment_settings_link} to fill in the payment details." quantity: - hour: ~ - day: ~ - night: ~ - week: ~ - month: ~ - custom: ~ - quantity_placeholder: ~ - please_comment: ~ + hour: "Number of hours:" + day: "Number of days:" + night: "Number of nights:" + week: "Number of weeks:" + month: "Number of months:" + custom: "Quantity:" + quantity_placeholder: Quantity + please_comment: Comment reply_link: - listing_closed: ~ + listing_closed: "Listing is closed" show: - add_your_phone_number: ~ - add_profile_picture: ~ - comments: ~ - contact_by_phone: ~ - contact: ~ - favor_offer: ~ - favor_request: ~ - inquiry: ~ - item_offer_trade: ~ - item_request_trade: ~ - no_description: ~ - no_image: ~ - no_reviews: ~ - offer: ~ - listing_created: ~ - open_until: ~ - feedback: ~ - qr_code: ~ - request: ~ - rideshare_offer: ~ - rideshare_request: ~ - send_private_message: ~ - tags: ~ - time: ~ - times: ~ - times_viewed: ~ - processing_uploaded_image: ~ - listing_created_at: ~ + add_your_phone_number: "Add your phone number" + add_profile_picture: "Add profile picture" + comments: "Public discussion" + contact_by_phone: "Contact by phone:" + contact: Contact + favor_offer: "Service offer" + favor_request: "Service request" + inquiry: Announcement + item_offer_trade: "Swap offer" + item_request_trade: "Swap request" + no_description: "This listing doesn't have a description" + no_image: "No image" + no_reviews: "No reviews received" + offer: Offer + listing_created: Created + open_until: "Open until %{date}" + feedback: Feedback + qr_code: "QR code" + request: Request + rideshare_offer: "Rideshare offer" + rideshare_request: "Rideshare request" + send_private_message: "Send private message" + tags: Tags + time: time + times: times + times_viewed: Viewed + processing_uploaded_image: "(Processing uploaded image...)" + listing_created_at: "Listing created" price: - per_quantity_unit: ~ - per_day: ~ - delivery: ~ - shipping: ~ - shipping_no_price: ~ - shipping_price_additional: ~ - pickup: ~ - pickup_no_price: ~ - youtube_video_player: ~ + per_quantity_unit: "per %{quantity_unit}" + per_day: "per day" + delivery: "Delivery method" + shipping: "Shipping (+%{price})" + shipping_no_price: Shipping + shipping_price_additional: "Shipping (+%{price}, additional items: +%{shipping_price_additional})" + pickup: Pickup + pickup_no_price: Pickup + youtube_video_player: "YouTube video player" unit_types: - piece: ~ - hour: ~ - day: ~ - night: ~ - week: ~ - month: ~ + piece: piece + hour: hour + day: day + night: night + week: week + month: month verification_required: - verification_required: ~ + verification_required: "Verification required" listing_conversations: preauthorize: - dates_not_available: ~ - error_in_checking_availability: ~ - details: ~ - by: ~ - payment: ~ - exp: ~ - you_will_be_charged: ~ - day: ~ - days: ~ - night: ~ - nights: ~ - invalid_parameters: ~ + dates_not_available: "Selected dates are not available" + error_in_checking_availability: "Could not check availability for the selected dates" + details: Details + by: "%{listing} by %{author}" + payment: Payment + exp: "Exp:" + you_will_be_charged: "You will be charged only if %{author} accepts the transaction. %{author} needs to accept the transaction within %{expiration_period} days. If %{author} declines or does not respond, no charge is made." + day: day + days: days + night: night + nights: nights + invalid_parameters: "Invalid values for new transaction" transaction_agreement_checkbox: - read_more: ~ + read_more: View. stripe_payment: - payment: ~ - pay_with_card: ~ - address: ~ - address_country: ~ - address_name: ~ - address_city: ~ - address_state: ~ - address_street1: ~ - address_street2: ~ - address_postal_code: ~ + payment: Payment + pay_with_card: "Pay with credit or debit card" + address: "Shipping address" + address_country: "Country *" + address_name: "First and last names *" + address_city: "City *" + address_state: "State *" + address_street1: "Street address line 1 *" + address_street2: "Street address line 2" + address_postal_code: "ZIP / Postal code *" mapview: index: - all_categories: ~ - all_offer_types: ~ - all_request_types: ~ - category: ~ - did_not_found_what_you_were_looking_for: ~ - favors: ~ - housing: ~ - items: ~ - list_view: ~ - map_view: ~ - offer_something: ~ - offer_type: ~ - offers: ~ - request_something: ~ - request_type: ~ - requests: ~ - rideshare: ~ - you_have_something_others_do_not: ~ - please_comment: ~ + all_categories: "All categories" + all_offer_types: "All offer types" + all_request_types: "All request types" + category: Category + did_not_found_what_you_were_looking_for: "Didn't find what you need?" + favors: Services + housing: Spaces + items: Items + list_view: "List view" + map_view: "Map view" + offer_something: "Let others know!" + offer_type: "Offer type" + offers: Offers + request_something: "Request something!" + request_type: "Request type" + requests: Requests + rideshare: Rideshare + you_have_something_others_do_not: "Have something to offer?" + please_comment: Comment mercury: - content_too_long: ~ + content_too_long: "Inserted content was too long." okl: - member_id: ~ - member_id_or_email: ~ + member_id: "Member id" + member_id_or_email: "Member id or email" paypal_accounts: - payout_info_title: ~ - paypal_account_email_connected: ~ - payout_info_paypal: ~ - paypal_billing_agreement_made: ~ - commission_permission_needed: ~ - create_paypal_account_link_text: ~ - connected_account: ~ - paypal_receive_funds_info_label_australia_only: ~ - paypal_receive_funds_info_label: ~ - paypal_receive_funds_info_australia_only: ~ - paypal_receive_funds_info: ~ - upgrade_paypal_account_link_text: ~ - admin_account_not_connected: ~ - contact_admin_link_text: ~ - you_are_ready_to_accept_payments: ~ - commission: ~ - not_now: ~ + payout_info_title: "Receiving funds" + paypal_account_email_connected: "Connect PayPal account Completed!" + payout_info_paypal: "%{service_name} uses PayPal as its payment provider. A %{create_paypal_account_link} is required in order to accept payments for your listings, and must be connected to %{service_name}." + paypal_billing_agreement_made: "Grant %{service_name} permission to charge a transaction fee Completed!" + commission_permission_needed: "You will also need to grant %{service_name} permission to charge a transaction fee." + create_paypal_account_link_text: "PayPal account" + connected_account: "PayPal account '%{email}' connected successfully." + paypal_receive_funds_info_label_australia_only: "Your PayPal account needs to be able to accept payments. This might require a Premier or Business account." + paypal_receive_funds_info_label: "Your PayPal account needs to be able to accept payments. This might require a Business account." + paypal_receive_funds_info_australia_only: "If you see an error when trying to connect your account to %{service_name}, either %{upgrade_paypal_account_link}, or (if you are an individual), create a new Premier account. Both account types are completely free." + paypal_receive_funds_info: "If you see an error when trying to connect your account to %{service_name}, %{upgrade_paypal_account_link}. It's free and easy. If you're an individual, PayPal recommends using your name as the Business name." + upgrade_paypal_account_link_text: "log in and upgrade your PayPal account to a business account" + admin_account_not_connected: "Using %{service_name}'s payment system in order to receive payments is not possible since payments have not been set up. Please %{contact_admin_link} for details." + contact_admin_link_text: "contact the %{service_name} team" + you_are_ready_to_accept_payments: "You are ready to accept payments!" + commission: "%{commission} %" + not_now: "I do not want to connect PayPal account now" new: - payout_info_you_need_to_connect: ~ - payout_info_text: ~ - contact_admin_link_text: ~ - admin_account_not_connected: ~ - paypal_account_email: ~ - paypal_account_email_placeholder: ~ - paypal_account_email_info_text: ~ - create_paypal_account: ~ - upgrade_paypal_account: ~ - paypal_account_billing_agreement: ~ - follow_steps: ~ - connect_paypal_account_title: ~ - connect_paypal_account_title_with_step: ~ - connect_paypal_account_instructions: ~ - connect_paypal_account: ~ - paypal_account_billing_agreement_with_step: ~ - paypal_account_billing_agreement_info_both: ~ - paypal_account_billing_agreement_info_fixed: ~ - paypal_account_billing_agreement_info_relative: ~ - paypal_account_billing_agreement_info_none: ~ - paypal_info_link_text: ~ - billing_agreement_description: ~ - billing_agreement: ~ - permissions_not_granted: ~ - could_not_fetch_redirect_url: ~ - paypal_not_enabled: ~ + payout_info_you_need_to_connect: "In order to accept payments, you need to connect your PayPal account with %{service_name}." + payout_info_text: "To connect your account, please complete the following steps." + contact_admin_link_text: "contact the %{service_name} team" + admin_account_not_connected: "Connecting your PayPal account is not possible since %{service_name} has not set up payments. Please %{contact_admin_link} for details." + paypal_account_email: "Connect your PayPal account" + paypal_account_email_placeholder: "Your PayPal email address" + paypal_account_email_info_text: "If you don't have a PayPal account, you can create one by %{create_paypal_account}. If you get an error message when connecting your PayPal account, upgrade your PayPal account to a business account. Upgrading is free and easy. If you are an individual, you can use your first and last name as your \"business name\". To upgrade your account, %{upgrade_paypal_account} and find the upgrade link." + create_paypal_account: "clicking here" + upgrade_paypal_account: "log in to your PayPal account" + paypal_account_billing_agreement: "Grant %{service_name} permission to charge a transaction fee" + follow_steps: "Follow the steps below to start receiving funds:" + connect_paypal_account_title: "Connect your PayPal account" + connect_paypal_account_title_with_step: "Step %{current_step}/%{total_steps}: Connect your PayPal account" + connect_paypal_account_instructions: "Click on the button below to log in to PayPal and connect your PayPal account with %{service_name}." + connect_paypal_account: "Connect your PayPal account" + paypal_account_billing_agreement_with_step: "Step %{current_step}/%{total_steps}: Grant permission to charge a transaction fee" + paypal_account_billing_agreement_info_both: "After you make a sale on %{service_name}, a service fee (%{commission_from_seller} of the total item price, excluding shipping, minimum fee %{minimum_commission}) will be charged from your PayPal account. Permission to do this is required in order to accept payments in %{service_name}. The fee does not include %{paypal_info_link}." + paypal_account_billing_agreement_info_fixed: "After you make a sale on %{service_name}, a service fee of %{minimum_commission} will be charged from your PayPal account. Permission to do this is required in order to accept payments in %{service_name}. The fee does not include %{paypal_info_link}." + paypal_account_billing_agreement_info_relative: "After you make a sale on %{service_name}, a service fee (%{commission_from_seller} of the total item price, excluding shipping) will be charged from your PayPal account. Permission to do this is required in order to accept payments in %{service_name}. The fee does not include %{paypal_info_link}." + paypal_account_billing_agreement_info_none: "%{service_name} does not currently charge a service fee. If service fees are enabled, you will need to grant %{service_name} permission to charge a service fee in order to accept payments. The fee does not include %{paypal_info_link}." + paypal_info_link_text: "PayPal's payment processing fee" + billing_agreement_description: "Grant %{service_name} permission to charge a transaction fee." + billing_agreement: "Grant permission" + permissions_not_granted: "Permissions to connect with your PayPal account were not granted." + could_not_fetch_redirect_url: "Could not fetch redirect URL to connect with PayPal." + paypal_not_enabled: "PayPal payments are not enabled." billing_agreement_canceled: "The billing agreement was cancelled" - billing_agreement_not_accepted: ~ - billing_agreement_wrong_account: ~ - something_went_wrong: ~ - account_not_verified: ~ - account_restricted: ~ - paypal_account_connected_title: ~ - paypal_account_connected: ~ - change_account: ~ - missing: ~ - from_your_payment_settings_link_text: ~ - redirect_message: ~ - redirect_link_text: ~ - paypal_account_all_set_up: ~ - can_receive_payments: ~ - paypal_account_connected_summary: ~ - paypal_permission_granted_summary: ~ + billing_agreement_not_accepted: "You did not accept the billing agreement in PayPal." + billing_agreement_wrong_account: "PayPal accounts did not match. Please use the same PayPal account that you connected in the first step." + something_went_wrong: "Something went wrong. Please try again. If the problem persists, please contact the %{service_name} team." + account_not_verified: "You have not verified your PayPal account. You need to go to paypal.com and verify your account before you can continue." + account_restricted: "Your PayPal account is restricted and cannot be connected. Please log in to paypal.com to find out more or get in touch with PayPal customer support to resolve the issue." + paypal_account_connected_title: "PayPal account connected" + paypal_account_connected: "The PayPal account <%{email}> has been connected with %{service_name}." + change_account: "Change PayPal account" + missing: "You have open listings but your Paypal account is not set up to receive payments. Connect your Paypal account and grant %{service_name} permission to charge a transaction fee from your %{settings_link}." + from_your_payment_settings_link_text: "payment settings" + redirect_message: "Redirecting you to PayPal. If nothing happens, click %{redirect_link}." + redirect_link_text: here + paypal_account_all_set_up: "Hooray, everything is set up!" + can_receive_payments: "You can now receive payments for your listings." + paypal_account_connected_summary: "PayPal account <%{email}> connected successfully" + paypal_permission_granted_summary: "Permission for transaction fees granted" paypal: - pay_with_paypal: ~ - checkout_with: ~ - or_pay_with_paypal: ~ - checkout_with_paypal: ~ + pay_with_paypal: "Proceed to payment" + checkout_with: "Checkout with" + or_pay_with_paypal: or + checkout_with_paypal: "Checkout with PayPal" cancel_succesful: "PayPal payment succesfully cancelled" transaction: - commission_payment_name: ~ - commission_payment_description: ~ - wait_while_loading: ~ - chatting_with_paypal: ~ + commission_payment_name: "Commission payment for %{listing_title}" + commission_payment_description: "Marketplace %{service_name} took this commission from transaction regarding %{listing_title}" + wait_while_loading: "Please wait." + chatting_with_paypal: "We are chatting with PayPal." people: edit_links: - activate: ~ - deactivate: ~ + activate: Activate + deactivate: Deactivate help_texts: - feedback_description_title: ~ - help_invitation_code_title: ~ - terms_title: ~ - invite_only_help_text: ~ - invite_only_help_text_title: ~ + feedback_description_title: Feedback + help_invitation_code_title: "You need an invite to join" + terms_title: "%{service_name} terms of use" + invite_only_help_text: "Select this option if you want that new members can join only if they are invited by an existing user." + invite_only_help_text_title: Invite-only inactive_notification: - this_person_is_not_active_in_kassi: ~ - inactive_description: ~ + this_person_is_not_active_in_kassi: "This user is no longer active in %{service_name}" + inactive_description: "This user has stopped using %{service_name}. You cannot contact this user, give feedback to them or comment their listings." new: - create_new_account: ~ - email: ~ - email_is_in_use: ~ - email_is_in_use_or_not_allowed: ~ - email_not_allowed: ~ - invalid_username_or_email: ~ - family_name: ~ - given_name: ~ - i_accept_the: ~ - invalid_invitation_code: ~ - invitation_code: ~ - not_required: ~ - notification_is_mandatory: ~ - password_again: ~ - show_my_name_to_others: ~ - sign_up: ~ - terms: ~ - username_is_in_use: ~ - username_is_invalid: ~ - visible_only_to_you: ~ - visible_to_everybody: ~ - create_account_with_facebook: ~ - OR: ~ - signup_with_email: ~ + create_new_account: "Create account" + email: "Email address" + email_is_in_use: "The email you gave is already in use." + email_is_in_use_or_not_allowed: "This email is not allowed or it is already in use. If you can't get in, contact us." + email_not_allowed: "This email is not allowed in %{service_name}. Please use an email address that is allowed. If you still cannot get in, contact us." + invalid_username_or_email: "The username or email are invalid or already in use" + email_restriction_instructions: + one: "The access to %{service_name} is restricted. To join you need a '%{allowed_emails}' email address." + other: "The access to %{service_name} is restricted. You need an email address that proves that you are entitled to join." + family_name: "Last name" + given_name: "First name" + i_accept_the: "I accept the" + invalid_invitation_code: "The invitation code is not valid." + invitation_code: "Invitation code" + not_required: ", not required" + notification_is_mandatory: "You must pick at least one email address for receiving notifications. If you don't want to receive any emails from %{service_name}, check your email notification settings." + password_again: "Confirm password" + show_my_name_to_others: "Show my real name to other %{service_name} users" + sign_up: "Create a new %{service_name} account" + terms: "terms of use" + username_is_in_use: "This username is already in use." + username_is_invalid: "Username is invalid. Allowed characters are letters, numbers and underscore." + visible_only_to_you: "visible only to you and the %{service_name} team" + visible_to_everybody: "visible to everybody" + create_account_with_facebook: "Sign up with Facebook" + OR: OR + signup_with_email: "Sign up with email" profile_feedback: - grade: ~ - and_gave_following_feedback: ~ + grade: "grade:" + and_gave_following_feedback: "and gave the following feedback" profile_listings: - show_also_closed: ~ - show_only_open: ~ - no_image: ~ + show_also_closed: "Show also closed" + show_only_open: "Show only open" + no_image: "No image" show: - contact: ~ - about_me: ~ - add_description: ~ - add_location: ~ - add_phone_number: ~ - address: ~ - as_expected: ~ - edit_profile_info: ~ - exceeded_expectations: ~ - positive: ~ - hide_description: ~ - less_than_expected: ~ - phone_number: ~ - show_all_feedback: ~ - show_all_testimonials: ~ - show_full_description: ~ - slightly_better_than_expected: ~ - slightly_less_than_expected: ~ - what_are_these: ~ - review: ~ - reviews: ~ - listing: ~ - listings: ~ - open_listing: ~ - open_listings: ~ - no_listings: ~ - no_open_listings: ~ - no_reviews: ~ - show_all_listings: ~ - show_all_open_listings: ~ - show_all_reviews: ~ + contact: "Contact %{person}" + about_me: "About me:" + add_description: "Share something about yourself" + add_location: "Add location" + add_phone_number: "Add phone number" + address: "Location:" + as_expected: "As expected" + edit_profile_info: "Edit profile" + exceeded_expectations: "Exceeded expectations" + positive: positive + hide_description: "Show less" + less_than_expected: "Worse than expected" + phone_number: "Phone number:" + show_all_feedback: "Show all feedback" + show_all_testimonials: "Show all feedback" + show_full_description: "Show more" + slightly_better_than_expected: "Exceeded expectations" + slightly_less_than_expected: "Worse than expected" + what_are_these: "What are these?" + review: "received review" + reviews: "received reviews" + listing: listing + listings: listings + open_listing: "open listing" + open_listings: "open listings" + no_listings: "No listings" + no_open_listings: "No open listings" + no_reviews: "No reviews" + show_all_listings: "Show all listings" + show_all_open_listings: "Show all open listings" + show_all_reviews: "Show all reviews" followed_people: - you_follow_plural: ~ - you_follow_singular: ~ - they_follow_plural: ~ - they_follow_singular: ~ - show_all_followed_people: ~ - no_followed_people: ~ + you_follow_plural: "You follow %{count} people" + you_follow_singular: "You follow %{count} person" + they_follow_plural: "%{count} followed people" + they_follow_singular: "%{count} followed person" + show_all_followed_people: "Show all followed people" + no_followed_people: "No followed people" follow_button: - following: ~ - follow: ~ - unfollow: ~ + following: Following + follow: Follow + unfollow: Unfollow sessions: new: - create_new_account: ~ - i_forgot_my_password: ~ - login: ~ - login_to_kassi: ~ - connect_your_facebook_to_kassi: ~ - facebook_account: ~ - log_in_to_link_account: ~ - you_can_also_create_new_account: ~ - account_creation_link_text: ~ - cancle_facebook_connect: ~ - facebook_cancel_link_text: ~ - log_in_with_your_facebook_account: ~ - or_sign_up_with_your_username: ~ - we_will_not_post_without_asking_you: ~ + create_new_account: "Create a new account" + i_forgot_my_password: "Forgot username or password" + login: "Log in" + login_to_kassi: "Log in to %{service_name}" + connect_your_facebook_to_kassi: "Connect your Facebook account to %{service_name}" + facebook_account: "Facebook account:" + log_in_to_link_account: "If you already have a %{service_name} account, log in to link it with your Facebook account." + you_can_also_create_new_account: "If you don't have an account in %{service_name}, %{accont_creation_link} to create one with your Facebook login." + account_creation_link_text: "click here" + cancle_facebook_connect: "If you don't want to link this account, you can %{cancel_link}." + facebook_cancel_link_text: cancel + log_in_with_your_facebook_account: "Log in with Facebook" + or_sign_up_with_your_username: "...or with your username or email:" + we_will_not_post_without_asking_you: "We will never post to Facebook without asking you." password_forgotten: - email: ~ - password_recovery_instructions: ~ - request_new_password: ~ - change_your_password: ~ + email: Email + password_recovery_instructions: "Enter your email address to receive your username and reset your password." + request_new_password: "Request new password" + change_your_password: "Change your password" confirmation_pending: - welcome_to_kassi: ~ - check_your_email: ~ - resend_confirmation_instructions: ~ - your_current_email_is: ~ - change_email: ~ - confirm_your_email: ~ - account_confirmation_instructions: ~ - account_confirmation_instructions_title_admin: ~ - before_full_access_you_need_to_confirm_email: ~ - before_confirmation_only_access_admin_dashboard: ~ - admin_dashboard_link_text: ~ - account_confirmation_instructions_admin: ~ - contact_support_link_text: ~ + welcome_to_kassi: "Welcome to %{service_name}!" + check_your_email: "Check your inbox" + resend_confirmation_instructions: "Resend confirmation instructions" + your_current_email_is: "Your email is %{email}." + change_email: Change + confirm_your_email: "Please confirm your email address" + account_confirmation_instructions: "You will soon receive an email with a link to confirm your email address. Don't forget to check your spam folder! After confirming your address, you can join %{service_name}." + account_confirmation_instructions_title_admin: "Confirm your email address" + before_full_access_you_need_to_confirm_email: "Before we can give you full access to your marketplace, there's just one more thing we need to do: confirm your email address." + before_confirmation_only_access_admin_dashboard: "Before confirmation you can only access the %{admin_dashboard_link}." + admin_dashboard_link_text: "admin dashboard" + account_confirmation_instructions_admin: "You should have received an email at %{email_address} with a confirmation link. If you don't see it, check your spam folder or click the button below to resend the email. Once it arrives, open the included link to confirm your address, after which you'll get full access to your marketplace. If you need any help, don't hesitate to %{support_link}." + contact_support_link_text: "contact Sharetribe support" settings: account: - change: ~ - confirm_new_password: ~ - delete_account: ~ - delete_account_button: ~ - delete_account_confirmation_popup: ~ - email_addresses: ~ - new_email: ~ - delete_personal_information: ~ - delete_information_others_involved: ~ - unfinished_transactions: ~ - new_password: ~ - save: ~ - these_fields_are_shown_only_to_you: ~ - email_already_confirmed: ~ + change: Change + confirm_new_password: "Confirm new password" + delete_account: "Delete account" + delete_account_button: "Permanently delete my account" + delete_account_confirmation_popup: "Are you sure you really want to delete your user account and permanently lose all data related to it? Account deletion cannot be reversed." + email_addresses: "Email addresses" + new_email: "New email address" + delete_personal_information: "If you delete your account, your personal information (name, phone number, address, email, profile picture, etc.) will be deleted permanently and can't be recovered. All the listings you have created will be removed. You won't be able to reactivate your account." + delete_information_others_involved: "Information where other members are involved (conversations with other people, transactions you've made, reviews you've given to others, etc) is not removed when you delete your account. However, your name will no longer be displayed next to this information." + unfinished_transactions: "Your account can't be deleted because you have ongoing transactions. Please complete all transactions before deleting your account." + new_password: "New password" + save: Save + these_fields_are_shown_only_to_you: "Username is shown in your profile unless you have given your name. Other information is only shown to you." + email_already_confirmed: "Your email address is already confirmed." email: - address_title: ~ - remove_title: ~ - remove_confirmation: ~ - receive_notifications_title_desktop: ~ - receive_notifications_title_mobile: ~ - receive_notifications_new_title_mobile: ~ - add_new_with_plus: ~ - add_new_cancel: ~ - confirmation_title_mobile: ~ - confirmation_title_desktop: ~ - confirmation_resend: ~ - status_confirmed: ~ - status_pending: ~ + address_title: Address + remove_title: Remove + remove_confirmation: "Are you sure you want to remove this email address?" + receive_notifications_title_desktop: "Receive notifications" + receive_notifications_title_mobile: "Receive notifications" + receive_notifications_new_title_mobile: "Receive notifications" + add_new_with_plus: "+ Add new email address" + add_new_cancel: Cancel + confirmation_title_mobile: "Confirmation:" + confirmation_title_desktop: Confirmation + confirmation_resend: Resend + status_confirmed: Confirmed + status_pending: Pending notifications: - email_from_admins: ~ - i_want_to_get_email_notification_when: ~ - newsletters: ~ - community_updates: ~ - email_about_confirm_reminders: ~ - email_about_new_comments_to_own_listing: ~ - email_about_new_messages: ~ - email_about_new_received_testimonials: ~ - email_about_testimonial_reminders: ~ - email_daily_community_updates: ~ - email_weekly_community_updates: ~ - do_not_email_community_updates: ~ - email_when_conversation_accepted: ~ - email_when_conversation_rejected: ~ - email_about_completed_transactions: ~ - email_about_new_payments: ~ - email_about_new_listings_by_followed_people: ~ - unsubscribe_succesful: ~ - unsubscribe_info_text: ~ - settings_link: ~ - homepage_link: ~ - unsubscribe_unsuccesful: ~ - unsuccessful_unsubscribe_info_text: ~ + email_from_admins: "I'm willing to receive occasional emails from the administrators" + i_want_to_get_email_notification_when: "I want to get an email notification when..." + newsletters: "Emails from administrators" + community_updates: Newsletters + email_about_confirm_reminders: "...I have forgotten to confirm an order as completed" + email_about_new_comments_to_own_listing: "...someone comments on my offer or request" + email_about_new_messages: "...someone sends me a message" + email_about_new_received_testimonials: "...someone gives me feedback" + email_about_testimonial_reminders: "...I have forgotten to give feedback on an event" + email_daily_community_updates: "Send me a daily newsletter if there are new listings" + email_weekly_community_updates: "Send me a weekly newsletter if there are new listings" + do_not_email_community_updates: "Don't send me newsletters" + email_when_conversation_accepted: "...someone accepts my offer or request" + email_when_conversation_rejected: "...someone rejects my offer or request" + email_about_completed_transactions: "...someone marks my order as completed" + email_about_new_payments: "...I receive a new payment" + email_about_new_listings_by_followed_people: "...someone I follow posts a new listing" + unsubscribe_succesful: "Unsubscribe succesful" + unsubscribe_info_text: "You will no longer receive these emails. Check your %{settings_link} to choose what kind of emails you want to receive from %{service_name}, or return to the %{homepage_link}." + settings_link: settings + homepage_link: homepage + unsubscribe_unsuccesful: "Error in unsubscribing" + unsuccessful_unsubscribe_info_text: "The unsubscribe link has expired. Log in to change your email subscription settings." profile: - about_you: ~ - city: ~ - family_name: ~ - given_name: ~ - first_name_with_initial: ~ - first_name_only: ~ - display_name: ~ - display_name_description: ~ - location_description: ~ - phone_number: ~ - profile_picture: ~ - postal_code: ~ - profile_page: ~ - profilemap: ~ - street_address: ~ - these_fields_are_shown_in_your: ~ - visible_to_everybody: ~ - visible_to_registered_users: ~ - default_in_listing: ~ - invisible: ~ - image_is_processing: ~ - save_information: ~ + about_you: "About you" + city: City + family_name: "Last name" + given_name: "First name" + first_name_with_initial: "(only first letter shown to other users)" + first_name_only: "(not shown to other users)" + display_name: "Display name" + display_name_description: "If you represent an organisation, you can use its name as your display name. Display name is shown to other users instead of your first and last name." + location_description: "You can provide either your street address or only a city or zip/postal code. It’s good to also add your country when adding your location. Examples: \"10117 Berlin, Germany\" or \"2000 Sand Hill Road, CA, USA\"." + phone_number: "Phone number" + profile_picture: "Profile picture" + postal_code: "Postal code" + profile_page: "in your profile page" + profilemap: Mapview + street_address: Location + these_fields_are_shown_in_your: "This information is visible to all %{service_name} users" + visible_to_everybody: "visible to everybody" + visible_to_registered_users: "(visible to users that have logged in)" + default_in_listing: "(used only as a default when creating a new listing)" + invisible: "(not shown to other users)" + image_is_processing: "Hang on tight. We are processing your profile picture. It will be ready in a minute or two." + save_information: "Save information" shipping_address: - shipping_address: ~ + shipping_address: "Shipping address" tag_cloud: tag_used: - with_tag: ~ - without_tag: ~ + with_tag: "With tag" + without_tag: "Without tag" terms: show: - accept_terms: ~ - here: ~ - i_accept_new_terms: ~ - i_accept_terms: ~ - terms: ~ - terms_have_changed: ~ - you_can_view_the_new_terms: ~ - you_need_to_accept: ~ - you_need_to_accept_new_terms: ~ + accept_terms: "Accepting %{service_name} terms of use" + here: "by clicking here" + i_accept_new_terms: "I accept the new terms" + i_accept_terms: "I accept the terms" + terms: "%{service_name} terms of use" + terms_have_changed: "Terms of use have changed" + you_can_view_the_new_terms: "You can view the new terms" + you_need_to_accept: "Welcome to %{service_name}! This seems to be the first time you are using the service. Before starting you must first accept the" + you_need_to_accept_new_terms: "%{service_name} terms of use have changed. You have to accept the new terms in order to continue using %{service_name}. The new terms are intended to enable the upkeep of the service after the research project has ended." testimonials: index: - all_testimonials: ~ - feedback_altogether: ~ - loading_more_testimonials: ~ - no_testimonials: ~ + all_testimonials: "All feedback" + feedback_altogether: "Feedback altogether: " + loading_more_testimonials: "Loading more testimonials" + no_testimonials: "No received feedback." new: - as_expected: ~ - exceeded_expectations: ~ - give_feedback_to: ~ - grade: ~ - less_than_expected: ~ - send_feedback: ~ - slightly_better_than_expected: ~ - slightly_less_than_expected: ~ - textual_feedback: ~ - this_will_be_shown_in_profile: ~ - positive: ~ - negative: ~ - default_textual_feedback: ~ + as_expected: "As expected" + exceeded_expectations: "Much better than expected" + give_feedback_to: "Give feedback to %{person}" + grade: "What is your overall feeling?" + less_than_expected: "Worse than expected" + send_feedback: "Send feedback" + slightly_better_than_expected: "Slightly better than expected" + slightly_less_than_expected: "Slightly worse than expected" + textual_feedback: "How did things go?" + this_will_be_shown_in_profile: "The feedback you give will be visible to other members in the profile page of %{person}. It helps them to evaluate whether %{person} is a trustworthy person." + positive: Positive + negative: Negative + default_textual_feedback: "Everything went smoothly, thanks a lot!" testimonial: - about_listing: ~ + about_listing: "about listing" date: formats: - long_with_abbr_day_name: ~ + long_with_abbr_day_name: "%a, %b %d, %Y" datepicker: days: - sunday: ~ - monday: ~ - tuesday: ~ - wednesday: ~ - thursday: ~ - friday: ~ - saturday: ~ + sunday: Sunday + monday: Monday + tuesday: Tuesday + wednesday: Wednesday + thursday: Thursday + friday: Friday + saturday: Saturday days_short: - sunday: ~ - monday: ~ - tuesday: ~ - wednesday: ~ - thursday: ~ - friday: ~ - saturday: ~ + sunday: Sun + monday: Mon + tuesday: Tue + wednesday: Wed + thursday: Thu + friday: Fri + saturday: Sat days_min: - sunday: ~ - monday: ~ - tuesday: ~ - wednesday: ~ - thursday: ~ - friday: ~ - saturday: ~ + sunday: Su + monday: Mo + tuesday: Tu + wednesday: We + thursday: Th + friday: Fr + saturday: Sa months: - january: ~ - february: ~ - march: ~ - april: ~ - may: ~ - june: ~ - july: ~ - august: ~ - september: ~ - october: ~ - november: ~ - december: ~ + january: January + february: February + march: March + april: April + may: May + june: June + july: July + august: August + september: September + october: October + november: November + december: December months_short: - january: ~ - february: ~ - march: ~ - april: ~ - may: ~ - june: ~ - july: ~ - august: ~ - september: ~ - october: ~ - november: ~ - december: ~ - today: ~ - clear: ~ + january: Jan + february: Feb + march: Mar + april: Apr + may: May + june: Jun + july: Jul + august: Aug + september: Sep + october: Oct + november: Nov + december: Dec + today: Today + clear: Clear format: dd/mm/yyyy time: formats: - short: ~ - shorter: ~ - short_date: ~ + short: "%b %e, %Y at %H:%M" + shorter: "%b %e at %H:%M" + short_date: "%b %e, %Y" timestamps: - day_ago: ~ - days_ago: ~ - hour_ago: ~ - hours_ago: ~ - minute_ago: ~ - minutes_ago: ~ - month_ago: ~ - months_ago: ~ - seconds_ago: ~ - year_ago: ~ - years_ago: ~ + day_ago: "%{count} day ago" + days_ago: "%{count} days ago" + hour_ago: "%{count} hour ago" + hours_ago: "%{count} hours ago" + minute_ago: "%{count} minute ago" + minutes_ago: "%{count} minutes ago" + month_ago: "%{count} month ago" + months_ago: "%{count} months ago" + seconds_ago: "%{count} seconds ago" + year_ago: "%{count} year ago" + years_ago: "%{count} years ago" + days_since: + one: "%{count} day" + other: "%{count} days" + time_to: + seconds: + one: "%{count} second" + other: "%{count} seconds" + minutes: + one: "%{count} minute" + other: "%{count} minutes" + hours: + one: "%{count} hour" + other: "%{count} hours" + days: + one: "%{count} day" + other: "%{count} days" transactions: initiate: - booked_days: ~ - booked_nights: ~ - price_per_day: ~ - price_per_night: ~ - quantity: ~ - subtotal: ~ - shipping-price: ~ - stripe-fee: ~ - price_per_quantity: ~ - price: ~ - quantity: ~ - unit_price: ~ - total: ~ - total_to_pay: ~ + booked_days: "Booked days:" + booked_nights: "Booked nights:" + booked_days_label: + one: "Booked day:" + other: "Booked days:" + booked_nights_label: + one: "Booked night:" + other: "Booked nights:" + price_per_day: "Price per day:" + price_per_night: "Price per night:" + quantity: "Quantity:" + subtotal: "Subtotal:" + shipping-price: "Shipping:" + stripe-fee: "Stripe Fee (estimated):" + price_per_quantity: "Price per %{unit_type}:" + price: "Price:" + quantity: "Quantity: %{quantity}" + unit_price: "Unit price: %{unit_price}" + total: "Total:" + total_to_pay: "Payment total:" unit: - day: ~ - days: ~ + day: day + days: days web: listings: errors: availability: - something_went_wrong: ~ - saving_failed: ~ + something_went_wrong: "We're not able to display availability information. Try to reload the page." + saving_failed: "We're not able to save availability changes. Try to reload the page." pricing_units: - piece: ~ - hour: ~ - day: ~ - night: ~ - week: ~ - month: ~ - edit_availability_header: ~ - save_and_close_availability_editing: ~ - confirm_discarding_unsaved_availability_changes_explanation: ~ - confirm_discarding_unsaved_availability_changes_question: ~ - edit_listing_availability: ~ + piece: piece + hour: hour + day: day + night: night + week: week + month: month + edit_availability_header: Availability + save_and_close_availability_editing: "Save and close" + confirm_discarding_unsaved_availability_changes_explanation: "You have unsaved changes to your availability information. If you proceed, these changes will be lost." + confirm_discarding_unsaved_availability_changes_question: "Are you sure you want to discard your changes?" + edit_listing_availability: "Edit listing availability" no_listings: - sorry: ~ - try_other_search_terms: ~ + sorry: "Sorry, no listings could be found for your search criteria." + try_other_search_terms: "Maybe try other search terms?" listing_card: - add_picture: ~ - no_picture: ~ + add_picture: "Add picture" + no_picture: "No picture" search: - page: ~ - page_of_pages: ~ + page: Page + page_of_pages: "of %{total_number_of_pages}" topbar: - menu: ~ - more: ~ - search_placeholder: ~ - search_location_placeholder: ~ - user: ~ - inbox: ~ - profile: ~ - manage_listings: ~ - settings: ~ - logout: ~ - login: ~ - signup: ~ - admin_dashboard: ~ - language: ~ + menu: Menu + more: More + search_placeholder: Search... + search_location_placeholder: Location + user: User + inbox: Inbox + profile: Profile + manage_listings: "Manage listings" + settings: Settings + logout: "Log out" + login: "Log in" + signup: "Sign up" + admin_dashboard: "Admin dashboard" + language: Language utils: - km: ~ - mi: ~ + km: km + mi: mi branding: - powered_by: ~ - create_own: ~ - learn_more: ~ + powered_by: "%{service_name} is powered by the %{sharetribe_link} marketplace platform." + create_own: "Want to create your own online marketplace website like %{service_name}? %{learn_more}." + learn_more: "Learn more" will_paginate: - previous_label: ~ - next_label: ~ - page_gap: ~ + models: + person: + zero: users + one: user + few: users + other: users + transaction: + zero: transactions + one: transaction + few: transactions + other: transactions + previous_label: "← Previous" + next_label: "Next →" + page_gap: "…" page_entries_info: - multi_page: ~ - multi_page_html: ~ + single_page: + zero: "No %{model} found" + one: "Displaying 1 %{model}" + other: "Displaying all %{count} %{model}" + single_page_html: + zero: "No %{model} found" + one: "Displaying 1 %{model}" + other: "Displaying all %{count} %{model}" + multi_page: "Displaying %{model} %{from} - %{to} of %{count} in total" + multi_page_html: "Displaying %{model} %{from} - %{to} of %{count} in total" person: community_members_entries_info: - multi_page: ~ - multi_page_html: ~ + single_page: + zero: "No %{model} found" + one: "Displaying %{accepted_count} accepted %{accepted_model} and %{banned_count} banned %{banned_model}" + other: "Displaying %{accepted_count} accepted %{accepted_model} and %{banned_count} banned %{banned_model}" + single_page_html: + zero: "No %{model} found" + one: "Displaying %{accepted_count} accepted %{accepted_model} and %{banned_count} banned %{banned_model}" + other: "Displaying %{accepted_count} accepted %{accepted_model} and %{banned_count} banned %{banned_model}" + multi_page: "Displaying %{model} %{from} - %{to} of %{accepted_count} accepted %{accepted_model} and %{banned_count} banned %{banned_model}" + multi_page_html: "Displaying %{model} %{from} - %{to} of %{accepted_count} accepted %{accepted_model} and %{banned_count} banned %{banned_model}" stripe_accounts: - admin_account_not_connected: ~ - contact_admin_link_text: ~ - you_are_ready_to_accept_payments: ~ - commission: ~ - pay_with_stripe: ~ - add_and_pay: ~ - card_not_stored: ~ - missing_payment: ~ - stripe_bank_connected: ~ - stripe_can_accept: ~ - stripe_credit_card: ~ - paypal: ~ - paypal_connected: ~ - paypal_can_accept: ~ - paypal_connected_give_permission: ~ + admin_account_not_connected: "Using %{service_name}'s payment system in order to receive payments is not possible since payments have not been set up. Please %{contact_admin_link} for details." + contact_admin_link_text: "contact the %{service_name} team" + you_are_ready_to_accept_payments: "You are ready to accept payments!" + commission: "%{commission} %" + pay_with_stripe: "Pay with Stripe using %{card}" + add_and_pay: "Confirm payment" + card_not_stored: "Your payment is securely processed by Stripe. %{service_name} does not store your credit/debit card information." + missing_payment: "You have open listings but your account is not set up to receive money. To configure your payment preferences, visit %{settings_link}" + stripe_bank_connected: "Bank account details configured successfully!" + stripe_can_accept: "You are now all set to receive money to your bank account" + stripe_credit_card: "Credit card" + paypal: PayPal + paypal_connected: "PayPal account connected successfully!" + paypal_can_accept: "You are now all set to receive money to your PayPal account" + paypal_connected_give_permission: "To complete setup and start receiving funds to your PayPal account <%{email}>, please grant permission to charge a transaction fee." form_new: - need_info: ~ - select_country: ~ - legal_name: ~ - country: ~ - birth_date: ~ - ssn_last_4: ~ - personal_id_number: ~ - address_country: ~ - address_state: ~ - address_city: ~ - address_postal_code: ~ - address_line1: ~ - tos_link: ~ - tos_link_title: ~ - save_details: ~ - edit: ~ - cancel: ~ + need_info: "We need some information about you to be able to send you money." + select_country: "Select country..." + legal_name: "Legal name" + country: Country + birth_date: "Birth date" + ssn_last_4: "SSN Last 4" + personal_id_number: "Personal ID number" + address_country: Country + address_state: State + address_city: City + address_postal_code: "Postal code" + address_line1: "Street address" + tos_link: "By adding your payout details you accept the %{stripe_link}." + tos_link_title: "Stripe Connected Account Agreement" + save_details: "Save details" + edit: "Edit details" + cancel: Cancel form_bank: - bank_account_number: ~ - bank_routing_number: ~ - bank_routing_1: ~ - bank_routing_2: ~ - bank_currency: ~ + bank_account_number: "Bank account number" + bank_routing_number: "Routing number" + bank_routing_1: "Bank code" + bank_routing_2: "Branch code" + bank_currency: "Bank account currency" messages: - account_number: ~ - routing_number: ~ - bank_code: ~ - branch_code: ~ - transit_number: ~ - institution_number: ~ - format_varies_by_bank: ~ - bsb: ~ - error_message: ~ - clearing_code: ~ - sort_code: ~ - must_match: ~ - a_dash: ~ - digits: ~ - digits_or_chars: ~ + account_number: "Account number" + routing_number: "Routing number" + bank_code: "Bank code" + branch_code: "Branch code" + transit_number: "Transit number" + institution_number: "Institution number" + format_varies_by_bank: "Format varies by bank" + bsb: BSB + error_message: "Invalid format" + clearing_code: "Clearing code" + sort_code: "Sort code" + must_match: "must be in the following format:" + a_dash: "a dash" + digits: digits + digits_or_chars: "digits or A-Z chars" form_verification: - personal_id_number: ~ - document: ~ - send_verification: ~ - need_verification: ~ + personal_id_number: "Personal ID Number" + document: "Verification document" + send_verification: "Send Verification" + need_verification: "Need additional verification" form_pin: - social_insurance_number: ~ - social_security_number: ~ - hong_kong_identity_card: ~ - singapore_identity_card: ~ + social_insurance_number: "Social Insurance Number (SIN)" + social_security_number: "Social Security Number (SSN)" + hong_kong_identity_card: "Hong Kong Identity Card Number (HKID)" + singapore_identity_card: "National Registration Identity Card (NRIC) or Foreign Identification Number (FIN)" messages: - social_insurance_number: ~ + social_insurance_number: "must be valid Social Insurance Number (SIN)" payment_settings: - title: ~ - bank_account: ~ - paypal: ~ - bank_account_details: ~ - add_bank_details: ~ - can_accept_stripe_and_paypal: ~ - to_accept_paypal: ~ - connect_paypal: ~ - wrong_setup: ~ - invalid_bank_account_number: ~ - invalid_postal_code: ~ + title: "Payout preferences" + bank_account: "Bank account" + paypal: PayPal + bank_account_details: "To receive money to your bank account, you need to provide your bank details. Your customers will be able to pay with their credit card." + add_bank_details: "Add bank details" + can_accept_stripe_and_paypal: "You can receive money to your bank account or your PayPal account." + to_accept_paypal: "To receive money to your PayPal account, you need to connect your PayPal account. Your customers will be able to pay with PayPal." + connect_paypal: "Connect PayPal account" + wrong_setup: "There is something wrong with the payment system setup in this marketplace: the platform has not been registered. Please contact the team to let them know that they should register their platform at Stripe." + invalid_bank_account_number: "Please check that your bank account is entered correctly and matches your country." + invalid_postal_code: "Invalid postal code for %{country}" diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 74ab745c89..98ff6d5096 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -226,7 +226,7 @@ fi: twitter_handle: "Twitter-tili (käytetään ilmoitussivulla olevan twitter-napin yhteydessä)" update_settings: Tallenna automatically_confirmed_no_escrow: "Tilaus merkitään toteutuneeksi automaattisesti, kun maksusta on kulunut %{days_dropdown} päivää" - automatically_confirmed_no_escrow_stripe_info: ~ + automatically_confirmed_no_escrow_stripe_info: "Stripe-alustalla tehdyt maksut siirtyvät myyjälle vasta kun tilaus merkitään toteutuneeksi. %{learn_more}" automatic_newsletter_frequency: "Lähetä automaattinen uutiskirje: %{frequency_dropdown}" newsletter_daily: Päivittäin newsletter_weekly: Viikoittain @@ -254,7 +254,7 @@ fi: export_all_as_csv: "Lataa tiedot CSV-tiedostona" save_user_status_error: "Tallennus epäonnistui. Päivitä sivu ja yritä uudelleen." ban_user_confirmation: "Olet poistamassa käyttäjää palvelusta ja estämästä häntä liittymästä uudelleen samalla käyttäjätunnuksella. Oletko varma?" - unban_user_confirmation: ~ + unban_user_confirmation: "Tämä poistaa eston käyttäjältä ja antaa hänelle taas pääsyn markkinapaikalle. Oletko varma että haluat tehdä tämän?" ban_me_error: "Et voi poistaa itseäsi." search: Hae search_by_name_email: "Etsi nimeä, sähköpostiosoitetta, tai näyttönimeä" @@ -322,7 +322,7 @@ fi: initiated_by: Aloittaja other_party: "Toinen osapuoli" status: - conversation: ~ + conversation: Keskustelu free: Keskustelu pending: Odottaa preauthorized: "Katevaraus tehty" @@ -359,16 +359,16 @@ fi: pending_ext: "Odottaa Stripe-maksua" not_available: "Ei saatavilla" conversations: - conversations: ~ + conversations: "Näytä keskustelut" headers: - started_from: ~ - status: ~ - started: ~ - last_activity: ~ - initiated_by: ~ - other_party: ~ - participants: ~ - profile: ~ + started_from: "Alkanut sivulta" + status: Tila + started: Alkanut + last_activity: "Aktiivinen viimeksi" + initiated_by: Aloittaja + other_party: "Toinen osapuoli" + participants: "Keskustelu: %{starter} sekä %{author}" + profile: "Käyttäjän %{author} profiili" custom_fields: edit: edit_listing_field: "Muokkaa ilmoituskenttää '%{field_name}'" @@ -959,10 +959,10 @@ fi: message_not_displaying_correctly: "Eikö tämä viesti näy oikein sähköpostissa?" view_it_in_your_browser: "Katso internet-selaimellasi" or: tai - unsubscribe_from_these_emails_info: ~ + unsubscribe_from_these_emails_info: "Vastaanotit tämän sähköpostin koska olet palvelun %{service_name} jäsen." unsubscribe_from_these_emails: "lopeta tällaisten viestien vastaanotto kokonaan" - unsubscribe_from_invitation_emails_info: ~ - unsubscribe_from_invitation_emails: ~ + unsubscribe_from_invitation_emails_info: "Vastaanotit tämän sähköpostin, koska palvelun %{service_name} jäsen kutsui sinut palvelun käyttäjäksi." + unsubscribe_from_invitation_emails: "Lopeta markkinapaikan %{service_name} kutsujen vastaanottaminen sähköpostitse" conversation_status_changed: has_accepted_your_offer: "%{accepter} on hyväksynyt tarjouksesi '%{listing}'." has_accepted_your_request: "%{accepter} on hyväksynyt pyyntösi '%{listing}'." @@ -1428,10 +1428,10 @@ fi: feedback_sent_to: "Palaute lähetetty käyttäjälle %{target_person}." feedback_skipped: "Palaute ohitettu" invitation_cannot_be_sent: "Kutsua ei voitu lähettää" - invitation_cannot_unsubscribe: ~ + invitation_cannot_unsubscribe: "Sähköpostikutsujen tilauksen lopettaminen epäonnistui" invitation_limit_reached: "Yritit lähettää liian monta kutsua. Päivittäinen raja saavutettu." invitation_sent: "Kutsu lähetetty" - invitation_successfully_unsubscribed: ~ + invitation_successfully_unsubscribed: "Sähköpostikutsujen tilauksen lopettaminen onnistui" inviting_new_users_is_not_allowed_in_this_community: "Uusien käyttäjien kutsuminen ei ole sallittua." login_again: "Kirjaudu uudestaan." login_failed: "Kirjautuminen epäonnistui. Syötithän tunnuksen ja salasanan oikein." @@ -2350,8 +2350,16 @@ fi: multi_page_html: "Näytetään %{from} - %{to} %{model} (kokonaismäärä %{count})." person: community_members_entries_info: - multi_page: ~ - multi_page_html: ~ + multi_page: "Näytetään %{model} %{from} - %{to} yhteensä %{accepted_count} hyväksytystä %{accepted_model} ja %{banned_count} estetystä %{banned_model}" + multi_page_html: "Näytetään %{model} %{from} -%{to} yhteensä %{accepted_count} hyväksytystä %{accepted_model} ja %{banned_count} estetystä %{banned_model}" + single_page: + zero: "Ei %{model}" + one: "Näytetään %{accepted_count} hyväksytty %{accepted_model} ja %{banned_count} estetty %{banned_model}" + other: "Näytetään %{accepted_count} hyväksyttyä %{accepted_model}ä ja %{banned_count} estettyä %{banned_model}ä" + single_page_html: + zero: "Ei %{model}" + one: "Näytetään %{accepted_count} hyväksytty %{accepted_model} ja %{banned_count} estetty %{banned_model}" + other: "Näytetään %{accepted_count} hyväksyttyä %{accepted_model}ä ja %{banned_count} estettyä %{banned_model}ä" stripe_accounts: admin_account_not_connected: "%{service_name}-palvelun maksujärjestelmän käyttäminen maksujen vastaanottamiseen ei ole vielä mahdollista, koska maksujärjestelmää ei ole vielä otettu käyttöön. Ole hyvä ja %{contact_admin_link}." contact_admin_link_text: "ota yhteyttä ylläpitoon" diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 34750891a3..0317ed5ec1 100755 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -324,8 +324,8 @@ nl: initiated_by: Door other_party: "Andere partij" status: - conversation: ~ - free: Conversatie + conversation: Conversaties + free: "Vrije transactie" pending: Hangende preauthorized: "Vooraf geauthoriseerd" accepted: Aanvaard @@ -336,7 +336,7 @@ nl: initiated: "Wachten op PayPal betaling" pending_ext: "Wachten PayPal betaling" none: - free: Conversatie + free: "Vrije transactie" paypal: free: Conversatie pending: "In afwachting" @@ -361,16 +361,16 @@ nl: pending_ext: "In afwachting van Stripe betaling" not_available: "Niet beschikbaar" conversations: - conversations: ~ + conversations: "Bekijk conversaties" headers: - started_from: ~ - status: ~ - started: ~ - last_activity: ~ - initiated_by: ~ - other_party: ~ - participants: ~ - profile: ~ + started_from: "Begonnen van" + status: Status + started: Begonnen + last_activity: "Laatste Activiteit" + initiated_by: Starter + other_party: "Andere partij" + participants: "Conversatie: %{starter} met %{author}" + profile: "Profiel van %{author}" custom_fields: edit: edit_listing_field: "Edit advertentie veld '%{field_name}'" diff --git a/config/locales/tr-TR.yml b/config/locales/tr-TR.yml index a8f42f715e..e91ef1919b 100644 --- a/config/locales/tr-TR.yml +++ b/config/locales/tr-TR.yml @@ -456,9 +456,9 @@ tr-TR: read_more: "Otomatik kullanılabilirlik yönetimi hakkında daha fazla bilgi edinin" read_more_availability_management: "Kullanılabilirlik yönetimi hakkında daha fazla bilgi edinin" allow_providers_to_manage_availability: ~ - per_day_availability: ~ - per_night_availability: ~ - pricing_units_disabled_info: ~ + per_day_availability: "\"Günlük\" kullanılabilirlik" + per_night_availability: "\"Gecelik\" kullanılabilirlik" + pricing_units_disabled_info: "Takvim kullanılabirliği etkinleştirildiğinde fiyatlandırma tablosu kullanılamaz." can_not_find_name: ~ index: listing_shapes: "İşlem türü" @@ -509,15 +509,15 @@ tr-TR: online_payments_label: "Satıcıların internet üzerinden ödeme almasına izin ver" shipping_label: "Kargo ücretini satıcı belirlesin" price_label: "Satıcıların ilanlarına fiyat eklemesine izin ver" - units_title: ~ - units_desc: ~ + units_title: "Fiyatlandırma tablosu" + units_desc: "Fiyatlandırma birimlerini etkinleştirdiyseniz, liste fiyatı \"fiyatlandırma birimi başına fiyat\" olarak görüntülenir. Buna bir örnek: \"saatte 39 dolar\"." units: piece: ~ - hour: ~ - day: günde - night: ~ - week: ~ - month: ~ + hour: Saatlik + day: Günlük + night: Gecelik + week: Haftalık + month: Aylık can_not_find: ~ add_custom_unit: ~ delete_custom_unit: Sil @@ -1595,8 +1595,8 @@ tr-TR: location: Konum price: price: Fiyat - per: başına - per_day: günde + per: ~ + per_day: günlük mass: "parça, kg, l, m2, ..." time: "saat, gün, ay, ..." long_time: "hafta, ay, ..." @@ -1748,7 +1748,7 @@ tr-TR: listing_created_at: "İlan oluşturuldu" price: per_quantity_unit: "%{quantity_unit} başına" - per_day: günde + per_day: günlük delivery: "Teslim Yöntemi" shipping: "Kargo (+%{price})" shipping_no_price: Kargo @@ -2222,7 +2222,7 @@ tr-TR: booked_days: ~ booked_nights: ~ price_per_day: "Günlük ücret:" - price_per_night: ~ + price_per_night: "Gecelik fiyat" quantity: "Adet:" subtotal: "Ara Toplam:" shipping-price: "Kargo:" From 52507cc85eabe30c47b6628a758a5284dd5ebca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aivils=20=C5=A0toss?= Date: Fri, 15 Dec 2017 11:42:46 +0200 Subject: [PATCH 030/131] Paypal IPN fixes tested --- .../handle_paypal_ipn_message_job_spec.rb | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/spec/jobs/handle_paypal_ipn_message_job_spec.rb b/spec/jobs/handle_paypal_ipn_message_job_spec.rb index 3335939798..f43509f9f7 100644 --- a/spec/jobs/handle_paypal_ipn_message_job_spec.rb +++ b/spec/jobs/handle_paypal_ipn_message_job_spec.rb @@ -9,6 +9,7 @@ transaction_process_id: transaction_process.id) } let(:transaction) { FactoryGirl.create(:transaction, community: community, listing: listing, current_state: 'initiated') } + let(:transaction2) { FactoryGirl.create(:transaction, community: community, listing: listing, current_state: 'initiated') } context '#perform' do it 'IPN message - commission denied' do @@ -184,5 +185,85 @@ expect(paypal_payment.commission_status).to eq 'pending' expect(paypal_payment.commission_pending_reason).to eq 'paymentreview' end + + it 'IPN message - fixed find paypal payment' do + body = { + "mc_gross"=>"40.50", + "invoice"=>"31089-262964-payment", + "auth_exp"=>"01:52:09 Jan 09, 2018 PST", + "protection_eligibility"=>"Eligible", + "address_status"=>"confirmed", + "item_number1"=>"", + "payer_id"=>"SMVUWVZCWZZZZ", + "tax"=>"0.00", + "address_street"=>"Alba Diagnostics Ltd 1 Bankhead Ave, Bankhead Ind Est", + "payment_date"=>"01:52:09 Dec 11, 2017 PST", + "payment_status"=>"Voided", + "charset"=>"windows-1252", + "address_zip"=>"KY7 6JG", + "mc_shipping"=>"5.50", + "mc_handling"=>"0.00", + "first_name"=>"Stewart", + "transaction_entity"=>"auth", + "address_country_code"=>"GB", + "address_name"=>"Stewart Whitton", + "notify_version"=>"3.8", + "custom"=>"", + "payer_status"=>"unverified", + "business"=>"info@peek-a-boo-signs.co.uk", + "address_country"=>"United Kingdom", + "num_cart_items"=>"1", + "mc_handling1"=>"0.00", + "address_city"=>"Glenrothes, Fife", + "verify_sign"=>"AGXT66oAmwth6Mv574mMl8vl9PeuAJ8SBM.xnUQ4vETFvdkiEyxn18jL", + "payer_email"=>"stewart@example.com", + "mc_shipping1"=>"0.00", + "tax1"=>"0.00", + "parent_txn_id"=>"", + "txn_id"=>"17834969M2791ZZZZ", + "payment_type"=>"instant", + "remaining_settle"=>"0", + "auth_id"=>"17834969M2791ZZZZ", + "last_name"=>"Whitton", + "address_state"=>"Fife", + "item_name1"=>"Wooden Sign \"How to tell time\"", + "receiver_email"=>"info@example.com", + "auth_amount"=>"40.50", + "shipping_discount"=>"0.00", + "quantity1"=>"1", + "insurance_amount"=>"0.00", + "receiver_id"=>"SRVAF3PNHZZZZ", + "txn_type"=>"cart", + "discount"=>"0.00", + "mc_gross_1"=>"35.00", + "mc_currency"=>"GBP", + "residence_country"=>"GB", + "shipping_method"=>"Default", + "transaction_subject"=>"", + "payment_gross"=>"", + "auth_status"=>"Voided", + "ipn_track_id"=>"7cc0a09bbbbbb", + "controller"=>"paypal_ipn", + "action"=>"ipn_hook" + } + paypal_ipn_message = FactoryGirl.create(:paypal_ipn_message, body: body, status: 'errored') + FactoryGirl.create(:paypal_payment, + community_id: community.id, + transaction_id: transaction2.id, + payment_status: 'voided', + pending_reason: 'none', + authorization_id: '111', + commission_status: 'not_charged', + commission_pending_reason: 'none') + FactoryGirl.create(:paypal_payment, + community_id: community.id, + transaction_id: transaction.id, + payment_status: 'voided', + pending_reason: 'none', + authorization_id: body["txn_id"], + commission_status: 'not_charged', + commission_pending_reason: 'none') + expect{HandlePaypalIpnMessageJob.new(paypal_ipn_message.id).perform}.to_not raise_error + end end end From 202c52bc15c433aa38a2db2aabd456111c529a05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aivils=20=C5=A0toss?= Date: Wed, 8 Nov 2017 16:07:42 +0200 Subject: [PATCH 031/131] Availability per hour. Admin + Provider --- Gemfile | 1 + Gemfile.lock | 5 + .../admin/listing_shapes_controller.rb | 3 +- .../int_api/listings_controller.rb | 20 ++ app/controllers/listings_controller.rb | 19 +- app/models/listing.rb | 3 + .../concerns/manage_availability_per_hour.rb | 41 +++ app/models/listing/working_time_slot.rb | 25 ++ app/models/listing_shape.rb | 22 +- app/models/listing_unit.rb | 14 +- app/presenters/listing_presenter.rb | 35 +++ app/services/feature_flag_service/store.rb | 1 + app/view_utils/listing_shape_templates.rb | 1 + app/view_utils/shape_service.rb | 8 +- .../listing_shapes/_shape_form_content.haml | 25 +- app/views/admin/listing_shapes/edit.haml | 7 +- app/views/admin/listing_shapes/new.haml | 7 +- app/views/listings/_listing_actions.haml | 14 +- client/app/assets/styles/variables.js | 1 + .../ListingWorkingHours.css | 8 + .../ListingWorkingHours.js | 196 ++++++++++++++ .../sections/ListingWorkingHours/actions.js | 53 ++++ .../sections/ListingWorkingHours/constants.js | 17 ++ .../sections/ListingWorkingHours/form.css | 69 +++++ .../sections/ListingWorkingHours/form.js | 252 ++++++++++++++++++ .../ListingWorkingHours/images/checkmark.svg | 1 + .../ListingWorkingHours/images/loading.svg | 1 + .../sections/ListingWorkingHours/reducer.js | 46 ++++ client/app/reducers/reducersIndex.js | 2 + client/app/startup/ListingWorkingHoursApp.js | 51 ++++ client/app/startup/clientRegistration.js | 2 + client/package.json | 4 +- config/locales/en.yml | 8 + config/routes.rb | 5 + ...70523_create_listing_working_time_slots.rb | 13 + db/structure.sql | 1 - spec/models/listing/working_time_slot_spec.rb | 22 ++ 37 files changed, 976 insertions(+), 27 deletions(-) create mode 100644 app/controllers/int_api/listings_controller.rb create mode 100644 app/models/listing/concerns/manage_availability_per_hour.rb create mode 100644 app/models/listing/working_time_slot.rb create mode 100644 client/app/components/sections/ListingWorkingHours/ListingWorkingHours.css create mode 100644 client/app/components/sections/ListingWorkingHours/ListingWorkingHours.js create mode 100644 client/app/components/sections/ListingWorkingHours/actions.js create mode 100644 client/app/components/sections/ListingWorkingHours/constants.js create mode 100644 client/app/components/sections/ListingWorkingHours/form.css create mode 100644 client/app/components/sections/ListingWorkingHours/form.js create mode 100644 client/app/components/sections/ListingWorkingHours/images/checkmark.svg create mode 100644 client/app/components/sections/ListingWorkingHours/images/loading.svg create mode 100644 client/app/components/sections/ListingWorkingHours/reducer.js create mode 100644 client/app/startup/ListingWorkingHoursApp.js create mode 100644 db/migrate/20171023070523_create_listing_working_time_slots.rb create mode 100644 spec/models/listing/working_time_slot_spec.rb diff --git a/Gemfile b/Gemfile index 91ce8a8579..5e5d38289a 100644 --- a/Gemfile +++ b/Gemfile @@ -170,3 +170,4 @@ gem 'intercom' gem 'twitter_cldr' gem 'memoist' +gem 'biz' diff --git a/Gemfile.lock b/Gemfile.lock index f068451d0c..59a9ab7e99 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -91,6 +91,9 @@ GEM bindex (0.5.0) binding_of_caller (0.7.2) debug_inspector (>= 0.0.1) + biz (1.7.0) + clavius (~> 1.0) + tzinfo builder (3.2.3) byebug (9.0.6) callsite (0.0.11) @@ -105,6 +108,7 @@ GEM childprocess (0.7.0) ffi (~> 1.0, >= 1.0.11) chunky_png (1.3.8) + clavius (1.0.3) cldr-plurals-runtime-rb (1.0.1) climate_control (0.2.0) cocaine (0.5.8) @@ -580,6 +584,7 @@ DEPENDENCIES aws-sdk (~> 2.9.25) better_errors (~> 2.1.1) binding_of_caller + biz capybara (~> 2.6.2) coffee-rails (~> 4.2.2) color (~> 1.8) diff --git a/app/controllers/admin/listing_shapes_controller.rb b/app/controllers/admin/listing_shapes_controller.rb index fa14043ecf..2a918f05d2 100644 --- a/app/controllers/admin/listing_shapes_controller.rb +++ b/app/controllers/admin/listing_shapes_controller.rb @@ -226,7 +226,8 @@ def common_locals(form:, count:, process_summary:, available_locs:) harmony_in_use: APP_CONFIG.harmony_api_in_use.to_s == "true", display_knowledge_base_articles: APP_CONFIG.display_knowledge_base_articles.to_s == "true", knowledge_base_url: APP_CONFIG.knowledge_base_url, - locale_name_mapping: available_locs.map { |name, l| [l, name] }.to_h + locale_name_mapping: available_locs.map { |name, l| [l, name] }.to_h, + availability_per_hour: FeatureFlagHelper.feature_enabled?(:availability_per_hour) } end diff --git a/app/controllers/int_api/listings_controller.rb b/app/controllers/int_api/listings_controller.rb new file mode 100644 index 0000000000..f08ed3721c --- /dev/null +++ b/app/controllers/int_api/listings_controller.rb @@ -0,0 +1,20 @@ +class IntApi::ListingsController < ApplicationController + respond_to :json + + def update_working_time_slots + listing.update_attributes(working_time_slots_params) + respond_with listing.working_hours_as_json, location: nil + end + + private + + def listing + @listing ||= Listing.find(params[:id]) + end + + def working_time_slots_params + params.require(:listing).permit( + working_time_slots_attributes: [ :id, :from, :till, :week_day, :_destroy ] + ) + end +end diff --git a/app/controllers/listings_controller.rb b/app/controllers/listings_controller.rb index 29a4b91cba..6adc8fb9c2 100644 --- a/app/controllers/listings_controller.rb +++ b/app/controllers/listings_controller.rb @@ -149,8 +149,9 @@ def create @listing.reorder_listing_images(params, @current_user.id) notify_about_new_listing - if shape[:availability] == :booking - redirect_to listing_path(@listing, anchor: 'manage-availability'), status: 303 + if shape.booking? + anchor = availability_per_hour && shape.booking_per_hour? ? 'manage-working-hours' : 'manage-availability' + redirect_to listing_path(@listing, anchor: anchor, listing_just_created: true), status: 303 else redirect_to @listing, status: 303 end @@ -471,10 +472,20 @@ def notify_about_new_listing end def create_booking(shape, listing_uuid) - if APP_CONFIG.harmony_api_in_use && shape.present? && shape[:availability] == 'booking' - create_bookable(@current_community.uuid_object, listing_uuid, @current_user.uuid_object).success + if shape.present? + if availability_per_hour && shape.booking_per_hour? + true + elsif APP_CONFIG.harmony_api_in_use && shape.booking? + create_bookable(@current_community.uuid_object, listing_uuid, @current_user.uuid_object).success + else + true + end else true end end + + def availability_per_hour + FeatureFlagHelper.feature_enabled?(:availability_per_hour) + end end diff --git a/app/models/listing.rb b/app/models/listing.rb index 82eb1257b0..57a2699dac 100644 --- a/app/models/listing.rb +++ b/app/models/listing.rb @@ -67,6 +67,7 @@ class Listing < ApplicationRecord include ApplicationHelper include ActionView::Helpers::TranslationHelper include Rails.application.routes.url_helpers + include ManageAvailabilityPerHour belongs_to :author, :class_name => "Person", :foreign_key => "author_id" @@ -86,6 +87,8 @@ class Listing < ApplicationRecord has_and_belongs_to_many :followers, :class_name => "Person", :join_table => "listing_followers" belongs_to :category + has_many :working_time_slots, ->{ order_by_week_day }, dependent: :destroy + accepts_nested_attributes_for :working_time_slots, reject_if: :all_blank, allow_destroy: true monetize :price_cents, :allow_nil => true, with_model_currency: :currency monetize :shipping_price_cents, allow_nil: true, with_model_currency: :currency diff --git a/app/models/listing/concerns/manage_availability_per_hour.rb b/app/models/listing/concerns/manage_availability_per_hour.rb new file mode 100644 index 0000000000..ffb738a239 --- /dev/null +++ b/app/models/listing/concerns/manage_availability_per_hour.rb @@ -0,0 +1,41 @@ +module ManageAvailabilityPerHour + extend ActiveSupport::Concern + + def working_hours_listing_schedule + Biz::Schedule.new do |config| + config.hours = working_hours_prepare_hash + config.breaks = {} + config.holidays = [] + config.time_zone = 'Etc/UTC' + end + end + + def working_hours_new_set + return if working_time_slots.any? + Listing::WorkingTimeSlot.week_days.keys.each do |week_day| + next if ['sun', 'sat'].include?(week_day) + working_time_slots.build(week_day: week_day, from: '09:00', till: '17:00') + end + end + + def working_hours_as_json + as_json(only: [:id, :title], include: { + working_time_slots: { only: [:id, :week_day, :from, :till] } + }) + end + + private + + def working_hours_prepare_hash + result = {} + Listing::WorkingTimeSlot.week_days.keys.each do |week_day| + day = {} + working_time_slots.by_week_day(week_day).each do |time_slot| + day[time_slot.from] = time_slot.till + end + result[time_slot.week_day] = day + end + result + end + +end diff --git a/app/models/listing/working_time_slot.rb b/app/models/listing/working_time_slot.rb new file mode 100644 index 0000000000..735158cd9e --- /dev/null +++ b/app/models/listing/working_time_slot.rb @@ -0,0 +1,25 @@ +# == Schema Information +# +# Table name: listing_working_time_slots +# +# id :integer not null, primary key +# listing_id :integer +# week_day :integer +# from :string(255) +# till :string(255) +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_listing_working_time_slots_on_listing_id (listing_id) +# + +class Listing::WorkingTimeSlot < ApplicationRecord + belongs_to :listing + + enum week_day: {sun: 0, mon: 1, tue: 2, wed: 3, thu: 4, fri: 5, sat: 6} + + scope :by_week_day, ->(day) { where(week_day: day) } + scope :order_by_week_day, -> { order('listing_working_time_slots.week_day ASC') } +end diff --git a/app/models/listing_shape.rb b/app/models/listing_shape.rb index cff2184c3d..669c83d672 100644 --- a/app/models/listing_shape.rb +++ b/app/models/listing_shape.rb @@ -24,6 +24,12 @@ # class ListingShape < ApplicationRecord + DEFAULT_BASENAME = 'order_type'.freeze + AVAILABILITIES = [ + AVAILABILITY_NONE = 'none'.freeze, + AVAILABILITY_BOOKING = 'booking'.freeze + ].freeze + belongs_to :community belongs_to :transaction_process @@ -36,14 +42,12 @@ class ListingShape < ApplicationRecord validates :name_tr_key, :action_button_tr_key, :transaction_process_id, presence: true validates :price_enabled, :shipping_enabled, inclusion: [true, false] - validates :availability, inclusion: ['none', 'booking'] # Possibly :stock in the future + validates :availability, inclusion: AVAILABILITIES # Possibly :stock in the future def units @_hash_units ||= listing_units.map(&:to_unit_hash) end - DEFAULT_BASENAME = 'order_type' - def self.create_with_opts(community:, opts:) shape = ListingShape.new(ListingShape.permitted_attributes(opts)) shape.community = community @@ -101,4 +105,16 @@ def assign_to_categories! CategoryListingShape.create!(category_id: category_id, listing_shape_id: self.id) end end + + def booking_per_hour? + booking? && listing_units.unit_type_hour.any? + end + + def booking_per_day_or_night? + booking? && listing_units.unit_type_day_or_night.any? + end + + def booking? + availability == AVAILABILITY_BOOKING + end end diff --git a/app/models/listing_unit.rb b/app/models/listing_unit.rb index 5a5a9a2974..da9f43cf19 100644 --- a/app/models/listing_unit.rb +++ b/app/models/listing_unit.rb @@ -18,14 +18,26 @@ # class ListingUnit < ApplicationRecord + UNIT_TYPES = [ + HOUR = 'hour'.freeze, + DAY = 'day'.freeze, + NIGHT = 'night'.freeze, + WEEK = 'week'.freeze, + MONTH = 'month'.freeze, + CUSTOM = 'custom'.freeze + ].freeze + belongs_to :listing_shape - validates :unit_type, inclusion: ['hour', 'day', 'night', 'week', 'month', 'custom'] + validates :unit_type, inclusion: UNIT_TYPES validates :kind, inclusion: ['time', 'quantity'] validates :name_tr_key, presence: true, if: proc { unit_type == 'custom' } validates :selector_tr_key, presence: true, if: proc { unit_type == 'custom' } validates :quantity_selector, inclusion: [nil, '', 'none', 'number', 'day', 'night'] # in the future include :hour, :week:,:month + scope :unit_type_hour, -> { where(unit_type: HOUR) } + scope :unit_type_day_or_night, -> { where(["unit_type = ? OR unit_type = ?", DAY, NIGHT]) } + def to_unit_hash { unit_type: unit_type, diff --git a/app/presenters/listing_presenter.rb b/app/presenters/listing_presenter.rb index 402472d34a..6d7584f931 100644 --- a/app/presenters/listing_presenter.rb +++ b/app/presenters/listing_presenter.rb @@ -337,5 +337,40 @@ def subcategory_id @listing.category.parent_id ? @listing.category.id : nil end + def working_hours_props + { + i18n: { + locale: I18n.locale, + default_locale: I18n.default_locale, + locale_info: I18nHelper.locale_info(Sharetribe::AVAILABLE_LOCALES, I18n.locale) + }, + marketplace: { + uuid: @current_community.uuid_object.to_s, + marketplace_color1: CommonStylesHelper.marketplace_colors(@current_community)[:marketplace_color1], + }, + listing: working_time_slots, + time_slot_options: time_slot_options, + day_names: I18n.t('date.day_names'), + listing_just_created: !!params[:listing_just_created] + } + end + + private + + def working_time_slots + listing.working_hours_new_set + listing.working_hours_as_json + end + + def time_slot_options + result = [] + (0..23).each do |x| + value = format("%02d:00", x) + name = I18n.locale == :en ? Time.parse("#{x}:00").strftime("%l:00 %P") : value + result.push(value: value, name: name) + end + result + end + memoize_all_reader_methods end diff --git a/app/services/feature_flag_service/store.rb b/app/services/feature_flag_service/store.rb index 2e2a73ae53..8312c0c62e 100644 --- a/app/services/feature_flag_service/store.rb +++ b/app/services/feature_flag_service/store.rb @@ -22,6 +22,7 @@ class FeatureFlag :searchpage_v1, :manage_searchpage, :stripe, + :availability_per_hour, ].to_set def initialize(additional_flags:) diff --git a/app/view_utils/listing_shape_templates.rb b/app/view_utils/listing_shape_templates.rb index d7ec0d7b27..a872dc8673 100644 --- a/app/view_utils/listing_shape_templates.rb +++ b/app/view_utils/listing_shape_templates.rb @@ -69,6 +69,7 @@ def all online_payments: true, template: :offering_services, author_is_seller: true, + availability: 'booking', units: [{unit_type: 'hour', quantity_selector: :number}] }, { diff --git a/app/view_utils/shape_service.rb b/app/view_utils/shape_service.rb index cedf77557b..8081d0545c 100644 --- a/app/view_utils/shape_service.rb +++ b/app/view_utils/shape_service.rb @@ -143,11 +143,17 @@ def validate_upsert_opts(opts) if opts[:availability] == 'booking' if opts[:units].length != 1 Result::Error.new("Only one unit is allowed if booking availability is in use. Was: #{opts[:units].inspect}") - elsif !['day', 'night'].include?(opts[:units].first[:unit_type]) + elsif !enabled_units.include?(opts[:units].first[:unit_type]) Result::Error.new("Only day or night unit is allowed if booking availability is in use. Was: #{opts[:units].inspect}") end end error || Result::Success.new(opts) end + + def enabled_units + units = ['day', 'night'] + units.push('hour') if FeatureFlagHelper.feature_enabled?(:availability_per_hour) + units + end end diff --git a/app/views/admin/listing_shapes/_shape_form_content.haml b/app/views/admin/listing_shapes/_shape_form_content.haml index 57ce134617..bdedef2731 100644 --- a/app/views/admin/listing_shapes/_shape_form_content.haml +++ b/app/views/admin/listing_shapes/_shape_form_content.haml @@ -56,7 +56,7 @@ = check_box_tag(:shipping_enabled, "true", shape[:shipping_enabled], class: "checkbox-row-checkbox js-shipping-enabled") = label_tag(:shipping_enabled, t("admin.listing_shapes.shipping_label"), class: "checkbox-row-label js-shipping-enabled-label") -- if harmony_in_use +- if harmony_in_use || availability_per_hour - unless uneditable_fields[:availability] .row @@ -71,15 +71,22 @@ = check_box_tag(:availability, "booking", shape[:availability] == 'booking', class: "checkbox-row-checkbox js-availability") = label_tag(:availability, t("admin.listing_shapes.allow_providers_to_manage_availability"), class: "checkbox-row-label js-availability-label") - .row - .col-12 - = radio_button_tag(:availability_unit, "night", shape[:availability] == 'booking' && shape[:availability_unit] == 'night', class: "checkbox-row-checkbox js-availability-unit", style: "margin-left: 1em") - = label_tag(:availability, t("admin.listing_shapes.per_night_availability"), class: "checkbox-row-label js-availability-unit-label") + - if availability_per_hour + .row + .col-12 + = radio_button_tag(:availability_unit, "hour", shape[:availability] == 'booking' && shape[:availability_unit] == 'hour', class: "checkbox-row-checkbox js-availability-unit", style: "margin-left: 1em") + = label_tag(:availability, t("admin.listing_shapes.per_hour_availability"), class: "checkbox-row-label js-availability-unit-label") - .row - .col-12 - = radio_button_tag(:availability_unit, "day", shape[:availability] == 'booking' && shape[:availability_unit] == 'day', class: "checkbox-row-checkbox js-availability-unit", style: "margin-left: 1em") - = label_tag(:availability, t("admin.listing_shapes.per_day_availability"), class: "checkbox-row-label js-availability-unit-label") + - if harmony_in_use + .row + .col-12 + = radio_button_tag(:availability_unit, "night", shape[:availability] == 'booking' && shape[:availability_unit] == 'night', class: "checkbox-row-checkbox js-availability-unit", style: "margin-left: 1em") + = label_tag(:availability, t("admin.listing_shapes.per_night_availability"), class: "checkbox-row-label js-availability-unit-label") + + .row + .col-12 + = radio_button_tag(:availability_unit, "day", shape[:availability] == 'booking' && shape[:availability_unit] == 'day', class: "checkbox-row-checkbox js-availability-unit", style: "margin-left: 1em") + = label_tag(:availability, t("admin.listing_shapes.per_day_availability"), class: "checkbox-row-label js-availability-unit-label") .row .col-12 diff --git a/app/views/admin/listing_shapes/edit.haml b/app/views/admin/listing_shapes/edit.haml index 928a2c2e04..66b3e32517 100644 --- a/app/views/admin/listing_shapes/edit.haml +++ b/app/views/admin/listing_shapes/edit.haml @@ -14,7 +14,12 @@ %h2= t(".edit_listing_shape", shape: name) = form_tag(admin_listing_shape_path(url_name), method: :put, id: "listing_shape_form") do - = render partial: "shape_form_content", locals: { name: name, shape: shape, count: count, locale_name_mapping: locale_name_mapping, uneditable_fields: uneditable_fields, harmony_in_use: harmony_in_use, display_knowledge_base_articles: display_knowledge_base_articles, knowledge_base_url: knowledge_base_url } + = render partial: "shape_form_content", locals: { name: name, shape: shape, + count: count, locale_name_mapping: locale_name_mapping, + uneditable_fields: uneditable_fields, harmony_in_use: harmony_in_use, + display_knowledge_base_articles: display_knowledge_base_articles, + knowledge_base_url: knowledge_base_url, + availability_per_hour: availability_per_hour } .row .col-12 diff --git a/app/views/admin/listing_shapes/new.haml b/app/views/admin/listing_shapes/new.haml index 20334a9e77..c28e07be61 100644 --- a/app/views/admin/listing_shapes/new.haml +++ b/app/views/admin/listing_shapes/new.haml @@ -13,7 +13,12 @@ %h2= t(".create_listing_shape") = form_tag(admin_listing_shapes_path, method: :post, id: "listing_shape_form") do - = render partial: "shape_form_content", locals: { id: nil, shape: shape, count: count, locale_name_mapping: locale_name_mapping, uneditable_fields: uneditable_fields, harmony_in_use: harmony_in_use, display_knowledge_base_articles: display_knowledge_base_articles, knowledge_base_url: knowledge_base_url } + = render partial: "shape_form_content", locals: { id: nil, shape: shape, + count: count, locale_name_mapping: locale_name_mapping, + uneditable_fields: uneditable_fields, harmony_in_use: harmony_in_use, + display_knowledge_base_articles: display_knowledge_base_articles, + knowledge_base_url: knowledge_base_url, + availability_per_hour: availability_per_hour } .row .col-12 diff --git a/app/views/listings/_listing_actions.haml b/app/views/listings/_listing_actions.haml index 7996026932..0b9562a170 100644 --- a/app/views/listings/_listing_actions.haml +++ b/app/views/listings/_listing_actions.haml @@ -166,10 +166,16 @@ - if @listing_presenter.show_manage_availability && APP_CONFIG.harmony_api_in_use - availability_link_id = "edit-listing-availability-#{SecureRandom.urlsafe_base64(5)}" .listing-view-admin-link - %a.icon-with-text-container{id: availability_link_id, href: "#manage-availability"} - = icon_tag("calendar", ["icon-part"]) - .text-part= t("web.listings.edit_listing_availability") - = react_component("ManageAvailabilityApp", props: @listing_presenter.manage_availability_props.merge({ availability_link_id: availability_link_id }), prerender: false) + - if FeatureFlagHelper.feature_enabled?(:availability_per_hour) + %a.icon-with-text-container{id: availability_link_id, href: "#manage-working-hours"} + = icon_tag("calendar", ["icon-part"]) + .text-part= t("web.listings.edit_listing_availability") + = react_component("ListingWorkingHoursApp", props: @listing_presenter.working_hours_props.merge({ availability_link_id: availability_link_id }), prerender: false) + - else + %a.icon-with-text-container{id: availability_link_id, href: "#manage-availability"} + = icon_tag("calendar", ["icon-part"]) + .text-part= t("web.listings.edit_listing_availability") + = react_component("ManageAvailabilityApp", props: @listing_presenter.manage_availability_props.merge({ availability_link_id: availability_link_id }), prerender: false) .listing-view-admin-link %a.icon-with-text-container{href: close_person_listing_path(@current_user, @listing), data: { method: "put", remote: "true"}} = icon_tag("lock", ["icon-part"]) diff --git a/client/app/assets/styles/variables.js b/client/app/assets/styles/variables.js index 4c03ae3004..c92872c909 100644 --- a/client/app/assets/styles/variables.js +++ b/client/app/assets/styles/variables.js @@ -381,4 +381,5 @@ module.exports = { '--ManageAvailabilityCalendar_fontFamily': proximaNovaFontFamily, '--ManageAvailabilityCalendar_fontSize': fontSize, '--ManageAvailabilityCalendar_width': '318px', + '--ManageAvailabilityWorkingHours_maxWidth': 415, }; diff --git a/client/app/components/sections/ListingWorkingHours/ListingWorkingHours.css b/client/app/components/sections/ListingWorkingHours/ListingWorkingHours.css new file mode 100644 index 0000000000..5421384918 --- /dev/null +++ b/client/app/components/sections/ListingWorkingHours/ListingWorkingHours.css @@ -0,0 +1,8 @@ +.content { + display: flex; + flex-direction: column; + justify-content: flex-start; + height: 100%; + font-family: var(--ManageAvailability_fontFamily); + overflow-y: auto; +} diff --git a/client/app/components/sections/ListingWorkingHours/ListingWorkingHours.js b/client/app/components/sections/ListingWorkingHours/ListingWorkingHours.js new file mode 100644 index 0000000000..47faa641b1 --- /dev/null +++ b/client/app/components/sections/ListingWorkingHours/ListingWorkingHours.js @@ -0,0 +1,196 @@ +import { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; +import * as FlashNotificationActions from '../../../actions/FlashNotificationActions'; +import * as ListingWorkingHoursActions from './actions'; +import r, { div, a } from 'r-dom'; +import Immutable from 'immutable'; +import { t } from '../../../utils/i18n'; +import { canUseDOM, canUsePushState } from '../../../utils/featureDetection'; +import SideWinder from '../../composites/SideWinder/SideWinder'; +import ManageAvailabilityHeader from '../../composites/ManageAvailabilityHeader/ManageAvailabilityHeader'; +import FlashNotification from '../../composites/FlashNotification/FlashNotification'; +import * as cssVariables from '../../../assets/styles/variables'; +import ListingWorkingHoursForm from './form.js'; + +import css from './ListingWorkingHours.css'; + +/** + Return `true` if component should load initial data. +*/ +const shouldLoad = (isOpen, prevIsOpen) => isOpen && !prevIsOpen; + +/** + Load initial data if needed. This should happen only once when + component `isOpen` becomes `true` +*/ +const loadInitialDataIfNeeded = (props, prevProps = null) => { + const isOpen = props.isOpen; + const prevIsOpen = prevProps && prevProps.isOpen; + + if (shouldLoad(isOpen, prevIsOpen)) { + true; // eslint-disable-line no-unused-expressions + } +}; + +const setPushState = (state, title, path) => { + if (canUseDOM && canUsePushState) { + window.history.pushState(state, title, path); + } else if (canUseDOM) { + window.location.hash = path; + } +}; + + +class ListingWorkingHours extends Component { + constructor(props) { + super(props); + this.state = { + renderCalendar: false, + viewportHeight: null, + }; + + this.clickHandler = this.clickHandler.bind(this); + this.resizeHandler = this.resizeHandler.bind(this); + } + + componentDidMount() { + + if (this.props.availability_link) { + this.props.availability_link.addEventListener('click', this.clickHandler); + } + + loadInitialDataIfNeeded(this.props); + + this.setState({ viewportHeight: window.innerHeight }); // eslint-disable-line react/no-set-state + window.addEventListener('resize', this.resizeHandler); + } + + componentWillUpdate(nextProps) { + // manage location hash + const containsHash = window.location.hash.indexOf(`#${ListingWorkingHoursActions.EDIT_VIEW_OPEN_HASH}`) >= 0; + const href = window.location.href; + const paramsIndex = href.indexOf('?'); + const searchPart = paramsIndex >= 0 ? href.substring(paramsIndex) : ''; + + if (nextProps.isOpen && !containsHash) { + const openPath = `${window.location.pathname}#${ListingWorkingHoursActions.EDIT_VIEW_OPEN_HASH}${searchPart}`; + setPushState(null, 'Listing working hours is open', openPath); + } else if (!nextProps.isOpen && containsHash) { + setPushState(null, 'Listing working hours is closed', `${window.location.pathname}${searchPart}`); + } + } + + componentDidUpdate(prevProps) { + loadInitialDataIfNeeded(this.props, prevProps); + } + + componentWillUnmount() { + window.removeEventListener('resize', this.resizeHandler); + if (this.props.availability_link) { + this.props.availability_link.removeEventListener('click', this.clickHandler); + } + } + + clickHandler(e) { + e.preventDefault(); + this.props.actions.openEditView(); + } + + resizeHandler() { + this.setState({ viewportHeight: window.innerHeight }); // eslint-disable-line react/no-set-state + } + + render() { + + const defaultLink = a({ + href: '#', + onClick: this.clickHandler, + }, t('web.listings.edit_listing_availability')); + const maybeRenderDefaultLink = this.props.availability_link ? null : defaultLink; + + const winder = { + wrapper: this.props.sideWinderWrapper, + maxWidth: cssVariables['--ManageAvailabilityWorkingHours_maxWidth'], + minWidth: cssVariables['--ManageAvailability_minWidth'], + height: this.state.viewportHeight, + isOpen: this.props.isOpen, + onClose: () => { + if (this.props.saveInProgress) { + return; + } + const explanation = t('web.listings.confirm_discarding_unsaved_availability_changes_explanation'); + const question = t('web.listings.confirm_discarding_unsaved_availability_changes_question'); + const text = `${explanation}\n\n${question}`; + + if (!this.props.hasChanges || window.confirm(text)) { // eslint-disable-line no-alert + this.props.actions.closeEditView(); + if (typeof this.props.onCloseCallback === 'function') { + this.props.onCloseCallback(); + } + } + }, + }; + + + return div([ + maybeRenderDefaultLink, + r(SideWinder, winder, [ + div({ className: css.content }, [ + r(ManageAvailabilityHeader, this.props.header), + r(ListingWorkingHoursForm, { + listing: this.props.listing, + time_slot_options: this.props.time_slot_options, + day_names: this.props.day_names, + actions: this.props.actions, + saveInProgress: this.props.saveInProgress, + saveFinished: this.props.saveFinished, + }) : null, + ]), + ]), + r(FlashNotification, { + actions: this.props.actions, + messages: this.props.flashNotifications, + }), + ]); + } +} + +ListingWorkingHours.propTypes = { + actions: PropTypes.shape({ + removeFlashNotification: PropTypes.func.isRequired, + openEditView: PropTypes.func.isRequired, + closeEditView: PropTypes.func.isRequired, + saveChanges: PropTypes.func.isRequired, + dataChanged: PropTypes.func.isRequired, + }).isRequired, + availability_link: PropTypes.object, // eslint-disable-line react/forbid-prop-types + flashNotifications: PropTypes.instanceOf(Immutable.List).isRequired, + hasChanges: PropTypes.bool.isRequired, + saveInProgress: PropTypes.bool.isRequired, + saveFinished: PropTypes.bool.isRequired, + onCloseCallback: PropTypes.func, + isOpen: PropTypes.bool.isRequired, + header: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types + sideWinderWrapper: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types + listing: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types + time_slot_options: PropTypes.array.isRequired, // eslint-disable-line react/forbid-prop-types + day_names: PropTypes.array.isRequired, // eslint-disable-line react/forbid-prop-types +}; + +// export default ListingWorkingHours; + +const mapStateToProps = ({ flashNotifications, listingWorkingHours }) => ({ + flashNotifications, + isOpen: listingWorkingHours.get('isOpen'), + hasChanges: listingWorkingHours.get('changes'), + saveInProgress: listingWorkingHours.get('saveInProgress'), + saveFinished: listingWorkingHours.get('saveFinished'), + listing: listingWorkingHours.get('listing'), +}); + +const mapDispatchToProps = (dispatch) => ({ + actions: bindActionCreators({ ...FlashNotificationActions, ...ListingWorkingHoursActions }, dispatch), +}); + +export default connect(mapStateToProps, mapDispatchToProps)(ListingWorkingHours); diff --git a/client/app/components/sections/ListingWorkingHours/actions.js b/client/app/components/sections/ListingWorkingHours/actions.js new file mode 100644 index 0000000000..06eff01792 --- /dev/null +++ b/client/app/components/sections/ListingWorkingHours/actions.js @@ -0,0 +1,53 @@ +import axios from 'axios'; +import * as actionTypes from './constants'; + +export const EDIT_VIEW_OPEN_HASH = 'manage-working-hours'; + +export const openEditView = () => ({ type: actionTypes.OPEN_EDIT_VIEW }); + +export const closeEditView = () => ({ type: actionTypes.CLOSE_EDIT_VIEW }); + +const startSaving = () => ({ type: actionTypes.START_SAVING }); + +const changesSaved = () => ({ type: actionTypes.CHANGES_SAVED }); + +const savingFailed = (e) => ({ + type: actionTypes.SAVING_FAILED, + error: true, + payload: e, +}); + +const dataLoaded = (data) => ({ + type: actionTypes.DATA_LOADED, + payload: data, +}); + +export const dataChanged = () => ({ type: actionTypes.DATA_CHANGED }); + +export const saveChanges = (formData) => + (dispatch, getState) => { + dispatch(startSaving()); + const state = getState().listingWorkingHours; + const listingId = state.get('listing').id; // eslint-disable-line no-unused-vars + console.log('save Listing Working Hours Changes'); // eslint-disable-line + axios.post(`/int_api/listings/${listingId}/update_working_time_slots`, formData) + .then((response) => { + dispatch(changesSaved()); + dispatch(dataLoaded(response.data)); + console.log(response); // eslint-disable-line no-console + + /* + this.setState({ // eslint-disable-line react/no-set-state + timeSlots: response.data.working_time_slots, + saveInProgress: false, + saveFinished: true, + }); + */ + }) + .catch((error) => { + savingFailed(error); + console.log(error); // eslint-disable-line no-console + }); + + }; + diff --git a/client/app/components/sections/ListingWorkingHours/constants.js b/client/app/components/sections/ListingWorkingHours/constants.js new file mode 100644 index 0000000000..0bbf3e5f70 --- /dev/null +++ b/client/app/components/sections/ListingWorkingHours/constants.js @@ -0,0 +1,17 @@ +const START_SAVING = 'LISTING_WORKING_HOURS::START_SAVING'; +const CHANGES_SAVED = 'LISTING_WORKING_HOURS::CHANGES_SAVED'; +const SAVING_FAILED = 'LISTING_WORKING_HOURS::SAVING_FAILED'; +const OPEN_EDIT_VIEW = 'LISTING_WORKING_HOURS::OPEN_EDIT_VIEW'; +const CLOSE_EDIT_VIEW = 'LISTING_WORKING_HOURS::CLOSE_EDIT_VIEW'; +const DATA_LOADED = 'LISTING_WORKING_HOURS::DATA_LOADED'; +const DATA_CHANGED = 'LISTING_WORKING_HOURS::DATA_CHANGED'; + +export { + START_SAVING, + CHANGES_SAVED, + SAVING_FAILED, + OPEN_EDIT_VIEW, + CLOSE_EDIT_VIEW, + DATA_LOADED, + DATA_CHANGED, +}; diff --git a/client/app/components/sections/ListingWorkingHours/form.css b/client/app/components/sections/ListingWorkingHours/form.css new file mode 100644 index 0000000000..7b0f627bcf --- /dev/null +++ b/client/app/components/sections/ListingWorkingHours/form.css @@ -0,0 +1,69 @@ +.workingHoursTitle { + margin-top: 20px; +} + +.weekDay { + & a { + cursor: pointer; + } + & :global(.title) { + & span { + margin-left: 10px; + } + } + + & :global(.timeSlot) { + margin-bottom: 10px; + + & select { + min-height: auto; + margin-right: 10px; + padding: 0.5em 0; + } + & :global(.starTime) { + margin-right: 10px; + } + & :global(.endTime) { + margin-right: 10px; + } + & :global(.remove) { + color: #ffffff; + background-color: #4a90e2; + border-radius: 50%; + display: inline-block; + width: 20px; + height: 20px; + padding-left: 3.5px; + } + } + & :global(.addMore) { + margin-bottom: 10px; + } +} + +.saveButton { + & :global(.availability_checkmark) { + width: 30px; + height: 30px; + border-radius: 50%; + display: block; + stroke-width: 5; + stroke: #2ab865; + stroke-miterlimit: 10; + margin: 0 auto; + box-shadow: inset 0 0 0 #fff; + animation: fill 0.4s ease-in-out 0.4s forwards, scale 0.3s ease-in-out 0.9s both; + } + + & :global(.availability_checkmark__circle) { + stroke-width: 2; + stroke-miterlimit: 10; + fill: none; + animation: stroke 0.6s cubic-bezier(0.65, 0, 0.45, 1) forwards; + } + + & :global(.availability_checkmark__check) { + transform-origin: 50% 50%; + animation: stroke 0.3s cubic-bezier(0.65, 0, 0.45, 1) 0.8s forwards; + } +} diff --git a/client/app/components/sections/ListingWorkingHours/form.js b/client/app/components/sections/ListingWorkingHours/form.js new file mode 100644 index 0000000000..450fabefa8 --- /dev/null +++ b/client/app/components/sections/ListingWorkingHours/form.js @@ -0,0 +1,252 @@ +import React, { Component, PropTypes } from 'react'; +import serialize from 'form-serialize'; +import { t } from '../../../utils/i18n'; + +import css from './form.css'; +import loadingImage from './images/loading.svg'; +import checkmarkImage from './images/checkmark.svg'; + +class TimeSlot extends Component { + constructor(props) { + super(props); + this.state = { + remove: false, + }; + this.handleRemove = this.handleRemove.bind(this); + } + + handleRemove(event) { + event.preventDefault(); + this.props.onChange(); + this.setState({ remove: true }); // eslint-disable-line react/no-set-state + } + + render() { + const timeSlot = this.props.timeSlot; + const index = this.props.index; + const timeSlotId = timeSlot.id || ''; + const timeOptions = this.props.time_slot_options.map((option, optionIndex) => + + ); + return ( +
+
+ {t('web.listings.working_hours.start_time')} + + {t('web.listings.working_hours.end_time')} + + + + + +
+ + +
+ ); + } +} +TimeSlot.propTypes = { + timeSlot: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types + index: PropTypes.number.isRequired, + time_slot_options: PropTypes.array.isRequired, // eslint-disable-line react/forbid-prop-types + onChange: PropTypes.func.isRequired, +}; +TimeSlot.contextTypes = { + remove: PropTypes.bool, +}; + +class Day extends Component { + constructor(props) { + super(props); + this.state = { + timeSlots: props.timeSlots, + enabled: props.timeSlots.length > 0, + }; + this.handleAddMore = this.handleAddMore.bind(this); + this.handleEnabled = this.handleEnabled.bind(this); + } + + getChildContext() { + return { remove: !this.state.enabled }; + } + + componentWillReceiveProps(nextProps) { + this.setState({ // eslint-disable-line react/no-set-state + timeSlots: nextProps.timeSlots, + }); + } + + newTimeSlot() { + return { + week_day: this.props.day, + from: '09:00', + till: '17:00', + }; + } + + handleAddMore(event) { + event.preventDefault(); + this.props.addMore(this.newTimeSlot()); + } + + handleEnabled() { + this.props.onChange(); + this.setState((prevState) => ({ // eslint-disable-line react/no-set-state + enabled: !prevState.enabled, + })); + } + + render() { + const TIME_SLOTS_PER_DAY = 100; + const startIndex = this.props.index * TIME_SLOTS_PER_DAY; + const remove = !this.state.enabled; + const options = this.props.time_slot_options; + const timeSlots = this.state.timeSlots.map((timeSlot, index) => { + const timeSlotIndex = startIndex + index; + return ; + }); + + return ( +
+ + {timeSlots} + +
+ ); + } +} +Day.propTypes = { + timeSlots: PropTypes.array.isRequired, // eslint-disable-line react/forbid-prop-types + day: PropTypes.string.isRequired, + dayName: PropTypes.string.isRequired, + index: PropTypes.number.isRequired, + time_slot_options: PropTypes.array.isRequired, // eslint-disable-line react/forbid-prop-types + onChange: PropTypes.func.isRequired, + addMore: PropTypes.func.isRequired, +}; +Day.childContextTypes = { + remove: PropTypes.bool, +}; + +class SaveButton extends Component { + render() { + let html = null; + + if (this.props.saveInProgress) { + html = loadingImage; + } else if (this.props.saveFinished) { + html = checkmarkImage; + } else { + html = t('web.listings.working_hours.save'); + } + html = { __html: html }; + + return ( +