mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-02-27 01:43:22 +00:00
Merge branch 'master' into fix/rails-7-serialize-deprecation
This commit is contained in:
26
Gemfile.lock
26
Gemfile.lock
@@ -326,12 +326,14 @@ GEM
|
||||
factory_bot_rails (6.2.0)
|
||||
factory_bot (~> 6.2.0)
|
||||
railties (>= 5.0.0)
|
||||
faraday (2.9.0)
|
||||
faraday-net_http (>= 2.0, < 3.2)
|
||||
faraday (2.14.1)
|
||||
faraday-net_http (>= 2.0, < 3.5)
|
||||
json
|
||||
logger
|
||||
faraday-follow_redirects (0.4.0)
|
||||
faraday (>= 1, < 3)
|
||||
faraday-net_http (3.1.1)
|
||||
net-http
|
||||
faraday-net_http (3.4.2)
|
||||
net-http (~> 0.5)
|
||||
ferrum (0.14)
|
||||
addressable (~> 2.5)
|
||||
concurrent-ruby (~> 1.1)
|
||||
@@ -440,7 +442,7 @@ GEM
|
||||
thor (>= 0.14, < 2.0)
|
||||
jquery-ui-rails (4.2.1)
|
||||
railties (>= 3.2.16)
|
||||
json (2.15.2)
|
||||
json (2.18.1)
|
||||
json-canonicalization (1.0.0)
|
||||
json-jwt (1.17.0)
|
||||
activesupport (>= 4.2)
|
||||
@@ -514,8 +516,8 @@ GEM
|
||||
multi_json (1.17.0)
|
||||
multi_xml (0.6.0)
|
||||
mutex_m (0.3.0)
|
||||
net-http (0.7.0)
|
||||
uri
|
||||
net-http (0.9.1)
|
||||
uri (>= 0.11.1)
|
||||
net-imap (0.5.12)
|
||||
date
|
||||
net-protocol
|
||||
@@ -573,7 +575,7 @@ GEM
|
||||
parallel (1.27.0)
|
||||
paranoia (2.6.4)
|
||||
activerecord (>= 5.1, < 7.2)
|
||||
parser (3.3.10.1)
|
||||
parser (3.3.10.2)
|
||||
ast (~> 2.4.1)
|
||||
racc
|
||||
paypal-sdk-core (0.3.4)
|
||||
@@ -616,7 +618,7 @@ GEM
|
||||
railties (>= 4.2)
|
||||
raabro (1.4.0)
|
||||
racc (1.8.1)
|
||||
rack (2.2.21)
|
||||
rack (2.2.22)
|
||||
rack-mini-profiler (2.3.4)
|
||||
rack (>= 1.2.0)
|
||||
rack-oauth2 (2.3.0)
|
||||
@@ -772,7 +774,7 @@ GEM
|
||||
rswag-ui (2.17.0)
|
||||
actionpack (>= 5.2, < 8.2)
|
||||
railties (>= 5.2, < 8.2)
|
||||
rubocop (1.81.7)
|
||||
rubocop (1.84.2)
|
||||
json (~> 2.3)
|
||||
language_server-protocol (~> 3.17.0.2)
|
||||
lint_roller (~> 1.1.0)
|
||||
@@ -780,7 +782,7 @@ GEM
|
||||
parser (>= 3.3.0.2)
|
||||
rainbow (>= 2.2.2, < 4.0)
|
||||
regexp_parser (>= 2.9.3, < 3.0)
|
||||
rubocop-ast (>= 1.47.1, < 2.0)
|
||||
rubocop-ast (>= 1.49.0, < 2.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (>= 2.4.0, < 4.0)
|
||||
rubocop-ast (1.49.0)
|
||||
@@ -792,7 +794,7 @@ GEM
|
||||
rubocop-factory_bot (2.28.0)
|
||||
lint_roller (~> 1.1)
|
||||
rubocop (~> 1.72, >= 1.72.1)
|
||||
rubocop-rails (2.34.2)
|
||||
rubocop-rails (2.34.3)
|
||||
activesupport (>= 4.2.0)
|
||||
lint_roller (~> 1.1)
|
||||
rack (>= 1.1)
|
||||
|
||||
@@ -251,7 +251,7 @@ module Spree
|
||||
transaction do
|
||||
ExchangeVariant.
|
||||
where(exchange_variants: { variant_id: variants.with_deleted.
|
||||
select(:id) }).destroy_all
|
||||
select(:id) }).destroy_all
|
||||
|
||||
yield
|
||||
end
|
||||
|
||||
@@ -35,8 +35,8 @@ module Spree
|
||||
taxons
|
||||
.pluck('spree_taxons.id, enterprises.id AS enterprise_id')
|
||||
.each_with_object({}) do |(taxon_id, enterprise_id), collection|
|
||||
collection[enterprise_id.to_i] ||= Set.new
|
||||
collection[enterprise_id.to_i] << taxon_id
|
||||
collection[enterprise_id.to_i] ||= Set.new
|
||||
collection[enterprise_id.to_i] << taxon_id
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -167,8 +167,8 @@ module Spree
|
||||
# In Rails 3, merging two scopes on the same column will consider only the last scope.
|
||||
def self.in_distributor(distributor)
|
||||
where(id: ExchangeVariant.select(:variant_id).
|
||||
joins(:exchange).
|
||||
where('exchanges.incoming = ? AND exchanges.receiver_id = ?', false, distributor))
|
||||
joins(:exchange).
|
||||
where('exchanges.incoming = ? AND exchanges.receiver_id = ?', false, distributor))
|
||||
end
|
||||
|
||||
def self.indexed
|
||||
@@ -179,11 +179,11 @@ module Spree
|
||||
# "where(id:" is necessary so that the returned relation has no includes
|
||||
# The relation without includes will not be readonly and allow updates on it
|
||||
where(spree_variants: { id: joins(:prices).
|
||||
where(deleted_at: nil).
|
||||
where('spree_prices.currency' =>
|
||||
where(deleted_at: nil).
|
||||
where('spree_prices.currency' =>
|
||||
currency || CurrentConfig.get(:currency)).
|
||||
where.not(spree_prices: { amount: nil }).
|
||||
select("spree_variants.id") })
|
||||
where.not(spree_prices: { amount: nil }).
|
||||
select("spree_variants.id") })
|
||||
end
|
||||
|
||||
def self.linked_to(semantic_id)
|
||||
|
||||
@@ -60,8 +60,8 @@ class ProductScopeQuery
|
||||
|
||||
def product_query_includes
|
||||
[
|
||||
image: { attachment_attachment: :blob },
|
||||
variants: [:default_price, :stock_items, :variant_overrides]
|
||||
{ image: { attachment_attachment: :blob },
|
||||
variants: [:default_price, :stock_items, :variant_overrides] }
|
||||
]
|
||||
end
|
||||
|
||||
|
||||
@@ -42,10 +42,10 @@ class DfcCatalogImporter
|
||||
.includes(:semantic_links).references(:semantic_links)
|
||||
.where.not(semantic_links: { semantic_id: present_ids })
|
||||
.select do |variant|
|
||||
# Variants that were in the same catalog before:
|
||||
variant.semantic_links.map(&:semantic_id).any? do |semantic_id|
|
||||
FdcUrlBuilder.new(semantic_id).catalog_url == catalog_url
|
||||
end
|
||||
# Variants that were in the same catalog before:
|
||||
variant.semantic_links.map(&:semantic_id).any? do |semantic_id|
|
||||
FdcUrlBuilder.new(semantic_id).catalog_url == catalog_url
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -51,8 +51,8 @@ class LineItemSyncer
|
||||
def destroy_obsolete_items(order)
|
||||
order.line_items.
|
||||
where(variant_id: subscription_line_items.
|
||||
select(&:marked_for_destruction?).
|
||||
map(&:variant_id)).
|
||||
select(&:marked_for_destruction?).
|
||||
map(&:variant_id)).
|
||||
destroy_all
|
||||
end
|
||||
|
||||
|
||||
@@ -130,12 +130,11 @@ module Orders
|
||||
|
||||
def order_cycle_fees
|
||||
return @order_cycle_fees if defined? @order_cycle_fees
|
||||
return [] unless order_cycle && distributor
|
||||
|
||||
@order_cycle_fees = begin
|
||||
fees = []
|
||||
|
||||
return fees unless order_cycle && distributor
|
||||
|
||||
order_cycle.exchanges.supplying_to(distributor).each do |exchange|
|
||||
exchange.enterprise_fees.per_item.each do |enterprise_fee|
|
||||
fee_value = FeeValue.new(fee: enterprise_fee, role: exchange.role)
|
||||
|
||||
@@ -14,12 +14,12 @@ module PermittedAttributes
|
||||
|
||||
def self.attributes
|
||||
basic_permitted_attributes + [
|
||||
group_ids: [], user_ids: [],
|
||||
shipping_method_ids: [], payment_method_ids: [],
|
||||
address_attributes: PermittedAttributes::Address.attributes,
|
||||
business_address_attributes: PermittedAttributes::BusinessAddress.attributes,
|
||||
producer_properties_attributes: [:id, :property_name, :value, :_destroy],
|
||||
custom_tab_attributes: PermittedAttributes::CustomTab.attributes,
|
||||
{ group_ids: [], user_ids: [],
|
||||
shipping_method_ids: [], payment_method_ids: [],
|
||||
address_attributes: PermittedAttributes::Address.attributes,
|
||||
business_address_attributes: PermittedAttributes::BusinessAddress.attributes,
|
||||
producer_properties_attributes: [:id, :property_name, :value, :_destroy],
|
||||
custom_tab_attributes: PermittedAttributes::CustomTab.attributes },
|
||||
]
|
||||
end
|
||||
|
||||
|
||||
@@ -25,8 +25,8 @@ module PermittedAttributes
|
||||
private
|
||||
|
||||
def attributes
|
||||
self.class.basic_attributes + [incoming_exchanges: permitted_exchange_attributes,
|
||||
outgoing_exchanges: permitted_exchange_attributes]
|
||||
self.class.basic_attributes + [{ incoming_exchanges: permitted_exchange_attributes,
|
||||
outgoing_exchanges: permitted_exchange_attributes }]
|
||||
end
|
||||
|
||||
def permitted_exchange_attributes
|
||||
|
||||
@@ -26,11 +26,11 @@ module PermittedAttributes
|
||||
|
||||
def other_permitted_attributes
|
||||
[
|
||||
subscription_line_items_attributes: [
|
||||
:id, :quantity, :variant_id, :price_estimate, :_destroy
|
||||
],
|
||||
bill_address_attributes: PermittedAttributes::Address.attributes,
|
||||
ship_address_attributes: PermittedAttributes::Address.attributes
|
||||
{ subscription_line_items_attributes: [
|
||||
:id, :quantity, :variant_id, :price_estimate, :_destroy
|
||||
],
|
||||
bill_address_attributes: PermittedAttributes::Address.attributes,
|
||||
ship_address_attributes: PermittedAttributes::Address.attributes }
|
||||
]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -246,6 +246,9 @@ en_CA:
|
||||
disconnect_failure: "Failed to disconnecct Stripe."
|
||||
success_code:
|
||||
disconnected: "Stripe account disconnected."
|
||||
taler:
|
||||
order_status:
|
||||
claimed: "The payment request expired. Please try again."
|
||||
activemodel:
|
||||
errors:
|
||||
messages:
|
||||
@@ -3358,6 +3361,8 @@ en_CA:
|
||||
payment_processing_failed: "Payment could not be processed, please check the details you entered."
|
||||
payment_method_not_supported: "That payment method is unsupported. Please choose another one."
|
||||
payment_updated: "Payment Updated"
|
||||
payment_method_taler:
|
||||
order_summary: "Open Food Network order"
|
||||
cannot_perform_operation: "Could not update the payment"
|
||||
action_required: "Action required"
|
||||
tag_rules: "Tag Rules"
|
||||
@@ -4171,6 +4176,7 @@ en_CA:
|
||||
alt_text: "Alternative Text"
|
||||
thumbnail: "Thumbnail"
|
||||
back_to_images_list: "Back to Images List"
|
||||
backend_url: "Backend URL"
|
||||
api_key: "API key"
|
||||
email: Email
|
||||
account_updated: "Account updated!"
|
||||
@@ -4490,6 +4496,7 @@ en_CA:
|
||||
check: "Cash/EFT/Bank Transfer etc. (payments for which automatic validation is not required)"
|
||||
paypalexpress: "PayPal Express"
|
||||
stripesca: "Stripe SCA"
|
||||
taler: "Taler"
|
||||
payments:
|
||||
source_forms:
|
||||
stripe:
|
||||
|
||||
@@ -115,6 +115,67 @@ en_GB:
|
||||
blank: "can't be blank"
|
||||
too_short: "is too short (minimum is %{count} characters)"
|
||||
errors:
|
||||
messages:
|
||||
content_type_invalid:
|
||||
one: "has an invalid content type (authorised content type is %{authorized_human_content_types})"
|
||||
other: "has an invalid content type (authorised content types are\n%{authorized_human_content_types})"
|
||||
content_type_spoofed:
|
||||
one: "has a content type that is not equivalent to the one that is detected through its content (authorised content type is %{authorized_human_content_types})"
|
||||
other: "has a content type that is not equivalent to the one that is detected through its content (authorised content types are %{authorized_human_content_types})"
|
||||
file_size_not_less_than: "file size must be less than %{max} (current size is %{file_size})"
|
||||
file_size_not_less_than_or_equal_to: "file size must be less than or equal to %{max} (current size is %{file_size})"
|
||||
file_size_not_greater_than: "file size must be greater than %{min} (current size is %{file_size})"
|
||||
file_size_not_greater_than_or_equal_to: "file size must be greater than or equal to %{min} (current size is %{file_size})"
|
||||
file_size_not_between: "file size must be between %{min} and %{max} (current size is %{file_size})"
|
||||
file_size_not_equal_to: "file size must be equal to %{exact} (current size is %{file_size})"
|
||||
total_file_size_not_less_than: "total file size must be less than %{max} (current size is %{total_file_size})"
|
||||
total_file_size_not_less_than_or_equal_to: "total file size must be less than or equal to %{max} (current size is %{total_file_size})"
|
||||
total_file_size_not_greater_than: "total file size must be greater than %{min} (current size is %{total_file_size})"
|
||||
total_file_size_not_greater_than_or_equal_to: "total file size must be greater than or equal to %{min} (current size is %{total_file_size})"
|
||||
total_file_size_not_between: "total file size must be between %{min} and %{max} (current size is %{total_file_size})"
|
||||
total_file_size_not_equal_to: "total file size must be equal to %{exact} (current size is %{total_file_size})"
|
||||
duration_not_less_than: "duration must be less than %{max} (current duration is %{duration})"
|
||||
duration_not_less_than_or_equal_to: "duration must be less than or equal to %{max} (current duration is %{duration})"
|
||||
duration_not_greater_than: "duration must be greater than %{min} (current duration is %{duration})"
|
||||
duration_not_greater_than_or_equal_to: "duration must be greater than or equal to %{min} (current duration is %{duration})"
|
||||
duration_not_between: "duration must be between %{min} and %{max} (current duration is %{duration})"
|
||||
duration_not_equal_to: "duration must be equal to %{exact} (current duration is %{duration})"
|
||||
limit_out_of_range:
|
||||
zero: "no files attached (must have between %{min} and %{max}files)"
|
||||
one: "only 1 file attached (must have between %{min} and %{max}files)"
|
||||
other: "total number of files must be between %{min} and %{max} files (there are %{count}files attached)"
|
||||
limit_min_not_reached:
|
||||
zero: "no files attached (must have at least %{min} files)"
|
||||
one: "only 1 file attached (must have at least %{min} files)"
|
||||
other: "%{count} files attached (must have at least %{min} files)"
|
||||
limit_max_exceeded:
|
||||
zero: "no files attached (maximum is %{max} files)"
|
||||
one: "too many files attached (maximum is %{max} files, got %{count})"
|
||||
other: "too many files attached (maximum is %{max} files, got %{count})"
|
||||
attachment_missing: "is missing its attachment"
|
||||
media_metadata_missing: "is not a valid media file"
|
||||
dimension_min_not_included_in: "must be greater than or equal to %{width} x %{height} pixels"
|
||||
dimension_max_not_included_in: "must be less than or equal to %{width} x %{height} pixels"
|
||||
dimension_width_not_included_in: "width is not included between %{min} and %{max} pixels"
|
||||
dimension_height_not_included_in: "height is not included between %{min} and %{max} pixels"
|
||||
dimension_width_not_greater_than_or_equal_to: "width must be greater than or equal to %{length} pixels"
|
||||
dimension_height_not_greater_than_or_equal_to: "height must be greater than or equal to %{length} pixels"
|
||||
dimension_width_not_less_than_or_equal_to: "width must be less than or equal to %{length} pixels"
|
||||
dimension_height_not_less_than_or_equal_to: "height must be less than or equal to %{length} pixels"
|
||||
dimension_width_not_equal_to: "width must be equal to %{length} pixels"
|
||||
dimension_height_not_equal_to: "height must be equal to %{length} pixels"
|
||||
aspect_ratio_not_square: "must be square (current file is %{width}x%{height}px)"
|
||||
aspect_ratio_not_portrait: "must be portrait (current file is %{width}x%{height}px)"
|
||||
aspect_ratio_not_landscape: "must be landscape (current file is %{width}x%{height}px)"
|
||||
aspect_ratio_not_x_y: "must be %{authorized_aspect_ratios} (current file is %{width}x%{height}px)"
|
||||
aspect_ratio_invalid: "has an invalid aspect ratio (valid aspect ratios are %{authorized_aspect_ratios})"
|
||||
file_not_processable: "is not identified as a valid media file"
|
||||
pages_not_less_than: "page count must be less than %{max} (current page count is %{pages})"
|
||||
pages_not_less_than_or_equal_to: "page count must be less than or equal to %{max} (current page count is %{pages})"
|
||||
pages_not_greater_than: "page count must be greater than %{min} (current page count is %{pages})"
|
||||
pages_not_greater_than_or_equal_to: "page count must be greater than or equal to %{min} (current page count is %{pages})"
|
||||
pages_not_between: "page count must be between %{min} and %{max} (current page count is %{pages})"
|
||||
pages_not_equal_to: "page count must be equal to %{exact} (current page count is %{pages})"
|
||||
not_found:
|
||||
title: "The page you were looking for doesn't exist (404)"
|
||||
message_html: "<b>Please try again</b> <p>This might be a temporary problem. Please click the back button to return to the previous screen or go back to <a href='/'>Home</a> and try again.</p> <b>Contact support</b> <p>If the problem persists or is urgent, please tell us about it. Find our contact details from the global <a href='https://openfoodnetwork.org/ofn-local/' target='blank'>Open Food Network Local page</a>.</p> <p>It really helps us if you can give as much detail as possible about what the missing page is about.</p>"
|
||||
@@ -185,6 +246,9 @@ en_GB:
|
||||
disconnect_failure: "Failed to disconnect Stripe."
|
||||
success_code:
|
||||
disconnected: "Stripe account disconnected."
|
||||
taler:
|
||||
order_status:
|
||||
claimed: "The payment request expired. Please try again."
|
||||
activemodel:
|
||||
errors:
|
||||
messages:
|
||||
@@ -520,6 +584,7 @@ en_GB:
|
||||
errors:
|
||||
vine_api: "There was an error communicating with the API, please try again later."
|
||||
invalid_voucher: "The voucher is not valid"
|
||||
expired: "The voucher has expired"
|
||||
not_found_voucher: "Sorry, we couldn't find that voucher, please check the code."
|
||||
vine_voucher_redeemer_service:
|
||||
errors:
|
||||
@@ -934,6 +999,10 @@ en_GB:
|
||||
clone:
|
||||
success: Successfully cloned the product
|
||||
error: Unable to clone the product
|
||||
tag_rules:
|
||||
rules_per_tag:
|
||||
one: "%{tag} has 1 rule"
|
||||
other: "%{tag} has %{count} rules"
|
||||
product_import:
|
||||
title: Product Import
|
||||
file_not_found: File not found or could not be opened
|
||||
@@ -2374,9 +2443,9 @@ en_GB:
|
||||
order_includes_tax: (includes tax)
|
||||
order_payment_paypal_successful: Your payment via PayPal has been processed successfully.
|
||||
order_hub_info: Hub info
|
||||
order_back_to_store: Back To Store
|
||||
order_back_to_cart: Back To Cart
|
||||
order_back_to_website: Back To Website
|
||||
order_back_to_store: Back to shop
|
||||
order_back_to_cart: Back to cart
|
||||
order_back_to_website: Back to website
|
||||
checkout_details_title: Checkout Details
|
||||
checkout_payment_title: Checkout Payment
|
||||
checkout_summary_title: Checkout Summary
|
||||
@@ -3292,11 +3361,13 @@ en_GB:
|
||||
payment_processing_failed: "Payment could not be processed, please check the details you entered"
|
||||
payment_method_not_supported: "That payment method is unsupported. Please choose another one."
|
||||
payment_updated: "Payment Updated"
|
||||
payment_method_taler:
|
||||
order_summary: "Open Food Network order"
|
||||
cannot_perform_operation: "Could not update the payment"
|
||||
action_required: "Action required"
|
||||
tag_rules: "Tag Rules"
|
||||
enterprise_fee_whole_order: Whole order
|
||||
enterprise_fee_by_name: "%{name} fee by %{role}%{enterprise_name}"
|
||||
enterprise_fee_by_name: "%{name} fee by %{role} %{enterprise_name}"
|
||||
validation_msg_relationship_already_established: "^That relationship is already established."
|
||||
validation_msg_at_least_one_hub: "^At least one hub must be selected"
|
||||
validation_msg_tax_category_cant_be_blank: "^Tax Category can't be blank"
|
||||
@@ -3337,6 +3408,7 @@ en_GB:
|
||||
order_cycles_no_permission_to_coordinate_error: "None of your enterprises have permission to coordinate an order cycle"
|
||||
order_cycles_no_permission_to_create_error: "You don't have permission to create an order cycle coordinated by that enterprise"
|
||||
order_cycle_closed: "The order cycle you've selected has just closed."
|
||||
order_cycle_closed_next_steps: "The order cycle you've selected has just closed. Please contact us to complete your order #\n%{order_number}!"
|
||||
back_to_orders_list: "Back To Orders List"
|
||||
no_orders_found: "No Orders Found"
|
||||
order_information: "Order Information"
|
||||
@@ -3911,6 +3983,8 @@ en_GB:
|
||||
destroy:
|
||||
success: Webhook endpoint successfully deleted
|
||||
error: Webhook endpoint failed to delete
|
||||
test:
|
||||
success: Some test data will be sent to the webhook url
|
||||
spree:
|
||||
order_updated: "Order Updated"
|
||||
cannot_perform_operation: "Can not perform this operation"
|
||||
@@ -4017,6 +4091,7 @@ en_GB:
|
||||
logourl: "Logo url"
|
||||
are_you_sure_delete: "Are you sure you want to delete this record?"
|
||||
confirm_delete: "Confirm Deletion"
|
||||
tag_rule: "Tag Rule"
|
||||
voucher: "Voucher"
|
||||
configurations: "Configurations"
|
||||
general_settings: "General Settings"
|
||||
@@ -4108,6 +4183,7 @@ en_GB:
|
||||
alt_text: "Alternative Text"
|
||||
thumbnail: "Thumbnail"
|
||||
back_to_images_list: "Back To Images List"
|
||||
backend_url: "Backend URL"
|
||||
api_key: "API key"
|
||||
email: Email
|
||||
account_updated: "Account updated!"
|
||||
@@ -4427,6 +4503,7 @@ en_GB:
|
||||
check: "Cash/EFT/etc. (payments for which automatic validation is not required)"
|
||||
paypalexpress: "PayPal Express"
|
||||
stripesca: "Stripe SCA "
|
||||
taler: "Taler"
|
||||
payments:
|
||||
source_forms:
|
||||
stripe:
|
||||
@@ -4883,6 +4960,7 @@ en_GB:
|
||||
order_cycle_tagged_bottom: "are:"
|
||||
inventory_tagged_top: "Inventory variants tagged"
|
||||
inventory_tagged_bottom: "are:"
|
||||
variant_tagged_top: "Variants tagged"
|
||||
variant_tagged_bottom: "are:"
|
||||
visible: VISIBLE
|
||||
not_visible: NOT VISIBLE
|
||||
@@ -4898,6 +4976,8 @@ en_GB:
|
||||
create_placeholder: Enter the URL of the remote webhook endpoint
|
||||
event_types:
|
||||
order_cycle_opened: Order Cycle Opened
|
||||
payment_status_changed: Post webhook on Payment status change
|
||||
test_endpoint: Test webhook endpoint
|
||||
invisible_captcha:
|
||||
sentence_for_humans: "Please leave empty"
|
||||
timestamp_error_message: "Please try again after 5 seconds."
|
||||
|
||||
@@ -18,7 +18,7 @@ fi:
|
||||
phone: "Puhelinnumero"
|
||||
firstname: "Etunimi"
|
||||
lastname: "Sukunimi"
|
||||
zipcode: "Toimituspostinumero"
|
||||
zipcode: "Toimitusosoitteen postinumero"
|
||||
spree/order/bill_address:
|
||||
address1: "Laskutusosoite (Katu ja talonumero)"
|
||||
zipcode: "Laskutuspostinumero"
|
||||
@@ -115,6 +115,67 @@ fi:
|
||||
blank: "ei voi olla tyhjä"
|
||||
too_short: "on liian lyhyt (vähintään %{count} merkkiä)"
|
||||
errors:
|
||||
messages:
|
||||
content_type_invalid:
|
||||
one: "sisältää virheellisen sisältötyypin (valtuutettu sisältötyyppi on %{authorized_human_content_types} )"
|
||||
other: "sisältää virheellisen sisältötyypin (valtuutetut sisältötyypit ovat %{authorized_human_content_types} )"
|
||||
content_type_spoofed:
|
||||
one: "sisältötyyppi ei vastaa sisällöstä havaittua tyyppiä (valtuutettu sisältötyyppi on %{authorized_human_content_types} )"
|
||||
other: "sisältötyyppi ei vastaa sisällöstä havaittua tyyppiä (valtuutetut sisältötyypit ovat %{authorized_human_content_types} )"
|
||||
file_size_not_less_than: "tiedoston koko on oltava pienempi kuin %{max} (nykyinen koko on %{file_size} )"
|
||||
file_size_not_less_than_or_equal_to: "tiedoston koko on oltava pienempi tai yhtä suuri kuin %{max} (nykyinen koko on %{file_size} )"
|
||||
file_size_not_greater_than: "tiedoston koko on oltava suurempi kuin %{min} (nykyinen koko on %{file_size} )"
|
||||
file_size_not_greater_than_or_equal_to: "tiedoston koko on oltava suurempi tai yhtä suuri kuin %{min} (nykyinen koko on %{file_size} )"
|
||||
file_size_not_between: "koko on oltava %{min} ja %{max} välillä (nykyinen koko on %{file_size} )"
|
||||
file_size_not_equal_to: "tiedoston koko on oltava yhtä suuri kuin %{exact} (nykyinen koko on %{file_size} )"
|
||||
total_file_size_not_less_than: "yhteensä tiedoston koko on oltava pienempi kuin %{max} (nykyinen koko on %{total_file_size} )"
|
||||
total_file_size_not_less_than_or_equal_to: "yhteensä tiedoston koko on oltava pienempi tai yhtä suuri kuin %{max} (nykyinen koko on %{total_file_size} )"
|
||||
total_file_size_not_greater_than: "yhteensä tiedoston koko on oltava suurempi kuin %{min} (nykyinen koko on %{total_file_size} )"
|
||||
total_file_size_not_greater_than_or_equal_to: "yhteensä tiedoston koko on oltava suurempi tai yhtä suuri kuin %{min} (nykyinen koko on %{total_file_size} )"
|
||||
total_file_size_not_between: "yhteensä tiedoston koko on oltava %{min} ja %{max} välillä (nykyinen koko on %{total_file_size} )"
|
||||
total_file_size_not_equal_to: "yhteensä tiedoston koko on oltava yhtä suuri kuin %{exact} (nykyinen koko on %{total_file_size} )"
|
||||
duration_not_less_than: "keston on oltava pienempi kuin %{max} (nykyinen kesto on %{duration} )"
|
||||
duration_not_less_than_or_equal_to: "keston on oltava pienempi tai yhtä suuri kuin %{max} (nykyinen kesto on %{duration} )"
|
||||
duration_not_greater_than: "keston on oltava suurempi kuin %{min} (nykyinen kesto on %{duration} )"
|
||||
duration_not_greater_than_or_equal_to: "keston on oltava suurempi tai yhtä suuri kuin %{min} (nykyinen kesto on %{duration} )"
|
||||
duration_not_between: "keston on oltava välillä %{min} ja %{max} (nykyinen kesto on %{duration} )"
|
||||
duration_not_equal_to: "keston on oltava yhtä suuri kuin %{exact} (nykyinen kesto on %{duration} )"
|
||||
limit_out_of_range:
|
||||
zero: "ei liitettyjä tiedostoja (tiedostojen on oltava %{min} ja %{max} välillä)"
|
||||
one: "vain yksi liitetty tiedosto (tiedostojen on oltava %{min} ja %{max} välillä)"
|
||||
other: "Tiedostojen yhteensä on oltava %{min} ja %{max} välillä (liitteenä on %{count} tiedostot)"
|
||||
limit_min_not_reached:
|
||||
zero: "ei liitettyjä tiedostoja (tiedostoissa on oltava vähintään %{min} )"
|
||||
one: "vain yksi tiedosto liitettynä (tiedostojen on oltava vähintään %{min} )"
|
||||
other: "%{count} tiedostot liitteenä (vähintään %{min} tiedostoja on oltava)"
|
||||
limit_max_exceeded:
|
||||
zero: "ei liitettyjä tiedostoja (enintään %{max} tiedostoja)"
|
||||
one: "liian monta tiedostoa liitettynä (suurin sallittu määrä on %{max} , sain tulokseksi %{count} )"
|
||||
other: "liian monta tiedostoa liitettynä (suurin sallittu määrä on %{max} , sain tulokseksi %{count} )"
|
||||
attachment_missing: "puuttuu sen liite"
|
||||
media_metadata_missing: "ei ole kelvollinen mediatiedosto"
|
||||
dimension_min_not_included_in: "on oltava suurempi tai yhtä suuri kuin %{width} x %{height} pikseliä"
|
||||
dimension_max_not_included_in: "on oltava pienempi tai yhtä suuri kuin %{width} x %{height} pikseliä"
|
||||
dimension_width_not_included_in: "Leveys ei sisälly %{min} ja %{max} pikselien väliin"
|
||||
dimension_height_not_included_in: "Korkeutta ei ole %{min} ja %{max} pikselien välillä."
|
||||
dimension_width_not_greater_than_or_equal_to: "leveyden on oltava suurempi tai yhtä suuri kuin %{length} pikseliä"
|
||||
dimension_height_not_greater_than_or_equal_to: "korkeuden on oltava suurempi tai yhtä suuri kuin %{length} pikseliä"
|
||||
dimension_width_not_less_than_or_equal_to: "leveyden on oltava pienempi tai yhtä suuri kuin %{length} pikseliä"
|
||||
dimension_height_not_less_than_or_equal_to: "korkeuden on oltava pienempi tai yhtä suuri kuin %{length} pikseliä"
|
||||
dimension_width_not_equal_to: "leveyden on oltava yhtä suuri kuin %{length} pikseliä"
|
||||
dimension_height_not_equal_to: "korkeuden on oltava yhtä suuri kuin %{length} pikselit"
|
||||
aspect_ratio_not_square: "on oltava neliön muotoinen (nykyinen tiedosto on %{width} x %{height} px)"
|
||||
aspect_ratio_not_portrait: "tiedoston on oltava pystysuuntainen (nykyinen tiedosto on %{width} x %{height} px)"
|
||||
aspect_ratio_not_landscape: "tiedoston on oltava vaakasuuntainen (nykyinen tiedosto on %{width} x %{height} px)"
|
||||
aspect_ratio_not_x_y: "tiedoston on oltava %{authorized_aspect_ratios} (nykyinen tiedosto on %{width} x %{height} px)"
|
||||
aspect_ratio_invalid: "kuvasuhde on virheellinen (kelvolliset kuvasuhteet ovat %{authorized_aspect_ratios} )"
|
||||
file_not_processable: "ei ole tunnistettu kelvolliseksi mediatiedostoksi"
|
||||
pages_not_less_than: "sivumäärän on oltava pienempi kuin %{max} (nykyinen sivumäärä on %{pages} )"
|
||||
pages_not_less_than_or_equal_to: "sivumäärän on oltava pienempi tai yhtä suuri kuin %{max} (nykyinen sivumäärä on %{pages} )"
|
||||
pages_not_greater_than: "sivumäärän on oltava suurempi kuin %{min} (nykyinen sivumäärä on %{pages} )"
|
||||
pages_not_greater_than_or_equal_to: "sivumäärän on oltava suurempi tai yhtä suuri kuin %{min} (nykyinen sivumäärä on %{pages} )"
|
||||
pages_not_between: "sivumäärän on oltava välillä %{min} ja %{max} (nykyinen sivumäärä on %{pages} )"
|
||||
pages_not_equal_to: "sivumäärän on oltava yhtä suuri kuin %{exact} (nykyinen sivumäärä on %{pages} )"
|
||||
not_found:
|
||||
title: "Etsimääsi sivua ei löytynyt (404)"
|
||||
message_html: "<b>Yritä uudelleen</b> <p>Tämä voi olla tilapäinen ongelma. Palaa edelliselle sivulle tai <a href='/'>etusivulle</a> ja yritä uudelleen.</p> <b>Ota yhteyttä tukeen</b> <p>Jos ongelma jatkuu tai on kiireellinen, kerro siitä meille. Löydä yhteystiedot globaalilta <a href='https://openfoodnetwork.org/ofn-local/' target='blank'>Open Food Network Local -sivulta</a>.</p> <p>Autat meitä paljon, jos annat mahdollisimman paljon yksityiskohtia puuttuvasta sivusta.</p>"
|
||||
@@ -185,6 +246,9 @@ fi:
|
||||
disconnect_failure: "Stripe-tilin irrottaminen epäonnistui."
|
||||
success_code:
|
||||
disconnected: "Stripe-tili irrotettu."
|
||||
taler:
|
||||
order_status:
|
||||
claimed: "Maksupyyntö vanheni. Yritä uudelleen."
|
||||
activemodel:
|
||||
errors:
|
||||
messages:
|
||||
@@ -518,6 +582,7 @@ fi:
|
||||
errors:
|
||||
vine_api: "API-yhteydessä tapahtui virhe, yritä myöhemmin uudelleen."
|
||||
invalid_voucher: "Alennuskuponki ei ole kelvollinen"
|
||||
expired: "Kuponki on vanhentunut"
|
||||
not_found_voucher: "Anteeksi, emme löytäneet tätä alennuskuponkia, tarkista koodi."
|
||||
vine_voucher_redeemer_service:
|
||||
errors:
|
||||
@@ -932,6 +997,10 @@ fi:
|
||||
clone:
|
||||
success: Tuote kloonattiin onnistuneesti
|
||||
error: Tuotteen kloonaaminen epäonnistui
|
||||
tag_rules:
|
||||
rules_per_tag:
|
||||
one: "%{tag} llä on 1 sääntö"
|
||||
other: "%{tag} llä on %{count} säännöt."
|
||||
product_import:
|
||||
title: Tuontituotteet
|
||||
file_not_found: Tiedostoa ei löytynyt tai sitä ei voitu avata
|
||||
@@ -1326,6 +1395,9 @@ fi:
|
||||
add_new_button: '+ Lisää uusi oletussääntö'
|
||||
no_tags_yet: Tähän yritykseen ei vielä liity tägejä
|
||||
add_new_tag: '+ Lisää uusi tägi'
|
||||
show_hide_variants: 'Näytä tai Piilota variantit myymälästäni'
|
||||
show_hide_shipping: 'Näytä tai piilota toimitustavat kassalla'
|
||||
show_hide_payment: 'Näytä tai Piilota maksutavat kassalla'
|
||||
show_hide_order_cycles: 'Näytä tai piilota tilausjaksot verkkokaupassani'
|
||||
users:
|
||||
legend: "Käyttäjät"
|
||||
@@ -1479,6 +1551,10 @@ fi:
|
||||
invite_manager:
|
||||
user_already_exists: "Käyttäjä on jo olemassa"
|
||||
error: "Jotain meni pieleen"
|
||||
tag_rules:
|
||||
not_supported_type: tägi -sääntötyyppiä ei tueta
|
||||
confirm_delete: Haluatko varmasti poistaa tämän säännön?
|
||||
destroy_error: tägi -säännön poistamisessa oli ongelma.
|
||||
order_cycles:
|
||||
loading_flash:
|
||||
loading_order_cycles: LADATAAN TILAUSJAKSOJA
|
||||
@@ -1702,6 +1778,8 @@ fi:
|
||||
not_visible: "%{enterprise} ei ole näkyvissä, joten sitä ei löydy kartalta tai hauista"
|
||||
reports:
|
||||
none: ei yhtään
|
||||
metadata:
|
||||
report_title: Ilmianna otsikko
|
||||
deprecated: "Tämä raportti on vanhentunut ja se poistetaan tulevasta julkaisusta."
|
||||
hidden_field: "< Piilotettu >"
|
||||
unitsize: YKSIKKÖKOKO
|
||||
@@ -1804,6 +1882,7 @@ fi:
|
||||
display: Näyttö
|
||||
summary_row: Yhteenvetorivi
|
||||
header_row: Otsikkorivi
|
||||
metadata_rows: Metadata-rivit
|
||||
raw_data: Raakadata
|
||||
formatted_data: Muotoiltu data
|
||||
packing:
|
||||
@@ -2379,8 +2458,15 @@ fi:
|
||||
email_confirmed: "Kiitos sähköpostiosoitteesi vahvistamisesta."
|
||||
email_confirmation_activate_account: "Ennen kuin voimme aktivoida uuden tilisi, meidän on vahvistettava sähköpostiosoitteesi."
|
||||
email_confirmation_greeting: "Hei, %{contact} !"
|
||||
email_confirmation_profile_created: >
|
||||
Profiili käyttäjälle %{name} on luotu onnistuneesti! Profiilisi aktivoimiseksi
|
||||
meidän on vahvistettava tämä sähköpostiosoite.
|
||||
email_confirmation_click_link: "Vahvista sähköpostiosoitteesi ja jatka profiilisi luomista napsauttamalla alla olevaa linkkiä."
|
||||
email_confirmation_link_label: "Vahvista tämä sähköpostiosoite »"
|
||||
email_confirmation_help_html: >
|
||||
Kun olet vahvistanut sähköpostiosoitteesi, voit käyttää ylläpitäjän tiliäsi
|
||||
tässä yrityksessä. Katso %{link} saadaksesi about %{sitename} :n ominaisuuksista
|
||||
ja aloittaaksesi profiilisi tai verkkokauppasi käytön.
|
||||
email_confirmation_notice_unexpected: "Sait tämän viestin, koska rekisteröidyit palvelussa %{sitename} tai joku luultavasti tuntemasi henkilö kutsui sinut rekisteröitymään. Jos et ymmärrä, miksi saat tämän sähköpostin, kirjoita osoitteeseen %{contact} ."
|
||||
email_social: "Ota yhteyttä:"
|
||||
email_contact: "Lähetä meille sähköpostia:"
|
||||
@@ -3276,6 +3362,8 @@ fi:
|
||||
payment_processing_failed: "Payment could not be processed, please check the details you entered"
|
||||
payment_method_not_supported: "Maksutapaa ei tueta. Valitse toinen."
|
||||
payment_updated: "Maksu päivitetty"
|
||||
payment_method_taler:
|
||||
order_summary: "Open Food Network tilaus"
|
||||
cannot_perform_operation: "Maksua ei voitu päivittää"
|
||||
action_required: "Toimenpide vaaditaan"
|
||||
tag_rules: "Tägisäännöt"
|
||||
@@ -3321,6 +3409,7 @@ fi:
|
||||
order_cycles_no_permission_to_coordinate_error: "Yhdelläkään yritykselläsi ei ole lupaa koordinoida tilauskiertoa."
|
||||
order_cycles_no_permission_to_create_error: "Sinulla ei ole oikeutta luoda kyseisen yrityksen koordinoimaa tilausjaksoa."
|
||||
order_cycle_closed: "Valitsemasi tilausjakso on juuri päättynyt. Yritä uudelleen!"
|
||||
order_cycle_closed_next_steps: "Valitsemasi tilausjakso on juuri sulkeutunut. Ota meihin yhteyttä täydentääksesi tilaustasi# %{order_number} !"
|
||||
back_to_orders_list: "Takaisin tilauslistaan"
|
||||
no_orders_found: "Ei tilaukset löytynyt"
|
||||
order_information: "Tilaustiedot"
|
||||
@@ -3888,6 +3977,8 @@ fi:
|
||||
destroy:
|
||||
success: Webhook-päätepiste poistettu onnistuneesti
|
||||
error: Webhook-päätepisteen poistaminen epäonnistui
|
||||
test:
|
||||
success: Joitakin testitietoja lähetetään webhookin URL-osoitteeseen
|
||||
spree:
|
||||
order_updated: "Tilaus päivitetty"
|
||||
cannot_perform_operation: "Tätä toimintoa ei voida suorittaa"
|
||||
@@ -3994,6 +4085,7 @@ fi:
|
||||
logourl: "Logourl"
|
||||
are_you_sure_delete: "Haluatko varmasti poistaa tämän tietueen?"
|
||||
confirm_delete: "Vahvista poisto"
|
||||
tag_rule: "tägi Rule"
|
||||
voucher: "Alennuskuponki"
|
||||
configurations: "Asetukset"
|
||||
general_settings: "Yleiset asetukset"
|
||||
@@ -4085,6 +4177,8 @@ fi:
|
||||
alt_text: "Vaihtoehtoinen teksti"
|
||||
thumbnail: "Pienoiskuva"
|
||||
back_to_images_list: "Takaisin kuvaluetteloon"
|
||||
backend_url: "Taustapalvelun URL-osoite"
|
||||
api_key: "API-avain"
|
||||
email: Sähköposti
|
||||
account_updated: "Tili päivitetty!"
|
||||
email_updated: "Tili päivitetään, kun uusi sähköpostiosoite on vahvistettu."
|
||||
@@ -4403,6 +4497,7 @@ fi:
|
||||
check: "Käteinen/sähköinen maksu/jne. (maksut, joille ei vaadita automaattista vahvistusta)"
|
||||
paypalexpress: "PayPal Express"
|
||||
stripesca: "Stripe SCA"
|
||||
taler: "Taleri"
|
||||
payments:
|
||||
source_forms:
|
||||
stripe:
|
||||
@@ -4579,8 +4674,8 @@ fi:
|
||||
or_enter_new_card: "Tai anna uuden kortin tiedot:"
|
||||
remember_this_card: Muistatko tämän kortin?
|
||||
date_picker:
|
||||
flatpickr_date_format: "d.m.Y"
|
||||
flatpickr_datetime_format: "d.m.Y H:i"
|
||||
flatpickr_date_format: "Vuosi"
|
||||
flatpickr_datetime_format: "Vuosi H:i"
|
||||
today: "Tänään"
|
||||
now: "Nyt"
|
||||
close: "Sulje"
|
||||
@@ -4852,13 +4947,31 @@ fi:
|
||||
tag_rule_form:
|
||||
tag_rules:
|
||||
shipping_method_tagged_top: "Toimitustavat merkitty tägillä"
|
||||
shipping_method_tagged_bottom: "ovat:"
|
||||
payment_method_tagged_top: "Maksutavat merkitty tägillä"
|
||||
payment_method_tagged_bottom: "ovat:"
|
||||
order_cycle_tagged_top: "Tilausjaksot merkitty tägillä"
|
||||
order_cycle_tagged_bottom: "ovat:"
|
||||
inventory_tagged_top: "Tägätyt varastomuunnelmat"
|
||||
inventory_tagged_bottom: "ovat:"
|
||||
variant_tagged_top: "Variantit -tunnisteella"
|
||||
variant_tagged_bottom: "ovat:"
|
||||
visible: NÄKYVÄ
|
||||
not_visible: EI NÄKYVÄ
|
||||
tag_rule_group_form:
|
||||
for_customers_tagged: 'Asiakkaille, jotka on tägätty:'
|
||||
add_new_rule: '+ Lisää uusi sääntö'
|
||||
no_rules_yet: Tähän tägiin ei vielä sovelleta sääntöjä
|
||||
add_tag_rule_modal:
|
||||
select_rule_type: "Valitse säännön tyyppi:"
|
||||
add_rule: "lisää sääntö"
|
||||
webhook_endpoint_form:
|
||||
url:
|
||||
create_placeholder: Anna etäwebhook-päätepisteen URL-osoite
|
||||
event_types:
|
||||
order_cycle_opened: Tilausjakso avattu
|
||||
payment_status_changed: Lähetä webhook maksun tilan muutoksesta
|
||||
test_endpoint: Testaa webhookin päätepiste
|
||||
invisible_captcha:
|
||||
sentence_for_humans: "Jätä tyhjäksi"
|
||||
timestamp_error_message: "Yritä uudelleen 5 sekunnin kuluttua."
|
||||
|
||||
@@ -2945,7 +2945,7 @@ fr:
|
||||
shipping_method_destroy_error: "Cette méthode de livraison ne peut pas être supprimée car elle est référencée dans une commande : %{number}."
|
||||
fees: "Frais"
|
||||
fee_name: "Nom de la marge/commission"
|
||||
fee_owner: "Propriétaire des droits"
|
||||
fee_owner: "Propriétaire de la marge/commission"
|
||||
item_cost: "Coût du produit"
|
||||
bulk: "Vrac"
|
||||
shop_variant_quantity_min: "min"
|
||||
|
||||
@@ -115,6 +115,69 @@ fr_CA:
|
||||
blank: "Champ obligatoire"
|
||||
too_short: "est trop court (minimum %{count} caractère)"
|
||||
errors:
|
||||
messages:
|
||||
content_type_invalid:
|
||||
one: "a un contenu invalide (le type de contenu autorisé est %{authorized_human_content_types})"
|
||||
many: "a un contenu invalide (les types de contenus autorisés sont %{authorized_human_content_types})"
|
||||
other: "a un contenu invalide (les types de contenus autorisés sont %{authorized_human_content_types})"
|
||||
content_type_spoofed:
|
||||
one: "a un type de contenu qui n'est pas équivalent avec celui détecté (le type de contenu autorisé est %{authorized_human_content_types})"
|
||||
many: "a un type de contenu qui n'est pas équivalent avec celui détecté (les types de contenus autorisés sont %{authorized_human_content_types})"
|
||||
other: "a un type de contenu qui n'est pas équivalent avec celui détecté (les types de contenus autorisés sont %{authorized_human_content_types})"
|
||||
file_size_not_less_than: "la taille du fichier doit être inférieure à %{max} (la taille actuelle est %{file_size})"
|
||||
file_size_not_less_than_or_equal_to: "la taille du fichier doit être inférieure ou égale à %{max} (la taille actuelle est %{file_size})"
|
||||
file_size_not_greater_than: "la taille du fichier doit être supérieure à %{min} (la taille actuelle est%{file_size})"
|
||||
file_size_not_greater_than_or_equal_to: "la taille du fichier doit être supérieure ou égale à %{min} (la taille actuelle est %{file_size})"
|
||||
file_size_not_between: "la taille du fichier doit être comprise entre%{min} et %{max} (la taille actuelle est %{file_size})"
|
||||
file_size_not_equal_to: "la taille du fichier doit être égale à %{exact} (la taille actuelle est %{file_size})"
|
||||
total_file_size_not_less_than: "La taille totale du fichier doit être inférieure à %{max} (la taille actuelle est%{total_file_size})"
|
||||
total_file_size_not_less_than_or_equal_to: "La taille totale du fichier doit être inférieure ou égale à %{max} (la taille actuelle est %{total_file_size})"
|
||||
total_file_size_not_greater_than: "La taille totale du fichier doit être supérieure à %{min} (la taille actuelle est%{total_file_size})"
|
||||
total_file_size_not_greater_than_or_equal_to: "La taille totale du fichier doit être supérieure ou égale à %{min} (la taille actuelle est %{total_file_size})"
|
||||
total_file_size_not_between: "La taille totale du fichier doit être comprise entre %{min} et %{max} (la taille actuelle est %{total_file_size})"
|
||||
total_file_size_not_equal_to: "La taille totale du fichier doit être égale à %{exact} (la taille actuelle est%{total_file_size})"
|
||||
duration_not_less_than: "La durée doit être inférieure à %{max} (la durée actuelle est %{duration})"
|
||||
duration_not_less_than_or_equal_to: "La durée doit être inférieure ou égale à %{max} (la durée actuelle est%{duration})"
|
||||
duration_not_greater_than: "La durée doit être supérieure à %{min} (la durée actuelle est %{duration})"
|
||||
duration_not_greater_than_or_equal_to: "La durée doit être supérieure ou égale à %{min} (la durée actuelle est%{duration})"
|
||||
duration_not_between: "La durée doit être comprise entre %{min} et %{max} (la durée actuelle est %{duration})"
|
||||
duration_not_equal_to: "La durée doit être égale à %{exact} (la durée actuelle est %{duration})"
|
||||
limit_out_of_range:
|
||||
zero: "Aucun fichier joint (doit contenir entre %{min} et %{max} fichiers)"
|
||||
one: "Seulement 1 fichier joint (doit contenir entre%{min} et %{max} fichiers)"
|
||||
other: "Le nombre total de fichiers doit être compris entre %{min} et %{max} fichiers (il y a %{count} fichiers joints)"
|
||||
limit_min_not_reached:
|
||||
zero: "Aucun fichier joint (doit contenir au moins %{min} fichiers)"
|
||||
one: "Seulement 1 fichier joint (doit contenir au moins %{min} fichiers)"
|
||||
other: "%{count} Aucun fichier joint (doit contenir au moins %{min} fichiers)"
|
||||
limit_max_exceeded:
|
||||
zero: "Aucun fichier joint (au maximum %{max} fichiers)"
|
||||
one: "Trop de fichiers joints (le maximum est %{max} fichiers, il y en a %{count})"
|
||||
other: "Trop de fichiers joints (le maximum est %{max} fichiers, il y en a%{count})"
|
||||
attachment_missing: "une pièce jointe est manquante"
|
||||
media_metadata_missing: "n'est pas un fichier multimédia valide"
|
||||
dimension_min_not_included_in: "doit être plus grand ou égal à %{width} x %{height} pixels"
|
||||
dimension_max_not_included_in: "doit être plus petit ou égal à %{width} x %{height} pixels"
|
||||
dimension_width_not_included_in: "la largeur n'est pas comprise entre %{min} et %{max} pixels"
|
||||
dimension_height_not_included_in: "la hauteur n'est pas comprise entre %{min} et %{max} pixels"
|
||||
dimension_width_not_greater_than_or_equal_to: "la largeur doit être supérieure ou égale à %{length} pixels"
|
||||
dimension_height_not_greater_than_or_equal_to: "la hauteur doit être supérieure ou égale à %{length} pixels"
|
||||
dimension_width_not_less_than_or_equal_to: "la largeur doit être inférieure ou égale à %{length} pixels"
|
||||
dimension_height_not_less_than_or_equal_to: "la hauteur doit être inférieure ou égale à %{length} pixels"
|
||||
dimension_width_not_equal_to: "la largeur doit être égale à %{length} pixels"
|
||||
dimension_height_not_equal_to: "La hauteur doit être égale à %{length} pixels"
|
||||
aspect_ratio_not_square: "doit être carré (le fichier actuel est %{width}x%{height}px)"
|
||||
aspect_ratio_not_portrait: "doit être au format portrait (le fichier actuel mesure %{width}x%{height}px)"
|
||||
aspect_ratio_not_landscape: "doit être au format paysage (le fichier actuel mesure %{width}x%{height}px)"
|
||||
aspect_ratio_not_x_y: "doit être %{authorized_aspect_ratios} (le fichier actuel est %{width}x%{height}px)"
|
||||
aspect_ratio_invalid: "possède un ratio d'image invalide (les ratios d'image valides sont %{authorized_aspect_ratios})"
|
||||
file_not_processable: "n'est pas identifié comme un fichier multimédia valide"
|
||||
pages_not_less_than: "La durée doit être inférieure à %{max} (la durée actuelle est %{pages})"
|
||||
pages_not_less_than_or_equal_to: "La durée doit être inférieure ou égale à %{max} (la durée actuelle est %{pages})"
|
||||
pages_not_greater_than: "La durée doit être supérieure à %{min}(la durée actuelle est %{pages})"
|
||||
pages_not_greater_than_or_equal_to: "La durée doit être supérieure ou égale à %{min} (la durée actuelle %{pages})"
|
||||
pages_not_between: "La durée doit être comprise entre %{min} et %{max} (la durée actuelle est %{pages})"
|
||||
pages_not_equal_to: "La durée doit être égale à %{exact} (la durée actuelle est %{pages})"
|
||||
not_found:
|
||||
title: "La page que vous recherchez n'existe pas (erreur 404)"
|
||||
message_html: "<b>Veuillez essayer à nouveau </b> <p> Il s'agit peut-être d'un problème temporaire. Veuillez cliquer sur le bouton retour de votre navigateur ou retourner à l'<a href='/'> Accueil </a> et recommencez. <b> Contacter notre support </b> <p> Si le problème persiste ou si c'est urgent, veuillez nous contacter. </p>"
|
||||
@@ -185,6 +248,9 @@ fr_CA:
|
||||
disconnect_failure: "Déconnecter Stripe a échoué."
|
||||
success_code:
|
||||
disconnected: "Le compte Stripe est déconnecté."
|
||||
taler:
|
||||
order_status:
|
||||
claimed: "La demande de paiement a expiré. Merci d'essayer à nouveau."
|
||||
activemodel:
|
||||
errors:
|
||||
messages:
|
||||
@@ -520,6 +586,7 @@ fr_CA:
|
||||
errors:
|
||||
vine_api: "There was an error communicating with the API, please try again later."
|
||||
invalid_voucher: "The voucher is not valid"
|
||||
expired: "Le bon de réduction a expiré."
|
||||
not_found_voucher: "Désolé, nous n'avons pas trouvé ce bon de réduction. Merci de vérifier le code qui vous a été transmis."
|
||||
vine_voucher_redeemer_service:
|
||||
errors:
|
||||
@@ -3305,6 +3372,8 @@ fr_CA:
|
||||
payment_processing_failed: "Le paiement n'a pas pu être traité, veuillez vérifier les informations saisies"
|
||||
payment_method_not_supported: "Cette méthode de paiement n'est pas maintenue. Veuillez en sélectionner une autre."
|
||||
payment_updated: "Paiement mis à jour"
|
||||
payment_method_taler:
|
||||
order_summary: "Commande Open Food Network"
|
||||
cannot_perform_operation: "Le paiement n'a pas pu être mis à jour."
|
||||
action_required: "Une action est requise"
|
||||
tag_rules: "Règles de tag"
|
||||
@@ -3965,6 +4034,8 @@ fr_CA:
|
||||
destroy:
|
||||
success: Le webhook a bien été supprimé.
|
||||
error: Le webhook n'a pas pu être supprimé.
|
||||
test:
|
||||
success: Des données test vont être envoyées à l'URL du webhook
|
||||
spree:
|
||||
order_updated: "La commande a été mise à jour"
|
||||
cannot_perform_operation: "Cette opération ne peut pas être réalisée"
|
||||
@@ -4071,6 +4142,7 @@ fr_CA:
|
||||
logourl: "URL du logo"
|
||||
are_you_sure_delete: "Etes-vous certain de vouloir supprimer cet élément ?"
|
||||
confirm_delete: "Confirmer la suppression"
|
||||
tag_rule: "Règle de tag"
|
||||
voucher: "Bon de réduction"
|
||||
configurations: "Configurations"
|
||||
general_settings: "Configurations générales"
|
||||
@@ -4162,6 +4234,7 @@ fr_CA:
|
||||
alt_text: "Texte alternatif"
|
||||
thumbnail: "Miniature"
|
||||
back_to_images_list: "Retour à la liste des images"
|
||||
backend_url: "URL du backend"
|
||||
api_key: "Clé API"
|
||||
email: Email
|
||||
account_updated: "Compte mis à jour!"
|
||||
@@ -4481,6 +4554,7 @@ fr_CA:
|
||||
check: "Espèces / chèques / virements / autres "
|
||||
paypalexpress: "PayPal Express"
|
||||
stripesca: "Stripe SCA"
|
||||
taler: "Taler"
|
||||
payments:
|
||||
source_forms:
|
||||
stripe:
|
||||
@@ -4967,6 +5041,8 @@ fr_CA:
|
||||
create_placeholder: Entrez l'URL du point de terminaison du webhook
|
||||
event_types:
|
||||
order_cycle_opened: Cycle de vente ouvert
|
||||
payment_status_changed: Poster webhook sur le changement du statut de paiement
|
||||
test_endpoint: Tester le point de terminaison du webhook
|
||||
invisible_captcha:
|
||||
sentence_for_humans: "Merci de laisser ce champ libre"
|
||||
timestamp_error_message: "S'il vous plaît réessayez après 5 secondes."
|
||||
|
||||
@@ -36,7 +36,7 @@ RSpec.describe "CatalogItems", swagger_doc: "dfc.yaml" do
|
||||
|
||||
get "List CatalogItems" do
|
||||
produces "application/json"
|
||||
security [oidc_token: []]
|
||||
security [{ oidc_token: [] }]
|
||||
|
||||
response "404", "not found" do
|
||||
context "as platform user" do
|
||||
|
||||
@@ -35,7 +35,7 @@ RSpec.describe "ProductGroups", swagger_doc: "dfc.yaml" do
|
||||
|
||||
get "Show ProductGroup" do
|
||||
produces "application/json"
|
||||
security [oidc_token: []]
|
||||
security [{ oidc_token: [] }]
|
||||
|
||||
response "200", "success" do
|
||||
let(:id) { product.id }
|
||||
|
||||
@@ -15,7 +15,7 @@ module Reporting
|
||||
@orders ||= search_orders
|
||||
end
|
||||
|
||||
def list(line_item_includes = [variant: [:supplier, :product]])
|
||||
def list(line_item_includes = [{ variant: [:supplier, :product] }])
|
||||
line_items = order_permissions.visible_line_items.in_orders(orders.result)
|
||||
.order(
|
||||
"supplier.name",
|
||||
|
||||
@@ -10,10 +10,10 @@ module Reporting
|
||||
.complete.not_state(:canceled)
|
||||
.order(:id))
|
||||
.group_by do |order|
|
||||
{
|
||||
customer_id: order.customer_id || order.email,
|
||||
hub_id: order.distributor_id,
|
||||
}
|
||||
{
|
||||
customer_id: order.customer_id || order.email,
|
||||
hub_id: order.distributor_id,
|
||||
}
|
||||
end.values
|
||||
end
|
||||
|
||||
|
||||
@@ -44,11 +44,11 @@ module Reporting
|
||||
.filter(&method(:filter_enterprise_fee_by_id))
|
||||
.filter(&method(:filter_enterprise_fee_by_owner))
|
||||
.map do |enterprise_fee_id, enterprise_fee_adjustment_ids|
|
||||
{
|
||||
enterprise_fee_id:,
|
||||
enterprise_fee_adjustment_ids:,
|
||||
order:
|
||||
}
|
||||
{
|
||||
enterprise_fee_id:,
|
||||
enterprise_fee_adjustment_ids:,
|
||||
order:
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -86,11 +86,11 @@ RSpec.describe Spree::Order do
|
||||
|
||||
(Spree::Shipment.state_machine.states.keys - [:pending, :backorder, :ready])
|
||||
.each do |shipment_state|
|
||||
it "should be false if shipment_state is #{shipment_state}" do
|
||||
allow(order).to receive_messages completed?: true
|
||||
order.shipment_state = shipment_state
|
||||
expect(order.can_cancel?).to be_falsy
|
||||
end
|
||||
it "should be false if shipment_state is #{shipment_state}" do
|
||||
allow(order).to receive_messages completed?: true
|
||||
order.shipment_state = shipment_state
|
||||
expect(order.can_cancel?).to be_falsy
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ RSpec.describe Spree::User do
|
||||
bill_address_attributes: new_bill_address.dup.attributes.merge(
|
||||
'id' => old_bill_address.id
|
||||
)
|
||||
.except!('created_at', 'updated_at')
|
||||
.except!('created_at', 'updated_at')
|
||||
)
|
||||
|
||||
expect(user.bill_address.id).to eq old_bill_address.id
|
||||
|
||||
@@ -10,7 +10,7 @@ RSpec.describe OutstandingBalanceQuery do
|
||||
let(:normalized_sql_statement) { normalize(query.statement) }
|
||||
|
||||
it 'returns the CASE statement necessary to compute the order balance' do
|
||||
expect(normalized_sql_statement).to eq(normalize(<<-SQL.squish))
|
||||
expect(normalized_sql_statement).to eq(normalize(<<~SQL.squish))
|
||||
CASE WHEN "spree_orders"."state" IN ('canceled', 'returned') THEN "spree_orders"."payment_total"
|
||||
WHEN "spree_orders"."state" IS NOT NULL THEN "spree_orders"."payment_total" - "spree_orders"."total"
|
||||
ELSE 0 END
|
||||
|
||||
@@ -38,8 +38,8 @@ RSpec.shared_examples "attribute changes - tax total changes" do |boolean, type,
|
||||
create(:order_with_taxes, product_price: 110, tax_rate_amount: 0.1,
|
||||
included_in_price: included_boolean)
|
||||
.tap do |order|
|
||||
order.create_tax_charge!
|
||||
order.update_shipping_fees!
|
||||
order.create_tax_charge!
|
||||
order.update_shipping_fees!
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -144,7 +144,7 @@ module StripeStubs
|
||||
customer_id = options[:customer_id] || "cus_A123"
|
||||
{ status: 200,
|
||||
body: JSON.generate(id: customer_id,
|
||||
sources: { data: [id: customer_id] }) }
|
||||
sources: { data: [{ id: customer_id }] }) }
|
||||
end
|
||||
|
||||
def payment_successful_refund_mock
|
||||
|
||||
@@ -1044,10 +1044,10 @@ RSpec.describe '
|
||||
page.driver
|
||||
.dismiss_modal :confirm,
|
||||
text: "Unsaved changes exist and will be lost if you continue." do
|
||||
within "tr#li_#{li1.id}" do
|
||||
fill_in "quantity", with: (li1.quantity + 1)
|
||||
find("a.edit-order").click
|
||||
end
|
||||
within "tr#li_#{li1.id}" do
|
||||
fill_in "quantity", with: (li1.quantity + 1)
|
||||
find("a.edit-order").click
|
||||
end
|
||||
end
|
||||
|
||||
# So we save the changes
|
||||
|
||||
@@ -360,10 +360,10 @@ RSpec.describe "As a consumer, I want to checkout my order" do
|
||||
# And fake the payment status to avoid user interaction.
|
||||
allow_any_instance_of(Taler::Client)
|
||||
.to receive(:fetch_order) do
|
||||
payment = Spree::Payment.last
|
||||
url = payment_gateways_confirm_taler_path(payment_id: payment.id)
|
||||
payment = Spree::Payment.last
|
||||
url = payment_gateways_confirm_taler_path(payment_id: payment.id)
|
||||
|
||||
{ "order_status_url" => url, "order_status" => "paid" }
|
||||
{ "order_status_url" => url, "order_status" => "paid" }
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
12
yarn.lock
12
yarn.lock
@@ -4005,9 +4005,9 @@ hasown@^2.0.2:
|
||||
function-bind "^1.1.2"
|
||||
|
||||
hotkeys-js@*:
|
||||
version "3.13.15"
|
||||
resolved "https://registry.yarnpkg.com/hotkeys-js/-/hotkeys-js-3.13.15.tgz#2d394bd6bd78857d4b24dc86bdba2fa1cf7012fc"
|
||||
integrity sha512-gHh8a/cPTCpanraePpjRxyIlxDFrIhYqjuh01UHWEwDpglJKCnvLW8kqSx5gQtOuSsJogNZXLhOdbSExpgUiqg==
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/hotkeys-js/-/hotkeys-js-4.0.0.tgz#75336c0ac610ad384d286c61c519909dcd4bdf6b"
|
||||
integrity sha512-gIoeqMWYqPIItc4HaseVbtTRpEpBbeufZMUcoWtN62JZdDq3KadS1ijN6wpaDjTzRK7PjT3QOPUcx+yNT0rrZQ==
|
||||
|
||||
hpack.js@^2.1.6:
|
||||
version "2.1.6"
|
||||
@@ -7064,9 +7064,9 @@ toidentifier@1.0.1, toidentifier@~1.0.1:
|
||||
integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
|
||||
|
||||
tom-select@*:
|
||||
version "2.4.6"
|
||||
resolved "https://registry.yarnpkg.com/tom-select/-/tom-select-2.4.6.tgz#23acdfc09ee235eb752706d418c9c9ae6ccf67f0"
|
||||
integrity sha512-Hhqi15AiTl0+FjaHVTXvUkF3t7x4W5LXUHxLYlzp7r8bcIgGJyz9M+3ZvrHdTRvEmV4EmNyJPbHJJnZOjr5Iig==
|
||||
version "2.5.1"
|
||||
resolved "https://registry.yarnpkg.com/tom-select/-/tom-select-2.5.1.tgz#8c8d3f11e5c1780b5f26c9e90f4e650842ff9596"
|
||||
integrity sha512-63D5/Qf6bb6kLSgksEuas/60oawDcuUHrD90jZofeOpF6bkQFYriKrvtpJBQQ4xIA5dUGcjhBbk/yrlfOQsy3g==
|
||||
dependencies:
|
||||
"@orchidjs/sifter" "^1.1.0"
|
||||
"@orchidjs/unicode-variants" "^1.1.2"
|
||||
|
||||
Reference in New Issue
Block a user