From 76ab6d3b3433dabe2e129ef2d21b48dab3b2b077 Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 2 Jan 2024 14:11:56 +0100 Subject: [PATCH 01/17] (i18n) Added translation files for Swedish --- CHANGELOG.md | 3 + config/locales/app.admin.sv.yml | 2558 ++++++++++++++++++++++++++++++ config/locales/app.logged.sv.yml | 355 +++++ config/locales/app.public.sv.yml | 615 +++++++ config/locales/app.shared.sv.yml | 555 +++++++ config/locales/base.sv.yml | 5 + config/locales/devise.sv.yml | 63 + config/locales/mails.sv.yml | 490 ++++++ config/locales/sv.yml | 749 +++++++++ 9 files changed, 5393 insertions(+) create mode 100644 config/locales/app.admin.sv.yml create mode 100644 config/locales/app.logged.sv.yml create mode 100644 config/locales/app.public.sv.yml create mode 100644 config/locales/app.shared.sv.yml create mode 100644 config/locales/base.sv.yml create mode 100644 config/locales/devise.sv.yml create mode 100644 config/locales/mails.sv.yml create mode 100644 config/locales/sv.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index e1061a755..054aae94a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog Fab-manager +## Next release +- translation files added for Swedish + ## v6.3.8 2023 December 29 - Fix a bug: unable to build docker image diff --git a/config/locales/app.admin.sv.yml b/config/locales/app.admin.sv.yml new file mode 100644 index 000000000..367687fdd --- /dev/null +++ b/config/locales/app.admin.sv.yml @@ -0,0 +1,2558 @@ +sv: + app: + admin: + edit_destroy_buttons: + deleted: "Successfully deleted." + unable_to_delete: "Unable to delete: " + delete_item: "Delete the {TYPE}" + confirm_delete: "Delete" + delete_confirmation: "Are you sure you want to delete this {TYPE}?" + machines: + the_fablab_s_machines: "The FabLab's machines" + all_machines: "All machines" + add_a_machine: "Add a new machine" + manage_machines_categories: "Manage machines categories" + machines_settings: "Settings" + machines_settings: + title: "Settings" + generic_text_block: "Editorial text block" + generic_text_block_info: "Displays an editorial block above the list of machines visible to members." + generic_text_block_switch: "Display editorial block" + cta_switch: "Display a button" + cta_label: "Button label" + cta_url: "url" + save: "Save" + successfully_saved: "Your banner was successfully saved." + machine_categories_list: + machine_categories: "Machines categories" + add_a_machine_category: "Add a machine category" + name: "Name" + machines_number: "Number of machines" + machine_category: "Machine category" + machine_category_modal: + new_machine_category: "New category" + edit_machine_category: "Edit category" + successfully_created: "The new machine category has been successfully created." + unable_to_create: "Unable to delete the machine category: " + successfully_updated: "The machine category has been successfully updated." + unable_to_update: "Unable to modify the machine category: " + machine_category_form: + name: "Name of category" + assigning_machines: "Assign machines to this category" + save: "Save" + machine_form: + ACTION_title: "{ACTION, select, create{New} other{Update the}} machine" + watch_out_when_creating_a_new_machine_its_prices_are_initialized_at_0_for_all_subscriptions: "Watch out! When creating a new machine, its prices are initialized at 0 for all subscriptions." + consider_changing_them_before_creating_any_reservation_slot: "Consider changing them before creating any reservation slot." + description: "Description" + name: "Name" + illustration: "Visual" + illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image." + technical_specifications: "Technical specifications" + category: "Category" + attachments: "Attachments" + attached_files_pdf: "Attached files (pdf)" + add_an_attachment: "Add an attachment" + settings: "Settings" + disable_machine: "Disable machine" + disabled_help: "When disabled, the machine won't be reservable and won't appear by default in the machines list." + reservable: "Can this machine be reserved?" + reservable_help: "When disabled, the machine will be shown in the default list of machines, but without the reservation button. If you already have created some availability slots for this machine, you may want to remove them: do it from the admin agenda." + save: "Save" + create_success: "The machine was created successfully" + update_success: "The machine was updated successfully" + training_form: + ACTION_title: "{ACTION, select, create{New} other{Update the}} training" + beware_when_creating_a_training_its_reservation_prices_are_initialized_to_zero: "Beware, when creating a training, its reservation prices are initialized at zero." + dont_forget_to_change_them_before_creating_slots_for_this_training: "Don't forget to change them before creating slots for this training." + description: "Description" + name: "Name" + illustration: "Visual" + illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image." + add_a_new_training: "Add a new training" + validate_your_training: "Validate your training" + settings: "Settings" + associated_machines: "Associated machines" + associated_machines_help: "If you associate a machine to this training, the members will need to successfully pass this training before being able to reserve the machine." + default_seats: "Default number of seats" + public_page: "Show in training lists" + public_help: "When unchecked, this option will prevent the training from appearing in the trainings list." + disable_training: "Disable the training" + disabled_help: "When disabled, the training won't be reservable and won't appear by default in the trainings list." + automatic_cancellation: "Automatic cancellation" + automatic_cancellation_info: "If you edit specific conditions here, the general cancellation conditions will no longer be taken into account. You will be notified if a session is cancelled. Credit notes and refunds will be automatic if the wallet is enabled. Otherwise you will have to do it manually." + automatic_cancellation_switch: "Activate automatic cancellation for this training" + automatic_cancellation_threshold: "Minimum number of registrations to maintain a session" + automatic_cancellation_deadline: "Deadline, in hours, before automatic cancellation" + authorization_validity: "Authorisations validity period" + authorization_validity_info: "You can define a specific validity period in months for this training. The general conditions will no longer be taken into account." + authorization_validity_switch: "Activate an authorization validity period" + authorization_validity_period: "Validity period in months" + validation_rule: "Authorisations cancellation rule" + validation_rule_info: "Define a rule that cancel an authorisation if the machines associated with the training are not reserved for a specific period of time. This rule prevails over the authorisations validity period." + validation_rule_switch: "Activate the validation rule" + validation_rule_period: "Time limit in months" + save: "Save" + create_success: "The training was created successfully" + update_success: "The training was updated successfully" + space_form: + ACTION_title: "{ACTION, select, create{New} other{Update the}} space" + watch_out_when_creating_a_new_space_its_prices_are_initialized_at_0_for_all_subscriptions: "Watch out! When creating a new space, its prices are initialized at 0 for all subscriptions." + consider_changing_its_prices_before_creating_any_reservation_slot: "Consider changing its prices before creating any reservation slot." + name: "Name" + illustration: "Visual" + illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image." + description: "Description" + characteristics: "Characteristics" + attachments: "Attachments" + attached_files_pdf: "Attached files (pdf)" + add_an_attachment: "Add an attachment" + settings: "Settings" + default_seats: "Default number of seats" + disable_space: "Disable the space" + disabled_help: "When disabled, the space won't be reservable and won't appear by default in the spaces list." + save: "Save" + create_success: "The space was created successfully" + update_success: "The space was updated successfully" + associated_machines: "Included machines" + children_spaces: "Included spaces" + associated_objects: "Associated objects" + associated_objects_warning: "Only use these fields if you want interblocking reservation between spaces, child spaces and machines. If you want machine and space reservations to remain independent, please leave the following fields blank." + event_form: + ACTION_title: "{ACTION, select, create{New} other{Update the}} event" + title: "Title" + illustration: "Visual" + illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image." + description: "Description" + attachments: "Attachments" + attached_files_pdf: "Attached files (pdf)" + add_a_new_file: "Add a new file" + event_category: "Event category" + dates_and_opening_hours: "Dates and opening hours" + all_day: "All day" + all_day_help: "Will the event last all day or do you want to set times?" + start_date: "Start date" + end_date: "End date" + start_time: "Start time" + end_time: "End time" + recurrence: "Recurrence" + _and_ends_on: "and ends on" + prices_and_availabilities: "Prices and availabilities" + standard_rate: "Standard rate" + 0_equal_free: "0 = free" + fare_class: "Fare class" + price: "Price" + seats_available: "Seats available" + seats_help: "If you leave this field empty, this event will be available without reservations." + event_themes: "Event themes" + age_range: "Age range" + add_price: "Add a price" + save: "Save" + create_success: "The event was created successfully" + events_updated: "{COUNT, plural, =1{One event was} other{{COUNT} Events were}} successfully updated" + events_not_updated: "{TOTAL, plural, =1{The event was} other{On {TOTAL} events {COUNT, plural, =1{one was} other{{COUNT} were}}}} not updated." + error_deleting_reserved_price: "Unable to remove the requested price because it is associated with some existing reservations" + other_error: "An unexpected error occurred while updating the event" + recurring: + none: "None" + every_days: "Every days" + every_week: "Every week" + every_month: "Every month" + every_year: "Every year" + event_type: "Event type" + event_types: + standard: "Event standard" + nominative: "Event nominative" + family: "Event reserved for members" + pre_registration: "Pre-registration" + pre_registration_help: "If this option is checked, administrators and managers must validate registrations before they become final." + pre_registration_end_date: "Deadline for pre-registration" + plan_form: + ACTION_title: "{ACTION, select, create{New} other{Update the}} plan" + tab_settings: "Settings" + tab_usage_limits: "Usage limits" + description: "Description" + general_settings: "General settings" + general_settings_info: "Determine to which group this subscription is dedicated. Also set its price and duration in periods." + activation_and_payment: "Subscription activation and payment" + name: "Name" + name_max_length: "Name length must be less than 24 characters." + group: "Group" + transversal: "Transversal plan" + transversal_help: "If this option is checked, a copy of this plan will be created for each currently enabled groups." + display: "Display" + category: "Category" + category_help: "Categories allow you to group the subscription plans, on the public view of the subscriptions." + number_of_periods: "Number of periods" + period: "Period" + year: "Year" + month: "Month" + week: "Week" + subscription_price: "Subscription price" + edit_amount_info: "Please note that if you change the price of this plan, the new price will only apply to new subscribers. Current subscriptions will stay unchanged, even those with a running payment schedule." + visual_prominence: "Visual prominence of the subscription" + visual_prominence_help: "On the subscriptions page, the most prominent subscriptions will be placed at the top of the list. An elevated number means a higher prominence." + rolling_subscription: "Rolling subscription?" + rolling_subscription_help: "A rolling subscription will begin the day of the first trainings. Otherwise, it will begin as soon as it is bought." + monthly_payment: "Monthly payment?" + monthly_payment_help: "If monthly payment is enabled, the members will be able to choose between a one-time payment or a payment schedule staged each months." + information_sheet: "Information sheet" + notified_partner: "Notified partner" + new_user: "New user" + alert_partner_notification: "As part of a partner subscription, some notifications may be sent to this user." + disabled: "Disable subscription" + disabled_help: "Beware: disabling this plan won't unsubscribe users having active subscriptions with it." + duration: "Duration" + partnership: "Partnership" + partner_plan: "Partner plan" + partner_plan_help: "You can sell subscriptions in partnership with another organization. By doing so, the other organization will be notified when a member subscribes to this subscription plan." + partner_created: "The partner was successfully created" + slots_visibility: "Slots visibility" + slots_visibility_help: "You can determine how far in advance subscribers can view and reserve machine slots. When this setting is set, it takes precedence over the general settings." + machines_visibility: "Visibility time limit, in hours (machines)" + visibility_minimum: "Visibility cannot be less than 7 hours" + save: "Save" + create_success: "Plan(s) successfully created. Don't forget to redefine prices." + update_success: "The plan was updated successfully" + plan_limit_form: + usage_limitation: "Limitation of use" + usage_limitation_info: "Define a maximum number of reservation hours per day and per machine category. Machine categories that have no parameters configured will not be subject to any limitation." + usage_limitation_switch: "Restrict machine reservations to a number of hours per day." + new_usage_limitation: "Add a limitation of use" + all_limitations: "All limitations" + by_category: "By machines category" + by_machine: "By machine" + category: "Machines category" + machine: "Machine name" + max_hours_per_day: "Max. hours/day" + ongoing_limitations: "Ongoing limitations" + saved_limitations: "Saved limitations" + cancel: "Cancel this limitation" + cancel_deletion: "Cancel" + ongoing_deletion: "Ongoing deletion" + plan_limit_modal: + title: "Manage limitation of use" + limit_reservations: "Limit reservations" + by_category: "By machines category" + by_machine: "By machine" + category: "Machines category" + machine: "Machine name" + categories_info: "If you select all machine categories, the limits will apply across the board." + machine_info: "Please note that if you have already created a limitation for the machines category including the selected machine, it will be permanently overwritten." + max_hours_per_day: "Maximum number of reservation hours per day" + confirm: "Confirm" + partner_modal: + title: "Create a new partner" + create_partner: "Create the partner" + first_name: "First name" + surname: "Last name" + email: "Email address" + field_is_required: "This field is required" + plan_pricing_form: + prices: "Prices" + about_prices: "The prices defined here will apply to members subscribing to this plan, for machines and spaces. All prices are per hour." + copy_prices_from: "Copy prices from" + copy_prices_from_help: "This will replace all the prices of this plan with the prices of the selected plan" + machines: "Machines" + spaces: "Spaces" + update_recurrent_modal: + title: "Periodic event update" + edit_recurring_event: "You're about to update a periodic event. What do you want to update?" + edit_this_event: "Only this event" + edit_this_and_next: "This event and the followings" + edit_all: "All events" + date_wont_change: "Warning: you have changed the event date. This modification won't be propagated to other occurrences of the periodic event." + confirm: "Update the {MODE, select, single{event} other{events}}" + advanced_accounting_form: + title: "Advanced accounting parameters" + code: "Accounting code" + analytical_section: "Analytical section" + accounting_codes_settings: + code: "Accounting code" + label: "Account label" + journal_code: "Journal code" + sales_journal: "Sales journal" + financial: "Financial" + card: "Card payments" + wallet_debit: "Virtual wallet payments" + other: "Other payment means" + wallet_credit: "Virtual wallet credit" + VAT: "VAT" + sales: "Sales" + subscriptions: "Subscriptions" + machine: "Machine reservation" + training: "Training reservation" + event: "Event reservation" + space: "Space reservation" + prepaid_pack: "Pack of prepaid-hours" + product: "Product of the store" + error: "Erroneous invoices" + error_help: "As part of a maintenance operation, it may exceptionally happen that invoices, that have been generated by mistake due to a bug in the software, are discovered. As these invoices cannot be deleted, they will be exported to the account defined here. Please manually cancel these invoices." + advanced_accounting: "Advanced accounting" + enable_advanced: "Enable the advanced accounting" + enable_advanced_help: "This will enable the ability to have custom accounting codes per resources (machines, spaces, training ...). These codes can be modified on each resource edition form." + save: "Save" + update_success: "The accounting settings were successfully updated" + #add a new machine + machines_new: + declare_a_new_machine: "Declare a new machine" + #machine edition + machines_edit: + machine_edit: "Edit a machine" + #manage the trainings & machines slots + calendar: + calendar_management: "Calendar management" + trainings: "Trainings" + machines: "Machines" + spaces: "Spaces" + events: "Events" + availabilities: "Availabilities" + availabilities_notice: "Export to an Excel workbook every slots available for reservation, and their occupancy rate." + select_a_slot: "Please select a slot" + info: "Info" + tags: "Tags" + slot_duration: "Slot duration: {DURATION} minutes" + ongoing_reservations: "Ongoing reservations" + without_reservation: "Without reservation" + confirmation_required: "Confirmation required" + do_you_really_want_to_cancel_the_USER_s_reservation_the_DATE_at_TIME_concerning_RESERVATION: "Do you really want to cancel {USER}'s reservation, the {DATE} at {TIME}, concerning {RESERVATION}?" + reservation_was_successfully_cancelled: "Reservation was successfully cancelled." + reservation_cancellation_failed: "Reservation cancellation failed." + unable_to_remove_the_last_machine_of_the_slot_delete_the_slot_rather: "Unable to remove the last machine of the slot. Delete the slot rather." + do_you_really_want_to_remove_MACHINE_from_this_slot: "Do you really want to remove \"{MACHINE}\" from this slot?" + this_will_prevent_any_new_reservation_on_this_slot_but_wont_cancel_those_existing: "This will prevent any new reservation on this slot but won't cancel those existing." + beware_this_cannot_be_reverted: "Beware: this cannot be reverted." + the_machine_was_successfully_removed_from_the_slot: "The machine was successfully removed from the slot." + deletion_failed: "Deletion failed." + do_you_really_want_to_remove_PLAN_from_this_slot: "Do you really want to remove \"{PLAN}\" from this slot?" + the_plan_was_successfully_removed_from_the_slot: "The plan was successfully removed from the slot." + DATE_slot: "{DATE} slot:" + what_kind_of_slot_do_you_want_to_create: "What kind of slot do you want to create?" + training: "Training" + machine: "Machine" + space: "Space" + next: "Next >" + previous: "< Previous" + select_some_machines: "Select some machines" + select_all: "All" + select_none: "None" + manage_machines: "Click here to add or remove machines." + manage_spaces: "Click here to add or remove spaces." + manage_trainings: "Click here to add or remove trainings." + number_of_tickets: "Number of tickets: " + adjust_the_opening_hours: "Adjust the opening hours" + to_time: "to" #e.g. from 18:00 to 21:00 + restrict_options: "Restriction options" + restrict_with_labels: "Restrict this slot with labels" + restrict_for_subscriptions: "Restrict this slot for subscription users" + select_some_plans: "Select some plans" + plans: "Plan(s):" + recurrence: "Recurrence" + enabled: "Enabled" + period: "Period" + week: "Week" + month: "Month" + number_of_periods: "Number of periods" + end_date: "End date" + summary: "Summary" + select_period: "Please select a period for the recurrence" + select_nb_period: "Please select a number of periods for the recurrence" + select_end_date: "Please select the date of the last occurrence" + about_to_create: "You are about to create the following {TYPE, select, machines{machine} training{training} space{space} other{other}} {NUMBER, plural, one{slot} other{slots}}:" + divided_in_slots: "{COUNT, plural, =1{This slot} other{These slots}} will be open for booking in {DURATION}-minutes increments." + reservable: "Reservable(s):" + labels: "Label(s):" + none: "None" + slot_successfully_deleted: "The slot {START} - {END} has been successfully deleted" + slots_deleted: "The slot of {START}, and {COUNT, plural, =1{one other} other{{COUNT} others}}, have been deleted" + unable_to_delete_the_slot: "Unable to delete the slot {START} - {END}, probably because it's already reserved by a member" + slots_not_deleted: "On {TOTAL} slots, {COUNT, plural, =1{one was not deleted} other{{COUNT} were not deleted}}. Some reservations may exist on {COUNT, plural, =1{it} other{them}}." + you_should_select_at_least_a_machine: "You should select at least one machine on this slot." + inconsistent_times: "Error: the end of the availability is before its beginning." + min_one_slot: "The availability must be split in one slot at least." + min_slot_duration: "You must specify a valid duration for the slots." + export_is_running_you_ll_be_notified_when_its_ready: "Export is running. You'll be notified when it's ready." + actions: "Actions" + block_reservations: "Block reservations" + do_you_really_want_to_block_this_slot: "Do you really want to block new reservations on this slot? It will become invisible to users." + locking_success: "Slot successfully locked, it won't appear any longer in the user calendar" + locking_failed: "An error occurred. Slot locking has failed" + allow_reservations: "Allow reservations" + do_you_really_want_to_allow_reservations: "Do you really want to allow booking again on this slot? It will become visible for the users." + unlocking_success: "Slot successfully unlocked, it will appear again in the user calendar" + unlocking_failed: "An error occurred. Slot unlocking has failed" + reservations_locked: "Booking is blocked" + unlockable_because_reservations: "Unable to block booking on this slot because some uncancelled reservations exist on it." + delete_slot: "Delete this slot" + do_you_really_want_to_delete_this_slot: "Do you really want to delete this slot?" + delete_recurring_slot: "You're about to delete a recurring slot. What do you want to do?" + delete_this_slot: "Only this slot" + delete_this_and_next: "This slot and the following" + delete_all: "All slots" + event_in_the_past: "Create a slot in the past" + confirm_create_event_in_the_past: "You are about to create a slot in the past. Are you sure you want to do this? Members will not be able to book this slot." + edit_event: "Edit the event" + view_reservations: "View reservations" + legend: "Legend" + and: "and" + external_sync: "Calendar synchronization" + divide_this_availability: "Divide this availability in" + slots: "slots" + slots_of: "of" + minutes: "minutes" + deleted_user: "Deleted user" + select_type: "Please select a type to continue" + no_modules_available: "No reservable module available. Please enable at least one module (machines, spaces or trainings) in the Customization section." + #import external iCal calendar + icalendar: + icalendar_import: "iCalendar import" + intro: "Fab-manager allows to automatically import calendar events, at RFC 5545 iCalendar format, from external URL. These URL are synchronized every hours and the events are shown in the public calendar. You can trigger a synchronisation too, by clicking on the corresponding button, in front of each import." + new_import: "New ICS import" + color: "Colour" + text_color: "Text colour" + url: "URL" + name: "Name" + example: "Example" + display: "Display" + hide_text: "Hide the text" + hidden: "Hidden" + shown: "Shown" + create_error: "Unable to create iCalendar import. Please try again later" + delete_failed: "Unable to delete the iCalendar import. Please try again later" + refresh: "Updating..." + sync_failed: "Unable to synchronize the URL. Please try again later" + confirmation_required: "Confirmation required" + confirm_delete_import: "Do you really want to delete this iCalendar import?" + delete_success: "iCalendar import successfully deleted" + #management of the projects' components & settings + projects: + name: "Name" + projects_settings: "Projects settings" + materials: "Materials" + add_a_material: "Add a material" + themes: "Themes" + add_a_new_theme: "Add a new theme" + project_categories: "Categories" + add_a_new_project_category: "Add a new category" + licences: "Licences" + statuses: "Statuses" + description: "Description" + add_a_new_licence: "Add a new licence" + manage_abuses: "Manage the reports" + settings: + title: "Settings" + comments: "Comments" + disqus: "Disqus" + disqus_info: "If you want to enable your members and visitors to comment on projects, you can enable the Disqus forums by setting the following parameter. Visit the Disqus website for more information." + shortname: "Shortname" + cad_files: "CAD files" + validation: "Validation" + validation_info: "Users can upload CAD (Computer Aided Design) files with the documentation of their projects. You can specify which files types are allowed. Use the test input below to determine the MIME type of a file." + extensions: "Allowed extensions" + new_extension: "New extension" + new_ext_info_html: "

Specify a new file extension to allow these files to be uploaded.

Please consider that allowing file archives (eg. ZIP) or binary executable (eg. EXE) may result in a dangerous security issue and must be avoided in any cases.

" + mime_types: "Allowed MIME types" + new_mime_type: "New MIME type" + new_type_info_html: "

Specify a new MIME type to allow these files to be uploaded.

Please use the test input to determine the MIME type of a file. Please consider that allowing file archives (eg. application/zip) or binary executable (eg. application/exe) may result in a dangerous security issue and must be avoided in any cases.

" + test_file: "Test a file" + set_a_file: "Select a file" + file_is_TYPE: "MIME type of this file is {TYPE}" + projects_sharing: "Projects sharing" + open_lab_projects: "OpenLab Projects" + open_lab_info_html: "Enable OpenLab to share your projects with other Fab Labs and display a gallery of shared projects. Please send an email to contact@fab-manager.com to get your access credentials for free." + open_lab_app_id: "ID" + open_lab_app_secret: "Secret" + openlab_default_info_html: "In the projects gallery, visitors can switch between two views: all shared projects from the whole OpenLab network, or only the projects documented in your Fab Lab.
Here, you can choose which view is shown by default." + default_to_openlab: "Display OpenLab by default" + filters: Projects list filters + project_categories: Categories + project_categories: + name: "Name" + delete_dialog_title: "Confirmation required" + delete_dialog_info: "The associations between this category and the projects will me deleted." + projects_setting: + add: "Add" + actions_controls: "Actions" + name: "Name" + projects_setting_option: + edit: "Edit" + delete_option: "Delete Option" + projects_setting_option_form: + name: "Name" + description: "Description" + name_cannot_be_blank: "Name cannot be blank." + save: "Save" + cancel: "Cancel" + status_settings: + option_create_success: "Status was successfully created." + option_delete_success: "Status was successfully deleted." + option_update_success: "Status was successfully updated." + #track and monitor the trainings + trainings: + trainings_monitoring: "Trainings monitoring" + all_trainings: "All trainings" + add_a_new_training: "Add a new training" + name: "Training name" + associated_machines: "Associated machines" + cancellation: "Cancellation (attendees | deadline)" + cancellation_minimum: "{ATTENDEES} minimum" + cancellation_deadline: "{DEADLINE} h" + capacity: "Capacity (max. attendees)" + authorisation: "Time-limited authorisation" + period_MONTH: "{MONTH} {MONTH, plural, one{month} other{months}}" + active_true: "Yes" + active_false: "No" + validation_rule: "Lapsed without reservation" + select_a_training: "Select a training" + training: "Training" + date: "Date" + year_NUMBER: "Year {NUMBER}" + month_of_NAME: "Month of {NAME}" + NUMBER_reservation: "{NUMBER} {NUMBER, plural, one{reservation} other{reservations}}" + none: "None" + training_validation: "Training validation" + training_of_the_DATE_TIME_html: "Training of the {DATE} - {TIME}" + you_can_validate_the_training_of_the_following_members: "You can validate the training of the following members:" + deleted_user: "Deleted user" + no_reservation: "No reservation" + validate_the_trainings: "Validate the trainings" + edition_of_the_description_tooltip: "Edition of the description tooltip" + describe_the_training_in_a_few_words: "Describe the training in a few words." + description_is_limited_to_255_characters: "Description is limited to 255 characters." + description_was_successfully_saved: "Description was successfully saved." + training_successfully_deleted: "Training successfully deleted." + unable_to_delete_the_training_because_some_users_already_booked_it: "Unable to delete the training because some users already booked it." + confirmation_required: "Confirmation required" + do_you_really_want_to_delete_this_training: "Do you really want to delete this training?" + filter_status: "Filter:" + status_enabled: "Enabled" + status_disabled: "Disabled" + status_all: "All" + trainings_settings: "Settings" + #create a new training + trainings_new: + add_a_new_training: "Add a new training" + trainings_settings: + title: "Settings" + automatic_cancellation: "Trainings automatic cancellation" + automatic_cancellation_info: "Minimum number of participants required to maintain a session. You will be notified if a session is cancelled. Credit notes and refunds will be automatic if the wallet is enabled. Otherwise you will have to do it manually." + automatic_cancellation_switch: "Activate automatic cancellation for all the trainings" + automatic_cancellation_threshold: "Minimum number of registrations to maintain a session" + must_be_positive: "You must specify a number above or equal to 0" + automatic_cancellation_deadline: "Deadline, in hours, before automatic cancellation" + must_be_above_zero: "You must specify a number above or equal to 1" + authorization_validity: "Authorisations validity period" + authorization_validity_info: "Define a validity period for all training authorisations. After this period, the authorisation will lapse" + authorization_validity_switch: "Activate an authorization validity period" + authorization_validity_period: "Validity period in months" + validation_rule: "Authorisations cancellation rule" + validation_rule_info: "Define a rule that cancel an authorisation if the machines associated with the training are not reserved for a specific period of time. This rule prevails over the authorisations validity period." + validation_rule_switch: "Activate the validation rule" + validation_rule_period: "Time limit in months" + generic_text_block: "Editorial text block" + generic_text_block_info: "Displays an editorial block above the list of trainings visible to members." + generic_text_block_switch: "Display editorial block" + cta_switch: "Display a button" + cta_label: "Button label" + cta_url: "url" + save: "Save" + update_success: "The trainings settings were successfully updated" + #events tracking and management + events: + settings: "Settings" + events_monitoring: "Events monitoring" + manage_filters: "Manage filters" + fablab_events: "Fablab events" + add_an_event: "Add an event" + all_events: "All events" + passed_events: "Passed events" + events_to_come: "Events to come" + events_to_come_asc: "Events to come | chronological order" + on_DATE: "on {DATE}" + from_DATE: "from {DATE}" + from_TIME: "from {TIME}" + to_date: "to" #e.g.: from 01/01 to 01/05 + to_time: "to" #e.g. from 18:00 to 21:00 + title: "Title" + dates: "Dates" + booking: "Booking" + sold_out: "Sold out" + cancelled: "Cancelled" + without_reservation: "Without reservation" + free_admission: "Free admission" + view_reservations: "View reservations" + load_the_next_events: "Load the next events..." + categories: "Categories" + add_a_category: "Add a category" + name: "Name" + themes: "Theme" + add_a_theme: "Add a theme" + age_ranges: "Age ranges" + add_a_range: "Add a range" + do_you_really_want_to_delete_this_ELEMENT: "Do you really want to delete this {ELEMENT, select, category{category} theme{theme} age_range{age range} other{element}}?" + unable_to_delete_ELEMENT_already_in_use_NUMBER_times: "Unable to delete this {ELEMENT, select, category{category} theme{theme} age_range{age range} other{element}} because it is already associated with {NUMBER, plural, =0{no events} one{one event} other{{NUMBER} events}}." + at_least_one_category_is_required: "At least one category is required." + unable_to_delete_the_last_one: "Unable to delete the last one." + unable_to_delete_an_error_occured: "Unable to delete: an error occurred." + manage_prices_categories: "Manage prices' categories" + prices_categories: "Prices' categories" + add_a_price_category: "Add a price's category" + usages_count: "Usages count" + price_category: "Price category" + category_name: "Category's name" + category_name_is_required: "Category's name is required." + enter_here_the_conditions_under_which_this_price_is_applicable: "Enter here the conditions under which this price is applicable" + conditions_are_required: "Conditions are required." + price_category_successfully_created: "Price category successfully created." + unable_to_add_the_price_category_check_name_already_used: "Unable to add the price category, check that the name is not already used." + unexpected_error_occurred_please_refresh: "An unexpected error occurred, please refresh the page." + price_category_successfully_updated: "Price category successfully updated." + unable_to_update_the_price_category: "Unable to update the price category." + unable_to_delete_this_price_category_because_it_is_already_used: "Unable to delete this price category because it is already used." + do_you_really_want_to_delete_this_price_category: "Do you really want to delete this price category?" + price_category_successfully_deleted: "Price category successfully deleted." + price_category_deletion_failed: "Price category deletion failed." + types: "Types" + event_type: + standard: "Standard" + family: "Reserved for members" + nominative: "Nominative" + pre_registration: "Pre-registration" + NUMBER_pre_registered: " {NUMBER} pre-registered" + #add a new event + events_new: + add_an_event: "Add an event" + none: "None" + every_days: "Every days" + every_week: "Every week" + every_month: "Every month" + every_year: "Every year" + #edit an existing event + events_edit: + edit_the_event: "Edit the event" + confirmation_required: "Confirmation required" + edit_recurring_event: "You're about to update a periodic event. What do you want to update?" + edit_this_event: "Only this event" + edit_this_and_next: "This event and the following" + edit_all: "All events" + date_wont_change: "Warning: you have changed the event date. This modification won't be propagated to other occurrences of the periodic event." + event_successfully_updated: "Event successfully updated." + events_updated: "The event, and {COUNT, plural, =1{one other} other{{COUNT} others}}, have been updated" + unable_to_update_the_event: "Unable to update the event" + events_not_updated: "On {TOTAL} events, {COUNT, plural, =1{one was not updated} other{{COUNT} were not deleted}}." + error_deleting_reserved_price: "Unable to delete the requested price because it is associated with some reservations" + other_error: "An unexpected error occurred while updating the event" + #event reservations list + event_reservations: + the_reservations: "Reservations:" + user: "User" + payment_date: "Payment date" + full_price_: "Full price:" + reserved_tickets: "Reserved tickets" + show_the_event: "Show the event" + no_reservations_for_now: "No reservation for now." + back_to_monitoring: "Back to monitoring" + canceled: "Canceled" + date: "Date" + booked_by: "Booked by" + reservations: "Reservations" + status: "Status" + gestion: "Gestion" + validation: "Validation" + event_status: + pre_registered: "Pre-registered" + to_pay: "To pay" + paid: "Paid" + canceled: "Canceled" + present: "Present" + registered: "Registered" + not_validated: "Not validated" + affirmative: "yes" + negative: "no" + validate: "Validate" + pay: "Pay" + validate_the_reservation: "Validate the reservation" + do_you_really_want_to_validate_this_reservation_this_apply_to_all_booked_tickets: "Do you really want to validate this reservation? This apply to ALL booked tickets." + reservation_was_successfully_validated: "Reservation was successfully validated." + validation_failed: "Validation failed." + reservation_was_successfully_invalidated: "Reservation was successfully invalidated." + invalidation_failed: "Invalidation failed." + confirm_payment: "Confirm payment" + confirm_payment_of_html: "{ROLE, select, admin{Cash} other{Pay}}: {AMOUNT}" #(contexte : validate a payment of $20,00) + offer_this_reservation: "I offer this reservation" + i_have_received_the_payment: "I have received the payment" + reservation_was_successfully_paid: "Reservation was successfully paid." + present: "Present" + confirm_present: "Confirm presence" + confirm_present_info: "Confirm the presence of the user for this event" + reservation_was_successfully_present: "The presence of the user was successfully confirmed." + age: "{NUMBER} years old" + events_settings: + title: "Settings" + generic_text_block: "Editorial text block" + generic_text_block_info: "Displays an editorial block above the list of events visible to members." + generic_text_block_switch: "Display editorial block" + cta_switch: "Display a button" + cta_label: "Button label" + cta_url: "url" + save: "Save" + update_success: "The events settings were successfully updated" + #subscriptions, prices, credits and coupons management + pricing: + pricing_management: "Pricing management" + subscriptions: "Subscriptions" + trainings: "Trainings" + list_of_the_subscription_plans: "List of the subscription plans" + disabled_plans_info_html: "

Warning: the subscriptions are disabled on this application.

You can still create some, but they won't be available until the activation of the plans module, from the « Customization » section.

" + add_a_new_subscription_plan: "Add a new subscription plan" + name: "Name" + duration: "Duration" + group: "Group" + category: "Category" + prominence: "Prominence" + price: "Price" + machine_hours: "Machine slots" + prices_calculated_on_hourly_rate_html: "All the prices will be automatically calculated based on the hourly rate defined here.
For example, if you define an hourly rate at {RATE}: a slot of {DURATION} minutes, will be charged {PRICE}." + you_can_override: "You can override this duration for each availability you create in the agenda. The price will then be adjusted accordingly." + machines: "Machines" + credits: "Credits" + subscription: "Subscription" + related_trainings: "Related trainings" + add_a_machine_credit: "Add a machine credit" + machine: "Machine" + hours: "Slots (default {DURATION} minutes)" + related_subscriptions: "Related subscriptions" + please_specify_a_number: "Please specify a number." + none: "None" #grammar concordance with training. + an_error_occurred_while_saving_the_number_of_credits: "An error occurred while saving the number of credits." + an_error_occurred_while_deleting_credit_with_the_TRAINING: "An error occurred while deleting credit with the {TRAINING}." + an_error_occurred_unable_to_find_the_credit_to_revoke: "An error occurred: unable to find the credit to revoke." + an_error_occurred_while_creating_credit_with_the_TRAINING: "An error occurred while creating credit with the {TRAINING}." + not_set: "Not set" + error_a_credit_linking_this_machine_with_that_subscription_already_exists: "Error: a credit linking this machine with that subscription already exists." + changes_have_been_successfully_saved: "Changes have been successfully saved." + credit_was_successfully_saved: "Credit was successfully saved." + error_creating_credit: "Unable to create credit, an error occurred" + do_you_really_want_to_delete_this_subscription_plan: "Do you really want to delete this subscription plan?" + subscription_plan_was_successfully_deleted: "Subscription plan was successfully deleted." + unable_to_delete_the_specified_subscription_an_error_occurred: "Unable to delete the specified subscription, an error occurred." + coupons: "Coupons" + list_of_the_coupons: "List of the coupons" + discount: "Discount" + nb_of_usages: "Number of usages" + status: "Status" + add_a_new_coupon: "Add a new coupon" + display_more_coupons: "Display the next coupons" + disabled: "Disabled" + expired: "Expired" + sold_out: "Sold out" + active: "Active" + all: "Display all" + confirmation_required: "Confirmation required" + do_you_really_want_to_delete_this_coupon: "Do you really want to delete this coupon?" + coupon_was_successfully_deleted: "Coupon was successfully deleted." + unable_to_delete_the_specified_coupon_already_in_use: "Unable to delete the specified coupon: it is already used with some invoices and/or some payment schedules." + unable_to_delete_the_specified_coupon_an_unexpected_error_occurred: "Unable to delete the specified coupon: an unexpected error occurred." + send_a_coupon: "Send a coupon" + coupon: "Coupon" + usages: "Usages" + unlimited: "Unlimited" + coupon_successfully_sent_to_USER: "Coupon successfully sent to {USER}" + an_error_occurred_unable_to_send_the_coupon: "An unexpected error prevent from sending the coupon." + code: "Code" + enabled: "Enabled" + validity_per_user: "Validity per user" + once: "Just once" + forever: "Each use" + valid_until: "Valid until (included)" + spaces: "Spaces" + these_prices_match_space_hours_rates_html: "The prices below match one hour of space usage, without subscription." + add_a_space_credit: "Add a Space credit" + space: "Space" + error_a_credit_linking_this_space_with_that_subscription_already_exists: "Error: a credit linking this space with that subscription already exists." + status_enabled: "Enabled" + status_disabled: "Disabled" + status_all: "All" + spaces_pricing: + prices_match_space_hours_rates_html: "The prices below match one hour of space reservation, without subscription." + prices_calculated_on_hourly_rate_html: "All the prices will be automatically calculated based on the hourly rate defined here.
For example, if you define an hourly rate at {RATE}: a slot of {DURATION} minutes, will be charged {PRICE}." + you_can_override: "You can override this duration for each availability you create in the agenda. The price will then be adjusted accordingly." + extended_prices: "Moreover, you can define extended prices which will apply in priority over the hourly rate below. Extended prices allow you, for example, to set a favorable price for a booking of several hours." + spaces: "Spaces" + price_updated: "Price successfully updated" + machines_pricing: + prices_match_machine_hours_rates_html: "The prices below match one hour of machine usage, without subscription." + prices_calculated_on_hourly_rate_html: "All the prices will be automatically calculated based on the hourly rate defined here.
For example, if you define an hourly rate at {RATE}: a slot of {DURATION} minutes, will be charged {PRICE}." + you_can_override: "You can override this duration for each availability you create in the agenda. The price will then be adjusted accordingly." + machines: "Machines" + price_updated: "Price successfully updated" + configure_packs_button: + pack: "prepaid pack" + packs: "Prepaid packs" + no_packs: "No packs for now" + pack_DURATION: "{DURATION} hours" + delete_confirmation: "Are you sure you want to delete this prepaid pack? This won't be possible if the pack was already bought by users." + edit_pack: "Edit the pack" + confirm_changes: "Confirm changes" + pack_successfully_updated: "The prepaid pack was successfully updated." + configure_extended_prices_button: + extended_prices: "Extended prices" + no_extended_prices: "No extended price for now" + extended_price_DURATION: "{DURATION} hours" + extended_price_form: + duration: "Duration (hours)" + amount: "Price" + pack_form: + hours: "Hours" + amount: "Price" + disabled: "Disabled" + validity_count: "Maximum validity" + select_interval: "Interval..." + intervals: + day: "{COUNT, plural, one{Day} other{Days}}" + week: "{COUNT, plural, one{Week} other{Weeks}}" + month: "{COUNT, plural, one{Month} other{Months}}" + year: "{COUNT, plural, one{Year} other{Years}}" + create_pack: + new_pack: "New prepaid pack" + new_pack_info: "A prepaid pack allows users to buy {TYPE, select, Machine{machine} Space{space} other{}} hours before booking any slots. These packs can provide discounts on volumes purchases." + create_pack: "Create this pack" + pack_successfully_created: "The new prepaid pack was successfully created." + create_extended_price: + new_extended_price: "New extended price" + new_extended_price_info: "Extended prices allows you to define prices based on custom durations, instead of the default hourly rates." + create_extended_price: "Create extended price" + extended_price_successfully_created: "The new extended price was successfully created." + delete_extended_price: + extended_price_deleted: "The extended price was successfully deleted." + unable_to_delete: "Unable to delete the extended price: " + delete_extended_price: "Delete the extended price" + confirm_delete: "Delete" + delete_confirmation: "Are you sure you want to delete this extended price?" + edit_extended_price: + edit_extended_price: "Edit the extended price" + confirm_changes: "Confirm changes" + extended_price_successfully_updated: "The extended price was successfully updated." + plans_categories: + manage_plans_categories: "Manage plans' categories" + plan_categories_list: + categories_list: "List of the plan's categories" + no_categories: "No categories" + name: "Name" + description: "Description" + significance: "Significance" + manage_plan_category: + create: "New category" + update: "Edit the category" + plan_category_form: + name: "Name" + description: "Description" + significance: "Significance" + info: "Categories will be shown ordered by signifiance. The higher you set the significance, the first the category will be shown." + create: + title: "New category" + cta: "Create the category" + success: "The new category was successfully created" + error: "Unable to create the category: " + update: + title: "Edit the category" + cta: "Validate" + success: "The category was successfully updated" + error: "Unable to update the category: " + delete_plan_category: + title: "Delete a category" + confirm: "Are you sure you want to delete this category? If you do, the plans associated with this category won't be sorted anymore." + cta: "Delete" + success: "The category was successfully deleted" + error: "Unable to delete the category: " + #ajouter un code promotionnel + coupons_new: + add_a_coupon: "Add a coupon" + unable_to_create_the_coupon_check_code_already_used: "Unable to create the coupon. Please check that the code is not already used." + #mettre à jour un code promotionnel + coupons_edit: + coupon: "Coupon:" + unable_to_update_the_coupon_an_error_occurred: "Unable to update the coupon: an error occurred." + plans: + #add a subscription plan on the platform + new: + add_a_subscription_plan: "Add a subscription plan" + #edit a subscription plan / machine slots prices + edit: + subscription_plan: "Subscription plan:" + #list of all invoices & invoicing parameters + invoices: + invoices: "Invoices" + accounting_periods: "Accounting periods" + invoices_list: "Invoices list" + filter_invoices: "Filter invoices" + operator_: "Operator:" + invoice_num_: "Invoice #:" + customer_: "Customer:" + date_: "Date:" + invoice_num: "Invoice #" + date: "Date" + price: "Price" + customer: "Customer" + download_the_invoice: "Download the invoice" + download_the_credit_note: "Download the credit note" + credit_note: "Credit note" + display_more_invoices: "Display more invoices..." + no_invoices_for_now: "No invoices for now." + payment_schedules: "Payment schedules" + invoicing_settings: "Invoicing settings" + edit_setting_info_html: "Information

Hover over the invoice elements below, all items that light up in yellow are editable.

" + warning_invoices_disabled: "Warning: invoices are not enabled. No invoices will be generated by Fab-manager. Nevertheless, you must correctly fill the information below, especially VAT." + change_logo: "Change logo" + john_smith: "John Smith" + john_smith_at_example_com: "jean.smith@example.com" + invoice_reference_: "Invoice reference:" + code_: "Code:" + code_disabled: "Code disabled" + order_num: "Order #:" + invoice_issued_on_DATE_at_TIME: "Invoice issued on {DATE} at {TIME}" + object_reservation_of_john_smith_on_DATE_at_TIME: "Object: Reservation of John Smith on {DATE} at {TIME}" + order_summary: "Order summary:" + details: "Details" + amount: "Amount" + machine_booking-3D_printer: "Machine booking - 3D printer" + training_booking-3D_print: "Training booking - initiation to 3d printing" + total_amount: "Total amount" + total_including_all_taxes: "Total incl. all taxes" + VAT_disabled: "VAT disabled" + VAT_enabled: "VAT enabled" + including_VAT: "Including {NAME} {RATE}% of {AMOUNT}" + including_total_excluding_taxes: "Including Total excl. taxes" + including_amount_payed_on_ordering: "Including amount payed on ordering" + settlement_by_debit_card_on_DATE_at_TIME_for_an_amount_of_AMOUNT: "Settlement by debit card on {DATE} at {TIME}, for an amount of {AMOUNT}" + important_notes: "Important notes" + address_and_legal_information: "Address and legal information" + invoice_reference: "Invoice reference" + invoice_reference_is_required: "Invoice reference is required." + text: "text" + year: "Year" + month: "Month" + day: "Day" + num_of_invoice: "Num. of invoice" + online_sales: "Online sales" + wallet: "Wallet" + refund: "Refund" + payment_schedule: "Payment schedule" + model: "Model" + documentation: "Documentation" + 2_digits_year: "2 digits year (eg. 70)" + 4_digits_year: "4 digits year (eg. 1970)" + month_number: "Month number (eg. 1)" + 2_digits_month_number: "2 digits month number (eg. 01)" + 3_characters_month_name: "3 characters month name (eg. JAN)" + day_in_the_month: "Day in the month (eg. 1)" + 2_digits_day_in_the_month: "2 digits in the month (eg. 01)" + n_digits_daily_count_of_invoices: "(n) digits, daily count of invoices (eg. ddd => 002 : 2nd invoice of the day)" + n_digits_monthly_count_of_invoices: "(n) digits, monthly count of invoices (eg. mmmm => 0012 : 12th invoice of the month)" + n_digits_annual_amount_of_invoices: "(n) digits, annual count of invoices (ex. yyyyyy => 000008 : 8th invoice of this year)" + beware_if_the_number_exceed_the_specified_length_it_will_be_truncated_by_the_left: "Beware: if the number exceed the specified length, it will be truncated by the left." + n_digits_count_of_orders: "(n) digits, count of invoices (eg. nnnn => 0327 : 327th order)" + n_digits_daily_count_of_orders: "(n) digits, daily count of orders (eg. ddd => 002 : 2nd order of the day)" + n_digits_monthly_count_of_orders: "(n) digits, monthly count of orders (eg. mmmm => 0012 : 12th order of the month)" + n_digits_annual_amount_of_orders: "(n) digits, annual count of orders (ex. yyyyyy => 000008 : 8th order of this year)" + add_a_notice_regarding_the_online_sales_only_if_the_invoice_is_concerned: "Add a notice regarding the online sales, only if the invoice is concerned." + this_will_never_be_added_when_a_refund_notice_is_present: "This will never be added when a refund notice is present." + eg_XVL_will_add_VL_to_the_invoices_settled_by_card: '(eg. X[/VL] will add "/VL" to the invoices settled by online card)' + add_a_notice_regarding_refunds_only_if_the_invoice_is_concerned: "Add a notice regarding refunds, only if the invoice is concerned." + this_will_never_be_added_when_an_online_sales_notice_is_present: "This will never be added when an online sales notice is present." + eg_RA_will_add_A_to_the_refund_invoices: '(eg. R[/A] will add "/A" to the refund invoices)' + add_a_notice_regarding_payment_schedule: "Add a notice regarding the payment schedules, only for concerned documents." + this_will_never_be_added_with_other_notices: "This will never be added when any other notice is present." + eg_SE_to_schedules: '(eg. S[/E] will add "/E" to the payment schedules)' + code: "Code" + enable_the_code: "Enable the code" + enabled: "Enabled" + disabled: "Disabled" + order_number: "Order number" + elements: "Elements" + VAT: "VAT" + enable_VAT: "Enable VAT" + VAT_rate: "VAT rate" + VAT_history: "VAT rates history" + VAT_notice: "This parameter configures the general case of the VAT rate and applies to everything sold by the Fablab. It is possible to override this parameter by setting a specific VAT rate for each object." + edit_multi_VAT_button: "More options" + multiVAT: "Advanced VAT" + multi_VAT_notice: "Please note: The current general rate is {RATE}%. Here you can define different VAT rates for each category.

For example, you can override this value, only for machine reservations, by filling in the corresponding field below. If no value is filled in, the general rate will apply." + VAT_rate_machine: "Machine reservation" + VAT_rate_space: "Space reservation" + VAT_rate_training: "Training reservation" + VAT_rate_event: "Event reservation" + VAT_rate_subscription: "Subscription" + VAT_rate_product: "Products (store)" + changed_at: "Changed at" + changed_by: "By" + deleted_user: "Deleted user" + refund_invoice_successfully_created: "Refund invoice successfully created." + create_a_refund_on_this_invoice: "Create a refund on this invoice" + refund_mode: "Refund mode:" + do_you_want_to_disable_the_user_s_subscription: "Do you want to disabled the user's subscription:" + elements_to_refund: "Elements to refund" + description: "Description" + description_optional: "Description (optional):" + will_appear_on_the_refund_invoice: "Will appear on the refund invoice." + none: "None" #grammar concordance with payment mean + by_cash: "By cash" + by_cheque: "By cheque" + by_transfer: "By transfer" + by_wallet: "By wallet" + you_must_select_at_least_one_element_to_create_a_refund: "You must select at least one element, to create a refund." + unable_to_create_the_refund: "Unable to create the refund" + invoice_reference_successfully_saved: "Invoice reference successfully saved." + an_error_occurred_while_saving_invoice_reference: "An error occurred while saving invoice reference." + invoicing_code_succesfully_saved: "Invoicing code successfully saved." + an_error_occurred_while_saving_the_invoicing_code: "An error occurred while saving the invoicing code." + code_successfully_activated: "Code successfully activated." + code_successfully_disabled: "Code successfully disabled." + an_error_occurred_while_activating_the_invoicing_code: "An error occurred while activating the invoicing code." + order_number_successfully_saved: "Order number successfully saved." + an_error_occurred_while_saving_the_order_number: "An error occurred while saving the order number." + VAT_rate_successfully_saved: "VAT rate successfully saved." + an_error_occurred_while_saving_the_VAT_rate: "An error occurred while saving the VAT rate." + VAT_successfully_activated: "VAT successfully activated." + VAT_successfully_disabled: "VAT successfully disabled." + an_error_occurred_while_activating_the_VAT: "An error occurred while activating the VAT." + text_successfully_saved: "Text successfully saved." + an_error_occurred_while_saving_the_text: "An error occurred while saving the text." + address_and_legal_information_successfully_saved: "Address and legal information successfully saved." + an_error_occurred_while_saving_the_address_and_the_legal_information: "An error occurred while saving the address and the legal information." + logo_successfully_saved: "Logo successfully saved." + an_error_occurred_while_saving_the_logo: "An error occurred while saving the logo." + filename: "File name" + schedule_filename: "Schedule file name" + prefix_info: "The invoices will be generated as PDF files, named with the following prefix." + schedule_prefix_info: "The payment schedules will be generated as PDF files, named with the following prefix." + prefix: "Prefix" + prefix_successfully_saved: "File prefix successfully saved" + an_error_occurred_while_saving_the_prefix: "An error occurred while saving the file prefix" + online_payment: "Online payment" + close_accounting_period: "Close an accounting period" + close_from_date: "Close from" + start_date_is_required: "Start date is required" + close_until_date: "Close until" + end_date_is_required: "End date is required" + previous_closings: "Previous closings" + start_date: "From" + end_date: "To" + closed_at: "Closed at" + closed_by: "By" + period_total: "Period total" + perpetual_total: "Perpetual total" + integrity: "Integrity check" + confirmation_required: "Confirmation required" + confirm_close_START_END: "Do you really want to close the accounting period between {START} and {END}? Any subsequent changes will be impossible." + period_must_match_fiscal_year: "A closing must occur at the end of a minimum annual period, or per financial year when it is not calendar-based." + this_may_take_a_while: "This operation will take some time to complete." + period_START_END_closed_success: "The accounting period from {START} to {END} has been successfully closed. Archive generation is running, you'll be notified when it's done." + failed_to_close_period: "An error occurred, unable to close the accounting period" + no_periods: "No closings for now" + accounting_codes: "Accounting codes" + export_accounting_data: "Export accounting data" + export_what: "What do you want to export?" + export_VAT: "Export the collected VAT" + export_to_ACD: "Export all data to the accounting software ACD" + export_is_running: "Export is running. You'll be notified when it's ready." + export_form_date: "Export from" + export_to_date: "Export until" + format: "File format" + encoding: "Encoding" + separator: "Separator" + dateFormat: "Date format" + labelMaxLength: "Label (max)" + decimalSeparator: "Decimal separator" + exportInvoicesAtZero: "Export invoices equal to 0" + columns: "Columns" + exportColumns: + journal_code: "Journal code" + date: "Entry date" + account_code: "Account code" + account_label: "Account label" + piece: "Document" + line_label: "Entry label" + debit_origin: "Origin debit" + credit_origin: "Origin credit" + debit_euro: "Euro debit" + credit_euro: "Euro credit" + lettering: "Lettering" + start_date: "Start date" + end_date: "End date" + vat_rate: "VAT rate" + amount: "Total amount" + payzen_keys_form: + payzen_keys_info_html: "

To be able to collect online payments, you must configure the PayZen identifiers and keys.

Retrieve them from your merchant back office.

" + client_keys: "Client key" + payzen_public_key: "Client public key" + api_keys: "API keys" + payzen_username: "Username" + payzen_password: "Password" + payzen_endpoint: "REST API server name" + payzen_hmac: "HMAC-SHA-256 key" + stripe_keys_form: + stripe_keys_info_html: "

To be able to collect online payments, you must configure the Stripe API keys.

Retrieve them from your dashboard.

Updating these keys will trigger a synchronization of all users on Stripe, this may take some time. You'll receive a notification when it's done.

" + public_key: "Public key" + secret_key: "Secret key" + payment: + payment_settings: "Payment settings" + online_payment: "Online payment" + online_payment_info_html: "You can enable your members to book directly online, paying by card. Alternatively, you can restrict the booking and payment processes for administrators and managers." + enable_online_payment: "Enable online payment" + stripe_keys: "Stripe keys" + public_key: "Public key" + secret_key: "Secret key" + error_check_keys: "Error: please check your Stripe keys." + stripe_keys_saved: "Stripe keys successfully saved." + error_saving_stripe_keys: "Unable to save the Stripe keys. Please try again later." + api_keys: "API keys" + edit_keys: "Edit keys" + currency: "Currency" + currency_info_html: "Please specify below the currency used for online payment. You should provide a three-letter ISO code, from the list of Stripe supported currencies." + currency_alert_html: "Warning: the currency cannot be changed after the first online payment was made. Please define this setting carefully before opening Fab-manager to your members." + stripe_currency: "Stripe currency" + gateway_configuration_error: "An error occurred while configuring the payment gateway: " + payzen_settings: + payzen_keys: "PayZen keys" + edit_keys: "Edit keys" + payzen_public_key: "Client public key" + payzen_username: "Username" + payzen_password: "Password" + payzen_endpoint: "REST API server name" + payzen_hmac: "HMAC-SHA-256 key" + currency: "Currency" + payzen_currency: "PayZen currency" + currency_info_html: "Please specify below the currency used for online payment. You should provide a three-letter ISO code, from the list of PayZen supported currencies." + save: "Save" + currency_error: "The inputted value is not a valid currency" + error_while_saving: "An error occurred while saving the currency: " + currency_updated: "The PayZen currency was successfully updated to {CURRENCY}." + #select a payment gateway + select_gateway_modal: + select_gateway_title: "Select a payment gateway" + gateway_info: "To securely collect and process payments online, Fab-manager needs to use an third-party service authorized by the financial institutions, called a payment gateway." + select_gateway: "Please select an available gateway" + stripe: "Stripe" + payzen: "PayZen" + confirm_button: "Validate the gateway" + payment_schedules_list: + filter_schedules: "Filter schedules" + no_payment_schedules: "No payment schedules to display" + load_more: "Load more" + card_updated_success: "The user's card was successfully updated" + document_filters: + reference: "Reference" + customer: "Customer" + date: "Date" + update_payment_mean_modal: + title: "Update the payment mean" + update_info: "Please specify below the new payment mean for this payment schedule to continue." + select_payment_mean: "Select a new payment mean" + method_Transfer: "By bank transfer" + method_Check: "By check" + confirm_button: "Update" + #management of users, labels, groups, and so on + members: + users_management: "Users management" + import: "Import members from a CSV file" + users: "Users" + members: "Members" + subscriptions: "Subscriptions" + search_for_an_user: "Search for an user" + add_a_new_member: "Add a new member" + reservations: "Reservations" + username: "Username" + surname: "Last name" + first_name: "First name" + email: "Email" + phone: "Phone" + user_type: "User type" + subscription: "Subscription" + display_more_users: "Display more users..." + administrators: "Administrators" + search_for_an_administrator: "Search for an administrator" + add_a_new_administrator: "Add a new administrator" + managers: "Managers" + managers_info: "A manager is a restricted administrator that cannot modify the settings of the application. However, he will be able to take reservations for any members and for all managers, including himself, and to process payments and refunds." + search_for_a_manager: "Search for a manager" + add_a_new_manager: "Add a new manager" + delete_this_manager: "Do you really want to delete this manager? This cannot be undone." + manager_successfully_deleted: "Manager successfully deleted." + unable_to_delete_the_manager: "Unable to delete the manager." + partners: "Partners" + partners_info: "A partner is a special user that can be associated with the «Partner» plans. These users won't be able to connect and will just receive notifications about subscriptions to their associated plan." + search_for_a_partner: "Search for a partner" + add_a_new_partner: "Add a new partner" + delete_this_partner: "Do you really want to delete this partner? This cannot be undone." + partner_successfully_deleted: "Partner successfully deleted." + unable_to_delete_the_partner: "Unable to delete the partner." + associated_plan: "Associated plan" + groups: "Groups" + tags: "Tags" + authentication: "Authentication" + confirmation_required: "Confirmation required" + confirm_delete_member: "Do you really want to delete this member? This cannot be undone." + member_successfully_deleted: "Member successfully deleted." + unable_to_delete_the_member: "Unable to delete the member." + do_you_really_want_to_delete_this_administrator_this_cannot_be_undone: "Do you really want to delete this administrator? This cannot be undone." + this_may_take_a_while_please_wait: "Warning: this may take a while, please be patient." + administrator_successfully_deleted: "Administrator successfully deleted." + unable_to_delete_the_administrator: "Unable to delete the administrator." + changes_successfully_saved: "Changes successfully saved." + an_error_occurred_while_saving_changes: "An error occurred when saving changes." + export_is_running_you_ll_be_notified_when_its_ready: "Export is running. You'll be notified when it's ready." + tag_form: + tags: "Tags" + add_a_tag: "Add a tag" + tag_name: "Tag name" + new_tag_successfully_saved: "New tag successfully saved." + an_error_occurred_while_saving_the_new_tag: "An error occurred while saving the new tag." + confirmation_required: "Delete this tag?" + confirm_delete_tag_html: "Do you really want to delete this tag?
Users and slots currently associated with this tag will be dissociated.
Warning: This cannot be undone!" + tag_successfully_deleted: "Tag successfully deleted." + an_error_occurred_and_the_tag_deletion_failed: "An error occurred and the tag deletion failed." + authentication_form: + search_for_an_authentication_provider: "Search for an authentication provider" + add_a_new_authentication_provider: "Add a new authentication provider" + name: "Name" + strategy_name: "Strategy's name" + type: "Type" + state: "State" + unknown: "Unknown: " + active: "Active" + pending: "Pending" + previous_provider: "Previous provider" + confirmation_required: "Delete the provider?" + do_you_really_want_to_delete_the_TYPE_authentication_provider_NAME: "Do you really want to delete the {TYPE} authentication provider: {NAME}?" + authentication_provider_successfully_deleted: "Authentication provider successfully deleted." + an_error_occurred_unable_to_delete_the_specified_provider: "An error occurred: unable to delete the specified provider." + local_database: "Local database" + o_auth2: "OAuth 2.0" + openid_connect: "OpenID Connect" + group_form: + add_a_group: "Add a group" + group_name: "Group name" + disable: "Disable" + enable: "Enable" + changes_successfully_saved: "Changes successfully saved." + an_error_occurred_while_saving_changes: "An error occurred when saving changes." + new_group_successfully_saved: "New group successfully saved." + an_error_occurred_when_saving_the_new_group: "An error occurred when saving the new group." + group_successfully_deleted: "Group successfully deleted." + unable_to_delete_group_because_some_users_and_or_groups_are_still_linked_to_it: "Unable to delete group because some users and/or groups are still linked to it." + group_successfully_enabled_disabled: "Group successfully {STATUS, select, true{disabled} other{enabled}}." + unable_to_enable_disable_group: "Unable to {STATUS, select, true{disable} other{enable}} group." + unable_to_disable_group_with_users: "Unable to disable group because it still contains {USERS} active {USERS, plural, =1{user} other{users}}." + status_enabled: "Enabled" + status_disabled: "Disabled" + status_all: "All" + member_filter_all: "All" + member_filter_not_confirmed: "Unconfirmed" + member_filter_inactive_for_3_years: "Inactive for 3 years" + member_filter_not_validated: "Not validated" + members_list_item: + item_type: "member" + surname: "Surname" + first_name: "First name" + phone: "Phone" + email: "Email" + group: "Group" + subscription: "Subscription" + #add a member + members_new: + add_a_member: "Add a member" + user_is_an_organization: "User is an organization" + create_success: "Member successfully created" + #members bulk import + members_import: + import_members: "Import members" + info: "You can upload a CSV file to create new members or update existing ones. Your file must user the identifiers below to specify the group, the trainings and the tags of the members." + required_fields: "Your file must contain, at least, the following information for each user to create: email, name, first name and group. If the password is empty, it will be generated. On updates, the empty fields will be kept as is." + about_example_html: "Please refer to the provided example file to generate a correct CSV file.
This example will:
  1. create a new member (Jean Dupont) with a generated password
  2. update the password of an existing membre (ID 43) using the new given password

Be careful to use Unicode UTF-8 encoding." + groups: "Groups" + group_name: "Group name" + group_identifier: "Identifier to use" + trainings: "Trainings" + training_name: "Training name" + training_identifier: "Identifier to use" + plans: "Plans" + plan_name: "Plan name" + plan_identifier: "Identifier to use" + tags: "Tags" + tag_name: "Tag name" + tag_identifier: "Identifier to use" + download_example: "Example file" + select_file: "Choose a file" + import: "Import" + update_field: "Reference field for users to update" + update_on_id: "ID" + update_on_username: "Username" + update_on_email: "Email address" + #import results + members_import_result: + import_results: "Import results" + import_details: "Import # {ID}, of {DATE}, initiated by {USER}" + results: "Results" + pending: "Pending..." + status_create: "Creating a new user" + status_update: "Updating user {ID}" + success: "Success" + failed: "Failed" + error_details: "Error's details:" + user_validation: + validate_member_success: "Member successfully validated" + invalidate_member_success: "Member successfully invalidated" + validate_member_error: "An unexpected error occurred: unable to validate this member." + invalidate_member_error: "An unexpected error occurred: unable to invalidate this member." + validate_account: "Validate the account" + child_validation: + validate_child_success: "Child successfully validated" + invalidate_child_success: "Child successfully invalidated" + validate_child_error: "An unexpected error occurred: unable to validate this child." + invalidate_child_error: "An unexpected error occurred: unable to invalidate this child." + validate_child: "Validate the child" + supporting_documents_refusal_form: + refusal_comment: "Comment" + comment_placeholder: "Please type a comment here" + supporting_documents_refusal_modal: + title: "Refuse some supporting documents" + refusal_successfully_sent: "The refusal has been successfully sent." + unable_to_send: "Unable to refuse the supporting documents: " + confirm: "Confirm" + supporting_documents_validation: + title: "Supporting documents" + find_below_documents_files: "You will find below the supporting documents submitted by the member." + to_complete: "To complete" + refuse_documents: "Refusing the documents" + refuse_documents_info: "After verification, you may notify the member that the evidence submitted is not acceptable. You can specify the reasons for your refusal and indicate the actions to be taken. The member will be notified by e-mail." + change_role_modal: + change_role: "Change role" + warning_role_change: "

Warning: changing the role of a user is not a harmless operation.

" + new_role: "New role" + admin: "Administrator" + manager: "Manager" + member: "Member" + new_group: "New group" + new_group_help: "Users with a running subscription cannot be changed from their current group." + confirm: "Change role" + role_changed: "Role successfully changed from {OLD} to {NEW}." + error_while_changing_role: "An error occurred while changing the role. Please try again later." + #edit a member + members_edit: + subscription: "Subscription" + reservations: "Reservations" + duration: "Duration:" + expires_at: "Expires at:" + price_: "Price:" + offer_free_days: "Offer free days" + renew_subscription: "Renew the subscription" + cancel_subscription: "Cancel the subscription" + user_has_no_current_subscription: "User has no current subscription." + subscribe_to_a_plan: "Subscribe to a plan" + trainings: "Trainings" + no_trainings: "No trainings" + next_trainings: "Next trainings" + passed_trainings: "Passed trainings" + validated_trainings: "Validated trainings" + events: "Events" + next_events: "Next events" + no_upcoming_events: "No upcoming events" + NUMBER_full_price_tickets_reserved: "{NUMBER, plural, =0{} one{1 full price ticket reserved} other{{NUMBER} full price tickets reserved}}" + NUMBER_NAME_tickets_reserved: "{NUMBER, plural, =0{} one{1 {NAME} ticket reserved} other{{NUMBER} {NAME} tickets reserved}}" + passed_events: "Passed events" + no_passed_events: "No passed events" + invoices: "Invoices" + invoice_num: "Invoice #" + date: "Date" + price: "Price" + download_the_invoice: "Download the invoice" + download_the_refund_invoice: "Download the refund invoice" + no_invoices_for_now: "No invoices for now." + you_successfully_changed_the_expiration_date_of_the_user_s_subscription: "You successfully changed the expiration date of the user's subscription" + a_problem_occurred_while_saving_the_date: "A problem occurred while saving the date." + new_subscription: "New subscription" + you_are_about_to_purchase_a_subscription_to_NAME: "You are about to purchase a subscription to {NAME}." + with_schedule: "Subscribe with a monthly payment schedule" + subscription_successfully_purchased: "Subscription successfully purchased." + a_problem_occurred_while_taking_the_subscription: "A problem occurred while taking the subscription" + wallet: "Wallet" + to_credit: 'Credit' + cannot_credit_own_wallet: "You cannot credit your own wallet. Please ask another manager or an administrator to credit your wallet." + cannot_extend_own_subscription: "You cannot extend your own subscription. Please ask another manager or an administrator to extend your subscription." + update_success: "Member's profile successfully updated" + my_documents: "My documents" + save: "Save" + confirm: "Confirm" + cancel: "Cancel" + validate_account: "Validate the account" + validate_member_success: "The member is validated" + invalidate_member_success: "The member is invalidated" + validate_member_error: "An error occurred: impossible to validate from this member." + invalidate_member_error: "An error occurred: impossible to invalidate from this member." + supporting_documents: "Supporting documents" + change_role: "Change role" + #extend a subscription for free + free_extend_modal: + extend_subscription: "Extend the subscription" + offer_free_days_infos: "You are about to extend the user's subscription by offering him free additional days." + credits_will_remain_unchanged: "The balance of free credits (training / machines / spaces) of the user will remain unchanged." + current_expiration: "Current subscription will expire at:" + DATE_TIME: "{DATE} {TIME}" + new_expiration_date: "New expiration date:" + number_of_free_days: "Number of free days:" + extend: "Extend" + extend_success: "The subscription was successfully extended for free" + #renew a subscription + renew_modal: + renew_subscription: "Renew the subscription" + renew_subscription_info: "You are about to renew the user's subscription by charging him again for his current subscription." + credits_will_be_reset: "The balance of free credits (training / machines / spaces) of the user will be reset, unused credits will be lost." + current_expiration: "Current subscription will expire at:" + new_start: "The new subscription will start at:" + new_expiration_date: "The new subscription will expire at:" + pay_in_one_go: "Pay in one go" + renew: "Renew" + renew_success: "The subscription was successfully renewed" + DATE_TIME: "{DATE} {TIME}" + #take a new subscription + subscribe_modal: + subscribe_USER: "Subscribe {USER}" + subscribe: "Subscribe" + select_plan: "Please select a plan" + pay_in_one_go: "Pay in one go" + subscription_success: "Subscription successfully subscribed" + #cancel the current subscription + cancel_subscription_modal: + title: "Confirmation required" + confirmation_html: "You are about to cancel the subscription {NAME} of this user. From now, he won't be able to benefit from the advantages of this subscription, and all his unused credits will be lost. Are your sure?" + confirm: "Cancel this subscription" + subscription_canceled: "The subscription was successfully canceled." + #add a new administrator to the platform + admins_new: + add_an_administrator: "Add an administrator" + administrator_successfully_created_he_will_receive_his_connection_directives_by_email: "Successful creation. Connection directives were sent to the new administrator by e-mail." + failed_to_create_admin: "Unable to create the administrator:" + man: "Man" + woman: "Woman" + pseudonym: "Pseudonym" + pseudonym_is_required: "Pseudonym is required." + first_name: "First name" + first_name_is_required: "First name is required." + surname: "Last name" + surname_is_required: "Last name is required." + email_address: "Email address" + email_is_required: "Email address is required." + birth_date: "Date of birth" + address: "Address" + phone_number: "Phone number" + #add a new manager to the platform + manager_new: + add_a_manager: "Add a manager" + manager_successfully_created: "Successful creation. Connection directives were sent to the new manager by e-mail." + failed_to_create_manager: "Unable to create the manager:" + man: "Man" + woman: "Woman" + pseudonym: "Pseudonym" + pseudonym_is_required: "Pseudonym is required." + first_name: "First name" + first_name_is_required: "First name is required." + surname: "Last name" + surname_is_required: "Last name is required." + email_address: "Email address" + email_is_required: "Email address is required." + birth_date: "Date of birth" + address: "Address" + phone_number: "Phone number" + #authentication providers (SSO) components + authentication: + boolean_mapping_form: + mappings: "Mappings" + true_value: "True value" + false_value: "False value" + date_mapping_form: + input_format: "Input format" + date_format: "Date format" + integer_mapping_form: + mappings: "Mappings" + mapping_from: "From" + mapping_to: "To" + string_mapping_form: + mappings: "Mappings" + mapping_from: "From" + mapping_to: "To" + data_mapping_form: + define_the_fields_mapping: "Define the fields mapping" + add_a_match: "Add a match" + model: "Model" + field: "Field" + data_mapping: "Data mapping" + oauth2_data_mapping_form: + api_endpoint_url: "API endpoint or URL" + api_type: "API type" + api_field: "API field" + api_field_help_html: 'JsonPath syntax is supported.
If many fields are selected, the first one will be used.
Example: $.data[*].name' + openid_connect_data_mapping_form: + api_field: "Userinfo claim" + api_field_help_html: 'Set the field providing the corresponding data through the userinfo endpoint.
JsonPath syntax is supported. If many fields are selected, the first one will be used.
Example: $.data[*].name' + openid_standard_configuration: "Use the OpenID standard configuration" + type_mapping_modal: + data_mapping: "Data mapping" + TYPE_expected: "{TYPE} expected" + types: + integer: "integer" + string: "string" + text: "text" + date: "date" + boolean: "boolean" + oauth2_form: + authorization_callback_url: "Authorization callback URL" + common_url: "Server root URL" + authorization_endpoint: "Authorization endpoint" + token_acquisition_endpoint: "Token acquisition endpoint" + profile_edition_url: "Profil edition URL" + profile_edition_url_help: "The URL of the page where the user can edit his profile." + client_identifier: "Client identifier" + client_secret: "Client secret" + scopes: "Scopes" + openid_connect_form: + issuer: "Issuer" + issuer_help: "Root url for the authorization server." + discovery: "Discovery" + discovery_help: "Should OpenID discovery be used. This is recommended if the IDP provides a discovery endpoint." + discovery_unavailable: "Discovery is unavailable for the configured issuer." + discovery_enabled: "Enable discovery" + discovery_disabled: "Disable discovery" + client_auth_method: "Client authentication method" + client_auth_method_help: "Which authentication method to use to authenticate Fab-manager with the authorization server." + client_auth_method_basic: "Basic" + client_auth_method_jwks: "JWKS" + scope: "Scope" + scope_help_html: "Which OpenID scopes to include (openid is always required).
If Discovery is enabled, the available scopes will be automatically proposed." + prompt: "Prompt" + prompt_help_html: "Which OpenID pages the user will be shown.
None - no authentication or consent user interface pages are shown.
Login - the authorization server prompt the user for reauthentication.
Consent - the authorization server prompt the user for consent before returning information to Fab-manager.
Select account - the authorization server prompt the user to select a user account." + prompt_none: "None" + prompt_login: "Login" + prompt_consent: "Consent" + prompt_select_account: "Select account" + send_scope_to_token_endpoint: "Send scope to token endpoint?" + send_scope_to_token_endpoint_help: "Should the scope parameter be sent to the authorization token endpoint?" + send_scope_to_token_endpoint_false: "No" + send_scope_to_token_endpoint_true: "Yes" + profile_edition_url: "Profil edition URL" + profile_edition_url_help: "The URL of the page where the user can edit his profile." + client_options: "Client options" + client__identifier: "Identifier" + client__secret: "Secret" + client__authorization_endpoint: "Authorization endpoint" + client__token_endpoint: "Token endpoint" + client__userinfo_endpoint: "Userinfo endpoint" + client__jwks_uri: "JWKS URI" + client__end_session_endpoint: "End session endpoint" + client__end_session_endpoint_help: "The url to call to log the user out at the authorization server." + extra_authorize_params: "Extra authorize parameters" + extra_authorize_params_help: "A hash of extra fixed parameters that will be merged to the authorization request" + provider_form: + name: "Name" + authentication_type: "Authentication type" + save: "Save" + create_success: "Authentication provider created" + update_success: "Authentication provider updated" + methods: + local_database: "Local database" + oauth2: "OAuth 2.0" + openid_connect: "OpenID Connect" + #create a new authentication provider (SSO) + authentication_new: + add_a_new_authentication_provider: "Add a new authentication provider" + #edit an authentication provider (SSO) + authentication_edit: + provider: "Provider:" + #statistics tables + statistics: + statistics: "Statistics" + evolution: "Evolution" + age_filter: "Age filter" + from_age: "From" #e.g. from 8 to 40 years old + to_age: "to" #e.g. from 8 to 40 years old + start: "Start:" + end: "End:" + custom_filter: "Custom filter" + NO_: "NO" + criterion: "Criterion:" + value: "Value:" + exclude: "Exclude" + from_date: "From" #eg: from 01/01 to 01/05 + to_date: "to" #eg: from 01/01 to 01/05 + entries: "Entries:" + revenue_: "Revenue:" + average_age: "Average age:" + years_old: "years old" + total: "Total" + available_hours: "Hours available for booking:" + available_tickets: "Tickets available for booking:" + date: "Date" + reservation_date: "Reservation date" + user: "User" + gender: "Gender" + age: "Age" + type: "Type" + revenue: "Revenue" + unknown: "Unknown" + user_id: "User ID" + display_more_results: "Display more results" + export_statistics_to_excel: "Export statistics to Excel" + export_all_statistics: "Export all statistics" + export_the_current_search_results: "Export the current search results" + export: "Export" + deleted_user: "Deleted user" + man: "Man" + woman: "Woman" + export_is_running_you_ll_be_notified_when_its_ready: "Export is running. You'll be notified when it's ready." + create_plans_to_start: "Start by creating new subscription plans." + click_here: "Click here to create your first one." + average_cart: "Average cart:" + reservation_context: Reservation context + project_author: Author + #statistics graphs + stats_graphs: + statistics: "Statistics" + data: "Data" + day: "Day" + week: "Week" + from_date: "From" #eg: from 01/01 to 01/05 + to_date: "to" #eg: from 01/01 to 01/05 + month: "Month" + start: "Start:" + end: "End:" + type: "Type" + revenue: "Revenue" + top_list_of: "Top list of" + number: "Number" + week_short: "Week" + week_of_START_to_END: "Week of {START} to {END}" + no_data_for_this_period: "No data for this period" + date: "Date" + boolean_setting: + customization_of_SETTING_successfully_saved: "Customization of the {SETTING} successfully saved." + error_SETTING_locked: "Unable to update the setting: {SETTING} is locked. Please contact your system administrator." + an_error_occurred_saving_the_setting: "An error occurred while saving the setting. Please try again later." + save: "save" + #global application parameters and customization + settings: + customize_the_application: "Customize the application" + fablab_name: "FabLab name" + about: "About" + customize_information_messages: "Customize information messages" + message_of_the_machine_booking_page: "Message of the machine booking page:" + type_the_message_content: "Type the message content" + warning_message_of_the_training_booking_page: "Warning message of the training booking page:" + information_message_of_the_training_reservation_page: "Information message of the training reservation page:" + message_of_the_subscriptions_page: "Message of the subscriptions page:" + message_of_the_events_page: "Message of the events page:" + message_of_the_spaces_page: "Message of the spaces page:" + legal_documents: "Legal documents" + if_these_documents_are_not_filled_no_consent_about_them_will_be_asked_to_the_user: "If these documents are not filled, no consent about them will be asked." + general_terms_and_conditions: "General terms and conditions (T&C)" + terms_of_service: "Terms of service (TOS)" + customize_the_graphics: "Customize the graphics" + for_an_optimal_rendering_the_logo_image_must_be_at_the_PNG_format_with_a_transparent_background_and_with_an_aspect_ratio_3.5_times_wider_than_the_height: "For an optimal rendering, the logo image must be at the PNG format with a transparent background and an aspect ratio 3.5 wider than the height." + concerning_the_favicon_it_must_be_at_ICO_format_with_a_size_of_16x16_pixels: "Concerning the favicon, it must be at ICO format with a size of 16x16 pixels." + remember_to_refresh_the_page_for_the_changes_to_take_effect: "Remember to refresh the page for the changes to take effect." + logo_white_background: "Logo (white background)" + change_the_logo: "Change the logo" + logo_black_background: "Logo (black background)" + favicon: "Favicon" + change_the_favicon: "Change the favicon" + main_colour: "Main colour:" + primary: "Primary" + secondary_colour: "Secondary colour:" + secondary: "Secondary" + background_picture_of_the_profile_banner: "Background picture of the profile banner" + background_picture_recommendation: "Only .png file. Recommended size: 4/1 ratio, 1600*400 px." + change_the_profile_banner: "Change the profile banner" + home_page: "Home page" + news_of_the_home_page: "News of the home page:" + type_your_news_here: "Type your news here" + leave_it_empty_to_not_bring_up_any_news_on_the_home_page: "Leave it empty to not bring up any news on the home page" + twitter_stream: "Twitter Stream:" + name_of_the_twitter_account: "Name of the Twitter account" + link: "Link" + link_to_about: 'Link title to the "About" page' + content: "Content" + title_of_the_about_page: "Title of the About page" + shift_enter_to_force_carriage_return: "SHIFT + ENTER to force carriage return" + input_the_main_content: "Input the main content" + drag_and_drop_to_insert_images: "Drag and drop to insert images" + input_the_fablab_contacts: "Input the FabLab contacts" + reservations: "Reservations" + reservations_parameters: "Reservations parameters" + confine_the_booking_agenda: "Confine the booking agenda" + opening_time: "Opening time" + closing_time: "Closing time" + max_visibility: "Maximum visibility (in months)" + visibility_for_yearly_members: "For currently running subscriptions, at least 1 year long" + visibility_for_other_members: "For all other members" + reservation_deadline: "Prevent last minute booking" + reservation_deadline_help: "If you increase the prior period, members won't be able to book a slot X minutes before its start." + machine_deadline_minutes: "Machine prior period (minutes)" + training_deadline_minutes: "Training prior period (minutes)" + event_deadline_minutes: "Event prior period (minutes)" + space_deadline_minutes: "Space prior period (minutes)" + ability_for_the_users_to_move_their_reservations: "Ability for the users to move their reservations" + reservations_shifting: "Reservations shifting" + prior_period_hours: "Prior period (hours)" + enabled: "Enabled" + disabled: "Disabled" + ability_for_the_users_to_cancel_their_reservations: "Ability for the users to cancel their reservations" + reservations_cancelling: "Reservations cancelling" + reservations_reminders: "Reservations reminders" + notification_sending_before_the_reservation_occurs: "Notification sending before the reservation occurs" + customization_of_SETTING_successfully_saved: "Customization of the {SETTING} successfully saved." + file_successfully_updated: "File successfully updated." + name_genre: "title concordance" + machine_explications_alert: "explanation message on the machine reservation page" + training_explications_alert: "explanation message on the training reservation page" + training_information_message: "information message on the machine reservation page" + subscription_explications_alert: "explanation message on the subscription page" + event_explications_alert: "explanation message on the event reservation page" + space_explications_alert: "explanation message on the space reservation page" + main_color: "main colour" + secondary_color: "secondary colour" + customize_home_page: "Customize home page" + reset_home_page: "Reset the home page to its initial state" + confirmation_required: "Confirmation required" + confirm_reset_home_page: "Do you really want to reset the home page to its factory value?" + home_items: "Home page items" + item_news: "News" + item_projects: "Last projects" + item_twitter: "Last tweet" + item_members: "Last members" + item_events: "Next events" + home_content: "the home page" + home_content_reset: "Home page was successfully reset to its initial configuration." + home_css: "the stylesheet of the home page" + home_blogpost: "homepage's brief" + twitter_name: "Twitter feed name" + link_name: "link title to the \"About\" page" + about_title: "\"About\" page title" + about_body: "\"About\" page content" + about_contacts: "\"About\" page contacts" + about_follow_us: "Follow us" + about_networks: "Social networks" + privacy_draft: "privacy policy draft" + privacy_body: "privacy policy" + privacy_dpo: "data protection officer address" + booking_window_start: "opening time" + booking_window_end: "closing time" + booking_move_enable: "reservation moving enabling" + booking_move_delay: "preventive delay of moving" + booking_cancel_enable: "reservation canceling enabling" + booking_cancel_delay: "preventive delay of canceling" + reminder_enable: "reservation reminding enabling" + reminder_delay: "delay before sending the reminder" + default_value_is_24_hours: "If the field is leaved empty: 24 hours." + visibility_yearly: "maximum visibility for annual subscribers" + visibility_others: "maximum visibility for other members" + display: "Display" + display_name_info_html: "When enabled, connected members browsing the calendar or booking a resource will see the name of the members who has already booked some slots. When disabled, only administrators and managers will view the names.
Warning: if you enable this feature, please write it down in your privacy policy." + display_reservation_user_name: "Display the full name of the user(s) who booked a slots" + display_name: "Display the name" + display_name_enable: "name display" + events_in_the_calendar: "Display the events in the calendar" + events_in_calendar_info: "When enabled, the admin calendar will display the scheduled events, as read-only items." + show_event: "Show the events" + events_in_calendar: "events display in the calendar" + machines_sort_by: "machines display order" + fab_analytics: "Fab Analytics" + phone_required: "phone required" + address_required: "address required" + tracking_id: "tracking ID" + facebook_app_id: "Facebook App ID" + twitter_analytics: "Twitter analytics account" + book_overlapping_slots: "book overlapping slots" + slot_duration: "slots duration" + advanced: "Advanced settings" + customize_home_page_css: "Customise the stylesheet of the home page" + home_css_notice_html: "You can customize the stylesheet which will apply to the home page, using the SCSS syntax. These styles will be automatically subordinated to the .home-page selector to prevent any risk of breaking the application. Meanwhile please be careful, any changes in the home page editor at the top of the page may broke your styles, always refer to the HTML code." + error_SETTING_locked: "Unable to update the setting: {SETTING} is locked. Please contact your system administrator." + an_error_occurred_saving_the_setting: "An error occurred while saving the setting. Please try again later." + book_overlapping_slots_info: "Allow / prevent the reservation of overlapping slots" + allow_booking: "Allow booking" + overlapping_categories: "Overlapping categories" + overlapping_categories_info: "Preventing booking on overlapping slots will be done by comparing the date and time of the following categories of reservations." + default_slot_duration: "Default duration for slots" + duration_minutes: "Duration (in minutes)" + default_slot_duration_info: "Machine and space availabilities are divided in multiple slots of this duration. This value can be overridden per availability." + modules: "Modules" + machines: "Machines" + machines_info_html: "The module Reserve a machine module can be disabled." + enable_machines: "Enable the machines" + machines_module: "machines module" + spaces: "Spaces" + spaces_info_html: "

A space can be, for example, a woodshop or a meeting room. Their particularity is that they can be booked by several people at the same time.

Warning: It is not recommended to disable spaces if at least one space reservation was made on the system.

" + enable_spaces: "Enable the spaces" + spaces_module: "spaces module" + plans: "Plans" + plans_info_html: "

Subscriptions provide a way to segment your prices and provide benefits to regular users.

Warning: It is not recommended to disable plans if at least one subscription is active on the system.

" + enable_plans: "Enable the plans" + plans_module: "plans module" + trainings: "Trainings" + trainings_info_html: "

Trainings are fully integrated Fab-manager's agenda. If enabled, your members will be able to book and pay trainings.

Trainings provides a way to prevent members to book some machines, if they do have not taken the prerequisite course.

" + enable_trainings: "Enable the trainings" + trainings_module: "trainings module" + store: "Store" + store_info_html: "You can enable the store module that provides an easy way to sell various products and consumables to your members. This module also allows you to manage stocks and track orders." + enable_store: "Enable the store" + store_module: "store module" + invoicing: "Invoicing" + invoicing_info_html: "

You can fully disable the invoicing module.

This is useful if you have your own invoicing system, and you don't want Fab-manager generates and sends invoices to the members.

Warning: even if you disable the invoicing module, you must to configure the VAT to prevent errors in accounting and prices. Do it from the « Invoices > Invoicing settings » section.

" + enable_invoicing: "Enable invoicing" + invoicing_module: "invoicing module" + account_creation: "Account creation" + accounts_management: "Accounts management" + members_list: "Members list" + members_list_info: "You can customize the fields to display in the member management list" + phone: "Phone" + phone_is_required: "Phone required" + phone_required_info: "You can define if the phone number should be required to register a new user on Fab-manager." + address: "Address" + address_required_info_html: "You can define if the address should be required to register a new user on Fab-manager.
Please note that, depending on your country, the regulations may requires addresses for the invoices to be valid." + address_is_required: "Address is required" + external_id: "External identifier" + external_id_info_html: "You can set up an external identifier for your users, which cannot be modified by the user himself." + enable_external_id: "Enable the external ID" + captcha: "Captcha" + captcha_info_html: "You can setup a protection against robots, to prevent them creating members accounts. This protection is using Google reCAPTCHA. Sign up for an API key pair to start using the captcha." + site_key: "Site key" + secret_key: "Secret key" + recaptcha_site_key: "reCAPTCHA Site Key" + recaptcha_secret_key: "reCAPTCHA Secret Key" + feature_tour_display: "feature tour display" + email_from: "expeditor's address" + disqus_shortname: "Disqus shortname" + COUNT_items_removed: "{COUNT, plural, =1{One item} other{{COUNT} items}} removed" + item_added: "One item added" + openlab_app_id: "OpenLab ID" + openlab_app_secret: "OpenLab secret" + openlab_default: "default gallery view" + online_payment_module: "online payment module" + stripe_currency: "Stripe currency" + account_confirmation: "Account confirmation" + confirmation_required_info: "Optionally, you can force the users to confirm their email address before being able to access Fab-manager." + confirmation_is_required: "Confirmation required" + change_group: "Group change" + change_group_info: "After an user has created his account, you can restrict him from changing his group. In that case, only managers and administrators will be able to change the user's group." + allow_group_change: "Allow group change" + user_change_group: "users can change their group" + wallet_module: "wallet module" + public_agenda_module: "public agenda module" + statistics_module: "statistics module" + upcoming_events_shown: "display limit for upcoming events" + display_invite_to_renew_pack: "Display the invite to renew prepaid-packs" + packs_threshold_info_html: "You can define under how many hours the user will be invited to buy a new prepaid-pack, if his stock of prepaid hours is under this threshold.
You can set a number of hours (eg. 5) or a percentage of his current pack pack (eg. 0.05 means 5%)." + renew_pack_threshold: "threshold for packs renewal" + pack_only_for_subscription_info_html: "If this option is activated, the purchase and use of a prepaid pack is only possible for the user with a valid subscription." + pack_only_for_subscription: "Subscription valid for purchase and use of a prepaid pack" + pack_only_for_subscription_info: "Make subscription mandatory for prepaid packs" + extended_prices: "Extended prices" + extended_prices_info_html: "Spaces can have different prices depending on the cumulated duration of the booking. You can choose if this apply to all bookings or only to those starting within the same day." + extended_prices_in_same_day: "Extended prices in the same day" + public_registrations: "Public registrations" + projects_list_member_filter_presence: "Presence of member filter on projects list" + projects_list_date_filters_presence: "Presence of date filters on projects list" + project_categories_filter_placeholder: "Placeholder for categories filter in project gallery" + project_categories_wording: "Wording used to replace \"Categories\" on public pages" + reservation_context_feature_title: Reservation context + reservation_context_feature_info: "If you enable this feature, members will have to enter the context of their reservation when reserving." + reservation_context_feature: "Enable the feature \"Reservation context\"" + reservation_context_options: Reservation context options + add_a_reservation_context: Add a new context + do_you_really_want_to_delete_this_reservation_context: "Do you really want to delete this context?" + unable_to_delete_reservation_context_already_related_to_reservations: "Unable to delete this context because it is already associated to a reservation" + unable_to_delete_reservation_context_an_error_occured: "Unable to delete: an error occurred" + family_account: "family account" + family_account_info_html: "The Family account allows your members to add their children under 18 years old to their own account and directly register them for Family events. You can also request supporting documents for each child and validate their account." + enable_family_account: "Enable the Family Account option" + child_validation_required: "the account validation option for children" + child_validation_required_label: "Activate the account validation option for children" + overlapping_options: + training_reservations: "Trainings" + machine_reservations: "Machines" + space_reservations: "Spaces" + events_reservations: "Events" + general: + general: "General" + title: "Title" + fablab_title: "FabLab title" + title_concordance: "Title concordance" + male: "Male." + female: "Female." + neutral: "Neutral." + eg: "eg:" + the_team: "The team of" + male_preposition: "the" + female_preposition: "the" + neutral_preposition: "" + elements_ordering: "Elements ordering" + machines_order: "Machines order" + display_machines_sorted_by: "Display machines sorted by" + sort_by: + default: "Default" + name: "Name" + created_at: "Creation date" + updated_at: "Last update date" + public_registrations: "Public registrations" + public_registrations_info: "Allow everyone to register a new account on the platform. If disabled, only administrators and managers can create new accounts." + public_registrations_allowed: "Public registrations allowed" + help: "Help" + feature_tour: "Feature tour" + feature_tour_info_html: "

When an administrator or a manager in logged-in, a feature tour will be triggered the first time he visits each section of the application. You can change this behavior to one of the following values:

" + feature_tour_display_mode: "Feature tour display mode" + display_mode: + once: "Once" + session: "By session" + manual: "Manual trigger" + notifications: "Notifications" + email: "Email" + email_info: "The email address from which notifications will be sent. You can use a non-existing address (like noreply@...) or an existing address if you want to allow your members to reply to the notifications they receive." + email_from: "Expeditor's address" + wallet: "Wallet" + wallet_info_html: "

The virtual wallet allows you to allocate a sum of money to users. Then, can spend this money as they wish, in Fab-manager.

Members cannot credit their wallet themselves, it's a privilege of managers and administrators.

" + enable_wallet: "Enable wallet" + public_agenda: "Public agenda" + public_agenda_info_html: "

The public agenda offers to members and visitors a general overview of the Fablab's planning.

Please note that, even logged, users won't be able to book a reservation or modify anything from this agenda: this is a read-only page.

" + enable_public_agenda: "Enable public agenda" + statistics: "Statistics" + statistics_info_html: "

Enable or disable the statistics module.

If enabled, every nights, the data of the day just passed will be consolidated in the database of a powerful analysis engine. Then, every administrators will be able to browse statistical charts and tables in the corresponding section.

" + enable_statistics: "Enable statistics" + account: + account: "Account" + customize_account_settings: "Customize account settings" + user_validation_required: "validation of accounts" + user_validation_required_title: "Validation of accounts" + user_validation_required_info: "By activating this option, only members whose account is validated by an administrator or a manager will be able to make reservations." + user_validation_setting: + customization_of_SETTING_successfully_saved: "Customization of the {SETTING} successfully saved." + error_SETTING_locked: "Unable to update the setting: {SETTING} is locked. Please contact your system administrator." + an_error_occurred_saving_the_setting: "An error occurred while saving the setting. Please try again later." + user_validation_required_option_label: "Activate the account validation option" + user_validation_required_list_title: "Member account validation information message" + user_validation_required_list_info: "Your administrator must validate your account. Then, you will be able to access all the booking features." + user_validation_required_list_other_info: "The resources selected below will be subject to member account validation." + save: "Save" + user_validation_required_list: + subscription: "Subscriptions" + machine: "Machines" + event: "Events" + space: "Spaces" + training: "Trainings" + pack: "Prepaid pack" + confirm: "Confirm" + confirmation_required: "Confirmation required" + organization: "Organization" + organization_profile_custom_fields_info: "You can display additional fields for users who declare themselves to be an organization. You can also choose to make them mandatory at account creation." + organization_profile_custom_fields_alert: "Warning: the activated fields will be automatically displayed on the issued invoices. Once configured, please do not modify them." + supporting_documents_type_modal: + successfully_created: "The new supporting documents request has been created." + unable_to_create: "Unable to delete the supporting documents request: " + successfully_updated: "The supporting documents request has been updated." + unable_to_update: "Unable to modify the supporting documents request: " + new_type: "Create a supporting documents request" + edit_type: "Edit the supporting documents request" + create: "Create" + edit: "Edit" + supporting_documents_type_form: + type_form_info: "Please define the supporting documents request settings below" + select_group: "Choose one or many group(s)" + name: "Name" + supporting_documents_types_list: + add_supporting_documents_types: "Add supporting documents" + all_groups: 'All groups' + supporting_documents_type_info: "You can ask for supporting documents, according to the user's groups. This will ask your members to deposit those kind of documents in their personnal space. Each members will be informed that supporting documents are required to be provided in their personal space (My supporting documents tab). On your side, you'll be able to check the provided supporting documents and validate the member's account (if the Account Validation option is enabled)." + no_groups_info: "Supporting documents are necessarily applied to groups.
If you do not have any group yet, you can create one from the \"Users/Groups\" page (button on the right)." + create_groups: "Create groups" + supporting_documents_type_title: "Supporting documents requests" + add_type: "Add new document" + group_name: "Group" + name: "Supporting documents" + no_types: "You do not have any supporting documents requests.
Make sure you have created at least one group in order to add a request." + delete_supporting_documents_type_modal: + confirmation_required: "Confirmation required" + confirm: "Confirm" + deleted: "The supporting documents request has been deleted." + unable_to_delete: "Unable to delete the supporting documents request: " + confirm_delete_supporting_documents_type: "Do you really want to remove this requested type of supporting documents?" + profile_custom_fields_list: + field_successfully_updated: "The organization field has been updated." + unable_to_update: "Impossible to modify the field : " + required: "Confirmation required" + actived: "Activate the field" + home: + show_upcoming_events: "Show upcoming events" + upcoming_events: + until_start: "Until they start" + 2h_before_end: "Until 2 hours before they end" + until_end: "Until they end" + privacy: + title: "Privacy" + privacy_policy: "Privacy policy" + input_the_dpo: "Data Protection Officer" + current_policy: "Current policy" + draft_from_USER_DATE: "Draft, saved by {USER}, on {DATE}" + save_or_publish: "Save or publish?" + save_or_publish_body: "Do you want to publish a new version of the privacy policy or save it as a draft?" + publish_will_notify: "Publish a new version will send a notification to every users." + publish: "Publish" + users_notified: "Platform users will be notified of the update." + about_analytics: "I agree to share anonymous data with the development team to help improve Fab-manager." + read_more: "Which data do we collect?" + statistics: "Statistics" + google_analytics: "Google Analytics" + facebook: "Facebook" + facebook_info_html: "To enable the statistical tracking of the shares on the Facebook social network, set your App ID here. Refer to this guide to get one." + app_id: "App ID" + twitter: "Twitter" + twitter_info_html: "To enable the statistical tracking of the shares on the Twitter social network, Twitter analytics, set the name of your Twitter account here." + twitter_analytics: "Twitter account" + analytics: + title: "Application improvement" + intro_analytics_html: "You'll find below a detailed view of all the data, Fab-manager will collect if permission is granted." + version: "Application version" + members: "Number of members" + admins: "Number of administrators" + managers: "Number of managers" + availabilities: "Number of availabilities of the last 7 days" + reservations: "Number of reservations during the last 7 days" + orders: "Number of store orders during the last 7 days" + plans: "Is the subscription module active?" + spaces: "Is the space management module active?" + online_payment: "Is the online payment module active?" + gateway: "The payment gateway used to collect online payments" + wallet: "Is the wallet module active?" + statistics: "Is the statistics module active?" + trainings: "Is the trainings module active?" + public_agenda: "Is the public agenda module active?" + machines: "Is the machines module active?" + store: "Is the store module active?" + invoices: "Is the invoicing module active?" + openlab: "Is the project sharing module (OpenLab) active?" + tracking_id_info_html: "To enable the statistical tracking of the visits using Google Analytics V4, set your tracking ID here. It is in the form G-XXXXXX. Visit the Google Analytics website to get one.
Warning: if you enable this feature, a cookie will be created. Remember to write it down in your privacy policy, above." + tracking_id: "Tracking ID" + open_api_clients: + add_new_client: "Create new API client" + api_documentation: "API documentation" + open_api_clients: "OpenAPI clients" + name: "Name" + calls_count: "Calls count" + token: "Token" + created_at: "Creation date" + reset_token: "Revoke access" + client_name: "Client's name" + confirmation_required: "Confirmation required" + do_you_really_want_to_delete_this_open_api_client: "Do you really want to delete this OpenAPI client?" + do_you_really_want_to_revoke_this_open_api_access: "Do you really want to revoke this access? It will erase and replace the current token." + client_successfully_created: "Client successfully created." + client_successfully_updated: "Client successfully updated." + client_successfully_deleted: "Client successfully deleted." + access_successfully_revoked: "Access successfully revoked." + #create a new space + space_new: + add_a_new_space: "Add a new space" + #modify an exiting space + space_edit: + edit_the_space_NAME: "Edit the space: {NAME}" + validate_the_changes: "Validate the changes" + #process and delete abuses reports + manage_abuses: + abuses_list: "Reports list" + no_reports: "No reports for now" + published_by: "published by" + at_date: "on" + has_reported: "made the following report:" + confirmation_required: "Confirm the processing of the report" + report_will_be_destroyed: "Once the report has been processed, it will be deleted. This can't be undone, continue?" + report_removed: "The report has been deleted" + failed_to_remove: "An error occurred, unable to delete the report" + local_payment_form: + about_to_cash: "You're about to confirm the cashing by an external payment mean. Please do not click on the button below until you have fully cashed the requested payment." + about_to_confirm: "You're about to confirm your {ITEM, select, subscription{subscription} reservation{reservation} other{order}}." + payment_method: "Payment method" + method_card: "Online by card" + method_check: "By check" + method_transfer: "By bank transfer" + card_collection_info: "By validating, you'll be prompted for the member's card number. This card will be automatically charged at the deadlines." + check_collection_info: "By validating, you confirm that you have {DEADLINES} checks, allowing you to collect all the monthly payments." + transfer_collection_info: "

By validating, you confirm that you set up {DEADLINES} bank direct debits, allowing you to collect all the monthly payments.

Please note: the bank transfers are not automatically handled by Fab-manager.

" + online_payment_disabled: "Online payment is not available. You cannot collect this payment schedule by online card." + local_payment_modal: + validate_cart: "Validate my cart" + offline_payment: "Payment on site" + check_list_setting: + save: 'Save' + customization_of_SETTING_successfully_saved: "Customization of the {SETTING} successfully saved." + #feature tour + tour: + conclusion: + title: "Thank you for your attention" + content: "

If you want to restart this contextual help, press F1 at any time or click on [? Help] from the user's menu.

If you need additional help, you can check the user guide (only in French for now).

The Fab-manager's team also provides personalized support (help with getting started, help with installation, customization, etc.), contact-us for more info.

" + trainings: + welcome: + title: "Trainings" + content: "Here you can create, modify and delete trainings. It is also the place where you can validate the training courses followed by your members." + welcome_manager: + title: "Trainings" + content: "This is the place where you can view the trainings and their associations with the machines. It is also the place where you can validate the training courses followed by your members." + trainings: + title: "Manage trainings" + content: "

With each training, a default number of places is associated. However, the number of actual places may be modified for each session.

The training sessions are scheduled from the administrator tab « Calendar ».

Furthermore, a training may be associated with one or more machines. This makes it a prerequisite for the reservation of these machines.

" + filter: + title: "Filter" + content: "By default, only active courses are displayed here. Display the others by choosing another filter here." + tracking: + title: "Trainings monitoring" + content: "Once a training session is finished, you can validate the training for the members present from this screen. This validation is essential to allow them to use the associated machines, if applicable." + calendar: + welcome: + title: "Calendar" + content: "From this screen, you can plan the slots during which training, machines and spaces will be bookable by members." + agenda: + title: "The calendar" + content: "Click in the calendar to start creating a new availability range. You can directly select the entire time range desired by maintaining your click." + export: + title: "Export" + content: "Start generating an Excel file, listing all the availability slots created in the calendar." + import: + title: "Import external calendars" + content: "Allows you to import calendars from an external source in iCal format." + members: + welcome: + title: "Users" + content: "Here you can create, modify and delete members and administrators. You can also manage groups, labels, import / export with spreadsheet files and connect SSO software." + list: + title: "Members list" + content: "By default, this table lists all the members of your Fab-manager. You can sort the list in a different order by clicking on the header of each column." + search: + title: "Find a user" + content: "This input field allows you to search for any text on all of the columns in the table below." + filter: + title: "Filter the list" + content: "

Filter the list below to display only users who have not confirmed their email address or inactive accounts for more than 3 years.

Please notice that the GDPR requires that you delete any accounts inactive for more than 3 years.

" + actions: + title: "Members actions" + content: "

The buttons in this column allow you to display and modify all of the member's parameters, or to delete them irreversibly.

In the event of a deletion, the billing information will be kept for 10 years and statistical data will also be kept anonymously.

" + exports: + title: "Export" + content: "Each of these buttons starts the generation of an Excel file listing all the members, subscriptions or reservations, current and past." + import: + title: "Import members" + content: "Allows you to import a list of members to create in Fab-manager, from a CSV file." + admins: + title: "Manage administrators" + content: "In the same way as the members, manage the administrators of your Fab-manager here.
The administrators can take reservations for any member as well as modify all the parameters of the software." + groups: + title: "Manage groups" + content: "

Groups allow you to better segment your price list.

When you set up Fab-manager for the first time, it is recommended to start by defining the groups.

" + labels: + title: "Manage tags" + content: "The labels allow you to reserve certain slots for users associated with these same labels." + sso: + title: "Single Sign-On" + content: "Here you can set up and manage a single authentication system (SSO)." + invoices: + welcome: + title: "Invoices" + content: "

Here you will be able to download invoices and credit notes issued, as well as manage everything related to accounting and invoicing.

If you use third-party software to manage your invoices, it is possible to deactivate the billing module. For this, contact your system administrator.

" + welcome_manager: + title: "Invoices" + content: "Here you will be able to download invoices and create credit notes." + list: + title: "Invoices list" + content: "By default, this table lists all the invoices and credit notes issued by Fab-manager. You can sort the list in a different order by clicking on the header of each column." + chained: + title: "Chaining indicator" + content: "

This icon ensures the inalterability of the accounting data of the invoice on this line, in accordance with the French finance law of 2018 against VAT fraud.

If a red icon appears instead of this one , please contact technical support immediately.

" + download: + title: "Download" + content: "Click here to download the invoice in PDF format." + refund: + title: "Credit note" + content: "Allows you to generate a credit note for the invoice on this line or some of its sub-elements. Warning: This will only generate the accounting document, the actual refund of the user will always be your responsibility." + payment-schedules: + title: "Payment schedules" + content: "

Some subscription plans may be configured to allow the members to pay them with a monthly payment schedule.

Here you can view all existing payment schedules and manage their deadlines.

Click on [+] at the beginning of a row to display all deadlines associated with a payment schedule, and run some actions on them.

" + settings: + title: "Settings" + content: "

Here you can modify the parameters for invoices generation. Click on the item you are interested in to start editing.

In particular, this is where you can set if you are subject to VAT and the applicable rate.

" + codes: + title: "Accounting codes" + content: "Set the accounting codes here for all kinds of entries generated by the software. This setting is only required if you use the accounting export functionality." + export: + title: "Accounting export" + content: "Once the codes have been configured, click here to access the interface allowing you to export the entries to a third-party accounting software." + payment: + title: "Payment settings" + content: "If you want to allow your members to book directly online by paying by credit card, you can activate and configure this feature from this page." + periods: + title: "Close accounting periods" + content: "

The regulations of your country may require you to close your accounts regularly. The interface accessible from this button allows you to do this.

In France, if you are subject to VAT anti-fraud law BOI-TVA-DECLA-30-10-30-20160803, this closing is mandatory at least once a year.

As a reminder, if you have to use a certified software (take the test here), you are under the legal obligation to provide a certificate of compliance of the software. Contact-us to get it.

" + pricing: + welcome: + title: "Subscriptions & Prices" + content: "Manage subscription plans and prices for the various services you offer to your members." + new_plan: + title: "New subscription plan" + content: "Create subscription plans to offer preferential prices on machines and spaces to regular users." + trainings: + title: "Trainings" + content: "Define training prices here, by user group." + machines: + title: "Machines" + content: "Define here the prices of the machine slots, by user group. These prices will be applied to users who do not have subscriptions." + spaces: + title: "Spaces" + content: "In the same way, define here the prices of the spaces slots, for the users without subscriptions." + credits: + title: "Credits" + content: "

Credits allow you to give certain services for free to users who subscribe to a plan.

You can, for example, offer 2 hours of 3D printer for all annual subscriptions; or training of your choice for student subscribers, etc.

" + coupons: + title: "Coupons" + content: "Create and manage promotional coupons allowing to offer punctual discounts to their holders." + events: + welcome: + title: "Events" + content: "Create events, track their reservations and organize them from this page." + list: + title: "The events" + content: "This list displays all past or future events, as well as the number of reservations for each of them." + filter: + title: "Filter events" + content: "Only display upcoming events in the list below; or on the contrary, only those already passed." + categories: + title: "Categories" + content: "Categories help your users know what type of event it is. A category is required for each of the newly created events." + themes: + title: "Themes" + content: "

Themes are an additional (and optional) categorization of your events. They can group together different events of very different forms.

For example, a two-day course about marquetry and an evening workshop about the handling of the wood planer, can be found in the theme « carpentry ».

" + ages: + title: "Age groups" + content: "This other optional filter will help your users find events suited to their profile." + prices: + title: "Pricing categories" + content: "The price of events does not depend on groups or subscriptions, but on the categories you define on this page." + projects: + welcome: + title: "Projects" + content: "Here you can define all the elements that will be available for members to document the projects they carry out. You can also define various parameters related to the projects." + abuses: + title: "Manage reports" + content: "

Access here the management of reports.

Visitors can signal projects, for example for copyright infringement or for hate speech.

GDPR requires you to delete this reporting data once the required actions have been taken.

" + settings: + title: "Settings" + content: "

Comments, CAD files ... Manage project parameters here

You can also activate OpenLab projects, in order to display the projects shared by other Fab Labs in your gallery.

" + statistics: + welcome: + title: "Statistics" + content: "

From here, you will be able to access many statistics on your members and their uses within your Fab Lab.

In accordance with GDPR, users who have deleted their account continue to be reported in the statistics, but anonymously.

" + export: + title: "Export data" + content: "You can choose to export all or part of the statistical data to an Excel file." + trending: + title: "Evolution" + content: "Visualize the evolution over time of the main uses of your Fab Lab, thanks to graphs and curves." + settings: + welcome: + title: "Application customization" + content: "From here, you can configure the general settings of Fab-manager, enable or disable the optional modules and customize various elements of the interface." + general: + title: "General settings" + content: "A lot a settings can be customized from here. Take time to look all over this page, it will let you customize messages, documents, optional modules, registrations, visual aspect of Fab-manager, and much more." + home: + title: "Customize home page" + content: "

This WYSIWYG editor allows you to customize the appearance of the home page while using different components (last tweet, brief, etc.).

Warning: Keep in mind that any uncontrolled changes can break the appearance of the home page.

" + components: + title: "Insert a component" + content: "Click here to insert a pre-existing component into the home page." + codeview: + title: "Display HTML code" + content: "This button allows you to directly view and modify the code of the home page. This is the recommended way to proceed, but it requires prior knowledge of HTML." + reset: + title: "Go back" + content: "At any time, you can restore the original home page by clicking here." + css: + title: "Customize the style sheet" + content: "For advanced users, it is possible to define a custom style sheet (CSS) for the home page." + about: + title: "About" + content: "Fully personalize this page to present your activity." + privacy: + title: "Privacy policy" + content: "

Explain here how you use the data you collect about your members.

GDPR requires that a confidentiality policy is defined, as well as a data protection officer.

" + draft: + title: "Draft" + content: "Click here to view a privacy policy draft with holes, which you just need to read and complete." + reservations: + title: "Reservations" + content: "Opening hours, chance to cancel reservations... Each Fablab has its own reservation rules, which you can define on this page." + open_api: + welcome: + title: "OpenAPI" + content: "Fab-manager offers an open API allowing third-party software to deal simply with its data. This screen allows you to grant accesses to this API." + doc: + title: "Documentation" + content: "Click here to access the API online documentation." + store: + manage_the_store: "Manage the Store" + settings: "Settings" + all_products: "All products" + categories_of_store: "Store categories" + the_orders: "Orders" + back_to_list: "Back to list" + product_categories: + title: "All categories" + info: "Arrange categories with a drag and drop on a maximum of two levels. The order of the categories will be identical between the list below and the public view. Please note that you can delete a category or a sub-category even if they are associated with products. Those products will be left without categories. If you delete a category that contains sub-categories, the latter will also be deleted." + manage_product_category: + create: "Create a product category" + update: "Modify the product category" + delete: "Delete the product category" + product_category_modal: + new_product_category: "Create a category" + edit_product_category: "Modify a category" + product_category_form: + name: "Name of category" + slug: "URL" + select_parent_product_category: "Choose a parent category (N1)" + no_parent: "No parent" + create: + error: "Unable to create the category: " + success: "The new category has been created." + update: + error: "Unable to modify the category: " + success: "The category has been modified." + delete: + confirm: "Do you really want to delete {CATEGORY}?
If it has sub-categories, they will also be deleted." + save: "Delete" + error: "Unable to delete the category: " + success: "The category has been successfully deleted" + save: "Save" + required: "This field is required" + slug_pattern: "Only lowercase alphanumeric groups of characters separated by an hyphen" + categories_filter: + filter_categories: "By categories" + filter_apply: "Apply" + machines_filter: + filter_machines: "By machines" + filter_apply: "Apply" + keyword_filter: + filter_keywords_reference: "By keywords or reference" + filter_apply: "Apply" + stock_filter: + stock_internal: "Private stock" + stock_external: "Public stock" + filter_stock: "By stock status" + filter_stock_from: "From" + filter_stock_to: "to" + filter_apply: "Apply" + products: + unexpected_error_occurred: "An unexpected error occurred. Please try again later." + all_products: "All products" + create_a_product: "Create a product" + filter: "Filter" + filter_clear: "Clear all" + filter_apply: "Apply" + filter_categories: "By categories" + filter_machines: "By machines" + filter_keywords_reference: "By keywords or reference" + filter_stock: "By stock status" + stock_internal: "Private stock" + stock_external: "Public stock" + filter_stock_from: "From" + filter_stock_to: "to" + sort: + name_az: "A-Z" + name_za: "Z-A" + price_low: "Price: low to high" + price_high: "Price: high to low" + store_list_header: + result_count: "Result count:" + sort: "Sort:" + visible_only: "Visible products only" + product_item: + product: "product" + visible: "visible" + hidden: "hidden" + stock: + internal: "Private stock" + external: "Public stock" + unit: "unit" + new_product: + add_a_new_product: "Add a new product" + successfully_created: "The new product has been created." + edit_product: + successfully_updated: "The product has been updated." + successfully_cloned: "The product has been duplicated." + product_form: + product_parameters: "Product parameters" + stock_management: "Stock management" + description: "Description" + description_info: "The text will be presented in the product sheet. You have a few editorial styles at your disposal." + name: "Name of product" + sku: "Product reference (SKU)" + slug: "URL" + is_show_in_store: "Available in the store" + is_active_price: "Activate the price" + active_price_info: "Is this product visible by the members on the store?" + price_and_rule_of_selling_product: "Price and rule for selling the product" + price: "Price of product" + quantity_min: "Minimum number of items for the shopping cart" + linking_product_to_category: "Linking this product to an existing category" + assigning_category: "Assigning a category" + assigning_category_info: "You can only declare one category per product. If you assign this product to a sub-category, it will automatically be assigned to its parent category as well." + assigning_machines: "Assigning machines" + assigning_machines_info: "You can link one or more machines from your workshop to your product. This product will then be subject to the filters on the catalogue view. The selected machines will be linked to the product." + product_files: "Document" + product_files_info: "Add documents related to this product. They will be presented in the product sheet, in a separate block. You can only upload PDF documents." + add_product_file: "Add a document" + product_images: "Visuals of the product" + product_images_info: "We advise you to use a square format, JPG or PNG. For JPG, please use white for the background colour. The main visual will be the first presented in the product sheet." + add_product_image: "Add a visual" + save: "Save" + clone: "Duplicate" + product_stock_form: + stock_up_to_date: "Stock up to date" + date_time: "{DATE} - {TIME}" + ongoing_operations: "Ongoing stock operations" + save_reminder: "Don't forget to save your operations" + low_stock_threshold: "Define a low stock threshold" + stock_threshold_toggle: "Activate stock threshold" + stock_threshold_info: "Define a low stock threshold and receive a notification when it's reached. When the threshold is reached, the product quantity is labeled as low." + low_stock: "Low stock" + threshold_level: "Minimum threshold level" + threshold_alert: "Notify me when the threshold is reached" + events_history: "Events history" + event_type: "Events:" + reason: "Reason" + stocks: "Stock:" + internal: "Private stock" + external: "Public stock" + edit: "Edit" + all: "All types" + remaining_stock: "Remaining stock" + type_in: "Add" + type_out: "Remove" + cancel: "Cancel this operation" + product_stock_modal: + modal_title: "Manage stock" + internal: "Private stock" + external: "Public stock" + new_event: "New stock event" + addition: "Addition" + withdrawal: "Withdrawal" + update_stock: "Update stock" + reason_type: "Reason" + stocks: "Stock:" + quantity: "Quantity" + stock_movement_reason: + inward_stock: "Inward stock" + returned: "Returned by client" + cancelled: "Canceled by client" + inventory_fix: "Inventory fix" + sold: "Sold" + missing: "Missing in stock" + damaged: "Damaged product" + other_in: "Other (in)" + other_out: "Other (out)" + clone_product_modal: + clone_product: "Duplicate the product" + clone: "Duplicate" + name: "Name" + sku: "Product reference (SKU)" + is_show_in_store: "Available in the store" + active_price_info: "Is this product visible by the members on the store?" + orders: + heading: "Orders" + create_order: "Create an order" + filter: "Filter" + filter_clear: "Clear all" + filter_apply: "Apply" + filter_ref: "By reference" + filter_status: "By status" + filter_client: "By client" + filter_period: "By period" + filter_period_from: "From" + filter_period_to: "to" + state: + cart: 'Cart' + in_progress: 'Under preparation' + paid: "Paid" + payment_failed: "Payment error" + canceled: "Canceled" + ready: "Ready" + refunded: "Refunded" + delivered: "Delivered" + sort: + newest: "Newest first" + oldest: "Oldest first" + store_settings: + title: "Settings" + withdrawal_instructions: 'Product withdrawal instructions' + withdrawal_info: "This text is displayed on the checkout page to inform the client about the products withdrawal method" + store_hidden_title: "Store publicly available" + store_hidden_info: "You can hide the store to the eyes of the members and the visitors." + store_hidden: "Hide the store" + save: "Save" + update_success: "The settings were successfully updated" + invoices_settings_panel: + disable_invoices_zero: "Disable the invoices at 0" + disable_invoices_zero_label: "Do not generate invoices at {AMOUNT}" + filename: "Edit the file name" + filename_info: "Information

The invoices are generated as PDF files, named with the following prefix.

" + schedule_filename: "Edit the payment schedule file name" + schedule_filename_info: "Information

The payment shedules are generated as PDF files, named with the following prefix.

" + prefix: "Prefix" + example: "Example" + save: "Save" + update_success: "The settings were successfully updated" + vat_settings_modal: + title: "VAT settings" + update_success: "The VAT settings were successfully updated" + enable_VAT: "Enable VAT" + VAT_name: "VAT name" + VAT_name_help: "Some countries or regions may require that the VAT is named according to their specific local regulation" + VAT_rate: "VAT rate" + VAT_rate_help: "This parameter configures the general case of the VAT rate and applies to everything sold by the Fablab. It is possible to override this parameter by setting a specific VAT rate for each object." + advanced: "More rates" + hide_advanced: "Less rates" + show_history: "Show the changes history" + VAT_rate_machine: "Machine reservation" + VAT_rate_space: "Space reservation" + VAT_rate_training: "Training reservation" + VAT_rate_event: "Event reservation" + VAT_rate_subscription: "Subscription" + VAT_rate_product: "Products (store)" + multi_VAT_notice: "Please note: The current general rate is {RATE}%. You can define different VAT rates for each category.

For example, you can override this value, only for machine reservations, by filling in the corresponding field beside. If you don't fill any value, the general rate will apply." + save: "Save" + setting_history_modal: + title: "Changes history" + no_history: "No changes for now." + setting: "Setting" + value: "Value" + date: "Changed at" + operator: "By" + editorial_block_form: + content: "Content" + content_is_required: "You must provide a content. If you wish to disable the banner, toggle the switch above this field." + label_is_required: "You must provide a label. If you wish to disable the button, toggle the switch above this field." + url_is_required: "You must provide a link for your button." + url_must_be_safe: "The button link should start with http://... or https://..." + title: "Banner" + switch: "Display the banner" + cta_switch: "Display a button" + cta_label: "Button label" + cta_url: "Button link" + reservation_contexts: + name: "Name" + applicable_on: "Applicable on" + machine: Machine + training: Training + space: Space diff --git a/config/locales/app.logged.sv.yml b/config/locales/app.logged.sv.yml new file mode 100644 index 000000000..9581ae602 --- /dev/null +++ b/config/locales/app.logged.sv.yml @@ -0,0 +1,355 @@ +sv: + app: + logged: + #user's profile completion page when logging from an SSO provider + profile_completion: + confirm_your_new_account: "Confirm your new account" + or: "or" + do_you_already_have_an_account: "Do you already have an account?" + do_not_fill_the_form_beside_but_specify_here_the_code_you_ve_received_by_email_to_recover_your_access: "Do not fill the form beside but specify here the code you've received by email, to recover your access." + just_specify_code_here_to_recover_access: "Just specify here the code you've received by email to recover your access." + i_did_not_receive_the_code: "I didn't receive the code" + authentification_code: "Authentification code" + confirm_my_code: "Confirm my code" + an_unexpected_error_occurred_check_your_authentication_code: "An unexpected error occurred, please check your authentication code." + send_code_again: "Send the code again" + email_address_associated_with_your_account: "Email address associated with your account" + email_is_required: "Email address is required" + email_format_is_incorrect: "Email format is incorrect" + code_successfully_sent_again: "Code successfully sent again" + used_for_statistics: "This data will be used for statistical purposes" + your_user_s_profile: "Your user's profile" + user_s_profile_is_required: "User's profile is required." + i_ve_read_and_i_accept_: "I've read and I accept" + _the_fablab_policy: "the FabLab policy" + your_profile_has_been_successfully_updated: "Your profile has been successfully updated." + completion_header_info: + rules_changed: "Please fill the following form to update your profile and continue to use the platform." + sso_intro: "You've just created a new account on {GENDER, select, neutral{} other{the}} {NAME}, by logging from" + duplicate_email_info: "It looks like your email address is already used by another user. Check your email address and please input below the code you have received." + details_needed_info: "To finalize your account, we need some more details." + profile_form_option: + title: "New on this platform?" + please_fill: "Please fill in the following form to create your account." + disabled_data_from_sso: "Some data may have already been provided by {NAME} and cannot be modified." + confirm_instructions_html: "Once you are done, please click on Save to confirm your account and start using the application." + duplicate_email_html: "It looks like your email address ({EMAIL}) is already associated with another account. If this account is not yours, please click on the following button to change the email associated with your {PROVIDER} account." + edit_profile: "Change my data" + after_edition_info_html: "Once your data are up to date, click on the synchronization button below, or disconnect then reconnect for your changes to take effect." + sync_profile: "Sync my profile" + event_reservation_item: + event: "Event" + family: "Reserved for members" + nominative: "Nominative" + pre_registration: "Pre-registration" + NUMBER_normal_places_reserved: "{NUMBER} {NUMBER, plural, =0{} =1{normal place reserved} other{normal places reserved}}" + NUMBER_of_NAME_places_reserved: "{NUMBER} {NUMBER, plural, =0{} =1{of {NAME} place reserved} other{of {NAME} places reserved}}" + tracking_your_reservation: "Tracking your reservation" + in_the_process_of_validation: "In the process of validation" + settle_your_payment: "Come to the reception desk to settle" + paid: "Paid" + canceled: "Canceled" + registered: "Registered" + not_validated: "Not validated" + present: "Present" + dashboard: + #dashboard: public profile + profile: + empty: '' + #dashboard: edit my profile + settings: + last_activity_on_: "Last activity on {DATE}" + i_want_to_change_group: "I want to change group!" + your_subscription_expires_on_: "Your subscription expires on" + no_subscriptions: "No subscriptions" + i_want_to_subscribe: "I want to subscribe!" + to_come: "to come" + approved: "approved" + projects: "Projects" + no_projects: "No projects" + labels: "Labels" + no_labels: "No labels" + cookies: "Cookies" + cookies_accepted: "You have accepted cookies" + cookies_declined: "You have refused cookies" + cookies_unset: "You have not chosen yet" + reset_cookies: "Change my choice" + delete_my_account: "Delete my account" + edit_my_profile: "Edit my profile" + your_group_has_been_successfully_changed: "Your group has been successfully changed." + an_unexpected_error_prevented_your_group_from_being_changed: "An unexpected error prevented your group from being changed." + confirmation_required: "Confirmation required" + confirm_delete_your_account: "Do you really want to delete your account?" + all_data_will_be_lost: "All your data will be destroyed and won't be recoverable." + invoicing_data_kept: "According to regulation, all data related to your invoices will be kept separately for 10 years." + statistic_data_anonymized: "Some data (sex, date of birth, group) will be anonymized and kept for statistical purposes." + no_further_access_to_projects: "Your published projects will be anonymized and you won't get any further ability to edit them." + your_user_account_has_been_successfully_deleted_goodbye: "Your user account has been successfully deleted. Goodbye." + an_error_occured_preventing_your_account_from_being_deleted: "An error occurred, preventing your account from being deleted." + used_for_statistics: "This data will be used for statistical purposes" + used_for_invoicing: "This data will be used for billing purposes" + used_for_reservation: "This data will be used in case of change on one of your bookings" + used_for_profile: "This data will only be displayed on your profile" + used_for_pricing_stats: "This data will be used to determine the prices to which you are entitled, and for statistical purposes" + public_profile: "You will have a public profile and other users will be able to associate you in their projects" + trainings: "Trainings" + no_trainings: "No trainings" + subscription: "Subscription" + group: "Group" + or: "or" + confirm_changes: "Confirm changes" + change_my_data: "Change my data" + sync_my_profile: "Sync my profile" + once_your_data_are_up_to_date_: "Once your data are up to date," + _click_on_the_synchronization_button_opposite_: "click on the synchronization button opposite" + _disconnect_then_reconnect_: "disconnect then reconnect" + _for_your_changes_to_take_effect: "for your changes to take effect." + your_profile_has_been_successfully_updated: "Your profile has been successfully updated." + #dashboard: my projects + projects: + you_dont_have_any_projects: "You don't have any projects." + add_a_project: "Add a project" + author: "Author" + collaborator: "Collaborator" + rough_draft: "Draft" + description: "Description" + machines_and_materials: "Machines and materials" + machines: "Machines" + materials: "Materials" + collaborators: "Collaborators" + #dashboard: my trainings + trainings: + your_next_trainings: "Your next trainings" + your_previous_trainings: "Your previous trainings" + your_approved_trainings: "Your approved trainings" + no_trainings: "No trainings" + your_training_credits: "Your training credits" + subscribe_for_credits: "Subscribe to benefit from free trainings" + register_for_free: "Register for free to the following trainings:" + book_here: "Book here" + canceled: "Canceled" + #dashboard: my events + events: + your_next_events: "Your next events" + no_events_to_come: "No events to come" + your_previous_events: "Your previous events" + no_passed_events: "No passed events" + NUMBER_normal_places_reserved: "{NUMBER} {NUMBER, plural, =0{} =1{normal place reserved} other{normal places reserved}}" + NUMBER_of_NAME_places_reserved: "{NUMBER} {NUMBER, plural, =0{} =1{of {NAME} place reserved} other{of {NAME} places reserved}}" + #dashboard: my invoices + invoices: + reference_number: "Reference number" + date: "Date" + price: "Price" + download_the_invoice: "Download the invoice" + download_the_credit_note: "Download the refund invoice" + no_invoices_for_now: "No invoices for now." + payment_schedules_dashboard: + no_payment_schedules: "No payment schedules to display" + load_more: "Load more" + card_updated_success: "Your card was successfully updated" + supporting_documents_files: + file_successfully_uploaded: "The supporting documents were sent." + unable_to_upload: "Unable to send the supporting documents: " + supporting_documents_files: "Supporting documents" + my_documents_info: "Due to your group declaration, some supporting documents are required. Once submitted, these documents will be verified by the administrator." + upload_limits_alert_html: "Warning!
You can submit your documents as PDF or images (JPEG, PNG). Maximum allowed size: {SIZE} Mb" + file_size_error: "The file size exceeds the limit ({SIZE} MB)" + save: "Save" + browse: "Browse" + edit: "Edit" + reservations_dashboard: + machine_section_title: "Machines reservations" + space_section_title: "Spaces reservations" + reservations_panel: + title: "My reservations" + upcoming: "Upcoming" + date: "Date" + history: "History" + no_reservation: "No reservation" + show_more: "Show more" + cancelled_slot: "Cancelled" + reservations_panel_as_admin: + title: "Reservations" + credits_panel: + title: "My credits" + info: "Your subscription comes with free credits you can use when reserving" + remaining_credits_html: "You can book {REMAINING} {REMAINING, plural, one{slot} other{slots}} for free." + used_credits_html: "You have already used {USED} {USED, plural, =0{credit} one{credit} other{credits}}." + no_credits: "You don't have any credits yet. Some subscriptions may allow you to book some slots for free." + credits_panel_as_admin: + title: "Credits" + remaining_credits_html: "{REMAINING} {REMAINING, plural, one{slot} other{slots}} can be booked for free." + used_credits_html: " {USED} {USED, plural, =0{credit} one{credit} other{credits}} already used." + no_credits: "No credits yet." + prepaid_packs_panel: + title: "My prepaid packs" + name: "Prepaid pack name" + end: "Expiry date" + countdown: "Countdown" + history: "History" + consumed_hours: "{COUNT, plural, =1{1H consumed} other{{COUNT}H consumed}}" + cta_info: "You can buy prepaid hours packs to book machines and benefit from discounts. Choose a machine to buy a corresponding pack." + select_machine: "Select a machine" + cta_button: "Buy a pack" + no_packs: "No prepaid packs available for sale" + reserved_for_subscribers_html: 'The purchase of prepaid packs is reserved for subscribers.
Subscribe now to benefit.' + prepaid_packs_panel_as_admin: + title: "Prepaid packs" + #public profil of a member + members_show: + members_list: "Members list" + #list of members accepting to be contacted + members: + the_fablab_members: "The Fab Lab members" + display_more_members: "Display more members..." + no_members_for_now: "No members for now" + avatar: "Avatar" + user: "User" + pseudonym: "Pseudonym" + email_address: "Email address" + #add a new project + projects_new: + add_a_new_project: "Add a new project" + #modify an existing project + projects_edit: + edit_the_project: "Edit the project" + rough_draft: "Draft" + publish: "Publish" + #book a machine + machines_reserve: + machine_planning: "Machine planning" + i_ve_reserved: "I've reserved" + not_available: "Not available" + i_reserve: "I reserve" + i_shift: "I shift" + i_change: "I change" + do_you_really_want_to_cancel_this_reservation: "Do you really want to cancel this reservation?" + reservation_was_cancelled_successfully: "Reservation was cancelled successfully." + cancellation_failed: "Cancellation failed." + a_problem_occured_during_the_payment_process_please_try_again_later: "A problem occurred during the payment process. Please try again later." + #modal telling users that they must wait for their training validation before booking a machine + pending_training_modal: + machine_reservation: "Machine reservation" + wait_for_validated: "You must wait for your training is being validated by the FabLab team to book this machine." + training_will_occur_DATE_html: "Your training will occur at {DATE}" + DATE_TIME: "{DATE} {TIME}" + #modal telling users that they need to pass a training before booking a machine + required_training_modal: + to_book_MACHINE_requires_TRAINING_html: "To book the \"{MACHINE}\" you must have completed the training {TRAINING}." + training_or_training_html: " or the training " + enroll_now: "Enroll to the training" + no_enroll_for_now: "I don't want to enroll now" + close: "Close" + propose_packs_modal: + available_packs: "Prepaid packs available" + packs_proposed: "You can buy a prepaid pack of hours for this machine. These packs allows you to benefit from volume discounts." + no_thanks: "No, thanks" + pack_DURATION: "{DURATION} hours" + buy_this_pack: "Buy this pack" + pack_bought_success: "You have successfully bought this pack of prepaid-hours. Your invoice will ba available soon from your dashboard." + validity: "Usable for {COUNT} {PERIODS}" + period: + day: "{COUNT, plural, one{day} other{days}}" + week: "{COUNT, plural, one{week} other{weeks}}" + month: "{COUNT, plural, one{month} other{months}}" + year: "{COUNT, plural, one{year} other{years}}" + packs_summary: + prepaid_hours: "Prepaid hours" + remaining_HOURS: "You have {HOURS} prepaid hours remaining for this {ITEM, select, Machine{machine} Space{space} other{}}." + no_hours: "You don't have any prepaid hours for this {ITEM, select, Machine{machine} Space{space} other{}}." + buy_a_new_pack: "Buy a new pack" + unable_to_use_pack_for_subsription_is_expired: "You must have a valid subscription to use your remaining hours." + #book a training + trainings_reserve: + trainings_planning: "Trainings planning" + planning_of: "Planning of " #eg. Planning of 3d printer training + all_trainings: "All trainings" + cancel_my_selection: "Cancel my selection" + i_change: "I change" + i_shift: "I shift" + i_ve_reserved: "I've reserved" + #book a space + space_reserve: + planning_of_space_NAME: "Planning of the {NAME} space" + i_ve_reserved: "I've reserved" + i_shift: "I shift" + i_change: "I change" + notifications: + notifications_center: "Notifications center" + notifications_list: + notifications: "All notifications" + mark_all_as_read: "Mark all as read" + date: "Date" + notif_title: "Title" + no_new_notifications: "No new notifications." + archives: "Archives" + no_archived_notifications: "No archived notifications." + load_the_next_notifications: "Load the next notifications..." + notification_inline: + mark_as_read: "Mark as read" + notifications_center: + notifications_list: "All notifications" + notifications_settings: "My notifications preferences" + notifications_category: + enable_all: "Enable all" + disable_all: "Disable all" + notify_me_when: "I wish to be notified when" + users_accounts: "Concerning users notifications" + supporting_documents: "Concerning supporting documents notifications" + agenda: "Concerning agenda notifications" + subscriptions: "Concerning subscriptions notifications" + payments: "Concerning payment schedules notifications" + wallet: "Concerning wallet notifications" + shop: "Concerning shop notifications" + projects: "Concerning projects notifications" + accountings: "Concerning accounting notifications" + trainings: "Concerning trainings notifications" + app_management: "Concerning app management notifications" + notification_form: + notify_admin_when_user_is_created: "A user account has been created" + notify_admin_child_created: "A child has been created" + notify_admin_when_user_is_imported: "A user account has been imported" + notify_admin_profile_complete: "An imported account has completed its profile" + notify_admin_user_merged: "An imported account has been merged with an existing account" + notify_admins_role_update: "The role of a user has changed" + notify_admin_import_complete: "An import is done" + notify_admin_user_group_changed: "A user has changed his group" + notify_admin_user_supporting_document_refusal: "A supporting document has been rejected" + notify_admin_user_child_supporting_document_refusal: "A supporting document of child has been rejected" + notify_admin_user_supporting_document_files_created: "A user has uploaded a supporting document" + notify_admin_user_supporting_document_files_updated: "A user has updated a supporting document" + notify_admin_user_child_supporting_document_files_created: "A child has uploaded a supporting document" + notify_admin_user_child_supporting_document_files_updated: "A child has updated a supporting document" + notify_admin_member_create_reservation: "A member books a reservation" + notify_admin_slot_is_modified: "A reservation slot has been modified" + notify_admin_slot_is_canceled: "A reservation has been cancelled" + notify_admin_reservation_validated: "A reservation has been validated" + notify_admin_reservation_invalidated: "A reservation has been invalidated" + notify_admin_member_pre_booked_reservation: "A pre-booking has been made" + notify_admin_subscribed_plan: "A subscription has been purchased" + notify_admin_subscription_will_expire_in_7_days: "A member subscription expires in 7 days" + notify_admin_subscription_is_expired: "A member subscription has expired" + notify_admin_subscription_extended: "A subscription has been extended" + notify_admin_subscription_canceled: "A member subscription has been cancelled" + notify_admin_payment_schedule_failed: "Card debit failure" + notify_admin_payment_schedule_check_deadline: "A check has to be cashed" + notify_admin_payment_schedule_transfer_deadline: "A bank direct debit has to be confirmed" + notify_admin_payment_schedule_error: "An unexpected error occurred during the card debit" + notify_admin_refund_created: "A refund has been created" + notify_admin_user_wallet_is_credited: "The wallet of an user has been credited" + notify_user_order_is_ready: "Your command is ready" + notify_user_order_is_canceled: "Your command was canceled" + notify_user_order_is_refunded: "Your command was refunded" + notify_admin_low_stock_threshold: "The stock is low" + notify_admin_when_project_published: "A project has been published" + notify_admin_abuse_reported: "An abusive content has been reported" + notify_admin_close_period_reminder: "The fiscal year is coming to an end" + notify_admin_archive_complete: "An accounting archive is ready" + notify_admin_training_auto_cancelled: "A training was automatically cancelled" + notify_admin_export_complete: "An export is available" + notify_user_when_invoice_ready: "An invoice is available" + notify_admin_payment_schedule_gateway_canceled: "A payment schedule has been canceled by the payment gateway" + notify_project_collaborator_to_valid: "You are invited to collaborate on a project" + notify_project_author_when_collaborator_valid: "A collaborator has accepted your invitation to join your project" + notify_admin_order_is_paid: "A new order has been placed" diff --git a/config/locales/app.public.sv.yml b/config/locales/app.public.sv.yml new file mode 100644 index 000000000..191c1eebd --- /dev/null +++ b/config/locales/app.public.sv.yml @@ -0,0 +1,615 @@ +sv: + app: + public: + #header and "about" page + common: + about_the_fablab: "About {GENDER, select, male{the} female{the} neutral{} other{the}} {NAME}" + return: "Return" + #cookies + cookies: + about_cookies: "This website uses cookies for audience measurement purposes." + learn_more: "Learn more" + accept: "Accept cookies" + decline: "Refuse" + #dashboard sections + dashboard: "Dashboard" + my_profile: "My Profile" + my_children: "My Children" + my_settings: "My Settings" + my_supporting_documents_files: "My supporting documents" + my_projects: "My Projects" + my_trainings: "My Trainings" + my_reservations: "My reservations" + my_events: "My Events" + my_invoices: "My Invoices" + my_payment_schedules: "My payment schedules" + my_orders: "My orders" + my_wallet: "My Wallet" + #contextual help + help: "Help" + #login/logout + sign_out: "Sign Out" + sign_up: "Sign Up" + sign_in: "Sign In" + #left menu + notifications: "Notifications" + admin: "Admin" + manager: "Manager" + reduce_panel: "Reduce panel" + #left menu (public) + home: "Home" + reserve_a_machine: "Reserve a Machine" + trainings_registrations: "Trainings registrations" + events_registrations: "Events registrations" + reserve_a_space: "Reserve a Space" + projects_gallery: "Projects gallery" + subscriptions: "Subscriptions" + public_calendar: "Calendar" + fablab_store: "Store" + #left menu (admin) + trainings_monitoring: "Trainings" + manage_the_calendar: "Calendar" + manage_the_users: "Users" + manage_the_invoices: "Invoices" + subscriptions_and_prices: "Subscriptions and Prices" + manage_the_events: "Events" + manage_the_machines: "Machines" + manage_the_store: "Store" + manage_the_spaces: "Spaces" + projects: "Projects" + statistics: "Statistics" + customization: "Customization" + open_api_clients: "OpenAPI clients" + #account creation modal + create_your_account: "Create your account" + man: "Man" + woman: "Woman" + gender_is_required: "Gender is required." + your_first_name: "Your first name" + first_name_is_required: "First name is required." + your_surname: "Your surname" + surname_is_required: "Surname is required." + your_pseudonym: "Your pseudonym" + pseudonym_is_required: "Pseudonym is required." + your_email_address: "Your e-mail address" + email_is_required: "E-mail address is required." + your_password: "Your password" + password_is_required: "Password is required." + password_is_too_short: "Password is too short (minimum 12 characters)" + password_is_too_weak: "Password is too weak:" + password_is_too_weak_explanations: "minimum 12 characters, at least one uppercase letter, one lowercase letter, one number and one special character" + type_your_password_again: "Type your password again" + password_confirmation_is_required: "Password confirmation is required." + password_does_not_match_with_confirmation: "Password does not match with confirmation." + i_am_an_organization: "I am an organization" + name_of_your_organization: "Name of your organization" + organization_name_is_required: "Organization name is required." + address_of_your_organization: "Address of your organization" + organization_address_is_required: "Organization address is required." + your_user_s_profile: "Your user's profile" + user_s_profile_is_required: "User's profile is required." + birth_date: "Birth date" + birth_date_is_required: "Birth date is required." + phone_number: "Phone number" + phone_number_is_required: "Phone number is required." + address: "Address" + address_is_required: "Address is required" + i_authorize_Fablab_users_registered_on_the_site_to_contact_me: "I agree to share my email address with registered users of the site" + i_accept_to_receive_information_from_the_fablab: "I accept to receive information from the FabLab" + i_ve_read_and_i_accept_: "I've read and I accept" + _the_fablab_policy: "the terms of use" + field_required: "Field required" + profile_custom_field_is_required: "{FEILD} is required" + user_supporting_documents_required: "Warning!
You have declared to be \"{GROUP}\", supporting documents may be requested." + unexpected_error_occurred: "An unexpected error occurred. Please try again later." + used_for_statistics: "This data will be used for statistical purposes" + used_for_invoicing: "This data will be used for billing purposes" + used_for_reservation: "This data will be used in case of change on one of your bookings" + used_for_profile: "This data will only be displayed on your profile" + public_profile: "You will have a public profile and other users will be able to associate you in their projects" + you_will_receive_confirmation_instructions_by_email_detailed: "If your e-mail address is valid, you will receive an email with instructions about how to confirm your account in a few minutes." + #password modification modal + change_your_password: "Change your password" + your_new_password: "Your new password" + your_password_was_successfully_changed: "Your password was successfully changed." + #connection modal + connection: "Connection" + password_forgotten: "Forgotten password?" + confirm_my_account: "Confirm my e-mail" + not_registered_to_the_fablab: "Not yet registered?" + create_an_account: "Create an account" + wrong_email_or_password: "Wrong e-mail or password." + caps_lock_is_on: "Caps lock key is on." + #confirmation modal + you_will_receive_confirmation_instructions_by_email: "You will receive confirmation instructions by email." + #forgotten password modal + you_will_receive_in_a_moment_an_email_with_instructions_to_reset_your_password: "If your e-mail address is valid, you will receive in a moment an e-mail with instructions to reset your password." + #Fab-manager's version + version: "Version:" + upgrade_fabmanager: "Upgrade Fab-manager" + current_version: "You are currently using version {VERSION} of Fab-manager." + upgrade_to: "A new release is available. You can upgrade up to version {VERSION}." + read_more: "View the details of this release" + security_version_html: "Your current version is vulnerable!
A later version, currently available, includes security fixes. Upgrade as soon as possible!" + how_to: "How to upgrade?" + #Notifications + and_NUMBER_other_notifications: "and {NUMBER, plural, =0{no other notifications} =1{one other notification} other{{NUMBER} other notifications}}..." + #about page + about: + read_the_fablab_policy: "Terms of use" + read_the_fablab_s_general_terms_and_conditions: "Read the general terms and conditions" + your_fablab_s_contacts: "Contact us" + privacy_policy: "Privacy policy" + #'privacy policy' page + privacy: + title: "Privacy policy" + dpo: "Data protection officer" + last_update: "Last update," + #home page + home: + latest_documented_projects: "The latest documented projects" + follow_us: "Follow us" + latest_tweets: "The latest tweets" + latest_registered_members: "Latest registered members" + create_an_account: "Create an account" + discover_members: "Discover members" + #next events summary on the home page + fablab_s_next_events: "Next events" + every_events: "Every events" + event_card: + on_the_date: "On the {DATE}" + from_date_to_date: "From {START} to {END}" + from_time_to_time: "From {START} to {END}" + all_day: "All day" + still_available: "Available place(s): " + event_full: "Event full" + without_reservation: "Without reservation" + free_admission: "Free admission" + full_price: "Full price: " + #projects gallery + projects_list: + filter: Filter + the_fablab_projects: "The projects" + add_a_project: "Add a project" + network_search: "Fab-manager network" + tooltip_openlab_projects_switch: "The search over the whole network lets you search over the projects of every Fab-manager using this feature !" + openlab_search_not_available_at_the_moment: "Search over the whole network is not available at the moment. You still can search over the projects of this platform." + project_search_result_is_empty: "Sorry, we found no results matching your search criteria." + reset_all_filters: "Clear all" + keywords: "Keywords" + all_projects: "All projects" + my_projects: "My projects" + projects_to_whom_i_take_part_in: "Projects to whom I take part in" + all_machines: "All machines" + all_themes: "All themes" + all_materials: "All materials" + load_next_projects: "Load next projects" + rough_draft: "Rough draft" + filter_by_member: "Filter by member" + created_from: Created from + created_to: Created to + download_archive: Download + status_filter: + all_statuses: "All statuses" + select_status: "Select a status" + #details of a projet + projects_show: + rough_draft: "Draft" + project_description: "Project description" + by_name: "By {NAME}" + step_N: "Step {INDEX}" + share_on_facebook: "Share on Facebook" + share_on_twitter: "Share on Twitter" + deleted_user: "Deleted user" + posted_on_: "Posted on" + CAD_file_to_download: "{COUNT, plural, =0{No CAD files} =1{CAD file to download} other{CAD files to download}}" + machines_and_materials: "Machines and materials" + collaborators: "Collaborators" + licence: "Licence" + confirmation_required: "Confirmation required" + report_an_abuse: "Report an abuse" + unauthorized_operation: "Unauthorized operation" + your_report_was_successful_thanks: "Your report was successful. Thank you." + an_error_occured_while_sending_your_report: "An error occurred while sending your report." + your_first_name: "Your first name" + your_first_name_is_required: "Your first name is required." + your_surname: "Your surname" + your_surname_is_required: "Your surname is required." + your_email_address: "Your email address" + your_email_address_is_required: "Your email address is required." + tell_us_why_this_looks_abusive: "Tell us why this looks abusive" + message_is_required: "Message is required." + report: "Report" + do_you_really_want_to_delete_this_project: "Do you really want to delete this project?" + status: "Status" + markdown_file: "Markdown file" + #list of machines + machines_list: + the_fablab_s_machines: "The machines" + add_a_machine: "Add a machine" + new_availability: "Open reservations" + book: "Book" + _or_the_: " or the " + store_ad: + title: "Discover our store" + buy: "Check out products from members' projects along with consumable related to the different machines and tools of the workshop." + sell: "If you also want to sell your creations, please let us know." + link: "To the store" + machines_filters: + show_machines: "Show machines:" + status_enabled: "Enabled" + status_disabled: "Disabled" + status_all: "All" + filter_by_machine_category: "Filter by category:" + all_machines: "All machines" + machine_card: + book: "Book" + consult: "Consult" + #details of a machine + machines_show: + book_this_machine: "Book this machine" + technical_specifications: "Technical specifications" + files_to_download: "Files to download" + projects_using_the_machine: "Projects using the machine" + _or_the_: " or the " + confirmation_required: "Confirmation required" + do_you_really_want_to_delete_this_machine: "Do you really want to delete this machine?" + unauthorized_operation: "Unauthorized operation" + the_machine_cant_be_deleted_because_it_is_already_reserved_by_some_users: "The machine can't be deleted because it's already reserved by some users." + #list of trainings + trainings_list: + book: "Book" + the_trainings: "The trainings" + #details of a training + training_show: + book_this_training: "Book this training" + do_you_really_want_to_delete_this_training: "Do you really want to delete this training?" + unauthorized_operation: "Unauthorized operation" + confirmation_required: "Confirmation required" + the_training_cant_be_deleted_because_it_is_already_reserved_by_some_users: "The training can't be deleted because it's already reserved by some users." + plan_card: + AMOUNT_per_month: "{AMOUNT} / month" + i_subscribe_online: "I subscribe online" + more_information: "More information" + i_choose_that_plan: "I choose that plan" + i_already_subscribed: "I already subscribed" + #summary of the subscriptions + plans: + subscriptions: "Subscriptions" + your_subscription_expires_on_the_DATE: "Your subscription expires on the {DATE}" + no_plans: "No plans are available for your group" + my_group: "My group" + his_group: "User's group" + he_wants_to_change_group: "Change group" + change_my_group: "Validate group change" + summary: "Summary" + your_subscription_has_expired_on_the_DATE: "Your subscription has expired on the {DATE}" + subscription_price: "Subscription price" + you_ve_just_payed_the_subscription_html: "You've just paid the subscription:" + thank_you_your_subscription_is_successful: "Thank you. Your subscription is successful!" + your_invoice_will_be_available_soon_from_your_dashboard: "Your invoice will be available soon from your dashboard" + your_group_was_successfully_changed: "Your group was successfully changed." + the_user_s_group_was_successfully_changed: "The user's group was successfully changed." + an_error_prevented_your_group_from_being_changed: "An error prevented your group from being changed." + an_error_prevented_to_change_the_user_s_group: "An error prevented to change the user's group." + plans_filter: + i_am: "I am" + select_group: "select a group" + i_want_duration: "I want to subscribe for" + all_durations: "All durations" + select_duration: "select a duration" + #Fablab's events list + events_list: + the_fablab_s_events: "The events" + all_categories: "All categories" + for_all: "For all" + sold_out: "Sold Out" + cancelled: "Cancelled" + free_admission: "Free admission" + still_available: "available place(s)" + without_reservation: "Without reservation" + add_an_event: "Add an event" + load_the_next_events: "Load the next events..." + full_price_: "Full price:" + to_date: "to" #e.g. from 01/01 to 01/05 + all_themes: "All themes" + #details and booking of an event + events_show: + event_description: "Event description" + downloadable_documents: "Downloadable documents" + information_and_booking: "Information and booking" + event_type: + family: "Event reserved for members" + nominative: "Nominative event" + dates: "Dates" + beginning: "Beginning:" + ending: "Ending:" + opening_hours: "Opening hours:" + all_day: "All day" + from_time: "From" #e.g. from 18:00 to 21:00 + to_time: "to" #e.g. from 18:00 to 21:00 + full_price_: "Full price:" + tickets_still_availables: "Tickets still available:" + sold_out: "Sold out." + without_reservation: "Without reservation" + cancelled: "Cancelled" + ticket: "{NUMBER, plural, one{ticket} other{tickets}}" + make_a_gift_of_this_reservation: "Make a gift of this reservation" + thank_you_your_payment_has_been_successfully_registered: "Thank you. Your payment has been successfully registered!" + thank_you_your_pre_registration_has_been_successfully_saved: "Thank you. Your pre-registration has been successfully saved!" + you_can_find_your_reservation_s_details_on_your_: "You can find your reservation's details on your" + informed_by_email_your_pre_registration: "You will be kept informed by email of the progress made regarding your pre-registration." + dashboard: "dashboard" + you_booked_DATE: "You booked ({DATE}):" + you_pre_booked_DATE: "Your pre-registration ({DATE}):" + canceled_reservation_SEATS: "Reservation canceled ({SEATS} seats)" + book: "Book" + confirm_and_pay: "Confirm and pay" + confirm_payment_of_html: "{ROLE, select, admin{Cash} other{Pay}}: {AMOUNT}" #(contexte : validate a payment of $20,00) + online_payment_disabled: "Payment by credit card is not available. Please contact us directly." + please_select_a_member_first: "Please select a member first" + change_the_reservation: "Change the reservation" + you_can_shift_this_reservation_on_the_following_slots: "You can shift this reservation on the following slots:" + confirmation_required: "Confirmation required" + do_you_really_want_to_delete_this_event: "Do you really want to delete this event?" + all_reservations_for_this_event_will_be_canceled: All reservations for this event will be canceled. + delete_recurring_event: "You're about to delete a periodic event. What do you want to do?" + delete_this_event: "Only this event" + delete_this_and_next: "This event and the following" + delete_all: "All events" + event_successfully_deleted: "Event successfully deleted." + events_deleted: "The event, and {COUNT, plural, =1{one other} other{{COUNT} others}}, have been deleted" + unable_to_delete_the_event: "Unable to delete the event, it may be booked by a member" + events_not_deleted: "On {TOTAL} events, {COUNT, plural, =1{one was not deleted} other{{COUNT} were not deleted}}. Some reservations may exists on {COUNT, plural, =1{it} other{them}}." + cancel_the_reservation: "Cancel the reservation" + do_you_really_want_to_cancel_this_reservation_this_apply_to_all_booked_tickets: "Do you really want to cancel this reservation? This apply to ALL booked tickets." + reservation_was_successfully_cancelled: "Reservation was successfully cancelled." + cancellation_failed: "Cancellation failed." + event_is_over: "The event is over." + thanks_for_coming: "Thanks for coming!" + view_event_list: "View events to come" + share_on_facebook: "Share on Facebook" + share_on_twitter: "Share on Twitter" + last_name_and_first_name: "Last name and first name" + pre_book: "Pre-book" + pre_registration_end_date: "Deadline for pre-registration" + pre_registration: "Pre-registration" + #public calendar + calendar: + calendar: "Calendar" + show_unavailables: "Show unavailable slots" + filter_calendar: "Filter calendar" + trainings: "Trainings" + machines: "Machines" + spaces: "Spaces" + events: "Events" + externals: "Other calendars" + choose_a_machine: "Choose a machine" + cancel: "Cancel" + #list of spaces + spaces_list: + the_spaces: "The spaces" + new_availability: "Open reservations" + add_a_space: "Add a space" + status_enabled: "Enabled" + status_disabled: "Disabled" + status_all: "All" + book: "Book" + #display the details of a space + space_show: + book_this_space: "Book this space" + unauthorized_operation: "Unauthorized operation" + confirmation_required: "Confirmation required" + do_you_really_want_to_delete_this_space: "Do you really want to delete this space?" + the_space_cant_be_deleted_because_it_is_already_reserved_by_some_users: "Unable to delete this space, because it is already reserved by some users." + characteristics: "Characteristics" + files_to_download: "Files to download" + projects_using_the_space: "Projects using the space" + #public store + store: + fablab_store: "Store" + unexpected_error_occurred: "An unexpected error occurred. Please try again later." + add_to_cart_success: "Product added to the cart." + products: + all_products: "All the products" + filter: "Filter" + filter_clear: "Clear all" + filter_apply: "Apply" + filter_categories: "Categories" + filter_machines: "By machines" + filter_keywords_reference: "By keywords or reference" + in_stock_only: "Available products only" + sort: + name_az: "A-Z" + name_za: "Z-A" + price_low: "Price: low to high" + price_high: "Price: high to low" + store_product: + ref: "ref: {REF}" + add_to_cart_success: "Product added to the cart." + unexpected_error_occurred: "An unexpected error occurred. Please try again later." + show_more: "Display more" + show_less: "Display less" + documentation: "Documentation" + minimum_purchase: "Minimum purchase: " + add_to_cart: "Add to cart" + stock_limit: "You have reached the current stock limit" + stock_status: + available: "Available" + limited_stock: "Limited stock" + out_of_stock: "Out of stock" + store_product_item: + minimum_purchase: "Minimum purchase: " + add: "Add" + add_to_cart: "Add to cart" + stock_limit: "You have reached the current stock limit" + product_price: + per_unit: "/ unit" + free: "Free" + cart: + my_cart: "My Cart" + cart_button: + my_cart: "My Cart" + store_cart: + checkout: "Checkout" + cart_is_empty: "Your cart is empty" + pickup: "Pickup your products" + checkout_header: "Total amount for your cart" + checkout_products_COUNT: "Your cart contains {COUNT} {COUNT, plural, =1{product} other{products}}" + checkout_products_total: "Products total" + checkout_gift_total: "Discount total" + checkout_coupon: "Coupon" + checkout_total: "Cart total" + checkout_error: "An unexpected error occurred. Please contact the administrator." + checkout_success: "Purchase confirmed. Thanks!" + select_user: "Please select a user before continuing." + abstract_item: + offer_product: "Offer the product" + total: "Total" + errors: + unauthorized_offering_product: "You can't offer anything to yourself" + cart_order_product: + reference_short: "ref:" + minimum_purchase: "Minimum purchase: " + stock_limit: "You have reached the current stock limit" + unit: "Unit" + update_item: "Update" + errors: + product_not_found: "This product is no longer available, please remove it from your cart." + out_of_stock: "This product is out of stock, please remove it from your cart." + stock_limit_QUANTITY: "Only {QUANTITY} {QUANTITY, plural, =1{unit} other{units}} left in stock, please adjust the quantity of items." + quantity_min_QUANTITY: "Minimum number of product was changed to {QUANTITY}, please adjust the quantity of items." + price_changed_PRICE: "The product price was modified to {PRICE}" + cart_order_reservation: + reservation: "Reservation" + offer_reservation: "Offer the reservation" + slot: "{DATE}: {START} - {END}" + offered: "offered" + orders_dashboard: + heading: "My orders" + sort: + newest: "Newest first" + oldest: "Oldest first" + member_select: + select_a_member: "Select a member" + start_typing: "Start typing..." + children_dashboard: + heading: "Children" + member_heading: "My Children" + add_child: "Add a child" + child_modal: + edit_child: "Edit child" + new_child: "New child" + child_form: + child_form_info: "Only children under 18 years old can be added to your Family account. Supporting documents may be requested to validate your child's account and allow you to register them for events." + first_name: "First name" + last_name: "Last name" + birthday: "Birthday" + email: "Email" + phone: "Phone" + save: "Save" + supporting_documents: "Supporting documents" + to_complete: "To complete" + refuse_documents_info: "You can refuse a selection of documents by clicking on the following button." + refuse_documents: "Refuse documents" + child_item: + first_name: "Child first name" + last_name: "Child last name" + birthday: "Birthday" + deleted: "The child has been deleted." + unable_to_delete: "Unable to delete the child." + delete_child_modal: + confirmation_required: "Confirmation required" + confirm: "Confirm" + confirm_delete_child: "Do you really want to remove this child?" + tour: + conclusion: + title: "Thank you for your attention" + content: "

If you want to restart this contextual help, press F1 at any time or click on « ? Help » from the user's menu.

If you need additional help, you can check the user guide (only in French for now).

The Fab-manager's team also provides personalized support (help with getting started, help with installation, customization, etc.), contact-us for more info.

" + welcome: + welcome: + title: "Welcome to Fab-manager" + content: "To help you get started with the application, we are going to take a quick tour of the features." + home: + title: "Home page" + content: "Clicking here will take you back to the home page where you are currently." + machines: + title: "Machines" + content: "

This page will allow you to consult the list of all machines and reserve a slot on behalf of a member.

A machine can be, for example, a 3D printer.

Members can also access this page and reserve a machine themselves, if credit card payment is enabled, or if some prices are equal to 0.

" + trainings: + title: "Trainings" + content: "

This page will allow you to consult the list of all training sessions and to register a member for a training session.

Trainings can be set as prerequisites before allowing reservation of certain machines.

Members can also access this page and register for a training session themselves, if credit card payment is enabled, or if some prices are equal to 0.

" + spaces: + title: "Spaces" + content: "

This page will allow you to consult the list of all available spaces and to reserve a place on a slot, on behalf of a member.

A space can be, for example, a woodshop or a meeting room.

Their particularity is that they can be booked by several people at the same time.

Members can also access this page and reserve a machine themselves, if credit card payment is enabled, or if some prices are equal to 0.

" + events: + title: "Events" + content: "

An open house evening or an internship to make your desk lamp? It's over here!

Events can be free or paid (with different prices), with or without reservation.

Again, members can access this page and book themselves places for free events, or paid events if credit card payment is enabled.

" + calendar: + title: "Agenda" + content: "Visualize at a glance everything that is scheduled for the next coming weeks (events, training, machines available, etc.)." + projects: + title: "Projects" + content: "

Document and share all your creations with the community.

If you use OpenLab, you will also be able to consult the projects of the entire Fab-manager network. Contact-us to get your access, it's free!

" + plans: + title: "Subscriptions" + content: "Subscriptions provide a way to segment your prices and provide benefits to regular users." + admin: + title: "{ROLE} section" + content: "

All of the elements below are only accessible to administrators and managers. They allow you to manage and configure Fab-manager.

At the end of this visit, click on one of them to find out more.

" + about: + title: "About" + content: "A page that you can fully customize, to present your activity and your structure." + notifications: + title: "Notifications center" + content: "

Every time something important happens (reservations, creation of accounts, activity of your members, etc.), you will be notified here.

Your members also receive notifications there.

" + profile: + title: "User's menu" + content: "

Find your personal information here as well as all your activity on Fab-manager.

This space is also available for all your members.

" + news: + title: "News" + content: "

This space allows you to display the latest news from your structure.

You can easily change its content from « Customization », « Home page ».

" + last_projects: + title: "Last projects" + content: "

This carousel scrolls through the latest projects documented by your members.

" + last_tweet: + title: "Last tweet" + content: "

The last tweet of your Tweeter feed can be shown here.

Configure it from « Customization », « Home page ».

" + last_members: + title: "Last members" + content: "The last registered members who have validated their address and agreed to be contacted will be shown here." + next_events: + title: "Upcoming events" + content: "The next three scheduled events are displayed in this space." + customize: + title: "Customize the home page" + content: "

This page can be fully personalized.

You can contact-us to make a tailored customization of the home page.

" + version: + title: "Application version" + content: "Hover your cursor over this icon to find out the version of Fab-manager. If you are not up to date, this will be reported here and you'll be able to get details by clicking on it." + machines: + welcome: + title: "Machines" + content: "

Machines are the tools available for your users. You must create here the machines which can then be reserved by the members.

You can also create entries for non-bookable or free access machines, then you just need to not associate availability slots with them.

" + welcome_manager: + title: "Machines" + content: "Machines are the tools available for the users to reserve." + view: + title: "View" + content: "To modify or delete a machine, click here first. You will not be able to delete a machine that has already been associated with availability slots, but you can deactivate it." + reserve: + title: "Reserve" + content: "Click here to access an agenda showing free slots. This will let you book this machine for an user and manage existing reservations." + spaces: + welcome: + title: "Spaces" + content: "

Spaces are places available for your users. For example, a meeting room or a woodshop. You must create here the spaces which can then be reserved by members.

The specificity of the spaces is that they can be reserved by several users at the same time.

" + welcome_manager: + title: "Spaces" + content: "

Spaces are places available to users, by reservation. For example, a meeting room or a woodshop.

The specificity of the spaces is that they can be reserved by several users at the same time.

" + view: + title: "View" + content: "To modify or delete a space, click here first. You will not be able to delete a space that has already been associated with availability slots, but you can deactivate it." + reserve: + title: "Reserve" + content: "Click here to access an agenda showing free slots. This will let you book this space for an user and manage existing reservations." diff --git a/config/locales/app.shared.sv.yml b/config/locales/app.shared.sv.yml new file mode 100644 index 000000000..16f56c173 --- /dev/null +++ b/config/locales/app.shared.sv.yml @@ -0,0 +1,555 @@ +sv: + app: + shared: + #translations of common buttons + buttons: + confirm_changes: "Confirm changes" + consult: "Consult" + edit: "Edit" + change: "Change" + delete: "Delete" + browse: "Browse" + cancel: "Cancel" + close: "Close" + clear: "Clear" + today: "Today" + confirm: "Confirm" + save: "Save" + "yes": "Yes" + "no": "No" + apply: "Apply" + messages: + you_will_lose_any_unsaved_modification_if_you_quit_this_page: "You will lose any unsaved modification if you quit this page" + you_will_lose_any_unsaved_modification_if_you_reload_this_page: "You will lose any unsaved modification if you reload this page" + payment_card_declined: "Your card was declined." + change_group: + title: "{OPERATOR, select, self{My group} other{User's group}}" + change: "Change {OPERATOR, select, self{my} other{his}} group" + cancel: "Cancel" + validate: "Validate group change" + success: "Group successfully changed" + stripe_form: + payment_card_error: "A problem occurred with your payment card:" + #text editor + text_editor: + fab_text_editor: + text_placeholder: "Type something…" + menu_bar: + link_placeholder: "Paste link…" + url_placeholder: "Paste url…" + new_tab: "Open in a new tab" + add_link: "Insert a link" + add_video: "Embed a video" + add_image: "Insert an image" + #modal dialog + fab_modal: + close: "Close" + fab_socials: + follow_us: "Follow us" + networks_update_success: "Social networks update successful" + networks_update_error: "Problem trying to update social networks" + url_placeholder: "Paste url…" + save: "Save" + website_invalid: "The website address is not a valid URL" + edit_socials: + url_placeholder: "Paste url…" + website_invalid: "The website address is not a valid URL" + #user edition form + avatar_input: + add_an_avatar: "Add an avatar" + change: "Change" + user_profile_form: + personal_data: "Personal" + account_data: "Account" + account_networks: "Social networks" + organization_data: "Organization" + profile_data: "Profile" + preferences_data: "Preferences" + declare_organization: "I declare to be an organization" + declare_organization_help: "If you declare to be an organization, your invoices will be issued in the name of the organization." + pseudonym: "Nickname" + external_id: "External identifier" + first_name: "First name" + surname: "Surname" + email_address: "Email address" + organization_name: "Organization name" + organization_address: "Organization address" + profile_custom_field_is_required: "{FEILD} is required" + date_of_birth: "Date of birth" + website: "Website" + website_invalid: "The website address is not a valid URL" + job: "Job" + interests: "Interests" + CAD_softwares_mastered: "CAD Softwares mastered" + birthday: "Date of birth" + birthday_is_required: "Date of birth is required." + address: "Address" + phone_number: "Phone number" + phone_number_invalid: "Phone number is invalid." + allow_public_profile: "I agree to share my email address with registered users of the site" + allow_public_profile_help: "You will have a public profile and other users will be able to associate you in their projects." + allow_newsletter: "I accept to receive information from the FabLab" + used_for_statistics: "This data will be used for statistical purposes" + used_for_invoicing: "This data will be used for billing purposes" + used_for_reservation: "This data will be used in case of change on one of your bookings" + used_for_profile: "This data will only be displayed on your profile" + group: "Group" + trainings: "Trainings" + tags: "Tags" + note: "Private note" + note_help: "This note is only visible to administrators and managers. The member cannot see it." + terms_and_conditions_html: "I've read and accept the terms and conditions" + must_accept_terms: "You must accept the terms and conditions" + save: "Save" + gender_input: + label: "Gender" + man: "Man" + woman: "Woman" + change_password: + change_my_password: "Change my password" + confirm_current: "Confirm your current password" + confirm: "OK" + wrong_password: "Wrong password" + password_input: + new_password: "New password" + confirm_password: "Confirm password" + help: "Your password must be minimum 12 characters long, have at least one uppercase letter, one lowercase letter, one number and one special character." + password_too_short: "Password is too short (must be at least 12 characters)" + confirmation_mismatch: "Confirmation mismatch with password." + password_strength: + not_in_requirements: "Your password doesn't meet the minimal requirements" + 0: "Very weak password" + 1: "Weak password" + 2: "Almost ok" + 3: "Good password" + 4: "Excellent password" + #project edition form + project: + name: "Name" + name_is_required: "Name is required." + illustration: "Visual" + illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio)." + add_an_illustration: "Add an illustration" + CAD_file: "CAD file" + CAD_files: "CAD files" + allowed_extensions: "Allowed extensions:" + add_a_new_file: "Add a new file" + description: "Description" + description_is_required: "Description is required." + steps: "Steps" + step_N: "Step {INDEX}" + step_title: "Step title" + step_image: "Image" + add_a_picture: "Add a picture" + change_the_picture: "Change the picture" + delete_the_step: "Delete the step" + confirmation_required: "Confirmation required" + do_you_really_want_to_delete_this_step: "Do you really want to delete this step?" + add_a_new_step: "Add a new step" + publish_your_project: "Publish your project" + or: "or" + employed_materials: "Employed materials" + employed_machines: "Employed machines" + collaborators: "Collaborators" + author: Author + creative_commons_licences: "Creative Commons licences" + licence: "Licence" + themes: "Themes" + tags: "Tags" + save_as_draft: "Save as draft" + status: "Status" + #button to book a machine reservation + reserve_button: + book_this_machine: "Book this machine" + #frame to select a plan to subscribe + plan_subscribe: + subscribe_online: "subscribe online" + do_not_subscribe: "do not subscribe" + #admin: choose a member to interact with + member_select: + select_a_member: "Select a member" + start_typing: "Start typing..." + member_not_validated: "This member has not yet been validated." + #payment modal + abstract_payment_modal: + online_payment: "Online payment" + i_have_read_and_accept_: "I have read, and accept " + _the_general_terms_and_conditions: "the general terms and conditions." + payment_schedule_html: "

You're about to subscribe to a payment schedule of {DEADLINES} months.

By paying this bill, you agree to send instructions to the financial institution that issue your card, to take payments from your card account, for the whole duration of this subscription. This imply that your card data are saved by {GATEWAY} and a series of payments will be initiated on your behalf, conforming to the payment schedule previously shown.

" + confirm_payment_of_: "Pay: {AMOUNT}" + validate: "Validate" + #dialog of on site payment for reservations + valid_reservation_modal: + booking_confirmation: "Booking confirmation" + here_is_the_summary_of_the_slots_to_book_for_the_current_user: "Here is the summary of the slots to book for the current user:" + subscription_confirmation: "Subscription confirmation" + here_is_the_subscription_summary: "Here is the subscription summary:" + payment_method: "Payment method" + method_card: "Online by card" + method_check: "By check" + card_collection_info: "By validating, you'll be prompted for the member's card number. This card will be automatically charged at the deadlines." + check_collection_info: "By validating, you confirm that you have {DEADLINES} checks, allowing you to collect all the monthly payments." + #partial form to edit/create a user (admin view) + user_admin: + user: "User" + incomplete_profile: "Incomplete profile" + user_profile: "User profile" + warning_incomplete_user_profile_probably_imported_from_sso: "Warning: This user's profile is incomplete. As \"single sign-on\" (SSO) authentication is currently enabled, it may probably be an imported but non merged account. Do not modify it unless you know what your doing." + group: "Group" + group_is_required: "Group is required." + trainings: "Trainings" + tags: "Tags" + children: "Children" + #machine/training slot modification modal + confirm_modify_slot_modal: + change_the_slot: "Change the slot" + do_you_want_to_change_your_booking_slot_initially_planned_at: "Do you want to change your booking slot, initially planned at:" + do_you_want_to_change_NAME_s_booking_slot_initially_planned_at: "Do you want to change {NAME}'s booking slot, initially planned at:" + cancel_this_reservation: "Cancel this reservation" + i_want_to_change_date: "I want to change date" + deleted_user: "deleted user" + #user public profile + public_profile: + last_activity_html: "Last activity
on {DATE}" + to_come: "to come" + approved: "approved" + projects: "Projects" + no_projects: "No projects" + author: "Author" + collaborator: "Collaborator" + private_profile: "Private profile" + interests: "Interests" + CAD_softwares_mastered: "CAD softwares mastered" + email_address: "Email address" + trainings: "Trainings" + no_trainings: "No trainings" + #wallet + wallet: + wallet: 'Wallet' + your_wallet_amount: 'Your amount available' + wallet_amount: 'Amount available' + no_transactions_for_now: 'No transactions for now' + date: "Date" + operation: 'Operation' + operator: 'Operator' + amount: 'Amount' + credit: 'Credit' + debit: 'Debit' + credit_title: 'Credit wallet' + credit_label: 'Set the amount to be credited' + confirm_credit_label: 'Confirm the amount to be credited' + generate_a_refund_invoice: "Generate a refund invoice" + description_optional: "Description (optional):" + will_appear_on_the_refund_invoice: "Will appear on the refund invoice." + to_credit: 'Credit' + wallet_credit_successfully: "Wallet of user is credited successfully." + a_problem_occurred_for_wallet_credit: "A problem is occurred while taking the credit of wallet." + amount_is_required: "The amount is required." + amount_minimum_1: "The amount minimum is 1" + amount_confirm_is_required: "The amount confirmation is required." + amount_confirm_does_not_match: "The amount confirmation does not match." + debit_subscription: "Pay for a subscription" + debit_reservation_training: "Pay for a training reservation" + debit_reservation_machine: "Pay for a machine reservation" + debit_reservation_event: "Pay for an event reservation" + warning_uneditable_credit: "Warning: once validated, the credited amount won't be editable anymore." + wallet_info: + you_have_AMOUNT_in_wallet: "You have {AMOUNT} on your wallet" + wallet_pay_ITEM: "You pay your {ITEM} directly." + item_reservation: "reservation" + item_subscription: "subscription" + item_first_deadline: "first deadline" + item_other: "purchase" + credit_AMOUNT_for_pay_ITEM: "You still have {AMOUNT} to pay to validate your {ITEM}." + client_have_AMOUNT_in_wallet: "The member has {AMOUNT} on his wallet" + client_wallet_pay_ITEM: "The member can directly pay his {ITEM}." + client_credit_AMOUNT_for_pay_ITEM: "{AMOUNT} are remaining to pay to validate the {ITEM}" + other_deadlines_no_wallet: "Warning: the remaining wallet balance cannot be used for the next deadlines." + #coupon (promotional) (creation/edition form) + coupon: + name: "Name" + name_is_required: "Name is required." + code: "Code" + code_is_required: "Code is required." + code_must_be_composed_of_capital_letters_digits_and_or_dashes: "The code must be composed of capital letters, digits and/or dashes." + kind_of_coupon: "Kind of coupon" + percentage: "Percentage" + amount: "Amount" + amount_off: "Amount off" + percent_off: "Percentage off" + percent_off_is_required: "Percentage off is required." + percentage_must_be_between_0_and_100: "Percentage must be between 0 and 100." + validity_per_user: "Validity per user" + once: "Just once" + forever: "Each use" + warn_validity_once: "Please note that when this coupon will be used with a payment schedule, the discount will be applied to the first deadline only." + warn_validity_forever: "Please note that when this coupon will be used with a payment schedule, the discount will be applied to each deadlines." + validity_per_user_is_required: "Validity per user is required." + valid_until: "Valid until (included)" + leave_empty_for_no_limit: "Do not specify any limit by leaving the field empty." + max_usages: "Maximum usages allowed" + max_usages_must_be_equal_or_greater_than_0: "The maximum usages allowed must be greater than 0." + enabled: "Active" + #coupon (input zone for users) + coupon_input: + i_have_a_coupon: "I have a coupon!" + code_: "Code:" + the_coupon_has_been_applied_you_get_PERCENT_discount: "The coupon has been applied. You get a {PERCENT}% discount." + the_coupon_has_been_applied_you_get_AMOUNT_CURRENCY: "The coupon has been applied. You get a discount of {AMOUNT} {CURRENCY}." + coupon_validity_once: "This coupon is valid only once. In case of payment schedule, only for the first deadline." + unable_to_apply_the_coupon_because_disabled: "Unable to apply the coupon: this code was disabled." + unable_to_apply_the_coupon_because_expired: "Unable to apply the coupon: this code has expired." + unable_to_apply_the_coupon_because_sold_out: "Unable to apply the coupon: this code reached its quota." + unable_to_apply_the_coupon_because_already_used: "Unable to apply the coupon: you have already used this code once before." + unable_to_apply_the_coupon_because_amount_exceeded: "Unable to apply the coupon: the discount exceed the total amount of this purchase." + unable_to_apply_the_coupon_because_undefined: "Unable to apply the coupon: an unexpected error occurred, please contact the Fablab's manager." + unable_to_apply_the_coupon_because_rejected: "This code does not exists." + payment_schedule_summary: + your_payment_schedule: "Your payment schedule" + NUMBER_monthly_payment_of_AMOUNT: "{NUMBER} monthly {NUMBER, plural, =1{payment} other{payments}} of {AMOUNT}" + first_debit: "First debit on the day of the order." + monthly_payment_NUMBER: "{NUMBER}{NUMBER, plural, =1{st} =2{nd} =3{rd} other{th}} monthly payment: " + debit: "Debit on the day of the order." + view_full_schedule: "View the complete payment schedule" + select_schedule: + monthly_payment: "Monthly payment" + #shopping cart module for reservations + cart: + summary: "Summary" + select_one_or_more_slots_in_the_calendar: "Select one {SINGLE, select, true{slot} other{or more slots}} in the calendar" + select_a_plan: "Select a plan here" + you_ve_just_selected_the_slot: "You've just selected the slot:" + datetime_to_time: "{START_DATETIME} to {END_TIME}" #eg: Thursday, September 4, 1986 8:30 PM to 10:00 PM + cost_of_TYPE: "Cost of the {TYPE, select, Machine{machine slot} Training{training} Space{space slot} other{element}}" + offer_this_slot: "Offer this slot" + confirm_this_slot: "Confirm this slot" + remove_this_slot: "Remove this slot" + to_benefit_from_attractive_prices: "To benefit from attractive prices" + view_our_subscriptions: "View our subscriptions" + or: "or" + cost_of_the_subscription: "Cost of the subscription" + subscription_price: "Subscription price" + you_ve_just_selected_a_subscription_html: "You've just selected a subscription:" + confirm_and_pay: "Confirm and pay" + you_have_settled_the_following_TYPE: "You have settled the following {TYPE, select, Machine{machine slots} Training{training} other{elements}}:" + you_have_settled_a_: "You have settled a" + total_: "TOTAL:" + thank_you_your_payment_has_been_successfully_registered: "Thank you. Your payment has been successfully registered !" + your_invoice_will_be_available_soon_from_your_: "Your invoice will be available soon from your" + dashboard: "Dashboard" + i_want_to_change_the_following_reservation: "I want to change the following reservation:" + cancel_my_modification: "Cancel my modification" + select_a_new_slot_in_the_calendar: "Select a new slot in the calendar" + cancel_my_selection: "Cancel my selection" + tags_of_the_original_slot: "Tags of the original slot:" + tags_of_the_destination_slot: "Tags of the destination slot:" + confirm_my_modification: "Confirm my modification" + your_booking_slot_was_successfully_moved_from_: "Your booking slot was successfully moved from" + to_date: "to" #eg. from 01 to 05 january. + please_select_a_member_first: "Please select a member first" + unable_to_select_plan_if_slots_in_the_past: "Unable to select a plan if any of the selected slots is in the past" + unable_to_change_the_reservation: "Unable to change the reservation" + confirmation_required: "Confirmation required" + do_you_really_want_to_cancel_this_reservation_html: "

Do you really want to cancel this reservation?

Warning: if this reservation was made free of charge, as part of a subscription, the credits used will not be re-credited.

" + reservation_was_cancelled_successfully: "Reservation was cancelled successfully." + cancellation_failed: "Cancellation failed." + confirm_payment_of_html: "{METHOD, select, card{Pay by card} other{Pay on site}}: {AMOUNT}" + a_problem_occurred_during_the_payment_process_please_try_again_later: "A problem occurred during the payment process. Please try again later." + none: "None" + online_payment_disabled: "Online payment is not available. Please contact the FabLab's reception directly." + slot_restrict_plans: "This slot is restricted for the plans below:" + slot_restrict_subscriptions_must_select_plan: "The slot is restricted for the subscribers. Please select a plan first." + slot_restrict_plans_of_others_groups: "The slot is restricted for the subscribers of others groups." + selected_plan_dont_match_slot: "Selected plan don't match this slot" + user_plan_dont_match_slot: "User subscribed plan don't match this slot" + no_plan_match_slot: "You dont have any matching plan for this slot" + slot_at_same_time: "Conflict with others reservations" + do_you_really_want_to_book_slot_at_same_time: "Do you really want to book this slot? Other bookings take place at the same time" + unable_to_book_slot_because_really_have_reservation_at_same_time: "Unable to book this slot because the following reservation occurs at the same time." + tags_mismatch: "Tags mismatch" + confirm_book_slot_tags_mismatch: "Do you really want to book this slot? {USER} does not have any of the required tags." + unable_to_book_slot_tags_mismatch: "Unable to book this slot because you don't have any of the required tags." + slot_tags: "Slot tags" + user_tags: "User tags" + no_tags: "No tags" + user_validation_required_alert: "Warning!
Your administrator must validate your account. Then, you'll then be able to access all the booking features." + select_the_reservation_context: "Select the context of the reservation" + please_select_a_reservation_context: "Please select the context of the reservation first" + child_validation_required_alert: "Your administrator must validate your child account. Then, you'll then be able to book the event." + child_birthday_must_be_under_18_years_ago_alert: "Your child must be under 18. Then, you'll then be able to book the event." + #feature-tour modal + tour: + previous: "Previous" + next: "Next" + end: "End the tour" + #help modal + help: + title: "Help" + what_to_do: "What do you want to do?" + tour: "Start the feature tour" + guide: "Open the user's manual" + stripe_confirm_modal: + resolve_action: "Resolve the action" + ok_button: "OK" + #2nd factor authentication for card payments + stripe_confirm: + pending: "Pending for action..." + success: "Thank you, your card setup is complete. The payment will be proceeded shortly." + #the summary table of all payment schedules + payment_schedules_table: + schedule_num: "Schedule #" + date: "Date" + price: "Price" + customer: "Customer" + deadline: "Deadline" + amount: "Amount" + state: "State" + download: "Download" + state_new: "Not yet due" + state_pending_check: "Waiting for the cashing of the check" + state_pending_transfer: "Waiting for the tranfer confirmation" + state_pending_card: "Waiting for the card payment" + state_requires_payment_method: "The credit card must be updated" + state_requires_action: "Action required" + state_paid: "Paid" + state_error: "Error" + state_gateway_canceled: "Canceled by the payment gateway" + state_canceled: "Canceled" + method_card: "by card" + method_check: "by check" + method_transfer: "by transfer" + payment_schedule_item_actions: + download: "Download" + cancel_subscription: "Cancel the subscription" + confirm_payment: "Confirm payment" + confirm_check: "Confirm cashing" + resolve_action: "Resolve the action" + update_card: "Update the card" + update_payment_mean: "Update the payment mean" + please_ask_reception: "For any questions, please contact the FabLab's reception." + confirm_button: "Confirm" + confirm_check_cashing: "Confirm the cashing of the check" + confirm_check_cashing_body: "You must cash a check of {AMOUNT} for the deadline of {DATE}. By confirming the cashing of the check, an invoice will be generated for this due date." + confirm_bank_transfer: "Confirm the bank transfer" + confirm_bank_transfer_body: "You must confirm the receipt of {AMOUNT} for the deadline of {DATE}. By confirming the bank transfer, an invoice will be generated for this due date." + confirm_cancel_subscription: "You're about to cancel this payment schedule and the related subscription. Are you sure?" + card_payment_modal: + online_payment_disabled: "Online payment is not available. Please contact the FabLab's reception directly." + unexpected_error: "An error occurred. Please report this issue to the Fab-Manager's team." + update_card_modal: + unexpected_error: "An error occurred. Please report this issue to the Fab-Manager's team." + stripe_card_update_modal: + update_card: "Update the card" + validate_button: "Validate the new card" + payzen_card_update_modal: + update_card: "Update the card" + validate_button: "Validate the new card" + form_multi_select: + create_label: "Add {VALUE}" + form_checklist: + select_all: "Select all" + unselect_all: "Unselect all" + form_file_upload: + placeholder: "Add a file" + browse: "Browse" + edit: "Edit" + form_image_upload: + browse: "Browse" + edit: "Edit" + main_image: "Main visual" + store: + order_item: + total: "Total" + client: "Client" + created_at: "Order creation" + last_update: "Last update" + state: + cart: 'Cart' + in_progress: 'Under preparation' + paid: "Paid" + payment_failed: "Payment error" + canceled: "Canceled" + ready: "Ready" + refunded: "Refunded" + delivered: "Delivered" + show_order: + back_to_list: "Back to list" + see_invoice: "See invoice" + tracking: "Order tracking" + client: "Client" + created_at: "Creation date" + last_update: "Last update" + cart: "Cart" + reference_short: "ref:" + unit: "Unit" + item_total: "Total" + payment_informations: "Payment informations" + amount: "Amount" + products_total: "Products total" + gift_total: "Discount total" + coupon: "Coupon" + cart_total: "Cart total" + pickup: "Pickup your products" + state: + cart: 'Cart' + in_progress: 'Under preparation' + paid: "Paid" + payment_failed: "Payment error" + canceled: "Canceled" + ready: "Ready" + refunded: "Refunded" + delivered: "Delivered" + payment: + by_wallet: "by wallet" + settlement_by_debit_card: "Settlement by debit card" + settlement_done_at_the_reception: "Settlement done at the reception" + settlement_by_wallet: "Settlement by wallet" + on_DATE_at_TIME: "on {DATE} at {TIME}," + for_an_amount_of_AMOUNT: "for an amount of {AMOUNT}" + and: 'and' + order_actions: + state: + cart: 'Cart' + in_progress: 'Under preparation' + paid: "Paid" + payment_failed: "Payment error" + canceled: "Canceled" + ready: "Ready" + refunded: "Refunded" + delivered: "Delivered" + confirm: 'Confirm' + confirmation_required: "Confirmation required" + confirm_order_in_progress_html: "Please confirm that this order in being prepared." + order_in_progress_success: "Order is under preparation" + confirm_order_ready_html: "Please confirm that this order is ready." + order_ready_note: 'You can leave a message to the customer about withdrawal instructions' + order_ready_success: "Order is ready" + confirm_order_delivered_html: "Please confirm that this order was delivered." + order_delivered_success: "Order was delivered" + confirm_order_canceled_html: "Do you really want to cancel this order?

If this impacts stock, please reflect the change in edit product > stock management. This won't be automatic.

" + order_canceled_success: "Order was canceled" + confirm_order_refunded_html: "Do you really want to refund this order?

If so, please refund the customer and generate the credit note from the Invoices tab.

If this affects stocks, please edit your product and reflect the change in the stock management tab.

These actions will not be automatic.

" + order_refunded_success: "Order was refunded" + unsaved_form_alert: + modal_title: "You have some unsaved changes" + confirmation_message: "If you leave this page, your changes will be lost. Are you sure you want to continue?" + confirmation_button: "Yes, don't save" + active_filters_tags: + keyword: "Keyword: {KEYWORD}" + stock_internal: "Private stock" + stock_external: "Public stock" + calendar: + calendar: "Calendar" + show_unavailables: "Show complete slots" + filter_calendar: "Filter calendar" + trainings: "Trainings" + machines: "Machines" + spaces: "Spaces" + events: "Events" + externals: "Other calendars" + show_reserved_uniq: "Show only slots with reservations" + machine: + machine_uncategorized: "Uncategorized machines" + form_unsaved_list: + save_reminder: "Do not forget to save your changes" + cancel: "Cancel" diff --git a/config/locales/base.sv.yml b/config/locales/base.sv.yml new file mode 100644 index 000000000..8132bca04 --- /dev/null +++ b/config/locales/base.sv.yml @@ -0,0 +1,5 @@ +sv: + time: + formats: + #See http://apidock.com/ruby/DateTime/strftime for a list of available directives + hour_minute: "%I:%M %p" diff --git a/config/locales/devise.sv.yml b/config/locales/devise.sv.yml new file mode 100644 index 000000000..4271ba112 --- /dev/null +++ b/config/locales/devise.sv.yml @@ -0,0 +1,63 @@ +#Additional translations at https://github.com/plataformatec/devise/wiki/I18n +sv: + devise: + confirmations: + confirmed: "Your account was successfully confirmed." + send_instructions: "You will receive an email with instructions about how to confirm your account in a few minutes." + send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions about how to confirm your account in a few minutes." + failure: + already_authenticated: "You are already signed in." + inactive: "Your account is not activated yet." + invalid: "Invalid email or password." + locked: "Your account is locked." + last_attempt: "You have one more attempt before your account will be locked." + not_found_in_database: "Invalid email or password." + timeout: "Your session expired. Please sign in again to continue." + unauthenticated: "You need to sign in or sign up before continuing." + unconfirmed: "You have to confirm your account before continuing. Please click on the link below the form." + mailer: + confirmation_instructions: + action: "Confirm my email address" + instruction: "You can finalize your registration by confirming your email address. Please click on the following link:" + subject: "Confirmation instructions" + reset_password_instructions: + action: "Change my password" + instruction: "Someone asked for a link to change your password. You can do it through the link below." + ignore_otherwise: "If you have not made this request, please ignore this message." + subject: "Reset password instructions" + unlock_instructions: + subject: "Unlock Instructions" + omniauth_callbacks: + failure: "Could not authenticate you from %{kind} because \"%{reason}\"." + success: "Successfully authenticated from %{kind} account." + passwords: + no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided." + send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes." + send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes." + updated: "Your password was changed successfully. You are now signed in." + updated_not_active: "Your password was changed successfully." + registrations: + destroyed: "Bye! Your account was successfully cancelled. We hope to see you again soon." + signed_up: "Welcome! You have signed up successfully." + 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." + 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." + 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." + updated: "You updated your account successfully." + sessions: + signed_in: "Signed in successfully." + signed_out: "Signed out successfully." + unlocks: + send_instructions: "You will receive an email with instructions about how to unlock your account in a few minutes." + send_paranoid_instructions: "If your account exists, you will receive an email with instructions about how to unlock it in a few minutes." + unlocked: "Your account has been unlocked successfully. Please sign in to continue." + errors: + messages: + already_confirmed: "This email was already confirmed, please try signing in." + confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one" + expired: "has expired, please request a new one" + not_found: "This email was not found" + 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:" diff --git a/config/locales/mails.sv.yml b/config/locales/mails.sv.yml new file mode 100644 index 000000000..dca5a5024 --- /dev/null +++ b/config/locales/mails.sv.yml @@ -0,0 +1,490 @@ +sv: + layouts: + notifications_mailer: + see_you_later: "See you soon on {GENDER, select, neutral{} other{the}}" #messageFormat interpolation + sincerely: "Sincerely," + signature: "The Fab Lab team." + do_not_reply: "Please do not reply to this email." + users_mailer: + notify_user_account_created: + subject: "Your FabLab account has been successfully created" + body: + hello: "Hello %{NAME}," + intro: "The FabLab team has just created an account for you, on {GENDER, select, neutral{} other{the}} {FABLAB} website:" #messageFormat interpolation + connection_parameters: "Here are your connection parameters:" + account_name: "Account name:" + password: "Password:" + temporary_password: "This is a temporary password, you can modify it in your «My account» screen." + keep_advantages: "With this account, you keep all the advantages linked to your Fab Lab user profile (trainings, subscriptions plans)." + to_use_platform: "To use the website, please" + logon_or_login: "create a new account or log in by clicking here." + token_if_link_problem: "If you experience issues with the link, you can enter the following code at your first connection attempt:" + notifications_mailer: + notify_user_user_group_changed: + subject: "You have changed group" + body: + warning: "You have changed group. Inspections can be conducted at the lab to verify the legitimacy of this change." + user_invalidated: "Your account was invalidated, please upload your new supporting documents to validate your account." + notify_admin_user_group_changed: + subject: "A member has changed group" + body: + user_changed_group_html: "User %{NAME} has changed group." + previous_group: "Previous group:" + new_group: "New group:" + user_invalidated: "The user's account was invalidated." + notify_admin_subscription_extended: + subject: "A subscription has been extended" + body: + subscription_extended_html: "Subscription {PLAN} for user {NAME} has been extended {FREE, select, true{for free} other{}} until {DATE}." #messageFormat interpolation + notify_member_subscription_extended: + subject: "Your subscription plan has been extended" + body: + your_plan: "Your subscription plan" + has_been_extended: "has been extended" + free: "for free" + until: "until" + notify_partner_subscribed_plan: + subject: "A subscription plan has been purchased" + body: + a_plan: "A subscription plan" + was_purchased_by_member: "has been purchased by user" + notify_admin_when_project_published: + subject: "A project has been published" + body: + new_project_published: "A new project has been published:" + notify_project_collaborator_to_valid: + subject: "Invitation to collaborate on a project" + body: + your_are_invited_to_take_part_in_a_project: "You are invited to join this project:" + to_accept_the_invitation_click_on_following_link: "To accept this invitation, please click on the following link:" + notify_project_author_when_collaborator_valid: + subject: "New collaborator in your project" + body: + the_member: "the user" + accepted_your_invitation_to_take_part_in_the_project: "has accepted your invitation to join your project:" + notify_user_training_valid: + subject: "Your training has been validated" + body: + your_training: "Your training" + has_been_validated: "has been validated" + notify_member_subscribed_plan: + subject: "Your subscription has been successfully purchased" + body: + plan_subscribed_html: "You have subscribed the plan: %{PLAN}." + rolling_subscription_stops_on: "Your subscription will end %{DURATION} after your first training. Otherwise, it will stop on %{DATE}." + subscription_stops_on: "Your subscription will end on %{DATE}." + notify_member_create_reservation: + subject: "Your reservation has been successfully saved" + body: + reservation_saved_html: "You reservation %{RESERVATION} has been successfully saved" + your_reserved_slots: "Your reserved slots are:" + notify_member_pre_booked_reservation: + subject: "Your pre-registration has been successfully saved" + body: + reservation_saved_html: "You pre-registration %{RESERVATION} has been successfully saved" + your_reserved_slots: "Your pre-booked slots are:" + reservation_warning: "This email does not count as registration to %{RESERVATION}.
You will receive another email to confirm or deny your request." + notify_member_subscribed_plan_is_changed: + subject: "Your subscription has been updated" + body: + new_plan_html: "You have changed your plan to %{PLAN}." + notify_admin_member_create_reservation: + subject: "New reservation" + body: + member_reserved_html: "User %{NAME} has reserved %{RESERVABLE}." + reserved_slots: "Reserved slots are:" + notify_admin_member_pre_booked_reservation: + subject: "New pre-registration" + body: + member_reserved_html: "User %{NAME} has pre-reserved %{RESERVABLE}." + reserved_slots: "Pre-reserved slots are:" + notify_member_slot_is_modified: + subject: "Your reservation slot has been successfully changed" + body: + reservation_changed_to: "Your reservation slot has been changed to:" + previous_date: "Previous date:" + notify_admin_slot_is_modified: + subject: "A reservation slot has been modified" + body: + slot_modified: "User %{NAME} had modified his reservation slot" + new_date: "New slot" + old_date: "Previous slot" + notify_admin_when_user_is_created: + subject: "A user account has been created" + body: + new_account_created: "A new user account has been created on the website:" + user_of_group_html: "The user has registered in the group %{GROUP}" + account_for_organization: "This account manage an organization:" + notify_admin_child_created: + subject: "A user's child has been created" + body: + new_child_created: "A new user's child has been created on the website" + notify_admin_subscribed_plan: + subject: "A subscription has been purchased" + body: + plan_subscribed_html: "A plan %{PLAN} has been subscribed by user %{NAME}." + notify_member_invoice_ready: + subject: "Your FabLab's invoice" + body: + please_find_attached_html: "Please find as attached file your invoice from {DATE}, with an amount of {AMOUNT} concerning your {TYPE, select, Reservation{reservation} OrderItem{order} other{subscription}}." #messageFormat interpolation + invoice_in_your_dashboard_html: "You can access your invoice in %{DASHBOARD} on the Fab Lab website." + your_dashboard: "your dashboard" + notify_member_reservation_reminder: + subject: "Reservation reminder" + body: + this_is_a_reminder_about_your_reservation_RESERVABLE_to_be_held_on_DATE_html: "This is a reminder about your reservation %{RESERVABLE} to be held on %{DATE}" + this_reservation_concerns_the_following_slots: "This reservation concerns the following slots:" + notify_member_avoir_ready: + subject: "Your FabLab's refund invoice" + body: + please_find_attached_html: "Please find as attached file your refund invoice from {DATE}, with an amount of {AMOUNT} concerning your {TYPE, select, Reservation{reservation} WalletTransaction{wallet credit} other{subscription}}." #messageFormat interpolation + invoice_in_your_dashboard_html: "You can access your refund invoice in %{DASHBOARD} on the Fab Lab website." + your_dashboard: "your dashboard" + notify_member_subscription_will_expire_in_7_days: + subject: "Your subscription expires in 7 days" + body: + your_plan: "you plan" + expires_in_7_days: "will expire in 7 days." + to_renew_your_plan_follow_the_link: "Please, follow this link to renew your plan" + notify_member_training_authorization_expired: + subject: "Your authorization was revoked" + body: + training_expired_html: "

You took the %{TRAINING} training, on %{DATE}.

Your authorization for this training, valid for %{PERIOD} months, has expired.

Please validate it again in order to be able to reserve the %{MACHINES}

." + notify_member_training_auto_cancelled: + subject: "Your training session was cancelled" + body: + cancelled_training: "The %{TRAINING} training session scheduled for %{DATE}, from %{START} to %{END} has been canceled due to an insufficient number of participants." + auto_refund: "You were refunded on your wallet and a credit note should be available." + notify_member_training_invalidated: + subject: "Your authorization was invalidated" + body: + training_invalidated_html: "

You took the %{TRAINING} training, on %{DATE} giving you access to the %{MACHINES}.

Due to the lack of reservations for one of these machines during the last %{PERIOD} months, your authorization has been invalidated.

Please validate the training again in order to continue reserving these machines.

." + notify_member_subscription_is_expired: + subject: "Your subscription has expired" + body: + your_plan: "You plan" + has_expired: "has expired." + you_can_go_to: "Please go to" + to_renew_your_plan: "to renew you plan" + notify_admin_subscription_will_expire_in_7_days: + subject: "A member subscription expires in 7 days" + body: + subscription_will_expire_html: "Subscription plan for user %{NAME} %{PLAN} will expire in 7 days." + notify_admin_training_auto_cancelled: + subject: "A training was automatically cancelled" + body: + cancelled_training: "The %{TRAINING} training session scheduled for %{DATE}, from %{START} to %{END} has been automatically canceled due to an insufficient number of participants." + auto_refund: "The members who have booked this training session were automatically refunded on their wallet and credit notes was generated." + manual_refund: "Please manually refund all members who have booked this training session and generate the credit notes." + notify_admin_subscription_is_expired: + subject: "A member subscription has expired" + body: + subscription_expired_html: "Subscription plan for user %{NAME} %{PLAN} is now expired." + notify_admin_subscription_canceled: + subject: "A member subscription has been cancelled" + body: + subscription_canceled_html: "Subscription %{PLAN} for user %{NAME} has been cancelled." + notify_member_subscription_canceled: + subject: "Your subscription has been cancelled" + body: + your_plan_was_canceled: "Your subscription plan has been cancelled." + your_plan: "your subscription plan" + end_at: "ends on" + notify_member_slot_is_canceled: + subject: "Your reservation has been canceled" + body: + reservation_canceled: "Your reservation for %{RESERVABLE} has been canceled" + notify_admin_slot_is_canceled: + subject: "A reservation has been cancelled" + body: + member_cancelled: "User %{NAME} has cancelled his reservation" + item_details: "%{START} - %{END}, concerning %{RESERVABLE}" + generate_refund: "Do not forget to generate a credit note or a refund for this cancellation." + notify_admin_when_user_is_imported: + subject: "A user account has been imported from the SSO" + body: + new_account_imported: "A new user account (ID: %{ID}) has been imported to the website via %{PROVIDER}." + provider_uid: "its provider ID is: " + known_information: "Here is what we know about this provider:" + address_already_used: "This address is already associated with another user" + no_more_info_available: "No other info about this user can be provided before he completes his profile." + notify_user_profile_complete: + subject: "You now have access to the whole website" + body: + message: "Your account informations has been correctly updated, you now have access to the whole website." + notify_user_auth_migration: + subject: "Important change to your FabLab account" + body: + the_platform: "the website" + is_changing_its_auth_system_and_will_now_use: "is actually changing its user identification system and will use" + instead_of: "instead of" + consequence_of_the_modification: "Because of this change you won't be able to login to the website with your actual usernames" + to_use_the_platform_thanks_for: "To keep on using the website, please" + create_an_account_on: "create an account on" + or_use_an_existing_account_clicking_here: "or use an existing account by clicking here" + in_case_of_problem_enter_the_following_code: "In case of problem with this link, you can enter the following code at your first connection attempt in order to migrate your actual account into the new authentification system:" + notify_admin_user_merged: + subject: "An imported account has been merged with an existing account" + body: + imported_account_merged: "A previously imported user account via %{PROVIDER) has been merged with the existing account %{NAME}" + provider_uid: "its provider ID is:" + notify_admin_profile_complete: + subject: "An imported account has completed its profile" + body: + account_completed: "An user account has completed its profile:" + imported_account_completed: "An user account, previously imported through %{PROVIDER}, has completed its profile:" + provider_id: "its provider ID is:" + notify_admin_abuse_reported: + subject: "An abusive content has been reported" + body: + intro: "A user has flagged a content as abusive" + signaled_content: "flagged content:" + signaled_by: "flagged by:" + signaled_on: "flagged on:" + message: "Message:" + visit_management_interface: "Refer to the Reporting Management Interface for more information." + notify_user_wallet_is_credited: + subject: "Your wallet has been credited" + body: + wallet_credit_html: "Your wallet has been credited %{AMOUNT} by administrator." + notify_admin_user_wallet_is_credited: + subject: "The wallet of an user has been credited" + body: + wallet_credit_html: "The wallet of member %{USER} has been credited %{AMOUNT} by administrator %{ADMIN}." + notify_admin_export_complete: + subject: "Export completed" + body: + you_asked_for_an_export: "You asked for an export" + statistics_global: "of all the statistics" + statistics_account: "of the registration statistics" + statistics_event: "of statistics about events" + statistics_machine: "of statistics about machine slots" + statistics_project: "of statistics about projects" + statistics_subscription: "of subscription statistics" + statistics_training: "of statistics about trainings" + statistics_space: "of statistics about spaces" + users_members: "of the members' list" + users_subscriptions: "of the subscriptions' list" + users_reservations: "of the reservations' list" + availabilities_index: "of the reservations availabilities" + accounting_acd: "of the accounting data to ACD" + accounting_vat: "of the collected VAT data" + click_to_download: "Excel file generated successfully. To download it, click" + here: "here" + file_type: + xlsx: "Excel" + csv: "CSV" + notify_admin_import_complete: + subject: "Import completed" + body: + you_made_an_import: "You have initiated an import %{CATEGORY}" + category_members: "of the members" + click_to_view_results: "Click here to view results" + notify_admin_low_stock_threshold: + subject: "Low stock alert" + body: + low_stock: "A new stock movement of %{PRODUCT} has exceeded the low stock threshold." + stocks_state_html: "Current stock status:
  • internal: %{INTERNAL}
  • external: %{EXTERNAL}
" + manage_stock: "Manage stocks for this product" + notify_member_about_coupon: + subject: "Coupon" + body: + enjoy_a_discount_of_PERCENT_with_code_CODE: "Enjoy a discount of %{PERCENT}% on the whole site with the code %{CODE}." + enjoy_a_discount_of_AMOUNT_with_code_CODE: "Enjoy a discount of %{AMOUNT} on the whole site with the code %{CODE}." + this_coupon_is_valid_USAGE_times_until_DATE_for_all_your_purchases: "This coupon is valid {USAGE, plural, =1{just once} other{many times}}: for all your purchases {TYPE, select, amount_off{at least equal to the amount of the coupon} other{}}, from now {DATE, select, NO-DATE{and without time limit} other{and until {DATE}}}." + notify_admin_free_disk_space: + subject: "Low disk space" + body: "Warning: available disk space on the server hosting Fab-manager is less than %{THRESHOLD} MiB. This can affect its operation and prevent saving some data. Currently, %{AVAILABLE} MiB of free disk space remains available on the mount point." + notify_admin_close_period_reminder: + subject: "Remind to close your accounting periods" + body: + warning_last_closed_period_over_1_year: "Please remind to periodically close your accounting periods. Last closed period ended at %{LAST_END}." + warning_no_closed_periods: "Please remind to periodically close your accounting periods. You have to close periods from %{FIRST_DATE}." + notify_admin_archive_complete: + subject: "Archiving completed" + body: + archive_complete: "You have closed the accounting period from %{START} to %{END}. Archiving of data is now complete." + click_to_download: "To download the ZIP archive, click" + here: "here." + save_on_secured: "Remember that you must save this archive on a secured external support, which may be requested by the tax authorities during a check." + notify_privacy_policy_changed: + subject: "Privacy policy updated" + body: + content_html: "

We wish to inform you that we have just updated our privacy policy.

We may change our privacy policy regularly. In accordance with the regulations, you will receive a notification for each update.

By accessing or using our services after the privacy policy update, we will consider that you agree its terms, updates included.

" + link_to_policy: "Click here to view the privacy policy." + notify_admin_refund_created: + subject: "A refund has been generated" + body: + refund_created: "A refund of %{AMOUNT} has been generated on invoice %{INVOICE} of user %{USER}" + wallet_refund_created: "A refund of %{AMOUNT} has been generated for the credit of the wallet of user %{USER}" + download: "Click here to download this refund invoice" + notify_admins_role_update: + subject: "The role of a user has changed" + body: + user_role_changed_html: "The role of the user %{NAME} has changed." + previous_role: "Previous role:" + new_role: "New role:" + notify_user_role_update: + subject: "Your role has changed" + body: + role_changed_html: "Your role at {GENDER, select, male{the} female{the} neutral{} other{the}} {NAME} has changed. You are now {ROLE}.
With great power comes great responsibility, use your new privileges fairly and respectfully." + notify_admin_objects_stripe_sync: + subject: "Stripe synchronization" + body: + objects_sync: "All members, coupons, machines, trainings, spaces and plans were successfully synchronized on Stripe." + notify_admin_order_is_paid: + subject: "New order" + body: + order_placed: "A new order (%{REFERENCE}) has been placed and paid by %{USER}." + view_details: "" + notify_member_payment_schedule_ready: + subject: "Your payment schedule" + body: + please_find_attached_html: "Please find attached your payment schedule, issued on {DATE}, with an amount of {AMOUNT} concerning your {TYPE, select, Reservation{reservation} other{subscription}}." #messageFormat interpolation + schedule_in_your_dashboard_html: "You can find this payment schedule at any time from %{DASHBOARD} on the Fab Lab's website." + your_dashboard: "your dashboard" + notify_admin_payment_schedule_error: + subject: "[URGENT] Card debit error" + body: + remember: "In accordance with the %{REFERENCE} payment schedule, a debit by card of %{AMOUNT} was scheduled on %{DATE}." + error: "Unfortunately, an error occurred and this card debit was unable to complete successfully." + action: "Please then consult the %{GATEWAY} dashboard and contact the member as soon as possible to resolve the problem." + notify_member_payment_schedule_error: + subject: "[URGENT] Card debit error" + body: + remember: "In accordance with your %{REFERENCE} payment schedule, a debit by card of %{AMOUNT} was scheduled on %{DATE}." + error: "Unfortunately, an error occurred and this card debit was unable to complete successfully." + action: "Please contact a manager as soon as possible to resolve the problem." + notify_admin_payment_schedule_failed: + subject: "[URGENT] Card debit failure" + body: + remember: "In accordance with the %{REFERENCE} payment schedule, a debit by card of %{AMOUNT} was scheduled on %{DATE}." + error: "Unfortunately, this card debit was unable to complete successfully." + action: "Please contact the member as soon as possible, then go to the payment schedule management interface to resolve the problem. After a certain period of time, the card subscription could be cancelled." + notify_member_payment_schedule_failed: + subject: "[URGENT] Card debit failure" + body: + remember: "In accordance with your %{REFERENCE} payment schedule, a debit by card of %{AMOUNT} was scheduled on %{DATE}." + error: "Unfortunately, this card debit was unable to complete successfully." + action_html: "Please check %{DASHBOARD} or contact a manager quickly, otherwise your subscription may be interrupted." + your_dashboard: "your dashboard" + notify_admin_payment_schedule_gateway_canceled: + subject: "[URGENT] Payment schedule canceled by the payment gateway" + body: + error: "The payment schedule %{REFERENCE} was canceled by the payment gateway (%{GATEWAY}). No further debits will be made on this payment mean." + action: "Please consult the payment schedule management interface and contact the member as soon as possible to resolve the problem." + notify_member_payment_schedule_gateway_canceled: + subject: "[URGENT] Payment schedule canceled by the payment gateway" + body: + error: "Your payment schedule %{REFERENCE} was canceled by the payment gateway. No further debits will be made on this payment mean." + action: "Please contact a manager as soon as possible to resolve the problem." + notify_admin_payment_schedule_check_deadline: + subject: "Payment deadline" + body: + remember: "In accordance with the %{REFERENCE} payment schedule, %{AMOUNT} was due to be debited on %{DATE}." + date: "This is a reminder to cash the scheduled check as soon as possible." + confirm: "Do not forget to confirm the receipt in your payment schedule management interface, so that the corresponding invoice will be generated." + notify_member_payment_schedule_transfer_deadline: + subject: "Payment deadline" + body: + remember: "In accordance with your %{REFERENCE} payment schedule, %{AMOUNT} was due to be debited on %{DATE}." + date: "This is a reminder to verify that the direct bank debit was successfull." + confirm: "Please confirm the receipt of funds in your payment schedule management interface, so that the corresponding invoice will be generated." + notify_member_reservation_limit_reached: + subject: "Daily reservation limit reached" + body: + limit_reached: "For %{DATE}, you have reached your daily limit of %{HOURS} hours of %{ITEM} reservation." + notify_admin_user_supporting_document_files_created: + subject: "Supporting documents uploaded by a member" + body: + supporting_document_files_uploaded_below: "Member %{NAME} has uploaded the following supporting documents:" + validate_user: "Please validate this account" + notify_admin_user_supporting_document_files_updated: + subject: "Member's supporting documents have changed" + body: + user_update_supporting_document_file: "Member %{NAME} has modified the supporting documents below:" + validate_user: "Please validate this account" + notify_admin_user_child_supporting_document_files_created: + subject: "Supporting documents of child uploaded by a member" + body: + supporting_document_files_uploaded_below: "Child %{NAME} has uploaded the following supporting documents:" + validate_child: "Please validate this child account" + notify_admin_user_child_supporting_document_files_updated: + subject: "Child's supporting documents have changed" + body: + child_update_supporting_document_file: "Child %{NAME} has modified the supporting documents below:" + validate_child: "Please validate this child account" + notify_user_is_validated: + subject: "Account validated" + body: + account_validated: "Your account was validated. Now, you have access to booking features." + notify_user_is_invalidated: + subject: "Account invalidated" + body: + account_invalidated: "Your account was invalidated. You won't be able to book anymore, until your account is validated again." + notify_user_child_is_validated: + subject: "Child account validated" + body: + child_validated: "Your child account was validated. Now, you have access to event booking features." + notify_user_child_is_invalidated: + subject: "Child account invalidated" + body: + child_invalidated: "Your child account was invalidated. You won't be able to book event, until your child account is validated again." + notify_user_supporting_document_refusal: + subject: "Your supporting documents were refused" + body: + user_supporting_document_files_refusal: "Your supporting documents were refused:" + action: "Please re-upload some new supporting documents." + notify_user_supporting_document_reminder: + subject: "Reminder to upload your supporting documents" + body: + user_supporting_document_reminder: "This is a reminder for you to upload your supporting documents." + notify_admin_user_supporting_document_refusal: + subject: "A member's supporting documents were refused" + body: + user_supporting_document_files_refusal: "Member %{NAME}'s supporting documents were rejected by %{OPERATOR}:" + notify_user_child_supporting_document_refusal: + subject: "Your child's supporting documents were refused" + body: + user_child_supporting_document_files_refusal: "Your supporting documents were refused:" + action: "Please re-upload some new supporting documents." + notify_admin_user_child_supporting_document_refusal: + subject: "A child's supporting documents were refused" + body: + user_child_supporting_document_files_refusal: "Child %{NAME}'s supporting documents were rejected by %{OPERATOR}:" + shared: + hello: "Hello %{user_name}" + notify_user_order_is_ready: + subject: "Your command is ready" + body: + notify_user_order_is_ready: "Your command %{REFERENCE} is ready:" + notify_user_order_is_canceled: + subject: "Your command was canceled" + body: + notify_user_order_is_canceled: "Your command %{REFERENCE} was canceled." + notify_user_order_is_refunded: + subject: "Your command was refunded" + body: + notify_user_order_is_refunded: "Your command %{REFERENCE} was refunded." + notify_member_reservation_validated: + subject: "Your reservation was validated" + body: + reservation_validated_html: "%{RESERVABLE} was validated." + your_reserved_slots: "Your reserved slots are:" + notify_admin_reservation_validated: + subject: "Pre-registration was validated" + body: + reservation_validated_html: "%{RESERVABLE} of %{NAME} was validated." + reserved_slots: "Reserved slots are:" + notify_member_reservation_invalidated: + subject: "Your pre-registration wasn't validated" + body: + reservation_invalidated_html: "%{RESERVABLE} wasn't validated." + notify_admin_reservation_invalidated: + subject: "Pre-registration wasn't validated" + body: + reservation_invalidated_html: "%{RESERVABLE} of %{NAME} wasn't validated." + notify_user_when_child_age_will_be_18: + subject: "Your child will be 18 years old" + body: + child_age_will_be_18_years_ago: "Your child %{NAME} will turn 18 on %{DATE}, at which point they will be automatically detached from your Family account. They will need to create their own account in order to make reservations." diff --git a/config/locales/sv.yml b/config/locales/sv.yml new file mode 100644 index 000000000..a0c9acceb --- /dev/null +++ b/config/locales/sv.yml @@ -0,0 +1,749 @@ +sv: + #subscription plan duration + duration: + year: + one: 'one year' + other: '%{count} years' + month: + one: 'one month' + other: '%{count} months' + week: + one: 'one week' + other: '%{count} weeks' + activerecord: + attributes: + product: + amount: "The price" + slug: "URL" + errors: + #CarrierWave + messages: + carrierwave_processing_error: "failed to be processed" + carrierwave_integrity_error: "is not of an allowed file type" + carrierwave_download_error: "could not be downloaded" + extension_whitelist_error: "You are not allowed to upload %{extension} files, allowed types: %{allowed_types}" + extension_blacklist_error: "You are not allowed to upload %{extension} files, prohibited types: %{prohibited_types}" + content_type_whitelist_error: "You are not allowed to upload %{content_type} files, allowed types: %{allowed_types}" + rmagick_processing_error: "Failed to manipulate with rmagick, maybe it is not an image?" + mime_types_processing_error: "Failed to process file with MIME::Types, maybe not valid content-type?" + mini_magick_processing_error: "Failed to manipulate the file, maybe it is not an image?" + wrong_size: "is the wrong size (should be %{file_size})" + size_too_small: "is too small (should be at least %{file_size})" + size_too_big: "is too big (should be at most %{file_size})" + export_not_found: "Requested export was not found. It was probably deleted, please generate a new export." + percentage_out_of_range: "Percentage must be included between 0 and 100" + cannot_be_blank_at_same_time: "cannot be blank when %{field} is blank too" + cannot_be_in_the_past: "cannot be in the past" + cannot_be_before_previous_value: "cannot be before the previous value" + cannot_overlap: "can't overlap an existing accounting period" + cannot_encompass: "can't encompass an existing accounting period" + in_closed_period: "can't be within a closed accounting period" + invalid_footprint: "invoice's checksum is invalid" + end_before_start: "The end date can't be before the start date. Pick a date after %{START}" + invalid_duration: "The allowed duration must be between 1 day and 1 year. Your period is %{DAYS} days long." + must_be_in_the_past: "The period must be strictly prior to today's date." + registration_disabled: "Registration is disabled" + undefined_in_store: "must be defined to make the product available in the store" + gateway_error: "Payement gateway error: %{MESSAGE}" + gateway_amount_too_small: "Payments under %{AMOUNT} are not supported. Please order directly at the reception." + gateway_amount_too_large: "Payments above %{AMOUNT} are not supported. Please order directly at the reception." + product_in_use: "This product have already been ordered" + slug_already_used: "is already used" + birthday_less_than_18_years_ago: "Birthday must be under 18 years ago" + coupon: + code_format_error: "only caps letters, numbers, and dashes are allowed" + apipie: + api_documentation: "API Documentation" + code: "HTTP code" + #error messages when importing an account from an SSO + omniauth: + email_already_linked_to_another_account_please_input_your_authentication_code: "E-mail address \"%{OLD_MAIL}\" is already linked to another account, please input your authentication code." + your_username_is_already_linked_to_another_account_unable_to_update_it: "Your username (%{USERNAME}) is already linked to another account, unable to update it." + your_email_address_is_already_linked_to_another_account_unable_to_update_it: "Your e-mail address (%{EMAIL}) is already linked to another account, unable to update it." + this_account_is_already_linked_to_an_user_of_the_platform: "This %{NAME} account is already linked to an user of the platform." + #availability slots in the calendar + availabilities: + not_available: "Not available" + reserving: "I'm reserving" + i_ve_reserved: "I've reserved" + blocked: "Blocked" + length_must_be_slot_multiple: "must be at least %{MIN} minutes after the start date" + must_be_associated_with_at_least_1_machine: "must be associated with at least 1 machine" + deleted_user: "Deleted user" + #members management + members: + unable_to_change_the_group_while_a_subscription_is_running: "Unable to change the group while a subscription is running" + please_input_the_authentication_code_sent_to_the_address: "Please input the authentication code sent to the e-mail address %{EMAIL}" + your_authentication_code_is_not_valid: "Your authentication code is not valid." + current_authentication_method_no_code: "The current authentication method does not require any migration code" + requested_account_does_not_exists: "The requested account does not exist" + #SSO external authentication + authentication_providers: + local_database_provider_already_exists: 'A "Local Database" provider already exists. Unable to create another.' + matching_between_User_uid_and_API_required: "It is required to set the matching between User.uid and the API to add this provider." + #PDF invoices generation + invoices: + refund_invoice_reference: "Refund invoice reference: %{REF}" + invoice_reference: "Invoice reference: %{REF}" + code: "Code: %{CODE}" + order_number: "Order #: %{NUMBER}" + invoice_issued_on_DATE: "Invoice issued on %{DATE}" + refund_invoice_issued_on_DATE: "Refund invoice issued on %{DATE}" + wallet_credit: "Wallet credit" + cancellation_of_invoice_REF: "Cancellation of invoice %{REF}" + reservation_of_USER_on_DATE_at_TIME: "Reservation of %{USER} on %{DATE} at %{TIME}" + cancellation: "Cancellation" + object: "Object:" + order_summary: "Order summary:" + details: "Details" + amount: "Amount" + subscription_extended_for_free_from_START_to_END: "Subscription extended for free - From %{START} to %{END}" + subscription_NAME_from_START_to_END: "Subscription %{NAME} - From %{START} to %{END}" + machine_reservation_DESCRIPTION: "Machine reservation - %{DESCRIPTION}" + space_reservation_DESCRIPTION: "Space reservation - %{DESCRIPTION}" + training_reservation_DESCRIPTION: "Training reservation - %{DESCRIPTION}" + event_reservation_DESCRIPTION: "Event reservation - %{DESCRIPTION}" + from_payment_schedule: "Due %{NUMBER} out of %{TOTAL}, from %{DATE}. Repayment schedule %{SCHEDULE}" + null_invoice: "Invoice at nil, billing jump following a malfunction of the Fab Manager software" + full_price_ticket: + one: "One full price ticket" + other: "%{count} full price tickets" + other_rate_ticket: + one: "One %{NAME} ticket" + other: "%{count} %{NAME} tickets" + coupon_CODE_discount_of_DISCOUNT: "Coupon {CODE}: discount of {DISCOUNT}{TYPE, select, percent_off{%} other{}}" #messageFormat interpolation + total_including_all_taxes: "Total incl. all taxes" + VAT: "VAT" + including_VAT_RATE: "Including %{NAME} %{RATE}% of %{AMOUNT}" + including_total_excluding_taxes: "Including Total excl. taxes" + including_amount_payed_on_ordering: "Including amount payed on ordering" + total_amount: "Total amount" + refund_on_DATE: "Refund on %{DATE}" + by_card_online_payment: "by card (online payment)" + by_cheque: "by cheque" + by_transfer: "by transfer" + by_cash: "by cash" + by_wallet: "by wallet" + no_refund: "No refund" + settlement_by_debit_card: "Settlement by debit card" + settlement_done_at_the_reception: "Settlement done at the reception" + settlement_by_wallet: "Settlement by wallet" + on_DATE_at_TIME: "on %{DATE} at %{TIME}," + for_an_amount_of_AMOUNT: "for an amount of %{AMOUNT}" + on_DATE_from_START_to_END: "On %{DATE} from %{START} to %{END}" #eg: on feb. 7 from 7AM to 9AM + from_STARTDATE_to_ENDDATE_from_STARTTIME_to_ENDTIME: "From %{STARTDATE} to %{ENDDATE}, from %{STARTTIME} to %{ENDTIME}" #eg: from feb. 7 to feb. 10, from 6PM to 10PM + subscription_of_NAME_for_DURATION_starting_from_DATE: "Subscription of %{NAME} for %{DURATION} starting from %{DATE}" + subscription_of_NAME_extended_starting_from_STARTDATE_until_ENDDATE: "Subscription of %{NAME} extended (Free days) starting from %{STARTDATE} until %{ENDDATE}" + and: 'and' + invoice_text_example: "Our association is not subject to VAT" + error_invoice: "Erroneous invoice. The items below ware not booked. Please contact the FabLab for a refund." + prepaid_pack: "Prepaid pack of hours" + pack_item: "Pack of %{COUNT} hours for the %{ITEM}" + order: "Your order on the store" + unable_to_find_pdf: "We cannot find your invoice. If you ordered recently, it may have not been generated yet. Please retry in a moment." + #PDF payment schedule generation + payment_schedules: + schedule_reference: "Payment schedule reference: %{REF}" + schedule_issued_on_DATE: "Schedule issued on %{DATE}" + object: "Object: Payment schedule for %{ITEM}" + subscription_of_NAME_for_DURATION_starting_from_DATE: "the subscription of %{NAME} for %{DURATION} starting from %{DATE}" + deadlines: "Table of your deadlines" + deadline_date: "Payment date" + deadline_amount: "Amount including tax" + total_amount: "Total amount" + settlement_by_METHOD: "Debits will be made by {METHOD, select, card{card} transfer{bank transfer} other{check}} for each deadlines." + settlement_by_wallet: "%{AMOUNT} will be debited from your wallet to settle the first deadline." + #CVS accounting export (columns headers) + accounting_export: + journal_code: "Journal code" + date: "Entry date" + account_code: "Account code" + account_label: "Account label" + piece: "Document" + line_label: "Entry label" + debit_origin: "Origin debit" + credit_origin: "Origin credit" + debit_euro: "Euro debit" + credit_euro: "Euro credit" + lettering: "Lettering" + VAT: 'VAT' + accounting_summary: + subscription_abbreviation: "subscr." + Machine_reservation_abbreviation: "machine reserv." + Training_reservation_abbreviation: "training reserv." + Event_reservation_abbreviation: "event reserv." + Space_reservation_abbreviation: "space reserv." + wallet_abbreviation: "wallet" + shop_order_abbreviation: "shop order" + vat_export: + start_date: "Start date" + end_date: "End date" + vat_rate: "%{NAME} rate" + amount: "Total amount" + #training availabilities + trainings: + i_ve_reserved: "I've reserved" + completed: "Full" + refund_for_auto_cancel: "This training session was cancelled due to an insufficient number of participants." + #error messages when updating an event + events: + error_deleting_reserved_price: "Unable to delete the requested price because it is associated with some reservations" + other_error: "An unexpected error occurred while updating the event" + #event duration + from_STARTDATE_to_ENDDATE: "From %{STARTDATE} to %{ENDDATE}," + from_STARTTIME_to_ENDTIME: "from %{STARTTIME} to %{ENDTIME}" + #members list export to EXCEL format + export_members: + members: "Members" + id: "ID" + external_id: "External ID" + surname: "Surname" + first_name: "First name" + email: "E-mail" + newsletter: "Newsletter" + last_login: "Last login" + gender: "Gender" + age: "Age" + address: "Address" + phone: "Phone" + website: "Website" + job: "Job" + interests: "Interests" + cad_software_mastered: "CAD Softwares mastered" + group: "Group" + subscription: "Subscription" + subscription_end_date: "Subscription end date" + validated_trainings: "Validated trainings" + tags: "Tags" + number_of_invoices: "Number of invoices" + projects: "Projects" + facebook: "Facebook" + twitter: "Twitter" + echo_sciences: "Echosciences" + organization: "Organization" + organization_address: "Organization address" + note: "Note" + man: "Man" + woman: "Woman" + without_subscriptions: "Without subscriptions" + #machines/trainings/events reservations list to EXCEL format + export_reservations: + reservations: "Reservations" + customer_id: "Customer ID" + customer: "Customer" + email: "E-mail" + reservation_date: "Reservation date" + reservation_type: "Reservation type" + reservation_object: "Reservation object" + slots_number_hours_tickets: "Slots number (hours/tickets)" + payment_method: "Payment method" + local_payment: "Payment at the reception" + online_payment: "Online payment" + deleted_user: "Deleted user" + coupon: "Coupon used" + #subscriptions list export to EXCEL format + export_subscriptions: + subscriptions: "Subscriptions" + id: "ID" + customer: "Customer" + email: "E-mail" + subscription: "Subscription" + period: "Period" + start_date: "Start date" + expiration_date: "Expiration date" + amount: "Amount" + local_payment: "Payment at the reception" + online_payment: "Online payment" + deleted_user: "Deleted user" + #reservation slots export, by type, to EXCEL format + export_availabilities: + machines: "Machines" + trainings: "Trainings" + spaces: "Spaces" + events: "Events" + day_of_week: "Day of week" + date: "Date" + slot: "Slot" + machine: "Machine" + training: "Training" + space: "Space" + event: "Event" + reservations: "Reservations" + available_seats: "Available seats" + reservation_ics: + description_slot: "You have booked %{COUNT} slots of %{ITEM}" + description_training: "You have booked a %{TYPE} training" + description_event: "You have booked %{NUMBER} tickets for this event" + alarm_summary: "Remind your reservation" + roles: + member: "Member" + manager: "Manager" + admin: "Administrator" + api: + #internal app notifications + notifications: + deleted_user: "Deleted user" + notify_admin_abuse_reported: + an_abuse_was_reported_on_TYPE_ID_NAME_html: "An abuse was reported on %{TYPE} %{ID}: %{NAME}." + notify_admin_member_create_reservation: + a_RESERVABLE_reservation_was_made_by_USER_html: "A %{RESERVABLE} reservation was made by %{USER}." + notify_admin_member_pre_booked_reservation: + a_RESERVABLE_reservation_was_made_by_USER_html: "A %{RESERVABLE} pre-registration was made by %{USER}." + notify_admin_profile_complete: + account_imported_from_PROVIDER_UID_has_completed_its_information_html: "Account imported from %{PROVIDER} (%{UID}) has completed its information." + notify_admin_slot_is_canceled: + USER_s_reservation_on_the_DATE_was_cancelled_remember_to_generate_a_refund_invoice_if_applicable_html: "%{USER}'s reservation, on the %{DATE}, was cancelled. Remember to generate a refund invoice if applicable." + notify_admin_slot_is_modified: + a_booking_slot_was_modified: "A booking slot was modified." + notify_admin_subscribed_plan: + subscription_PLAN_has_been_subscribed_by_USER_html: "Subscription %{PLAN} has been subscribed by %{USER}." + notify_admin_subscription_canceled: + USER_s_subscription_has_been_cancelled: "%{USER}'s subscription has been cancelled." + notify_admin_subscription_extended: + subscription_PLAN_of_the_member_USER_has_been_extended_FREE_until_DATE_html: "Subscription {PLAN} of the member {USER} has been extended {FREE, select, true{for free} other{}} until {DATE}." #messageFormat interpolation + notify_admin_subscription_is_expired: + USER_s_subscription_has_expired: "%{USER}'s subscription has expired." + notify_admin_subscription_will_expire_in_7_days: + USER_s_subscription_will_expire_in_7_days: "%{USER}'s subscription will expire in 7 days." + notify_admin_training_auto_cancelled: + auto_cancelled_training: "The %{TRAINING} training session scheduled for %{DATE}, has been automatically canceled due to an insufficient number of participants." + auto_refund: "The members were automatically refunded on their wallet." + manual_refund: "Please refund each members." + notify_admin_user_group_changed: + user_NAME_changed_his_group_html: "User {NAME} changed group." #messageFormat interpolation + notify_admin_user_merged: + user_NAME_has_merged_his_account_with_the_one_imported_from_PROVIDER_UID_html: "{NAME}'s account was merged with the one imported from {PROVIDER} ({%UID})." #messageFormat interpolation + notify_admin_when_project_published: + project_NAME_has_been_published_html: "Project
%{NAME} has been published." + notify_admin_when_user_is_created: + a_new_user_account_has_been_created_NAME_EMAIL_html: "A new user account has been created: %{NAME} <%{EMAIL}>." + notify_admin_child_created: + a_new_child_has_been_created_NAME_html: "A new child has been created: %{NAME}." + notify_admin_when_user_is_imported: + a_new_user_account_has_been_imported_from_PROVIDER_UID_html: "A new user account has been imported from: %{PROVIDER} (%{UID})." + notify_member_create_reservation: + your_reservation_RESERVABLE_was_successfully_saved_html: "Your reservation %{RESERVABLE} was successfully saved." + notify_member_pre_booked_reservation: + your_reservation_RESERVABLE_was_successfully_saved_html: "Your pre-registration %{RESERVABLE} was successfully saved." + notify_member_reservation_reminder: + reminder_you_have_a_reservation_RESERVABLE_to_be_held_on_DATE_html: "Reminder: You have a reservation %{RESERVABLE} to be held on %{DATE}" + notify_member_slot_is_canceled: + your_reservation_RESERVABLE_of_DATE_was_successfully_cancelled: "Your reservation %{RESERVABLE} of %{DATE} was successfully cancelled." + notify_member_slot_is_modified: + your_reservation_slot_was_successfully_changed: "Your reservation slot was successfully changed." + notify_member_subscribed_plan: + you_have_subscribed_to_PLAN_html: "You have subscribed to %{PLAN}." + notify_member_subscribed_plan_is_changed: + you_have_changed_your_subscription_to_PLAN_html: "You have changed your subscription to %{PLAN}." + notify_member_subscription_canceled: + your_subscription_PLAN_was_successfully_cancelled_html: "Your subscription %{PLAN} was successfully cancelled." + notify_member_subscription_extended: + your_subscription_PLAN_has_been_extended_FREE_until_DATE_html: "Your subscription {PLAN} has been extended {FREE, select, true{for free} other{}} until {DATE}." #messageFormat interpolation + notify_member_subscription_is_expired: + your_subscription_has_expired: "Your subscription has expired." + notify_member_subscription_will_expire_in_7_days: + your_subscription_will_expire_in_7_days: "Your subscription will expire in 7 days." + notify_member_training_authorization_expired: + training_authorization_revoked: "Your authorization to use %{MACHINES} has been revoked because it has expired." + notify_member_training_auto_cancelled: + auto_cancelled_training: "The %{TRAINING} training session scheduled for %{DATE}, has been canceled due to an insufficient number of participants." + auto_refund: "You were refunded on your wallet." + notify_member_training_invalidated: + invalidated: "Your authorization to use %{MACHINES} has been invalidated due to a lack of reservations." + notify_partner_subscribed_plan: + subscription_partner_PLAN_has_been_subscribed_by_USER_html: "Partner subscription %{PLAN} has been subscribed by %{USER}." + notify_project_author_when_collaborator_valid: + USER_became_collaborator_of_your_project: "%{USER} became collaborator of your project:" + notify_project_collaborator_to_valid: + you_are_invited_to_collaborate_on_the_project: "You are invited to collaborate on the project:" + notify_user_auth_migration: + your_account_was_migrated: "You account was successfully migrated to the new authentication system." + notify_user_profile_complete: + your_profile_was_completed: "Your profile was successfully completed, you now have access to the entire platform." + notify_user_training_valid: + your_TRAINING_was_validated_html: "Your training %{TRAINING} was successfully validated." + notify_user_user_group_changed: + your_group_has_changed: "Your group has changed." + notify_user_when_avoir_ready: + your_avoir_is_ready_html: "Your refund invoice #%{REFERENCE}, of %{AMOUNT}, is ready. Click here to download." + notify_user_when_invoice_ready: + your_invoice_is_ready_html: "Your invoice #%{REFERENCE}, of %{AMOUNT} is ready. Click here to download." + undefined_notification: + unknown_notification: "Unknown notification" + notification_ID_wrong_type_TYPE_unknown: "Notification %{ID} wrong (type %{TYPE} unknown)" + notify_user_wallet_is_credited: + your_wallet_is_credited: "Your wallet has been credited by administrator" + notify_admin_user_wallet_is_credited: + wallet_is_credited: "The wallet of member %{USER} has been credited %{AMOUNT}" + notify_admin_export_complete: + export: "The export" + statistics_global: "of all the statistics" + statistics_account: "of the registration statistics" + statistics_event: "of statistics about events" + statistics_machine: "of statistics about machine slots" + statistics_project: "of statistics about projects" + statistics_subscription: "of subscription statistics" + statistics_training: "of statistics about trainings" + statistics_space: "of statistics about spaces" + statistics_order: "of statistics about store orders" + users_members: "of the members' list" + users_subscriptions: "of the subscriptions' list" + users_reservations: "of the reservations' list" + availabilities_index: "of the reservations availabilities" + accounting_acd: "of the accounting data to ACD" + accounting_vat: "of the collected VAT" + is_over: "is over." + download_here: "Download here" + notify_admin_import_complete: + import_over: "%{CATEGORY} import is over. " + members: "Members" + view_results: "View results." + notify_admin_low_stock_threshold: + low_stock: "Low stock for %{PRODUCT}. " + view_product: "View the product." + notify_member_about_coupon: + enjoy_a_discount_of_PERCENT_with_code_CODE: "Enjoy a discount of %{PERCENT}% with code %{CODE}" + enjoy_a_discount_of_AMOUNT_with_code_CODE: "Enjoy a discount of %{AMOUNT} with code %{CODE}" + notify_admin_free_disk_space: + warning_free_disk_space: "Warning: the server's available disk space is now %{AVAILABLE} MiB" + notify_admin_close_period_reminder: + warning_last_closed_period_over_1_year: "Please remind to periodically close your accounting periods. Last closed period ended at %{LAST_END}" + warning_no_closed_periods: "Please remind to periodically close your accounting periods. You have to close periods from %{FIRST_DATE}" + notify_admin_archive_complete: + archive_complete: "Data archiving from %{START} to %{END} is done. click here to download. Remember to save it on an external secured media." + notify_privacy_policy_changed: + policy_updated: "Privacy policy updated." + click_to_show: "Click here to consult" + notify_admin_refund_created: + refund_created: "A refund of %{AMOUNT} has been created for user %{USER}" + notify_user_role_update: + your_role_is_ROLE: "Your role has been changed to %{ROLE}." + notify_admins_role_update: + user_NAME_changed_ROLE_html: "User %{NAME} is now %{ROLE}." + notify_admin_objects_stripe_sync: + all_objects_sync: "All data were successfully synchronized on Stripe." + notify_admin_order_is_paid: + order_paid_html: "A new order has been placed. View details." + notify_user_when_payment_schedule_ready: + your_schedule_is_ready_html: "Your payment schedule #%{REFERENCE}, of %{AMOUNT}, is ready. Click here to download." + notify_admin_payment_schedule_error: + schedule_error: "An error occurred for the card debit of the %{DATE} deadline, for schedule %{REFERENCE}" + notify_member_payment_schedule_error: + schedule_error: "An error occurred for the card debit of the %{DATE} deadline, for your schedule %{REFERENCE}" + notify_admin_payment_schedule_failed: + schedule_failed: "Failed card debit for the %{DATE} deadline, for schedule %{REFERENCE}" + notify_member_payment_schedule_failed: + schedule_failed: "Failed card debit for the %{DATE} deadline, for your schedule %{REFERENCE}" + notify_admin_payment_schedule_gateway_canceled: + schedule_canceled: "The payment schedule %{REFERENCE} was canceled by the gateway. An action is required." + notify_member_payment_schedule_gateway_canceled: + schedule_canceled: "Your payment schedule %{REFERENCE} was canceled by the gateway." + notify_admin_payment_schedule_check_deadline: + schedule_deadline: "You must cash the check for the %{DATE} deadline, for schedule %{REFERENCE}" + notify_admin_payment_schedule_transfer_deadline: + schedule_deadline: "You must confirm the bank direct debit for the %{DATE} deadline, for schedule %{REFERENCE}" + notify_member_reservation_limit_reached: + limit_reached: "For %{DATE}, you have reached your daily limit of %{HOURS} hours of %{ITEM} reservation." + notify_admin_user_supporting_document_files_created: + supporting_document_files_uploaded: "Supporting document uploaded by member %{NAME}." + notify_admin_user_supporting_document_files_updated: + supporting_document_files_uploaded: "Supporting document changed by member %{NAME}." + notify_admin_user_child_supporting_document_files_created: + supporting_document_files_uploaded: "Child's %{NAME} supporting document uploaded." + notify_admin_user_child_supporting_document_files_updated: + supporting_document_files_uploaded: "Supporting document changed by child %{NAME}." + notify_user_is_validated: + account_validated: "Your account is valid." + notify_user_is_invalidated: + account_invalidated: "Your account is invalid." + notify_user_child_is_validated: + child_validated: "Your account child is valid." + notify_user_child_is_invalidated: + child_invalidated: "Your account child is invalid." + notify_user_supporting_document_refusal: + refusal: "Your supporting documents were refused" + notify_user_supporting_document_reminder: + reminder_message: "This is a reminder for you to upload your supporting documents." + notify_admin_user_supporting_document_refusal: + refusal: "Member's supporting document %{NAME} was refused." + notify_user_child_supporting_document_refusal: + refusal: "Your child's supporting documents were refused" + notify_admin_user_child_supporting_document_refusal: + refusal: "Child's supporting document %{NAME} was refused." + notify_user_order_is_ready: + order_ready: "Your command %{REFERENCE} is ready" + notify_user_order_is_canceled: + order_canceled: "Your command %{REFERENCE} is canceled" + notify_user_order_is_refunded: + order_refunded: "Your command %{REFERENCE} is refunded" + notify_member_reservation_validated: + your_reservation_RESERVABLE_was_validated_html: "Your reservation %{RESERVABLE} was successfully validated." + notify_admin_reservation_validated: + a_RESERVABLE_reservation_was_validated_html: "A %{RESERVABLE} reservation of %{NAME} was validated." + notify_member_reservation_invalidated: + your_reservation_RESERVABLE_was_invalidated_html: "Your pre-registration of %{RESERVABLE} wasn't validated." + notify_admin_reservation_invalidated: + a_RESERVABLE_reservation_was_invalidated_html: "A %{RESERVABLE} pre-registration of %{NAME} was invalidated." + notify_user_when_child_age_will_be_18: + child_age_will_be_18_years_ago: "Your child %{NAME} will turn 18 on %{DATE}, at which point they will be automatically detached from your Family account. They will need to create their own account in order to make reservations." + #statistics tools for admins + statistics: + subscriptions: "Subscriptions" + machines_hours: "Machines slots" + machine_dates: "Slots dates" + space_dates: "Slots dates" + spaces: "Spaces" + orders: "Orders" + trainings: "Trainings" + events: "Events" + registrations: "Registrations" + projects: "Projects" + users: "Users" + training_id: "Training ID" + training_date: "Training Date" + event_id: "Event ID" + event_date: "Event Date" + event_name: "Event Name" + event_theme: "Theme" + age_range: "Age Range" + themes: "Themes" + components: "Components" + machines: "Machines" + user_id: "User ID" + group: "Group" + bookings: "Bookings" + hours_number: "Hours number" + tickets_number: "Tickets number" + revenue: "Revenue" + account_creation: "Account creation" + project_publication: "Project publication" + duration: "Duration" + store: "Store" + paid-processed: "Paid and/or processed" + aborted: "Aborted" + project_status: Status + project_name: Name + project_user_names: Collaborators + #statistics exports to the Excel file format + export: + entries: "Entries" + revenue: "Revenue" + average_age: "Average Age" + total: "Total" + date: "Date" + user: "User" + email: "Email" + phone: "Phone" + gender: "Gender" + age: "Age" + type: "Type" + male: "Man" + female: "Woman" + deleted_user: "Deleted user" + reservation_context: "Reservation context" + coupon: "Coupon" + project_author: Author + #initial price's category for events, created to replace the old "reduced amount" property + price_category: + reduced_fare: "Reduced fare" + reduced_fare_if_you_are_under_25_student_or_unemployed: "Reduced fare if you are under 25, student or unemployed." + cart_items: + free_extension: "Free extension of a subscription, until %{DATE}" + must_be_after_expiration: "The new expiration date must be set after the current expiration date" + group_subscription_mismatch: "Your group mismatch with your subscription. Please report this error." + statistic_profile: + birthday_in_past: "The date of birth must be in the past" + order: + please_contact_FABLAB: "Please contact us for withdrawal instructions." + cart_item_validation: + slot: "The slot doesn't exist" + availability: "The availaility doesn't exist" + full: "The slot is already fully reserved" + deadline: "You can't reserve a slot %{MINUTES} minutes prior to its start" + limit_reached: "You have reached the booking limit of %{HOURS}H per day for the %{RESERVABLE}, for your current subscription. Please adjust your reservation." + restricted: "This availability is restricted for subscribers" + plan: "This subscription plan is disabled" + plan_group: "This subscription plan is reserved for members of group %{GROUP}" + reserved: "This slot is already reserved" + pack: "This prepaid pack is disabled" + pack_group: "This prepaid pack is reserved for members of group %{GROUP}" + space: "This space is disabled" + machine: "This machine is disabled" + reservable: "This machine is not reservable" + blocked_by_another_reservation: "This slot is blocked by another reservation" + cart_validation: + select_user: "Please select a user before continuing" + settings: + locked_setting: "the setting is locked." + about_title: "\"About\" page title" + about_body: "\"About\" page content" + about_contacts: "\"About\" page contacts" + privacy_draft: "Privacy policy draft" + privacy_body: "Privacy policy" + privacy_dpo: "Data protection officer address" + twitter_name: "Twitter feed name" + home_blogpost: "Homepage's brief" + machine_explications_alert: "Explanation message on the machine reservation page" + training_explications_alert: "Explanation message on the training reservation page" + training_information_message: "Information message on the machine reservation page" + subscription_explications_alert: "Explanation message on the subscription page" + invoice_logo: "Invoices' logo" + invoice_reference: "Invoice's reference" + invoice_code-active: "Activation of the invoices' code" + invoice_code-value: "Invoices' code" + invoice_order-nb: "Invoice's order number" + invoice_VAT-active: "Activation of the VAT" + invoice_VAT-rate: "VAT rate" + invoice_VAT-rate_Product: "VAT rate for shop's product sales" + invoice_VAT-rate_Event: "VAT rate for event reservations" + invoice_VAT-rate_Machine: "VAT rate for machine reservations" + invoice_VAT-rate_Subscription: "VAT rate for subscriptions" + invoice_VAT-rate_Space: "VAT rate for space reservations" + invoice_VAT-rate_Training: "VAT rate for training reservations" + invoice_text: "Invoices' text" + invoice_legals: "Invoices' legal information" + booking_window_start: "Opening time" + booking_window_end: "Closing time" + booking_move_enable: "Activation of reservations moving" + booking_move_delay: "Preventive delay before any reservation move" + booking_cancel_enable: "Activation of reservations cancelling" + booking_cancel_delay: "Preventive delay before any reservation cancellation" + main_color: "Main colour" + secondary_color: "Secondary colour" + fablab_name: "Fablab's name" + name_genre: "Title concordance" + reminder_enable: "Activation of reservations reminding" + reminder_delay: "Delay before sending the reminder" + event_explications_alert: "Explanation message on the event reservation page" + space_explications_alert: "Explanation message on the space reservation page" + visibility_yearly: "Maximum visibility for annual subscribers" + visibility_others: "Maximum visibility for other members" + reservation_deadline: "Prevent reservation before it starts" + display_name_enable: "Display names in the calendar" + machines_sort_by: "Machines display order" + accounting_sales_journal_code: "Sales journal code" + accounting_payment_card_code: "Card payments code" + accounting_payment_card_label: "Card payments label" + accounting_payment_card_journal_code: "Card clients journal code" + accounting_payment_wallet_code: "Wallet payments code" + accounting_payment_wallet_label: "Wallet payments label" + accounting_payment_wallet_journal_code: "Wallet payments journal code" + accounting_payment_other_code: "Other payment means code" + accounting_payment_other_label: "Other payment means label" + accounting_payment_other_journal_code: "Other payment means journal code" + accounting_wallet_code: "Wallet credit code" + accounting_wallet_label: "Wallet credit label" + accounting_wallet_journal_code: "Wallet credit journal code" + accounting_VAT_code: "VAT code" + accounting_VAT_label: "VAT label" + accounting_VAT_journal_code: "VAT journal code" + accounting_subscription_code: "Subscriptions code" + accounting_subscription_label: "Subscriptions label" + accounting_Machine_code: "Machines code" + accounting_Machine_label: "Machines label" + accounting_Training_code: "Trainings code" + accounting_Training_label: "Trainings label" + accounting_Event_code: "Events code" + accounting_Event_label: "Events label" + accounting_Space_code: "Spaces code" + accounting_Space_label: "Spaces label" + accounting_Pack_code: "Prepaid-hours pack code" + accounting_Pack_label: "Prepaid-hours pack label" + accounting_Product_code: "Store products code" + accounting_Product_label: "Store products label" + hub_last_version: "Last Fab-manager's version" + hub_public_key: "Instance public key" + fab_analytics: "Fab Analytics" + link_name: "Link title to the \"About\" page" + home_content: "The home page" + home_css: "Stylesheet of the home page" + origin: "Instance URL" + uuid: "Instance ID" + phone_required: "Phone required?" + tracking_id: "Tracking ID" + book_overlapping_slots: "Book overlapping slots" + slot_duration: "Default duration of booking slots" + events_in_calendar: "Display events in the calendar" + spaces_module: "Spaces module" + plans_module: "Plans modules" + invoicing_module: "Invoicing module" + facebook_app_id: "Facebook App ID" + twitter_analytics: "Twitter analytics account" + recaptcha_site_key: "reCAPTCHA Site Key" + recaptcha_secret_key: "reCAPTCHA Secret Key" + feature_tour_display: "Feature tour display mode" + email_from: "Expeditor's address" + disqus_shortname: "Disqus shortname" + allowed_cad_extensions: "Allowed CAD files extensions" + allowed_cad_mime_types: "Allowed CAD files MIME types" + openlab_app_id: "OpenLab ID" + openlab_app_secret: "OpenLab secret" + openlab_default: "Default projects gallery view" + online_payment_module: "Online payments module" + stripe_public_key: "Stripe public key" + stripe_secret_key: "Stripe secret key" + stripe_currency: "Stripe currency" + invoice_prefix: "Invoices' files prefix" + confirmation_required: "Confirmation required" + wallet_module: "Wallet module" + statistics_module: "Statistics module" + upcoming_events_shown: "Display limit for upcoming events" + payment_schedule_prefix: "Payment schedule's files prefix" + trainings_module: "Trainings module" + address_required: "Address required" + accounting_Error_code: "Errors code" + accounting_Error_label: "Errors label" + payment_gateway: "Payment gateway" + payzen_username: "PayZen username" + payzen_password: "PayZen password" + payzen_endpoint: "PayZen API endpoint" + payzen_public_key: "PayZen client public key" + payzen_hmac: "PayZen HMAC-SHA-256 key" + payzen_currency: "PayZen currency" + public_agenda_module: "Public agenda module" + renew_pack_threshold: "Threshold for packs renewal" + pack_only_for_subscription: "Restrict packs for subscribers" + overlapping_categories: "Categories for overlapping booking prevention" + extended_prices_in_same_day: "Extended prices in the same day" + public_registrations: "Public registrations" + facebook: "facebook" + twitter: "twitter" + viadeo: "viadeo" + linkedin: "linkedin" + instagram: "instagram" + youtube: "youtube" + vimeo: "vimeo" + dailymotion: "dailymotion" + github: "github" + echosciences: "echosciences" + pinterest: "pinterest" + lastfm: "lastfm" + flickr: "flickr" + machines_module: "Machines module" + user_change_group: "Allow users to change their group" + store_module: "Store module" + store_withdrawal_instructions: "Withdrawal instructions" + store_hidden: "Store hidden to the public" + advanced_accounting: "Advanced accounting" + external_id: "external identifier" + prevent_invoices_zero: "prevent building invoices at 0" + invoice_VAT-name: "VAT name" + trainings_auto_cancel: "Trainings automatic cancellation" + trainings_auto_cancel_threshold: "Minimum participants for automatic cancellation" + trainings_auto_cancel_deadline: "Automatic cancellation deadline" + trainings_authorization_validity: "Trainings validity period" + trainings_authorization_validity_duration: "Trainings validity period duration" + trainings_invalidation_rule: "Trainings automatic invalidation" + trainings_invalidation_rule_period: "Grace period before invalidating a training" + projects_list_member_filter_presence: "Presence of member filter on projects list" + projects_list_date_filters_presence: "Presence of dates filter on projects list" + project_categories_filter_placeholder: "Placeholder for categories filter in project gallery" + project_categories_wording: "Wording used to replace \"Categories\" on public pages" + reservation_context_feature: "Force member to select the nature of his reservation when reserving" + family_account: "Family account" + #statuses of projects + statuses: + new: "New" + pending: "Pending" + done: "Done" + abandoned: "Abandoned" From 15b63c896e03f82bf726a7bc2a1dc128ea66d55a Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 2 Jan 2024 17:24:06 +0100 Subject: [PATCH 02/17] (ui) Fix button color --- .../javascript/components/cart/abstract-item.tsx | 2 +- .../src/javascript/components/events/event-form.tsx | 2 +- .../javascript/components/form/form-file-upload.tsx | 2 +- .../components/form/form-image-upload.tsx | 2 +- .../javascript/components/store/product-item.tsx | 1 - .../modules/base/edit-destroy-buttons.scss | 2 +- .../src/stylesheets/modules/cart/store-cart.scss | 4 ++-- .../src/stylesheets/modules/store/_utilities.scss | 4 ++-- .../modules/store/product-categories.scss | 2 +- .../stylesheets/modules/store/products-list.scss | 13 ------------- 10 files changed, 10 insertions(+), 24 deletions(-) diff --git a/app/frontend/src/javascript/components/cart/abstract-item.tsx b/app/frontend/src/javascript/components/cart/abstract-item.tsx index 611575b1c..c9d7340eb 100644 --- a/app/frontend/src/javascript/components/cart/abstract-item.tsx +++ b/app/frontend/src/javascript/components/cart/abstract-item.tsx @@ -76,7 +76,7 @@ export const AbstractItem: React.FC = ({ item, errors, cart, {t('app.public.abstract_item.total')}

{FormatLib.price(OrderLib.itemAmount(item))}

- + diff --git a/app/frontend/src/javascript/components/events/event-form.tsx b/app/frontend/src/javascript/components/events/event-form.tsx index be1330378..499b71647 100644 --- a/app/frontend/src/javascript/components/events/event-form.tsx +++ b/app/frontend/src/javascript/components/events/event-form.tsx @@ -361,7 +361,7 @@ export const EventForm: React.FC = ({ action, event, onError, on formState={formState} label={t('app.admin.event_form.price')} addOn={FormatLib.currencySymbol()} /> - handlePriceRemove(price, index)} icon={} /> + handlePriceRemove(price, index)} icon={} /> ))} append({})}> diff --git a/app/frontend/src/javascript/components/form/form-file-upload.tsx b/app/frontend/src/javascript/components/form/form-file-upload.tsx index 22b58a252..40ffcc325 100644 --- a/app/frontend/src/javascript/components/form/form-file-upload.tsx +++ b/app/frontend/src/javascript/components/form/form-file-upload.tsx @@ -103,7 +103,7 @@ export const FormFileUpload = ({ id, label, re onChange={onFileSelected} placeholder={placeholder()}/> {showRemoveButton && hasFile() && - } className="is-main" /> + } className="is-alert" /> } diff --git a/app/frontend/src/javascript/components/form/form-image-upload.tsx b/app/frontend/src/javascript/components/form/form-image-upload.tsx index d28957f9d..09bfbff76 100644 --- a/app/frontend/src/javascript/components/form/form-image-upload.tsx +++ b/app/frontend/src/javascript/components/form/form-image-upload.tsx @@ -127,7 +127,7 @@ export const FormImageUpload = - {hasImage() && } className="is-main" />} + {hasImage() && } className="is-alert" />} ); diff --git a/app/frontend/src/javascript/components/store/product-item.tsx b/app/frontend/src/javascript/components/store/product-item.tsx index ba49ccd4d..4da5bfd86 100644 --- a/app/frontend/src/javascript/components/store/product-item.tsx +++ b/app/frontend/src/javascript/components/store/product-item.tsx @@ -73,7 +73,6 @@ export const ProductItem: React.FC = ({ product, onEdit, onDel
diff --git a/app/frontend/src/javascript/components/authentication-provider/saml-data-mapping-form.tsx b/app/frontend/src/javascript/components/authentication-provider/saml-data-mapping-form.tsx new file mode 100644 index 000000000..7039b0880 --- /dev/null +++ b/app/frontend/src/javascript/components/authentication-provider/saml-data-mapping-form.tsx @@ -0,0 +1,87 @@ +import { Path, UseFormRegister } from 'react-hook-form'; +import { FieldValues } from 'react-hook-form/dist/types/fields'; +import { FormInput } from '../form/form-input'; +import { HtmlTranslate } from '../base/html-translate'; +import { useTranslation } from 'react-i18next'; +import { UnpackNestedValue, UseFormSetValue, FormState } from 'react-hook-form/dist/types/form'; +import { FabButton } from '../base/fab-button'; +import { FieldPathValue } from 'react-hook-form/dist/types/path'; +import { AuthenticationProviderMapping } from '../../models/authentication-provider'; + +interface SamlDataMappingFormProps { + register: UseFormRegister, + setValue: UseFormSetValue, + currentFormValues: Array, + index: number, + formState: FormState +} + +/** + * Partial form to set the data mapping for an SAML provider. + * The data mapping is the way to bind data from the SAML to the Fab-manager's database + */ +export const SamlDataMappingForm = ({ register, setValue, currentFormValues, index, formState }: SamlDataMappingFormProps) => { + const { t } = useTranslation('admin'); + + const standardConfiguration = { + 'user.uid': { api_field: 'email' }, + 'user.email': { api_field: 'email' }, + 'user.username': { api_field: 'login' }, + 'profile.first_name': { api_field: 'firstName' }, + 'profile.last_name': { api_field: 'lastName' }, + 'profile.phone': { api_field: 'primaryPhone' }, + 'profile.address': { api_field: 'postalAddress' } + }; + + /** + * Set the data mapping according to the standard OpenID Connect specification + */ + const openIdStandardConfiguration = (): void => { + const model = currentFormValues[index]?.local_model; + const field = currentFormValues[index]?.local_field; + const configuration = standardConfiguration[`${model}.${field}`]; + if (configuration) { + setValue( + `auth_provider_mappings_attributes.${index}.api_field` as Path, + configuration.api_field as UnpackNestedValue>> + ); + if (configuration.transformation) { + Object.keys(configuration.transformation).forEach((key) => { + setValue( + `auth_provider_mappings_attributes.${index}.transformation.${key}` as Path, + configuration.transformation[key] as UnpackNestedValue>> + ); + }); + } + } + }; + + return ( +
+ + + } + label={t('app.admin.authentication.saml_data_mapping_form.api_field')} /> + } + className="auto-configure-button" + onClick={openIdStandardConfiguration} + tooltip={t('app.admin.authentication.saml_data_mapping_form.openid_standard_configuration')} /> +
+ ); +}; diff --git a/app/frontend/src/javascript/components/authentication-provider/saml-form.tsx b/app/frontend/src/javascript/components/authentication-provider/saml-form.tsx index 3c9df8565..5fdbd9221 100644 --- a/app/frontend/src/javascript/components/authentication-provider/saml-form.tsx +++ b/app/frontend/src/javascript/components/authentication-provider/saml-form.tsx @@ -30,14 +30,32 @@ export const SamlForm = ({ register, strategyN + + +
diff --git a/app/frontend/src/javascript/controllers/admin/authentications.js b/app/frontend/src/javascript/controllers/admin/authentications.js index 8dcab8592..55491bdf4 100644 --- a/app/frontend/src/javascript/controllers/admin/authentications.js +++ b/app/frontend/src/javascript/controllers/admin/authentications.js @@ -19,7 +19,8 @@ const METHODS = { DatabaseProvider: 'local_database', OAuth2Provider: 'o_auth2', - OpenIdConnectProvider: 'openid_connect' + OpenIdConnectProvider: 'openid_connect', + SamlProvider: 'saml' }; /** diff --git a/app/frontend/src/javascript/models/authentication-provider.ts b/app/frontend/src/javascript/models/authentication-provider.ts index 59700726a..a9e61cd09 100644 --- a/app/frontend/src/javascript/models/authentication-provider.ts +++ b/app/frontend/src/javascript/models/authentication-provider.ts @@ -69,6 +69,9 @@ export interface SamlProvider { id?: string, sp_entity_id: string, idp_sso_service_url: string + idp_cert_fingerprint: string, + idp_cert: string, + profile_url: string, } export interface MappingFields { diff --git a/app/frontend/src/stylesheets/application.scss b/app/frontend/src/stylesheets/application.scss index 9d763ef92..3806e85c6 100644 --- a/app/frontend/src/stylesheets/application.scss +++ b/app/frontend/src/stylesheets/application.scss @@ -22,6 +22,7 @@ @import "modules/authentication-provider/array-mapping-form"; @import "modules/authentication-provider/data-mapping-form"; @import "modules/authentication-provider/openid-connect-data-mapping-form"; +@import "modules/authentication-provider/saml-data-mapping-form"; @import "modules/authentication-provider/provider-form"; @import "modules/authentication-provider/type-mapping-modal"; @import "modules/base/edit-destroy-buttons"; diff --git a/app/frontend/src/stylesheets/modules/authentication-provider/saml-data-mapping-form.scss b/app/frontend/src/stylesheets/modules/authentication-provider/saml-data-mapping-form.scss new file mode 100644 index 000000000..70e11dad2 --- /dev/null +++ b/app/frontend/src/stylesheets/modules/authentication-provider/saml-data-mapping-form.scss @@ -0,0 +1,7 @@ +.saml-data-mapping-form { + .auto-configure-button { + align-self: center; + margin-top: 0.8rem; + margin-left: 20px; + } +} diff --git a/app/models/auth_provider.rb b/app/models/auth_provider.rb index 8b21c58ae..5628cfb00 100644 --- a/app/models/auth_provider.rb +++ b/app/models/auth_provider.rb @@ -17,7 +17,7 @@ class AuthProvider < ApplicationRecord end end - PROVIDABLE_TYPES = %w[DatabaseProvider OAuth2Provider OpenIdConnectProvider].freeze + PROVIDABLE_TYPES = %w[DatabaseProvider OAuth2Provider OpenIdConnectProvider SamlProvider].freeze belongs_to :providable, polymorphic: true, dependent: :destroy accepts_nested_attributes_for :providable @@ -27,7 +27,7 @@ class AuthProvider < ApplicationRecord validates :providable_type, inclusion: { in: PROVIDABLE_TYPES } validates :name, presence: true, uniqueness: true - validates_with UserUidMappedValidator, if: -> { %w[OAuth2Provider OpenIdConnectProvider].include?(providable_type) } + validates_with UserUidMappedValidator, if: -> { %w[OAuth2Provider OpenIdConnectProvider SamlProvider].include?(providable_type) } before_create :set_initial_state after_update :write_reload_config diff --git a/app/views/api/auth_providers/show.json.jbuilder b/app/views/api/auth_providers/show.json.jbuilder index ff0535c57..55531d9c6 100644 --- a/app/views/api/auth_providers/show.json.jbuilder +++ b/app/views/api/auth_providers/show.json.jbuilder @@ -22,6 +22,6 @@ end if @provider.providable_type == SamlProvider.name json.providable_attributes do - json.extract! @provider.providable, :id, :sp_entity_id, :idp_sso_service_url + json.extract! @provider.providable, :id, :sp_entity_id, :idp_sso_service_url, :profile_url, :idp_cert_fingerprint, :idp_cert end end diff --git a/app/views/auth_provider/provider.json.jbuilder b/app/views/auth_provider/provider.json.jbuilder index 30bcd2fef..efbfbdce8 100644 --- a/app/views/auth_provider/provider.json.jbuilder +++ b/app/views/auth_provider/provider.json.jbuilder @@ -20,3 +20,9 @@ if provider.providable_type == 'OpenIdConnectProvider' :extra_authorize_params end end + +if provider.providable_type == 'SamlProvider' + json.providable_attributes do + json.extract! provider.providable, :id, :sp_entity_id, :idp_sso_service_url, :profile_url, :idp_cert_fingerprint, :idp_cert + end +end diff --git a/config/environments/development.rb b/config/environments/development.rb index d2d22723f..93e33c9f4 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -91,6 +91,8 @@ Rails.application.configure do config.web_console.permissions = %w[192.168.0.0/16 192.168.99.0/16 10.0.2.2] config.hosts << ENV.fetch('DEFAULT_HOST', 'localhost') + config.hosts << "37abab1a904d96b727afdf86f2eb4830.serveo.net" + config.action_controller.forgery_protection_origin_check = false # https://github.com/flyerhzm/bullet # In development, Bullet will find and report N+1 DB requests diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index 7a465d9f1..5b5b71555 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -248,8 +248,10 @@ Devise.setup do |config| when 'SamlProvider' require_relative '../../lib/omni_auth/saml' config.omniauth active_provider.strategy_name.to_sym, - active_provider.providable.sp_entity_id, - active_provider.providable.idp_sso_service_url, + sp_entity_id: active_provider.providable.sp_entity_id, + idp_sso_service_url: active_provider.providable.idp_sso_service_url, + idp_cert: active_provider.providable.idp_cert, + idp_cert_fingerprint: active_provider.providable.idp_cert_fingerprint, strategy_class: OmniAuth::Strategies::SsoSamlProvider end end diff --git a/config/locales/app.admin.en.yml b/config/locales/app.admin.en.yml index 67341f678..57b6c3470 100644 --- a/config/locales/app.admin.en.yml +++ b/config/locales/app.admin.en.yml @@ -1230,6 +1230,7 @@ en: local_database: "Local database" o_auth2: "OAuth 2.0" openid_connect: "OpenID Connect" + saml: "SAML" group_form: add_a_group: "Add a group" group_name: "Group name" @@ -1496,6 +1497,10 @@ en: api_field: "Userinfo claim" api_field_help_html: 'Set the field providing the corresponding data through the userinfo endpoint.
JsonPath syntax is supported. If many fields are selected, the first one will be used.
Example: $.data[*].name' openid_standard_configuration: "Use the OpenID standard configuration" + saml_data_mapping_form: + api_field: "Userinfo field" + api_field_help_html: "Set the field providing the corresponding data through the SAML assertion.
If many fields are selected, the first one will be used.
Example: $.data[*].name" + openid_standard_configuration: "Use the SAML standard configuration" type_mapping_modal: data_mapping: "Data mapping" TYPE_expected: "{TYPE} expected" @@ -1552,6 +1557,16 @@ en: client__end_session_endpoint_help: "The url to call to log the user out at the authorization server." extra_authorize_params: "Extra authorize parameters" extra_authorize_params_help: "A hash of extra fixed parameters that will be merged to the authorization request" + saml_form: + authorization_callback_url: "Authorization callback URL" + sp_entity_id: "Service provider entity ID" + sp_entity_id_help: "The name of your application. Some identity providers might need this to establish the identity of the service provider requesting the login." + idp_sso_service_url: "Identity provider SSO service URL" + idp_sso_service_url_help: "The URL to which the authentication request should be sent. This would be on the identity provider." + idp_cert_fingerprint: "Identity provider certificate fingerprint" + idp_cert: "Identity provider certificate" + profile_edition_url: "Profil edition URL" + profile_edition_url_help: "The URL of the page where the user can edit his profile." provider_form: name: "Name" authentication_type: "Authentication type" @@ -1562,6 +1577,7 @@ en: local_database: "Local database" oauth2: "OAuth 2.0" openid_connect: "OpenID Connect" + saml: "SAML" #create a new authentication provider (SSO) authentication_new: add_a_new_authentication_provider: "Add a new authentication provider" diff --git a/db/migrate/20240126145351_add_profile_url_to_saml_providers.rb b/db/migrate/20240126145351_add_profile_url_to_saml_providers.rb new file mode 100644 index 000000000..50d10bb4d --- /dev/null +++ b/db/migrate/20240126145351_add_profile_url_to_saml_providers.rb @@ -0,0 +1,7 @@ +# frozen_string_literal:true + +class AddProfileUrlToSamlProviders < ActiveRecord::Migration[7.0] + def change + add_column :saml_providers, :profile_url, :string +s end +end diff --git a/db/migrate/20240126192110_add_idp_cert_to_saml_provider.rb b/db/migrate/20240126192110_add_idp_cert_to_saml_provider.rb new file mode 100644 index 000000000..d6f5893c9 --- /dev/null +++ b/db/migrate/20240126192110_add_idp_cert_to_saml_provider.rb @@ -0,0 +1,6 @@ +class AddIdpCertToSamlProvider < ActiveRecord::Migration[7.0] + def change + add_column :saml_providers, :idp_cert, :string + add_column :saml_providers, :idp_cert_fingerprint, :string + end +end diff --git a/db/structure.sql b/db/structure.sql index 62f1c8dec..aad684c7c 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -3275,7 +3275,10 @@ CREATE TABLE public.saml_providers ( sp_entity_id character varying, idp_sso_service_url character varying, created_at timestamp(6) without time zone NOT NULL, - updated_at timestamp(6) without time zone NOT NULL + updated_at timestamp(6) without time zone NOT NULL, + profile_url character varying, + idp_cert character varying, + idp_cert_fingerprint character varying ); @@ -9319,6 +9322,8 @@ INSERT INTO "schema_migrations" (version) VALUES ('20230907124230'), ('20231103093436'), ('20231108094433'), -('20240116163703'); +('20240116163703'), +('20240126145351'), +('20240126192110'); diff --git a/lib/omni_auth/saml.rb b/lib/omni_auth/saml.rb index d63791c61..461749f30 100644 --- a/lib/omni_auth/saml.rb +++ b/lib/omni_auth/saml.rb @@ -1,3 +1,3 @@ # frozen_string_literal: true -require_relative 'strategies/saml_provider' +require_relative 'strategies/sso_saml_provider' diff --git a/lib/omni_auth/strategies/sso_saml_provider.rb b/lib/omni_auth/strategies/sso_saml_provider.rb index b8405a426..ab48aac0e 100644 --- a/lib/omni_auth/strategies/sso_saml_provider.rb +++ b/lib/omni_auth/strategies/sso_saml_provider.rb @@ -1,8 +1,34 @@ # frozen_string_literal: true require 'omniauth-saml' +require_relative '../data_mapping/mapper' # Authentication strategy provided trough SAML class OmniAuth::Strategies::SsoSamlProvider < OmniAuth::Strategies::SAML include OmniAuth::DataMapping::Mapper + + def self.active_provider + active_provider = Rails.configuration.auth_provider + if active_provider.providable_type != 'SamlProvider' + raise "Trying to instantiate the wrong provider: Expected SamlProvider, received #{active_provider.providable_type}" + end + + active_provider + end + + # Strategy name. + option :name, active_provider.strategy_name + + info do + { + mapping: parsed_info + } + end + + def parsed_info + mapped_info( + OmniAuth::Strategies::SsoSamlProvider.active_provider.auth_provider_mappings, + user_info: @attributes.attributes.transform_values {|v| v.is_a?(Array) ? v.first : v } + ) + end end From b0c66ca6e2d4b257ef7291bc9bfee448e1e02074 Mon Sep 17 00:00:00 2001 From: Du Peng Date: Mon, 29 Jan 2024 14:57:44 +0100 Subject: [PATCH 14/17] (feat) Support for SAML in Single-Sign-On authentication providers --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94809cc9f..435445e10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Next release - Fix a bug: if there is a reservation with a deleted user, it is not possible to delete the event +- Support for SAML in Single-Sign-On authentication providers ## v6.3.10 2024 January 19 From 4c8b357ed6f604a6688d090655fc8726fdb30cc4 Mon Sep 17 00:00:00 2001 From: Du Peng Date: Mon, 29 Jan 2024 16:08:16 +0100 Subject: [PATCH 15/17] (i18n) updates translations --- config/locales/app.admin.de.yml | 16 ++ config/locales/app.admin.es-MX.yml | 16 ++ config/locales/app.admin.es.yml | 16 ++ config/locales/app.admin.fr.yml | 16 ++ config/locales/app.admin.it.yml | 16 ++ config/locales/app.admin.no.yml | 16 ++ config/locales/app.admin.pt.yml | 16 ++ config/locales/app.admin.sv.yml | 224 ++++++++------- config/locales/app.admin.zu.yml | 16 ++ config/locales/mails.es-MX.yml | 6 +- config/locales/mails.es.yml | 6 +- config/locales/mails.sv.yml | 436 ++++++++++++++--------------- 12 files changed, 472 insertions(+), 328 deletions(-) diff --git a/config/locales/app.admin.de.yml b/config/locales/app.admin.de.yml index 24940b797..ef91ed4c3 100644 --- a/config/locales/app.admin.de.yml +++ b/config/locales/app.admin.de.yml @@ -1230,6 +1230,7 @@ de: local_database: "Lokale Datenbank" o_auth2: "OAuth 2.0" openid_connect: "OpenID Connect" + saml: "SAML" group_form: add_a_group: "Gruppe hinzufügen" group_name: "Gruppenname" @@ -1496,6 +1497,10 @@ de: api_field: "Userinfo claim" api_field_help_html: 'Set the field providing the corresponding data through the userinfo endpoint.
JsonPath syntax is supported. If many fields are selected, the first one will be used.
Example: $.data[*].name' openid_standard_configuration: "Use the OpenID standard configuration" + saml_data_mapping_form: + api_field: "Userinfo field" + api_field_help_html: "Set the field providing the corresponding data through the SAML assertion.
If many fields are selected, the first one will be used.
Example: $.data[*].name" + openid_standard_configuration: "Use the SAML standard configuration" type_mapping_modal: data_mapping: "Datenzuordnung" TYPE_expected: "{TYPE} erwartet" @@ -1552,6 +1557,16 @@ de: client__end_session_endpoint_help: "The url to call to log the user out at the authorization server." extra_authorize_params: "Extra authorize parameters" extra_authorize_params_help: "A hash of extra fixed parameters that will be merged to the authorization request" + saml_form: + authorization_callback_url: "Authorization callback URL" + sp_entity_id: "Service provider entity ID" + sp_entity_id_help: "The name of your application. Some identity providers might need this to establish the identity of the service provider requesting the login." + idp_sso_service_url: "Identity provider SSO service URL" + idp_sso_service_url_help: "The URL to which the authentication request should be sent. This would be on the identity provider." + idp_cert_fingerprint: "Identity provider certificate fingerprint" + idp_cert: "Identity provider certificate" + profile_edition_url: "Profil edition URL" + profile_edition_url_help: "The URL of the page where the user can edit his profile." provider_form: name: "Name" authentication_type: "Authentifizierungsart" @@ -1562,6 +1577,7 @@ de: local_database: "Lokale Datenbank" oauth2: "OAuth 2.0" openid_connect: "OpenID Connect" + saml: "SAML" #create a new authentication provider (SSO) authentication_new: add_a_new_authentication_provider: "Neuen Authentifizierungsanbieter hinzufügen" diff --git a/config/locales/app.admin.es-MX.yml b/config/locales/app.admin.es-MX.yml index f7da2de92..0a1cdf607 100644 --- a/config/locales/app.admin.es-MX.yml +++ b/config/locales/app.admin.es-MX.yml @@ -1230,6 +1230,7 @@ es-MX: local_database: "Base de datos local" o_auth2: "OAuth 2.0" openid_connect: "OpenID Connect" + saml: "SAML" group_form: add_a_group: "Añadir un grupo" group_name: "Nombre del grupo" @@ -1496,6 +1497,10 @@ es-MX: api_field: "Reclamo de Userinfo" api_field_help_html: 'Establece el campo que proporciona los datos correspondientes a través del userinfo endpoint.
Se admite la sintaxis JsonPath. Si se seleccionan muchos campos, se utilizará el primero.
Ejemplo: $.data[*].name' openid_standard_configuration: "Usar la configuración estándar de OpenID" + saml_data_mapping_form: + api_field: "Userinfo field" + api_field_help_html: "Set the field providing the corresponding data through the SAML assertion.
If many fields are selected, the first one will be used.
Example: $.data[*].name" + openid_standard_configuration: "Use the SAML standard configuration" type_mapping_modal: data_mapping: "Mapeo de datos" TYPE_expected: "{TYPE} esperado" @@ -1552,6 +1557,16 @@ es-MX: client__end_session_endpoint_help: "La URL a llamar para cerrar la sesión del usuario en el servidor de autorización." extra_authorize_params: "Parámetros de autorización extra" extra_authorize_params_help: "Un hash de parámetros extra que se fusionarán con la \"authorization request\"" + saml_form: + authorization_callback_url: "Authorization callback URL" + sp_entity_id: "Service provider entity ID" + sp_entity_id_help: "The name of your application. Some identity providers might need this to establish the identity of the service provider requesting the login." + idp_sso_service_url: "Identity provider SSO service URL" + idp_sso_service_url_help: "The URL to which the authentication request should be sent. This would be on the identity provider." + idp_cert_fingerprint: "Identity provider certificate fingerprint" + idp_cert: "Identity provider certificate" + profile_edition_url: "Profil edition URL" + profile_edition_url_help: "The URL of the page where the user can edit his profile." provider_form: name: "Nombre" authentication_type: "Tipo de autenticación" @@ -1562,6 +1577,7 @@ es-MX: local_database: "Base de datos local" oauth2: "OAuth 2.0" openid_connect: "OpenID Connect" + saml: "SAML" #create a new authentication provider (SSO) authentication_new: add_a_new_authentication_provider: "Agregar un nuevo proveedor de autenticación" diff --git a/config/locales/app.admin.es.yml b/config/locales/app.admin.es.yml index 2aacd4d97..11d4ce82f 100644 --- a/config/locales/app.admin.es.yml +++ b/config/locales/app.admin.es.yml @@ -1230,6 +1230,7 @@ es: local_database: "Base de datos local" o_auth2: "OAuth 2.0" openid_connect: "OpenID Connect" + saml: "SAML" group_form: add_a_group: "Añadir un grupo" group_name: "Nombre del grupo" @@ -1496,6 +1497,10 @@ es: api_field: "Reclamo de Userinfo" api_field_help_html: 'Establece el campo que proporciona los datos correspondientes a través del userinfo endpoint.
Se admite la sintaxis JsonPath. Si se seleccionan muchos campos, se utilizará el primero.
Ejemplo: $.data[*].name' openid_standard_configuration: "Usar la configuración estándar de OpenID" + saml_data_mapping_form: + api_field: "Userinfo field" + api_field_help_html: "Set the field providing the corresponding data through the SAML assertion.
If many fields are selected, the first one will be used.
Example: $.data[*].name" + openid_standard_configuration: "Use the SAML standard configuration" type_mapping_modal: data_mapping: "Mapeo de datos" TYPE_expected: "{TYPE} esperado" @@ -1552,6 +1557,16 @@ es: client__end_session_endpoint_help: "La URL a llamar para cerrar la sesión del usuario en el servidor de autorización." extra_authorize_params: "Parámetros de autorización extra" extra_authorize_params_help: "Un hash de parámetros extra que se fusionarán con la \"authorization request\"" + saml_form: + authorization_callback_url: "Authorization callback URL" + sp_entity_id: "Service provider entity ID" + sp_entity_id_help: "The name of your application. Some identity providers might need this to establish the identity of the service provider requesting the login." + idp_sso_service_url: "Identity provider SSO service URL" + idp_sso_service_url_help: "The URL to which the authentication request should be sent. This would be on the identity provider." + idp_cert_fingerprint: "Identity provider certificate fingerprint" + idp_cert: "Identity provider certificate" + profile_edition_url: "Profil edition URL" + profile_edition_url_help: "The URL of the page where the user can edit his profile." provider_form: name: "Nombre" authentication_type: "Tipo de autenticación" @@ -1562,6 +1577,7 @@ es: local_database: "Base de datos local" oauth2: "OAuth 2.0" openid_connect: "OpenID Connect" + saml: "SAML" #create a new authentication provider (SSO) authentication_new: add_a_new_authentication_provider: "Agregar un nuevo proveedor de autenticación" diff --git a/config/locales/app.admin.fr.yml b/config/locales/app.admin.fr.yml index 259b69fbf..abaff8a61 100644 --- a/config/locales/app.admin.fr.yml +++ b/config/locales/app.admin.fr.yml @@ -1230,6 +1230,7 @@ fr: local_database: "Base de données locale" o_auth2: "OAuth 2.0" openid_connect: "OpenID Connect" + saml: "SAML" group_form: add_a_group: "Ajouter un groupe" group_name: "Nom du groupe" @@ -1496,6 +1497,10 @@ fr: api_field: "Demandes d'information utilisateur" api_field_help_html: 'Définit le champ fournissant les données correspondantes via le point d''accès aux informations utilisateur.
La syntaxe JsonPath est prise en charge. Si plusieurs champs sont sélectionnés, le premier sera utilisé.
Exemple: $.data[*].name' openid_standard_configuration: "Utiliser la configuration standard OpenID" + saml_data_mapping_form: + api_field: "Champ Userinfo" + api_field_help_html: "Définissez le champ qui fournit les données correspondantes via l'assertion SAML.
Si plusieurs champs sont sélectionnés, seul le premier sera utilisé.
Exemple: $.data[*].name" + openid_standard_configuration: "Utiliser la configuration standard SAML" type_mapping_modal: data_mapping: "Correspondance des données" TYPE_expected: "{TYPE} attendu" @@ -1552,6 +1557,16 @@ fr: client__end_session_endpoint_help: "L'url à appeler pour déconnecter l'utilisateur sur le serveur d'autorisation." extra_authorize_params: "Paramètres d'autorisation supplémentaires" extra_authorize_params_help: "Un hachage de paramètres supplémentaires fixes qui seront fusionnés à la demande d'autorisation" + saml_form: + authorization_callback_url: "URL de retour d'autorisation" + sp_entity_id: "ID de l'entité du fournisseur de service" + sp_entity_id_help: "Le nom de votre application. Certains fournisseurs d'identité pourraient avoir besoin de cela pour établir l'identité du fournisseur de services demandant la connexion." + idp_sso_service_url: "URL du service SSO du fournisseur d'identité" + idp_sso_service_url_help: "L'URL à laquelle la requête d'authentification doit être envoyée. Cela serait sur le fournisseur d'identité." + idp_cert_fingerprint: "Empreinte du certificat du fournisseur d'identité" + idp_cert: "Certificat de fournisseur d'identité" + profile_edition_url: "URL d'édition du profil" + profile_edition_url_help: "L'URL de la page où l'utilisateur peut modifier son profil." provider_form: name: "Nom" authentication_type: "Type d'authentification" @@ -1562,6 +1577,7 @@ fr: local_database: "Base de données locale" oauth2: "OAuth 2.0" openid_connect: "OpenID Connect" + saml: "SAML" #create a new authentication provider (SSO) authentication_new: add_a_new_authentication_provider: "Ajouter un fournisseur d'authentification" diff --git a/config/locales/app.admin.it.yml b/config/locales/app.admin.it.yml index 3c2a52d67..3699cd582 100644 --- a/config/locales/app.admin.it.yml +++ b/config/locales/app.admin.it.yml @@ -1230,6 +1230,7 @@ it: local_database: "Database locale" o_auth2: "OAuth 2.0" openid_connect: "OpenId Connect" + saml: "SAML" group_form: add_a_group: "Aggiungi un gruppo" group_name: "Nome del gruppo" @@ -1496,6 +1497,10 @@ it: api_field: "Reclamo userinfo" api_field_help_html: 'Imposta il campo che fornisce i dati corrispondenti attraverso l''endpoint userinfo.
La sintassi JsonPath è supportata. Se sono selezionati molti campi, verrà utilizzato il primo.
Esempio: $.data[*].name' openid_standard_configuration: "Usa la configurazione standard OpenID" + saml_data_mapping_form: + api_field: "Userinfo field" + api_field_help_html: "Set the field providing the corresponding data through the SAML assertion.
If many fields are selected, the first one will be used.
Example: $.data[*].name" + openid_standard_configuration: "Use the SAML standard configuration" type_mapping_modal: data_mapping: "Mappatura dati" TYPE_expected: "{TYPE} atteso" @@ -1552,6 +1557,16 @@ it: client__end_session_endpoint_help: "L'url da chiamare per effettuare il log out dell'utente al server di autorizzazione." extra_authorize_params: "Extra authorize parameters" extra_authorize_params_help: "A hash of extra fixed parameters that will be merged to the authorization request" + saml_form: + authorization_callback_url: "Authorization callback URL" + sp_entity_id: "Service provider entity ID" + sp_entity_id_help: "The name of your application. Some identity providers might need this to establish the identity of the service provider requesting the login." + idp_sso_service_url: "Identity provider SSO service URL" + idp_sso_service_url_help: "The URL to which the authentication request should be sent. This would be on the identity provider." + idp_cert_fingerprint: "Identity provider certificate fingerprint" + idp_cert: "Identity provider certificate" + profile_edition_url: "Profil edition URL" + profile_edition_url_help: "The URL of the page where the user can edit his profile." provider_form: name: "Nome" authentication_type: "Tipo di autenticazione" @@ -1562,6 +1577,7 @@ it: local_database: "Database locale" oauth2: "OAuth 2.0" openid_connect: "OpenId Connect" + saml: "SAML" #create a new authentication provider (SSO) authentication_new: add_a_new_authentication_provider: "Aggiungi un nuovo provider di autenticazione" diff --git a/config/locales/app.admin.no.yml b/config/locales/app.admin.no.yml index a8c15cc33..317f2ebc2 100644 --- a/config/locales/app.admin.no.yml +++ b/config/locales/app.admin.no.yml @@ -1230,6 +1230,7 @@ local_database: "Lokal database" o_auth2: "OAuth 2.0" openid_connect: "OpenID Connect" + saml: "SAML" group_form: add_a_group: "Legg til en gruppe" group_name: "Gruppenavn" @@ -1496,6 +1497,10 @@ api_field: "Userinfo claim" api_field_help_html: 'Set the field providing the corresponding data through the userinfo endpoint.
JsonPath syntax is supported. If many fields are selected, the first one will be used.
Example: $.data[*].name' openid_standard_configuration: "Use the OpenID standard configuration" + saml_data_mapping_form: + api_field: "Userinfo field" + api_field_help_html: "Set the field providing the corresponding data through the SAML assertion.
If many fields are selected, the first one will be used.
Example: $.data[*].name" + openid_standard_configuration: "Use the SAML standard configuration" type_mapping_modal: data_mapping: "Data mapping" TYPE_expected: "{TYPE} expected" @@ -1552,6 +1557,16 @@ client__end_session_endpoint_help: "The url to call to log the user out at the authorization server." extra_authorize_params: "Extra authorize parameters" extra_authorize_params_help: "A hash of extra fixed parameters that will be merged to the authorization request" + saml_form: + authorization_callback_url: "Authorization callback URL" + sp_entity_id: "Service provider entity ID" + sp_entity_id_help: "The name of your application. Some identity providers might need this to establish the identity of the service provider requesting the login." + idp_sso_service_url: "Identity provider SSO service URL" + idp_sso_service_url_help: "The URL to which the authentication request should be sent. This would be on the identity provider." + idp_cert_fingerprint: "Identity provider certificate fingerprint" + idp_cert: "Identity provider certificate" + profile_edition_url: "Profil edition URL" + profile_edition_url_help: "The URL of the page where the user can edit his profile." provider_form: name: "Name" authentication_type: "Authentication type" @@ -1562,6 +1577,7 @@ local_database: "Local database" oauth2: "OAuth 2.0" openid_connect: "OpenID Connect" + saml: "SAML" #create a new authentication provider (SSO) authentication_new: add_a_new_authentication_provider: "Legg til en ny autentiseringsleverandør" diff --git a/config/locales/app.admin.pt.yml b/config/locales/app.admin.pt.yml index f21df745d..badb74982 100644 --- a/config/locales/app.admin.pt.yml +++ b/config/locales/app.admin.pt.yml @@ -1230,6 +1230,7 @@ pt: local_database: "Database local" o_auth2: "OAuth 2.0" openid_connect: "OpenID Connect" + saml: "SAML" group_form: add_a_group: "Adicionar grupo" group_name: "Nome do grupo" @@ -1496,6 +1497,10 @@ pt: api_field: "Userinfo" api_field_help_html: 'Defina o campo fornecendo os dados correspondentes através de o ponto de extremidade de userinfo.
JsonPath sintaxe é suportada. Se muitos campos forem selecionados, o primeiro será usado.
Exemplo: $.data[*].name' openid_standard_configuration: "Usar a configuração padrão OpenID" + saml_data_mapping_form: + api_field: "Userinfo field" + api_field_help_html: "Set the field providing the corresponding data through the SAML assertion.
If many fields are selected, the first one will be used.
Example: $.data[*].name" + openid_standard_configuration: "Use the SAML standard configuration" type_mapping_modal: data_mapping: "Mapeamento de dados" TYPE_expected: "{TYPE} esperado" @@ -1552,6 +1557,16 @@ pt: client__end_session_endpoint_help: "O Url para efetuar uma chamada para desconectar o usuário no servidor de autorização." extra_authorize_params: "Extra authorize parameters" extra_authorize_params_help: "A hash of extra fixed parameters that will be merged to the authorization request" + saml_form: + authorization_callback_url: "Authorization callback URL" + sp_entity_id: "Service provider entity ID" + sp_entity_id_help: "The name of your application. Some identity providers might need this to establish the identity of the service provider requesting the login." + idp_sso_service_url: "Identity provider SSO service URL" + idp_sso_service_url_help: "The URL to which the authentication request should be sent. This would be on the identity provider." + idp_cert_fingerprint: "Identity provider certificate fingerprint" + idp_cert: "Identity provider certificate" + profile_edition_url: "Profil edition URL" + profile_edition_url_help: "The URL of the page where the user can edit his profile." provider_form: name: "Nome" authentication_type: "Tipo de autenticação" @@ -1562,6 +1577,7 @@ pt: local_database: "Database local" oauth2: "OAuth 2.0" openid_connect: "OpenID Connect" + saml: "SAML" #create a new authentication provider (SSO) authentication_new: add_a_new_authentication_provider: "Adicionar novo provedor de autenticação" diff --git a/config/locales/app.admin.sv.yml b/config/locales/app.admin.sv.yml index 367687fdd..0871f987d 100644 --- a/config/locales/app.admin.sv.yml +++ b/config/locales/app.admin.sv.yml @@ -2,67 +2,67 @@ sv: app: admin: edit_destroy_buttons: - deleted: "Successfully deleted." - unable_to_delete: "Unable to delete: " - delete_item: "Delete the {TYPE}" - confirm_delete: "Delete" - delete_confirmation: "Are you sure you want to delete this {TYPE}?" + deleted: "Raderad." + unable_to_delete: "Kunde inte ta bort: " + delete_item: "Ta bort {TYPE}" + confirm_delete: "Ta bort" + delete_confirmation: "Är du säker på att du vill ta bort denna {TYPE}?" machines: - the_fablab_s_machines: "The FabLab's machines" - all_machines: "All machines" - add_a_machine: "Add a new machine" - manage_machines_categories: "Manage machines categories" - machines_settings: "Settings" + the_fablab_s_machines: "FabLabs utrustning" + all_machines: "All utrustning" + add_a_machine: "Lägg till utrustning" + manage_machines_categories: "Hantera utrustningskategorier" + machines_settings: "Inställningar" machines_settings: - title: "Settings" - generic_text_block: "Editorial text block" - generic_text_block_info: "Displays an editorial block above the list of machines visible to members." - generic_text_block_switch: "Display editorial block" - cta_switch: "Display a button" - cta_label: "Button label" + title: "Inställningar" + generic_text_block: "Textblock" + generic_text_block_info: "Visar ett textblock ovanför listan över utrustning som är synlig för medlemmar." + generic_text_block_switch: "Visa textblock" + cta_switch: "Visa en knapp" + cta_label: "Knappetikett" cta_url: "url" - save: "Save" - successfully_saved: "Your banner was successfully saved." + save: "Spara" + successfully_saved: "Din banderoll har sparats." machine_categories_list: - machine_categories: "Machines categories" - add_a_machine_category: "Add a machine category" - name: "Name" - machines_number: "Number of machines" - machine_category: "Machine category" + machine_categories: "Utrustningskategorier" + add_a_machine_category: "Lägg till en utrustningskategori" + name: "Namn" + machines_number: "Antal av utrustning" + machine_category: "Utrustningskategorier" machine_category_modal: - new_machine_category: "New category" - edit_machine_category: "Edit category" - successfully_created: "The new machine category has been successfully created." - unable_to_create: "Unable to delete the machine category: " - successfully_updated: "The machine category has been successfully updated." - unable_to_update: "Unable to modify the machine category: " + new_machine_category: "Ny kategori" + edit_machine_category: "Redigera kategori" + successfully_created: "Den nya utrustningskategorin har skapats." + unable_to_create: "Det går inte att radera utrustningskategorin: " + successfully_updated: "Utrustningskategorin har uppdaterats." + unable_to_update: "Det går inte att ändra utrustningskategorin: " machine_category_form: - name: "Name of category" - assigning_machines: "Assign machines to this category" - save: "Save" + name: "Kategorinamn" + assigning_machines: "Koppla utrustning till denna kategori" + save: "Spara" machine_form: - ACTION_title: "{ACTION, select, create{New} other{Update the}} machine" - watch_out_when_creating_a_new_machine_its_prices_are_initialized_at_0_for_all_subscriptions: "Watch out! When creating a new machine, its prices are initialized at 0 for all subscriptions." - consider_changing_them_before_creating_any_reservation_slot: "Consider changing them before creating any reservation slot." - description: "Description" - name: "Name" - illustration: "Visual" - illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image." - technical_specifications: "Technical specifications" - category: "Category" - attachments: "Attachments" - attached_files_pdf: "Attached files (pdf)" - add_an_attachment: "Add an attachment" - settings: "Settings" - disable_machine: "Disable machine" - disabled_help: "When disabled, the machine won't be reservable and won't appear by default in the machines list." - reservable: "Can this machine be reserved?" - reservable_help: "When disabled, the machine will be shown in the default list of machines, but without the reservation button. If you already have created some availability slots for this machine, you may want to remove them: do it from the admin agenda." - save: "Save" - create_success: "The machine was created successfully" - update_success: "The machine was updated successfully" + ACTION_title: "{ACTION, select, create{Ny} other{uppdatera}} utrustningen" + watch_out_when_creating_a_new_machine_its_prices_are_initialized_at_0_for_all_subscriptions: "Observera! När du skapar ny utrustning sätts dess pris till 0 i samtliga prenumerationer." + consider_changing_them_before_creating_any_reservation_slot: "Överväg att ändra dem innan en plats skapas." + description: "Beskrivning" + name: "Namn" + illustration: "Visuell" + illustration_recommendation: "Maximal storlek: 932 * 700 px (obegränsat förhållande). Bilden kan beskäras i listvyn. Endast beskrivningssidan visar hela bilden." + technical_specifications: "Tekniska specifikationer" + category: "Kategori" + attachments: "Bilagor" + attached_files_pdf: "Bifogade filer (pdf)" + add_an_attachment: "Lägg till bilaga" + settings: "Inställningar" + disable_machine: "Inaktivera utrustning" + disabled_help: "När den är inaktiverad kommer utrustningen inte att vara bokningsbar och kommer inte att visas som standard i utrustningslistan." + reservable: "Kan denna utrustning reserveras?" + reservable_help: "När den är inaktiverad, kommer utrustningen att visas i standardlistan över utrustning, men utan bokningsknappen. Om du redan har skapat vissa lediga platser för denna utrustning, kanske du vill ta bort dem: gör det från admingränssnittet." + save: "Spara" + create_success: "Utrustningen skapades framgångsrikt" + update_success: "Utrustningen uppdaterades framgångsrikt" training_form: - ACTION_title: "{ACTION, select, create{New} other{Update the}} training" + ACTION_title: "{ACTION, select, create{Ny} other{uppdatera}} utbildningen" beware_when_creating_a_training_its_reservation_prices_are_initialized_to_zero: "Beware, when creating a training, its reservation prices are initialized at zero." dont_forget_to_change_them_before_creating_slots_for_this_training: "Don't forget to change them before creating slots for this training." description: "Description" @@ -110,59 +110,59 @@ sv: settings: "Settings" default_seats: "Default number of seats" disable_space: "Disable the space" - disabled_help: "When disabled, the space won't be reservable and won't appear by default in the spaces list." - save: "Save" - create_success: "The space was created successfully" - update_success: "The space was updated successfully" - associated_machines: "Included machines" - children_spaces: "Included spaces" - associated_objects: "Associated objects" - associated_objects_warning: "Only use these fields if you want interblocking reservation between spaces, child spaces and machines. If you want machine and space reservations to remain independent, please leave the following fields blank." + disabled_help: "När den är inaktiverad kommer lokalen inte att vara bokningsbar och kommer inte att visas som standard i listan med lokaler." + save: "Spara" + create_success: "Lokalen skapades framgångsrikt" + update_success: "Lokalen uppdaterades" + associated_machines: "Inkluderad utrustning" + children_spaces: "Inkluderade lokaler" + associated_objects: "Kopplade objekt" + associated_objects_warning: "Använd endast dessa fält om du vill ha blockerande bokningar mellan lokaler, biytor och utrustning. Om du vill att bokningar av utrustning och lokaler ska vara oberoende av varandra, lämna följande fält tomt." event_form: - ACTION_title: "{ACTION, select, create{New} other{Update the}} event" - title: "Title" - illustration: "Visual" - illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image." - description: "Description" - attachments: "Attachments" - attached_files_pdf: "Attached files (pdf)" - add_a_new_file: "Add a new file" - event_category: "Event category" - dates_and_opening_hours: "Dates and opening hours" - all_day: "All day" - all_day_help: "Will the event last all day or do you want to set times?" - start_date: "Start date" - end_date: "End date" - start_time: "Start time" - end_time: "End time" - recurrence: "Recurrence" - _and_ends_on: "and ends on" - prices_and_availabilities: "Prices and availabilities" - standard_rate: "Standard rate" - 0_equal_free: "0 = free" - fare_class: "Fare class" - price: "Price" - seats_available: "Seats available" - seats_help: "If you leave this field empty, this event will be available without reservations." - event_themes: "Event themes" - age_range: "Age range" - add_price: "Add a price" - save: "Save" - create_success: "The event was created successfully" - events_updated: "{COUNT, plural, =1{One event was} other{{COUNT} Events were}} successfully updated" + ACTION_title: "{ACTION, select, create{Nytt} other{Uppdatera}} evenemanget" + title: "Rubrik" + illustration: "Visuell" + illustration_recommendation: "Maximal storlek: 932 * 700 px (obegränsat förhållande). Bilden kan beskäras i listvyn. Endast beskrivningssidan visar hela bilden." + description: "Beskrivning" + attachments: "Bilagor" + attached_files_pdf: "Bifogade filer (pdf)" + add_a_new_file: "Lägg till ny fil" + event_category: "Kategori för evenemang" + dates_and_opening_hours: "Datum och öppettider" + all_day: "Hela dagen" + all_day_help: "Kommer evenemanget att pågå hela dagen eller vill du ställa in tider?" + start_date: "Startdatum" + end_date: "Slutdatum" + start_time: "Starttid" + end_time: "Sluttid" + recurrence: "Återkommande" + _and_ends_on: "och slutar på" + prices_and_availabilities: "Priser och tillgängligheter" + standard_rate: "Standardavgift" + 0_equal_free: "0 = kostnadsfritt" + fare_class: "Biljettklass" + price: "Pris" + seats_available: "Tillgängliga platser" + seats_help: "Om du lämnar detta fält tomt, kommer detta evenemang att vara tillgängligt utan bokning." + event_themes: "Evenemangsteman" + age_range: "Åldersspann" + add_price: "Lägg till ett pris" + save: "Spara" + create_success: "Evenemanget skapades" + events_updated: "{COUNT, plural, one {}=1{Ett evenemang} other{{COUNT} Evenemang}} uppdaterades" events_not_updated: "{TOTAL, plural, =1{The event was} other{On {TOTAL} events {COUNT, plural, =1{one was} other{{COUNT} were}}}} not updated." - error_deleting_reserved_price: "Unable to remove the requested price because it is associated with some existing reservations" - other_error: "An unexpected error occurred while updating the event" + error_deleting_reserved_price: "Det går inte att ta bort det begärda priset eftersom det är associerat med vissa befintliga bokningar" + other_error: "Ett oväntat fel inträffade när evenemanget uppdaterades" recurring: - none: "None" - every_days: "Every days" - every_week: "Every week" - every_month: "Every month" - every_year: "Every year" - event_type: "Event type" + none: "Inget" + every_days: "Varje dag" + every_week: "Varje vecka" + every_month: "Varje månad" + every_year: "Varje år" + event_type: "Typ av evenemang" event_types: - standard: "Event standard" - nominative: "Event nominative" + standard: "Evenemangsstandard" + nominative: "Evenemangbeskrivning" family: "Event reserved for members" pre_registration: "Pre-registration" pre_registration_help: "If this option is checked, administrators and managers must validate registrations before they become final." @@ -213,9 +213,9 @@ sv: visibility_minimum: "Visibility cannot be less than 7 hours" save: "Save" create_success: "Plan(s) successfully created. Don't forget to redefine prices." - update_success: "The plan was updated successfully" + update_success: "Planen har uppdaterats" plan_limit_form: - usage_limitation: "Limitation of use" + usage_limitation: "Begränsningar och tillåten användning" usage_limitation_info: "Define a maximum number of reservation hours per day and per machine category. Machine categories that have no parameters configured will not be subject to any limitation." usage_limitation_switch: "Restrict machine reservations to a number of hours per day." new_usage_limitation: "Add a limitation of use" @@ -1230,6 +1230,7 @@ sv: local_database: "Local database" o_auth2: "OAuth 2.0" openid_connect: "OpenID Connect" + saml: "SAML" group_form: add_a_group: "Add a group" group_name: "Group name" @@ -1496,6 +1497,10 @@ sv: api_field: "Userinfo claim" api_field_help_html: 'Set the field providing the corresponding data through the userinfo endpoint.
JsonPath syntax is supported. If many fields are selected, the first one will be used.
Example: $.data[*].name' openid_standard_configuration: "Use the OpenID standard configuration" + saml_data_mapping_form: + api_field: "Userinfo field" + api_field_help_html: "Set the field providing the corresponding data through the SAML assertion.
If many fields are selected, the first one will be used.
Example: $.data[*].name" + openid_standard_configuration: "Use the SAML standard configuration" type_mapping_modal: data_mapping: "Data mapping" TYPE_expected: "{TYPE} expected" @@ -1552,6 +1557,16 @@ sv: client__end_session_endpoint_help: "The url to call to log the user out at the authorization server." extra_authorize_params: "Extra authorize parameters" extra_authorize_params_help: "A hash of extra fixed parameters that will be merged to the authorization request" + saml_form: + authorization_callback_url: "Authorization callback URL" + sp_entity_id: "Service provider entity ID" + sp_entity_id_help: "The name of your application. Some identity providers might need this to establish the identity of the service provider requesting the login." + idp_sso_service_url: "Identity provider SSO service URL" + idp_sso_service_url_help: "The URL to which the authentication request should be sent. This would be on the identity provider." + idp_cert_fingerprint: "Identity provider certificate fingerprint" + idp_cert: "Identity provider certificate" + profile_edition_url: "Profil edition URL" + profile_edition_url_help: "The URL of the page where the user can edit his profile." provider_form: name: "Name" authentication_type: "Authentication type" @@ -1562,6 +1577,7 @@ sv: local_database: "Local database" oauth2: "OAuth 2.0" openid_connect: "OpenID Connect" + saml: "SAML" #create a new authentication provider (SSO) authentication_new: add_a_new_authentication_provider: "Add a new authentication provider" diff --git a/config/locales/app.admin.zu.yml b/config/locales/app.admin.zu.yml index b6f1ea81d..8aa309b99 100644 --- a/config/locales/app.admin.zu.yml +++ b/config/locales/app.admin.zu.yml @@ -1230,6 +1230,7 @@ zu: local_database: "crwdns25688:0crwdne25688:0" o_auth2: "crwdns25690:0crwdne25690:0" openid_connect: "crwdns25692:0crwdne25692:0" + saml: "crwdns38138:0crwdne38138:0" group_form: add_a_group: "crwdns25694:0crwdne25694:0" group_name: "crwdns25696:0crwdne25696:0" @@ -1496,6 +1497,10 @@ zu: api_field: "crwdns26098:0crwdne26098:0" api_field_help_html: 'crwdns26100:0crwdne26100:0' openid_standard_configuration: "crwdns26102:0crwdne26102:0" + saml_data_mapping_form: + api_field: "crwdns38140:0crwdne38140:0" + api_field_help_html: "crwdns38142:0crwdne38142:0" + openid_standard_configuration: "crwdns38144:0crwdne38144:0" type_mapping_modal: data_mapping: "crwdns26104:0crwdne26104:0" TYPE_expected: "crwdns26106:0{TYPE}crwdne26106:0" @@ -1552,6 +1557,16 @@ zu: client__end_session_endpoint_help: "crwdns26202:0crwdne26202:0" extra_authorize_params: "crwdns37725:0crwdne37725:0" extra_authorize_params_help: "crwdns37727:0crwdne37727:0" + saml_form: + authorization_callback_url: "crwdns38146:0crwdne38146:0" + sp_entity_id: "crwdns38148:0crwdne38148:0" + sp_entity_id_help: "crwdns38150:0crwdne38150:0" + idp_sso_service_url: "crwdns38152:0crwdne38152:0" + idp_sso_service_url_help: "crwdns38154:0crwdne38154:0" + idp_cert_fingerprint: "crwdns38156:0crwdne38156:0" + idp_cert: "crwdns38158:0crwdne38158:0" + profile_edition_url: "crwdns38160:0crwdne38160:0" + profile_edition_url_help: "crwdns38162:0crwdne38162:0" provider_form: name: "crwdns26204:0crwdne26204:0" authentication_type: "crwdns26206:0crwdne26206:0" @@ -1562,6 +1577,7 @@ zu: local_database: "crwdns26214:0crwdne26214:0" oauth2: "crwdns26216:0crwdne26216:0" openid_connect: "crwdns26218:0crwdne26218:0" + saml: "crwdns38164:0crwdne38164:0" #create a new authentication provider (SSO) authentication_new: add_a_new_authentication_provider: "crwdns26220:0crwdne26220:0" diff --git a/config/locales/mails.es-MX.yml b/config/locales/mails.es-MX.yml index e12b2ec24..2d5647b00 100644 --- a/config/locales/mails.es-MX.yml +++ b/config/locales/mails.es-MX.yml @@ -289,9 +289,9 @@ es-MX: notify_member_about_coupon: subject: "Cupón" body: - enjoy_a_discount_of_PERCENT_with_code_CODE: "Disfruta de un descuento del %{PERCENT}% en toda la web con el código %{CODE}." - enjoy_a_discount_of_AMOUNT_with_code_CODE: "Disfruta de un descuento de %{AMOUNT} en toda la web con el código %{CODE}." - this_coupon_is_valid_USAGE_times_until_DATE_for_all_your_purchases: "Este cupón es válido {USAGE, plural, =1{just once} other{many times}}: para todas tus compras {TYPE, select, amount_off{at least equal to the amount of the coupon} other{}}, desde ahora {DATE, select, NO-DATE{and without time limit} other{and until {DATE}}}." + enjoy_a_discount_of_PERCENT_with_code_CODE: "Disfruta de un descuento del %{PERCENT}% en todo el sitio con el código %{CODE}." + enjoy_a_discount_of_AMOUNT_with_code_CODE: "Disfruta de un descuento de %{AMOUNT} en todo el sitio con el código %{CODE}." + this_coupon_is_valid_USAGE_times_until_DATE_for_all_your_purchases: "Este cupón es válido {USAGE, plural, =1{une vez} other{varias veces}}: para todas tus compras {TYPE, select, amount_off{al menos igual al valor del cupón} other{}}, desde ahora {DATE, select, NO-DATE{y sin limite de tiempo} other{y hasta {DATE}}}." notify_admin_free_disk_space: subject: "Poco espacio libre en disco" body: "Advertencia: el espacio disponible en el servidor que aloja Fab-manager es inferior a %{THRESHOLD} MiB. Esto puede afectar a su funcionamiento y evitar que se guarden algunos datos. Actualmente, hay %{AVAILABLE} MiB de espacio libre en el disco del punto de montaje." diff --git a/config/locales/mails.es.yml b/config/locales/mails.es.yml index 159cdf437..c565140d0 100644 --- a/config/locales/mails.es.yml +++ b/config/locales/mails.es.yml @@ -289,9 +289,9 @@ es: notify_member_about_coupon: subject: "Cupón" body: - enjoy_a_discount_of_PERCENT_with_code_CODE: "Disfruta de un descuento del %{PERCENT}% en toda la web con el código %{CODE}." - enjoy_a_discount_of_AMOUNT_with_code_CODE: "Disfruta de un descuento de %{AMOUNT} en toda la web con el código %{CODE}." - this_coupon_is_valid_USAGE_times_until_DATE_for_all_your_purchases: "Este cupón es válido {USAGE, plural, =1{just once} other{many times}}: para todas tus compras {TYPE, select, amount_off{at least equal to the amount of the coupon} other{}}, desde ahora {DATE, select, NO-DATE{and without time limit} other{and until {DATE}}}." + enjoy_a_discount_of_PERCENT_with_code_CODE: "Disfruta de un descuento del %{PERCENT}% en todo el sitio con el código %{CODE}." + enjoy_a_discount_of_AMOUNT_with_code_CODE: "Disfruta de un descuento de %{AMOUNT} en todo el sitio con el código %{CODE}." + this_coupon_is_valid_USAGE_times_until_DATE_for_all_your_purchases: "Este cupón es válido {USAGE, plural, =1{une vez} other{varias veces}}: para todas tus compras {TYPE, select, amount_off{al menos igual al valor del cupón} other{}}, desde ahora {DATE, select, NO-DATE{y sin limite de tiempo} other{y hasta {DATE}}}." notify_admin_free_disk_space: subject: "Poco espacio libre en disco" body: "Advertencia: el espacio disponible en el servidor que aloja Fab-manager es inferior a %{THRESHOLD} MiB. Esto puede afectar a su funcionamiento y evitar que se guarden algunos datos. Actualmente, hay %{AVAILABLE} MiB de espacio libre en el disco del punto de montaje." diff --git a/config/locales/mails.sv.yml b/config/locales/mails.sv.yml index 553ceb446..a0064b7f1 100644 --- a/config/locales/mails.sv.yml +++ b/config/locales/mails.sv.yml @@ -138,353 +138,353 @@ sv: subject: "Din FabLabkreditnota" body: please_find_attached_html: "Som bifogad fil hittar du din faktura från {DATE}med ett belopp på {AMOUNT} för din {TYPE, select, Reservation{reservation} WalletTransaction{wallet credit} other{subscription}}." #messageFormat interpolation - invoice_in_your_dashboard_html: "You can access your refund invoice in %{DASHBOARD} on the Fab Lab website." - your_dashboard: "your dashboard" + invoice_in_your_dashboard_html: "Du får tillgång till din kreditnota i %{DASHBOARD} på webbplatsen." + your_dashboard: "din kontrollpanel" notify_member_subscription_will_expire_in_7_days: - subject: "Your subscription expires in 7 days" + subject: "Din prenumeration upphör om 7 dagar" body: - your_plan: "you plan" - expires_in_7_days: "will expire in 7 days." - to_renew_your_plan_follow_the_link: "Please, follow this link to renew your plan" + your_plan: "din plan" + expires_in_7_days: "kommer att löpa ut om 7 dagar." + to_renew_your_plan_follow_the_link: "Följ denna länk för att förnya din plan" notify_member_training_authorization_expired: - subject: "Your authorization was revoked" + subject: "Din auktorisation har återkallats" body: - training_expired_html: "

You took the %{TRAINING} training, on %{DATE}.

Your authorization for this training, valid for %{PERIOD} months, has expired.

Please validate it again in order to be able to reserve the %{MACHINES}

." + training_expired_html: "

Du gick %{TRAINING} utbildning, på %{DATE}.

Din auktorisering för denna utbildning, giltig för %{PERIOD} månader, har löpt ut.

Vänligen validera den igen för att kunna reservera %{MACHINES}

." notify_member_training_auto_cancelled: - subject: "Your training session was cancelled" + subject: "Din utbildning avbröts" body: - cancelled_training: "The %{TRAINING} training session scheduled for %{DATE}, from %{START} to %{END} has been canceled due to an insufficient number of participants." - auto_refund: "You were refunded on your wallet and a credit note should be available." + cancelled_training: "Utbildningen %{TRAINING} är planerad den %{DATE}, från %{START} till %{END} har avbrutits på grund av otillräckligt antal deltagare." + auto_refund: "Du har återbetalats till din plånbok och en kreditfaktura är tillgänglig." notify_member_training_invalidated: - subject: "Your authorization was invalidated" + subject: "Din auktorisation har återkallats" body: - training_invalidated_html: "

You took the %{TRAINING} training, on %{DATE} giving you access to the %{MACHINES}.

Due to the lack of reservations for one of these machines during the last %{PERIOD} months, your authorization has been invalidated.

Please validate the training again in order to continue reserving these machines.

." + training_invalidated_html: "

Du gick %{TRAINING} -utbildningen, på %{DATE} vilket ger dig tillgång till %{MACHINES}.

På grund av bristen på reservationer för utrustningen under de senaste %{PERIOD} månaderna, din auktorisering har ogiltigförklarats.

Vänligen bekräfta utbildningen igen för att fortsätta reservera denna utrustning.

." notify_member_subscription_is_expired: - subject: "Your subscription has expired" + subject: "Din prenumeration har löpt ut" body: - your_plan: "You plan" - has_expired: "has expired." - you_can_go_to: "Please go to" - to_renew_your_plan: "to renew you plan" + your_plan: "Din plan" + has_expired: "har gått ut." + you_can_go_to: "Gå till" + to_renew_your_plan: "för att förnya din plan" notify_admin_subscription_will_expire_in_7_days: - subject: "A member subscription expires in 7 days" + subject: "Ett medlemsabonnemang löper ut om 7 dagar" body: - subscription_will_expire_html: "Subscription plan for user %{NAME} %{PLAN} will expire in 7 days." + subscription_will_expire_html: "Prenumerationsplan för användaren %{NAME} %{PLAN} löper ut om 7 dagar." notify_admin_training_auto_cancelled: - subject: "A training was automatically cancelled" + subject: "En utbildning avbröts automatiskt" body: - cancelled_training: "The %{TRAINING} training session scheduled for %{DATE}, from %{START} to %{END} has been automatically canceled due to an insufficient number of participants." - auto_refund: "The members who have booked this training session were automatically refunded on their wallet and credit notes was generated." - manual_refund: "Please manually refund all members who have booked this training session and generate the credit notes." + cancelled_training: "Utbildningen %{TRAINING} är planerad den %{DATE}, från %{START} till %{END} har avbrutits på grund av otillräckligt antal deltagare." + auto_refund: "Medlemmarna som har bokat detta träningspass återbetalades automatiskt till sin plånbok och kreditnotor genererades." + manual_refund: "Vänligen återbetala alla medlemmar som har bokat denna utbildning manuellt och generera kreditfakturor." notify_admin_subscription_is_expired: - subject: "A member subscription has expired" + subject: "En medlemsprenumeration har avbrutits" body: - subscription_expired_html: "Subscription plan for user %{NAME} %{PLAN} is now expired." + subscription_expired_html: "Prenumerationsplan för användaren %{NAME} %{PLAN} har nu löpt ut." notify_admin_subscription_canceled: - subject: "A member subscription has been cancelled" + subject: "En medlemsprenumeration har avbrutits" body: - subscription_canceled_html: "Subscription %{PLAN} for user %{NAME} has been cancelled." + subscription_canceled_html: "Prenumeration %{PLAN} för användaren %{NAME} har avbrutits." notify_member_subscription_canceled: - subject: "Your subscription has been cancelled" + subject: "Din prenumeration har avbrutits" body: - your_plan_was_canceled: "Your subscription plan has been cancelled." - your_plan: "your subscription plan" - end_at: "ends on" + your_plan_was_canceled: "Din prenumeration har avbrutits." + your_plan: "din prenumerationsplan" + end_at: "slutar den" notify_member_slot_is_canceled: - subject: "Your reservation has been canceled" + subject: "Din bokning har avbrutits" body: - reservation_canceled: "Your reservation for %{RESERVABLE} has been canceled" + reservation_canceled: "Din bokning av %{RESERVABLE} har avbrutits" notify_admin_slot_is_canceled: - subject: "A reservation has been cancelled" + subject: "En bokning har avbokats" body: - member_cancelled: "User %{NAME} has cancelled his reservation" - item_details: "%{START} - %{END}, concerning %{RESERVABLE}" - generate_refund: "Do not forget to generate a credit note or a refund for this cancellation." + member_cancelled: "Användare %{NAME} har avbokat sin bokning" + item_details: "%{START} - %{END}, om %{RESERVABLE}" + generate_refund: "Glöm inte att generera en kreditfaktura eller en återbetalning för denna avbokning." notify_admin_when_user_is_imported: - subject: "A user account has been imported from the SSO" + subject: "Ett användarkonto har importerats via SSO" body: - new_account_imported: "A new user account (ID: %{ID}) has been imported to the website via %{PROVIDER}." - provider_uid: "its provider ID is: " - known_information: "Here is what we know about this provider:" - address_already_used: "This address is already associated with another user" - no_more_info_available: "No other info about this user can be provided before he completes his profile." + new_account_imported: "Ett nytt användarkonto (ID: %{ID}) har importerats till webbplatsen via %{PROVIDER}." + provider_uid: "dess leverantörs-ID är: " + known_information: "Här är vad vi vet om denna leverantör:" + address_already_used: "E-posten är redan kopplad till en annan användare" + no_more_info_available: "Ingen annan information om denna användare kan lämnas innan den slutför sin profil." notify_user_profile_complete: - subject: "You now have access to the whole website" + subject: "Du har nu tillgång till hela webbplatsen" body: - message: "Your account informations has been correctly updated, you now have access to the whole website." + message: "Dina kontoinformation har uppdaterats korrekt, du har nu tillgång till hela webbplatsen." notify_user_auth_migration: - subject: "Important change to your FabLab account" + subject: "Viktiga ändringar i ditt konto" body: - the_platform: "the website" - is_changing_its_auth_system_and_will_now_use: "is actually changing its user identification system and will use" - instead_of: "instead of" - consequence_of_the_modification: "Because of this change you won't be able to login to the website with your actual usernames" - to_use_the_platform_thanks_for: "To keep on using the website, please" - create_an_account_on: "create an account on" - or_use_an_existing_account_clicking_here: "or use an existing account by clicking here" - in_case_of_problem_enter_the_following_code: "In case of problem with this link, you can enter the following code at your first connection attempt in order to migrate your actual account into the new authentification system:" + the_platform: "webbplatsen" + is_changing_its_auth_system_and_will_now_use: "faktiskt ändra sitt användar-identifieringssystem och kommer att använda" + instead_of: "istället för" + consequence_of_the_modification: "På grund av denna förändring kommer du inte att kunna logga in på webbplatsen med dina faktiska användarnamn" + to_use_the_platform_thanks_for: "För att fortsätta använda webbplatsen, vänligen" + create_an_account_on: "skapa ett konto" + or_use_an_existing_account_clicking_here: "eller använd ett befintligt konto genom att klicka här" + in_case_of_problem_enter_the_following_code: "Vid problem med denna länk, kan du ange följande kod vid ditt första anslutningsförsök för att migrera ditt faktiska konto till det nya autentiseringssystemet:" notify_admin_user_merged: - subject: "An imported account has been merged with an existing account" + subject: "Ett importerat konto har slagits samman med ett befintligt konto" body: - imported_account_merged: "A previously imported user account via %{PROVIDER) has been merged with the existing account %{NAME}" - provider_uid: "its provider ID is:" + imported_account_merged: "Ett tidigare importerat användarkonto via %{PROVIDER) har slagits samman med det befintliga kontot %{NAME}" + provider_uid: "dess leverantörs-ID är:" notify_admin_profile_complete: - subject: "An imported account has completed its profile" + subject: "Ett importerat konto har gjort klar sin profil" body: - account_completed: "An user account has completed its profile:" - imported_account_completed: "An user account, previously imported through %{PROVIDER}, has completed its profile:" - provider_id: "its provider ID is:" + account_completed: "Ett användarkonto har gjort klart sin profil:" + imported_account_completed: "Ett användarkonto, som tidigare importerats via %{PROVIDER}, har gjort klart sin profil:" + provider_id: "dess leverantörs-ID är:" notify_admin_abuse_reported: - subject: "An abusive content has been reported" + subject: "Kränkande innehåll har rapporterats" body: - intro: "A user has flagged a content as abusive" - signaled_content: "flagged content:" - signaled_by: "flagged by:" - signaled_on: "flagged on:" - message: "Message:" - visit_management_interface: "Refer to the Reporting Management Interface for more information." + intro: "En användare har flaggat ett innehåll som kränkande" + signaled_content: "flaggat innehåll:" + signaled_by: "flaggad av:" + signaled_on: "flaggad den:" + message: "Meddelande:" + visit_management_interface: "Se rapporteringsgränssnittet för mer information." notify_user_wallet_is_credited: - subject: "Your wallet has been credited" + subject: "Din plånbok har krediterats" body: - wallet_credit_html: "Your wallet has been credited %{AMOUNT} by administrator." + wallet_credit_html: "Din plånbok har krediterats %{AMOUNT} av administratör." notify_admin_user_wallet_is_credited: - subject: "The wallet of an user has been credited" + subject: "En användares plånbok har krediterats" body: - wallet_credit_html: "The wallet of member %{USER} has been credited %{AMOUNT} by administrator %{ADMIN}." + wallet_credit_html: "Plånboken för medlemmen %{USER} har krediterats %{AMOUNT} av administratören %{ADMIN}." notify_admin_export_complete: - subject: "Export completed" + subject: "Exporten är klar" body: - you_asked_for_an_export: "You asked for an export" - statistics_global: "of all the statistics" - statistics_account: "of the registration statistics" - statistics_event: "of statistics about events" - statistics_machine: "of statistics about machine slots" - statistics_project: "of statistics about projects" - statistics_subscription: "of subscription statistics" - statistics_training: "of statistics about trainings" - statistics_space: "of statistics about spaces" - users_members: "of the members' list" - users_subscriptions: "of the subscriptions' list" - users_reservations: "of the reservations' list" - availabilities_index: "of the reservations availabilities" - accounting_acd: "of the accounting data to ACD" - accounting_vat: "of the collected VAT data" - click_to_download: "Excel file generated successfully. To download it, click" - here: "here" + you_asked_for_an_export: "Du bad om en export" + statistics_global: "av all statistik" + statistics_account: "av bokningsstatistiken" + statistics_event: "av statistik om evenemang" + statistics_machine: "av statistik om utrustningsbokningar" + statistics_project: "av statistik om projekt" + statistics_subscription: "av prenumerationsstatistik" + statistics_training: "av statistik om utbildningar" + statistics_space: "statistik om lokaler" + users_members: "av medlemslistan" + users_subscriptions: "av listan över prenumerationer" + users_reservations: "av bokningslistan" + availabilities_index: "av bokningens tillgänglighet" + accounting_acd: "av bokföringsdata till ACD" + accounting_vat: "av den ingående momsen" + click_to_download: "Excel-fil genererades framgångsrikt. För att ladda ner den, klicka" + here: "här" file_type: xlsx: "Excel" csv: "CSV" notify_admin_import_complete: - subject: "Import completed" + subject: "Import slutförd" body: - you_made_an_import: "You have initiated an import %{CATEGORY}" - category_members: "of the members" - click_to_view_results: "Click here to view results" + you_made_an_import: "Du har initierat en import %{CATEGORY}" + category_members: "av medlemmarna" + click_to_view_results: "Klicka här för att se resultat" notify_admin_low_stock_threshold: - subject: "Low stock alert" + subject: "Varning vid lågt lagersaldo" body: - low_stock: "A new stock movement of %{PRODUCT} has exceeded the low stock threshold." - stocks_state_html: "Current stock status:
  • internal: %{INTERNAL}
  • external: %{EXTERNAL}
" - manage_stock: "Manage stocks for this product" + low_stock: "En ny lagerförflyttning av %{PRODUCT} har överskridit gränsen för lågt lager." + stocks_state_html: "Nuvarande lagerstatus:
  • internt: %{INTERNAL}
  • externt: %{EXTERNAL}
" + manage_stock: "Hantera lager för denna produkt" notify_member_about_coupon: - subject: "Coupon" + subject: "Rabattkupong" body: - enjoy_a_discount_of_PERCENT_with_code_CODE: "Enjoy a discount of %{PERCENT}% on the whole site with the code %{CODE}." - enjoy_a_discount_of_AMOUNT_with_code_CODE: "Enjoy a discount of %{AMOUNT} on the whole site with the code %{CODE}." - this_coupon_is_valid_USAGE_times_until_DATE_for_all_your_purchases: "This coupon is valid {USAGE, plural, =1{just once} other{many times}}: for all your purchases {TYPE, select, amount_off{at least equal to the amount of the coupon} other{}}, from now {DATE, select, NO-DATE{and without time limit} other{and until {DATE}}}." + enjoy_a_discount_of_PERCENT_with_code_CODE: "Erhåll %{PERCENT}% rabatt på webbplatsen med koden %{CODE}." + enjoy_a_discount_of_AMOUNT_with_code_CODE: "Erhåll %{AMOUNT}% rabatt på webbplatsen med koden %{CODE}." + this_coupon_is_valid_USAGE_times_until_DATE_for_all_your_purchases: "Denna kupong är giltig {USAGE, plural, =1{en gång} other{flera gånger}}: vid samtliga köp {TYPE, select, amount_off{som minst uppgår till kupongens värde} other{}}, fr. o. m. nu {DATE, select, NO-DATE{och utan bortre tidsgräns} other{t. o. m. {DATE}}}." notify_admin_free_disk_space: - subject: "Low disk space" - body: "Warning: available disk space on the server hosting Fab-manager is less than %{THRESHOLD} MiB. This can affect its operation and prevent saving some data. Currently, %{AVAILABLE} MiB of free disk space remains available on the mount point." + subject: "Lågt diskutrymme" + body: "Varning: tillgängligt diskutrymme på serverns webbhotell är mindre än %{THRESHOLD} MiB. Detta kan påverka dess funktion och förhindra att vissa data sparas. För närvarande finns %{AVAILABLE} MiB ledigt diskutrymme kvar på monteringspunkten." notify_admin_close_period_reminder: - subject: "Remind to close your accounting periods" + subject: "Påminnelse om att stänga dina bokföringsperioder" body: - warning_last_closed_period_over_1_year: "Please remind to periodically close your accounting periods. Last closed period ended at %{LAST_END}." - warning_no_closed_periods: "Please remind to periodically close your accounting periods. You have to close periods from %{FIRST_DATE}." + warning_last_closed_period_over_1_year: "Vänligen kom ihåg att regelbundet stänga dina redovisningsperioder. Senast stängd period avslutades på %{LAST_END}." + warning_no_closed_periods: "Vänligen påminn om att regelbundet stänga dina bokföringsperioder. Du måste stänga perioder från %{FIRST_DATE}." notify_admin_archive_complete: - subject: "Archiving completed" + subject: "Arkivering slutförd" body: - archive_complete: "You have closed the accounting period from %{START} to %{END}. Archiving of data is now complete." - click_to_download: "To download the ZIP archive, click" - here: "here." - save_on_secured: "Remember that you must save this archive on a secured external support, which may be requested by the tax authorities during a check." + archive_complete: "Du har stängt redovisningsperioden från %{START} till %{END}. Arkivering av data är nu klar." + click_to_download: "För att ladda ner ZIP-arkivet, klicka" + here: "här." + save_on_secured: "Kom ihåg att du måste spara detta arkiv på en säker extern plats som skattemyndigheterna kan begära ut dem från vid en kontroll." notify_privacy_policy_changed: - subject: "Privacy policy updated" + subject: "Integritetspolicy uppdaterad" body: - content_html: "

We wish to inform you that we have just updated our privacy policy.

We may change our privacy policy regularly. In accordance with the regulations, you will receive a notification for each update.

By accessing or using our services after the privacy policy update, we will consider that you agree its terms, updates included.

" - link_to_policy: "Click here to view the privacy policy." + content_html: "

Vi vill informera dig om att vi just har uppdaterat vår sekretesspolicy.

Vi kan komma att ändra vår sekretesspolicy regelbundet. I enlighet med reglerna får du en avisering för varje uppdatering.

Genom att få tillgång till eller använda våra tjänster efter integritetspolicyuppdateringen, kommer vi att överväga att du godkänner dess villkor, inklusive uppdateringar.

" + link_to_policy: "Klicka här för att se sekretesspolicyn." notify_admin_refund_created: - subject: "A refund has been generated" + subject: "En återbetalning har skapats" body: - refund_created: "A refund of %{AMOUNT} has been generated on invoice %{INVOICE} of user %{USER}" - wallet_refund_created: "A refund of %{AMOUNT} has been generated for the credit of the wallet of user %{USER}" - download: "Click here to download this refund invoice" + refund_created: "Återbetalning av %{AMOUNT} har genererats på faktura %{INVOICE} för användaren %{USER}" + wallet_refund_created: "En återbetalning av %{AMOUNT} har skapats för användarens plånbok %{USER}" + download: "Klicka här för att ladda ner denna kreditnota" notify_admins_role_update: - subject: "The role of a user has changed" + subject: "Rollen för en användare har ändrats" body: - user_role_changed_html: "The role of the user %{NAME} has changed." - previous_role: "Previous role:" - new_role: "New role:" + user_role_changed_html: "Rollen för användaren %{NAME} har ändrats." + previous_role: "Föregående roll:" + new_role: "Ny roll:" notify_user_role_update: - subject: "Your role has changed" + subject: "Din roll har ändrats" body: - role_changed_html: "Your role at {GENDER, select, male{the} female{the} neutral{} other{the}} {NAME} has changed. You are now {ROLE}.
With great power comes great responsibility, use your new privileges fairly and respectfully." + role_changed_html: "Din roll på {GENDER, select, male{} female{} neutral{} other{}} {NAME} har ändrats. Du är nu {ROLE}.
Med stor kraft kommer stort ansvar, använd dina nya privilegier rättvist och respektfullt." notify_admin_objects_stripe_sync: - subject: "Stripe synchronization" + subject: "Stripe-synkronisering" body: - objects_sync: "All members, coupons, machines, trainings, spaces and plans were successfully synchronized on Stripe." + objects_sync: "Alla medlemmar, kuponger, utrustning, utbildningar, lokaler och planer synkroniserades framgångsrikt på Stripe." notify_admin_order_is_paid: - subject: "New order" + subject: "Ny beställning" body: - order_placed: "A new order (%{REFERENCE}) has been placed and paid by %{USER}." + order_placed: "En ny beställning (%{REFERENCE}) har lagts och betalats av %{USER}." view_details: "" notify_member_payment_schedule_ready: - subject: "Your payment schedule" + subject: "Ditt betalningsschema" body: - please_find_attached_html: "Please find attached your payment schedule, issued on {DATE}, with an amount of {AMOUNT} concerning your {TYPE, select, Reservation{reservation} other{subscription}}." #messageFormat interpolation - schedule_in_your_dashboard_html: "You can find this payment schedule at any time from %{DASHBOARD} on the Fab Lab's website." - your_dashboard: "your dashboard" + please_find_attached_html: "är ser du ditt bifogade betalningsschema, utfärdat på {DATE}, med ett belopp av {AMOUNT} om din {TYPE, select, Reservation{bokning} other{prenumeration}}." #messageFormat interpolation + schedule_in_your_dashboard_html: "Du hittar detta betalningsschema när som helst i %{DASHBOARD} på webbplatsen." + your_dashboard: "din kontrollpanel" notify_admin_payment_schedule_error: - subject: "[URGENT] Card debit error" + subject: "[URGENT] Kortdebitering misslyckades" body: - remember: "In accordance with the %{REFERENCE} payment schedule, a debit by card of %{AMOUNT} was scheduled on %{DATE}." - error: "Unfortunately, an error occurred and this card debit was unable to complete successfully." - action: "Please then consult the %{GATEWAY} dashboard and contact the member as soon as possible to resolve the problem." + remember: "I enlighet med ditt %{REFERENCE} betalningsschema planerades ett kortköp på %{AMOUNT} den %{DATE}." + error: "Tyvärr inträffade ett fel och denna kortdebitering kunde inte slutföras." + action: "Vänligen konsultera sedan %{GATEWAY} kontrollpanelen och kontakta medlemmen så snart som möjligt för att lösa problemet." notify_member_payment_schedule_error: - subject: "[URGENT] Card debit error" + subject: "[URGENT] Kortdebitering misslyckades" body: - remember: "In accordance with your %{REFERENCE} payment schedule, a debit by card of %{AMOUNT} was scheduled on %{DATE}." - error: "Unfortunately, an error occurred and this card debit was unable to complete successfully." - action: "Please contact a manager as soon as possible to resolve the problem." + remember: "I enlighet med ditt %{REFERENCE} betalningsschema planerades ett kortköp på %{AMOUNT} den %{DATE}." + error: "Tyvärr inträffade ett fel och denna kortdebitering kunde inte slutföras." + action: "Kontakta en ansvarig så snart som möjligt för att lösa problemet." notify_admin_payment_schedule_failed: - subject: "[URGENT] Card debit failure" + subject: "[URGENT] Kortdebitering misslyckades" body: - remember: "In accordance with the %{REFERENCE} payment schedule, a debit by card of %{AMOUNT} was scheduled on %{DATE}." - error: "Unfortunately, this card debit was unable to complete successfully." - action: "Please contact the member as soon as possible, then go to the payment schedule management interface to resolve the problem. After a certain period of time, the card subscription could be cancelled." + remember: "I enlighet med ditt %{REFERENCE} betalningsschema planerades ett kortköp på %{AMOUNT} den %{DATE}." + error: "Tyvärr inträffade ett fel och denna kortdebitering kunde inte slutföras." + action: "Vänligen kontakta medlemmen så snart som möjligt, gå sedan till betalningsschemats hanteringsgränssnitt för att lösa problemet. Efter en viss tidsperiod kan kortprenumerationen avbrytas." notify_member_payment_schedule_failed: - subject: "[URGENT] Card debit failure" + subject: "[URGENT] Kortdebitering misslyckades" body: - remember: "In accordance with your %{REFERENCE} payment schedule, a debit by card of %{AMOUNT} was scheduled on %{DATE}." - error: "Unfortunately, this card debit was unable to complete successfully." - action_html: "Please check %{DASHBOARD} or contact a manager quickly, otherwise your subscription may be interrupted." - your_dashboard: "your dashboard" + remember: "I enlighet med ditt %{REFERENCE} betalningsschema planerades ett kortköp på %{AMOUNT} den %{DATE}." + error: "Tyvärr kunde inte kortdebiteringen slutföras." + action_html: "Vänligen kontrollera %{DASHBOARD} eller kontakta en ansvarig snabbt, annars kan ditt abonnemang avbrytas." + your_dashboard: "din kontrollpanel" notify_admin_payment_schedule_gateway_canceled: - subject: "[URGENT] Payment schedule canceled by the payment gateway" + subject: "[URGENT] Betalningsschema avbruten av betalningsleverantör" body: - error: "The payment schedule %{REFERENCE} was canceled by the payment gateway (%{GATEWAY}). No further debits will be made on this payment mean." - action: "Please consult the payment schedule management interface and contact the member as soon as possible to resolve the problem." + error: "Betalningsschemat %{REFERENCE} avbröts av betalningsleverantören (%{GATEWAY}). Inga ytterligare debiteringar kommer att göras på denna betalning." + action: "Vänligen konsultera betalningsschemats administrationsgränssnitt och kontakta medlemmen så snart som möjligt för att lösa problemet." notify_member_payment_schedule_gateway_canceled: - subject: "[URGENT] Payment schedule canceled by the payment gateway" + subject: "[URGENT] Betalningsschema avbruten av betalningsleverantör" body: - error: "Your payment schedule %{REFERENCE} was canceled by the payment gateway. No further debits will be made on this payment mean." - action: "Please contact a manager as soon as possible to resolve the problem." + error: "Ditt betalningsschema %{REFERENCE} avbröts av betalningsleverantören. Inga ytterligare debiteringar kommer att göras på denna betalning." + action: "Kontakta en ansvarig så snart som möjligt för att lösa problemet." notify_admin_payment_schedule_check_deadline: - subject: "Payment deadline" + subject: "Betalningsfrist" body: - remember: "In accordance with the %{REFERENCE} payment schedule, %{AMOUNT} was due to be debited on %{DATE}." - date: "This is a reminder to cash the scheduled check as soon as possible." - confirm: "Do not forget to confirm the receipt in your payment schedule management interface, so that the corresponding invoice will be generated." + remember: "I enlighet med %{REFERENCE} betalningsschemat skulle %{AMOUNT} debiteras den %{DATE}." + date: "Detta är en påminnelse om att betala så snart som möjligt." + confirm: "Glöm inte att bekräfta kvittot i ditt schemas hanteringsgränssnitt, så att motsvarande faktura kommer att genereras." notify_member_payment_schedule_transfer_deadline: - subject: "Payment deadline" + subject: "Betalningsfrist" body: - remember: "In accordance with your %{REFERENCE} payment schedule, %{AMOUNT} was due to be debited on %{DATE}." - date: "This is a reminder to verify that the direct bank debit was successfull." - confirm: "Please confirm the receipt of funds in your payment schedule management interface, so that the corresponding invoice will be generated." + remember: "I enlighet med ditt %{REFERENCE} betalningsschema skulle %{AMOUNT} debiteras på %{DATE}." + date: "Detta är en påminnelse om att kontrollera att banköverföringen var framgångsrik." + confirm: "Vänligen bekräfta mottagandet av pengar i ditt schemahanteringsgränssnitt, så att motsvarande faktura kommer att genereras." notify_member_reservation_limit_reached: - subject: "Daily reservation limit reached" + subject: "Den dagliga bokningsgränsen har uppnåtts" body: - limit_reached: "For %{DATE}, you have reached your daily limit of %{HOURS} hours of %{ITEM} reservation." + limit_reached: "För %{DATE} har du nått din dagliga gräns för %{HOURS} timmar av %{ITEM} bokningar." notify_admin_user_supporting_document_files_created: - subject: "Supporting documents uploaded by a member" + subject: "Underlag uppladdat av medlemmen" body: - supporting_document_files_uploaded_below: "Member %{NAME} has uploaded the following supporting documents:" - validate_user: "Please validate this account" + supporting_document_files_uploaded_below: "Medlem %{NAME} har laddat upp följande underlag:" + validate_user: "Vänligen bekräfta detta konto" notify_admin_user_supporting_document_files_updated: - subject: "Member's supporting documents have changed" + subject: "Medlemmens underlag har ändrats" body: - user_update_supporting_document_file: "Member %{NAME} has modified the supporting documents below:" - validate_user: "Please validate this account" + user_update_supporting_document_file: "Medlem %{NAME} har ändrat dokumenten nedan:" + validate_user: "Vänligen bekräfta detta konto" notify_admin_user_child_supporting_document_files_created: - subject: "Supporting documents of child uploaded by a member" + subject: "Underlag för barn uppladdat av medlemmen" body: - supporting_document_files_uploaded_below: "Child %{NAME} has uploaded the following supporting documents:" - validate_child: "Please validate this child account" + supporting_document_files_uploaded_below: "Child %{NAME} har laddat upp följande underlag:" + validate_child: "Vänligen bekräfta detta barnkonto" notify_admin_user_child_supporting_document_files_updated: - subject: "Child's supporting documents have changed" + subject: "Barnets underlag har ändrats" body: - child_update_supporting_document_file: "Child %{NAME} has modified the supporting documents below:" - validate_child: "Please validate this child account" + child_update_supporting_document_file: "Child %{NAME} har ändrat underlagen nedan:" + validate_child: "Vänligen bekräfta detta barnkonto" notify_user_is_validated: - subject: "Account validated" + subject: "Konto bekräftat" body: - account_validated: "Your account was validated. Now, you have access to booking features." + account_validated: "Ditt konto har bekräftats. Nu har du tillgång till bokningsfunktioner." notify_user_is_invalidated: - subject: "Account invalidated" + subject: "Kontot ogiltigförklarat" body: - account_invalidated: "Your account was invalidated. You won't be able to book anymore, until your account is validated again." + account_invalidated: "Ditt konto har ogiltigförklarats. Du kommer inte att kunna boka igen förrän ditt konto har validerats." notify_user_child_is_validated: - subject: "Child account validated" + subject: "Barnkonto validerat" body: - child_validated: "Your child account was validated. Now, you have access to event booking features." + child_validated: "Ditt barnkonto har validerats. Nu har du tillgång till bokningsfunktioner för evenemang." notify_user_child_is_invalidated: - subject: "Child account invalidated" + subject: "Barnkonto ogiltigförklarat" body: - child_invalidated: "Your child account was invalidated. You won't be able to book event, until your child account is validated again." + child_invalidated: "Ditt barnkonto har ogiltigförklarats. Du kommer inte att kunna boka evenemang, förrän ditt barnkonto har validerats igen." notify_user_supporting_document_refusal: - subject: "Your supporting documents were refused" + subject: "Dina underlag avvisades" body: - user_supporting_document_files_refusal: "Your supporting documents were refused:" - action: "Please re-upload some new supporting documents." + user_supporting_document_files_refusal: "Dina underlag avvisades:" + action: "Vänligen ladda upp några nya underlag." notify_user_supporting_document_reminder: - subject: "Reminder to upload your supporting documents" + subject: "Påminnelse om att ladda upp dina underlag" body: - user_supporting_document_reminder: "This is a reminder for you to upload your supporting documents." + user_supporting_document_reminder: "Detta är en påminnelse för dig att ladda upp dina underlag." notify_admin_user_supporting_document_refusal: - subject: "A member's supporting documents were refused" + subject: "Medlemmens underlag avvisades" body: - user_supporting_document_files_refusal: "Member %{NAME}'s supporting documents were rejected by %{OPERATOR}:" + user_supporting_document_files_refusal: "Medlem %{NAME} s underlag avvisades av %{OPERATOR}:" notify_user_child_supporting_document_refusal: - subject: "Your child's supporting documents were refused" + subject: "Ditt barns underlag avvisades" body: - user_child_supporting_document_files_refusal: "Your supporting documents were refused:" - action: "Please re-upload some new supporting documents." + user_child_supporting_document_files_refusal: "Dina underlag avvisades:" + action: "Vänligen ladda upp några nya underlag." notify_admin_user_child_supporting_document_refusal: - subject: "A child's supporting documents were refused" + subject: "Ditt barns underlag avvisades" body: - user_child_supporting_document_files_refusal: "Child %{NAME}'s supporting documents were rejected by %{OPERATOR}:" + user_child_supporting_document_files_refusal: "Barnet %{NAME} s underlag avvisades av %{OPERATOR}:" shared: - hello: "Hello %{user_name}" + hello: "Hej %{user_name}" notify_user_order_is_ready: - subject: "Your command is ready" + subject: "Din beställning är redo" body: - notify_user_order_is_ready: "Your command %{REFERENCE} is ready:" + notify_user_order_is_ready: "Din beställning %{REFERENCE} är redo:" notify_user_order_is_canceled: - subject: "Your command was canceled" + subject: "Din beställning är avbruten" body: - notify_user_order_is_canceled: "Your command %{REFERENCE} was canceled." + notify_user_order_is_canceled: "Din beställning %{REFERENCE} är avbruten." notify_user_order_is_refunded: - subject: "Your command was refunded" + subject: "Din beställning har återbetalats" body: - notify_user_order_is_refunded: "Your command %{REFERENCE} was refunded." + notify_user_order_is_refunded: "Din beställning %{REFERENCE} har återbetalats." notify_member_reservation_validated: - subject: "Your reservation was validated" + subject: "Din bokning har godkänts" body: - reservation_validated_html: "%{RESERVABLE} was validated." - your_reserved_slots: "Your reserved slots are:" + reservation_validated_html: "%{RESERVABLE} godkändes." + your_reserved_slots: "Dina bokade platser är:" notify_admin_reservation_validated: - subject: "Pre-registration was validated" + subject: "Din förbokning har godkänts" body: - reservation_validated_html: "%{RESERVABLE} of %{NAME} was validated." - reserved_slots: "Reserved slots are:" + reservation_validated_html: "%{RESERVABLE} godkändes." + reserved_slots: "Bokade platser är:" notify_member_reservation_invalidated: - subject: "Your pre-registration wasn't validated" + subject: "Din förbokning har avslagits" body: - reservation_invalidated_html: "%{RESERVABLE} wasn't validated." + reservation_invalidated_html: "%{RESERVABLE} avslogs." notify_admin_reservation_invalidated: - subject: "Pre-registration wasn't validated" + subject: "Din förbokning har avslagits" body: - reservation_invalidated_html: "%{RESERVABLE} of %{NAME} wasn't validated." + reservation_invalidated_html: "%{RESERVABLE} i %{NAME} avslogs." notify_user_when_child_age_will_be_18: - subject: "Your child will be 18 years old" + subject: "Ditt barn kommer att vara 18 år" body: - child_age_will_be_18_years_ago: "Your child %{NAME} will turn 18 on %{DATE}, at which point they will be automatically detached from your Family account. They will need to create their own account in order to make reservations." + child_age_will_be_18_years_ago: "Ditt barn %{NAME} kommer att fylla 18 den %{DATE}, och det kommer automatiskt att kopplas bort från ditt familjekonto. Det måste skapa ett eget konto för att kunna göra reservationer." From 587b73685fd51033d21f1177a2d166b8619ef2b5 Mon Sep 17 00:00:00 2001 From: Du Peng Date: Thu, 1 Feb 2024 10:08:47 +0100 Subject: [PATCH 16/17] (bug) remove unused code --- config/environments/development.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/config/environments/development.rb b/config/environments/development.rb index 93e33c9f4..d2d22723f 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -91,8 +91,6 @@ Rails.application.configure do config.web_console.permissions = %w[192.168.0.0/16 192.168.99.0/16 10.0.2.2] config.hosts << ENV.fetch('DEFAULT_HOST', 'localhost') - config.hosts << "37abab1a904d96b727afdf86f2eb4830.serveo.net" - config.action_controller.forgery_protection_origin_check = false # https://github.com/flyerhzm/bullet # In development, Bullet will find and report N+1 DB requests From 2aaf801c1f4785fba48dea8729c0f5f05e7a93a6 Mon Sep 17 00:00:00 2001 From: Du Peng Date: Thu, 1 Feb 2024 14:48:05 +0100 Subject: [PATCH 17/17] (bug) remove unused code --- app/controllers/sessions_controller.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index dd869f114..466bd5b09 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -7,7 +7,6 @@ class SessionsController < Devise::SessionsController if active_provider.providable_type == 'DatabaseProvider' super else - p active_provider redirect_post "/users/auth/#{active_provider.strategy_name}" end end
Date: Fri, 5 Jan 2024 15:08:47 +0100 Subject: [PATCH 03/17] (bug) unable to show extended prices of space --- CHANGELOG.md | 1 + .../pricing/spaces/configure-extended-prices-button.tsx | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 054aae94a..401f387c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Next release - translation files added for Swedish +- Fix a bug: unable to show extended prices of space ## v6.3.8 2023 December 29 diff --git a/app/frontend/src/javascript/components/pricing/spaces/configure-extended-prices-button.tsx b/app/frontend/src/javascript/components/pricing/spaces/configure-extended-prices-button.tsx index 826d8e9b1..bd39bc46d 100644 --- a/app/frontend/src/javascript/components/pricing/spaces/configure-extended-prices-button.tsx +++ b/app/frontend/src/javascript/components/pricing/spaces/configure-extended-prices-button.tsx @@ -1,4 +1,4 @@ -import { ReactNode, useState } from 'react'; +import { ReactNode, useState, useEffect } from 'react'; import * as React from 'react'; import { Price } from '../../../models/price'; import { useTranslation } from 'react-i18next'; @@ -28,6 +28,10 @@ export const ConfigureExtendedPricesButton: React.FC>(prices); const [showList, setShowList] = useState(false); + useEffect(() => { + setExtendedPrices(prices); + }, [prices]); + /** * Return the number of hours, user-friendly formatted */ From ab93c3d1464bc90136b941135258943199dd7a3c Mon Sep 17 00:00:00 2001 From: Du Peng Date: Fri, 5 Jan 2024 18:22:44 +0100 Subject: [PATCH 04/17] (bug) event number places error in statistic --- CHANGELOG.md | 2 ++ .../statistics/builders/reservations_builder_service.rb | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 401f387c1..57d6dbf68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ ## Next release - translation files added for Swedish - Fix a bug: unable to show extended prices of space +- Fix a bug: event number places error in statistic +- [TODO DEPLOY] `rails fablab:maintenance:regenerate_statistics[2023,9]` ## v6.3.8 2023 December 29 diff --git a/app/services/statistics/builders/reservations_builder_service.rb b/app/services/statistics/builders/reservations_builder_service.rb index 36d09d6d1..226138820 100644 --- a/app/services/statistics/builders/reservations_builder_service.rb +++ b/app/services/statistics/builders/reservations_builder_service.rb @@ -22,7 +22,7 @@ class Statistics::Builders::ReservationsBuilderService coupon: r[:coupon], groupName: r[:groupName], }.merge(user_info_stat(r))) - stat[:stat] = (type == 'booking' ? 1 : r[:nb_hours]) + stat[:stat] = (type == 'booking' ? (category == 'event' ? r[:nb_places] : 1) : r[:nb_hours]) stat["#{category}Id".to_sym] = r["#{category}_id".to_sym] stat = add_custom_attributes(category, stat, r) From 332b9a3870b79fae9bb7e7e3588435ae4857e4d2 Mon Sep 17 00:00:00 2001 From: Du Peng Date: Fri, 5 Jan 2024 18:23:24 +0100 Subject: [PATCH 05/17] update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 57d6dbf68..7676082b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ - translation files added for Swedish - Fix a bug: unable to show extended prices of space - Fix a bug: event number places error in statistic -- [TODO DEPLOY] `rails fablab:maintenance:regenerate_statistics[2023,9]` +- [TODO DEPLOY] `rails fablab:maintenance:regenerate_statistics[2014,1]` ## v6.3.8 2023 December 29 From 83eca554d8e3367f568ce76b4918149b7b29a99a Mon Sep 17 00:00:00 2001 From: Du Peng Date: Mon, 8 Jan 2024 09:26:55 +0100 Subject: [PATCH 06/17] Version 6.3.9 --- CHANGELOG.md | 3 +++ package.json | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7676082b1..2d58cdfa1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # Changelog Fab-manager ## Next release + +## v6.3.9 2024 January 8 + - translation files added for Swedish - Fix a bug: unable to show extended prices of space - Fix a bug: event number places error in statistic diff --git a/package.json b/package.json index dba158a08..4725917e1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fab-manager", - "version": "6.3.8", + "version": "6.3.9", "description": "Fab-manager is the FabLab management solution. It provides a comprehensive, web-based, open-source tool to simplify your administrative tasks and your marker's projects.", "keywords": [ "fablab", From f77b4af211d7065a5fc6df85eb4a3b0e96d1bd6a Mon Sep 17 00:00:00 2001 From: Du Peng Date: Fri, 12 Jan 2024 11:55:07 +0100 Subject: [PATCH 07/17] (bug) unable to update event recurrence --- CHANGELOG.md | 2 ++ app/frontend/src/javascript/components/events/event-form.tsx | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d58cdfa1..7cdbafe97 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Next release +- Fix a bug: unable to update event recurrence + ## v6.3.9 2024 January 8 - translation files added for Swedish diff --git a/app/frontend/src/javascript/components/events/event-form.tsx b/app/frontend/src/javascript/components/events/event-form.tsx index 499b71647..b24296e72 100644 --- a/app/frontend/src/javascript/components/events/event-form.tsx +++ b/app/frontend/src/javascript/components/events/event-form.tsx @@ -132,8 +132,7 @@ export const EventForm: React.FC = ({ action, event, onError, on * Check if any dates have changed */ const datesHaveChanged = (): boolean => { - return ((event?.start_date !== (updatingEvent?.start_date as Date)?.toISOString()?.substring(0, 10)) || - (event?.end_date !== (updatingEvent?.end_date as Date)?.toISOString()?.substring(0, 10))); + return (event?.start_date !== updatingEvent?.start_date) || (event?.end_date !== updatingEvent?.end_date); }; /** From 25a4dda4292a7dd119feb7255606ef50a471b565 Mon Sep 17 00:00:00 2001 From: Du Peng Date: Fri, 19 Jan 2024 14:41:34 +0100 Subject: [PATCH 08/17] (i18n) updated translations --- config/locales/app.logged.sv.yml | 588 +++++++-------- config/locales/app.public.sv.yml | 982 ++++++++++++------------- config/locales/app.shared.sv.yml | 930 ++++++++++++------------ config/locales/base.sv.yml | 2 +- config/locales/devise.sv.yml | 92 +-- config/locales/fr.yml | 2 +- config/locales/mails.sv.yml | 174 ++--- config/locales/sv.yml | 1162 +++++++++++++++--------------- 8 files changed, 1966 insertions(+), 1966 deletions(-) diff --git a/config/locales/app.logged.sv.yml b/config/locales/app.logged.sv.yml index 9581ae602..550388dea 100644 --- a/config/locales/app.logged.sv.yml +++ b/config/locales/app.logged.sv.yml @@ -3,353 +3,353 @@ sv: logged: #user's profile completion page when logging from an SSO provider profile_completion: - confirm_your_new_account: "Confirm your new account" - or: "or" - do_you_already_have_an_account: "Do you already have an account?" - do_not_fill_the_form_beside_but_specify_here_the_code_you_ve_received_by_email_to_recover_your_access: "Do not fill the form beside but specify here the code you've received by email, to recover your access." - just_specify_code_here_to_recover_access: "Just specify here the code you've received by email to recover your access." - i_did_not_receive_the_code: "I didn't receive the code" - authentification_code: "Authentification code" - confirm_my_code: "Confirm my code" - an_unexpected_error_occurred_check_your_authentication_code: "An unexpected error occurred, please check your authentication code." - send_code_again: "Send the code again" - email_address_associated_with_your_account: "Email address associated with your account" - email_is_required: "Email address is required" - email_format_is_incorrect: "Email format is incorrect" - code_successfully_sent_again: "Code successfully sent again" - used_for_statistics: "This data will be used for statistical purposes" - your_user_s_profile: "Your user's profile" - user_s_profile_is_required: "User's profile is required." - i_ve_read_and_i_accept_: "I've read and I accept" - _the_fablab_policy: "the FabLab policy" - your_profile_has_been_successfully_updated: "Your profile has been successfully updated." + confirm_your_new_account: "Bekräfta ditt nya konto" + or: "eller" + do_you_already_have_an_account: "Har du redan ett konto?" + do_not_fill_the_form_beside_but_specify_here_the_code_you_ve_received_by_email_to_recover_your_access: "Fyll inte i formuläret bredvid men ange här koden du har fått via e-post, för att återställa din åtkomst." + just_specify_code_here_to_recover_access: "Fyll i koden du har fått via e-post, för att återställa din åtkomst." + i_did_not_receive_the_code: "Jag tog inte emot koden" + authentification_code: "Auktoriseringskod" + confirm_my_code: "Bekräfta kod" + an_unexpected_error_occurred_check_your_authentication_code: "Ett oväntat fel uppstod, kontrollera din autentiseringskod." + send_code_again: "Skicka koden igen" + email_address_associated_with_your_account: "E-postadress kopplad till kontot" + email_is_required: "E-postadress krävs" + email_format_is_incorrect: "E-postformatet är felaktigt" + code_successfully_sent_again: "Koden har skickats igen" + used_for_statistics: "Dessa uppgifter kommer att användas för statistiska ändamål" + your_user_s_profile: "Din användares profil" + user_s_profile_is_required: "Användarprofil måste fyllas i." + i_ve_read_and_i_accept_: "Jag har läst och accepterat" + _the_fablab_policy: "fabLab policy" + your_profile_has_been_successfully_updated: "Din profil har uppdaterats." completion_header_info: - rules_changed: "Please fill the following form to update your profile and continue to use the platform." - sso_intro: "You've just created a new account on {GENDER, select, neutral{} other{the}} {NAME}, by logging from" - duplicate_email_info: "It looks like your email address is already used by another user. Check your email address and please input below the code you have received." - details_needed_info: "To finalize your account, we need some more details." + rules_changed: "Fyll i följande formulär för att uppdatera din profil och fortsätt att använda plattformen." + sso_intro: "Du har precis skapat ett nytt konto på {GENDER, select, neutral{} other{}} {NAME}genom att logga från" + duplicate_email_info: "Det verkar som om din e-postadress redan används av en annan användare. Kontrollera din e-postadress och ange nedan den kod du har fått." + details_needed_info: "För att slutföra ditt konto behöver vi lite mer information." profile_form_option: - title: "New on this platform?" - please_fill: "Please fill in the following form to create your account." - disabled_data_from_sso: "Some data may have already been provided by {NAME} and cannot be modified." - confirm_instructions_html: "Once you are done, please click on Save to confirm your account and start using the application." - duplicate_email_html: "It looks like your email address ({EMAIL}) is already associated with another account. If this account is not yours, please click on the following button to change the email associated with your {PROVIDER} account." - edit_profile: "Change my data" - after_edition_info_html: "Once your data are up to date, click on the synchronization button below, or disconnect then reconnect for your changes to take effect." - sync_profile: "Sync my profile" + title: "Är du ny här?" + please_fill: "Fyll i följande formulär för att skapa ditt konto." + disabled_data_from_sso: "Vissa data kan redan ha tillhandahållits av {NAME} och kan inte ändras." + confirm_instructions_html: "När du är klar, klicka på Spara för att bekräfta ditt konto och börja använda programmet." + duplicate_email_html: "Det verkar som om din e-postadress ({EMAIL}) redan är associerad med ett annat konto. Om detta konto inte är ditt, klicka på följande knapp för att ändra e-postmeddelandet som är kopplat till ditt {PROVIDER} -konto." + edit_profile: "Ändra mina uppgifter" + after_edition_info_html: "När dina data är uppdaterade, klicka på synkroniseringsknappen under, eller koppla bort sedan återanslut för att dina ändringar ska träda i kraft." + sync_profile: "Synkronisera min profil" event_reservation_item: - event: "Event" - family: "Reserved for members" - nominative: "Nominative" - pre_registration: "Pre-registration" - NUMBER_normal_places_reserved: "{NUMBER} {NUMBER, plural, =0{} =1{normal place reserved} other{normal places reserved}}" - NUMBER_of_NAME_places_reserved: "{NUMBER} {NUMBER, plural, =0{} =1{of {NAME} place reserved} other{of {NAME} places reserved}}" - tracking_your_reservation: "Tracking your reservation" - in_the_process_of_validation: "In the process of validation" - settle_your_payment: "Come to the reception desk to settle" - paid: "Paid" - canceled: "Canceled" - registered: "Registered" - not_validated: "Not validated" - present: "Present" + event: "Evenemang" + family: "Reserverat för Medlemmar" + nominative: "Nominativ" + pre_registration: "Föranmälan" + NUMBER_normal_places_reserved: "{NUMBER} {NUMBER, plural, one {}=0{} =1{normal plats reserverad} other{normala platser reserverade}}" + NUMBER_of_NAME_places_reserved: "{NUMBER} {NUMBER, plural, one {}=0{} =1{av {NAME} plats reserverad} other{av {NAME} platser reserverade}}" + tracking_your_reservation: "Spåra din bokning" + in_the_process_of_validation: "I processen för validering" + settle_your_payment: "Betala på plats" + paid: "Betald" + canceled: "Avbruten" + registered: "Registrerad" + not_validated: "Ej validerad" + present: "Närvarande" dashboard: #dashboard: public profile profile: empty: '' #dashboard: edit my profile settings: - last_activity_on_: "Last activity on {DATE}" - i_want_to_change_group: "I want to change group!" - your_subscription_expires_on_: "Your subscription expires on" - no_subscriptions: "No subscriptions" - i_want_to_subscribe: "I want to subscribe!" - to_come: "to come" - approved: "approved" - projects: "Projects" - no_projects: "No projects" - labels: "Labels" - no_labels: "No labels" + last_activity_on_: "Senaste aktivitet på {DATE}" + i_want_to_change_group: "Jag vill byta grupp!" + your_subscription_expires_on_: "Din prenumeration löper ut den" + no_subscriptions: "Inga prenumerationer" + i_want_to_subscribe: "Jag vill prenumerera!" + to_come: "kommande" + approved: "godkänt" + projects: "Projekt" + no_projects: "Inga projekt" + labels: "Etiketter" + no_labels: "Inga etiketter" cookies: "Cookies" - cookies_accepted: "You have accepted cookies" - cookies_declined: "You have refused cookies" - cookies_unset: "You have not chosen yet" - reset_cookies: "Change my choice" - delete_my_account: "Delete my account" - edit_my_profile: "Edit my profile" - your_group_has_been_successfully_changed: "Your group has been successfully changed." - an_unexpected_error_prevented_your_group_from_being_changed: "An unexpected error prevented your group from being changed." - confirmation_required: "Confirmation required" - confirm_delete_your_account: "Do you really want to delete your account?" - all_data_will_be_lost: "All your data will be destroyed and won't be recoverable." - invoicing_data_kept: "According to regulation, all data related to your invoices will be kept separately for 10 years." - statistic_data_anonymized: "Some data (sex, date of birth, group) will be anonymized and kept for statistical purposes." - no_further_access_to_projects: "Your published projects will be anonymized and you won't get any further ability to edit them." - your_user_account_has_been_successfully_deleted_goodbye: "Your user account has been successfully deleted. Goodbye." - an_error_occured_preventing_your_account_from_being_deleted: "An error occurred, preventing your account from being deleted." - used_for_statistics: "This data will be used for statistical purposes" - used_for_invoicing: "This data will be used for billing purposes" - used_for_reservation: "This data will be used in case of change on one of your bookings" - used_for_profile: "This data will only be displayed on your profile" - used_for_pricing_stats: "This data will be used to determine the prices to which you are entitled, and for statistical purposes" - public_profile: "You will have a public profile and other users will be able to associate you in their projects" - trainings: "Trainings" - no_trainings: "No trainings" - subscription: "Subscription" - group: "Group" - or: "or" - confirm_changes: "Confirm changes" - change_my_data: "Change my data" - sync_my_profile: "Sync my profile" - once_your_data_are_up_to_date_: "Once your data are up to date," - _click_on_the_synchronization_button_opposite_: "click on the synchronization button opposite" - _disconnect_then_reconnect_: "disconnect then reconnect" - _for_your_changes_to_take_effect: "for your changes to take effect." - your_profile_has_been_successfully_updated: "Your profile has been successfully updated." + cookies_accepted: "Du har accepterat cookies" + cookies_declined: "Du har avböjt cookies" + cookies_unset: "Du har inte valt ännu" + reset_cookies: "Ändra mitt val" + delete_my_account: "Ta bort mitt konto" + edit_my_profile: "Redigera min profil" + your_group_has_been_successfully_changed: "Din grupp har ändrats." + an_unexpected_error_prevented_your_group_from_being_changed: "Ett oväntat fel förhindrade att din grupp ändrades." + confirmation_required: "Verifiering krävs" + confirm_delete_your_account: "Vill du verkligen radera ditt konto?" + all_data_will_be_lost: "Alla dina data raderas och kan inte återställas." + invoicing_data_kept: "Enligt lag kommer uppgifter om dina fakturor att sparas upp till 10 år." + statistic_data_anonymized: "Vissa uppgifter (kön, födelsedatum, grupp) kommer att anonymiseras och sparas för statistiska ändamål." + no_further_access_to_projects: "Dina publicerade projekt anonymiseras och du får ingen ytterligare möjlighet att redigera dem." + your_user_account_has_been_successfully_deleted_goodbye: "Ditt användarkonto har tagits bort." + an_error_occured_preventing_your_account_from_being_deleted: "Ett fel uppstod, vilket förhindrar att ditt konto tas bort." + used_for_statistics: "Dessa uppgifter kommer att användas för statistiska ändamål" + used_for_invoicing: "Dessa uppgifter kommer att användas för faktureringsändamål" + used_for_reservation: "Dessa uppgifter kommer att användas i händelse av ändring av dina bokningar" + used_for_profile: "Dessa uppgifter kommer endast att visas på din profil" + used_for_pricing_stats: "Dessa uppgifter kommer att användas för att bestämma vilka priser du har rätt till, och för statistiska ändamål" + public_profile: "Du kommer att ha en publik profil och andra användare kommer att kunna knyta dig till sina projekt" + trainings: "Utbildningar" + no_trainings: "Inga utbildningar" + subscription: "Prenumeration" + group: "Grupp" + or: "eller" + confirm_changes: "Bekräfta ändringar" + change_my_data: "Ändra mina uppgifter" + sync_my_profile: "Synkronisera min profil" + once_your_data_are_up_to_date_: "När dina uppgifter är uppdaterade," + _click_on_the_synchronization_button_opposite_: "klicka på synkroniseringsknappen mittemot" + _disconnect_then_reconnect_: "koppla bort sedan återanslut" + _for_your_changes_to_take_effect: "för att dina ändringar ska träda i kraft." + your_profile_has_been_successfully_updated: "Din profil har uppdaterats." #dashboard: my projects projects: - you_dont_have_any_projects: "You don't have any projects." - add_a_project: "Add a project" - author: "Author" - collaborator: "Collaborator" - rough_draft: "Draft" - description: "Description" - machines_and_materials: "Machines and materials" - machines: "Machines" - materials: "Materials" - collaborators: "Collaborators" + you_dont_have_any_projects: "Du har inte några projekt." + add_a_project: "Lägg till projekt" + author: "Upphovsman" + collaborator: "Samarbetspartner" + rough_draft: "Utkast" + description: "Beskrivning" + machines_and_materials: "Utrustning och material" + machines: "Utrustning" + materials: "Material" + collaborators: "Medverkande" #dashboard: my trainings trainings: - your_next_trainings: "Your next trainings" - your_previous_trainings: "Your previous trainings" - your_approved_trainings: "Your approved trainings" - no_trainings: "No trainings" - your_training_credits: "Your training credits" - subscribe_for_credits: "Subscribe to benefit from free trainings" - register_for_free: "Register for free to the following trainings:" - book_here: "Book here" - canceled: "Canceled" + your_next_trainings: "Dina kommande utbildningar" + your_previous_trainings: "Dina tidigare utbildningar" + your_approved_trainings: "Dina godkända utbildningar" + no_trainings: "Inga utbildningar" + your_training_credits: "Dina utbildningskrediter" + subscribe_for_credits: "Prenumerera för att dra nytta av gratis utbildningar" + register_for_free: "Registrera dig gratis till följande utbildningar:" + book_here: "Boka här" + canceled: "Avbruten" #dashboard: my events events: - your_next_events: "Your next events" - no_events_to_come: "No events to come" - your_previous_events: "Your previous events" - no_passed_events: "No passed events" - NUMBER_normal_places_reserved: "{NUMBER} {NUMBER, plural, =0{} =1{normal place reserved} other{normal places reserved}}" - NUMBER_of_NAME_places_reserved: "{NUMBER} {NUMBER, plural, =0{} =1{of {NAME} place reserved} other{of {NAME} places reserved}}" + your_next_events: "Dina kommande händelser" + no_events_to_come: "Inga kommande evenemang" + your_previous_events: "Dina tidigare händelser" + no_passed_events: "Inga tidigare evenemang" + NUMBER_normal_places_reserved: "{NUMBER} {NUMBER, plural, one {}=0{} =1{normal plats reserverad} other{normala platser reserverade}}" + NUMBER_of_NAME_places_reserved: "{NUMBER} {NUMBER, plural, one {}=0{} =1{av {NAME} plats reserverad} other{av {NAME} platser reserverade}}" #dashboard: my invoices invoices: - reference_number: "Reference number" - date: "Date" - price: "Price" - download_the_invoice: "Download the invoice" - download_the_credit_note: "Download the refund invoice" - no_invoices_for_now: "No invoices for now." + reference_number: "Referensnummer" + date: "Datum" + price: "Pris" + download_the_invoice: "Hämta faktura" + download_the_credit_note: "Hämta kreditnota" + no_invoices_for_now: "Inga fakturor för tillfället." payment_schedules_dashboard: - no_payment_schedules: "No payment schedules to display" - load_more: "Load more" - card_updated_success: "Your card was successfully updated" + no_payment_schedules: "Inga betalningsscheman att visa" + load_more: "Ladda mer" + card_updated_success: "Ditt kort har sparats" supporting_documents_files: - file_successfully_uploaded: "The supporting documents were sent." - unable_to_upload: "Unable to send the supporting documents: " - supporting_documents_files: "Supporting documents" - my_documents_info: "Due to your group declaration, some supporting documents are required. Once submitted, these documents will be verified by the administrator." - upload_limits_alert_html: "Warning!
You can submit your documents as PDF or images (JPEG, PNG). Maximum allowed size: {SIZE} Mb" - file_size_error: "The file size exceeds the limit ({SIZE} MB)" - save: "Save" - browse: "Browse" - edit: "Edit" + file_successfully_uploaded: "Underlagen har skickats." + unable_to_upload: "Det går inte att skicka underlagen: " + supporting_documents_files: "Underlag" + my_documents_info: "På grund av din grupptillhörighet krävs vissa underlag. När de har skickats in kommer dessa dokument att verifieras av administratören." + upload_limits_alert_html: "Varning!
Du kan skicka dina dokument som PDF eller bilder (JPEG, PNG). Maximal tillåten storlek: {SIZE} Mb" + file_size_error: "Filstorleken överskrider gränsen ({SIZE} MB)" + save: "Spara" + browse: "Bläddra" + edit: "Redigera" reservations_dashboard: - machine_section_title: "Machines reservations" - space_section_title: "Spaces reservations" + machine_section_title: "Utrustningsbokning" + space_section_title: "Lokalbokning" reservations_panel: - title: "My reservations" - upcoming: "Upcoming" - date: "Date" - history: "History" - no_reservation: "No reservation" - show_more: "Show more" - cancelled_slot: "Cancelled" + title: "Mina bokningar" + upcoming: "Kommande" + date: "Datum" + history: "Historik" + no_reservation: "Ingen bokning" + show_more: "Visa mer" + cancelled_slot: "Inställt" reservations_panel_as_admin: - title: "Reservations" + title: "Bokningar" credits_panel: - title: "My credits" - info: "Your subscription comes with free credits you can use when reserving" - remaining_credits_html: "You can book {REMAINING} {REMAINING, plural, one{slot} other{slots}} for free." - used_credits_html: "You have already used {USED} {USED, plural, =0{credit} one{credit} other{credits}}." - no_credits: "You don't have any credits yet. Some subscriptions may allow you to book some slots for free." + title: "Mina krediter" + info: "Din prenumeration levereras med gratis krediter du kan använda när du bokar" + remaining_credits_html: "Du kan boka {REMAINING} {REMAINING, plural, one{plats} other{platser}} gratis." + used_credits_html: "Du har redan använt {USED} {USED, plural, =0{kredit} one{kredit} other{krediter}}." + no_credits: "Du har inga krediter ännu. Vissa prenumerationer kan tillåta dig att boka några platser gratis." credits_panel_as_admin: - title: "Credits" - remaining_credits_html: "{REMAINING} {REMAINING, plural, one{slot} other{slots}} can be booked for free." - used_credits_html: " {USED} {USED, plural, =0{credit} one{credit} other{credits}} already used." - no_credits: "No credits yet." + title: "Krediter" + remaining_credits_html: "{REMAINING} {REMAINING, plural, one{plats} other{platser}} kan bokas gratis." + used_credits_html: " {USED} {USED, plural, =0{krediter} one{kredit} other{krediter}} används redan." + no_credits: "Inga krediter ännu." prepaid_packs_panel: - title: "My prepaid packs" - name: "Prepaid pack name" - end: "Expiry date" - countdown: "Countdown" - history: "History" - consumed_hours: "{COUNT, plural, =1{1H consumed} other{{COUNT}H consumed}}" - cta_info: "You can buy prepaid hours packs to book machines and benefit from discounts. Choose a machine to buy a corresponding pack." - select_machine: "Select a machine" - cta_button: "Buy a pack" - no_packs: "No prepaid packs available for sale" - reserved_for_subscribers_html: 'The purchase of prepaid packs is reserved for subscribers. Subscribe now to benefit.' + title: "Mina förbetalda paket" + name: "Förbetalt paket" + end: "Förfallodatum" + countdown: "Nedräkning" + history: "Historik" + consumed_hours: "{COUNT, plural, one {}=1{1timme förbrukad} other{{COUNT}timmar förbrukade}}" + cta_info: "Du kan köpa förbetalda paket för att boka utrustning och dra nytta av rabatter. Välj utrustning för att köpa motsvarande paket." + select_machine: "Välj utrustning" + cta_button: "Köp ett paket" + no_packs: "Inga förbetalda paket tillgängliga för försäljning" + reserved_for_subscribers_html: 'Köpet av förbetalda paket är reserverat för prenumeranter. Prenumerera nu för att dra nytta av det.' prepaid_packs_panel_as_admin: - title: "Prepaid packs" + title: "Förbetalda paket" #public profil of a member members_show: - members_list: "Members list" + members_list: "Medlemslista" #list of members accepting to be contacted members: - the_fablab_members: "The Fab Lab members" - display_more_members: "Display more members..." - no_members_for_now: "No members for now" - avatar: "Avatar" - user: "User" + the_fablab_members: "Fab Lab medlemmar" + display_more_members: "Visa fler medlemmar..." + no_members_for_now: "Inga medlemmar just nu" + avatar: "Profilbild" + user: "Användare" pseudonym: "Pseudonym" - email_address: "Email address" + email_address: "E-postadress" #add a new project projects_new: - add_a_new_project: "Add a new project" + add_a_new_project: "Lägg till ett nytt projekt" #modify an existing project projects_edit: - edit_the_project: "Edit the project" - rough_draft: "Draft" - publish: "Publish" + edit_the_project: "Redigera projektet" + rough_draft: "Utkast" + publish: "Publicera" #book a machine machines_reserve: - machine_planning: "Machine planning" - i_ve_reserved: "I've reserved" - not_available: "Not available" - i_reserve: "I reserve" - i_shift: "I shift" - i_change: "I change" - do_you_really_want_to_cancel_this_reservation: "Do you really want to cancel this reservation?" - reservation_was_cancelled_successfully: "Reservation was cancelled successfully." - cancellation_failed: "Cancellation failed." - a_problem_occured_during_the_payment_process_please_try_again_later: "A problem occurred during the payment process. Please try again later." + machine_planning: "Utrustningsplanering" + i_ve_reserved: "Jag har bokat" + not_available: "Inte tillgänglig" + i_reserve: "Jag reserverar" + i_shift: "Jag byter" + i_change: "Jag ändrar" + do_you_really_want_to_cancel_this_reservation: "Vill du avboka den här bokningen?" + reservation_was_cancelled_successfully: "Bokningen avbröts." + cancellation_failed: "Avbokning misslyckades." + a_problem_occured_during_the_payment_process_please_try_again_later: "Ett problem uppstod under betalningsprocessen. Försök igen senare." #modal telling users that they must wait for their training validation before booking a machine pending_training_modal: - machine_reservation: "Machine reservation" - wait_for_validated: "You must wait for your training is being validated by the FabLab team to book this machine." - training_will_occur_DATE_html: "Your training will occur at {DATE}" + machine_reservation: "Utrustningsbokning" + wait_for_validated: "Du måste vänta på din utbildning valideras av teamet för att boka denna maskin." + training_will_occur_DATE_html: "Din utbildning kommer att ske den {DATE}" DATE_TIME: "{DATE} {TIME}" #modal telling users that they need to pass a training before booking a machine required_training_modal: - to_book_MACHINE_requires_TRAINING_html: "To book the \"{MACHINE}\" you must have completed the training {TRAINING}." - training_or_training_html: "
or the training " - enroll_now: "Enroll to the training" - no_enroll_for_now: "I don't want to enroll now" - close: "Close" + to_book_MACHINE_requires_TRAINING_html: "För att boka \"{MACHINE}\" måste du ha slutfört utbildningen {TRAINING}." + training_or_training_html: " eller utbildningen " + enroll_now: "Anmäl dig till utbildningen" + no_enroll_for_now: "Jag vill inte anmäla mig nu" + close: "Avsluta" propose_packs_modal: - available_packs: "Prepaid packs available" - packs_proposed: "You can buy a prepaid pack of hours for this machine. These packs allows you to benefit from volume discounts." - no_thanks: "No, thanks" - pack_DURATION: "{DURATION} hours" - buy_this_pack: "Buy this pack" - pack_bought_success: "You have successfully bought this pack of prepaid-hours. Your invoice will ba available soon from your dashboard." - validity: "Usable for {COUNT} {PERIODS}" + available_packs: "Förbetalda paket tillgängliga" + packs_proposed: "Du kan köpa ett förbetalt paket timmar för denna utrustning. Med dessa paket kan du dra nytta av volymrabatter." + no_thanks: "Nej, tack" + pack_DURATION: "{DURATION} timmar" + buy_this_pack: "Köp detta paket" + pack_bought_success: "Du har köpt detta paket med förbetalda timmar. Din faktura kommer att vara tillgänglig inom kort från kontrollpanelen." + validity: "Giltig för {COUNT} {PERIODS}" period: - day: "{COUNT, plural, one{day} other{days}}" - week: "{COUNT, plural, one{week} other{weeks}}" - month: "{COUNT, plural, one{month} other{months}}" - year: "{COUNT, plural, one{year} other{years}}" + day: "{COUNT, plural, one{dag} other{dagar}}" + week: "{COUNT, plural, one{vecka} other{veckor}}" + month: "{COUNT, plural, one{månad} other{månader}}" + year: "{COUNT, plural, one{år} other{år}}" packs_summary: - prepaid_hours: "Prepaid hours" - remaining_HOURS: "You have {HOURS} prepaid hours remaining for this {ITEM, select, Machine{machine} Space{space} other{}}." - no_hours: "You don't have any prepaid hours for this {ITEM, select, Machine{machine} Space{space} other{}}." - buy_a_new_pack: "Buy a new pack" - unable_to_use_pack_for_subsription_is_expired: "You must have a valid subscription to use your remaining hours." + prepaid_hours: "Förbetalda timmar" + remaining_HOURS: "Du har {HOURS} förbetalda timmar kvar för detta {ITEM, select, Machine{utrustning} Space{lokal} other{}}." + no_hours: "Du har inga förbetalda timmar för denna {ITEM, select, Machine{utrustning} Space{lokal} other{}}." + buy_a_new_pack: "Köp ett nytt paket" + unable_to_use_pack_for_subsription_is_expired: "Du måste ha en giltig prenumeration för att använda dina återstående timmar." #book a training trainings_reserve: - trainings_planning: "Trainings planning" - planning_of: "Planning of " #eg. Planning of 3d printer training - all_trainings: "All trainings" - cancel_my_selection: "Cancel my selection" - i_change: "I change" - i_shift: "I shift" - i_ve_reserved: "I've reserved" + trainings_planning: "Utbildningsplanering" + planning_of: "Planering av " #eg. Planning of 3d printer training + all_trainings: "Alla utbildningar" + cancel_my_selection: "Avmarkera alla" + i_change: "Jag ändrar" + i_shift: "Jag byter" + i_ve_reserved: "Jag har bokat" #book a space space_reserve: - planning_of_space_NAME: "Planning of the {NAME} space" - i_ve_reserved: "I've reserved" - i_shift: "I shift" - i_change: "I change" + planning_of_space_NAME: "Planering av lokalen {NAME}" + i_ve_reserved: "Jag har bokat" + i_shift: "Jag byter" + i_change: "Jag ändrar" notifications: - notifications_center: "Notifications center" + notifications_center: "Notifieringscenter" notifications_list: - notifications: "All notifications" - mark_all_as_read: "Mark all as read" - date: "Date" - notif_title: "Title" - no_new_notifications: "No new notifications." - archives: "Archives" - no_archived_notifications: "No archived notifications." - load_the_next_notifications: "Load the next notifications..." + notifications: "Alla notifikationer" + mark_all_as_read: "Markera alla som lästa" + date: "Datum" + notif_title: "Rubrik" + no_new_notifications: "Inga nya notifikationer." + archives: "Arkiv" + no_archived_notifications: "Inga arkiverade meddelanden." + load_the_next_notifications: "Ladda nästa avisering..." notification_inline: - mark_as_read: "Mark as read" + mark_as_read: "Markera som läst" notifications_center: - notifications_list: "All notifications" - notifications_settings: "My notifications preferences" + notifications_list: "Alla notifikationer" + notifications_settings: "Meddelandeinställningar" notifications_category: - enable_all: "Enable all" - disable_all: "Disable all" - notify_me_when: "I wish to be notified when" - users_accounts: "Concerning users notifications" - supporting_documents: "Concerning supporting documents notifications" - agenda: "Concerning agenda notifications" - subscriptions: "Concerning subscriptions notifications" - payments: "Concerning payment schedules notifications" - wallet: "Concerning wallet notifications" - shop: "Concerning shop notifications" - projects: "Concerning projects notifications" - accountings: "Concerning accounting notifications" - trainings: "Concerning trainings notifications" - app_management: "Concerning app management notifications" + enable_all: "Aktivera alla" + disable_all: "Inaktivera alla" + notify_me_when: "Jag vill bli underrättad när" + users_accounts: "Angående användaraviseringar" + supporting_documents: "Angående meddelanden om underlag" + agenda: "Angående meddelanden om dagordningen" + subscriptions: "Angående meddelanden om prenumerationer" + payments: "Angående meddelanden om betalningsscheman" + wallet: "Angående plånboksmeddelanden" + shop: "Angående butiksmeddelanden" + projects: "Angående projektnotifieringar" + accountings: "Angående bokföringsmeddelanden" + trainings: "Angående utbildningsmeddelanden" + app_management: "Angående aviseringar för apphantering" notification_form: - notify_admin_when_user_is_created: "A user account has been created" - notify_admin_child_created: "A child has been created" - notify_admin_when_user_is_imported: "A user account has been imported" - notify_admin_profile_complete: "An imported account has completed its profile" - notify_admin_user_merged: "An imported account has been merged with an existing account" - notify_admins_role_update: "The role of a user has changed" - notify_admin_import_complete: "An import is done" - notify_admin_user_group_changed: "A user has changed his group" - notify_admin_user_supporting_document_refusal: "A supporting document has been rejected" - notify_admin_user_child_supporting_document_refusal: "A supporting document of child has been rejected" - notify_admin_user_supporting_document_files_created: "A user has uploaded a supporting document" - notify_admin_user_supporting_document_files_updated: "A user has updated a supporting document" - notify_admin_user_child_supporting_document_files_created: "A child has uploaded a supporting document" - notify_admin_user_child_supporting_document_files_updated: "A child has updated a supporting document" - notify_admin_member_create_reservation: "A member books a reservation" - notify_admin_slot_is_modified: "A reservation slot has been modified" - notify_admin_slot_is_canceled: "A reservation has been cancelled" - notify_admin_reservation_validated: "A reservation has been validated" - notify_admin_reservation_invalidated: "A reservation has been invalidated" - notify_admin_member_pre_booked_reservation: "A pre-booking has been made" - notify_admin_subscribed_plan: "A subscription has been purchased" - notify_admin_subscription_will_expire_in_7_days: "A member subscription expires in 7 days" - notify_admin_subscription_is_expired: "A member subscription has expired" - notify_admin_subscription_extended: "A subscription has been extended" - notify_admin_subscription_canceled: "A member subscription has been cancelled" - notify_admin_payment_schedule_failed: "Card debit failure" - notify_admin_payment_schedule_check_deadline: "A check has to be cashed" - notify_admin_payment_schedule_transfer_deadline: "A bank direct debit has to be confirmed" - notify_admin_payment_schedule_error: "An unexpected error occurred during the card debit" - notify_admin_refund_created: "A refund has been created" - notify_admin_user_wallet_is_credited: "The wallet of an user has been credited" - notify_user_order_is_ready: "Your command is ready" - notify_user_order_is_canceled: "Your command was canceled" - notify_user_order_is_refunded: "Your command was refunded" - notify_admin_low_stock_threshold: "The stock is low" - notify_admin_when_project_published: "A project has been published" - notify_admin_abuse_reported: "An abusive content has been reported" - notify_admin_close_period_reminder: "The fiscal year is coming to an end" - notify_admin_archive_complete: "An accounting archive is ready" - notify_admin_training_auto_cancelled: "A training was automatically cancelled" - notify_admin_export_complete: "An export is available" - notify_user_when_invoice_ready: "An invoice is available" - notify_admin_payment_schedule_gateway_canceled: "A payment schedule has been canceled by the payment gateway" - notify_project_collaborator_to_valid: "You are invited to collaborate on a project" - notify_project_author_when_collaborator_valid: "A collaborator has accepted your invitation to join your project" - notify_admin_order_is_paid: "A new order has been placed" + notify_admin_when_user_is_created: "Användarkonto har skapats" + notify_admin_child_created: "Ett barn har lagts till" + notify_admin_when_user_is_imported: "Ett användarkonto har importerats" + notify_admin_profile_complete: "Ett importerat konto har slutfört sin profil" + notify_admin_user_merged: "Ett importerat konto har slagits samman med ett befintligt konto" + notify_admins_role_update: "Rollen för en användare har ändrats" + notify_admin_import_complete: "En import är klar" + notify_admin_user_group_changed: "En användare har ändrat sin grupp" + notify_admin_user_supporting_document_refusal: "Ett underlag har avvisats" + notify_admin_user_child_supporting_document_refusal: "Ett underlag för ett barn har avvisats" + notify_admin_user_supporting_document_files_created: "En användare har laddat upp ett underlag" + notify_admin_user_supporting_document_files_updated: "En användare har uppdaterat ett underlag" + notify_admin_user_child_supporting_document_files_created: "Ett barn har laddat upp ett underlag" + notify_admin_user_child_supporting_document_files_updated: "Ett barn har uppdaterat ett underlag" + notify_admin_member_create_reservation: "En medlem gör en bokning" + notify_admin_slot_is_modified: "En plats har ändrats" + notify_admin_slot_is_canceled: "En bokning har avbokats" + notify_admin_reservation_validated: "En bokning har validerats" + notify_admin_reservation_invalidated: "En bokning har ogiltigförklarats" + notify_admin_member_pre_booked_reservation: "En förbokning har gjorts" + notify_admin_subscribed_plan: "En prenumeration har köpts" + notify_admin_subscription_will_expire_in_7_days: "Ett medlemsabonnemang löper ut om 7 dagar" + notify_admin_subscription_is_expired: "Din medlemskap har löpt ut" + notify_admin_subscription_extended: "En prenumeration har förlängts" + notify_admin_subscription_canceled: "En medlemsprenumeration har avbrutits" + notify_admin_payment_schedule_failed: "Debitering av kortet misslyckades" + notify_admin_payment_schedule_check_deadline: "En check måste lösas in" + notify_admin_payment_schedule_transfer_deadline: "En bankbetalning måste bekräftas" + notify_admin_payment_schedule_error: "Ett oväntat fel inträffade under kortdebiteringen" + notify_admin_refund_created: "En återbetalning har skapats" + notify_admin_user_wallet_is_credited: "En användares plånbok har krediterats" + notify_user_order_is_ready: "Din beställning är redo" + notify_user_order_is_canceled: "Din beställning är avbruten" + notify_user_order_is_refunded: "Din beställning har återbetalats" + notify_admin_low_stock_threshold: "Lagersaldot är lågt" + notify_admin_when_project_published: "Ett projekt har publicerats" + notify_admin_abuse_reported: "Ett kränkande innehåll har rapporterats" + notify_admin_close_period_reminder: "Räkenskapsåret närmar sig sitt slut" + notify_admin_archive_complete: "Ett bokföringsarkiv är klart" + notify_admin_training_auto_cancelled: "En utbildning avbröts automatiskt" + notify_admin_export_complete: "En export är tillgänglig" + notify_user_when_invoice_ready: "En faktura är tillgänglig" + notify_admin_payment_schedule_gateway_canceled: "Ett betalningsschema har avbrutits av betalningsleverantören" + notify_project_collaborator_to_valid: "Du är inbjuden att delta i projektet" + notify_project_author_when_collaborator_valid: "En samarbetspartner har accepterat din inbjudan att gå med i ditt projekt" + notify_admin_order_is_paid: "En ny beställning har lagts" diff --git a/config/locales/app.public.sv.yml b/config/locales/app.public.sv.yml index 191c1eebd..d0bfb8706 100644 --- a/config/locales/app.public.sv.yml +++ b/config/locales/app.public.sv.yml @@ -3,613 +3,613 @@ sv: public: #header and "about" page common: - about_the_fablab: "About {GENDER, select, male{the} female{the} neutral{} other{the}} {NAME}" - return: "Return" + about_the_fablab: "Om {GENDER, select, male{den} female{den} neutral{} other{den}} {NAME}" + return: "Tillbaka" #cookies cookies: - about_cookies: "This website uses cookies for audience measurement purposes." - learn_more: "Learn more" - accept: "Accept cookies" - decline: "Refuse" + about_cookies: "Denna webbplats använder cookies för målgruppsmätning." + learn_more: "Läs mer" + accept: "Acceptera cookies" + decline: "Neka" #dashboard sections - dashboard: "Dashboard" - my_profile: "My Profile" - my_children: "My Children" - my_settings: "My Settings" - my_supporting_documents_files: "My supporting documents" - my_projects: "My Projects" - my_trainings: "My Trainings" - my_reservations: "My reservations" - my_events: "My Events" - my_invoices: "My Invoices" - my_payment_schedules: "My payment schedules" - my_orders: "My orders" - my_wallet: "My Wallet" + dashboard: "Översikt" + my_profile: "Min profil" + my_children: "Mina barn" + my_settings: "Mina inställningar" + my_supporting_documents_files: "Mina hjälpdokument" + my_projects: "Mina projekt" + my_trainings: "Mina utbildningar" + my_reservations: "Mina bokningar" + my_events: "Mina evenemang" + my_invoices: "Mina fakturor" + my_payment_schedules: "Mina återkommande betalningar" + my_orders: "Mina beställningar" + my_wallet: "Min plånbok" #contextual help - help: "Help" + help: "Hjälp" #login/logout - sign_out: "Sign Out" - sign_up: "Sign Up" - sign_in: "Sign In" + sign_out: "Logga ut" + sign_up: "Skapa konto" + sign_in: "Logga in" #left menu - notifications: "Notifications" + notifications: "Aviseringar" admin: "Admin" - manager: "Manager" - reduce_panel: "Reduce panel" + manager: "Ansvarig" + reduce_panel: "Minska panelen" #left menu (public) - home: "Home" - reserve_a_machine: "Reserve a Machine" - trainings_registrations: "Trainings registrations" - events_registrations: "Events registrations" - reserve_a_space: "Reserve a Space" - projects_gallery: "Projects gallery" - subscriptions: "Subscriptions" - public_calendar: "Calendar" - fablab_store: "Store" + home: "Startsida" + reserve_a_machine: "Boka en maskin" + trainings_registrations: "Registrera utbildning" + events_registrations: "Registrera evenemang" + reserve_a_space: "Boka lokal" + projects_gallery: "Projektgalleri" + subscriptions: "Prenumerationer" + public_calendar: "Kalender" + fablab_store: "Butik" #left menu (admin) - trainings_monitoring: "Trainings" - manage_the_calendar: "Calendar" - manage_the_users: "Users" - manage_the_invoices: "Invoices" - subscriptions_and_prices: "Subscriptions and Prices" - manage_the_events: "Events" - manage_the_machines: "Machines" - manage_the_store: "Store" - manage_the_spaces: "Spaces" - projects: "Projects" - statistics: "Statistics" - customization: "Customization" - open_api_clients: "OpenAPI clients" + trainings_monitoring: "Utbildningar" + manage_the_calendar: "Kalender" + manage_the_users: "Användare" + manage_the_invoices: "Fakturor" + subscriptions_and_prices: "Prenumerationer och priser" + manage_the_events: "Evenemang" + manage_the_machines: "Utrustning" + manage_the_store: "Butik" + manage_the_spaces: "Lokaler" + projects: "Projekt" + statistics: "Statistik" + customization: "Anpassning" + open_api_clients: "OpenAPI-klienter" #account creation modal - create_your_account: "Create your account" + create_your_account: "Skapa konto" man: "Man" - woman: "Woman" - gender_is_required: "Gender is required." - your_first_name: "Your first name" - first_name_is_required: "First name is required." - your_surname: "Your surname" - surname_is_required: "Surname is required." - your_pseudonym: "Your pseudonym" - pseudonym_is_required: "Pseudonym is required." - your_email_address: "Your e-mail address" - email_is_required: "E-mail address is required." - your_password: "Your password" - password_is_required: "Password is required." - password_is_too_short: "Password is too short (minimum 12 characters)" - password_is_too_weak: "Password is too weak:" - password_is_too_weak_explanations: "minimum 12 characters, at least one uppercase letter, one lowercase letter, one number and one special character" - type_your_password_again: "Type your password again" - password_confirmation_is_required: "Password confirmation is required." - password_does_not_match_with_confirmation: "Password does not match with confirmation." - i_am_an_organization: "I am an organization" - name_of_your_organization: "Name of your organization" - organization_name_is_required: "Organization name is required." - address_of_your_organization: "Address of your organization" - organization_address_is_required: "Organization address is required." - your_user_s_profile: "Your user's profile" - user_s_profile_is_required: "User's profile is required." - birth_date: "Birth date" - birth_date_is_required: "Birth date is required." - phone_number: "Phone number" - phone_number_is_required: "Phone number is required." - address: "Address" - address_is_required: "Address is required" - i_authorize_Fablab_users_registered_on_the_site_to_contact_me: "I agree to share my email address with registered users of the site" - i_accept_to_receive_information_from_the_fablab: "I accept to receive information from the FabLab" - i_ve_read_and_i_accept_: "I've read and I accept" - _the_fablab_policy: "the terms of use" - field_required: "Field required" - profile_custom_field_is_required: "{FEILD} is required" - user_supporting_documents_required: "Warning!
You have declared to be \"{GROUP}\", supporting documents may be requested." - unexpected_error_occurred: "An unexpected error occurred. Please try again later." - used_for_statistics: "This data will be used for statistical purposes" - used_for_invoicing: "This data will be used for billing purposes" - used_for_reservation: "This data will be used in case of change on one of your bookings" - used_for_profile: "This data will only be displayed on your profile" - public_profile: "You will have a public profile and other users will be able to associate you in their projects" - you_will_receive_confirmation_instructions_by_email_detailed: "If your e-mail address is valid, you will receive an email with instructions about how to confirm your account in a few minutes." + woman: "Kvinna" + gender_is_required: "Kön krävs." + your_first_name: "Ditt förnamn" + first_name_is_required: "Förnamn måste fyllas i." + your_surname: "Ditt efternamn" + surname_is_required: "Efternamn måste fyllas i." + your_pseudonym: "Din pseudonym" + pseudonym_is_required: "Pseudonym krävs." + your_email_address: "Din e-postadress" + email_is_required: "E-postadress måste anges." + your_password: "Lösenord" + password_is_required: "Lösenord krävs." + password_is_too_short: "Lösenordet är för kort (minst 12 tecken)" + password_is_too_weak: "Lösenordet är för svagt:" + password_is_too_weak_explanations: "minst 12 tecken, minst en stor bokstav, en liten bokstav, ett nummer och ett specialtecken" + type_your_password_again: "Ange ditt lösenord igen" + password_confirmation_is_required: "Ange lösenord igen." + password_does_not_match_with_confirmation: "Lösenorden stämmer inte överens." + i_am_an_organization: "Jag företräder en organisation" + name_of_your_organization: "Namnet på din organisation" + organization_name_is_required: "Organisationsnamn måste fyllas i." + address_of_your_organization: "Adress till din organisation" + organization_address_is_required: "Organisationsadress måste fyllas i." + your_user_s_profile: "Din användares profil" + user_s_profile_is_required: "Användarprofil måste fyllas i." + birth_date: "Födelsedatum" + birth_date_is_required: "Födelsedatum måste fyllas i." + phone_number: "Telefonnummer" + phone_number_is_required: "Telefonnummer måste fyllas i." + address: "Adress" + address_is_required: "Adress måste fyllas i" + i_authorize_Fablab_users_registered_on_the_site_to_contact_me: "Jag samtycker till att dela min e-postadress med registrerade medlemmar på denna sida" + i_accept_to_receive_information_from_the_fablab: "Jag accepterar att få information från FabLab" + i_ve_read_and_i_accept_: "Jag har läst och accepterat" + _the_fablab_policy: "användarvillkoren" + field_required: "Obligatoriskt fält" + profile_custom_field_is_required: "{FEILD} krävs" + user_supporting_documents_required: "Varning!
Du har förklarat att du är \"{GROUP}\", underlag kan komma att begäras in." + unexpected_error_occurred: "Ett oväntat fel inträffade. Var god försök senare." + used_for_statistics: "Dessa uppgifter kommer att användas för statistiska ändamål" + used_for_invoicing: "Dessa uppgifter kommer att användas för faktureringsändamål" + used_for_reservation: "Dessa uppgifter kommer att användas i händelse av ändring av dina bokningar" + used_for_profile: "Denna data kommer endast att visas på din profil" + public_profile: "Du kommer att ha en publik profil och andra användare kommer att kunna knyta dig till sina projekt" + you_will_receive_confirmation_instructions_by_email_detailed: "Om din e-postadress finns i vår databas får du inom ett par minuter ett e-postmeddelande med instruktioner för hur du bekräftar ditt konto." #password modification modal - change_your_password: "Change your password" - your_new_password: "Your new password" - your_password_was_successfully_changed: "Your password was successfully changed." + change_your_password: "Byt lösenord" + your_new_password: "Ditt nya lösenord" + your_password_was_successfully_changed: "Ditt lösenord har nu ändrats." #connection modal - connection: "Connection" - password_forgotten: "Forgotten password?" - confirm_my_account: "Confirm my e-mail" - not_registered_to_the_fablab: "Not yet registered?" - create_an_account: "Create an account" - wrong_email_or_password: "Wrong e-mail or password." - caps_lock_is_on: "Caps lock key is on." + connection: "Kontakter" + password_forgotten: "Glömt lösenordet?" + confirm_my_account: "Bekräfta e-postadress" + not_registered_to_the_fablab: "Ännu inte registrerad?" + create_an_account: "Skapa ett konto" + wrong_email_or_password: "Fel användarnamn eller lösenord." + caps_lock_is_on: "Caps lock är på." #confirmation modal - you_will_receive_confirmation_instructions_by_email: "You will receive confirmation instructions by email." + you_will_receive_confirmation_instructions_by_email: "Du kommer att få bekräftelse med instruktioner via e-post." #forgotten password modal - you_will_receive_in_a_moment_an_email_with_instructions_to_reset_your_password: "If your e-mail address is valid, you will receive in a moment an e-mail with instructions to reset your password." + you_will_receive_in_a_moment_an_email_with_instructions_to_reset_your_password: "Om din e-postadress är giltig kommer du strax att få ett e-postmeddelande med instruktioner för att återställa ditt lösenord." #Fab-manager's version version: "Version:" - upgrade_fabmanager: "Upgrade Fab-manager" - current_version: "You are currently using version {VERSION} of Fab-manager." - upgrade_to: "A new release is available. You can upgrade up to version {VERSION}." - read_more: "View the details of this release" - security_version_html: "Your current version is vulnerable!
A later version, currently available, includes security fixes. Upgrade as soon as possible!" - how_to: "How to upgrade?" + upgrade_fabmanager: "Uppgradera Fab-manager" + current_version: "Du använder för närvarande version {VERSION} av Fab-manager." + upgrade_to: "En ny utgåva är tillgänglig. Du kan uppgradera till version {VERSION}." + read_more: "Visa detaljerna i denna utgåva" + security_version_html: "Din nuvarande version är sårbar!
En senare version finns tillgänglig som inkluderar säkerhetsuppdateringar. Uppgradera så snart som möjligt!" + how_to: "Hur man uppgraderar?" #Notifications - and_NUMBER_other_notifications: "and {NUMBER, plural, =0{no other notifications} =1{one other notification} other{{NUMBER} other notifications}}..." + and_NUMBER_other_notifications: "och {NUMBER, plural, one {}=0{inga andra notifieringar} =1{ytterligare en notifiering} other{{NUMBER} andra notifieringar}}..." #about page about: - read_the_fablab_policy: "Terms of use" - read_the_fablab_s_general_terms_and_conditions: "Read the general terms and conditions" - your_fablab_s_contacts: "Contact us" - privacy_policy: "Privacy policy" + read_the_fablab_policy: "Användarvillkor" + read_the_fablab_s_general_terms_and_conditions: "Läs de allmänna villkoren" + your_fablab_s_contacts: "Kontakta oss" + privacy_policy: "Integritetspolicy" #'privacy policy' page privacy: - title: "Privacy policy" - dpo: "Data protection officer" - last_update: "Last update," + title: "Integritetspolicy" + dpo: "Dataskyddsombud" + last_update: "Senast uppdaterad" #home page home: - latest_documented_projects: "The latest documented projects" - follow_us: "Follow us" - latest_tweets: "The latest tweets" - latest_registered_members: "Latest registered members" - create_an_account: "Create an account" - discover_members: "Discover members" + latest_documented_projects: "De senaste dokumenterade projekten" + follow_us: "Följ oss" + latest_tweets: "De senaste tweetarna" + latest_registered_members: "Senast registrerade medlemmar" + create_an_account: "Skapa ett konto" + discover_members: "Upptäck medlemmar" #next events summary on the home page - fablab_s_next_events: "Next events" - every_events: "Every events" + fablab_s_next_events: "Nästa evenemang" + every_events: "Alla evenemang" event_card: - on_the_date: "On the {DATE}" - from_date_to_date: "From {START} to {END}" - from_time_to_time: "From {START} to {END}" - all_day: "All day" - still_available: "Available place(s): " - event_full: "Event full" - without_reservation: "Without reservation" - free_admission: "Free admission" - full_price: "Full price: " + on_the_date: "Den {DATE}" + from_date_to_date: "Från {START} till {END}" + from_time_to_time: "Från {START} till {END}" + all_day: "Hela dagen" + still_available: "Tillgängliga lokaler: " + event_full: "Evenemanget fullbokat" + without_reservation: "Utan bokning" + free_admission: "Fri entré" + full_price: "Ordinarie pris: " #projects gallery projects_list: - filter: Filter - the_fablab_projects: "The projects" - add_a_project: "Add a project" - network_search: "Fab-manager network" - tooltip_openlab_projects_switch: "The search over the whole network lets you search over the projects of every Fab-manager using this feature !" - openlab_search_not_available_at_the_moment: "Search over the whole network is not available at the moment. You still can search over the projects of this platform." - project_search_result_is_empty: "Sorry, we found no results matching your search criteria." - reset_all_filters: "Clear all" - keywords: "Keywords" - all_projects: "All projects" - my_projects: "My projects" - projects_to_whom_i_take_part_in: "Projects to whom I take part in" - all_machines: "All machines" - all_themes: "All themes" - all_materials: "All materials" - load_next_projects: "Load next projects" - rough_draft: "Rough draft" - filter_by_member: "Filter by member" - created_from: Created from - created_to: Created to - download_archive: Download + filter: Filtrera + the_fablab_projects: "Projekten" + add_a_project: "Lägg till projekt" + network_search: "Fab-manager nätverk" + tooltip_openlab_projects_switch: "Med en sökning i hela nätverket kan du söka över projekt i varje Fab-manager med denna funktion!" + openlab_search_not_available_at_the_moment: "Sökningar över hela nätverket är inte tillgängligt just nu. Du kan fortfarande söka över projekten i denna plattform." + project_search_result_is_empty: "Tyvärr hittade vi inga resultat som matchar dina sökkriterier." + reset_all_filters: "Radera Allt" + keywords: "Sökord" + all_projects: "Alla projekt" + my_projects: "Mina projekt" + projects_to_whom_i_take_part_in: "Projekt som jag deltar i" + all_machines: "All utrustning" + all_themes: "Alla teman" + all_materials: "Allt material" + load_next_projects: "Ladda nästa projekt" + rough_draft: "Grovt utkast" + filter_by_member: "Filtrera efter medlem" + created_from: Skapad fr. o. m + created_to: Skapad t. o. m + download_archive: Ladda ner status_filter: - all_statuses: "All statuses" - select_status: "Select a status" + all_statuses: "Alla statusar" + select_status: "Välj status" #details of a projet projects_show: - rough_draft: "Draft" - project_description: "Project description" - by_name: "By {NAME}" - step_N: "Step {INDEX}" - share_on_facebook: "Share on Facebook" - share_on_twitter: "Share on Twitter" - deleted_user: "Deleted user" - posted_on_: "Posted on" - CAD_file_to_download: "{COUNT, plural, =0{No CAD files} =1{CAD file to download} other{CAD files to download}}" - machines_and_materials: "Machines and materials" - collaborators: "Collaborators" - licence: "Licence" - confirmation_required: "Confirmation required" - report_an_abuse: "Report an abuse" - unauthorized_operation: "Unauthorized operation" - your_report_was_successful_thanks: "Your report was successful. Thank you." - an_error_occured_while_sending_your_report: "An error occurred while sending your report." - your_first_name: "Your first name" - your_first_name_is_required: "Your first name is required." - your_surname: "Your surname" - your_surname_is_required: "Your surname is required." - your_email_address: "Your email address" - your_email_address_is_required: "Your email address is required." - tell_us_why_this_looks_abusive: "Tell us why this looks abusive" - message_is_required: "Message is required." - report: "Report" - do_you_really_want_to_delete_this_project: "Do you really want to delete this project?" + rough_draft: "Utkast" + project_description: "Projektbeskrivning" + by_name: "Av {NAME}" + step_N: "Steg {INDEX}" + share_on_facebook: "Dela på Facebook" + share_on_twitter: "Dela på Twitter" + deleted_user: "Ta bort användare" + posted_on_: "Postat den" + CAD_file_to_download: "{COUNT, plural, one {}=0{Inga CAD-filer} =1{CAD-fil att ladda ner} other{CAD-filer att ladda ner}}" + machines_and_materials: "Utrustning och material" + collaborators: "Medverkande" + licence: "Licens" + confirmation_required: "Verifiering krävs" + report_an_abuse: "Anmäl missbruk" + unauthorized_operation: "Obehörig åtgärd" + your_report_was_successful_thanks: "Er anmälan lyckades, tack." + an_error_occured_while_sending_your_report: "Ett fel inträffade när din anmälan skulle skickas." + your_first_name: "Ditt förnamn" + your_first_name_is_required: "Förnamn måste fyllas i." + your_surname: "Ditt efternamn" + your_surname_is_required: "Efternamn måste fyllas i." + your_email_address: "Din e-postadress" + your_email_address_is_required: "E-postadress måste anges." + tell_us_why_this_looks_abusive: "Berätta varför detta ser kränkande ut" + message_is_required: "Ett meddelande krävs." + report: "Anmäl" + do_you_really_want_to_delete_this_project: "Vill du verkligen ta bort detta projekt?" status: "Status" - markdown_file: "Markdown file" + markdown_file: "Markdown-fil" #list of machines machines_list: - the_fablab_s_machines: "The machines" - add_a_machine: "Add a machine" - new_availability: "Open reservations" - book: "Book" - _or_the_: " or the " + the_fablab_s_machines: "Utrustningen" + add_a_machine: "Lägg till utrustning" + new_availability: "Öppna bokningar" + book: "Boka" + _or_the_: " eller " store_ad: - title: "Discover our store" - buy: "Check out products from members' projects along with consumable related to the different machines and tools of the workshop." - sell: "If you also want to sell your creations, please let us know." - link: "To the store" + title: "Upptäck vår butik" + buy: "Se produkter från medlemmarnas verksamheter samt förbrukningsmateriel relaterade till utrustning och verktyg i våra lokaler." + sell: "Om du också vill sälja dina produkter, vänligen meddela oss." + link: "Till butiken" machines_filters: - show_machines: "Show machines:" - status_enabled: "Enabled" - status_disabled: "Disabled" - status_all: "All" - filter_by_machine_category: "Filter by category:" - all_machines: "All machines" + show_machines: "Visa utrustning:" + status_enabled: "Aktiverad" + status_disabled: "Inaktiverad" + status_all: "Allt" + filter_by_machine_category: "Filtrera efter kategori:" + all_machines: "All utrustning" machine_card: - book: "Book" - consult: "Consult" + book: "Boka" + consult: "Fråga" #details of a machine machines_show: - book_this_machine: "Book this machine" - technical_specifications: "Technical specifications" - files_to_download: "Files to download" - projects_using_the_machine: "Projects using the machine" - _or_the_: " or the " - confirmation_required: "Confirmation required" - do_you_really_want_to_delete_this_machine: "Do you really want to delete this machine?" - unauthorized_operation: "Unauthorized operation" - the_machine_cant_be_deleted_because_it_is_already_reserved_by_some_users: "The machine can't be deleted because it's already reserved by some users." + book_this_machine: "Boka utrustning" + technical_specifications: "Tekniska specifikationer" + files_to_download: "Filer att ladda ner" + projects_using_the_machine: "Projekt som använder utrustningen" + _or_the_: " eller " + confirmation_required: "Verifiering krävs" + do_you_really_want_to_delete_this_machine: "Vill du verkligen ta bort den här utrustningen?" + unauthorized_operation: "Obehörig åtgärd" + the_machine_cant_be_deleted_because_it_is_already_reserved_by_some_users: "Utrustningen kan inte tas bort eftersom den redan är reserverad av andra användare." #list of trainings trainings_list: - book: "Book" - the_trainings: "The trainings" + book: "Boka" + the_trainings: "Utbildningarna" #details of a training training_show: - book_this_training: "Book this training" - do_you_really_want_to_delete_this_training: "Do you really want to delete this training?" - unauthorized_operation: "Unauthorized operation" - confirmation_required: "Confirmation required" - the_training_cant_be_deleted_because_it_is_already_reserved_by_some_users: "The training can't be deleted because it's already reserved by some users." + book_this_training: "Boka utbildningen" + do_you_really_want_to_delete_this_training: "Vill du verkligen ta bort den här utbildningen?" + unauthorized_operation: "Obehörig åtgärd" + confirmation_required: "Verifiering krävs" + the_training_cant_be_deleted_because_it_is_already_reserved_by_some_users: "Utbildningen kan inte tas bort eftersom den redan är reserverad av andra användare." plan_card: - AMOUNT_per_month: "{AMOUNT} / month" - i_subscribe_online: "I subscribe online" - more_information: "More information" - i_choose_that_plan: "I choose that plan" - i_already_subscribed: "I already subscribed" + AMOUNT_per_month: "{AMOUNT} / månad" + i_subscribe_online: "Jag prenumererar online" + more_information: "Mer information" + i_choose_that_plan: "Jag väljer betalningsplanen" + i_already_subscribed: "Redan prenumerant" #summary of the subscriptions plans: - subscriptions: "Subscriptions" - your_subscription_expires_on_the_DATE: "Your subscription expires on the {DATE}" - no_plans: "No plans are available for your group" - my_group: "My group" - his_group: "User's group" - he_wants_to_change_group: "Change group" - change_my_group: "Validate group change" - summary: "Summary" - your_subscription_has_expired_on_the_DATE: "Your subscription has expired on the {DATE}" - subscription_price: "Subscription price" - you_ve_just_payed_the_subscription_html: "You've just paid the subscription:" - thank_you_your_subscription_is_successful: "Thank you. Your subscription is successful!" - your_invoice_will_be_available_soon_from_your_dashboard: "Your invoice will be available soon from your dashboard" - your_group_was_successfully_changed: "Your group was successfully changed." - the_user_s_group_was_successfully_changed: "The user's group was successfully changed." - an_error_prevented_your_group_from_being_changed: "An error prevented your group from being changed." - an_error_prevented_to_change_the_user_s_group: "An error prevented to change the user's group." + subscriptions: "Prenumerationer" + your_subscription_expires_on_the_DATE: "Ditt abonnemang löper ut den {DATE}" + no_plans: "Inga betalningsplaner finns tillgängliga för din grupp" + my_group: "Min grupp" + his_group: "Användargrupp" + he_wants_to_change_group: "Ändra grupp" + change_my_group: "Validera gruppändring" + summary: "Sammanfattning" + your_subscription_has_expired_on_the_DATE: "Ditt abonnemang löper ut den {DATE}" + subscription_price: "Prenumerationspris" + you_ve_just_payed_the_subscription_html: "Du har betalat prenumerationen:" + thank_you_your_subscription_is_successful: "Tack. Din prenumeration är genomförd!" + your_invoice_will_be_available_soon_from_your_dashboard: "Din faktura kommer att finnas tillgänglig från din översiktsvy inom kort" + your_group_was_successfully_changed: "Din grupp har ändrats." + the_user_s_group_was_successfully_changed: "Användarens grupp har ändrats." + an_error_prevented_your_group_from_being_changed: "Ett fel förhindrade att din grupp ändrades." + an_error_prevented_to_change_the_user_s_group: "Ett fel förhindrade att ändra användarens grupp." plans_filter: - i_am: "I am" - select_group: "select a group" - i_want_duration: "I want to subscribe for" - all_durations: "All durations" - select_duration: "select a duration" + i_am: "Jag är" + select_group: "välj en grupp" + i_want_duration: "Jag vill prenumerera på" + all_durations: "Alla perioder" + select_duration: "välj period" #Fablab's events list events_list: - the_fablab_s_events: "The events" - all_categories: "All categories" - for_all: "For all" - sold_out: "Sold Out" - cancelled: "Cancelled" - free_admission: "Free admission" - still_available: "available place(s)" - without_reservation: "Without reservation" - add_an_event: "Add an event" - load_the_next_events: "Load the next events..." - full_price_: "Full price:" - to_date: "to" #e.g. from 01/01 to 01/05 - all_themes: "All themes" + the_fablab_s_events: "Evenemangen" + all_categories: "Alla kategorier" + for_all: "För alla" + sold_out: "Slutsåld" + cancelled: "Inställt" + free_admission: "Fri entré" + still_available: "tillgängliga lokaler" + without_reservation: "Utan bokning" + add_an_event: "Lägg till ett evenemang" + load_the_next_events: "Ladda nästa evenemang..." + full_price_: "Ordinarie pris:" + to_date: "till" #e.g. from 01/01 to 01/05 + all_themes: "Alla teman" #details and booking of an event events_show: - event_description: "Event description" - downloadable_documents: "Downloadable documents" - information_and_booking: "Information and booking" + event_description: "Evenmangsbeskrivning" + downloadable_documents: "Nedladdningsbara dokument" + information_and_booking: "Information och bokning" event_type: - family: "Event reserved for members" - nominative: "Nominative event" - dates: "Dates" - beginning: "Beginning:" - ending: "Ending:" - opening_hours: "Opening hours:" - all_day: "All day" - from_time: "From" #e.g. from 18:00 to 21:00 - to_time: "to" #e.g. from 18:00 to 21:00 - full_price_: "Full price:" - tickets_still_availables: "Tickets still available:" - sold_out: "Sold out." - without_reservation: "Without reservation" - cancelled: "Cancelled" - ticket: "{NUMBER, plural, one{ticket} other{tickets}}" - make_a_gift_of_this_reservation: "Make a gift of this reservation" - thank_you_your_payment_has_been_successfully_registered: "Thank you. Your payment has been successfully registered!" - thank_you_your_pre_registration_has_been_successfully_saved: "Thank you. Your pre-registration has been successfully saved!" - you_can_find_your_reservation_s_details_on_your_: "You can find your reservation's details on your" - informed_by_email_your_pre_registration: "You will be kept informed by email of the progress made regarding your pre-registration." - dashboard: "dashboard" - you_booked_DATE: "You booked ({DATE}):" - you_pre_booked_DATE: "Your pre-registration ({DATE}):" - canceled_reservation_SEATS: "Reservation canceled ({SEATS} seats)" - book: "Book" - confirm_and_pay: "Confirm and pay" - confirm_payment_of_html: "{ROLE, select, admin{Cash} other{Pay}}: {AMOUNT}" #(contexte : validate a payment of $20,00) - online_payment_disabled: "Payment by credit card is not available. Please contact us directly." - please_select_a_member_first: "Please select a member first" - change_the_reservation: "Change the reservation" - you_can_shift_this_reservation_on_the_following_slots: "You can shift this reservation on the following slots:" - confirmation_required: "Confirmation required" - do_you_really_want_to_delete_this_event: "Do you really want to delete this event?" - all_reservations_for_this_event_will_be_canceled: All reservations for this event will be canceled. - delete_recurring_event: "You're about to delete a periodic event. What do you want to do?" - delete_this_event: "Only this event" - delete_this_and_next: "This event and the following" - delete_all: "All events" - event_successfully_deleted: "Event successfully deleted." - events_deleted: "The event, and {COUNT, plural, =1{one other} other{{COUNT} others}}, have been deleted" - unable_to_delete_the_event: "Unable to delete the event, it may be booked by a member" - events_not_deleted: "On {TOTAL} events, {COUNT, plural, =1{one was not deleted} other{{COUNT} were not deleted}}. Some reservations may exists on {COUNT, plural, =1{it} other{them}}." - cancel_the_reservation: "Cancel the reservation" - do_you_really_want_to_cancel_this_reservation_this_apply_to_all_booked_tickets: "Do you really want to cancel this reservation? This apply to ALL booked tickets." - reservation_was_successfully_cancelled: "Reservation was successfully cancelled." - cancellation_failed: "Cancellation failed." - event_is_over: "The event is over." - thanks_for_coming: "Thanks for coming!" - view_event_list: "View events to come" - share_on_facebook: "Share on Facebook" - share_on_twitter: "Share on Twitter" - last_name_and_first_name: "Last name and first name" - pre_book: "Pre-book" - pre_registration_end_date: "Deadline for pre-registration" - pre_registration: "Pre-registration" + family: "Evenemang reserverat för medlemmar" + nominative: "Personligt evenemang" + dates: "Datum" + beginning: "Början:" + ending: "Slutar:" + opening_hours: "Öppettider:" + all_day: "Heldag" + from_time: "Från" #e.g. from 18:00 to 21:00 + to_time: "till" #e.g. from 18:00 to 21:00 + full_price_: "Ordinarie pris:" + tickets_still_availables: "Biljetter finns kvar:" + sold_out: "Slutsåld." + without_reservation: "Utan bokning" + cancelled: "Inställt" + ticket: "{NUMBER, plural, one{biljett} other{biljetter}}" + make_a_gift_of_this_reservation: "Ge bort denna bokning som gåva" + thank_you_your_payment_has_been_successfully_registered: "Tack. Din betalning har registrerats!" + thank_you_your_pre_registration_has_been_successfully_saved: "Tack. Din föranmälan har sparats!" + you_can_find_your_reservation_s_details_on_your_: "Du kan hitta dina bokningsuppgifter på din" + informed_by_email_your_pre_registration: "Du kommer att hållas informerad via e-post om de händelser som gäller din föranmälan." + dashboard: "översikt" + you_booked_DATE: "Du bokade ({DATE}):" + you_pre_booked_DATE: "Din föranmälan ({DATE}):" + canceled_reservation_SEATS: "Bokning avbokad ({SEATS} platser)" + book: "Boka" + confirm_and_pay: "Bekräfta och betala" + confirm_payment_of_html: "{ROLE, select, admin{Kontant} other{Betala}}: {AMOUNT}" #(contexte : validate a payment of $20,00) + online_payment_disabled: "Betalning med kreditkort är inte tillgänglig. Vänligen kontakta oss direkt." + please_select_a_member_first: "Välj en medlem först" + change_the_reservation: "Avbryt bokningen" + you_can_shift_this_reservation_on_the_following_slots: "Du kan flytta denna bokning till följande tillfällen:" + confirmation_required: "Verifiering krävs" + do_you_really_want_to_delete_this_event: "Vill du radera detta evenemang?" + all_reservations_for_this_event_will_be_canceled: Alla bokningar av detta evenemang kommer att raderas. + delete_recurring_event: "Du håller på att ta bort en återkommande händelse. Vad vill du göra?" + delete_this_event: "Bara detta evenemang" + delete_this_and_next: "Detta evenemang samt framtida" + delete_all: "Alla evenemang" + event_successfully_deleted: "Evenemanget är raderat." + events_deleted: "Evenemanget och {COUNT, plural, one {}=1{ett annat} other{{COUNT} alla andra}}har tagits bort" + unable_to_delete_the_event: "Det går inte att ta bort händelsen, den kan ha bokats av en medlem" + events_not_deleted: "Av {TOTAL} evenemang {COUNT, plural, one {}=1{togs ett inte bort} other{togs {COUNT} inte bort}}. Vissa reservationer kan finnas på {COUNT, plural, one {}=1{det} other{dem}}." + cancel_the_reservation: "Avbryt bokningen" + do_you_really_want_to_cancel_this_reservation_this_apply_to_all_booked_tickets: "Vill du verkligen avboka denna bokning? Detta gäller för ALLA bokade biljetter." + reservation_was_successfully_cancelled: "Reservationen har avbrutits." + cancellation_failed: "Avbokning misslyckades." + event_is_over: "Evenemanget är över." + thanks_for_coming: "Tack för ditt besök!" + view_event_list: "Visa kommande evenemang" + share_on_facebook: "Dela på Facebook" + share_on_twitter: "Dela på Twitter" + last_name_and_first_name: "För- och efternamn" + pre_book: "Förboka" + pre_registration_end_date: "Deadline för förbokning" + pre_registration: "Föranmälan" #public calendar calendar: - calendar: "Calendar" - show_unavailables: "Show unavailable slots" - filter_calendar: "Filter calendar" - trainings: "Trainings" - machines: "Machines" - spaces: "Spaces" - events: "Events" - externals: "Other calendars" - choose_a_machine: "Choose a machine" - cancel: "Cancel" + calendar: "Kalender" + show_unavailables: "Visa obokbara platser" + filter_calendar: "Filtrera kalender" + trainings: "Utbildningar" + machines: "Utrustning" + spaces: "Lokaler" + events: "Evenemang" + externals: "Andra kalendrar" + choose_a_machine: "Välj utrustning" + cancel: "Avbryt" #list of spaces spaces_list: - the_spaces: "The spaces" - new_availability: "Open reservations" - add_a_space: "Add a space" - status_enabled: "Enabled" - status_disabled: "Disabled" - status_all: "All" - book: "Book" + the_spaces: "Lokalerna" + new_availability: "Öppna bokningar" + add_a_space: "Lägg till lokal" + status_enabled: "Aktiverad" + status_disabled: "Inaktiverad" + status_all: "Alla" + book: "Boka" #display the details of a space space_show: - book_this_space: "Book this space" - unauthorized_operation: "Unauthorized operation" - confirmation_required: "Confirmation required" - do_you_really_want_to_delete_this_space: "Do you really want to delete this space?" - the_space_cant_be_deleted_because_it_is_already_reserved_by_some_users: "Unable to delete this space, because it is already reserved by some users." - characteristics: "Characteristics" - files_to_download: "Files to download" - projects_using_the_space: "Projects using the space" + book_this_space: "Boka utrustning" + unauthorized_operation: "Obehörig åtgärd" + confirmation_required: "Verifiering krävs" + do_you_really_want_to_delete_this_space: "Vill du verkligen ta bort denna lokal?" + the_space_cant_be_deleted_because_it_is_already_reserved_by_some_users: "Det går inte att ta bort denna lokal, eftersom den redan är reserverad av en användare." + characteristics: "Egenskaper" + files_to_download: "Filer att ladda ner" + projects_using_the_space: "Projekt som använder lokalen" #public store store: - fablab_store: "Store" - unexpected_error_occurred: "An unexpected error occurred. Please try again later." - add_to_cart_success: "Product added to the cart." + fablab_store: "Butik" + unexpected_error_occurred: "Ett oväntat fel inträffade. Var god försök senare." + add_to_cart_success: "Produkten har lagts till i varukorgen." products: - all_products: "All the products" - filter: "Filter" - filter_clear: "Clear all" - filter_apply: "Apply" - filter_categories: "Categories" - filter_machines: "By machines" - filter_keywords_reference: "By keywords or reference" - in_stock_only: "Available products only" + all_products: "Alla produkter" + filter: "Filtrera" + filter_clear: "Rensa allt" + filter_apply: "Verkställ" + filter_categories: "Kategorier" + filter_machines: "Utrustningen" + filter_keywords_reference: "Med sökord eller referens" + in_stock_only: "Endast tillgängliga produkter" sort: - name_az: "A-Z" - name_za: "Z-A" - price_low: "Price: low to high" - price_high: "Price: high to low" + name_az: "A-Ö" + name_za: "Ö-A" + price_low: "Pris: lågt till högt" + price_high: "Högt till lågt" store_product: ref: "ref: {REF}" - add_to_cart_success: "Product added to the cart." - unexpected_error_occurred: "An unexpected error occurred. Please try again later." - show_more: "Display more" - show_less: "Display less" - documentation: "Documentation" - minimum_purchase: "Minimum purchase: " - add_to_cart: "Add to cart" - stock_limit: "You have reached the current stock limit" + add_to_cart_success: "Produkten har lagts till i varukorgen." + unexpected_error_occurred: "Ett oväntat fel inträffade. Var god försök senare." + show_more: "Visa mer" + show_less: "Visa mindre" + documentation: "Dokumentation" + minimum_purchase: "Minsta köp: " + add_to_cart: "Lägg till I varukorgen" + stock_limit: "Du har nått den aktuella lagergränsen" stock_status: - available: "Available" - limited_stock: "Limited stock" - out_of_stock: "Out of stock" + available: "Tillgänglig" + limited_stock: "Begränsat lager" + out_of_stock: "Tillfälligt slut" store_product_item: - minimum_purchase: "Minimum purchase: " - add: "Add" - add_to_cart: "Add to cart" - stock_limit: "You have reached the current stock limit" + minimum_purchase: "Minsta köp: " + add: "Lägg till" + add_to_cart: "Lägg till i varukorgen" + stock_limit: "Du har nått den aktuella lagergränsen" product_price: - per_unit: "/ unit" - free: "Free" + per_unit: "/ enhet" + free: "Gratis" cart: - my_cart: "My Cart" + my_cart: "Min varukorg" cart_button: - my_cart: "My Cart" + my_cart: "Min varukorg" store_cart: - checkout: "Checkout" - cart_is_empty: "Your cart is empty" - pickup: "Pickup your products" - checkout_header: "Total amount for your cart" - checkout_products_COUNT: "Your cart contains {COUNT} {COUNT, plural, =1{product} other{products}}" - checkout_products_total: "Products total" - checkout_gift_total: "Discount total" - checkout_coupon: "Coupon" - checkout_total: "Cart total" - checkout_error: "An unexpected error occurred. Please contact the administrator." - checkout_success: "Purchase confirmed. Thanks!" - select_user: "Please select a user before continuing." + checkout: "Kassa" + cart_is_empty: "Din varukorg är tom" + pickup: "Hämta dina produkter" + checkout_header: "Totalt belopp för din varukorg" + checkout_products_COUNT: "Din varukorg innehåller {COUNT} {COUNT, plural, one {}=1{produkt} other{produkter}}" + checkout_products_total: "Produkter totalt" + checkout_gift_total: "Rabatt totalt" + checkout_coupon: "Rabattkupong" + checkout_total: "Totalt kundvagn" + checkout_error: "Oväntat fel uppstod. Vänligen kontakta systemadministratören." + checkout_success: "Köp bekräftat. Tack!" + select_user: "Välj en användare innan du fortsätter." abstract_item: - offer_product: "Offer the product" - total: "Total" + offer_product: "Erbjud produkten" + total: "Totalt" errors: - unauthorized_offering_product: "You can't offer anything to yourself" + unauthorized_offering_product: "Du kan inte erbjuda något till dig själv" cart_order_product: reference_short: "ref:" - minimum_purchase: "Minimum purchase: " - stock_limit: "You have reached the current stock limit" - unit: "Unit" - update_item: "Update" + minimum_purchase: "Minsta köp: " + stock_limit: "Du har nått den aktuella lagergränsen" + unit: "Enhet" + update_item: "Uppdatera" errors: - product_not_found: "This product is no longer available, please remove it from your cart." - out_of_stock: "This product is out of stock, please remove it from your cart." - stock_limit_QUANTITY: "Only {QUANTITY} {QUANTITY, plural, =1{unit} other{units}} left in stock, please adjust the quantity of items." - quantity_min_QUANTITY: "Minimum number of product was changed to {QUANTITY}, please adjust the quantity of items." - price_changed_PRICE: "The product price was modified to {PRICE}" + product_not_found: "Denna produkt är inte längre tillgänglig, vänligen ta bort den från din varukorg." + out_of_stock: "Denna produkt är slut i lager, vänligen ta bort den från din varukorg." + stock_limit_QUANTITY: "Endast {QUANTITY} {QUANTITY, plural, one {}=1{enhet} other{enheter}} kvar i lager, vänligen justera antalet objekt." + quantity_min_QUANTITY: "Minsta antal av produkten ändrades till {QUANTITY}, vänligen justera antalet objekt." + price_changed_PRICE: "Produktens pris har ändrats till {PRICE}" cart_order_reservation: - reservation: "Reservation" - offer_reservation: "Offer the reservation" + reservation: "Bokning" + offer_reservation: "Erbjud bokningen" slot: "{DATE}: {START} - {END}" - offered: "offered" + offered: "erbjuds" orders_dashboard: - heading: "My orders" + heading: "Mina beställningar" sort: - newest: "Newest first" - oldest: "Oldest first" + newest: "Senaste först" + oldest: "Äldsta först" member_select: - select_a_member: "Select a member" - start_typing: "Start typing..." + select_a_member: "Välj en medlem" + start_typing: "Börja skriva..." children_dashboard: - heading: "Children" - member_heading: "My Children" - add_child: "Add a child" + heading: "Barn" + member_heading: "Mina barn" + add_child: "Lägg till barn" child_modal: - edit_child: "Edit child" - new_child: "New child" + edit_child: "Redigera barn" + new_child: "Nytt barn" child_form: - child_form_info: "Only children under 18 years old can be added to your Family account. Supporting documents may be requested to validate your child's account and allow you to register them for events." - first_name: "First name" - last_name: "Last name" - birthday: "Birthday" - email: "Email" - phone: "Phone" - save: "Save" - supporting_documents: "Supporting documents" - to_complete: "To complete" - refuse_documents_info: "You can refuse a selection of documents by clicking on the following button." - refuse_documents: "Refuse documents" + child_form_info: "Endast barn under 18 år kan läggas till i ditt familjekonto. Underlag kan begäras för att validera ditt barns konto och tillåta dig att registrera dem för evenemang." + first_name: "Förnamn" + last_name: "Efternamn" + birthday: "Födelsedatum" + email: "E-post" + phone: "Telefon" + save: "Spara" + supporting_documents: "Underlag" + to_complete: "Att slutföra" + refuse_documents_info: "Du kan avböja ett urval av dokument genom att klicka på följande knapp." + refuse_documents: "Avböj dokument" child_item: - first_name: "Child first name" - last_name: "Child last name" - birthday: "Birthday" - deleted: "The child has been deleted." - unable_to_delete: "Unable to delete the child." + first_name: "Barns förnamn" + last_name: "Barns efternamn" + birthday: "Födelsedatum" + deleted: "Barnet har tagits bort." + unable_to_delete: "Det går inte att ta bort barnet." delete_child_modal: - confirmation_required: "Confirmation required" - confirm: "Confirm" - confirm_delete_child: "Do you really want to remove this child?" + confirmation_required: "Verifiering krävs" + confirm: "Bekräfta" + confirm_delete_child: "Vill du verkligen ta bort detta barn?" tour: conclusion: - title: "Thank you for your attention" - content: "

If you want to restart this contextual help, press F1 at any time or click on « ? Help » from the user's menu.

If you need additional help, you can check the user guide (only in French for now).

The Fab-manager's team also provides personalized support (help with getting started, help with installation, customization, etc.), contact-us for more info.

" + title: "Tack för er uppmärksamhet" + content: "

Om du vill starta om denna kontextuella hjälp, tryck på F1 när som helst eller klicka på « ? Hjälp » från användarens meny.

Om du behöver ytterligare hjälp kan du kolla i användarhandboken (endast på franska just nu).

Fab-managers team ger även personlig support (hjälp med att komma igång, hjälp med installation, anpassning etc. , Kontakta oss för mer information.

" welcome: welcome: - title: "Welcome to Fab-manager" - content: "To help you get started with the application, we are going to take a quick tour of the features." + title: "Välkommen till Fab-manager" + content: "För att hjälpa dig komma igång med systemet, kommer vi att ta en snabb rundtur bland funktionerna." home: - title: "Home page" - content: "Clicking here will take you back to the home page where you are currently." + title: "Startsida" + content: "Klicka här kommer att ta dig tillbaka till sidan där du är för närvarande." machines: - title: "Machines" - content: "

This page will allow you to consult the list of all machines and reserve a slot on behalf of a member.

A machine can be, for example, a 3D printer.

Members can also access this page and reserve a machine themselves, if credit card payment is enabled, or if some prices are equal to 0.

" + title: "Utrustning" + content: "

Den här sidan låter dig konsultera listan över all utrustning och reservera en lokal åt en medlem.

Utrustning kan till exempel vara en TV.

Medlemmar kan också komma åt denna sida och reservera utrustning själva, om kreditkortsbetalning är aktiverad, eller om vissa priser är lika med 0.

" trainings: - title: "Trainings" - content: "

This page will allow you to consult the list of all training sessions and to register a member for a training session.

Trainings can be set as prerequisites before allowing reservation of certain machines.

Members can also access this page and register for a training session themselves, if credit card payment is enabled, or if some prices are equal to 0.

" + title: "Utbildningar" + content: "

Den här sidan låter dig konsultera listan över all utrustning och reservera en lokal åt en medlem.

Utrustning kan till exempel vara en Tv.

Medlemmar kan också komma åt denna sida och reservera utrustning själva, om kreditkortsbetalning är aktiverad, eller om vissa priser är lika med 0.

" spaces: - title: "Spaces" - content: "

This page will allow you to consult the list of all available spaces and to reserve a place on a slot, on behalf of a member.

A space can be, for example, a woodshop or a meeting room.

Their particularity is that they can be booked by several people at the same time.

Members can also access this page and reserve a machine themselves, if credit card payment is enabled, or if some prices are equal to 0.

" + title: "Lokaler" + content: "

Den här sidan låter dig konsultera listan över all utrustning och reservera en lokal åt en medlem.

Utrustning kan till exempel vara en TV.

Medlemmar kan också komma åt denna sida och reservera utrustning själva, om kreditkortsbetalning är aktiverad, eller om vissa priser är lika med 0.

" events: - title: "Events" - content: "

An open house evening or an internship to make your desk lamp? It's over here!

Events can be free or paid (with different prices), with or without reservation.

Again, members can access this page and book themselves places for free events, or paid events if credit card payment is enabled.

" + title: "Evenemang" + content: "

Öppet hus eller föreningsmöt? Kolla här!

Evenemang kan vara gratis eller med betalning, med eller utan bokning.

Medlemmar kan komma åt denna sida och boka plats för gratis evenemang, eller betalda evenemang om kreditkortsbetalning är aktiverad.

" calendar: title: "Agenda" - content: "Visualize at a glance everything that is scheduled for the next coming weeks (events, training, machines available, etc.)." + content: "Presentera i korthet allt som är planerat till de kommande veckorna (evenemang, kurser, tillgänglig utrustning m. m.)." projects: - title: "Projects" - content: "

Document and share all your creations with the community.

If you use OpenLab, you will also be able to consult the projects of the entire Fab-manager network. Contact-us to get your access, it's free!

" + title: "Projekt" + content: "

Dokumentera och dela alla dina projekt med föreningen.

Om du använder OpenLab, kommer du också att kunna besöka projekten i hela Fab-Manager-nätverket. Contact-us för att få din tillgång, det är gratis!

" plans: - title: "Subscriptions" - content: "Subscriptions provide a way to segment your prices and provide benefits to regular users." + title: "Prenumerationer" + content: "Prenumerationer ger ett sätt att segmentera dina priser och ge fördelar för medlemmar." admin: - title: "{ROLE} section" - content: "

All of the elements below are only accessible to administrators and managers. They allow you to manage and configure Fab-manager.

At the end of this visit, click on one of them to find out more.

" + title: "{ROLE} sektion" + content: "

Alla element nedan är endast tillgängliga för administratörer. De tillåter dig att hantera och konfigurera Fab-manager.

I slutet av detta besök, klicka på ett av dem för att ta reda på mer.

" about: - title: "About" - content: "A page that you can fully customize, to present your activity and your structure." + title: "Om" + content: "En sida som du kan anpassa helt och hållet, för att presentera din verksamhet och din struktur." notifications: - title: "Notifications center" - content: "

Every time something important happens (reservations, creation of accounts, activity of your members, etc.), you will be notified here.

Your members also receive notifications there.

" + title: "Notifieringscenter" + content: "

Varje gång något viktigt händer (reservationer, skapande av konton, aktivitet från dina medlemmar, etc)., du kommer att meddelas här.

Dina medlemmar får också meddelanden där.

" profile: - title: "User's menu" - content: "

Find your personal information here as well as all your activity on Fab-manager.

This space is also available for all your members.

" + title: "Användarens meny" + content: "

Hitta din personliga information här samt all din aktivitet på Fab-manager.

Detta utrymme är också tillgängligt för alla dina medlemmar.

" news: - title: "News" - content: "

This space allows you to display the latest news from your structure.

You can easily change its content from « Customization », « Home page ».

" + title: "Nyheter" + content: "

Detta utrymme låter dig visa de senaste nyheterna från din verksamhet.

Du kan enkelt ändra dess innehåll från « Anpassning », « Hemsida ».

" last_projects: - title: "Last projects" - content: "

This carousel scrolls through the latest projects documented by your members.

" + title: "Senaste projekten" + content: "

Detta bildspel rullar igenom de senaste projekten som dokumenterats av dina medlemmar.

" last_tweet: - title: "Last tweet" - content: "

The last tweet of your Tweeter feed can be shown here.

Configure it from « Customization », « Home page ».

" + title: "Senaste tweet" + content: "

Den sista tweeten i ditt Twitter-flöde kan visas här.

Konfigurera det från « Anpassning », « Startsida ».

" last_members: - title: "Last members" - content: "The last registered members who have validated their address and agreed to be contacted will be shown here." + title: "Senaste medlemmar" + content: "De senast registrerade medlemmar som har bekräftat sin adress och godkänt att bli kontaktade kommer att visas här." next_events: - title: "Upcoming events" - content: "The next three scheduled events are displayed in this space." + title: "Kommande evenemang" + content: "De kommande tre schemalagda evenemangen visas i detta utrymme." customize: - title: "Customize the home page" - content: "

This page can be fully personalized.

You can contact-us to make a tailored customization of the home page.

" + title: "Anpassa startsidan" + content: "

Denna sida kan vara helt personlig.

Du kan kontakta oss för att göra en skräddarsydd anpassning av startsidan.

" version: - title: "Application version" - content: "Hover your cursor over this icon to find out the version of Fab-manager. If you are not up to date, this will be reported here and you'll be able to get details by clicking on it." + title: "Programversion" + content: "Håll muspekaren över denna ikon för att ta reda på versionen av Fab-manager. Om du inte är uppdaterad, kommer detta att rapporteras här och du kommer att kunna få information genom att klicka på den." machines: welcome: - title: "Machines" - content: "

Machines are the tools available for your users. You must create here the machines which can then be reserved by the members.

You can also create entries for non-bookable or free access machines, then you just need to not associate availability slots with them.

" + title: "Utrustning" + content: "

Utrustning är de maskiner och verktyg som finns tillgängliga för dina användare. Här måste du skapa utrustning som sedan kan reserveras av medlemmarna.

Du kan också skapa poster för icke-bokningsbar eller gratis tillgänglig utrustning, då du behöver bara inte associera bokningsbakara tider med dem.

" welcome_manager: - title: "Machines" - content: "Machines are the tools available for the users to reserve." + title: "Utrustning" + content: "Utrustning är de maskiner och verktyg som finns tillgängliga för användarna att reservera." view: - title: "View" - content: "To modify or delete a machine, click here first. You will not be able to delete a machine that has already been associated with availability slots, but you can deactivate it." + title: "Visa" + content: "För att ändra eller ta bort utrustning, klicka här först. Du kommer inte att kunna ta bort utrustning som redan har förknippats med bokningsbara tider, men du kan inaktivera den." reserve: - title: "Reserve" - content: "Click here to access an agenda showing free slots. This will let you book this machine for an user and manage existing reservations." + title: "Reservera" + content: "Klicka här för att se en kalender som visar bokningsbara tider. Detta låter dig boka denna utrustning och hantera befintliga bokningar." spaces: welcome: - title: "Spaces" - content: "

Spaces are places available for your users. For example, a meeting room or a woodshop. You must create here the spaces which can then be reserved by members.

The specificity of the spaces is that they can be reserved by several users at the same time.

" + title: "Lokaler" + content: "

Lokaler är tillgängliga för dina användare. Till exempel ett mötesrum eller ett kök. Här kan du skapa de lokaler som sedan kan reserveras av medlemmar.

Lokalerna kan reserveras av flera användare samtidigt.

" welcome_manager: - title: "Spaces" - content: "

Spaces are places available to users, by reservation. For example, a meeting room or a woodshop.

The specificity of the spaces is that they can be reserved by several users at the same time.

" + title: "Lokaler" + content: "

Lokaler är tillgängliga för dina användare. Till exempel ett mötesrum eller ett kök. Här kan du skapa de lokaler som sedan kan reserveras av medlemmar.

Lokalerna kan reserveras av flera användare samtidigt.

" view: - title: "View" - content: "To modify or delete a space, click here first. You will not be able to delete a space that has already been associated with availability slots, but you can deactivate it." + title: "Visa" + content: "För att ändra eller ta bort en lokal, klicka här först. Du kommer inte att kunna ta bort en lokal som redan har förknippats med bokningsbara tider, men du kan inaktivera den." reserve: - title: "Reserve" - content: "Click here to access an agenda showing free slots. This will let you book this space for an user and manage existing reservations." + title: "Reservera" + content: "Klicka här för att se en kalender som visar bokningsbara tider. Detta låter dig boka denna lokal och hantera befintliga bokningar." diff --git a/config/locales/app.shared.sv.yml b/config/locales/app.shared.sv.yml index 16f56c173..f2cf9de79 100644 --- a/config/locales/app.shared.sv.yml +++ b/config/locales/app.shared.sv.yml @@ -3,553 +3,553 @@ sv: shared: #translations of common buttons buttons: - confirm_changes: "Confirm changes" - consult: "Consult" - edit: "Edit" - change: "Change" - delete: "Delete" - browse: "Browse" - cancel: "Cancel" - close: "Close" - clear: "Clear" - today: "Today" - confirm: "Confirm" - save: "Save" - "yes": "Yes" - "no": "No" - apply: "Apply" + confirm_changes: "Bekräfta ändringar" + consult: "Fråga" + edit: "Redigera" + change: "Ändra" + delete: "Ta bort" + browse: "Bläddra" + cancel: "Avbryt" + close: "Avsluta" + clear: "Rensa" + today: "Idag" + confirm: "Bekräfta" + save: "Spara" + "yes": "Ja" + "no": "Nej" + apply: "Verkställ" messages: - you_will_lose_any_unsaved_modification_if_you_quit_this_page: "You will lose any unsaved modification if you quit this page" - you_will_lose_any_unsaved_modification_if_you_reload_this_page: "You will lose any unsaved modification if you reload this page" - payment_card_declined: "Your card was declined." + you_will_lose_any_unsaved_modification_if_you_quit_this_page: "Du kommer att förlora alla osparade ändringar om du avslutar denna sida" + you_will_lose_any_unsaved_modification_if_you_reload_this_page: "Du kommer att förlora alla osparade ändringar om du laddar om denna sida" + payment_card_declined: "Ditt kort nekades." change_group: - title: "{OPERATOR, select, self{My group} other{User's group}}" - change: "Change {OPERATOR, select, self{my} other{his}} group" - cancel: "Cancel" - validate: "Validate group change" - success: "Group successfully changed" + title: "{OPERATOR, select, self{Min grupp} other{Användargruppen}}" + change: "Ändra {OPERATOR, select, self{min} other{hans/hennes}} grupp" + cancel: "Avbryt" + validate: "Validera gruppändring" + success: "Gruppen har skapats" stripe_form: - payment_card_error: "A problem occurred with your payment card:" + payment_card_error: "Ett problem uppstod med ditt betalkort:" #text editor text_editor: fab_text_editor: - text_placeholder: "Type something…" + text_placeholder: "Skriv någonting…" menu_bar: - link_placeholder: "Paste link…" - url_placeholder: "Paste url…" - new_tab: "Open in a new tab" - add_link: "Insert a link" - add_video: "Embed a video" - add_image: "Insert an image" + link_placeholder: "Klistra in länk…" + url_placeholder: "Klistra in url…" + new_tab: "Öppna i en ny flik" + add_link: "Infoga länk" + add_video: "Bädda in en video" + add_image: "Infoga en bild" #modal dialog fab_modal: - close: "Close" + close: "Avsluta" fab_socials: - follow_us: "Follow us" - networks_update_success: "Social networks update successful" - networks_update_error: "Problem trying to update social networks" - url_placeholder: "Paste url…" - save: "Save" - website_invalid: "The website address is not a valid URL" + follow_us: "Följ oss" + networks_update_success: "Uppdatering av sociala nätverk lyckades" + networks_update_error: "Problem med att uppdatera sociala nätverk" + url_placeholder: "Klistra in url…" + save: "Spara" + website_invalid: "Webbplatsens adress är inte en giltig URL" edit_socials: - url_placeholder: "Paste url…" - website_invalid: "The website address is not a valid URL" + url_placeholder: "Klistra in url…" + website_invalid: "Webbplatsens adress är inte en giltig URL" #user edition form avatar_input: - add_an_avatar: "Add an avatar" - change: "Change" + add_an_avatar: "Lägg till en avatar" + change: "Ändra" user_profile_form: - personal_data: "Personal" - account_data: "Account" - account_networks: "Social networks" - organization_data: "Organization" - profile_data: "Profile" - preferences_data: "Preferences" - declare_organization: "I declare to be an organization" - declare_organization_help: "If you declare to be an organization, your invoices will be issued in the name of the organization." - pseudonym: "Nickname" - external_id: "External identifier" - first_name: "First name" - surname: "Surname" - email_address: "Email address" - organization_name: "Organization name" - organization_address: "Organization address" - profile_custom_field_is_required: "{FEILD} is required" - date_of_birth: "Date of birth" - website: "Website" - website_invalid: "The website address is not a valid URL" - job: "Job" - interests: "Interests" - CAD_softwares_mastered: "CAD Softwares mastered" - birthday: "Date of birth" - birthday_is_required: "Date of birth is required." - address: "Address" - phone_number: "Phone number" - phone_number_invalid: "Phone number is invalid." - allow_public_profile: "I agree to share my email address with registered users of the site" - allow_public_profile_help: "You will have a public profile and other users will be able to associate you in their projects." - allow_newsletter: "I accept to receive information from the FabLab" - used_for_statistics: "This data will be used for statistical purposes" - used_for_invoicing: "This data will be used for billing purposes" - used_for_reservation: "This data will be used in case of change on one of your bookings" - used_for_profile: "This data will only be displayed on your profile" - group: "Group" - trainings: "Trainings" - tags: "Tags" - note: "Private note" - note_help: "This note is only visible to administrators and managers. The member cannot see it." - terms_and_conditions_html: "I've read and accept the terms and conditions" - must_accept_terms: "You must accept the terms and conditions" - save: "Save" + personal_data: "Personligt" + account_data: "Konto" + account_networks: "Sociala nätverk" + organization_data: "Organisation" + profile_data: "Profil" + preferences_data: "Inställningar" + declare_organization: "Jag företräder en organisation" + declare_organization_help: "Om du företräder en organisation kommer dina fakturor att utfärdas i organisationens namn." + pseudonym: "Smeknamn" + external_id: "Extern identifierare" + first_name: "Förnamn" + surname: "Efternamn" + email_address: "E-postadress" + organization_name: "Organisationsnamn" + organization_address: "Organisationsadress" + profile_custom_field_is_required: "{FEILD} krävs" + date_of_birth: "Födelsedatum" + website: "Webbsida" + website_invalid: "Webbplatsens adress är inte en giltig URL" + job: "Jobb" + interests: "Intressen" + CAD_softwares_mastered: "Färdigheter" + birthday: "Födelsedatum" + birthday_is_required: "Födelsedatum krävs." + address: "Adress" + phone_number: "Telefonnummer" + phone_number_invalid: "Telefonnumret är ogiltigt." + allow_public_profile: "Jag samtycker till att dela min e-postadress med registrerade medlemmar på denna sida" + allow_public_profile_help: "Du kommer att ha en publik profil och andra användare kommer att kunna knyta dig till sina projekt." + allow_newsletter: "Jag accepterar att få information från FabLab" + used_for_statistics: "Dessa uppgifter kommer att användas för statistiska ändamål" + used_for_invoicing: "Dessa uppgifter kommer att användas för faktureringsändamål" + used_for_reservation: "Dessa uppgifter kommer att användas i händelse av ändring av dina bokningar" + used_for_profile: "Denna data kommer endast att visas på din profil" + group: "Grupp" + trainings: "Utbildningar" + tags: "Taggar" + note: "Personlig anteckning" + note_help: "Denna anteckning är endast synlig för administratörer och chefer. Medlemmen kan inte se den." + terms_and_conditions_html: "Jag har läst och godkänt användarvillkoren" + must_accept_terms: "Du måste acceptera villkoren" + save: "Spara" gender_input: - label: "Gender" + label: "Kön" man: "Man" - woman: "Woman" + woman: "Kvinna" change_password: - change_my_password: "Change my password" - confirm_current: "Confirm your current password" + change_my_password: "Byt lösenord" + confirm_current: "Bekräfta ditt nuvarande lösenord" confirm: "OK" - wrong_password: "Wrong password" + wrong_password: "Fel lösenord" password_input: - new_password: "New password" - confirm_password: "Confirm password" - help: "Your password must be minimum 12 characters long, have at least one uppercase letter, one lowercase letter, one number and one special character." - password_too_short: "Password is too short (must be at least 12 characters)" - confirmation_mismatch: "Confirmation mismatch with password." + new_password: "Nytt lösenord" + confirm_password: "Bekräfta lösenord" + help: "Lösenordet måste bestå av minst 12 tecken, minst en stor bokstav, en liten bokstav, ett nummer och ett specialtecken." + password_too_short: "Lösenordet är för kort (minst 12 tecken)" + confirmation_mismatch: "Lösenorden stämmer inte överens." password_strength: - not_in_requirements: "Your password doesn't meet the minimal requirements" - 0: "Very weak password" - 1: "Weak password" - 2: "Almost ok" - 3: "Good password" - 4: "Excellent password" + not_in_requirements: "Ditt lösenord uppfyller inte kraven" + 0: "Väldigt svagt lösenord" + 1: "Svagt lösenord" + 2: "Nästan ok" + 3: "Bra lösenord" + 4: "Utmärkt lösenord" #project edition form project: - name: "Name" - name_is_required: "Name is required." - illustration: "Visual" - illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio)." - add_an_illustration: "Add an illustration" - CAD_file: "CAD file" - CAD_files: "CAD files" - allowed_extensions: "Allowed extensions:" - add_a_new_file: "Add a new file" - description: "Description" - description_is_required: "Description is required." - steps: "Steps" - step_N: "Step {INDEX}" - step_title: "Step title" - step_image: "Image" - add_a_picture: "Add a picture" - change_the_picture: "Change the picture" - delete_the_step: "Delete the step" - confirmation_required: "Confirmation required" - do_you_really_want_to_delete_this_step: "Do you really want to delete this step?" - add_a_new_step: "Add a new step" - publish_your_project: "Publish your project" - or: "or" - employed_materials: "Employed materials" - employed_machines: "Employed machines" - collaborators: "Collaborators" - author: Author - creative_commons_licences: "Creative Commons licences" - licence: "Licence" - themes: "Themes" - tags: "Tags" - save_as_draft: "Save as draft" + name: "Namn" + name_is_required: "Namn måste fyllas i." + illustration: "Visuellt" + illustration_recommendation: "Maximal skärmstorlek: 932 * 700 px (obegränsad förhållande)." + add_an_illustration: "Lägg till en illustration" + CAD_file: "CAD-fil" + CAD_files: "CAD-filer" + allowed_extensions: "Tillåtna filändelser:" + add_a_new_file: "Lägg till ny fil" + description: "Beskrivning" + description_is_required: "Beskrivning krävs." + steps: "Steg" + step_N: "Steg {INDEX}" + step_title: "Titel på steg" + step_image: "Bild" + add_a_picture: "Lägg till en bild" + change_the_picture: "Ändra bilden" + delete_the_step: "Ta bort steget" + confirmation_required: "Verifiering krävs" + do_you_really_want_to_delete_this_step: "Vill du radera detta steg?" + add_a_new_step: "Lägg till nytt steg" + publish_your_project: "Publicera ditt projekt" + or: "eller" + employed_materials: "Använda råvaror" + employed_machines: "Använd utrustning" + collaborators: "Medverkande" + author: Skapare + creative_commons_licences: "Creative Commons-licenser" + licence: "Licens" + themes: "Teman" + tags: "Taggar" + save_as_draft: "Spara som utkast" status: "Status" #button to book a machine reservation reserve_button: - book_this_machine: "Book this machine" + book_this_machine: "Boka utrustning" #frame to select a plan to subscribe plan_subscribe: - subscribe_online: "subscribe online" - do_not_subscribe: "do not subscribe" + subscribe_online: "prenumerera online" + do_not_subscribe: "prenumerera inte" #admin: choose a member to interact with member_select: - select_a_member: "Select a member" - start_typing: "Start typing..." - member_not_validated: "This member has not yet been validated." + select_a_member: "Välj en medlem" + start_typing: "Börja skriva..." + member_not_validated: "Denna medlem har ännu inte validerats." #payment modal abstract_payment_modal: - online_payment: "Online payment" - i_have_read_and_accept_: "I have read, and accept " - _the_general_terms_and_conditions: "the general terms and conditions." - payment_schedule_html: "

You're about to subscribe to a payment schedule of {DEADLINES} months.

By paying this bill, you agree to send instructions to the financial institution that issue your card, to take payments from your card account, for the whole duration of this subscription. This imply that your card data are saved by {GATEWAY} and a series of payments will be initiated on your behalf, conforming to the payment schedule previously shown.

" - confirm_payment_of_: "Pay: {AMOUNT}" - validate: "Validate" + online_payment: "Onlinebetalning" + i_have_read_and_accept_: "Jag har läst och accepterat " + _the_general_terms_and_conditions: "läs de allmänna villkoren." + payment_schedule_html: "

Du är på väg att prenumerera enligt ett betalningsschema på {DEADLINES} månader.

Genom att betala denna faktura godkänner du att skicka instruktioner till det finansiella institut som utfärdar ditt kort, att ta betalningar från ditt kortkonto, under hela denna prenumeration. Detta innebär att dina kortuppgifter sparas av {GATEWAY} och en rad betalningar kommer att initieras för din räkning, som överensstämmer med den betalningsplan som tidigare visats.

" + confirm_payment_of_: "Betala: {AMOUNT}" + validate: "Bekräfta" #dialog of on site payment for reservations valid_reservation_modal: - booking_confirmation: "Booking confirmation" - here_is_the_summary_of_the_slots_to_book_for_the_current_user: "Here is the summary of the slots to book for the current user:" - subscription_confirmation: "Subscription confirmation" - here_is_the_subscription_summary: "Here is the subscription summary:" - payment_method: "Payment method" - method_card: "Online by card" - method_check: "By check" - card_collection_info: "By validating, you'll be prompted for the member's card number. This card will be automatically charged at the deadlines." - check_collection_info: "By validating, you confirm that you have {DEADLINES} checks, allowing you to collect all the monthly payments." + booking_confirmation: "Bokningsbekräftelse" + here_is_the_summary_of_the_slots_to_book_for_the_current_user: "Här är sammanfattningen av tider att boka för den aktuella användaren:" + subscription_confirmation: "Bekräftelse på prenumeration" + here_is_the_subscription_summary: "Här är prenumerationssammanfattningen:" + payment_method: "Betalningsmetod" + method_card: "Online med kort" + method_check: "Med check" + card_collection_info: "Genom att validera kommer du att bli tillfrågad om medlemmens kortnummer. Detta kort kommer att debiteras automatiskt vid deadlines." + check_collection_info: "Genom att validera bekräftar du att du har {DEADLINES} kontroller, så att du kan samla in alla månadsbetalningar." #partial form to edit/create a user (admin view) user_admin: - user: "User" - incomplete_profile: "Incomplete profile" - user_profile: "User profile" - warning_incomplete_user_profile_probably_imported_from_sso: "Warning: This user's profile is incomplete. As \"single sign-on\" (SSO) authentication is currently enabled, it may probably be an imported but non merged account. Do not modify it unless you know what your doing." - group: "Group" - group_is_required: "Group is required." - trainings: "Trainings" - tags: "Tags" - children: "Children" + user: "Användare" + incomplete_profile: "Ofullständig profil" + user_profile: "Användarprofil" + warning_incomplete_user_profile_probably_imported_from_sso: "Varning: Denna användares profil är ofullständig. Eftersom \"single sign-on\" (SSO) autentisering för närvarande är aktiverad, kan det förmodligen vara ett importerat men icke länkat konto. Ändra inte det om du inte vet vad du gör." + group: "Grupp" + group_is_required: "Grupp krävs." + trainings: "Utbildningar" + tags: "Taggar" + children: "Barn" #machine/training slot modification modal confirm_modify_slot_modal: - change_the_slot: "Change the slot" - do_you_want_to_change_your_booking_slot_initially_planned_at: "Do you want to change your booking slot, initially planned at:" - do_you_want_to_change_NAME_s_booking_slot_initially_planned_at: "Do you want to change {NAME}'s booking slot, initially planned at:" - cancel_this_reservation: "Cancel this reservation" - i_want_to_change_date: "I want to change date" - deleted_user: "deleted user" + change_the_slot: "Ändra bokningstiden" + do_you_want_to_change_your_booking_slot_initially_planned_at: "Vill du ändra din bokningstid, ursprungligen planerad:" + do_you_want_to_change_NAME_s_booking_slot_initially_planned_at: "Vill du ändra bokningstiden för {NAME}, ursprungligen planerad:" + cancel_this_reservation: "Avbryt bokningen" + i_want_to_change_date: "Jag vill ändra datum" + deleted_user: "raderad användare" #user public profile public_profile: - last_activity_html: "Last activity
on {DATE}" - to_come: "to come" - approved: "approved" - projects: "Projects" - no_projects: "No projects" - author: "Author" - collaborator: "Collaborator" - private_profile: "Private profile" - interests: "Interests" - CAD_softwares_mastered: "CAD softwares mastered" - email_address: "Email address" - trainings: "Trainings" - no_trainings: "No trainings" + last_activity_html: "Senaste aktivitet
den {DATE}" + to_come: "kommande" + approved: "godkänt" + projects: "Projekt" + no_projects: "Inga projekt" + author: "Upphovsman" + collaborator: "Samarbetspartner" + private_profile: "Privat profil" + interests: "Intressen" + CAD_softwares_mastered: "Färdigheter" + email_address: "E-postadress" + trainings: "Utbildningar" + no_trainings: "Inga utbildningar" #wallet wallet: - wallet: 'Wallet' - your_wallet_amount: 'Your amount available' - wallet_amount: 'Amount available' - no_transactions_for_now: 'No transactions for now' - date: "Date" + wallet: 'Plånbok' + your_wallet_amount: 'Ditt tillgängliga belopp' + wallet_amount: 'Belopp tillgängligt' + no_transactions_for_now: 'Inga transaktioner just nu' + date: "Datum" operation: 'Operation' - operator: 'Operator' - amount: 'Amount' - credit: 'Credit' - debit: 'Debit' - credit_title: 'Credit wallet' - credit_label: 'Set the amount to be credited' - confirm_credit_label: 'Confirm the amount to be credited' - generate_a_refund_invoice: "Generate a refund invoice" - description_optional: "Description (optional):" - will_appear_on_the_refund_invoice: "Will appear on the refund invoice." - to_credit: 'Credit' - wallet_credit_successfully: "Wallet of user is credited successfully." - a_problem_occurred_for_wallet_credit: "A problem is occurred while taking the credit of wallet." - amount_is_required: "The amount is required." - amount_minimum_1: "The amount minimum is 1" - amount_confirm_is_required: "The amount confirmation is required." - amount_confirm_does_not_match: "The amount confirmation does not match." - debit_subscription: "Pay for a subscription" - debit_reservation_training: "Pay for a training reservation" - debit_reservation_machine: "Pay for a machine reservation" - debit_reservation_event: "Pay for an event reservation" - warning_uneditable_credit: "Warning: once validated, the credited amount won't be editable anymore." + operator: 'Operatör' + amount: 'Belopp' + credit: 'Kredit' + debit: 'Debet' + credit_title: 'Kreditplånbok' + credit_label: 'Ange beloppet som ska krediteras' + confirm_credit_label: 'Bekräfta beloppet som ska krediteras' + generate_a_refund_invoice: "Generera en kreditnota" + description_optional: "Beskrivning (frivillig):" + will_appear_on_the_refund_invoice: "Kommer att visas på kreditnota." + to_credit: 'Kredit' + wallet_credit_successfully: "Användarens plånbok krediteras framgångsrikt." + a_problem_occurred_for_wallet_credit: "Ett problem uppstod när du krediterade plånboken." + amount_is_required: "Beloppet är obligatoriskt." + amount_minimum_1: "Minsta belopp är 1" + amount_confirm_is_required: "Bekräftelsen är obligatorisk." + amount_confirm_does_not_match: "Beloppen överensstämmer inte." + debit_subscription: "Betala för en prenumeration" + debit_reservation_training: "Betala för bokad utbildning" + debit_reservation_machine: "Betala för bokad utrustning" + debit_reservation_event: "Betala för en evenemangsbokning" + warning_uneditable_credit: "Varning: När det har validerats kommer det krediterade beloppet inte längre att kunna redigeras." wallet_info: - you_have_AMOUNT_in_wallet: "You have {AMOUNT} on your wallet" - wallet_pay_ITEM: "You pay your {ITEM} directly." - item_reservation: "reservation" - item_subscription: "subscription" - item_first_deadline: "first deadline" - item_other: "purchase" - credit_AMOUNT_for_pay_ITEM: "You still have {AMOUNT} to pay to validate your {ITEM}." - client_have_AMOUNT_in_wallet: "The member has {AMOUNT} on his wallet" - client_wallet_pay_ITEM: "The member can directly pay his {ITEM}." - client_credit_AMOUNT_for_pay_ITEM: "{AMOUNT} are remaining to pay to validate the {ITEM}" - other_deadlines_no_wallet: "Warning: the remaining wallet balance cannot be used for the next deadlines." + you_have_AMOUNT_in_wallet: "Du har {AMOUNT} i din plånbok" + wallet_pay_ITEM: "Du betalar din {ITEM} direkt." + item_reservation: "bokning" + item_subscription: "prenumeration" + item_first_deadline: "första deadline" + item_other: "köp" + credit_AMOUNT_for_pay_ITEM: "Du har fortfarande {AMOUNT} att betala för att validera din {ITEM}." + client_have_AMOUNT_in_wallet: "Medlemmen har {AMOUNT} på sin plånbok" + client_wallet_pay_ITEM: "Medlemmen kan betala direkt för {ITEM}." + client_credit_AMOUNT_for_pay_ITEM: "{AMOUNT} återstår att betala, för att validera {ITEM}" + other_deadlines_no_wallet: "Varning: det återstående plånbokssaldot kan inte användas för kommande betalningar." #coupon (promotional) (creation/edition form) coupon: - name: "Name" - name_is_required: "Name is required." - code: "Code" - code_is_required: "Code is required." - code_must_be_composed_of_capital_letters_digits_and_or_dashes: "The code must be composed of capital letters, digits and/or dashes." - kind_of_coupon: "Kind of coupon" - percentage: "Percentage" - amount: "Amount" - amount_off: "Amount off" - percent_off: "Percentage off" - percent_off_is_required: "Percentage off is required." - percentage_must_be_between_0_and_100: "Percentage must be between 0 and 100." - validity_per_user: "Validity per user" - once: "Just once" - forever: "Each use" - warn_validity_once: "Please note that when this coupon will be used with a payment schedule, the discount will be applied to the first deadline only." - warn_validity_forever: "Please note that when this coupon will be used with a payment schedule, the discount will be applied to each deadlines." - validity_per_user_is_required: "Validity per user is required." - valid_until: "Valid until (included)" - leave_empty_for_no_limit: "Do not specify any limit by leaving the field empty." - max_usages: "Maximum usages allowed" - max_usages_must_be_equal_or_greater_than_0: "The maximum usages allowed must be greater than 0." - enabled: "Active" + name: "Namn" + name_is_required: "Namn måste fyllas i." + code: "Kod" + code_is_required: "Kod krävs." + code_must_be_composed_of_capital_letters_digits_and_or_dashes: "Koden måste bestå av stora bokstäver, siffror och/eller bindestreck." + kind_of_coupon: "Typ av kupong" + percentage: "Procent" + amount: "Belopp" + amount_off: "Belopp av" + percent_off: "Procentsats" + percent_off_is_required: "Procentsats krävs." + percentage_must_be_between_0_and_100: "Andel måste vara mellan 1 och 100." + validity_per_user: "Giltighet per användare" + once: "Bara en gång" + forever: "Varje användning" + warn_validity_once: "Observera att när denna kupong kommer att användas med ett betalningsschema kommer rabatten endast att tillämpas på den första betalningen." + warn_validity_forever: "Observera att när denna kupong används med ett betalningsschema kommer rabatten endast att tillämpas på den första betalningen." + validity_per_user_is_required: "Giltighet per användare krävs." + valid_until: "Giltig till (ingår)" + leave_empty_for_no_limit: "Ange inte någon gräns genom att lämna fältet tomt." + max_usages: "Maximal användning tillåts" + max_usages_must_be_equal_or_greater_than_0: "De maximalt tillåtna användningsområdena måste vara fler än 0." + enabled: "Aktiv" #coupon (input zone for users) coupon_input: - i_have_a_coupon: "I have a coupon!" - code_: "Code:" - the_coupon_has_been_applied_you_get_PERCENT_discount: "The coupon has been applied. You get a {PERCENT}% discount." - the_coupon_has_been_applied_you_get_AMOUNT_CURRENCY: "The coupon has been applied. You get a discount of {AMOUNT} {CURRENCY}." - coupon_validity_once: "This coupon is valid only once. In case of payment schedule, only for the first deadline." - unable_to_apply_the_coupon_because_disabled: "Unable to apply the coupon: this code was disabled." - unable_to_apply_the_coupon_because_expired: "Unable to apply the coupon: this code has expired." - unable_to_apply_the_coupon_because_sold_out: "Unable to apply the coupon: this code reached its quota." - unable_to_apply_the_coupon_because_already_used: "Unable to apply the coupon: you have already used this code once before." - unable_to_apply_the_coupon_because_amount_exceeded: "Unable to apply the coupon: the discount exceed the total amount of this purchase." - unable_to_apply_the_coupon_because_undefined: "Unable to apply the coupon: an unexpected error occurred, please contact the Fablab's manager." - unable_to_apply_the_coupon_because_rejected: "This code does not exists." + i_have_a_coupon: "Jag har en kupong!" + code_: "Kod:" + the_coupon_has_been_applied_you_get_PERCENT_discount: "Kupongen har tillämpats. Du får en {PERCENT}% rabatt." + the_coupon_has_been_applied_you_get_AMOUNT_CURRENCY: "Kupongen har använts. Du får rabatt på {AMOUNT} {CURRENCY}." + coupon_validity_once: "Denna kupong gäller endast en gång. Vid betalningsschema, endast för det första förfallodatumet." + unable_to_apply_the_coupon_because_disabled: "Det går inte att använda kupongen: den här koden har inaktiverats." + unable_to_apply_the_coupon_because_expired: "Det går inte att använda kupongen: den här koden har gått ut." + unable_to_apply_the_coupon_because_sold_out: "Det går inte att tillämpa kupongen: denna kod är utnyttjad." + unable_to_apply_the_coupon_because_already_used: "Det går inte att tillämpa kupongen: du har redan använt denna kod en gång tidigare." + unable_to_apply_the_coupon_because_amount_exceeded: "Det går inte att tillämpa kupongen: rabatten överstiger det totala beloppet för detta köp." + unable_to_apply_the_coupon_because_undefined: "Det gick inte att tillämpa kupongen: ett oväntat fel uppstod, kontakta oss." + unable_to_apply_the_coupon_because_rejected: "Denna kod existerar inte." payment_schedule_summary: - your_payment_schedule: "Your payment schedule" - NUMBER_monthly_payment_of_AMOUNT: "{NUMBER} monthly {NUMBER, plural, =1{payment} other{payments}} of {AMOUNT}" - first_debit: "First debit on the day of the order." - monthly_payment_NUMBER: "{NUMBER}{NUMBER, plural, =1{st} =2{nd} =3{rd} other{th}} monthly payment: " - debit: "Debit on the day of the order." - view_full_schedule: "View the complete payment schedule" + your_payment_schedule: "Ditt betalningsschema" + NUMBER_monthly_payment_of_AMOUNT: "{NUMBER} {NUMBER, plural, one {}=1{månatlig betalning} other{månatligabetalningar}} av {AMOUNT}" + first_debit: "Första debiteringen på beställningsdagen." + monthly_payment_NUMBER: "{NUMBER}{NUMBER, plural, one {}=1{:a} =2{:a} =3{:e} other{:e}} månadsbetalning: " + debit: "Debitering på beställningsdagen." + view_full_schedule: "Visa hela betalningsschemat" select_schedule: - monthly_payment: "Monthly payment" + monthly_payment: "Månadsbetalning" #shopping cart module for reservations cart: - summary: "Summary" - select_one_or_more_slots_in_the_calendar: "Select one {SINGLE, select, true{slot} other{or more slots}} in the calendar" - select_a_plan: "Select a plan here" - you_ve_just_selected_the_slot: "You've just selected the slot:" - datetime_to_time: "{START_DATETIME} to {END_TIME}" #eg: Thursday, September 4, 1986 8:30 PM to 10:00 PM - cost_of_TYPE: "Cost of the {TYPE, select, Machine{machine slot} Training{training} Space{space slot} other{element}}" - offer_this_slot: "Offer this slot" - confirm_this_slot: "Confirm this slot" - remove_this_slot: "Remove this slot" - to_benefit_from_attractive_prices: "To benefit from attractive prices" - view_our_subscriptions: "View our subscriptions" - or: "or" - cost_of_the_subscription: "Cost of the subscription" - subscription_price: "Subscription price" - you_ve_just_selected_a_subscription_html: "You've just selected a subscription:" - confirm_and_pay: "Confirm and pay" - you_have_settled_the_following_TYPE: "You have settled the following {TYPE, select, Machine{machine slots} Training{training} other{elements}}:" - you_have_settled_a_: "You have settled a" + summary: "Sammanfattning" + select_one_or_more_slots_in_the_calendar: "Välj en {SINGLE, select, true{tid} other{eller fler tider}} i kalendern" + select_a_plan: "Välj en plan här" + you_ve_just_selected_the_slot: "Du har valt tiden:" + datetime_to_time: "{START_DATETIME} till {END_TIME}" #eg: Thursday, September 4, 1986 8:30 PM to 10:00 PM + cost_of_TYPE: "Kostnad för {TYPE, select, Machine{utrustning} Training{utbildning} Space{lokal} other{objekt}}" + offer_this_slot: "Erbjud denna tid" + confirm_this_slot: "Bekräfta denna tid" + remove_this_slot: "Ta bort denna tid" + to_benefit_from_attractive_prices: "Dra nytta av attraktiva priser" + view_our_subscriptions: "Visa våra prenumerationer" + or: "eller" + cost_of_the_subscription: "Kostnad för prenumerationen" + subscription_price: "Prenumerationspris" + you_ve_just_selected_a_subscription_html: "Du har valt prenumerationen:" + confirm_and_pay: "Bekräfta och betala" + you_have_settled_the_following_TYPE: "Du har betalat för följande {TYPE, select, Machine{utrustning} Training{utbildning} other{objekt}}:" + you_have_settled_a_: "Du har betalat en" total_: "TOTAL:" - thank_you_your_payment_has_been_successfully_registered: "Thank you. Your payment has been successfully registered !" - your_invoice_will_be_available_soon_from_your_: "Your invoice will be available soon from your" - dashboard: "Dashboard" - i_want_to_change_the_following_reservation: "I want to change the following reservation:" - cancel_my_modification: "Cancel my modification" - select_a_new_slot_in_the_calendar: "Select a new slot in the calendar" - cancel_my_selection: "Cancel my selection" - tags_of_the_original_slot: "Tags of the original slot:" - tags_of_the_destination_slot: "Tags of the destination slot:" - confirm_my_modification: "Confirm my modification" - your_booking_slot_was_successfully_moved_from_: "Your booking slot was successfully moved from" - to_date: "to" #eg. from 01 to 05 january. - please_select_a_member_first: "Please select a member first" - unable_to_select_plan_if_slots_in_the_past: "Unable to select a plan if any of the selected slots is in the past" - unable_to_change_the_reservation: "Unable to change the reservation" - confirmation_required: "Confirmation required" - do_you_really_want_to_cancel_this_reservation_html: "

Do you really want to cancel this reservation?

Warning: if this reservation was made free of charge, as part of a subscription, the credits used will not be re-credited.

" - reservation_was_cancelled_successfully: "Reservation was cancelled successfully." - cancellation_failed: "Cancellation failed." - confirm_payment_of_html: "{METHOD, select, card{Pay by card} other{Pay on site}}: {AMOUNT}" - a_problem_occurred_during_the_payment_process_please_try_again_later: "A problem occurred during the payment process. Please try again later." - none: "None" - online_payment_disabled: "Online payment is not available. Please contact the FabLab's reception directly." - slot_restrict_plans: "This slot is restricted for the plans below:" - slot_restrict_subscriptions_must_select_plan: "The slot is restricted for the subscribers. Please select a plan first." - slot_restrict_plans_of_others_groups: "The slot is restricted for the subscribers of others groups." - selected_plan_dont_match_slot: "Selected plan don't match this slot" - user_plan_dont_match_slot: "User subscribed plan don't match this slot" - no_plan_match_slot: "You dont have any matching plan for this slot" - slot_at_same_time: "Conflict with others reservations" - do_you_really_want_to_book_slot_at_same_time: "Do you really want to book this slot? Other bookings take place at the same time" - unable_to_book_slot_because_really_have_reservation_at_same_time: "Unable to book this slot because the following reservation occurs at the same time." - tags_mismatch: "Tags mismatch" - confirm_book_slot_tags_mismatch: "Do you really want to book this slot? {USER} does not have any of the required tags." - unable_to_book_slot_tags_mismatch: "Unable to book this slot because you don't have any of the required tags." - slot_tags: "Slot tags" - user_tags: "User tags" - no_tags: "No tags" - user_validation_required_alert: "Warning!
Your administrator must validate your account. Then, you'll then be able to access all the booking features." - select_the_reservation_context: "Select the context of the reservation" - please_select_a_reservation_context: "Please select the context of the reservation first" - child_validation_required_alert: "Your administrator must validate your child account. Then, you'll then be able to book the event." - child_birthday_must_be_under_18_years_ago_alert: "Your child must be under 18. Then, you'll then be able to book the event." + thank_you_your_payment_has_been_successfully_registered: "Tack. Din betalning har registrerats !" + your_invoice_will_be_available_soon_from_your_: "Din faktura kommer att finnas tillgänglig från din översiktsvy inom kort" + dashboard: "Översikt" + i_want_to_change_the_following_reservation: "Jag vill ändra följande bokning:" + cancel_my_modification: "Avbryt ändringar" + select_a_new_slot_in_the_calendar: "Välj en ny tid i kalendern" + cancel_my_selection: "Avbryt val" + tags_of_the_original_slot: "Taggar på den ursprungliga bokningstiden:" + tags_of_the_destination_slot: "Taggar för destinationsbokningen:" + confirm_my_modification: "Bekräfta min ändring" + your_booking_slot_was_successfully_moved_from_: "Din bokningsplats har flyttats från" + to_date: "till" #eg. from 01 to 05 january. + please_select_a_member_first: "Välj en medlem först" + unable_to_select_plan_if_slots_in_the_past: "Det går inte att välja en plan om någon av de valda platserna är i det förflutna" + unable_to_change_the_reservation: "Det går inte att ändra bokningen" + confirmation_required: "Verifiering krävs" + do_you_really_want_to_cancel_this_reservation_html: "

Vill du verkligen avboka denna bokning?

Varning: om denna bokning gjordes gratis, som en del av ett abonnemang, kommer krediterna som används inte att krediteras.

" + reservation_was_cancelled_successfully: "Reserveringen avbröts." + cancellation_failed: "Avbokning misslyckades." + confirm_payment_of_html: "{METHOD, select, card{Betala med kort} other{Betala på plats}}: {AMOUNT}" + a_problem_occurred_during_the_payment_process_please_try_again_later: "Ett problem uppstod under betalningsprocessen. Försök igen senare." + none: "Inget" + online_payment_disabled: "Online-betalning är inte tillgänglig. Kontakta oss direkt." + slot_restrict_plans: "Denna bokningsplats är begränsad till planerna nedan:" + slot_restrict_subscriptions_must_select_plan: "Platsen är endast tillgänglig för prenumeranter. Välj en prenumeration först." + slot_restrict_plans_of_others_groups: "Platsen är endast tillgänglig för medlemmar i andra grupper." + selected_plan_dont_match_slot: "Vald plan matchar inte denna bokningsplats" + user_plan_dont_match_slot: "Vald plan matchar inte denna bokningsplats" + no_plan_match_slot: "Du har ingen matchande plan för denna bokningsplats" + slot_at_same_time: "Konflikt med andra bokningar" + do_you_really_want_to_book_slot_at_same_time: "Vill du verkligen boka denna tid? Andra bokningar sker samtidigt" + unable_to_book_slot_because_really_have_reservation_at_same_time: "Det går inte att boka denna tid eftersom efterföljande bokning överlappar." + tags_mismatch: "Taggarna matchar inte" + confirm_book_slot_tags_mismatch: "Vill du verkligen boka den här platsen? {USER} har inga av de taggar som krävs." + unable_to_book_slot_tags_mismatch: "Det går inte att boka denna plats eftersom du inte har någon av de nödvändiga taggarna." + slot_tags: "Bokningstaggar" + user_tags: "Användarens taggar" + no_tags: "Inga taggar" + user_validation_required_alert: "Varning!
Din administratör måste validera ditt konto. Då kommer du då att kunna komma åt alla bokningsfunktioner." + select_the_reservation_context: "Välj sammanhang för bokningen" + please_select_a_reservation_context: "Vänligen välj sammanhang för bokningen först" + child_validation_required_alert: "Administratören måste validera ditt barnkonto. Då kommer du då att kunna boka händelsen." + child_birthday_must_be_under_18_years_ago_alert: "Ditt barn måste vara under 18. Då kommer du då att kunna boka evenemanget." #feature-tour modal tour: - previous: "Previous" - next: "Next" - end: "End the tour" + previous: "Föregående" + next: "Nästa" + end: "Avsluta turen" #help modal help: - title: "Help" - what_to_do: "What do you want to do?" - tour: "Start the feature tour" - guide: "Open the user's manual" + title: "Hjälp" + what_to_do: "Vad vill du göra?" + tour: "Starta funktionsturen" + guide: "Öppna användarens manual" stripe_confirm_modal: - resolve_action: "Resolve the action" + resolve_action: "Lös åtgärden" ok_button: "OK" #2nd factor authentication for card payments stripe_confirm: - pending: "Pending for action..." - success: "Thank you, your card setup is complete. The payment will be proceeded shortly." + pending: "Väntar på åtgärd..." + success: "Tack, dina kortinställningar är färdiga. Betalningen kommer att fortsätta inom kort." #the summary table of all payment schedules payment_schedules_table: - schedule_num: "Schedule #" - date: "Date" - price: "Price" - customer: "Customer" - deadline: "Deadline" - amount: "Amount" - state: "State" - download: "Download" - state_new: "Not yet due" - state_pending_check: "Waiting for the cashing of the check" - state_pending_transfer: "Waiting for the tranfer confirmation" - state_pending_card: "Waiting for the card payment" - state_requires_payment_method: "The credit card must be updated" - state_requires_action: "Action required" - state_paid: "Paid" - state_error: "Error" - state_gateway_canceled: "Canceled by the payment gateway" - state_canceled: "Canceled" - method_card: "by card" - method_check: "by check" - method_transfer: "by transfer" + schedule_num: "Schema #" + date: "Datum" + price: "Pris" + customer: "Kund" + deadline: "Tidsfrist" + amount: "Belopp" + state: "Län" + download: "Ladda ner" + state_new: "Ännu inte upplupen" + state_pending_check: "Väntar på inbetalning av checken" + state_pending_transfer: "Väntar på överföringsbekräftelse" + state_pending_card: "Väntar på kortbetalning" + state_requires_payment_method: "Kreditkortet måste uppdateras" + state_requires_action: "Åtgärd krävs" + state_paid: "Betald" + state_error: "Fel" + state_gateway_canceled: "Avbruten av betalningsgateway" + state_canceled: "Avbruten" + method_card: "med kort" + method_check: "med check" + method_transfer: "med överföring" payment_schedule_item_actions: - download: "Download" - cancel_subscription: "Cancel the subscription" - confirm_payment: "Confirm payment" - confirm_check: "Confirm cashing" - resolve_action: "Resolve the action" - update_card: "Update the card" - update_payment_mean: "Update the payment mean" - please_ask_reception: "For any questions, please contact the FabLab's reception." - confirm_button: "Confirm" - confirm_check_cashing: "Confirm the cashing of the check" - confirm_check_cashing_body: "You must cash a check of {AMOUNT} for the deadline of {DATE}. By confirming the cashing of the check, an invoice will be generated for this due date." - confirm_bank_transfer: "Confirm the bank transfer" - confirm_bank_transfer_body: "You must confirm the receipt of {AMOUNT} for the deadline of {DATE}. By confirming the bank transfer, an invoice will be generated for this due date." - confirm_cancel_subscription: "You're about to cancel this payment schedule and the related subscription. Are you sure?" + download: "Ladda ner" + cancel_subscription: "Avsluta prenumerationen" + confirm_payment: "Bekräfta betalning" + confirm_check: "Bekräfta inbetalning" + resolve_action: "Lös åtgärden" + update_card: "Uppdatera kortet" + update_payment_mean: "Uppdatera betalningsmedel" + please_ask_reception: "För eventuella frågor, kontakta oss." + confirm_button: "Bekräfta" + confirm_check_cashing: "Väntar på inbetalning av checken" + confirm_check_cashing_body: "Du måste betala en check på {AMOUNT} inom tidsfristen som löper ut den {DATE}. Genom att bekräfta utbetalningen av checken, kommer en faktura att genereras för detta förfallodatum." + confirm_bank_transfer: "Bekräfta banköverföringen" + confirm_bank_transfer_body: "Du måste bekräfta mottagandet på {AMOUNT} inom tidsfristen som löper ut den {DATE}. Genom att bekräfta utbetalningen av checken, kommer en faktura att genereras för detta förfallodatum." + confirm_cancel_subscription: "Du är på väg att avbryta denna betalningsplan och den relaterade prenumerationen. Är du säker?" card_payment_modal: - online_payment_disabled: "Online payment is not available. Please contact the FabLab's reception directly." - unexpected_error: "An error occurred. Please report this issue to the Fab-Manager's team." + online_payment_disabled: "Online-betalning är inte tillgänglig. Kontakta oss direkt." + unexpected_error: "Ett fel uppstod. Rapportera problemet till oss." update_card_modal: - unexpected_error: "An error occurred. Please report this issue to the Fab-Manager's team." + unexpected_error: "Ett fel uppstod. Rapportera problemet till oss." stripe_card_update_modal: - update_card: "Update the card" - validate_button: "Validate the new card" + update_card: "Uppdatera kortet" + validate_button: "Validera det nya kortet" payzen_card_update_modal: - update_card: "Update the card" - validate_button: "Validate the new card" + update_card: "Uppdatera kortet" + validate_button: "Validera det nya kortet" form_multi_select: - create_label: "Add {VALUE}" + create_label: "Lägg till {VALUE}" form_checklist: - select_all: "Select all" - unselect_all: "Unselect all" + select_all: "Markera allt" + unselect_all: "Avmarkera allt" form_file_upload: - placeholder: "Add a file" - browse: "Browse" - edit: "Edit" + placeholder: "Lägg till en fil" + browse: "Bläddra" + edit: "Redigera" form_image_upload: - browse: "Browse" - edit: "Edit" - main_image: "Main visual" + browse: "Bläddra" + edit: "Redigera" + main_image: "Huvudbild" store: order_item: - total: "Total" - client: "Client" - created_at: "Order creation" - last_update: "Last update" + total: "Totalt" + client: "Kund" + created_at: "Order skapad" + last_update: "Senast uppdaterad" state: - cart: 'Cart' - in_progress: 'Under preparation' - paid: "Paid" - payment_failed: "Payment error" - canceled: "Canceled" - ready: "Ready" - refunded: "Refunded" - delivered: "Delivered" + cart: 'Varukorg' + in_progress: 'Under behandling' + paid: "Betald" + payment_failed: "Fel vid betalning" + canceled: "Avbruten" + ready: "Färdig" + refunded: "Återbetald" + delivered: "Levererat" show_order: - back_to_list: "Back to list" - see_invoice: "See invoice" - tracking: "Order tracking" - client: "Client" - created_at: "Creation date" - last_update: "Last update" - cart: "Cart" + back_to_list: "Tillbaka till listan" + see_invoice: "Se faktura" + tracking: "Spåra beställning" + client: "Kund" + created_at: "Skapad datum" + last_update: "Senast uppdaterad" + cart: "Varukorg" reference_short: "ref:" - unit: "Unit" - item_total: "Total" - payment_informations: "Payment informations" - amount: "Amount" - products_total: "Products total" - gift_total: "Discount total" - coupon: "Coupon" - cart_total: "Cart total" - pickup: "Pickup your products" + unit: "Enhet" + item_total: "Totalt" + payment_informations: "Betalningsinformation" + amount: "Belopp" + products_total: "Produkter totalt" + gift_total: "Rabatt totalt" + coupon: "Rabattkupong" + cart_total: "Totalt varukorg" + pickup: "Hämta dina produkter" state: - cart: 'Cart' - in_progress: 'Under preparation' - paid: "Paid" - payment_failed: "Payment error" - canceled: "Canceled" - ready: "Ready" - refunded: "Refunded" - delivered: "Delivered" + cart: 'Varukorg' + in_progress: 'Under behandling' + paid: "Betald" + payment_failed: "Fel vid betalning" + canceled: "Avbruten" + ready: "Färdig" + refunded: "Återbetald" + delivered: "Levererat" payment: - by_wallet: "by wallet" - settlement_by_debit_card: "Settlement by debit card" - settlement_done_at_the_reception: "Settlement done at the reception" - settlement_by_wallet: "Settlement by wallet" - on_DATE_at_TIME: "on {DATE} at {TIME}," - for_an_amount_of_AMOUNT: "for an amount of {AMOUNT}" - and: 'and' + by_wallet: "med plånbok" + settlement_by_debit_card: "Betalning med betalkort" + settlement_done_at_the_reception: "Betalning görs på plats" + settlement_by_wallet: "Betalning med plånbok" + on_DATE_at_TIME: "den {DATE} kl {TIME}," + for_an_amount_of_AMOUNT: "för ett belopp på {AMOUNT}" + and: 'och' order_actions: state: - cart: 'Cart' - in_progress: 'Under preparation' - paid: "Paid" - payment_failed: "Payment error" - canceled: "Canceled" - ready: "Ready" - refunded: "Refunded" - delivered: "Delivered" - confirm: 'Confirm' - confirmation_required: "Confirmation required" - confirm_order_in_progress_html: "Please confirm that this order in being prepared." - order_in_progress_success: "Order is under preparation" - confirm_order_ready_html: "Please confirm that this order is ready." - order_ready_note: 'You can leave a message to the customer about withdrawal instructions' - order_ready_success: "Order is ready" - confirm_order_delivered_html: "Please confirm that this order was delivered." - order_delivered_success: "Order was delivered" - confirm_order_canceled_html: "Do you really want to cancel this order?

If this impacts stock, please reflect the change in edit product > stock management. This won't be automatic.

" - order_canceled_success: "Order was canceled" - confirm_order_refunded_html: "Do you really want to refund this order?

If so, please refund the customer and generate the credit note from the Invoices tab.

If this affects stocks, please edit your product and reflect the change in the stock management tab.

These actions will not be automatic.

" - order_refunded_success: "Order was refunded" + cart: 'Varukorg' + in_progress: 'Under behandling' + paid: "Betald" + payment_failed: "Fel vid betalning" + canceled: "Avbruten" + ready: "Färdig" + refunded: "Återbetald" + delivered: "Levererat" + confirm: 'Bekräfta' + confirmation_required: "Verifiering krävs" + confirm_order_in_progress_html: "Vänligen bekräfta att denna order är förberedd." + order_in_progress_success: "Beställningen är under behandling" + confirm_order_ready_html: "Vänligen bekräfta att denna beställning är klar." + order_ready_note: 'Du kan lämna ett meddelande till kunden om instruktioner för uttag' + order_ready_success: "Beställningen är klar" + confirm_order_delivered_html: "Vänligen bekräfta att denna beställning är klar." + order_delivered_success: "Beställningen levererades" + confirm_order_canceled_html: "Vill du verkligen annullera denna beställning?

Om detta påverkar lager, vänligen repetera förändringen under redigera produkt > lagerhantering. Detta kommer inte att ske automatiskt.

" + order_canceled_success: "Beställningen avbröts" + confirm_order_refunded_html: "Vill du verkligen återbetala denna beställning?

Om så är fallet, vänligen återbetala kunden och generera kreditfaktura från Fakturor -fliken.

Om detta påverkar lager, vänligen redigera din produkt och repeteraunderförändringen i lagerhantering -fliken.

Dessa åtgärder kommer inte att ske automatiskt.

" + order_refunded_success: "Ordern har återbetalats" unsaved_form_alert: - modal_title: "You have some unsaved changes" - confirmation_message: "If you leave this page, your changes will be lost. Are you sure you want to continue?" - confirmation_button: "Yes, don't save" + modal_title: "Du har några osparade ändringar" + confirmation_message: "Om du lämnar den här sidan kommer dina ändringar att gå förlorade. Är du säker på att du vill fortsätta?" + confirmation_button: "Ja, spara inte" active_filters_tags: - keyword: "Keyword: {KEYWORD}" - stock_internal: "Private stock" - stock_external: "Public stock" + keyword: "Nyckelord: {KEYWORD}" + stock_internal: "Privat lager" + stock_external: "Publikt lager" calendar: - calendar: "Calendar" - show_unavailables: "Show complete slots" - filter_calendar: "Filter calendar" - trainings: "Trainings" - machines: "Machines" - spaces: "Spaces" - events: "Events" - externals: "Other calendars" - show_reserved_uniq: "Show only slots with reservations" + calendar: "Kalender" + show_unavailables: "Visa otillgängliga tider" + filter_calendar: "Filtrera kalender" + trainings: "Utbildningar" + machines: "Utrustning" + spaces: "Lokaler" + events: "Evenemang" + externals: "Andra kalendrar" + show_reserved_uniq: "Visa endast tider med bokningar" machine: - machine_uncategorized: "Uncategorized machines" + machine_uncategorized: "Okategoriserad utrustning" form_unsaved_list: - save_reminder: "Do not forget to save your changes" - cancel: "Cancel" + save_reminder: "Glöm inte att spara dina ändringar" + cancel: "Avbryt" diff --git a/config/locales/base.sv.yml b/config/locales/base.sv.yml index 8132bca04..469446eab 100644 --- a/config/locales/base.sv.yml +++ b/config/locales/base.sv.yml @@ -2,4 +2,4 @@ sv: time: formats: #See http://apidock.com/ruby/DateTime/strftime for a list of available directives - hour_minute: "%I:%M %p" + hour_minute: "%H:%M" diff --git a/config/locales/devise.sv.yml b/config/locales/devise.sv.yml index 4271ba112..7971d124a 100644 --- a/config/locales/devise.sv.yml +++ b/config/locales/devise.sv.yml @@ -2,62 +2,62 @@ sv: devise: confirmations: - confirmed: "Your account was successfully confirmed." - send_instructions: "You will receive an email with instructions about how to confirm your account in a few minutes." - send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions about how to confirm your account in a few minutes." + confirmed: "Ditt konto har uppdaterats." + send_instructions: "Inom några minuter får du ett e-postmeddelande med instruktioner för hur du bekräftar ditt konto." + send_paranoid_instructions: "Om din e-postadress finns i vår databas får du inom några minuter ett e-postmeddelande med instruktioner för hur du bekräftar ditt konto." failure: - already_authenticated: "You are already signed in." - inactive: "Your account is not activated yet." - invalid: "Invalid email or password." - locked: "Your account is locked." - last_attempt: "You have one more attempt before your account will be locked." - not_found_in_database: "Invalid email or password." - timeout: "Your session expired. Please sign in again to continue." - unauthenticated: "You need to sign in or sign up before continuing." - unconfirmed: "You have to confirm your account before continuing. Please click on the link below the form." + already_authenticated: "Du har redan loggat in." + inactive: "Ditt konto har inte aktiverats ännu." + invalid: "Ogiltig e-postadress eller lösenord." + locked: "Ditt konto är låst." + last_attempt: "Du har ett försök kvar innan vi låser kontot." + not_found_in_database: "Ogiltig e-postadress eller lösenord." + timeout: "Din session har upphört att gälla. Vänligen logga in igen om du vill fortsätta." + unauthenticated: "Du måste logga in eller skapa ett konto innan du kan fortsätta." + unconfirmed: "Du måste bekräfta ditt konto innan du fortsätter. Klicka på länken nedanför formuläret." mailer: confirmation_instructions: - action: "Confirm my email address" - instruction: "You can finalize your registration by confirming your email address. Please click on the following link:" - subject: "Confirmation instructions" + action: "Bekräfta e-postadress" + instruction: "Du kan slutföra din registrering genom att bekräfta din e-postadress. Klicka på följande länk:" + subject: "Bekräftelseinstruktioner" reset_password_instructions: - action: "Change my password" - instruction: "Someone asked for a link to change your password. You can do it through the link below." - ignore_otherwise: "If you have not made this request, please ignore this message." - subject: "Reset password instructions" + action: "Byt lösenord" + instruction: "Någon har begärt att ändra ditt lösenordet. Du kan göra det genom länken nedan." + ignore_otherwise: "Om du inte har gjort denna begäran, vänligen ignorera detta meddelande." + subject: "Instruktioner för återställning av lösenord" unlock_instructions: - subject: "Unlock Instructions" + subject: "Instruktioner för upplåsning" omniauth_callbacks: - failure: "Could not authenticate you from %{kind} because \"%{reason}\"." - success: "Successfully authenticated from %{kind} account." + failure: "Kunde inte autentisera dig med %{kind} på grund av \"%{reason}\"." + success: "Autentiserat med %{kind}-konto." passwords: - no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided." - send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes." - send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes." - updated: "Your password was changed successfully. You are now signed in." - updated_not_active: "Your password was changed successfully." + no_token: "Tillgång till den här sidan kräver att du fått ett mejl som sätter tillbaka ditt lösenord. Om du kom hit från ett sådant mejl, säkerställ att du har använt hela URL: en." + send_instructions: "Du kommer få ett mejl med instruktioner för hur du kan återställa ditt lösenord inom några minuter." + send_paranoid_instructions: "Om din e-postadress finns i vår databas kommer du att få en länk för lösenordsåterställning via e-post inom några minuter." + updated: "Ditt lösenord har ändrats. Du är nu inloggad." + updated_not_active: "Ditt lösenord har ändrats." registrations: - destroyed: "Bye! Your account was successfully cancelled. We hope to see you again soon." - signed_up: "Welcome! You have signed up successfully." - 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." - 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." - 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." - updated: "You updated your account successfully." + destroyed: "Hej då! Ditt konto har nu avslutats. Vi hoppas att vi snart ses igen." + signed_up: "Välkommen! Du har registrerat dig." + signed_up_but_inactive: "Din registrering är klar. Men vi kunde inte logga in dig eftersom ditt konto ännu inte är aktiverat." + signed_up_but_locked: "Din registrering är klar. Men vi kunde inte logga in dig eftersom ditt konto är låst." + signed_up_but_unconfirmed: "Ett meddelande med en bekräftelselänk har skickats till din e-postadress. Aktivera ditt konto genom att klicka på den länken." + update_needs_confirmation: "Du uppdaterade ditt konto, men vi måste verifiera din nya e-postadress. Kontrollera din e-post och klicka på bekräftelselänken för att slutföra bekräftandet av din nya e-postadress." + updated: "Ditt konto har uppdaterats." sessions: - signed_in: "Signed in successfully." - signed_out: "Signed out successfully." + signed_in: "Inloggningen lyckades." + signed_out: "Du har loggats ut." unlocks: - send_instructions: "You will receive an email with instructions about how to unlock your account in a few minutes." - send_paranoid_instructions: "If your account exists, you will receive an email with instructions about how to unlock it in a few minutes." - unlocked: "Your account has been unlocked successfully. Please sign in to continue." + send_instructions: "Inom några minuter får du ett e-postmeddelande med instruktioner för hur du låser upp ditt konto." + send_paranoid_instructions: "Om ditt konto finns får du inom några minuter ett e-postmeddelande med instruktioner för hur du låser upp det." + unlocked: "Ditt konto har blivit upplåst. Logga in för att fortsätta." errors: messages: - already_confirmed: "This email was already confirmed, please try signing in." - confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one" - expired: "has expired, please request a new one" - not_found: "This email was not found" - not_locked: "was not locked" + already_confirmed: "Detta e-postmeddelande har redan bekräftats, försök logga in." + confirmation_period_expired: "måste bekräftas inom %{period}, vänligen begär ett nytt" + expired: "har gått ut, vänligen begär ett nytt" + not_found: "Meddelandet hittades inte" + not_locked: "" not_saved: - one: "1 error prohibited this %{resource} from being saved:" - other: "%{count} errors prohibited this %{resource} from being saved:" + one: "1 fel gjorde att denna %{resource} inte kunde sparas:" + other: "%{count} fel gjorde att denna %{resource} inte kunde sparas:" diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 7977f5bc1..6dbfb6d84 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -49,7 +49,7 @@ fr: gateway_amount_too_large: "Les paiements supérieurs à %{AMOUNT} ne sont pas pris en charge. Merci de passer commande directement à l'accueil." product_in_use: "Ce produit a déjà été commandé" slug_already_used: "est déjà utilisée" - birthday_less_than_18_years_ago: "l'age devez avoir au moins 18 ans" + birthday_less_than_18_years_ago: "L'age doit être inférieur à 18 ans" coupon: code_format_error: "seules les majuscules, chiffres et tirets sont autorisés" apipie: diff --git a/config/locales/mails.sv.yml b/config/locales/mails.sv.yml index dca5a5024..553ceb446 100644 --- a/config/locales/mails.sv.yml +++ b/config/locales/mails.sv.yml @@ -1,143 +1,143 @@ sv: layouts: notifications_mailer: - see_you_later: "See you soon on {GENDER, select, neutral{} other{the}}" #messageFormat interpolation - sincerely: "Sincerely," - signature: "The Fab Lab team." - do_not_reply: "Please do not reply to this email." + see_you_later: "Vi ses snart {GENDER, select, neutral{} other{}}" #messageFormat interpolation + sincerely: "Vänliga hälsningar," + signature: "Fab Lab teamet." + do_not_reply: "Vänligen svara inte på detta meddelande." users_mailer: notify_user_account_created: - subject: "Your FabLab account has been successfully created" + subject: "Ditt FabLab-konto har skapats" body: - hello: "Hello %{NAME}," - intro: "The FabLab team has just created an account for you, on {GENDER, select, neutral{} other{the}} {FABLAB} website:" #messageFormat interpolation - connection_parameters: "Here are your connection parameters:" - account_name: "Account name:" - password: "Password:" - temporary_password: "This is a temporary password, you can modify it in your «My account» screen." - keep_advantages: "With this account, you keep all the advantages linked to your Fab Lab user profile (trainings, subscriptions plans)." - to_use_platform: "To use the website, please" - logon_or_login: "create a new account or log in by clicking here." - token_if_link_problem: "If you experience issues with the link, you can enter the following code at your first connection attempt:" + hello: "Hej %{NAME}," + intro: "FabLab-teamet har just skapat ett konto åt dig, på sidan {GENDER, select, neutral{} other{}} {FABLAB} :" #messageFormat interpolation + connection_parameters: "Här är dina inloggningsuppgifter:" + account_name: "Kontonamn:" + password: "Lösenord:" + temporary_password: "Detta är ett tillfälligt lösenord, du kan ändra det på sidan «Mitt konto»." + keep_advantages: "Med detta konto behåller du alla fördelar som är kopplade till din Fab Lab-användarprofil (utbildningar, prenumerationsplaner)." + to_use_platform: "För att använda webbplatsen, vänligen" + logon_or_login: "skapa ett nytt konto eller logga in genom att klicka här." + token_if_link_problem: "Om du upplever problem med länken kan du ange följande kod vid ditt första inloggningsförsök:" notifications_mailer: notify_user_user_group_changed: - subject: "You have changed group" + subject: "Du har bytt grupp" body: - warning: "You have changed group. Inspections can be conducted at the lab to verify the legitimacy of this change." - user_invalidated: "Your account was invalidated, please upload your new supporting documents to validate your account." + warning: "Du har bytt grupp. Kontroller kan utföras i lokalen för att kontrollera legitimiteten i denna ändring." + user_invalidated: "Ditt konto har blivit ogiltigförklarat, ladda upp dina nya underlag för att validera ditt konto." notify_admin_user_group_changed: - subject: "A member has changed group" + subject: "En användare har ändrat sin grupp" body: - user_changed_group_html: "User %{NAME} has changed group." - previous_group: "Previous group:" - new_group: "New group:" - user_invalidated: "The user's account was invalidated." + user_changed_group_html: "Användare %{NAME} ändrade grupp." + previous_group: "Föregående grupp:" + new_group: "Ny grupp:" + user_invalidated: "Användarens konto har ogiltigförklarats." notify_admin_subscription_extended: - subject: "A subscription has been extended" + subject: "En prenumeration har förlängts" body: - subscription_extended_html: "Subscription {PLAN} for user {NAME} has been extended {FREE, select, true{for free} other{}} until {DATE}." #messageFormat interpolation + subscription_extended_html: "Prenumeration {PLAN} av medlemmen {NAME} har förlängts {FREE, select, true{gratis} other{}} tills {DATE}." #messageFormat interpolation notify_member_subscription_extended: - subject: "Your subscription plan has been extended" + subject: "Din prenumerationsplan har förlängts" body: - your_plan: "Your subscription plan" - has_been_extended: "has been extended" - free: "for free" - until: "until" + your_plan: "Din prenumerationsplan" + has_been_extended: "har utökats" + free: "gratis" + until: "till och med" notify_partner_subscribed_plan: - subject: "A subscription plan has been purchased" + subject: "En prenumeration har köpts" body: - a_plan: "A subscription plan" - was_purchased_by_member: "has been purchased by user" + a_plan: "En prenumerationsplan" + was_purchased_by_member: "har köpts av användaren" notify_admin_when_project_published: - subject: "A project has been published" + subject: "Ett projekt har publicerats" body: - new_project_published: "A new project has been published:" + new_project_published: "Ett nytt projekt har publicerat:" notify_project_collaborator_to_valid: - subject: "Invitation to collaborate on a project" + subject: "Inbjudan att delta i ett projekt" body: - your_are_invited_to_take_part_in_a_project: "You are invited to join this project:" - to_accept_the_invitation_click_on_following_link: "To accept this invitation, please click on the following link:" + your_are_invited_to_take_part_in_a_project: "Du är inbjuden att delta i detta projekt:" + to_accept_the_invitation_click_on_following_link: "För att tacka ja till denna inbjudan, klicka på följande länk:" notify_project_author_when_collaborator_valid: - subject: "New collaborator in your project" + subject: "Ny medarbetare i ditt projekt" body: - the_member: "the user" - accepted_your_invitation_to_take_part_in_the_project: "has accepted your invitation to join your project:" + the_member: "användaren" + accepted_your_invitation_to_take_part_in_the_project: "har accepterat din inbjudan att gå med i ditt projekt:" notify_user_training_valid: - subject: "Your training has been validated" + subject: "Din utbildning har validerats" body: - your_training: "Your training" - has_been_validated: "has been validated" + your_training: "Din utbildning" + has_been_validated: "har validerats" notify_member_subscribed_plan: - subject: "Your subscription has been successfully purchased" + subject: "Din prenumeration har köpts" body: - plan_subscribed_html: "You have subscribed the plan: %{PLAN}." - rolling_subscription_stops_on: "Your subscription will end %{DURATION} after your first training. Otherwise, it will stop on %{DATE}." - subscription_stops_on: "Your subscription will end on %{DATE}." + plan_subscribed_html: "Du har prenumererat på planen: %{PLAN}." + rolling_subscription_stops_on: "Din prenumeration avslutas %{DURATION} efter din första utbildning. Annars kommer den att sluta på %{DATE}." + subscription_stops_on: "Din prenumeration avslutas den %{DATE}." notify_member_create_reservation: - subject: "Your reservation has been successfully saved" + subject: "Din bokning har sparats" body: - reservation_saved_html: "You reservation %{RESERVATION} has been successfully saved" - your_reserved_slots: "Your reserved slots are:" + reservation_saved_html: "Din bokning %{RESERVATION} har sparats" + your_reserved_slots: "Dina bokade platser är:" notify_member_pre_booked_reservation: - subject: "Your pre-registration has been successfully saved" + subject: "Din föranmälan har sparats" body: - reservation_saved_html: "You pre-registration %{RESERVATION} has been successfully saved" - your_reserved_slots: "Your pre-booked slots are:" - reservation_warning: "This email does not count as registration to %{RESERVATION}.
You will receive another email to confirm or deny your request." + reservation_saved_html: "Din föranmälan %{RESERVATION} har sparats" + your_reserved_slots: "Dina förbokade platser är:" + reservation_warning: "Detta mail räknas inte som registrering till %{RESERVATION}.
Du kommer att få ett annat e-postmeddelande för att bekräfta eller neka din begäran." notify_member_subscribed_plan_is_changed: - subject: "Your subscription has been updated" + subject: "Din prenumeration har uppdaterats" body: - new_plan_html: "You have changed your plan to %{PLAN}." + new_plan_html: "Du har ändrat din plan till %{PLAN}." notify_admin_member_create_reservation: - subject: "New reservation" + subject: "Ny Bokning" body: - member_reserved_html: "User %{NAME} has reserved %{RESERVABLE}." - reserved_slots: "Reserved slots are:" + member_reserved_html: "Användare %{NAME} har bokat %{RESERVABLE}." + reserved_slots: "Bokade platser är:" notify_admin_member_pre_booked_reservation: - subject: "New pre-registration" + subject: "Ny föranmälan" body: - member_reserved_html: "User %{NAME} has pre-reserved %{RESERVABLE}." - reserved_slots: "Pre-reserved slots are:" + member_reserved_html: "Användare %{NAME} har förbokat %{RESERVABLE}." + reserved_slots: "Förbokade platser är:" notify_member_slot_is_modified: - subject: "Your reservation slot has been successfully changed" + subject: "Din bokning har sparats" body: - reservation_changed_to: "Your reservation slot has been changed to:" - previous_date: "Previous date:" + reservation_changed_to: "Din bokning har ändrats till:" + previous_date: "Tidigare datum:" notify_admin_slot_is_modified: - subject: "A reservation slot has been modified" + subject: "En plats har ändrats" body: - slot_modified: "User %{NAME} had modified his reservation slot" - new_date: "New slot" - old_date: "Previous slot" + slot_modified: "Användare %{NAME} hade ändrat sin plats" + new_date: "Ny plats" + old_date: "Föregående plats" notify_admin_when_user_is_created: - subject: "A user account has been created" + subject: "Användarkonto har skapats" body: - new_account_created: "A new user account has been created on the website:" - user_of_group_html: "The user has registered in the group %{GROUP}" - account_for_organization: "This account manage an organization:" + new_account_created: "Ett nytt användarkonto har skapats på webbplatsen:" + user_of_group_html: "Användaren har registrerat sig i gruppen %{GROUP}" + account_for_organization: "Detta konto företräder en organisation:" notify_admin_child_created: - subject: "A user's child has been created" + subject: "En användares barn har lagts till" body: - new_child_created: "A new user's child has been created on the website" + new_child_created: "Ett nytt barn har lagts till på webbplatsen" notify_admin_subscribed_plan: - subject: "A subscription has been purchased" + subject: "En prenumeration har köpts" body: - plan_subscribed_html: "A plan %{PLAN} has been subscribed by user %{NAME}." + plan_subscribed_html: "En plan %{PLAN} har prenumererats på av användaren %{NAME}." notify_member_invoice_ready: - subject: "Your FabLab's invoice" + subject: "Din FabLabfaktura" body: - please_find_attached_html: "Please find as attached file your invoice from {DATE}, with an amount of {AMOUNT} concerning your {TYPE, select, Reservation{reservation} OrderItem{order} other{subscription}}." #messageFormat interpolation - invoice_in_your_dashboard_html: "You can access your invoice in %{DASHBOARD} on the Fab Lab website." - your_dashboard: "your dashboard" + please_find_attached_html: "Som bifogad fil hittar du din faktura från {DATE}med ett belopp på {AMOUNT} för din {TYPE, select, Reservation{reservation} OrderItem{order} other{prenumeration}}." #messageFormat interpolation + invoice_in_your_dashboard_html: "Du kan komma åt din faktura i %{DASHBOARD} på Fab Labs webbplats." + your_dashboard: "din kontrollpanel" notify_member_reservation_reminder: - subject: "Reservation reminder" + subject: "Bokningspåminnelse" body: - this_is_a_reminder_about_your_reservation_RESERVABLE_to_be_held_on_DATE_html: "This is a reminder about your reservation %{RESERVABLE} to be held on %{DATE}" - this_reservation_concerns_the_following_slots: "This reservation concerns the following slots:" + this_is_a_reminder_about_your_reservation_RESERVABLE_to_be_held_on_DATE_html: "Detta är en påminnelse om din bokning %{RESERVABLE} som hålls på %{DATE}" + this_reservation_concerns_the_following_slots: "Denna bokning gäller följande platser:" notify_member_avoir_ready: - subject: "Your FabLab's refund invoice" + subject: "Din FabLabkreditnota" body: - please_find_attached_html: "Please find as attached file your refund invoice from {DATE}, with an amount of {AMOUNT} concerning your {TYPE, select, Reservation{reservation} WalletTransaction{wallet credit} other{subscription}}." #messageFormat interpolation + please_find_attached_html: "Som bifogad fil hittar du din faktura från {DATE}med ett belopp på {AMOUNT} för din {TYPE, select, Reservation{reservation} WalletTransaction{wallet credit} other{subscription}}." #messageFormat interpolation invoice_in_your_dashboard_html: "You can access your refund invoice in %{DASHBOARD} on the Fab Lab website." your_dashboard: "your dashboard" notify_member_subscription_will_expire_in_7_days: diff --git a/config/locales/sv.yml b/config/locales/sv.yml index a0c9acceb..d171bde7d 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -2,748 +2,748 @@ sv: #subscription plan duration duration: year: - one: 'one year' - other: '%{count} years' + one: 'ett år' + other: '%{count} år' month: - one: 'one month' - other: '%{count} months' + one: 'en månad' + other: '%{count} månader' week: - one: 'one week' - other: '%{count} weeks' + one: 'en vecka' + other: '%{count} veckor' activerecord: attributes: product: - amount: "The price" + amount: "Priset" slug: "URL" errors: #CarrierWave messages: - carrierwave_processing_error: "failed to be processed" - carrierwave_integrity_error: "is not of an allowed file type" - carrierwave_download_error: "could not be downloaded" - extension_whitelist_error: "You are not allowed to upload %{extension} files, allowed types: %{allowed_types}" - extension_blacklist_error: "You are not allowed to upload %{extension} files, prohibited types: %{prohibited_types}" - content_type_whitelist_error: "You are not allowed to upload %{content_type} files, allowed types: %{allowed_types}" - rmagick_processing_error: "Failed to manipulate with rmagick, maybe it is not an image?" - mime_types_processing_error: "Failed to process file with MIME::Types, maybe not valid content-type?" - mini_magick_processing_error: "Failed to manipulate the file, maybe it is not an image?" - wrong_size: "is the wrong size (should be %{file_size})" - size_too_small: "is too small (should be at least %{file_size})" - size_too_big: "is too big (should be at most %{file_size})" - export_not_found: "Requested export was not found. It was probably deleted, please generate a new export." - percentage_out_of_range: "Percentage must be included between 0 and 100" - cannot_be_blank_at_same_time: "cannot be blank when %{field} is blank too" - cannot_be_in_the_past: "cannot be in the past" - cannot_be_before_previous_value: "cannot be before the previous value" - cannot_overlap: "can't overlap an existing accounting period" - cannot_encompass: "can't encompass an existing accounting period" - in_closed_period: "can't be within a closed accounting period" - invalid_footprint: "invoice's checksum is invalid" - end_before_start: "The end date can't be before the start date. Pick a date after %{START}" - invalid_duration: "The allowed duration must be between 1 day and 1 year. Your period is %{DAYS} days long." - must_be_in_the_past: "The period must be strictly prior to today's date." - registration_disabled: "Registration is disabled" - undefined_in_store: "must be defined to make the product available in the store" - gateway_error: "Payement gateway error: %{MESSAGE}" - gateway_amount_too_small: "Payments under %{AMOUNT} are not supported. Please order directly at the reception." - gateway_amount_too_large: "Payments above %{AMOUNT} are not supported. Please order directly at the reception." - product_in_use: "This product have already been ordered" - slug_already_used: "is already used" - birthday_less_than_18_years_ago: "Birthday must be under 18 years ago" + carrierwave_processing_error: "misslyckades att bearbetas" + carrierwave_integrity_error: "är inte av en tillåten filtyp" + carrierwave_download_error: "kunde inte laddas ner" + extension_whitelist_error: "Du kan inte ladda upp %{extension} filer, tillåtna typer: %{allowed_types}" + extension_blacklist_error: "Du kan inte ladda upp %{extension} filer, förbjudna typer: %{prohibited_types}" + content_type_whitelist_error: "Du kan inte ladda upp %{content_type} filer, tillåtna typer: %{allowed_types}" + rmagick_processing_error: "Misslyckades att redigera med rmagick, kanske är det inte en bild?" + mime_types_processing_error: "Det gick inte att bearbeta filen med MIME::Types, kanske inte giltig innehållstyp?" + mini_magick_processing_error: "Misslyckades att redigera filen, kanske är det inte en bild?" + wrong_size: "är fel storlek (ska vara %{file_size})" + size_too_small: "är för liten (bör vara minst %{file_size})" + size_too_big: "är för stor (bör vara som mest %{file_size})" + export_not_found: "Begärd export hittades inte. Det har förmodligen tagits bort, vänligen generera en ny export." + percentage_out_of_range: "Procent måste anges mellan 0 och 100" + cannot_be_blank_at_same_time: "kan inte vara tomt när %{field} är tomt också" + cannot_be_in_the_past: "kan inte vara i det förflutna" + cannot_be_before_previous_value: "kan inte vara innan föregående värde" + cannot_overlap: "kan inte överlappa en befintlig redovisningsperiod" + cannot_encompass: "kan inte omfatta en befintlig redovisningsperiod" + in_closed_period: "kan inte vara inom en stängd redovisningsperiod" + invalid_footprint: "fakturans kontrollsumma är ogiltig" + end_before_start: "Slutdatumet kan inte vara före startdatumet. Välj ett datum efter %{START}" + invalid_duration: "Den tillåtna perioden måste vara mellan 1 dag och 1 år. Din period är %{DAYS} dagar lång." + must_be_in_the_past: "Perioden måste vara strikt innan dagens datum." + registration_disabled: "Registrering inaktiverad" + undefined_in_store: "måste definieras för att göra produkten tillgänglig i butiken" + gateway_error: "Fel hos betalningsleverantör: %{MESSAGE}" + gateway_amount_too_small: "Betalningar under %{AMOUNT} stöds inte. Vänligen beställ direkt i receptionen." + gateway_amount_too_large: "Betalningar över %{AMOUNT} stöds inte. Vänligen beställ direkt i receptionen." + product_in_use: "Denna produkt har redan beställts" + slug_already_used: "används redan" + birthday_less_than_18_years_ago: "Födelsedag måste vara mindre än 18 år sedan" coupon: - code_format_error: "only caps letters, numbers, and dashes are allowed" + code_format_error: "bara stora bokstäver, siffror och bindestreck är tillåtna" apipie: - api_documentation: "API Documentation" - code: "HTTP code" + api_documentation: "API-dokumentation" + code: "HTTP-kod" #error messages when importing an account from an SSO omniauth: - email_already_linked_to_another_account_please_input_your_authentication_code: "E-mail address \"%{OLD_MAIL}\" is already linked to another account, please input your authentication code." - your_username_is_already_linked_to_another_account_unable_to_update_it: "Your username (%{USERNAME}) is already linked to another account, unable to update it." - your_email_address_is_already_linked_to_another_account_unable_to_update_it: "Your e-mail address (%{EMAIL}) is already linked to another account, unable to update it." - this_account_is_already_linked_to_an_user_of_the_platform: "This %{NAME} account is already linked to an user of the platform." + email_already_linked_to_another_account_please_input_your_authentication_code: "E-postadress \"%{OLD_MAIL}\" är redan länkad till ett annat konto, vänligen ange din autentiseringskod." + your_username_is_already_linked_to_another_account_unable_to_update_it: "Ditt användarnamn (%{USERNAME}) är redan kopplat till ett annat konto, det gick inte att uppdatera det." + your_email_address_is_already_linked_to_another_account_unable_to_update_it: "Din e-postadress (%{EMAIL}) är redan kopplad till ett annat konto, det gick inte att uppdatera det." + this_account_is_already_linked_to_an_user_of_the_platform: "Detta %{NAME} konto är redan länkat till en användare av plattformen." #availability slots in the calendar availabilities: - not_available: "Not available" - reserving: "I'm reserving" - i_ve_reserved: "I've reserved" - blocked: "Blocked" - length_must_be_slot_multiple: "must be at least %{MIN} minutes after the start date" - must_be_associated_with_at_least_1_machine: "must be associated with at least 1 machine" - deleted_user: "Deleted user" + not_available: "Inte tillgänglig" + reserving: "Jag bokar" + i_ve_reserved: "Jag har bokat" + blocked: "Blockerad" + length_must_be_slot_multiple: "måste vara minst %{MIN} minuter efter startdatum" + must_be_associated_with_at_least_1_machine: "måste vara associerad med minst 1 maskin" + deleted_user: "Raderad användare" #members management members: - unable_to_change_the_group_while_a_subscription_is_running: "Unable to change the group while a subscription is running" - please_input_the_authentication_code_sent_to_the_address: "Please input the authentication code sent to the e-mail address %{EMAIL}" - your_authentication_code_is_not_valid: "Your authentication code is not valid." - current_authentication_method_no_code: "The current authentication method does not require any migration code" - requested_account_does_not_exists: "The requested account does not exist" + unable_to_change_the_group_while_a_subscription_is_running: "Det går inte att ändra gruppen medan en prenumeration är aktiv" + please_input_the_authentication_code_sent_to_the_address: "Ange autentiseringskoden som skickats till e-postadressen %{EMAIL}" + your_authentication_code_is_not_valid: "Ogiltig aktiveringskod." + current_authentication_method_no_code: "Den aktuella autentiseringsmetoden kräver ingen migreringskod" + requested_account_does_not_exists: "Det begärda kontot finns inte" #SSO external authentication authentication_providers: - local_database_provider_already_exists: 'A "Local Database" provider already exists. Unable to create another.' - matching_between_User_uid_and_API_required: "It is required to set the matching between User.uid and the API to add this provider." + local_database_provider_already_exists: 'En "lokal databas-leverantör" finns redan. Kan inte skapa en till.' + matching_between_User_uid_and_API_required: "Matchningen mellan User.uid och API behöver ställas in för att lägga till denna leverantör." #PDF invoices generation invoices: - refund_invoice_reference: "Refund invoice reference: %{REF}" - invoice_reference: "Invoice reference: %{REF}" - code: "Code: %{CODE}" - order_number: "Order #: %{NUMBER}" - invoice_issued_on_DATE: "Invoice issued on %{DATE}" - refund_invoice_issued_on_DATE: "Refund invoice issued on %{DATE}" - wallet_credit: "Wallet credit" - cancellation_of_invoice_REF: "Cancellation of invoice %{REF}" - reservation_of_USER_on_DATE_at_TIME: "Reservation of %{USER} on %{DATE} at %{TIME}" - cancellation: "Cancellation" - object: "Object:" - order_summary: "Order summary:" - details: "Details" - amount: "Amount" - subscription_extended_for_free_from_START_to_END: "Subscription extended for free - From %{START} to %{END}" - subscription_NAME_from_START_to_END: "Subscription %{NAME} - From %{START} to %{END}" - machine_reservation_DESCRIPTION: "Machine reservation - %{DESCRIPTION}" - space_reservation_DESCRIPTION: "Space reservation - %{DESCRIPTION}" - training_reservation_DESCRIPTION: "Training reservation - %{DESCRIPTION}" - event_reservation_DESCRIPTION: "Event reservation - %{DESCRIPTION}" - from_payment_schedule: "Due %{NUMBER} out of %{TOTAL}, from %{DATE}. Repayment schedule %{SCHEDULE}" - null_invoice: "Invoice at nil, billing jump following a malfunction of the Fab Manager software" + refund_invoice_reference: "Kreditnotereferens: %{REF}" + invoice_reference: "Fakturareferens: %{REF}" + code: "Kod: %{CODE}" + order_number: "Beställnings#: %{NUMBER}" + invoice_issued_on_DATE: "Faktura utfärdad den%{DATE}" + refund_invoice_issued_on_DATE: "Kreditnota utfärdad den %{DATE}" + wallet_credit: "Plånbokens krediter" + cancellation_of_invoice_REF: "Avbokning av faktura %{REF}" + reservation_of_USER_on_DATE_at_TIME: "Bokning av %{USER} på %{DATE} på %{TIME}" + cancellation: "Avbokning" + object: "Objekt:" + order_summary: "Beställningsöversikt:" + details: "Detaljer" + amount: "Belopp" + subscription_extended_for_free_from_START_to_END: "Prenumerationen förlängs kostnadsfritt - Från %{START} till %{END}" + subscription_NAME_from_START_to_END: "Prenumeration %{NAME} - Från %{START} till %{END}" + machine_reservation_DESCRIPTION: "Utrustningsbokning - %{DESCRIPTION}" + space_reservation_DESCRIPTION: "Lokalbokning - %{DESCRIPTION}" + training_reservation_DESCRIPTION: "Kursbokning - %{DESCRIPTION}" + event_reservation_DESCRIPTION: "Evenemangsbokning - %{DESCRIPTION}" + from_payment_schedule: "Att betala %{NUMBER} av %{TOTAL}, från %{DATE}. Återbetalningsschema %{SCHEDULE}" + null_invoice: "Faktura på noll, fakturering hoppades över efter ett fel i Fab Manager programvaran" full_price_ticket: - one: "One full price ticket" - other: "%{count} full price tickets" + one: "En fullprisbiljett" + other: "%{count} biljetter till fullt priset" other_rate_ticket: - one: "One %{NAME} ticket" - other: "%{count} %{NAME} tickets" - coupon_CODE_discount_of_DISCOUNT: "Coupon {CODE}: discount of {DISCOUNT}{TYPE, select, percent_off{%} other{}}" #messageFormat interpolation - total_including_all_taxes: "Total incl. all taxes" - VAT: "VAT" - including_VAT_RATE: "Including %{NAME} %{RATE}% of %{AMOUNT}" - including_total_excluding_taxes: "Including Total excl. taxes" - including_amount_payed_on_ordering: "Including amount payed on ordering" - total_amount: "Total amount" - refund_on_DATE: "Refund on %{DATE}" - by_card_online_payment: "by card (online payment)" - by_cheque: "by cheque" - by_transfer: "by transfer" - by_cash: "by cash" - by_wallet: "by wallet" - no_refund: "No refund" - settlement_by_debit_card: "Settlement by debit card" - settlement_done_at_the_reception: "Settlement done at the reception" - settlement_by_wallet: "Settlement by wallet" - on_DATE_at_TIME: "on %{DATE} at %{TIME}," - for_an_amount_of_AMOUNT: "for an amount of %{AMOUNT}" - on_DATE_from_START_to_END: "On %{DATE} from %{START} to %{END}" #eg: on feb. 7 from 7AM to 9AM - from_STARTDATE_to_ENDDATE_from_STARTTIME_to_ENDTIME: "From %{STARTDATE} to %{ENDDATE}, from %{STARTTIME} to %{ENDTIME}" #eg: from feb. 7 to feb. 10, from 6PM to 10PM - subscription_of_NAME_for_DURATION_starting_from_DATE: "Subscription of %{NAME} for %{DURATION} starting from %{DATE}" - subscription_of_NAME_extended_starting_from_STARTDATE_until_ENDDATE: "Subscription of %{NAME} extended (Free days) starting from %{STARTDATE} until %{ENDDATE}" - and: 'and' - invoice_text_example: "Our association is not subject to VAT" - error_invoice: "Erroneous invoice. The items below ware not booked. Please contact the FabLab for a refund." - prepaid_pack: "Prepaid pack of hours" - pack_item: "Pack of %{COUNT} hours for the %{ITEM}" - order: "Your order on the store" - unable_to_find_pdf: "We cannot find your invoice. If you ordered recently, it may have not been generated yet. Please retry in a moment." + one: "En %{NAME} biljett" + other: "%{count} %{NAME} biljetter" + coupon_CODE_discount_of_DISCOUNT: "Kupong {CODE}: rabatt på {DISCOUNT}{TYPE, select, percent_off{%} other{}}" #messageFormat interpolation + total_including_all_taxes: "Totalt inkl. moms" + VAT: "Moms" + including_VAT_RATE: "Inklusive %{NAME} %{RATE}% av %{AMOUNT}" + including_total_excluding_taxes: "Totalt exkl. moms" + including_amount_payed_on_ordering: "Inklusive belopp som betalades vid beställning" + total_amount: "Totalt belopp" + refund_on_DATE: "Återbetalning den %{DATE}" + by_card_online_payment: "med kort (onlinebetalning)" + by_cheque: "med check" + by_transfer: "med överföring" + by_cash: "med kontanter" + by_wallet: "med plånbok" + no_refund: "Ingen återbetalning" + settlement_by_debit_card: "Betalning med betalkort" + settlement_done_at_the_reception: "Betalning görs i receptionen" + settlement_by_wallet: "Betalning med plånbok" + on_DATE_at_TIME: "den %{DATE} kl %{TIME}," + for_an_amount_of_AMOUNT: "för ett belopp på %{AMOUNT}" + on_DATE_from_START_to_END: "Den %{DATE} från %{START} till %{END}" #eg: on feb. 7 from 7AM to 9AM + from_STARTDATE_to_ENDDATE_from_STARTTIME_to_ENDTIME: "Från %{STARTDATE} till %{ENDDATE}, från %{STARTTIME} till %{ENDTIME}" #eg: from feb. 7 to feb. 10, from 6PM to 10PM + subscription_of_NAME_for_DURATION_starting_from_DATE: "Prenumeration på %{NAME} för %{DURATION} med start från %{DATE}" + subscription_of_NAME_extended_starting_from_STARTDATE_until_ENDDATE: "Prenumeration på %{NAME} förlängd (fria dagar) från %{STARTDATE} till %{ENDDATE}" + and: 'och' + invoice_text_example: "Vår förening är inte momspliktig" + error_invoice: "Felaktig faktura. Objekt nedan är inte bokade. Kontakta oss för återbetalning." + prepaid_pack: "Förbetalda timmar" + pack_item: "Paketet %{COUNT} timmar för %{ITEM}" + order: "Din beställning i butiken" + unable_to_find_pdf: "Vi kan inte hitta din faktura. Om du beställde den senaste tiden kanske den inte har genererats ännu. Försök igen strax." #PDF payment schedule generation payment_schedules: - schedule_reference: "Payment schedule reference: %{REF}" - schedule_issued_on_DATE: "Schedule issued on %{DATE}" - object: "Object: Payment schedule for %{ITEM}" - subscription_of_NAME_for_DURATION_starting_from_DATE: "the subscription of %{NAME} for %{DURATION} starting from %{DATE}" - deadlines: "Table of your deadlines" - deadline_date: "Payment date" - deadline_amount: "Amount including tax" - total_amount: "Total amount" - settlement_by_METHOD: "Debits will be made by {METHOD, select, card{card} transfer{bank transfer} other{check}} for each deadlines." - settlement_by_wallet: "%{AMOUNT} will be debited from your wallet to settle the first deadline." + schedule_reference: "Referens till betalningsschema: %{REF}" + schedule_issued_on_DATE: "Schemat utfärdat på %{DATE}" + object: "Objekt: Betalningsschema för %{ITEM}" + subscription_of_NAME_for_DURATION_starting_from_DATE: "prenumeration på %{NAME} för %{DURATION} med start från %{DATE}" + deadlines: "Lista över dina deadlines" + deadline_date: "Betalningsdatum" + deadline_amount: "Belopp inklusive moms" + total_amount: "Totalt belopp" + settlement_by_METHOD: "Debitering kommer att göras från {METHOD, select, card{kort} transfer{banköverföring} other{kontant}} för varje deadline." + settlement_by_wallet: "%{AMOUNT} kommer att debiteras från din plånbok för att reglera den första deadlinen." #CVS accounting export (columns headers) accounting_export: - journal_code: "Journal code" - date: "Entry date" - account_code: "Account code" - account_label: "Account label" - piece: "Document" - line_label: "Entry label" - debit_origin: "Origin debit" - credit_origin: "Origin credit" - debit_euro: "Euro debit" - credit_euro: "Euro credit" - lettering: "Lettering" - VAT: 'VAT' + journal_code: "Journalkod" + date: "Transaktionsdatum" + account_code: "Kontokod" + account_label: "Kontonamn" + piece: "Dokument" + line_label: "Postens etikett" + debit_origin: "Ursprungsdebitering" + credit_origin: "Ursprungskredititering" + debit_euro: "Euro debitering" + credit_euro: "Euro kreditering" + lettering: "Textning" + VAT: 'Moms' accounting_summary: - subscription_abbreviation: "subscr." - Machine_reservation_abbreviation: "machine reserv." - Training_reservation_abbreviation: "training reserv." - Event_reservation_abbreviation: "event reserv." - Space_reservation_abbreviation: "space reserv." - wallet_abbreviation: "wallet" - shop_order_abbreviation: "shop order" + subscription_abbreviation: "pren." + Machine_reservation_abbreviation: "maskin reserv." + Training_reservation_abbreviation: "utbildning reserv." + Event_reservation_abbreviation: "evenemang reserv." + Space_reservation_abbreviation: "lokal reserv." + wallet_abbreviation: "plånbok" + shop_order_abbreviation: "butiksbeställning" vat_export: - start_date: "Start date" - end_date: "End date" - vat_rate: "%{NAME} rate" - amount: "Total amount" + start_date: "Startdatum" + end_date: "Slutdatum" + vat_rate: "%{NAME} procentsats" + amount: "Totalt belopp" #training availabilities trainings: - i_ve_reserved: "I've reserved" + i_ve_reserved: "Jag har bokat" completed: "Full" - refund_for_auto_cancel: "This training session was cancelled due to an insufficient number of participants." + refund_for_auto_cancel: "Utbildningen avbröts på grund av otillräckligt antal deltagare." #error messages when updating an event events: - error_deleting_reserved_price: "Unable to delete the requested price because it is associated with some reservations" - other_error: "An unexpected error occurred while updating the event" + error_deleting_reserved_price: "Det går inte att ta bort det begärda priset eftersom det är associerat med vissa bokningar" + other_error: "Ett oväntat fel inträffade när evenemanget uppdaterades" #event duration - from_STARTDATE_to_ENDDATE: "From %{STARTDATE} to %{ENDDATE}," - from_STARTTIME_to_ENDTIME: "from %{STARTTIME} to %{ENDTIME}" + from_STARTDATE_to_ENDDATE: "Från %{STARTDATE} till %{ENDDATE}," + from_STARTTIME_to_ENDTIME: "från %{STARTTIME} till %{ENDTIME}" #members list export to EXCEL format export_members: - members: "Members" + members: "Medlemmar" id: "ID" - external_id: "External ID" - surname: "Surname" - first_name: "First name" - email: "E-mail" - newsletter: "Newsletter" - last_login: "Last login" - gender: "Gender" - age: "Age" - address: "Address" - phone: "Phone" - website: "Website" - job: "Job" - interests: "Interests" - cad_software_mastered: "CAD Softwares mastered" - group: "Group" - subscription: "Subscription" - subscription_end_date: "Subscription end date" - validated_trainings: "Validated trainings" - tags: "Tags" - number_of_invoices: "Number of invoices" - projects: "Projects" + external_id: "Externt ID" + surname: "Efternamn" + first_name: "Förnamn" + email: "E-postadress" + newsletter: "Nyhetsbrev" + last_login: "Senaste inloggning" + gender: "Kön" + age: "Ålder" + address: "Adress" + phone: "Telefon" + website: "Webbsida" + job: "Jobb" + interests: "Intressen" + cad_software_mastered: "Färdigheter" + group: "Grupp" + subscription: "Prenumeration" + subscription_end_date: "Slutdatum för prenumeration" + validated_trainings: "Validerade utbildningar" + tags: "Taggar" + number_of_invoices: "Antal fakturor" + projects: "Projekt" facebook: "Facebook" twitter: "Twitter" - echo_sciences: "Echosciences" - organization: "Organization" - organization_address: "Organization address" - note: "Note" + echo_sciences: "Naturvetenskap" + organization: "Organisation" + organization_address: "Organisationsadress" + note: "Anteckning" man: "Man" - woman: "Woman" - without_subscriptions: "Without subscriptions" + woman: "Kvinna" + without_subscriptions: "Utan prenumerationer" #machines/trainings/events reservations list to EXCEL format export_reservations: - reservations: "Reservations" - customer_id: "Customer ID" - customer: "Customer" - email: "E-mail" - reservation_date: "Reservation date" - reservation_type: "Reservation type" - reservation_object: "Reservation object" - slots_number_hours_tickets: "Slots number (hours/tickets)" - payment_method: "Payment method" - local_payment: "Payment at the reception" - online_payment: "Online payment" - deleted_user: "Deleted user" - coupon: "Coupon used" + reservations: "Bokningar" + customer_id: "Kund-ID" + customer: "Kund" + email: "E-postadress" + reservation_date: "Bokningsdatum" + reservation_type: "Typ av bokning" + reservation_object: "Bokningsobjekt" + slots_number_hours_tickets: "Antal platser (timmar/biljetter)" + payment_method: "Betalningsmetod" + local_payment: "Betalning i receptionen" + online_payment: "Onlinebetalning" + deleted_user: "Raderad användare" + coupon: "Kupong använd" #subscriptions list export to EXCEL format export_subscriptions: - subscriptions: "Subscriptions" + subscriptions: "Prenumerationer" id: "ID" - customer: "Customer" - email: "E-mail" - subscription: "Subscription" + customer: "Kund" + email: "E-postadress" + subscription: "Prenumeration" period: "Period" - start_date: "Start date" - expiration_date: "Expiration date" - amount: "Amount" - local_payment: "Payment at the reception" - online_payment: "Online payment" - deleted_user: "Deleted user" + start_date: "Startdatum" + expiration_date: "Utgångsdatum" + amount: "Belopp" + local_payment: "Betalning i receptionen" + online_payment: "Onlinebetalning" + deleted_user: "Raderad användare" #reservation slots export, by type, to EXCEL format export_availabilities: - machines: "Machines" - trainings: "Trainings" - spaces: "Spaces" - events: "Events" - day_of_week: "Day of week" - date: "Date" - slot: "Slot" - machine: "Machine" - training: "Training" - space: "Space" - event: "Event" - reservations: "Reservations" - available_seats: "Available seats" + machines: "Utrustning" + trainings: "Utbildningar" + spaces: "Lokaler" + events: "Evenemang" + day_of_week: "Veckodag" + date: "Datum" + slot: "Lucka" + machine: "Utrustning" + training: "Utbildning" + space: "Lokal" + event: "Evenemang" + reservations: "Bokningar" + available_seats: "Lediga platser" reservation_ics: - description_slot: "You have booked %{COUNT} slots of %{ITEM}" - description_training: "You have booked a %{TYPE} training" - description_event: "You have booked %{NUMBER} tickets for this event" - alarm_summary: "Remind your reservation" + description_slot: "Du har bokat %{COUNT} platser i %{ITEM}" + description_training: "Du har bokat en %{TYPE} utbildning" + description_event: "Du har bokat %{NUMBER} biljetter till detta evenemang" + alarm_summary: "Påminnelse om din bokning" roles: - member: "Member" - manager: "Manager" - admin: "Administrator" + member: "Medlem" + manager: "Ansvarig" + admin: "Administratör" api: #internal app notifications notifications: - deleted_user: "Deleted user" + deleted_user: "Raderad användare" notify_admin_abuse_reported: - an_abuse_was_reported_on_TYPE_ID_NAME_html: "An abuse was reported on %{TYPE} %{ID}: %{NAME}." + an_abuse_was_reported_on_TYPE_ID_NAME_html: "Felaktig användning rapporterades på %{TYPE} %{ID}: %{NAME}." notify_admin_member_create_reservation: - a_RESERVABLE_reservation_was_made_by_USER_html: "A %{RESERVABLE} reservation was made by %{USER}." + a_RESERVABLE_reservation_was_made_by_USER_html: "En %{RESERVABLE} bokning gjordes av %{USER}." notify_admin_member_pre_booked_reservation: - a_RESERVABLE_reservation_was_made_by_USER_html: "A %{RESERVABLE} pre-registration was made by %{USER}." + a_RESERVABLE_reservation_was_made_by_USER_html: "En %{RESERVABLE} föranmälan gjordes av %{USER}." notify_admin_profile_complete: - account_imported_from_PROVIDER_UID_has_completed_its_information_html: "Account imported from %{PROVIDER} (%{UID}) has completed its information." + account_imported_from_PROVIDER_UID_has_completed_its_information_html: "Konto importerat från %{PROVIDER} (%{UID}) har överfört sin information." notify_admin_slot_is_canceled: - USER_s_reservation_on_the_DATE_was_cancelled_remember_to_generate_a_refund_invoice_if_applicable_html: "%{USER}'s reservation, on the %{DATE}, was cancelled. Remember to generate a refund invoice if applicable." + USER_s_reservation_on_the_DATE_was_cancelled_remember_to_generate_a_refund_invoice_if_applicable_html: "%{USER}s bokning, den %{DATE}, avbröts. Kom ihåg att generera en återbetalningsfaktura om det behövs." notify_admin_slot_is_modified: - a_booking_slot_was_modified: "A booking slot was modified." + a_booking_slot_was_modified: "En bokningsplats ändrades." notify_admin_subscribed_plan: - subscription_PLAN_has_been_subscribed_by_USER_html: "Subscription %{PLAN} has been subscribed by %{USER}." + subscription_PLAN_has_been_subscribed_by_USER_html: "Prenumerationen %{PLAN} har tecknats av %{USER}." notify_admin_subscription_canceled: - USER_s_subscription_has_been_cancelled: "%{USER}'s subscription has been cancelled." + USER_s_subscription_has_been_cancelled: "%{USER} s prenumeration har avbrutits." notify_admin_subscription_extended: - subscription_PLAN_of_the_member_USER_has_been_extended_FREE_until_DATE_html: "Subscription {PLAN} of the member {USER} has been extended {FREE, select, true{for free} other{}} until {DATE}." #messageFormat interpolation + subscription_PLAN_of_the_member_USER_has_been_extended_FREE_until_DATE_html: "Prenumeration {PLAN} av medlemmen {USER} har förlängts {FREE, select, true{gratis} other{}} tills {DATE}." #messageFormat interpolation notify_admin_subscription_is_expired: - USER_s_subscription_has_expired: "%{USER}'s subscription has expired." + USER_s_subscription_has_expired: "%{USER} s prenumeration har löpt ut." notify_admin_subscription_will_expire_in_7_days: - USER_s_subscription_will_expire_in_7_days: "%{USER}'s subscription will expire in 7 days." + USER_s_subscription_will_expire_in_7_days: "%{USER} s prenumeration löper ut om 7 dagar." notify_admin_training_auto_cancelled: - auto_cancelled_training: "The %{TRAINING} training session scheduled for %{DATE}, has been automatically canceled due to an insufficient number of participants." - auto_refund: "The members were automatically refunded on their wallet." - manual_refund: "Please refund each members." + auto_cancelled_training: "Utbildningen %{TRAINING} som är schemalagd för %{DATE}, har avbrutits automatiskt på grund av otillräckligt antal deltagare." + auto_refund: "Medlemmarna har återbetalats automatiskt till sin plånbok." + manual_refund: "Vänligen återbetala varje medlem." notify_admin_user_group_changed: - user_NAME_changed_his_group_html: "User {NAME} changed group." #messageFormat interpolation + user_NAME_changed_his_group_html: "Användare {NAME} ändrade grupp." #messageFormat interpolation notify_admin_user_merged: - user_NAME_has_merged_his_account_with_the_one_imported_from_PROVIDER_UID_html: "{NAME}'s account was merged with the one imported from {PROVIDER} ({%UID})." #messageFormat interpolation + user_NAME_has_merged_his_account_with_the_one_imported_from_PROVIDER_UID_html: "{NAME}s konto slogs samman med det importerade från {PROVIDER} ({%UID})." #messageFormat interpolation notify_admin_when_project_published: - project_NAME_has_been_published_html: "Project
%{NAME} has been published." + project_NAME_has_been_published_html: "Projekt %{NAME} har publicerats." notify_admin_when_user_is_created: - a_new_user_account_has_been_created_NAME_EMAIL_html: "A new user account has been created: %{NAME} <%{EMAIL}>." + a_new_user_account_has_been_created_NAME_EMAIL_html: "Ett nytt användarkonto har skapats: %{NAME} <%{EMAIL}>." notify_admin_child_created: - a_new_child_has_been_created_NAME_html: "A new child has been created: %{NAME}." + a_new_child_has_been_created_NAME_html: "Ett nytt barn har skapats: %{NAME}." notify_admin_when_user_is_imported: - a_new_user_account_has_been_imported_from_PROVIDER_UID_html: "A new user account has been imported from: %{PROVIDER} (%{UID})." + a_new_user_account_has_been_imported_from_PROVIDER_UID_html: "Ett nytt användarkonto har importerats från: %{PROVIDER} (%{UID})." notify_member_create_reservation: - your_reservation_RESERVABLE_was_successfully_saved_html: "Your reservation %{RESERVABLE} was successfully saved." + your_reservation_RESERVABLE_was_successfully_saved_html: "Din bokning %{RESERVABLE} har sparats." notify_member_pre_booked_reservation: - your_reservation_RESERVABLE_was_successfully_saved_html: "Your pre-registration %{RESERVABLE} was successfully saved." + your_reservation_RESERVABLE_was_successfully_saved_html: "Din föranmälan %{RESERVABLE} har sparats." notify_member_reservation_reminder: - reminder_you_have_a_reservation_RESERVABLE_to_be_held_on_DATE_html: "Reminder: You have a reservation %{RESERVABLE} to be held on %{DATE}" + reminder_you_have_a_reservation_RESERVABLE_to_be_held_on_DATE_html: "Påminnelse: Du har en bokning %{RESERVABLE} som hålls den %{DATE}" notify_member_slot_is_canceled: - your_reservation_RESERVABLE_of_DATE_was_successfully_cancelled: "Your reservation %{RESERVABLE} of %{DATE} was successfully cancelled." + your_reservation_RESERVABLE_of_DATE_was_successfully_cancelled: "Din bokning %{RESERVABLE} den %{DATE} har avbrutits." notify_member_slot_is_modified: - your_reservation_slot_was_successfully_changed: "Your reservation slot was successfully changed." + your_reservation_slot_was_successfully_changed: "Din bokning har sparats." notify_member_subscribed_plan: - you_have_subscribed_to_PLAN_html: "You have subscribed to %{PLAN}." + you_have_subscribed_to_PLAN_html: "Du har prenumererat på %{PLAN}." notify_member_subscribed_plan_is_changed: - you_have_changed_your_subscription_to_PLAN_html: "You have changed your subscription to %{PLAN}." + you_have_changed_your_subscription_to_PLAN_html: "Du har ändrat din prenumeration till %{PLAN}." notify_member_subscription_canceled: - your_subscription_PLAN_was_successfully_cancelled_html: "Your subscription %{PLAN} was successfully cancelled." + your_subscription_PLAN_was_successfully_cancelled_html: "Ditt prenumeration %{PLAN} har avbrutits." notify_member_subscription_extended: - your_subscription_PLAN_has_been_extended_FREE_until_DATE_html: "Your subscription {PLAN} has been extended {FREE, select, true{for free} other{}} until {DATE}." #messageFormat interpolation + your_subscription_PLAN_has_been_extended_FREE_until_DATE_html: "Din prenumeration {PLAN} har förlängts {FREE, select, true{kostnadsfritt} other{}} tills {DATE}." #messageFormat interpolation notify_member_subscription_is_expired: - your_subscription_has_expired: "Your subscription has expired." + your_subscription_has_expired: "Din prenumeration har löpt ut." notify_member_subscription_will_expire_in_7_days: - your_subscription_will_expire_in_7_days: "Your subscription will expire in 7 days." + your_subscription_will_expire_in_7_days: "Din prenumeration upphör om 7 dagar." notify_member_training_authorization_expired: - training_authorization_revoked: "Your authorization to use %{MACHINES} has been revoked because it has expired." + training_authorization_revoked: "Ditt tillstånd att använda %{MACHINES} har återkallats eftersom det har löpt ut." notify_member_training_auto_cancelled: - auto_cancelled_training: "The %{TRAINING} training session scheduled for %{DATE}, has been canceled due to an insufficient number of participants." - auto_refund: "You were refunded on your wallet." + auto_cancelled_training: "Utbildningen %{TRAINING} som är schemalagd för %{DATE}, har avbrutits automatiskt på grund av otillräckligt antal deltagare." + auto_refund: "Du har återbetalats till din plånbok." notify_member_training_invalidated: - invalidated: "Your authorization to use %{MACHINES} has been invalidated due to a lack of reservations." + invalidated: "Ditt tillstånd att använda %{MACHINES} har ogiltigförklarats på grund av brist på reservationer." notify_partner_subscribed_plan: - subscription_partner_PLAN_has_been_subscribed_by_USER_html: "Partner subscription %{PLAN} has been subscribed by %{USER}." + subscription_partner_PLAN_has_been_subscribed_by_USER_html: "Partnerprenumeration %{PLAN} har prenumererats av %{USER}." notify_project_author_when_collaborator_valid: - USER_became_collaborator_of_your_project: "%{USER} became collaborator of your project:" + USER_became_collaborator_of_your_project: "%{USER} blev samarbetspartner för ditt projekt:" notify_project_collaborator_to_valid: - you_are_invited_to_collaborate_on_the_project: "You are invited to collaborate on the project:" + you_are_invited_to_collaborate_on_the_project: "Du är inbjuden att delta i projektet:" notify_user_auth_migration: - your_account_was_migrated: "You account was successfully migrated to the new authentication system." + your_account_was_migrated: "Ditt konto har migrerats till det nya autentiseringssystemet." notify_user_profile_complete: - your_profile_was_completed: "Your profile was successfully completed, you now have access to the entire platform." + your_profile_was_completed: "Din profil har färdigställts, du har nu tillgång till hela plattformen." notify_user_training_valid: - your_TRAINING_was_validated_html: "Your training %{TRAINING} was successfully validated." + your_TRAINING_was_validated_html: "Din utbildning %{TRAINING} har validerats." notify_user_user_group_changed: - your_group_has_changed: "Your group has changed." + your_group_has_changed: "Din grupp har ändrats." notify_user_when_avoir_ready: - your_avoir_is_ready_html: "Your refund invoice #%{REFERENCE}, of %{AMOUNT}, is ready. Click here to download." + your_avoir_is_ready_html: "Din kreditnota #%{REFERENCE}, av %{AMOUNT}, är klar. Klicka här för att ladda ner." notify_user_when_invoice_ready: - your_invoice_is_ready_html: "Your invoice #%{REFERENCE}, of %{AMOUNT} is ready. Click here to download." + your_invoice_is_ready_html: "Din faktura #%{REFERENCE}, av %{AMOUNT} är klar. Klicka här för att ladda ner." undefined_notification: - unknown_notification: "Unknown notification" - notification_ID_wrong_type_TYPE_unknown: "Notification %{ID} wrong (type %{TYPE} unknown)" + unknown_notification: "Okänd avisering" + notification_ID_wrong_type_TYPE_unknown: "Notifiering %{ID} fel (typ %{TYPE} okänd)" notify_user_wallet_is_credited: - your_wallet_is_credited: "Your wallet has been credited by administrator" + your_wallet_is_credited: "Din plånbok har krediterats av administratören" notify_admin_user_wallet_is_credited: - wallet_is_credited: "The wallet of member %{USER} has been credited %{AMOUNT}" + wallet_is_credited: "Plånboken för medlemmen %{USER} har krediterats %{AMOUNT}" notify_admin_export_complete: - export: "The export" - statistics_global: "of all the statistics" - statistics_account: "of the registration statistics" - statistics_event: "of statistics about events" - statistics_machine: "of statistics about machine slots" - statistics_project: "of statistics about projects" - statistics_subscription: "of subscription statistics" - statistics_training: "of statistics about trainings" - statistics_space: "of statistics about spaces" - statistics_order: "of statistics about store orders" - users_members: "of the members' list" - users_subscriptions: "of the subscriptions' list" - users_reservations: "of the reservations' list" - availabilities_index: "of the reservations availabilities" - accounting_acd: "of the accounting data to ACD" - accounting_vat: "of the collected VAT" - is_over: "is over." - download_here: "Download here" + export: "Exporten" + statistics_global: "av all statistik" + statistics_account: "av bokningsstatistiken" + statistics_event: "statistik om evenemang" + statistics_machine: "statistik om utrustningsbokningar" + statistics_project: "statistik om projekt" + statistics_subscription: "av prenumerationsstatistik" + statistics_training: "statistik om projekt" + statistics_space: "statistik om lokaler" + statistics_order: "statistik över butiksbeställningar" + users_members: "av medlemmarnas lista" + users_subscriptions: "av listan över prenumerationer" + users_reservations: "av bokningslistan" + availabilities_index: "av bokningens tillgänglighet" + accounting_acd: "av bokföringsdata till ACD" + accounting_vat: "av den ingående momsen" + is_over: "är färdig." + download_here: "Ladda ner här" notify_admin_import_complete: - import_over: "%{CATEGORY} import is over. " - members: "Members" - view_results: "View results." + import_over: "%{CATEGORY} importen är färdig. " + members: "Medlemmar" + view_results: "Visa resultat." notify_admin_low_stock_threshold: - low_stock: "Low stock for %{PRODUCT}. " - view_product: "View the product." + low_stock: "Lågt lager för %{PRODUCT}. " + view_product: "Visa produkten." notify_member_about_coupon: - enjoy_a_discount_of_PERCENT_with_code_CODE: "Enjoy a discount of %{PERCENT}% with code %{CODE}" - enjoy_a_discount_of_AMOUNT_with_code_CODE: "Enjoy a discount of %{AMOUNT} with code %{CODE}" + enjoy_a_discount_of_PERCENT_with_code_CODE: "Ta del av en rabatt på %{PERCENT}% med koden %{CODE}" + enjoy_a_discount_of_AMOUNT_with_code_CODE: "Ta del av en rabatt på %{AMOUNT}% med koden %{CODE}" notify_admin_free_disk_space: - warning_free_disk_space: "Warning: the server's available disk space is now %{AVAILABLE} MiB" + warning_free_disk_space: "Varning: serverns tillgängliga diskutrymme är nu %{AVAILABLE} MB" notify_admin_close_period_reminder: - warning_last_closed_period_over_1_year: "Please remind to periodically close your accounting periods. Last closed period ended at %{LAST_END}" - warning_no_closed_periods: "Please remind to periodically close your accounting periods. You have to close periods from %{FIRST_DATE}" + warning_last_closed_period_over_1_year: "Vänligen kom ihåg att regelbundet stänga dina redovisningsperioder. Senast stängd period avslutades på %{LAST_END}" + warning_no_closed_periods: "Vänligen kom ihåg att regelbundet stänga dina redovisningsperioder. Senaste stängd period avslutades på %{FIRST_DATE}" notify_admin_archive_complete: - archive_complete: "Data archiving from %{START} to %{END} is done. click here to download. Remember to save it on an external secured media." + archive_complete: "Dataarkivering från %{START} till %{END} är klart. klicka här för att ladda ner. Kom ihåg att spara den på ett säkert, externt medium." notify_privacy_policy_changed: - policy_updated: "Privacy policy updated." - click_to_show: "Click here to consult" + policy_updated: "Integritetspolicy uppdaterad." + click_to_show: "Klicka här för att fråga" notify_admin_refund_created: - refund_created: "A refund of %{AMOUNT} has been created for user %{USER}" + refund_created: "En återbetalning av %{AMOUNT} har skapats för användaren %{USER}" notify_user_role_update: - your_role_is_ROLE: "Your role has been changed to %{ROLE}." + your_role_is_ROLE: "Din roll har ändrats till %{ROLE}." notify_admins_role_update: - user_NAME_changed_ROLE_html: "User %{NAME} is now %{ROLE}." + user_NAME_changed_ROLE_html: "Användare %{NAME} är nu %{ROLE}." notify_admin_objects_stripe_sync: - all_objects_sync: "All data were successfully synchronized on Stripe." + all_objects_sync: "Alla data har synkroniserats till Stripe." notify_admin_order_is_paid: - order_paid_html: "A new order has been placed. View details." + order_paid_html: "En ny order har lagts till. Visa detaljer." notify_user_when_payment_schedule_ready: - your_schedule_is_ready_html: "Your payment schedule #%{REFERENCE}, of %{AMOUNT}, is ready. Click here to download." + your_schedule_is_ready_html: "Ditt betalningsschema #%{REFERENCE}, %{AMOUNT}, är klart. Klicka här för att ladda ner." notify_admin_payment_schedule_error: - schedule_error: "An error occurred for the card debit of the %{DATE} deadline, for schedule %{REFERENCE}" + schedule_error: "Ett fel uppstod för kortdebitering som löpte ut den %{DATE} för schemat %{REFERENCE}" notify_member_payment_schedule_error: - schedule_error: "An error occurred for the card debit of the %{DATE} deadline, for your schedule %{REFERENCE}" + schedule_error: "Ett fel uppstod för kortdebitering som löpte ut %{DATE}, för ditt schema %{REFERENCE}" notify_admin_payment_schedule_failed: - schedule_failed: "Failed card debit for the %{DATE} deadline, for schedule %{REFERENCE}" + schedule_failed: "Ett fel uppstod för kortdebitering som löpte ut den %{DATE} för schemat %{REFERENCE}" notify_member_payment_schedule_failed: - schedule_failed: "Failed card debit for the %{DATE} deadline, for your schedule %{REFERENCE}" + schedule_failed: "Ett fel uppstod för kortdebitering som löpte ut %{DATE}, för ditt schema %{REFERENCE}" notify_admin_payment_schedule_gateway_canceled: - schedule_canceled: "The payment schedule %{REFERENCE} was canceled by the gateway. An action is required." + schedule_canceled: "Betalningsschemat %{REFERENCE} avbröts av betalningsleverantören. En åtgärd krävs." notify_member_payment_schedule_gateway_canceled: - schedule_canceled: "Your payment schedule %{REFERENCE} was canceled by the gateway." + schedule_canceled: "Ditt betalningsschema %{REFERENCE} avbröts av betalningsleverantören." notify_admin_payment_schedule_check_deadline: - schedule_deadline: "You must cash the check for the %{DATE} deadline, for schedule %{REFERENCE}" + schedule_deadline: "Du måste betala in checken inom tidsfristen, %{DATE} för schemat %{REFERENCE}" notify_admin_payment_schedule_transfer_deadline: - schedule_deadline: "You must confirm the bank direct debit for the %{DATE} deadline, for schedule %{REFERENCE}" + schedule_deadline: "Du måste bekräfta autogiro inom tidsfristen %{DATE}, för schema %{REFERENCE}" notify_member_reservation_limit_reached: - limit_reached: "For %{DATE}, you have reached your daily limit of %{HOURS} hours of %{ITEM} reservation." + limit_reached: "För %{DATE} har du nått din dagliga gräns för %{HOURS} timmars bokning av %{ITEM}." notify_admin_user_supporting_document_files_created: - supporting_document_files_uploaded: "Supporting document uploaded by member %{NAME}." + supporting_document_files_uploaded: "Underlag uppladdat av medlemmen %{NAME}." notify_admin_user_supporting_document_files_updated: - supporting_document_files_uploaded: "Supporting document changed by member %{NAME}." + supporting_document_files_uploaded: "Underlag ändrat av medlemmen %{NAME}." notify_admin_user_child_supporting_document_files_created: - supporting_document_files_uploaded: "Child's %{NAME} supporting document uploaded." + supporting_document_files_uploaded: "Barnet %{NAME} s underlag uppladdat." notify_admin_user_child_supporting_document_files_updated: - supporting_document_files_uploaded: "Supporting document changed by child %{NAME}." + supporting_document_files_uploaded: "Underlag ändrat av barnet %{NAME}." notify_user_is_validated: - account_validated: "Your account is valid." + account_validated: "Ditt konto är giltigt." notify_user_is_invalidated: - account_invalidated: "Your account is invalid." + account_invalidated: "Ditt konto är ogiltigt." notify_user_child_is_validated: - child_validated: "Your account child is valid." + child_validated: "Ditt barns konto är giltigt." notify_user_child_is_invalidated: - child_invalidated: "Your account child is invalid." + child_invalidated: "Ditt barns konto är ogiltigt." notify_user_supporting_document_refusal: - refusal: "Your supporting documents were refused" + refusal: "Dina underlag avvisades" notify_user_supporting_document_reminder: - reminder_message: "This is a reminder for you to upload your supporting documents." + reminder_message: "Detta är en påminnelse för dig att ladda upp dina underlag." notify_admin_user_supporting_document_refusal: - refusal: "Member's supporting document %{NAME} was refused." + refusal: "Medlemmens underlag %{NAME} avvisades." notify_user_child_supporting_document_refusal: - refusal: "Your child's supporting documents were refused" + refusal: "Ditt barns underlag avvisades" notify_admin_user_child_supporting_document_refusal: - refusal: "Child's supporting document %{NAME} was refused." + refusal: "Barnets underlag %{NAME} avvisades." notify_user_order_is_ready: - order_ready: "Your command %{REFERENCE} is ready" + order_ready: "Din beställning %{REFERENCE} är redo" notify_user_order_is_canceled: - order_canceled: "Your command %{REFERENCE} is canceled" + order_canceled: "Din beställning %{REFERENCE} är avbruten" notify_user_order_is_refunded: - order_refunded: "Your command %{REFERENCE} is refunded" + order_refunded: "Din beställning %{REFERENCE} har återbetalats" notify_member_reservation_validated: - your_reservation_RESERVABLE_was_validated_html: "Your reservation %{RESERVABLE} was successfully validated." + your_reservation_RESERVABLE_was_validated_html: "Din bokning %{RESERVABLE} har validerats." notify_admin_reservation_validated: - a_RESERVABLE_reservation_was_validated_html: "A %{RESERVABLE} reservation of %{NAME} was validated." + a_RESERVABLE_reservation_was_validated_html: "En %{RESERVABLE} bokning av %{NAME} validerades." notify_member_reservation_invalidated: - your_reservation_RESERVABLE_was_invalidated_html: "Your pre-registration of %{RESERVABLE} wasn't validated." + your_reservation_RESERVABLE_was_invalidated_html: "Din föranmälan av %{RESERVABLE} validerades inte." notify_admin_reservation_invalidated: - a_RESERVABLE_reservation_was_invalidated_html: "A %{RESERVABLE} pre-registration of %{NAME} was invalidated." + a_RESERVABLE_reservation_was_invalidated_html: "En %{RESERVABLE} föranmälan av %{NAME} ogiltigförklarades." notify_user_when_child_age_will_be_18: - child_age_will_be_18_years_ago: "Your child %{NAME} will turn 18 on %{DATE}, at which point they will be automatically detached from your Family account. They will need to create their own account in order to make reservations." + child_age_will_be_18_years_ago: "Ditt barn %{NAME} kommer att fylla 18 den %{DATE}, och det kommer automatiskt att kopplas bort från ditt familjekonto. Det måste skapa ett eget konto för att kunna göra reservationer." #statistics tools for admins statistics: - subscriptions: "Subscriptions" - machines_hours: "Machines slots" - machine_dates: "Slots dates" - space_dates: "Slots dates" - spaces: "Spaces" - orders: "Orders" - trainings: "Trainings" - events: "Events" - registrations: "Registrations" - projects: "Projects" - users: "Users" - training_id: "Training ID" - training_date: "Training Date" - event_id: "Event ID" - event_date: "Event Date" - event_name: "Event Name" - event_theme: "Theme" - age_range: "Age Range" - themes: "Themes" - components: "Components" - machines: "Machines" - user_id: "User ID" - group: "Group" - bookings: "Bookings" - hours_number: "Hours number" - tickets_number: "Tickets number" - revenue: "Revenue" - account_creation: "Account creation" - project_publication: "Project publication" - duration: "Duration" - store: "Store" - paid-processed: "Paid and/or processed" - aborted: "Aborted" + subscriptions: "Prenumerationer" + machines_hours: "Utrustning bokningsplatser" + machine_dates: "Datum för bokningsplatser" + space_dates: "Datum för bokningsplatser" + spaces: "Lokaler" + orders: "Beställningar" + trainings: "Utbildningar" + events: "Evenemang" + registrations: "Bokningar" + projects: "Projekt" + users: "Användare" + training_id: "Utbildnings-ID" + training_date: "Utbildningsdatum" + event_id: "Evenemangs-ID" + event_date: "Evenemangsdatum" + event_name: "Evenemangsnamn" + event_theme: "Tema" + age_range: "Åldersintervall" + themes: "Teman" + components: "Komponenter" + machines: "Utrustning" + user_id: "Användar-ID" + group: "Grupp" + bookings: "Bokningar" + hours_number: "Antal timmar" + tickets_number: "Biljettnummer" + revenue: "Intäkter" + account_creation: "Skapa konto" + project_publication: "Projektpublikation" + duration: "Varaktighet" + store: "Butik" + paid-processed: "Betalad och/eller bearbetad" + aborted: "Avbruten" project_status: Status - project_name: Name - project_user_names: Collaborators + project_name: Namn + project_user_names: Medverkande #statistics exports to the Excel file format export: - entries: "Entries" - revenue: "Revenue" - average_age: "Average Age" - total: "Total" - date: "Date" - user: "User" - email: "Email" - phone: "Phone" - gender: "Gender" - age: "Age" - type: "Type" + entries: "Inlägg" + revenue: "Intäkter" + average_age: "Medelålder" + total: "Totalt" + date: "Datum" + user: "Användare" + email: "E-post" + phone: "Telefon" + gender: "Kön" + age: "Ålder" + type: "Typ" male: "Man" - female: "Woman" - deleted_user: "Deleted user" - reservation_context: "Reservation context" - coupon: "Coupon" - project_author: Author + female: "Kvinna" + deleted_user: "Raderad användare" + reservation_context: "Kontext för bokning" + coupon: "Rabattkupong" + project_author: Skapare #initial price's category for events, created to replace the old "reduced amount" property price_category: - reduced_fare: "Reduced fare" - reduced_fare_if_you_are_under_25_student_or_unemployed: "Reduced fare if you are under 25, student or unemployed." + reduced_fare: "Reducerat pris" + reduced_fare_if_you_are_under_25_student_or_unemployed: "Reducerat pris om du är under 25, student eller arbetslös." cart_items: - free_extension: "Free extension of a subscription, until %{DATE}" - must_be_after_expiration: "The new expiration date must be set after the current expiration date" - group_subscription_mismatch: "Your group mismatch with your subscription. Please report this error." + free_extension: "Gratis förlängning av en prenumeration tills %{DATE}" + must_be_after_expiration: "Det nya förfallodatumet måste anges efter det aktuella förfallodatumet" + group_subscription_mismatch: "Din grupp stämmer inte med din prenumeration. Vänligen rapportera detta fel." statistic_profile: - birthday_in_past: "The date of birth must be in the past" + birthday_in_past: "Födelsedatum måste vara i det förflutna" order: - please_contact_FABLAB: "Please contact us for withdrawal instructions." + please_contact_FABLAB: "Vänligen kontakta oss för återkallningsinstruktioner." cart_item_validation: - slot: "The slot doesn't exist" - availability: "The availaility doesn't exist" - full: "The slot is already fully reserved" - deadline: "You can't reserve a slot %{MINUTES} minutes prior to its start" - limit_reached: "You have reached the booking limit of %{HOURS}H per day for the %{RESERVABLE}, for your current subscription. Please adjust your reservation." - restricted: "This availability is restricted for subscribers" - plan: "This subscription plan is disabled" - plan_group: "This subscription plan is reserved for members of group %{GROUP}" - reserved: "This slot is already reserved" - pack: "This prepaid pack is disabled" - pack_group: "This prepaid pack is reserved for members of group %{GROUP}" - space: "This space is disabled" - machine: "This machine is disabled" - reservable: "This machine is not reservable" - blocked_by_another_reservation: "This slot is blocked by another reservation" + slot: "Platsen finns inte" + availability: "Tillgängligheten finns inte" + full: "Platsen är redan fullt bokad" + deadline: "Du kan inte reservera en plats %{MINUTES} minuter innan dess start" + limit_reached: "Du har nått bokningsgränsen för %{HOURS}H per dag för %{RESERVABLE}, för ditt nuvarande abonnemang. Vänligen justera din bokning." + restricted: "Denna tillgänglighet är begränsad till prenumeranter" + plan: "Prenumerationsplanen är inaktiverad" + plan_group: "Denna prenumerationsplan är reserverad för medlemmar i gruppen %{GROUP}" + reserved: "Denna plats är redan reserverad" + pack: "Detta förbetalda paket är inaktiverat" + pack_group: "Detta förbetalda paket är reserverat för medlemmar i gruppen %{GROUP}" + space: "Denna lokal är inaktiverad" + machine: "Denna utrustning är inaktiverad" + reservable: "Denna utrustning är inte bokningsbar" + blocked_by_another_reservation: "Denna plats är blockerad av en annan bokning" cart_validation: - select_user: "Please select a user before continuing" + select_user: "Välj en användare innan du fortsätter" settings: - locked_setting: "the setting is locked." - about_title: "\"About\" page title" - about_body: "\"About\" page content" - about_contacts: "\"About\" page contacts" - privacy_draft: "Privacy policy draft" - privacy_body: "Privacy policy" - privacy_dpo: "Data protection officer address" - twitter_name: "Twitter feed name" - home_blogpost: "Homepage's brief" - machine_explications_alert: "Explanation message on the machine reservation page" - training_explications_alert: "Explanation message on the training reservation page" - training_information_message: "Information message on the machine reservation page" - subscription_explications_alert: "Explanation message on the subscription page" - invoice_logo: "Invoices' logo" - invoice_reference: "Invoice's reference" - invoice_code-active: "Activation of the invoices' code" - invoice_code-value: "Invoices' code" - invoice_order-nb: "Invoice's order number" - invoice_VAT-active: "Activation of the VAT" - invoice_VAT-rate: "VAT rate" - invoice_VAT-rate_Product: "VAT rate for shop's product sales" - invoice_VAT-rate_Event: "VAT rate for event reservations" - invoice_VAT-rate_Machine: "VAT rate for machine reservations" - invoice_VAT-rate_Subscription: "VAT rate for subscriptions" - invoice_VAT-rate_Space: "VAT rate for space reservations" - invoice_VAT-rate_Training: "VAT rate for training reservations" - invoice_text: "Invoices' text" - invoice_legals: "Invoices' legal information" - booking_window_start: "Opening time" - booking_window_end: "Closing time" - booking_move_enable: "Activation of reservations moving" - booking_move_delay: "Preventive delay before any reservation move" - booking_cancel_enable: "Activation of reservations cancelling" - booking_cancel_delay: "Preventive delay before any reservation cancellation" - main_color: "Main colour" - secondary_color: "Secondary colour" - fablab_name: "Fablab's name" - name_genre: "Title concordance" - reminder_enable: "Activation of reservations reminding" - reminder_delay: "Delay before sending the reminder" - event_explications_alert: "Explanation message on the event reservation page" - space_explications_alert: "Explanation message on the space reservation page" - visibility_yearly: "Maximum visibility for annual subscribers" - visibility_others: "Maximum visibility for other members" - reservation_deadline: "Prevent reservation before it starts" - display_name_enable: "Display names in the calendar" - machines_sort_by: "Machines display order" - accounting_sales_journal_code: "Sales journal code" - accounting_payment_card_code: "Card payments code" - accounting_payment_card_label: "Card payments label" - accounting_payment_card_journal_code: "Card clients journal code" - accounting_payment_wallet_code: "Wallet payments code" - accounting_payment_wallet_label: "Wallet payments label" - accounting_payment_wallet_journal_code: "Wallet payments journal code" - accounting_payment_other_code: "Other payment means code" - accounting_payment_other_label: "Other payment means label" - accounting_payment_other_journal_code: "Other payment means journal code" - accounting_wallet_code: "Wallet credit code" - accounting_wallet_label: "Wallet credit label" - accounting_wallet_journal_code: "Wallet credit journal code" - accounting_VAT_code: "VAT code" - accounting_VAT_label: "VAT label" - accounting_VAT_journal_code: "VAT journal code" - accounting_subscription_code: "Subscriptions code" - accounting_subscription_label: "Subscriptions label" - accounting_Machine_code: "Machines code" - accounting_Machine_label: "Machines label" - accounting_Training_code: "Trainings code" - accounting_Training_label: "Trainings label" - accounting_Event_code: "Events code" - accounting_Event_label: "Events label" - accounting_Space_code: "Spaces code" - accounting_Space_label: "Spaces label" - accounting_Pack_code: "Prepaid-hours pack code" - accounting_Pack_label: "Prepaid-hours pack label" - accounting_Product_code: "Store products code" - accounting_Product_label: "Store products label" - hub_last_version: "Last Fab-manager's version" - hub_public_key: "Instance public key" - fab_analytics: "Fab Analytics" - link_name: "Link title to the \"About\" page" - home_content: "The home page" - home_css: "Stylesheet of the home page" - origin: "Instance URL" - uuid: "Instance ID" - phone_required: "Phone required?" - tracking_id: "Tracking ID" - book_overlapping_slots: "Book overlapping slots" - slot_duration: "Default duration of booking slots" - events_in_calendar: "Display events in the calendar" - spaces_module: "Spaces module" - plans_module: "Plans modules" - invoicing_module: "Invoicing module" - facebook_app_id: "Facebook App ID" - twitter_analytics: "Twitter analytics account" - recaptcha_site_key: "reCAPTCHA Site Key" - recaptcha_secret_key: "reCAPTCHA Secret Key" - feature_tour_display: "Feature tour display mode" - email_from: "Expeditor's address" - disqus_shortname: "Disqus shortname" - allowed_cad_extensions: "Allowed CAD files extensions" - allowed_cad_mime_types: "Allowed CAD files MIME types" + locked_setting: "inställningen är låst." + about_title: "\"Om\" sidan titel" + about_body: "\"Om\" sidan innehåll" + about_contacts: "\"Om\" sidan kontakter" + privacy_draft: "Utkast till integritetspolicy" + privacy_body: "Integritetspolicy" + privacy_dpo: "Adress till dataskyddsombud" + twitter_name: "Namn på Twitter-flöde" + home_blogpost: "Startsidans sammanfattning" + machine_explications_alert: "Förklaringsmeddelande på sidan för bokning av utrustning" + training_explications_alert: "Förklaringsmeddelande på bokningssidan för utbildningar" + training_information_message: "Informationsmeddelande på sidan för bokning av utrustning" + subscription_explications_alert: "Förklaringsmeddelande på prenumerationssidan" + invoice_logo: "Fakturalogotyp" + invoice_reference: "Fakturareferens" + invoice_code-active: "Aktivering av fakturakod" + invoice_code-value: "Fakturakod" + invoice_order-nb: "Fakturans ordernummer" + invoice_VAT-active: "Aktivering av moms" + invoice_VAT-rate: "Momssats" + invoice_VAT-rate_Product: "Momssats för butikens produktförsäljning" + invoice_VAT-rate_Event: "Momssats för bokning av evenemang" + invoice_VAT-rate_Machine: "Momssats för bokning av utrustning" + invoice_VAT-rate_Subscription: "Momssats för prenumerationer" + invoice_VAT-rate_Space: "Momssats för bokning av lokaler" + invoice_VAT-rate_Training: "Momssats för bokning av utbildning" + invoice_text: "Fakturatext" + invoice_legals: "Fakturas juridiska information" + booking_window_start: "Öppningstid" + booking_window_end: "Stängningstid" + booking_move_enable: "Aktivering av bokningar flyttar" + booking_move_delay: "Förebyggande dröjsmål innan bokning flyttas" + booking_cancel_enable: "Aktivera avbokning" + booking_cancel_delay: "Förebyggande dröjsmål innan bokning flyttas" + main_color: "Primär färg" + secondary_color: "Sekundär färg" + fablab_name: "Fablabs namn" + name_genre: "Titels överensstämmelse" + reminder_enable: "Aktivera bokningspåminnelser" + reminder_delay: "Fördröjning innan påminnelse skickas" + event_explications_alert: "Förklaringsmeddelande på sidan för bokning av händelser" + space_explications_alert: "Förklaringsmeddelande på sidan för lokalreservation" + visibility_yearly: "Maximal synlighet för årliga prenumeranter" + visibility_others: "Maximal synlighet för andra medlemmar" + reservation_deadline: "Förhindra bokning innan den börjar" + display_name_enable: "Visa namn i kalendern" + machines_sort_by: "Utrustnings visningsordning" + accounting_sales_journal_code: "Försäljning journalkod" + accounting_payment_card_code: "Kortets betalningskod" + accounting_payment_card_label: "Etikett för kortbetalningar" + accounting_payment_card_journal_code: "Kortets klientjournalkod" + accounting_payment_wallet_code: "Betalningskod för plånboken" + accounting_payment_wallet_label: "Etikett för plånboksbetalningar" + accounting_payment_wallet_journal_code: "Betalningskod för plånboken" + accounting_payment_other_code: "Kod för annan betalning" + accounting_payment_other_label: "Etikett för annan betalning" + accounting_payment_other_journal_code: "Kod för annan betalning" + accounting_wallet_code: "Plånbokens kreditkod" + accounting_wallet_label: "Plånbokskredit etikett" + accounting_wallet_journal_code: "Betalningskod för plånboken" + accounting_VAT_code: "Momsregistreringsnummer" + accounting_VAT_label: "Momsetikett" + accounting_VAT_journal_code: "Momsjornalkod" + accounting_subscription_code: "Prenumerationskod" + accounting_subscription_label: "Etikett för prenumerationer" + accounting_Machine_code: "Utrustningens kod" + accounting_Machine_label: "Etikett för utrustning" + accounting_Training_code: "Utbildnings kod" + accounting_Training_label: "Etikett för utbildningar" + accounting_Event_code: "Kod för evenemang" + accounting_Event_label: "Etikett för evenemang" + accounting_Space_code: "Kod för lokaler" + accounting_Space_label: "Etikett för lokaler" + accounting_Pack_code: "Förbetalda tim-paketskod" + accounting_Pack_label: "Förbetalda tim-paketsetikett" + accounting_Product_code: "Produkters kod" + accounting_Product_label: "Etikett för produkter" + hub_last_version: "Senaste Fab-managerns version" + hub_public_key: "Instansens publika nyckel" + fab_analytics: "Fab Analys" + link_name: "Länk titeln till sidan \"Om\"" + home_content: "Startsidan" + home_css: "Stilmall för startsidan" + origin: "Instansens URL" + uuid: "Instans ID" + phone_required: "Telefon krävs?" + tracking_id: "Spårnings-ID" + book_overlapping_slots: "Boka överlappande platser" + slot_duration: "Standardlängd för bokning av platser" + events_in_calendar: "Visa evenemang i kalendern" + spaces_module: "Modulen Lokaler" + plans_module: "Modulen Planer" + invoicing_module: "Faktureringsmodul" + facebook_app_id: "ID för Facebook-app" + twitter_analytics: "Twitter-analyskonto" + recaptcha_site_key: "reCAPTCHA webbplatsnyckel" + recaptcha_secret_key: "reCAPTCHA hemlig nyckel" + feature_tour_display: "Visningsläge för guidad tur" + email_from: "Utförarens adress" + disqus_shortname: "Disqus kortnamn" + allowed_cad_extensions: "Tillåtna CAD-filnamn" + allowed_cad_mime_types: "Tillåtna CAD-filer MIME-typer" openlab_app_id: "OpenLab ID" - openlab_app_secret: "OpenLab secret" - openlab_default: "Default projects gallery view" - online_payment_module: "Online payments module" - stripe_public_key: "Stripe public key" - stripe_secret_key: "Stripe secret key" - stripe_currency: "Stripe currency" - invoice_prefix: "Invoices' files prefix" - confirmation_required: "Confirmation required" - wallet_module: "Wallet module" - statistics_module: "Statistics module" - upcoming_events_shown: "Display limit for upcoming events" - payment_schedule_prefix: "Payment schedule's files prefix" - trainings_module: "Trainings module" - address_required: "Address required" - accounting_Error_code: "Errors code" - accounting_Error_label: "Errors label" - payment_gateway: "Payment gateway" - payzen_username: "PayZen username" - payzen_password: "PayZen password" + openlab_app_secret: "OpenLab hemlighet" + openlab_default: "Förvald projektgallerivy" + online_payment_module: "Onlinebetalningsmodul" + stripe_public_key: "Stripe publik nyckel" + stripe_secret_key: "Stripe hemlig nyckel" + stripe_currency: "Stripe valuta" + invoice_prefix: "Fakturor filnamnsprefix" + confirmation_required: "Verifiering krävs" + wallet_module: "Plånboksmodul" + statistics_module: "Statistikmodul" + upcoming_events_shown: "Visa gräns för kommande evenemang" + payment_schedule_prefix: "Prefix för betalningsschemats filer" + trainings_module: "Utbildningsmodul" + address_required: "Adress krävs" + accounting_Error_code: "Felkod" + accounting_Error_label: "Felbeskrivning" + payment_gateway: "Betallösning" + payzen_username: "PayZen användarnamn" + payzen_password: "PayZen lösenord" payzen_endpoint: "PayZen API endpoint" - payzen_public_key: "PayZen client public key" + payzen_public_key: "PayZen klient publik nyckel" payzen_hmac: "PayZen HMAC-SHA-256 key" - payzen_currency: "PayZen currency" - public_agenda_module: "Public agenda module" - renew_pack_threshold: "Threshold for packs renewal" - pack_only_for_subscription: "Restrict packs for subscribers" - overlapping_categories: "Categories for overlapping booking prevention" - extended_prices_in_same_day: "Extended prices in the same day" - public_registrations: "Public registrations" - facebook: "facebook" - twitter: "twitter" + payzen_currency: "PayZen valuta" + public_agenda_module: "Modul för publikt kalendarium" + renew_pack_threshold: "Tröskelvärde för förnyelse av paket" + pack_only_for_subscription: "Begränsa paket för prenumeranter" + overlapping_categories: "Kategorier för att förebygga överlappande bokning" + extended_prices_in_same_day: "Utökade priser samma dag" + public_registrations: "Öppna registreringar" + facebook: "Facebook" + twitter: "Twitter" viadeo: "viadeo" linkedin: "linkedin" - instagram: "instagram" - youtube: "youtube" - vimeo: "vimeo" - dailymotion: "dailymotion" - github: "github" + instagram: "Instagram" + youtube: "YouTube" + vimeo: "Vimeo" + dailymotion: "Dailymotion" + github: "GitHub" echosciences: "echosciences" - pinterest: "pinterest" - lastfm: "lastfm" - flickr: "flickr" - machines_module: "Machines module" - user_change_group: "Allow users to change their group" - store_module: "Store module" - store_withdrawal_instructions: "Withdrawal instructions" - store_hidden: "Store hidden to the public" - advanced_accounting: "Advanced accounting" - external_id: "external identifier" - prevent_invoices_zero: "prevent building invoices at 0" - invoice_VAT-name: "VAT name" - trainings_auto_cancel: "Trainings automatic cancellation" - trainings_auto_cancel_threshold: "Minimum participants for automatic cancellation" - trainings_auto_cancel_deadline: "Automatic cancellation deadline" - trainings_authorization_validity: "Trainings validity period" - trainings_authorization_validity_duration: "Trainings validity period duration" - trainings_invalidation_rule: "Trainings automatic invalidation" - trainings_invalidation_rule_period: "Grace period before invalidating a training" - projects_list_member_filter_presence: "Presence of member filter on projects list" - projects_list_date_filters_presence: "Presence of dates filter on projects list" - project_categories_filter_placeholder: "Placeholder for categories filter in project gallery" - project_categories_wording: "Wording used to replace \"Categories\" on public pages" - reservation_context_feature: "Force member to select the nature of his reservation when reserving" - family_account: "Family account" + pinterest: "Pinterest" + lastfm: "Last.fm" + flickr: "Flickr" + machines_module: "Utrustningsmodul" + user_change_group: "Tillåt användare att ändra sin grupp" + store_module: "Butiksmodul" + store_withdrawal_instructions: "Uttagsinstruktioner" + store_hidden: "Butiken är dold för allmänheten" + advanced_accounting: "Avancerad redovisning" + external_id: "extern identifierare" + prevent_invoices_zero: "förhindra att fakturor på 0 skapas" + invoice_VAT-name: "Momsbeteckning" + trainings_auto_cancel: "Utbildning automatisk avbokning" + trainings_auto_cancel_threshold: "Minsta antal deltagare för automatisk avbokning" + trainings_auto_cancel_deadline: "Tidsfristen för automatisk avbokning" + trainings_authorization_validity: "Utbildningens giltighetstid" + trainings_authorization_validity_duration: "Utbildningens giltighetstid varaktighet" + trainings_invalidation_rule: "Utbildning automatisk ogiltigförklaring" + trainings_invalidation_rule_period: "Frist innan en träning ogiltigförklaras" + projects_list_member_filter_presence: "Filtrera på närvaro i projektlistan" + projects_list_date_filters_presence: "Filtrera på datum i projektlistan" + project_categories_filter_placeholder: "Platshållare för kategorifilter i projektgalleriet" + project_categories_wording: "Ord som används för att ersätta \"Kategorier\" på publika sidor" + reservation_context_feature: "Tvinga medlem att välja typ av bokning " + family_account: "Familjekonto" #statuses of projects statuses: - new: "New" - pending: "Pending" - done: "Done" - abandoned: "Abandoned" + new: "Ny" + pending: "Väntar" + done: "Klar" + abandoned: "Övergiven" From ccc684e6b63c024f416e8896d2684eceb51fabc2 Mon Sep 17 00:00:00 2001 From: Du Peng Date: Fri, 19 Jan 2024 14:43:08 +0100 Subject: [PATCH 09/17] Version 6.3.10 --- CHANGELOG.md | 3 +++ package.json | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cdbafe97..5375fd6c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,10 @@ ## Next release +## v6.3.10 2024 January 19 + - Fix a bug: unable to update event recurrence +- updates translations ## v6.3.9 2024 January 8 diff --git a/package.json b/package.json index 4725917e1..34c0c45c6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fab-manager", - "version": "6.3.9", + "version": "6.3.10", "description": "Fab-manager is the FabLab management solution. It provides a comprehensive, web-based, open-source tool to simplify your administrative tasks and your marker's projects.", "keywords": [ "fablab", From ba926721bb0884e7351688a512713cca6f153bcc Mon Sep 17 00:00:00 2001 From: Du Peng Date: Wed, 24 Jan 2024 15:26:18 +0100 Subject: [PATCH 10/17] (bug) if there is a reservation with a deleted user, it is not possible to delete the event --- CHANGELOG.md | 2 ++ app/services/slots/places_cache_service.rb | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5375fd6c1..94809cc9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Next release +- Fix a bug: if there is a reservation with a deleted user, it is not possible to delete the event + ## v6.3.10 2024 January 19 - Fix a bug: unable to update event recurrence diff --git a/app/services/slots/places_cache_service.rb b/app/services/slots/places_cache_service.rb index 789728700..1f11a070a 100644 --- a/app/services/slots/places_cache_service.rb +++ b/app/services/slots/places_cache_service.rb @@ -78,7 +78,7 @@ class Slots::PlacesCacheService # @param reservable_id [Number] # @param user_ids [Array] def remove_users(slot, reservable_type, reservable_id, user_ids) - return if slot.nil? + return if slot.nil? || user_ids.compact.empty? ActiveRecord::Base.connection.execute <<-SQL.squish with users as ( From 73566d4cd923b3db58a097ad4ec56c21cb27986f Mon Sep 17 00:00:00 2001 From: Du Peng Date: Mon, 8 Jan 2024 09:20:52 +0100 Subject: [PATCH 11/17] (wip) add saml provider --- Gemfile | 3 ++- Gemfile.lock | 7 +++++++ app/controllers/sessions_controller.rb | 1 + lib/omni_auth/strategies/sso_saml_provider.rb | 8 ++++++++ lib/tasks/fablab/auth.rake | 17 +---------------- 5 files changed, 19 insertions(+), 17 deletions(-) create mode 100644 lib/omni_auth/strategies/sso_saml_provider.rb diff --git a/Gemfile b/Gemfile index 99433f7bb..dfdd5557d 100644 --- a/Gemfile +++ b/Gemfile @@ -72,6 +72,7 @@ gem 'devise', '>= 4.9' gem 'omniauth', '~> 2.1' gem 'omniauth-oauth2' gem 'omniauth_openid_connect' +gem 'omniauth-saml' gem 'omniauth-rails_csrf_protection', '~> 1.0' gem 'rolify' @@ -153,4 +154,4 @@ gem 'sentry-ruby' gem "reverse_markdown" gem "ancestry" -gem 'silencer', require: false \ No newline at end of file +gem 'silencer', require: false diff --git a/Gemfile.lock b/Gemfile.lock index b798e07fe..0495981c7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -292,6 +292,9 @@ GEM omniauth-rails_csrf_protection (1.0.1) actionpack (>= 4.2) omniauth (~> 2.0) + omniauth-saml (2.1.0) + omniauth (~> 2.0) + ruby-saml (~> 1.12) omniauth_openid_connect (0.6.1) omniauth (>= 1.9, < 3) openid_connect (~> 1.1) @@ -422,6 +425,9 @@ GEM rubocop (>= 1.7.0, < 2.0) ruby-progressbar (1.10.1) ruby-rc4 (0.1.5) + ruby-saml (1.16.0) + nokogiri (>= 1.13.10) + rexml ruby-vips (2.1.4) ffi (~> 1.12) rubyXL (3.4.25) @@ -579,6 +585,7 @@ DEPENDENCIES omniauth (~> 2.1) omniauth-oauth2 omniauth-rails_csrf_protection (~> 1.0) + omniauth-saml omniauth_openid_connect openlab_ruby overcommit diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 466bd5b09..dd869f114 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -7,6 +7,7 @@ class SessionsController < Devise::SessionsController if active_provider.providable_type == 'DatabaseProvider' super else + p active_provider redirect_post "/users/auth/#{active_provider.strategy_name}" end end diff --git a/lib/omni_auth/strategies/sso_saml_provider.rb b/lib/omni_auth/strategies/sso_saml_provider.rb new file mode 100644 index 000000000..b8405a426 --- /dev/null +++ b/lib/omni_auth/strategies/sso_saml_provider.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +require 'omniauth-saml' + +# Authentication strategy provided trough SAML +class OmniAuth::Strategies::SsoSamlProvider < OmniAuth::Strategies::SAML + include OmniAuth::DataMapping::Mapper +end diff --git a/lib/tasks/fablab/auth.rake b/lib/tasks/fablab/auth.rake index adb20cc99..8b42dc43d 100644 --- a/lib/tasks/fablab/auth.rake +++ b/lib/tasks/fablab/auth.rake @@ -5,21 +5,6 @@ namespace :fablab do namespace :auth do desc 'switch the active authentication provider' task :switch_provider, [:provider] => :environment do |_task, args| - providers = AuthProvider.all.inject('') { |str, item| "#{str}#{item[:name]}, " } - unless args.provider - puts "\e[0;31mERROR\e[0m: You must pass a provider name to activate. Available providers are: #{providers[0..-3]}" - next - end - - if AuthProvider.find_by(name: args.provider).nil? - puts "\e[0;31mERROR\e[0m: the provider '#{args.provider}' does not exists. Available providers are: #{providers[0..-3]}" - next - end - - if AuthProvider.active.name == args.provider - puts "\e[0;31mERROR\e[0m: the provider '#{args.provider}' is already enabled" - next - end # disable previous provider prev_prev = AuthProvider.previous @@ -28,7 +13,7 @@ namespace :fablab do AuthProvider.active.update(status: 'previous') unless AuthProvider.active.name == 'DatabaseProvider::SimpleAuthProvider' # enable given provider - AuthProvider.find_by(name: args.provider).update(status: 'active') + AuthProvider.find_by(name: 'FabManager').update(status: 'active') # migrate the current users. if AuthProvider.active.providable_type == DatabaseProvider.name From f58da357b7c72012d7d525f225f816ad922f7d9d Mon Sep 17 00:00:00 2001 From: Du Peng Date: Fri, 19 Jan 2024 13:55:32 +0100 Subject: [PATCH 12/17] (wip) saml sso --- .../api/auth_providers_controller.rb | 7 + .../authentication-provider/provider-form.tsx | 5 +- .../authentication-provider/saml-form.tsx | 45 ++++++ .../models/authentication-provider.ts | 10 +- app/models/saml_provider.rb | 11 ++ .../api/auth_providers/show.json.jbuilder | 6 + config/initializers/devise.rb | 7 + .../20240116163703_create_saml_providers.rb | 10 ++ db/structure.sql | 135 ++++++++++++++++-- lib/omni_auth/saml.rb | 3 + 10 files changed, 226 insertions(+), 13 deletions(-) create mode 100644 app/frontend/src/javascript/components/authentication-provider/saml-form.tsx create mode 100644 app/models/saml_provider.rb create mode 100644 db/migrate/20240116163703_create_saml_providers.rb create mode 100644 lib/omni_auth/saml.rb diff --git a/app/controllers/api/auth_providers_controller.rb b/app/controllers/api/auth_providers_controller.rb index e975e42f1..43616067b 100644 --- a/app/controllers/api/auth_providers_controller.rb +++ b/app/controllers/api/auth_providers_controller.rb @@ -105,6 +105,13 @@ class API::AuthProvidersController < API::APIController auth_provider_mappings_attributes: [:id, :local_model, :local_field, :api_field, :api_endpoint, :api_data_type, :_destroy, { transformation: [:type, :format, :true_value, :false_value, { mapping: %i[from to] }] }]) + elsif params['auth_provider']['providable_type'] == SamlProvider.name + params.require(:auth_provider) + .permit(:id, :name, :providable_type, + providable_attributes: [:id, :sp_entity_id, :idp_sso_service_url], + auth_provider_mappings_attributes: [:id, :local_model, :local_field, :api_field, :api_endpoint, :api_data_type, + :_destroy, { transformation: [:type, :format, :true_value, :false_value, + { mapping: %i[from to] }] }]) end end end diff --git a/app/frontend/src/javascript/components/authentication-provider/provider-form.tsx b/app/frontend/src/javascript/components/authentication-provider/provider-form.tsx index 80abc0876..5eb8227b6 100644 --- a/app/frontend/src/javascript/components/authentication-provider/provider-form.tsx +++ b/app/frontend/src/javascript/components/authentication-provider/provider-form.tsx @@ -20,6 +20,7 @@ import { FabButton } from '../base/fab-button'; import AuthProviderAPI from '../../api/auth-provider'; import { OpenidConnectForm } from './openid-connect-form'; import { DatabaseForm } from './database-form'; +import { SamlForm } from './saml-form'; declare const Application: IApplication; @@ -27,7 +28,8 @@ declare const Application: IApplication; const METHODS = { DatabaseProvider: 'local_database', OAuth2Provider: 'oauth2', - OpenIdConnectProvider: 'openid_connect' + OpenIdConnectProvider: 'openid_connect', + SamlProvider: 'saml' }; interface ProviderFormProps { @@ -116,6 +118,7 @@ export const ProviderForm: React.FC = ({ action, provider, on currentFormValues={output.providable_attributes as OpenIdConnectProvider} formState={formState} setValue={setValue} />} + {providableType === 'SamlProvider' && } {providableType && providableType !== 'DatabaseProvider' && { + register: UseFormRegister, + formState: FormState, + strategyName?: string, +} + +/** + * Partial form to fill the OAuth2 settings for a new/existing authentication provider. + */ +export const SamlForm = ({ register, strategyName, formState }: SamlFormProps) => { + const { t } = useTranslation('admin'); + + /** + * Build the callback URL, based on the strategy name. + */ + const buildCallbackUrl = (): string => { + return `${window.location.origin}/users/auth/${strategyName}/callback`; + }; + + return ( +
+
+ + + +
+ ); +}; diff --git a/app/frontend/src/javascript/models/authentication-provider.ts b/app/frontend/src/javascript/models/authentication-provider.ts index a8c34d63c..59700726a 100644 --- a/app/frontend/src/javascript/models/authentication-provider.ts +++ b/app/frontend/src/javascript/models/authentication-provider.ts @@ -1,4 +1,4 @@ -export type ProvidableType = 'DatabaseProvider' | 'OAuth2Provider' | 'OpenIdConnectProvider'; +export type ProvidableType = 'DatabaseProvider' | 'OAuth2Provider' | 'OpenIdConnectProvider' | 'SamlProvider'; export interface AuthenticationProvider { id?: number, @@ -7,7 +7,7 @@ export interface AuthenticationProvider { providable_type: ProvidableType, strategy_name: string auth_provider_mappings_attributes: Array, - providable_attributes?: OAuth2Provider | OpenIdConnectProvider + providable_attributes?: OAuth2Provider | OpenIdConnectProvider | SamlProvider } export type mappingType = 'string' | 'text' | 'date' | 'integer' | 'boolean'; @@ -65,6 +65,12 @@ export interface OpenIdConnectProvider { extra_authorize_parameters?: string, } +export interface SamlProvider { + id?: string, + sp_entity_id: string, + idp_sso_service_url: string +} + export interface MappingFields { user: Array<[string, mappingType]>, profile: Array<[string, mappingType]> diff --git a/app/models/saml_provider.rb b/app/models/saml_provider.rb new file mode 100644 index 000000000..d444763cf --- /dev/null +++ b/app/models/saml_provider.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +# SAML Provider is a special type of AuthProvider which provides authentication through an external SSO server using +# the SAML protocol. + +class SamlProvider < ApplicationRecord + has_one :auth_provider, as: :providable, dependent: :destroy + + validates :sp_entity_id, presence: true + validates :idp_sso_service_url, presence: true +end diff --git a/app/views/api/auth_providers/show.json.jbuilder b/app/views/api/auth_providers/show.json.jbuilder index 2700aeed3..ff0535c57 100644 --- a/app/views/api/auth_providers/show.json.jbuilder +++ b/app/views/api/auth_providers/show.json.jbuilder @@ -19,3 +19,9 @@ if @provider.providable_type == OpenIdConnectProvider.name json.extra_authorize_params @provider.providable[:extra_authorize_params].to_json end end + +if @provider.providable_type == SamlProvider.name + json.providable_attributes do + json.extract! @provider.providable, :id, :sp_entity_id, :idp_sso_service_url + end +end diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index c2f2faceb..7a465d9f1 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -244,6 +244,13 @@ Devise.setup do |config| active_provider.oidc_config.merge( strategy_class: OmniAuth::Strategies::SsoOpenidConnectProvider ) + + when 'SamlProvider' + require_relative '../../lib/omni_auth/saml' + config.omniauth active_provider.strategy_name.to_sym, + active_provider.providable.sp_entity_id, + active_provider.providable.idp_sso_service_url, + strategy_class: OmniAuth::Strategies::SsoSamlProvider end end diff --git a/db/migrate/20240116163703_create_saml_providers.rb b/db/migrate/20240116163703_create_saml_providers.rb new file mode 100644 index 000000000..491ba9c40 --- /dev/null +++ b/db/migrate/20240116163703_create_saml_providers.rb @@ -0,0 +1,10 @@ +class CreateSamlProviders < ActiveRecord::Migration[7.0] + def change + create_table :saml_providers do |t| + t.string :sp_entity_id + t.string :idp_sso_service_url + + t.timestamps + end + end +end diff --git a/db/structure.sql b/db/structure.sql index 01fa2735d..62f1c8dec 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -9,6 +9,13 @@ SET xmloption = content; SET client_min_messages = warning; SET row_security = off; +-- +-- Name: public; Type: SCHEMA; Schema: -; Owner: - +-- + +-- *not* creating schema, since initdb creates it + + -- -- Name: fuzzystrmatch; Type: EXTENSION; Schema: -; Owner: - -- @@ -2235,6 +2242,41 @@ CREATE SEQUENCE public.payment_gateway_objects_id_seq ALTER SEQUENCE public.payment_gateway_objects_id_seq OWNED BY public.payment_gateway_objects.id; +-- +-- Name: payment_infos; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.payment_infos ( + id bigint NOT NULL, + data jsonb, + state character varying, + payment_for character varying, + service character varying, + statistic_profile_id bigint, + created_at timestamp(6) without time zone NOT NULL, + updated_at timestamp(6) without time zone NOT NULL +); + + +-- +-- Name: payment_infos_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE public.payment_infos_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: payment_infos_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - +-- + +ALTER SEQUENCE public.payment_infos_id_seq OWNED BY public.payment_infos.id; + + -- -- Name: payment_schedule_items; Type: TABLE; Schema: public; Owner: - -- @@ -3224,6 +3266,38 @@ CREATE SEQUENCE public.roles_id_seq ALTER SEQUENCE public.roles_id_seq OWNED BY public.roles.id; +-- +-- Name: saml_providers; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.saml_providers ( + id bigint NOT NULL, + sp_entity_id character varying, + idp_sso_service_url character varying, + created_at timestamp(6) without time zone NOT NULL, + updated_at timestamp(6) without time zone NOT NULL +); + + +-- +-- Name: saml_providers_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE public.saml_providers_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: saml_providers_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - +-- + +ALTER SEQUENCE public.saml_providers_id_seq OWNED BY public.saml_providers.id; + + -- -- Name: schema_migrations; Type: TABLE; Schema: public; Owner: - -- @@ -4316,8 +4390,8 @@ CREATE TABLE public.users ( is_allow_newsletter boolean, current_sign_in_ip inet, last_sign_in_ip inet, - mapped_from_sso character varying, validated_at timestamp without time zone, + mapped_from_sso character varying, supporting_documents_reminder_sent_at timestamp(6) without time zone ); @@ -4870,6 +4944,13 @@ ALTER TABLE ONLY public.organizations ALTER COLUMN id SET DEFAULT nextval('publi ALTER TABLE ONLY public.payment_gateway_objects ALTER COLUMN id SET DEFAULT nextval('public.payment_gateway_objects_id_seq'::regclass); +-- +-- Name: payment_infos id; Type: DEFAULT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.payment_infos ALTER COLUMN id SET DEFAULT nextval('public.payment_infos_id_seq'::regclass); + + -- -- Name: payment_schedule_items id; Type: DEFAULT; Schema: public; Owner: - -- @@ -5066,6 +5147,13 @@ ALTER TABLE ONLY public.reservations ALTER COLUMN id SET DEFAULT nextval('public ALTER TABLE ONLY public.roles ALTER COLUMN id SET DEFAULT nextval('public.roles_id_seq'::regclass); +-- +-- Name: saml_providers id; Type: DEFAULT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.saml_providers ALTER COLUMN id SET DEFAULT nextval('public.saml_providers_id_seq'::regclass); + + -- -- Name: settings id; Type: DEFAULT; Schema: public; Owner: - -- @@ -5799,6 +5887,14 @@ ALTER TABLE ONLY public.payment_gateway_objects ADD CONSTRAINT payment_gateway_objects_pkey PRIMARY KEY (id); +-- +-- Name: payment_infos payment_infos_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.payment_infos + ADD CONSTRAINT payment_infos_pkey PRIMARY KEY (id); + + -- -- Name: payment_schedule_items payment_schedule_items_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- @@ -6023,6 +6119,14 @@ ALTER TABLE ONLY public.roles ADD CONSTRAINT roles_pkey PRIMARY KEY (id); +-- +-- Name: saml_providers saml_providers_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.saml_providers + ADD CONSTRAINT saml_providers_pkey PRIMARY KEY (id); + + -- -- Name: schema_migrations schema_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- @@ -7004,6 +7108,13 @@ CREATE INDEX index_payment_gateway_objects_on_item_type_and_item_id ON public.pa CREATE INDEX index_payment_gateway_objects_on_payment_gateway_object_id ON public.payment_gateway_objects USING btree (payment_gateway_object_id); +-- +-- Name: index_payment_infos_on_statistic_profile_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX index_payment_infos_on_statistic_profile_id ON public.payment_infos USING btree (statistic_profile_id); + + -- -- Name: index_payment_schedule_items_on_invoice_id; Type: INDEX; Schema: public; Owner: - -- @@ -7795,14 +7906,6 @@ CREATE INDEX proof_of_identity_type_id_and_proof_of_identity_refusal_id ON publi CREATE UNIQUE INDEX unique_not_null_external_id ON public.invoicing_profiles USING btree (external_id) WHERE (external_id IS NOT NULL); --- --- Name: accounting_periods accounting_periods_del_protect; Type: RULE; Schema: public; Owner: - --- - -CREATE RULE accounting_periods_del_protect AS - ON DELETE TO public.accounting_periods DO INSTEAD NOTHING; - - -- -- Name: accounting_periods accounting_periods_upd_protect; Type: RULE; Schema: public; Owner: - -- @@ -7836,6 +7939,14 @@ ALTER TABLE ONLY public.payment_schedules ADD CONSTRAINT fk_rails_00308dc223 FOREIGN KEY (wallet_transaction_id) REFERENCES public.wallet_transactions(id); +-- +-- Name: payment_infos fk_rails_0308366a58; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.payment_infos + ADD CONSTRAINT fk_rails_0308366a58 FOREIGN KEY (statistic_profile_id) REFERENCES public.statistic_profiles(id); + + -- -- Name: cart_item_event_reservation_booking_users fk_rails_0964335a37; Type: FK CONSTRAINT; Schema: public; Owner: - -- @@ -9182,8 +9293,10 @@ INSERT INTO "schema_migrations" (version) VALUES ('20230328094808'), ('20230328094809'), ('20230331132506'), +('20230509121907'), ('20230509161557'), ('20230510141305'), +('20230511080650'), ('20230511081018'), ('20230524080448'), ('20230524083558'), @@ -9199,11 +9312,13 @@ INSERT INTO "schema_migrations" (version) VALUES ('20230720085857'), ('20230728072726'), ('20230728090257'), +('20230825101952'), ('20230828073428'), ('20230831103208'), ('20230901090637'), ('20230907124230'), ('20231103093436'), -('20231108094433'); +('20231108094433'), +('20240116163703'); diff --git a/lib/omni_auth/saml.rb b/lib/omni_auth/saml.rb new file mode 100644 index 000000000..d63791c61 --- /dev/null +++ b/lib/omni_auth/saml.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +require_relative 'strategies/saml_provider' From bc023011d2d3785e95eb9d5149b26194d1c4fe28 Mon Sep 17 00:00:00 2001 From: Du Peng Date: Fri, 26 Jan 2024 21:24:33 +0100 Subject: [PATCH 13/17] (feat) saml provider --- .../api/auth_providers_controller.rb | 2 +- .../users/omniauth_callbacks_controller.rb | 1 + .../data-mapping-form.tsx | 6 ++ .../saml-data-mapping-form.tsx | 87 +++++++++++++++++++ .../authentication-provider/saml-form.tsx | 22 ++++- .../controllers/admin/authentications.js | 3 +- .../models/authentication-provider.ts | 3 + app/frontend/src/stylesheets/application.scss | 1 + .../saml-data-mapping-form.scss | 7 ++ app/models/auth_provider.rb | 4 +- .../api/auth_providers/show.json.jbuilder | 2 +- .../auth_provider/provider.json.jbuilder | 6 ++ config/environments/development.rb | 2 + config/initializers/devise.rb | 6 +- config/locales/app.admin.en.yml | 16 ++++ ...45351_add_profile_url_to_saml_providers.rb | 7 ++ ...126192110_add_idp_cert_to_saml_provider.rb | 6 ++ db/structure.sql | 9 +- lib/omni_auth/saml.rb | 2 +- lib/omni_auth/strategies/sso_saml_provider.rb | 26 ++++++ 20 files changed, 206 insertions(+), 12 deletions(-) create mode 100644 app/frontend/src/javascript/components/authentication-provider/saml-data-mapping-form.tsx create mode 100644 app/frontend/src/stylesheets/modules/authentication-provider/saml-data-mapping-form.scss create mode 100644 db/migrate/20240126145351_add_profile_url_to_saml_providers.rb create mode 100644 db/migrate/20240126192110_add_idp_cert_to_saml_provider.rb diff --git a/app/controllers/api/auth_providers_controller.rb b/app/controllers/api/auth_providers_controller.rb index 43616067b..379c2a315 100644 --- a/app/controllers/api/auth_providers_controller.rb +++ b/app/controllers/api/auth_providers_controller.rb @@ -108,7 +108,7 @@ class API::AuthProvidersController < API::APIController elsif params['auth_provider']['providable_type'] == SamlProvider.name params.require(:auth_provider) .permit(:id, :name, :providable_type, - providable_attributes: [:id, :sp_entity_id, :idp_sso_service_url], + providable_attributes: [:id, :sp_entity_id, :idp_sso_service_url, :profile_url, :idp_cert_fingerprint, :idp_cert], auth_provider_mappings_attributes: [:id, :local_model, :local_field, :api_field, :api_endpoint, :api_data_type, :_destroy, { transformation: [:type, :format, :true_value, :false_value, { mapping: %i[from to] }] }]) diff --git a/app/controllers/users/omniauth_callbacks_controller.rb b/app/controllers/users/omniauth_callbacks_controller.rb index 2bcb14bb1..61f3d2906 100644 --- a/app/controllers/users/omniauth_callbacks_controller.rb +++ b/app/controllers/users/omniauth_callbacks_controller.rb @@ -2,6 +2,7 @@ # Handle authentication actions via OmniAuth (used by SSO providers) class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController + skip_before_action :verify_authenticity_token require 'sso_logger' logger = SsoLogger.new diff --git a/app/frontend/src/javascript/components/authentication-provider/data-mapping-form.tsx b/app/frontend/src/javascript/components/authentication-provider/data-mapping-form.tsx index 785819bfb..fe86a7456 100644 --- a/app/frontend/src/javascript/components/authentication-provider/data-mapping-form.tsx +++ b/app/frontend/src/javascript/components/authentication-provider/data-mapping-form.tsx @@ -12,6 +12,7 @@ import { TypeMappingModal } from './type-mapping-modal'; import { useImmer } from 'use-immer'; import { Oauth2DataMappingForm } from './oauth2-data-mapping-form'; import { OpenidConnectDataMappingForm } from './openid-connect-data-mapping-form'; +import { SamlDataMappingForm } from './saml-data-mapping-form'; export interface DataMappingFormProps { register: UseFormRegister, @@ -164,6 +165,11 @@ export const DataMappingForm = } + {providerType === 'SamlProvider' && }