mirror of
https://github.com/LaCasemate/fab-manager.git
synced 2025-01-29 18:52:22 +01:00
Merge branch 'monthly-payment' into staging
This commit is contained in:
commit
2677b18b97
44
.github/workflows/brakeman-analysis.yml
vendored
Normal file
44
.github/workflows/brakeman-analysis.yml
vendored
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
# This workflow integrates Brakeman with GitHub's Code Scanning feature
|
||||||
|
# Brakeman is a static analysis security vulnerability scanner for Ruby on Rails applications
|
||||||
|
|
||||||
|
name: Brakeman Scan
|
||||||
|
|
||||||
|
# This section configures the trigger for the workflow. Feel free to customize depending on your convention
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ dev ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ dev ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
brakeman-scan:
|
||||||
|
name: Brakeman Scan
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
# Checkout the repository to the GitHub Actions runner
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
# Customize the ruby version depending on your needs
|
||||||
|
- name: Setup Ruby
|
||||||
|
uses: actions/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
ruby-version: '2.6'
|
||||||
|
|
||||||
|
- name: Setup Brakeman
|
||||||
|
env:
|
||||||
|
BRAKEMAN_VERSION: '4.10' # SARIF support is provided in Brakeman version 4.10+
|
||||||
|
run: |
|
||||||
|
gem install brakeman --version $BRAKEMAN_VERSION
|
||||||
|
|
||||||
|
# Execute Brakeman CLI and generate a SARIF output with the security issues identified during the analysis
|
||||||
|
- name: Scan
|
||||||
|
continue-on-error: true
|
||||||
|
run: |
|
||||||
|
brakeman -f sarif -o output.sarif.json .
|
||||||
|
|
||||||
|
# Upload the SARIF file generated in the previous step
|
||||||
|
- name: Upload SARIF
|
||||||
|
uses: github/codeql-action/upload-sarif@v1
|
||||||
|
with:
|
||||||
|
sarif_file: output.sarif.json
|
@ -1 +1 @@
|
|||||||
ruby-2.6.5
|
ruby-2.6.6
|
||||||
|
18
CHANGELOG.md
18
CHANGELOG.md
@ -1,7 +1,8 @@
|
|||||||
# Changelog Fab-manager
|
# Changelog Fab-manager
|
||||||
|
|
||||||
|
## Next release
|
||||||
- Refactored theme builder to use scss files
|
- Refactored theme builder to use scss files
|
||||||
- Fix a bug: unable to build homepage custom stylesheet
|
- Updated stripe gem to 5.21.0
|
||||||
- Fix a bug: unable to access embedded plan views
|
- Fix a bug: unable to access embedded plan views
|
||||||
- Fix a bug: warning message overflow in credit wallet modal
|
- Fix a bug: warning message overflow in credit wallet modal
|
||||||
- Fix a bug: when using a cash coupon, the amount shown in the statistics is invalid
|
- Fix a bug: when using a cash coupon, the amount shown in the statistics is invalid
|
||||||
@ -9,6 +10,20 @@
|
|||||||
- [TODO DEPLOY] `rails fablab:maintenance:rebuild_stylesheet`
|
- [TODO DEPLOY] `rails fablab:maintenance:rebuild_stylesheet`
|
||||||
- [TODO DEPLOY] `rails fablab:stripe:set_product_id`
|
- [TODO DEPLOY] `rails fablab:stripe:set_product_id`
|
||||||
- [TODO DEPLOY] `rails fablab:setup:add_schedule_reference`
|
- [TODO DEPLOY] `rails fablab:setup:add_schedule_reference`
|
||||||
|
- [TODO DEPLOY] add the `INTL_LOCALE` environment variable (see [doc/environment.md](doc/environment.md#INTL_LOCALE) for configuration details)
|
||||||
|
- [TODO DEPLOY] add the `INTL_CURRENCY` environment variable (see [doc/environment.md](doc/environment.md#INTL_CURRENCY) for configuration details)
|
||||||
|
|
||||||
|
## v4.6.5 2020 December 07
|
||||||
|
- Fix a bug: unable to run the upgrade script with docker-compose >= v1.19
|
||||||
|
|
||||||
|
## v4.6.4 2020 December 1st
|
||||||
|
|
||||||
|
- Full Portuguese translation (thanks to [@gusabr](https://crowdin.com/profile/gusabr))
|
||||||
|
- Updated the version of ruby to 2.6.6
|
||||||
|
- Add the configuration of the postgreSQL username in environment variables
|
||||||
|
- Fix a bug: unable to build homepage custom stylesheet
|
||||||
|
- Fix some security issues: [CVE-2020-10663](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-10663) and [CVE-2020-10933](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-10933)
|
||||||
|
- [TODO DEPLOY] add `POSTGRES_USERNAME=postgres` to the environment variables (see [doc/environment.md](doc/environment.md#POSTGRES_USERNAME) for configuration details)
|
||||||
|
|
||||||
## v4.6.3 2020 October 28
|
## v4.6.3 2020 October 28
|
||||||
|
|
||||||
@ -21,7 +36,6 @@
|
|||||||
- Fix a bug: in the settings area, boolean switches are always shown as false
|
- Fix a bug: in the settings area, boolean switches are always shown as false
|
||||||
- Fix a bug: public cards presenting the plans in the public area, have bogus style
|
- Fix a bug: public cards presenting the plans in the public area, have bogus style
|
||||||
- Fix a bug: theme primary color is ignored on links
|
- Fix a bug: theme primary color is ignored on links
|
||||||
- Updated stripe gem to 5.21.0
|
|
||||||
- [TODO DEPLOY] `rails fablab:maintenance:rebuild_stylesheet`
|
- [TODO DEPLOY] `rails fablab:maintenance:rebuild_stylesheet`
|
||||||
|
|
||||||
## v4.6.2 2020 October 23
|
## v4.6.2 2020 October 23
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
FROM ruby:2.6.5-alpine
|
FROM ruby:2.6.6-alpine
|
||||||
MAINTAINER peng@sleede.com
|
MAINTAINER contact@fab-manager.com
|
||||||
|
|
||||||
# Install upgrade system packages
|
# Install upgrade system packages
|
||||||
RUN apk update && apk upgrade && \
|
RUN apk update && apk upgrade && \
|
||||||
|
@ -68,17 +68,49 @@ class API::PaymentsController < API::ApiController
|
|||||||
render json: { status: false }
|
render json: { status: false }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def setup_intent
|
||||||
|
user = User.find(params[:user_id])
|
||||||
|
key = Setting.get('stripe_secret_key')
|
||||||
|
@intent = Stripe::SetupIntent.create({ customer: user.stp_customer_id }, { api_key: key })
|
||||||
|
render json: { client_secret: @intent.client_secret }
|
||||||
|
end
|
||||||
|
|
||||||
|
def confirm_payment_schedule
|
||||||
|
key = Setting.get('stripe_secret_key')
|
||||||
|
intent = Stripe::SetupIntent.retrieve(params[:setup_intent_id], api_key: key)
|
||||||
|
|
||||||
|
amount = card_amount
|
||||||
|
if intent&.status == 'succeeded'
|
||||||
|
if params[:cart_items][:reservation]
|
||||||
|
res = on_reservation_success(intent, amount[:details])
|
||||||
|
elsif params[:cart_items][:subscription]
|
||||||
|
res = on_subscription_success(intent)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
render generate_payment_response(intent, res)
|
||||||
|
rescue Stripe::InvalidRequestError
|
||||||
|
render json: { error: 'no such setup intent' }, status: :unprocessable_entity
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def on_reservation_success(intent, details)
|
def on_reservation_success(intent, details)
|
||||||
@reservation = Reservation.new(reservation_params)
|
@reservation = Reservation.new(reservation_params)
|
||||||
is_reserve = Reservations::Reserve.new(current_user.id, current_user.invoicing_profile.id)
|
user_id = if current_user.admin? || current_user.manager?
|
||||||
|
params[:cart_items][:reservation][:user_id]
|
||||||
|
else
|
||||||
|
current_user.id
|
||||||
|
end
|
||||||
|
is_reserve = Reservations::Reserve.new(user_id, current_user.invoicing_profile.id)
|
||||||
.pay_and_save(@reservation, payment_details: details, payment_intent_id: intent.id)
|
.pay_and_save(@reservation, payment_details: details, payment_intent_id: intent.id)
|
||||||
Stripe::PaymentIntent.update(
|
if intent.class == Stripe::PaymentIntent
|
||||||
intent.id,
|
Stripe::PaymentIntent.update(
|
||||||
{ description: "Invoice reference: #{@reservation.invoice.reference}" },
|
intent.id,
|
||||||
{ api_key: Setting.get('stripe_secret_key') }
|
{ description: "Invoice reference: #{@reservation.invoice.reference}" },
|
||||||
)
|
{ api_key: Setting.get('stripe_secret_key') }
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
if is_reserve
|
if is_reserve
|
||||||
SubscriptionExtensionAfterReservation.new(@reservation).extend_subscription_if_eligible
|
SubscriptionExtensionAfterReservation.new(@reservation).extend_subscription_if_eligible
|
||||||
@ -91,14 +123,25 @@ class API::PaymentsController < API::ApiController
|
|||||||
|
|
||||||
def on_subscription_success(intent)
|
def on_subscription_success(intent)
|
||||||
@subscription = Subscription.new(subscription_params)
|
@subscription = Subscription.new(subscription_params)
|
||||||
is_subscribe = Subscriptions::Subscribe.new(current_user.invoicing_profile.id, current_user.id)
|
user_id = if current_user.admin? || current_user.manager?
|
||||||
.pay_and_save(@subscription, coupon: coupon_params[:coupon_code], invoice: true, payment_intent_id: intent.id)
|
params[:cart_items][:subscription][:user_id]
|
||||||
|
else
|
||||||
Stripe::PaymentIntent.update(
|
current_user.id
|
||||||
intent.id,
|
end
|
||||||
{ description: "Invoice reference: #{@subscription.invoices.first.reference}" },
|
is_subscribe = Subscriptions::Subscribe.new(current_user.invoicing_profile.id, user_id)
|
||||||
{ api_key: Setting.get('stripe_secret_key') }
|
.pay_and_save(@subscription,
|
||||||
)
|
coupon: coupon_params[:coupon_code],
|
||||||
|
invoice: true,
|
||||||
|
payment_intent_id: intent.id,
|
||||||
|
schedule: params[:cart_items][:subscription][:payment_schedule],
|
||||||
|
payment_method: 'stripe')
|
||||||
|
if intent.class == Stripe::PaymentIntent
|
||||||
|
Stripe::PaymentIntent.update(
|
||||||
|
intent.id,
|
||||||
|
{ description: "Invoice reference: #{@subscription.invoices.first.reference}" },
|
||||||
|
{ api_key: Setting.get('stripe_secret_key') }
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
if is_subscribe
|
if is_subscribe
|
||||||
{ template: 'api/subscriptions/show', status: :created, location: @subscription }
|
{ template: 'api/subscriptions/show', status: :created, location: @subscription }
|
||||||
|
@ -14,7 +14,7 @@ class API::PricesController < API::ApiController
|
|||||||
@prices = @prices.where(priceable_id: params[:priceable_id]) if params[:priceable_id]
|
@prices = @prices.where(priceable_id: params[:priceable_id]) if params[:priceable_id]
|
||||||
end
|
end
|
||||||
if params[:plan_id]
|
if params[:plan_id]
|
||||||
plan_id = if params[:plan_id] =~ /no|nil|null|undefined/i
|
plan_id = if /no|nil|null|undefined/i.match?(params[:plan_id])
|
||||||
nil
|
nil
|
||||||
else
|
else
|
||||||
params[:plan_id]
|
params[:plan_id]
|
||||||
@ -37,7 +37,11 @@ class API::PricesController < API::ApiController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def compute
|
def compute
|
||||||
price_parameters = compute_price_params
|
price_parameters = if params[:reservation]
|
||||||
|
compute_reservation_price_params
|
||||||
|
elsif params[:subscription]
|
||||||
|
compute_subscription_price_params
|
||||||
|
end
|
||||||
# user
|
# user
|
||||||
user = User.find(price_parameters[:user_id])
|
user = User.find(price_parameters[:user_id])
|
||||||
# reservable
|
# reservable
|
||||||
@ -74,12 +78,16 @@ class API::PricesController < API::ApiController
|
|||||||
params.require(:price).permit(:amount)
|
params.require(:price).permit(:amount)
|
||||||
end
|
end
|
||||||
|
|
||||||
def compute_price_params
|
def compute_reservation_price_params
|
||||||
params.require(:reservation).permit(:reservable_id, :reservable_type, :plan_id, :user_id, :nb_reserve_places, :payment_schedule,
|
params.require(:reservation).permit(:reservable_id, :reservable_type, :plan_id, :user_id, :nb_reserve_places, :payment_schedule,
|
||||||
tickets_attributes: %i[event_price_category_id booked],
|
tickets_attributes: %i[event_price_category_id booked],
|
||||||
slots_attributes: %i[id start_at end_at availability_id offered])
|
slots_attributes: %i[id start_at end_at availability_id offered])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def compute_subscription_price_params
|
||||||
|
params.require(:subscription).permit(:plan_id, :user_id, :payment_schedule)
|
||||||
|
end
|
||||||
|
|
||||||
def coupon_params
|
def coupon_params
|
||||||
params.permit(:coupon_code)
|
params.permit(:coupon_code)
|
||||||
end
|
end
|
||||||
|
@ -22,7 +22,8 @@ class API::SubscriptionsController < API::ApiController
|
|||||||
is_subscribe = Subscriptions::Subscribe.new(current_user.invoicing_profile.id, user_id)
|
is_subscribe = Subscriptions::Subscribe.new(current_user.invoicing_profile.id, user_id)
|
||||||
.pay_and_save(@subscription, coupon: coupon_params[:coupon_code],
|
.pay_and_save(@subscription, coupon: coupon_params[:coupon_code],
|
||||||
invoice: true,
|
invoice: true,
|
||||||
schedule: params[:subscription][:payment_schedule])
|
schedule: params[:subscription][:payment_schedule],
|
||||||
|
payment_method: params[:subscription][:payment_method])
|
||||||
|
|
||||||
if is_subscribe
|
if is_subscribe
|
||||||
render :show, status: :created, location: @subscription
|
render :show, status: :created, location: @subscription
|
||||||
|
@ -17,5 +17,4 @@ class SocialBotController < ActionController::Base
|
|||||||
puts "unknown bot request : #{request.original_url}"
|
puts "unknown bot request : #{request.original_url}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
end
|
|
||||||
|
@ -91,6 +91,7 @@ importAll(require.context('../src/javascript/controllers/', true, /.*/));
|
|||||||
importAll(require.context('../src/javascript/services/', true, /.*/));
|
importAll(require.context('../src/javascript/services/', true, /.*/));
|
||||||
importAll(require.context('../src/javascript/directives/', true, /.*/));
|
importAll(require.context('../src/javascript/directives/', true, /.*/));
|
||||||
importAll(require.context('../src/javascript/filters/', true, /.*/));
|
importAll(require.context('../src/javascript/filters/', true, /.*/));
|
||||||
|
importAll(require.context('../src/javascript/typings/', true, /.*/));
|
||||||
|
|
||||||
importAll(require.context('../images', true));
|
importAll(require.context('../images', true));
|
||||||
importAll(require.context('../templates', true));
|
importAll(require.context('../templates', true));
|
||||||
|
@ -7,6 +7,39 @@ const client: AxiosInstance = axios.create({
|
|||||||
'X-CSRF-Token': token?.content || 'no-csrf-token'
|
'X-CSRF-Token': token?.content || 'no-csrf-token'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
|
|
||||||
|
client.interceptors.response.use(function (response) {
|
||||||
|
// Any status code that lie within the range of 2xx cause this function to trigger
|
||||||
|
return response;
|
||||||
|
}, function (error) {
|
||||||
|
// Any status codes that falls outside the range of 2xx cause this function to trigger
|
||||||
|
const message = error.response?.data || error.message || error;
|
||||||
|
return Promise.reject(extractHumanReadableMessage(message));
|
||||||
|
});
|
||||||
|
|
||||||
|
function extractHumanReadableMessage(error: any): string {
|
||||||
|
if (typeof error === 'string') return error;
|
||||||
|
|
||||||
|
let message = '';
|
||||||
|
if (error instanceof Object) {
|
||||||
|
// iterate through all the keys to build the message
|
||||||
|
for (const key in error) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(error, key)) {
|
||||||
|
message += `${key} : `;
|
||||||
|
if (error[key] instanceof Array) {
|
||||||
|
// standard rails messages are stored as {field: [error1, error2]}
|
||||||
|
// we rebuild them as "field: error1, error2"
|
||||||
|
message += error[key].join(', ');
|
||||||
|
} else {
|
||||||
|
message += error[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
return JSON.stringify(error);
|
||||||
|
}
|
||||||
|
|
||||||
export default client;
|
export default client;
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
import apiClient from './api-client';
|
import apiClient from './api-client';
|
||||||
import { AxiosResponse } from 'axios';
|
import { AxiosResponse } from 'axios';
|
||||||
import { CustomAsset } from '../models/custom-asset';
|
import { CustomAsset, CustomAssetName } from '../models/custom-asset';
|
||||||
import wrapPromise, { IWrapPromise } from '../lib/wrap-promise';
|
import wrapPromise, { IWrapPromise } from '../lib/wrap-promise';
|
||||||
|
|
||||||
export default class CustomAssetAPI {
|
export default class CustomAssetAPI {
|
||||||
async get (name: string): Promise<CustomAsset> {
|
async get (name: CustomAssetName): Promise<CustomAsset> {
|
||||||
const res: AxiosResponse = await apiClient.get(`/api/custom_assets/${name}`);
|
const res: AxiosResponse = await apiClient.get(`/api/custom_assets/${name}`);
|
||||||
return res?.data?.custom_asset;
|
return res?.data?.custom_asset;
|
||||||
}
|
}
|
||||||
|
|
||||||
static get (name: string): IWrapPromise<CustomAsset> {
|
static get (name: CustomAssetName): IWrapPromise<CustomAsset> {
|
||||||
const api = new CustomAssetAPI();
|
const api = new CustomAssetAPI();
|
||||||
return wrapPromise(api.get(name));
|
return wrapPromise(api.get(name));
|
||||||
}
|
}
|
||||||
|
27
app/frontend/src/javascript/api/payment.ts
Normal file
27
app/frontend/src/javascript/api/payment.ts
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
import apiClient from './api-client';
|
||||||
|
import { AxiosResponse } from 'axios';
|
||||||
|
import { CartItems, IntentConfirmation, PaymentConfirmation } from '../models/payment';
|
||||||
|
|
||||||
|
export default class PaymentAPI {
|
||||||
|
static async confirm (stp_payment_method_id: string, cart_items: CartItems): Promise<PaymentConfirmation> {
|
||||||
|
const res: AxiosResponse = await apiClient.post(`/api/payments/confirm_payment`, {
|
||||||
|
payment_method_id: stp_payment_method_id,
|
||||||
|
cart_items
|
||||||
|
});
|
||||||
|
return res?.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static async setupIntent (user_id: number): Promise<IntentConfirmation> {
|
||||||
|
const res: AxiosResponse = await apiClient.get(`/api/payments/setup_intent/${user_id}`);
|
||||||
|
return res?.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static async confirmPaymentSchedule (setup_intent_id: string, cart_items: CartItems): Promise<any> {
|
||||||
|
const res: AxiosResponse = await apiClient.post(`/api/payments/confirm_payment_schedule`, {
|
||||||
|
setup_intent_id,
|
||||||
|
cart_items
|
||||||
|
});
|
||||||
|
return res?.data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
12
app/frontend/src/javascript/api/price.ts
Normal file
12
app/frontend/src/javascript/api/price.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import apiClient from './api-client';
|
||||||
|
import { AxiosResponse } from 'axios';
|
||||||
|
import { CartItems } from '../models/payment';
|
||||||
|
import { ComputePriceResult } from '../models/price';
|
||||||
|
|
||||||
|
export default class PriceAPI {
|
||||||
|
static async compute (cartItems: CartItems): Promise<ComputePriceResult> {
|
||||||
|
const res: AxiosResponse = await apiClient.post(`/api/prices/compute`, cartItems);
|
||||||
|
return res?.data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
27
app/frontend/src/javascript/api/setting.ts
Normal file
27
app/frontend/src/javascript/api/setting.ts
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
import apiClient from './api-client';
|
||||||
|
import { AxiosResponse } from 'axios';
|
||||||
|
import { Setting, SettingName } from '../models/setting';
|
||||||
|
import wrapPromise, { IWrapPromise } from '../lib/wrap-promise';
|
||||||
|
|
||||||
|
export default class SettingAPI {
|
||||||
|
async get (name: SettingName): Promise<Setting> {
|
||||||
|
const res: AxiosResponse = await apiClient.get(`/api/settings/${name}`);
|
||||||
|
return res?.data?.setting;
|
||||||
|
}
|
||||||
|
|
||||||
|
async query (names: Array<SettingName>): Promise<Map<SettingName, any>> {
|
||||||
|
const res: AxiosResponse = await apiClient.get(`/api/settings/?names=[${names.join(',')}]`);
|
||||||
|
return res?.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static get (name: SettingName): IWrapPromise<Setting> {
|
||||||
|
const api = new SettingAPI();
|
||||||
|
return wrapPromise(api.get(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
static query(names: Array<SettingName>): IWrapPromise<Map<SettingName, any>> {
|
||||||
|
const api = new SettingAPI();
|
||||||
|
return wrapPromise(api.query(names));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
12
app/frontend/src/javascript/api/wallet.ts
Normal file
12
app/frontend/src/javascript/api/wallet.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import apiClient from './api-client';
|
||||||
|
import { AxiosResponse } from 'axios';
|
||||||
|
import wrapPromise, { IWrapPromise } from '../lib/wrap-promise';
|
||||||
|
import { Wallet } from '../models/wallet';
|
||||||
|
|
||||||
|
export default class WalletAPI {
|
||||||
|
static async getByUser (user_id: number): Promise<Wallet> {
|
||||||
|
const res: AxiosResponse = await apiClient.get(`/api/wallet/by_user/${user_id}`);
|
||||||
|
return res?.data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -3,7 +3,7 @@
|
|||||||
*/
|
*/
|
||||||
import Switch from 'react-switch';
|
import Switch from 'react-switch';
|
||||||
import { react2angular } from 'react2angular';
|
import { react2angular } from 'react2angular';
|
||||||
import { IApplication } from '../models/application';
|
import { IApplication } from '../../models/application';
|
||||||
|
|
||||||
declare var Application: IApplication;
|
declare var Application: IApplication;
|
||||||
|
|
@ -1,30 +1,63 @@
|
|||||||
/**
|
/**
|
||||||
* This component is a modal dialog that can wraps the application style
|
* This component is a template for a modal dialog that wraps the application style
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from 'react';
|
import React, { ReactNode } from 'react';
|
||||||
import Modal from 'react-modal';
|
import Modal from 'react-modal';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { Loader } from './loader';
|
import { Loader } from './loader';
|
||||||
import CustomAsset from '../api/custom-asset';
|
import CustomAssetAPI from '../api/custom-asset';
|
||||||
|
import { CustomAssetName } from '../models/custom-asset';
|
||||||
|
|
||||||
Modal.setAppElement('body');
|
Modal.setAppElement('body');
|
||||||
|
|
||||||
|
export enum ModalSize {
|
||||||
|
small = 'sm',
|
||||||
|
medium = 'md',
|
||||||
|
large = 'lg'
|
||||||
|
}
|
||||||
|
|
||||||
interface FabModalProps {
|
interface FabModalProps {
|
||||||
title: string,
|
title: string,
|
||||||
isOpen: boolean,
|
isOpen: boolean,
|
||||||
toggleModal: () => void
|
toggleModal: () => void,
|
||||||
|
confirmButton?: ReactNode,
|
||||||
|
closeButton?: boolean,
|
||||||
|
className?: string,
|
||||||
|
width?: ModalSize,
|
||||||
|
customFooter?: ReactNode
|
||||||
}
|
}
|
||||||
|
|
||||||
const blackLogoFile = CustomAsset.get('logo-black-file');
|
const blackLogoFile = CustomAssetAPI.get(CustomAssetName.LogoBlackFile);
|
||||||
|
|
||||||
export const FabModal: React.FC<FabModalProps> = ({ title, isOpen, toggleModal, children }) => {
|
export const FabModal: React.FC<FabModalProps> = ({ title, isOpen, toggleModal, children, confirmButton, className, width = 'sm', closeButton, customFooter }) => {
|
||||||
const { t } = useTranslation('shared');
|
const { t } = useTranslation('shared');
|
||||||
const blackLogo = blackLogoFile.read();
|
const blackLogo = blackLogoFile.read();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the confirm button should be present
|
||||||
|
*/
|
||||||
|
const hasConfirmButton = (): boolean => {
|
||||||
|
return confirmButton !== undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Should we display the close button?
|
||||||
|
*/
|
||||||
|
const hasCloseButton = (): boolean => {
|
||||||
|
return closeButton;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if there's a custom footer
|
||||||
|
*/
|
||||||
|
const hasCustomFooter = (): boolean => {
|
||||||
|
return customFooter !== undefined;
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Modal isOpen={isOpen}
|
<Modal isOpen={isOpen}
|
||||||
className="fab-modal"
|
className={`fab-modal fab-modal-${width} ${className}`}
|
||||||
overlayClassName="fab-modal-overlay"
|
overlayClassName="fab-modal-overlay"
|
||||||
onRequestClose={toggleModal}>
|
onRequestClose={toggleModal}>
|
||||||
<div className="fab-modal-header">
|
<div className="fab-modal-header">
|
||||||
@ -40,7 +73,9 @@ export const FabModal: React.FC<FabModalProps> = ({ title, isOpen, toggleModal,
|
|||||||
</div>
|
</div>
|
||||||
<div className="fab-modal-footer">
|
<div className="fab-modal-footer">
|
||||||
<Loader>
|
<Loader>
|
||||||
<button className="close-modal-btn" onClick={toggleModal}>{t('app.shared.buttons.close')}</button>
|
{hasCloseButton() &&<button className="modal-btn--close" onClick={toggleModal}>{t('app.shared.buttons.close')}</button>}
|
||||||
|
{hasConfirmButton() && <span className="modal-btn--confirm">{confirmButton}</span>}
|
||||||
|
{hasCustomFooter() && customFooter}
|
||||||
</Loader>
|
</Loader>
|
||||||
</div>
|
</div>
|
||||||
</Modal>
|
</Modal>
|
||||||
|
18
app/frontend/src/javascript/components/html-translate.tsx
Normal file
18
app/frontend/src/javascript/components/html-translate.tsx
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/**
|
||||||
|
* This component renders a translation with some HTML content.
|
||||||
|
*/
|
||||||
|
import React from 'react';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|
||||||
|
interface HtmlTranslateProps {
|
||||||
|
trKey: string,
|
||||||
|
options?: any
|
||||||
|
}
|
||||||
|
|
||||||
|
export const HtmlTranslate: React.FC<HtmlTranslateProps> = ({ trKey, options }) => {
|
||||||
|
const { t } = useTranslation(trKey?.split('.')[1]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<span dangerouslySetInnerHTML={{__html: t(trKey, options)}} />
|
||||||
|
);
|
||||||
|
}
|
@ -8,19 +8,19 @@ import { react2angular } from 'react2angular';
|
|||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
import { IApplication } from '../models/application';
|
import { IApplication } from '../models/application';
|
||||||
import '../lib/i18n';
|
import '../lib/i18n';
|
||||||
import { IFilterService } from 'angular';
|
|
||||||
import { PaymentSchedule } from '../models/payment-schedule';
|
import { PaymentSchedule } from '../models/payment-schedule';
|
||||||
import { Loader } from './loader';
|
import { Loader } from './loader';
|
||||||
import { FabModal } from './fab-modal';
|
import { FabModal } from './fab-modal';
|
||||||
|
import { IFablab } from '../models/fablab';
|
||||||
|
|
||||||
declare var Application: IApplication;
|
declare var Application: IApplication;
|
||||||
|
declare var Fablab: IFablab;
|
||||||
|
|
||||||
interface PaymentScheduleSummaryProps {
|
interface PaymentScheduleSummaryProps {
|
||||||
schedule: PaymentSchedule,
|
schedule: PaymentSchedule
|
||||||
$filter: IFilterService
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const PaymentScheduleSummary: React.FC<PaymentScheduleSummaryProps> = ({ schedule, $filter }) => {
|
const PaymentScheduleSummary: React.FC<PaymentScheduleSummaryProps> = ({ schedule }) => {
|
||||||
const { t } = useTranslation('shared');
|
const { t } = useTranslation('shared');
|
||||||
const [modal, setModal] = useState(false);
|
const [modal, setModal] = useState(false);
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ const PaymentScheduleSummary: React.FC<PaymentScheduleSummaryProps> = ({ schedul
|
|||||||
* Return the formatted localized amount for the given price (eg. 20.5 => "20,50 €")
|
* Return the formatted localized amount for the given price (eg. 20.5 => "20,50 €")
|
||||||
*/
|
*/
|
||||||
const formatPrice = (price: number): string => {
|
const formatPrice = (price: number): string => {
|
||||||
return $filter('currency')(price);
|
return new Intl.NumberFormat(Fablab.intl_locale, {style: 'currency', currency: Fablab.intl_currency}).format(price);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Test if all payment deadlines have the same amount
|
* Test if all payment deadlines have the same amount
|
||||||
@ -90,12 +90,12 @@ const PaymentScheduleSummary: React.FC<PaymentScheduleSummaryProps> = ({ schedul
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
const PaymentScheduleSummaryWrapper: React.FC<PaymentScheduleSummaryProps> = ({ schedule, $filter }) => {
|
const PaymentScheduleSummaryWrapper: React.FC<PaymentScheduleSummaryProps> = ({ schedule }) => {
|
||||||
return (
|
return (
|
||||||
<Loader>
|
<Loader>
|
||||||
<PaymentScheduleSummary schedule={schedule} $filter={$filter} />
|
<PaymentScheduleSummary schedule={schedule} />
|
||||||
</Loader>
|
</Loader>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Application.Components.component('paymentScheduleSummary', react2angular(PaymentScheduleSummaryWrapper, ['schedule'], ['$filter']));
|
Application.Components.component('paymentScheduleSummary', react2angular(PaymentScheduleSummaryWrapper, ['schedule']));
|
||||||
|
@ -2,10 +2,9 @@
|
|||||||
* This component is a "card" publicly presenting the details of a plan
|
* This component is a "card" publicly presenting the details of a plan
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { react2angular } from 'react2angular';
|
import { react2angular } from 'react2angular';
|
||||||
import { IFilterService } from 'angular';
|
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
import _ from 'lodash'
|
import _ from 'lodash'
|
||||||
import { IApplication } from '../models/application';
|
import { IApplication } from '../models/application';
|
||||||
@ -13,32 +12,34 @@ import { Plan } from '../models/plan';
|
|||||||
import { User, UserRole } from '../models/user';
|
import { User, UserRole } from '../models/user';
|
||||||
import { Loader } from './loader';
|
import { Loader } from './loader';
|
||||||
import '../lib/i18n';
|
import '../lib/i18n';
|
||||||
|
import { IFablab } from '../models/fablab';
|
||||||
|
|
||||||
declare var Application: IApplication;
|
declare var Application: IApplication;
|
||||||
|
declare var Fablab: IFablab;
|
||||||
|
|
||||||
interface PlanCardProps {
|
interface PlanCardProps {
|
||||||
plan: Plan,
|
plan: Plan,
|
||||||
user: User,
|
userId?: number,
|
||||||
|
subscribedPlanId?: number,
|
||||||
operator: User,
|
operator: User,
|
||||||
isSelected: boolean,
|
isSelected: boolean,
|
||||||
onSelectPlan: (plan: Plan) => void,
|
onSelectPlan: (plan: Plan) => void,
|
||||||
$filter: IFilterService
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const PlanCard: React.FC<PlanCardProps> = ({ plan, user, operator, onSelectPlan, isSelected, $filter }) => {
|
const PlanCard: React.FC<PlanCardProps> = ({ plan, userId, subscribedPlanId, operator, onSelectPlan, isSelected }) => {
|
||||||
const { t } = useTranslation('public');
|
const { t } = useTranslation('public');
|
||||||
/**
|
/**
|
||||||
* Return the formatted localized amount of the given plan (eg. 20.5 => "20,50 €")
|
* Return the formatted localized amount of the given plan (eg. 20.5 => "20,50 €")
|
||||||
*/
|
*/
|
||||||
const amount = () : string => {
|
const amount = () : string => {
|
||||||
return $filter('currency')(plan.amount);
|
return new Intl.NumberFormat(Fablab.intl_locale, {style: 'currency', currency: Fablab.intl_currency}).format(plan.amount);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Return the formatted localized amount, divided by the number of months (eg. 120 => "10,00 € / month")
|
* Return the formatted localized amount, divided by the number of months (eg. 120 => "10,00 € / month")
|
||||||
*/
|
*/
|
||||||
const monthlyAmount = (): string => {
|
const monthlyAmount = (): string => {
|
||||||
const monthly = plan.amount / moment.duration(plan.interval_count, plan.interval).asMonths();
|
const monthly = plan.amount / moment.duration(plan.interval_count, plan.interval).asMonths();
|
||||||
return $filter('currency')(monthly);
|
return new Intl.NumberFormat(Fablab.intl_locale, {style: 'currency', currency: Fablab.intl_currency}).format(monthly);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Return the formatted localized duration of te given plan (eg. Month/3 => "3 mois")
|
* Return the formatted localized duration of te given plan (eg. Month/3 => "3 mois")
|
||||||
@ -50,19 +51,19 @@ const PlanCard: React.FC<PlanCardProps> = ({ plan, user, operator, onSelectPlan,
|
|||||||
* Check if the user can subscribe to the current plan, for himself
|
* Check if the user can subscribe to the current plan, for himself
|
||||||
*/
|
*/
|
||||||
const canSubscribeForMe = (): boolean => {
|
const canSubscribeForMe = (): boolean => {
|
||||||
return operator?.role === UserRole.Member || (operator?.role === UserRole.Manager && user?.id === operator?.id)
|
return operator?.role === UserRole.Member || (operator?.role === UserRole.Manager && userId === operator?.id)
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Check if the user can subscribe to the current plan, for someone else
|
* Check if the user can subscribe to the current plan, for someone else
|
||||||
*/
|
*/
|
||||||
const canSubscribeForOther = (): boolean => {
|
const canSubscribeForOther = (): boolean => {
|
||||||
return operator?.role === UserRole.Admin || (operator?.role === UserRole.Manager && user?.id !== operator?.id)
|
return operator?.role === UserRole.Admin || (operator?.role === UserRole.Manager && userId !== operator?.id)
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Check it the user has subscribed to this plan or not
|
* Check it the user has subscribed to this plan or not
|
||||||
*/
|
*/
|
||||||
const hasSubscribedToThisPlan = (): boolean => {
|
const hasSubscribedToThisPlan = (): boolean => {
|
||||||
return user?.subscription?.plan?.id === plan.id;
|
return subscribedPlanId === plan.id;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Check if the plan has an attached file
|
* Check if the plan has an attached file
|
||||||
@ -102,18 +103,18 @@ const PlanCard: React.FC<PlanCardProps> = ({ plan, user, operator, onSelectPlan,
|
|||||||
{canSubscribeForMe() && <div className="cta-button">
|
{canSubscribeForMe() && <div className="cta-button">
|
||||||
{!hasSubscribedToThisPlan() && <button className={`subscribe-button ${isSelected ? 'selected-card' : ''}`}
|
{!hasSubscribedToThisPlan() && <button className={`subscribe-button ${isSelected ? 'selected-card' : ''}`}
|
||||||
onClick={handleSelectPlan}
|
onClick={handleSelectPlan}
|
||||||
disabled={!_.isNil(user.subscription)}>
|
disabled={!_.isNil(subscribedPlanId)}>
|
||||||
{user && <span>{t('app.public.plans.i_choose_that_plan')}</span>}
|
{userId && <span>{t('app.public.plans.i_choose_that_plan')}</span>}
|
||||||
{!user && <span>{t('app.public.plans.i_subscribe_online')}</span>}
|
{!userId && <span>{t('app.public.plans.i_subscribe_online')}</span>}
|
||||||
</button>}
|
</button>}
|
||||||
{hasSubscribedToThisPlan() && <button className="subscribe-button" disabled>
|
{hasSubscribedToThisPlan() && <button className="subscribe-button selected-card" disabled>
|
||||||
{ t('app.public.plans.i_already_subscribed') }
|
{ t('app.public.plans.i_already_subscribed') }
|
||||||
</button>}
|
</button>}
|
||||||
</div>}
|
</div>}
|
||||||
{canSubscribeForOther() && <div className="cta-button">
|
{canSubscribeForOther() && <div className="cta-button">
|
||||||
<button className={`subscribe-button ${isSelected ? 'selected-card' : ''}`}
|
<button className={`subscribe-button ${isSelected ? 'selected-card' : ''}`}
|
||||||
onClick={handleSelectPlan}
|
onClick={handleSelectPlan}
|
||||||
disabled={_.isNil(user)}>
|
disabled={_.isNil(userId)}>
|
||||||
<span>{ t('app.public.plans.i_choose_that_plan') }</span>
|
<span>{ t('app.public.plans.i_choose_that_plan') }</span>
|
||||||
</button>
|
</button>
|
||||||
</div>}
|
</div>}
|
||||||
@ -122,12 +123,12 @@ const PlanCard: React.FC<PlanCardProps> = ({ plan, user, operator, onSelectPlan,
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const PlanCardWrapper: React.FC<PlanCardProps> = ({ plan, user, operator, onSelectPlan, isSelected, $filter }) => {
|
const PlanCardWrapper: React.FC<PlanCardProps> = ({ plan, userId, subscribedPlanId, operator, onSelectPlan, isSelected }) => {
|
||||||
return (
|
return (
|
||||||
<Loader>
|
<Loader>
|
||||||
<PlanCard plan={plan} user={user} operator={operator} isSelected={isSelected} onSelectPlan={onSelectPlan} $filter={$filter} />
|
<PlanCard plan={plan} userId={userId} subscribedPlanId={subscribedPlanId} operator={operator} isSelected={isSelected} onSelectPlan={onSelectPlan}/>
|
||||||
</Loader>
|
</Loader>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Application.Components.component('planCard', react2angular(PlanCardWrapper, ['plan', 'user', 'operator', 'onSelectPlan', 'isSelected'], ['$filter']));
|
Application.Components.component('planCard', react2angular(PlanCardWrapper, ['plan', 'userId', 'subscribedPlanId', 'operator', 'onSelectPlan', 'isSelected']));
|
||||||
|
30
app/frontend/src/javascript/components/stripe-elements.tsx
Normal file
30
app/frontend/src/javascript/components/stripe-elements.tsx
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/**
|
||||||
|
* This component initializes the stripe's Elements tag with the API key
|
||||||
|
*/
|
||||||
|
|
||||||
|
import React, { memo, useEffect, useState } from 'react';
|
||||||
|
import { Elements } from '@stripe/react-stripe-js';
|
||||||
|
import { loadStripe } from "@stripe/stripe-js";
|
||||||
|
import SettingAPI from '../api/setting';
|
||||||
|
import { SettingName } from '../models/setting';
|
||||||
|
import { Loader } from './loader';
|
||||||
|
|
||||||
|
const stripePublicKey = SettingAPI.get(SettingName.StripePublicKey);
|
||||||
|
|
||||||
|
export const StripeElements: React.FC = memo(({ children }) => {
|
||||||
|
const [stripe, setStripe] = useState(undefined);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const key = stripePublicKey.read();
|
||||||
|
const promise = loadStripe(key.value);
|
||||||
|
setStripe(promise);
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
{stripe && <Elements stripe={stripe}>
|
||||||
|
{children}
|
||||||
|
</Elements>}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})
|
136
app/frontend/src/javascript/components/stripe-form.tsx
Normal file
136
app/frontend/src/javascript/components/stripe-form.tsx
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
import React, { FormEvent } from 'react';
|
||||||
|
import { CardElement, useElements, useStripe } from '@stripe/react-stripe-js';
|
||||||
|
import { SetupIntent } from "@stripe/stripe-js";
|
||||||
|
import PaymentAPI from '../api/payment';
|
||||||
|
import { CartItems, PaymentConfirmation } from '../models/payment';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import { User } from '../models/user';
|
||||||
|
|
||||||
|
interface StripeFormProps {
|
||||||
|
onSubmit: () => void,
|
||||||
|
onSuccess: (result: SetupIntent|PaymentConfirmation|any) => void,
|
||||||
|
onError: (message: string) => void,
|
||||||
|
customer: User,
|
||||||
|
className?: string,
|
||||||
|
paymentSchedule?: boolean,
|
||||||
|
cartItems?: CartItems
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A form component to collect the credit card details and to create the payment method on Stripe.
|
||||||
|
* The form validation button must be created elsewhere, using the attribute form="stripe-form".
|
||||||
|
*/
|
||||||
|
export const StripeForm: React.FC<StripeFormProps> = ({ onSubmit, onSuccess, onError, children, className, paymentSchedule = false, cartItems, customer }) => {
|
||||||
|
|
||||||
|
const { t } = useTranslation('shared');
|
||||||
|
|
||||||
|
const stripe = useStripe();
|
||||||
|
const elements = useElements();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the submission of the form. Depending on the configuration, it will create the payment method on Stripe,
|
||||||
|
* or it will process a payment with the inputted card.
|
||||||
|
*/
|
||||||
|
const handleSubmit = async (event: FormEvent): Promise<void> => {
|
||||||
|
event.preventDefault();
|
||||||
|
onSubmit();
|
||||||
|
|
||||||
|
// Stripe.js has not loaded yet
|
||||||
|
if (!stripe || !elements) { return; }
|
||||||
|
|
||||||
|
const cardElement = elements.getElement(CardElement);
|
||||||
|
const { error, paymentMethod } = await stripe.createPaymentMethod({
|
||||||
|
type: 'card',
|
||||||
|
card: cardElement,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
// stripe error
|
||||||
|
onError(error.message);
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
if (!paymentSchedule) {
|
||||||
|
// process the normal payment pipeline, including SCA validation
|
||||||
|
const res = await PaymentAPI.confirm(paymentMethod.id, cartItems);
|
||||||
|
await handleServerConfirmation(res);
|
||||||
|
} else {
|
||||||
|
// we start by associating the payment method with the user
|
||||||
|
const { client_secret } = await PaymentAPI.setupIntent(customer.id);
|
||||||
|
const { setupIntent, error } = await stripe.confirmCardSetup(client_secret, {
|
||||||
|
payment_method: paymentMethod.id
|
||||||
|
})
|
||||||
|
if (error) {
|
||||||
|
onError(error.message);
|
||||||
|
} else {
|
||||||
|
// then we confirm the payment schedule
|
||||||
|
const res = await PaymentAPI.confirmPaymentSchedule(setupIntent.id, cartItems);
|
||||||
|
onSuccess(res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
// catch api errors
|
||||||
|
onError(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process the server response about the Strong-customer authentication (SCA)
|
||||||
|
* @param response can be a PaymentConfirmation, or a Reservation (if the reservation succeeded), or a Subscription (if the subscription succeeded)
|
||||||
|
* @see app/controllers/api/payments_controller.rb#on_reservation_success
|
||||||
|
* @see app/controllers/api/payments_controller.rb#on_subscription_success
|
||||||
|
* @see app/controllers/api/payments_controller.rb#generate_payment_response
|
||||||
|
*/
|
||||||
|
const handleServerConfirmation = async (response: PaymentConfirmation|any) => {
|
||||||
|
if (response.error) {
|
||||||
|
if (response.error.statusText) {
|
||||||
|
onError(response.error.statusText);
|
||||||
|
} else {
|
||||||
|
onError(`${t('app.shared.messages.payment_card_error')} ${response.error}`);
|
||||||
|
}
|
||||||
|
} else if (response.requires_action) {
|
||||||
|
// Use Stripe.js to handle required card action
|
||||||
|
const result = await stripe.handleCardAction(response.payment_intent_client_secret);
|
||||||
|
if (result.error) {
|
||||||
|
onError(result.error.message);
|
||||||
|
} else {
|
||||||
|
// The card action has been handled
|
||||||
|
// The PaymentIntent can be confirmed again on the server
|
||||||
|
try {
|
||||||
|
const confirmation = await PaymentAPI.confirm(result.paymentIntent.id, cartItems);
|
||||||
|
await handleServerConfirmation(confirmation);
|
||||||
|
} catch (e) {
|
||||||
|
onError(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
onSuccess(response);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Options for the Stripe's card input
|
||||||
|
*/
|
||||||
|
const cardOptions = {
|
||||||
|
style: {
|
||||||
|
base: {
|
||||||
|
fontSize: '16px',
|
||||||
|
color: '#424770',
|
||||||
|
'::placeholder': { color: '#aab7c4' }
|
||||||
|
},
|
||||||
|
invalid: {
|
||||||
|
color: '#9e2146',
|
||||||
|
iconColor: '#9e2146'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
hidePostalCode: true
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<form onSubmit={handleSubmit} id="stripe-form" className={className}>
|
||||||
|
<CardElement options={cardOptions} />
|
||||||
|
{children}
|
||||||
|
</form>
|
||||||
|
);
|
||||||
|
}
|
224
app/frontend/src/javascript/components/stripe-modal.tsx
Normal file
224
app/frontend/src/javascript/components/stripe-modal.tsx
Normal file
@ -0,0 +1,224 @@
|
|||||||
|
/**
|
||||||
|
* This component enables the user to input his card data or process payments.
|
||||||
|
* Supports Strong-Customer Authentication (SCA).
|
||||||
|
*/
|
||||||
|
|
||||||
|
import React, { ReactNode, useEffect, useState } from 'react';
|
||||||
|
import { react2angular } from 'react2angular';
|
||||||
|
import { Loader } from './loader';
|
||||||
|
import { IApplication } from '../models/application';
|
||||||
|
import { StripeElements } from './stripe-elements';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import { FabModal, ModalSize } from './fab-modal';
|
||||||
|
import { SetupIntent } from '@stripe/stripe-js';
|
||||||
|
import { WalletInfo } from './wallet-info';
|
||||||
|
import { User } from '../models/user';
|
||||||
|
import CustomAssetAPI from '../api/custom-asset';
|
||||||
|
import { CustomAssetName } from '../models/custom-asset';
|
||||||
|
import { PaymentSchedule } from '../models/payment-schedule';
|
||||||
|
import { IFablab } from '../models/fablab';
|
||||||
|
import WalletLib from '../lib/wallet';
|
||||||
|
import { StripeForm } from './stripe-form';
|
||||||
|
|
||||||
|
import stripeLogo from '../../../images/powered_by_stripe.png';
|
||||||
|
import mastercardLogo from '../../../images/mastercard.png';
|
||||||
|
import visaLogo from '../../../images/visa.png';
|
||||||
|
import { CartItems, PaymentConfirmation } from '../models/payment';
|
||||||
|
import WalletAPI from '../api/wallet';
|
||||||
|
import PriceAPI from '../api/price';
|
||||||
|
import { HtmlTranslate } from './html-translate';
|
||||||
|
|
||||||
|
declare var Application: IApplication;
|
||||||
|
declare var Fablab: IFablab;
|
||||||
|
|
||||||
|
interface StripeModalProps {
|
||||||
|
isOpen: boolean,
|
||||||
|
toggleModal: () => void,
|
||||||
|
afterSuccess: (result: SetupIntent|PaymentConfirmation) => void,
|
||||||
|
cartItems: CartItems,
|
||||||
|
currentUser: User,
|
||||||
|
schedule: PaymentSchedule,
|
||||||
|
customer: User
|
||||||
|
}
|
||||||
|
|
||||||
|
const cgvFile = CustomAssetAPI.get(CustomAssetName.CgvFile);
|
||||||
|
|
||||||
|
const StripeModal: React.FC<StripeModalProps> = ({ isOpen, toggleModal, afterSuccess, cartItems, currentUser, schedule, customer }) => {
|
||||||
|
// customer's wallet
|
||||||
|
const [wallet, setWallet] = useState(null);
|
||||||
|
// server-computed price with all details
|
||||||
|
const [price, setPrice] = useState(null);
|
||||||
|
// remaining price = total price - wallet amount
|
||||||
|
const [remainingPrice, setRemainingPrice] = useState(0);
|
||||||
|
// is the component ready to display?
|
||||||
|
const [ready, setReady] = useState(false);
|
||||||
|
// errors to display in the UI (stripe errors mainly)
|
||||||
|
const [errors, setErrors] = useState(null);
|
||||||
|
// are we currently processing the payment (ie. the form was submit, but the process is still running)?
|
||||||
|
const [submitState, setSubmitState] = useState(false);
|
||||||
|
// did the user accepts the terms of services (CGV)?
|
||||||
|
const [tos, setTos] = useState(false);
|
||||||
|
|
||||||
|
const { t } = useTranslation('shared');
|
||||||
|
const cgv = cgvFile.read();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* On each display:
|
||||||
|
* - Refresh the wallet
|
||||||
|
* - Refresh the price
|
||||||
|
* - Refresh the remaining price
|
||||||
|
*/
|
||||||
|
useEffect(() => {
|
||||||
|
if (!cartItems) return;
|
||||||
|
WalletAPI.getByUser(cartItems.reservation?.user_id || cartItems.subscription?.user_id).then((wallet) => {
|
||||||
|
setWallet(wallet);
|
||||||
|
PriceAPI.compute(cartItems).then((res) => {
|
||||||
|
setPrice(res);
|
||||||
|
const wLib = new WalletLib(wallet);
|
||||||
|
setRemainingPrice(wLib.computeRemainingPrice(res.price));
|
||||||
|
setReady(true);
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}, [cartItems]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if there is currently an error to display
|
||||||
|
*/
|
||||||
|
const hasErrors = (): boolean => {
|
||||||
|
return errors !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the user accepts the Terms of Sales document
|
||||||
|
*/
|
||||||
|
const hasCgv = (): boolean => {
|
||||||
|
return cgv != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Triggered when the user accepts or declines the Terms of Sales
|
||||||
|
*/
|
||||||
|
const toggleTos = (): void => {
|
||||||
|
setTos(!tos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if we are currently creating a payment schedule
|
||||||
|
*/
|
||||||
|
const isPaymentSchedule = (): boolean => {
|
||||||
|
return schedule !== undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the formatted localized amount for the given price (eg. 20.5 => "20,50 €")
|
||||||
|
*/
|
||||||
|
const formatPrice = (amount: number): string => {
|
||||||
|
return new Intl.NumberFormat(Fablab.intl_locale, {style: 'currency', currency: Fablab.intl_currency}).format(amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the logos, shown in the modal footer.
|
||||||
|
*/
|
||||||
|
const logoFooter = (): ReactNode => {
|
||||||
|
return (
|
||||||
|
<div className="stripe-modal-icons">
|
||||||
|
<i className="fa fa-lock fa-2x m-r-sm pos-rlt" />
|
||||||
|
<img src={stripeLogo} alt="powered by stripe" />
|
||||||
|
<img src={mastercardLogo} alt="mastercard" />
|
||||||
|
<img src={visaLogo} alt="visa" />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the component as 'currently submitting'
|
||||||
|
*/
|
||||||
|
const handleSubmit = (): void => {
|
||||||
|
setSubmitState(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* After sending the form with success, process the resulting payment method
|
||||||
|
*/
|
||||||
|
const handleFormSuccess = async (result: SetupIntent|PaymentConfirmation|any): Promise<void> => {
|
||||||
|
setSubmitState(false);
|
||||||
|
afterSuccess(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When stripe-form raise an error, it is handled by this callback which display it in the modal.
|
||||||
|
*/
|
||||||
|
const handleFormError = (message: string): void => {
|
||||||
|
setSubmitState(false);
|
||||||
|
setErrors(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check the form can be submitted.
|
||||||
|
* => We're not currently already submitting the form, and, if the terms of service are enabled, the user agrees with them.
|
||||||
|
*/
|
||||||
|
const canSubmit = (): boolean => {
|
||||||
|
let terms = true;
|
||||||
|
if (hasCgv()) { terms = tos; }
|
||||||
|
return !submitState && terms;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return (
|
||||||
|
<FabModal title={t('app.shared.stripe.online_payment')}
|
||||||
|
isOpen={isOpen}
|
||||||
|
toggleModal={toggleModal}
|
||||||
|
width={ModalSize.medium}
|
||||||
|
closeButton={false}
|
||||||
|
customFooter={logoFooter()}
|
||||||
|
className="stripe-modal">
|
||||||
|
{ready && <StripeElements>
|
||||||
|
<WalletInfo reservation={cartItems?.reservation} currentUser={currentUser} wallet={wallet} price={price?.price} />
|
||||||
|
<StripeForm onSubmit={handleSubmit}
|
||||||
|
onSuccess={handleFormSuccess}
|
||||||
|
onError={handleFormError}
|
||||||
|
className="stripe-form"
|
||||||
|
cartItems={cartItems}
|
||||||
|
customer={customer}
|
||||||
|
paymentSchedule={isPaymentSchedule()}>
|
||||||
|
{hasErrors() && <div className="stripe-errors">
|
||||||
|
{errors}
|
||||||
|
</div>}
|
||||||
|
{isPaymentSchedule() && <div className="payment-schedule-info">
|
||||||
|
<HtmlTranslate trKey="app.shared.stripe.payment_schedule_html" options={{ DEADLINES: schedule.items.length }} />
|
||||||
|
</div>}
|
||||||
|
{hasCgv() && <div className="terms-of-sales">
|
||||||
|
<input type="checkbox" id="acceptToS" name="acceptCondition" checked={tos} onChange={toggleTos} required />
|
||||||
|
<label htmlFor="acceptToS">{ t('app.shared.stripe.i_have_read_and_accept_') }
|
||||||
|
<a href={cgv.custom_asset_file_attributes.attachment_url} target="_blank">
|
||||||
|
{ t('app.shared.stripe._the_general_terms_and_conditions') }
|
||||||
|
</a>
|
||||||
|
</label>
|
||||||
|
</div>}
|
||||||
|
</StripeForm>
|
||||||
|
{!submitState && <button type="submit"
|
||||||
|
disabled={!canSubmit()}
|
||||||
|
form="stripe-form"
|
||||||
|
className="validate-btn">
|
||||||
|
{t('app.shared.stripe.confirm_payment_of_', { AMOUNT: formatPrice(remainingPrice) })}
|
||||||
|
</button>}
|
||||||
|
{submitState && <div className="payment-pending">
|
||||||
|
<div className="fa-2x">
|
||||||
|
<i className="fas fa-circle-notch fa-spin" />
|
||||||
|
</div>
|
||||||
|
</div>}
|
||||||
|
</StripeElements>}
|
||||||
|
</FabModal>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const StripeModalWrapper: React.FC<StripeModalProps> = ({ isOpen, toggleModal, afterSuccess, currentUser, schedule , cartItems, customer }) => {
|
||||||
|
return (
|
||||||
|
<Loader>
|
||||||
|
<StripeModal isOpen={isOpen} toggleModal={toggleModal} afterSuccess={afterSuccess} currentUser={currentUser} schedule={schedule} cartItems={cartItems} customer={customer} />
|
||||||
|
</Loader>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Application.Components.component('stripeModal', react2angular(StripeModalWrapper, ['isOpen', 'toggleModal', 'afterSuccess','currentUser', 'schedule', 'cartItems', 'customer']));
|
@ -2,123 +2,130 @@
|
|||||||
* This component displays a summary of the amount paid with the virtual wallet, for the current transaction
|
* This component displays a summary of the amount paid with the virtual wallet, for the current transaction
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { react2angular } from 'react2angular';
|
import { react2angular } from 'react2angular';
|
||||||
import moment from 'moment';
|
|
||||||
import { IApplication } from '../models/application';
|
import { IApplication } from '../models/application';
|
||||||
import '../lib/i18n';
|
import '../lib/i18n';
|
||||||
import { IFilterService } from 'angular';
|
|
||||||
import { Loader } from './loader';
|
import { Loader } from './loader';
|
||||||
import { Reservation } from '../models/reservation';
|
import { Reservation } from '../models/reservation';
|
||||||
import { User } from '../models/user';
|
import { User } from '../models/user';
|
||||||
import { Wallet } from '../models/wallet';
|
import { Wallet } from '../models/wallet';
|
||||||
|
import { IFablab } from '../models/fablab';
|
||||||
|
import WalletLib from '../lib/wallet';
|
||||||
|
|
||||||
declare var Application: IApplication;
|
declare var Application: IApplication;
|
||||||
|
declare var Fablab: IFablab;
|
||||||
|
|
||||||
interface WalletInfoProps {
|
interface WalletInfoProps {
|
||||||
reservation: Reservation,
|
reservation: Reservation,
|
||||||
$filter: IFilterService,
|
currentUser: User,
|
||||||
currentUser: User,
|
wallet: Wallet,
|
||||||
wallet: Wallet,
|
price: number,
|
||||||
price: number,
|
|
||||||
remainingPrice: number,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const WalletInfo: React.FC<WalletInfoProps> = ({ reservation, currentUser, wallet, price, remainingPrice, $filter }) => {
|
export const WalletInfo: React.FC<WalletInfoProps> = ({reservation, currentUser, wallet, price}) => {
|
||||||
const { t } = useTranslation('shared');
|
const { t } = useTranslation('shared');
|
||||||
|
const [remainingPrice, setRemainingPrice] = useState(0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the formatted localized amount for the given price (eg. 20.5 => "20,50 €")
|
* Refresh the remaining price on each display
|
||||||
*/
|
*/
|
||||||
const formatPrice = (price: number): string => {
|
useEffect(() => {
|
||||||
return $filter('currency')(price);
|
const wLib = new WalletLib(wallet);
|
||||||
}
|
setRemainingPrice(wLib.computeRemainingPrice(price));
|
||||||
/**
|
})
|
||||||
* Check if the currently connected used is also the person making the reservation.
|
|
||||||
* If the currently connected user (ie. the operator), is an admin or a manager, he may book the reservation for someone else.
|
|
||||||
*/
|
|
||||||
const isOperatorAndClient = (): boolean => {
|
|
||||||
return currentUser.id == reservation.user_id;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* If the client has some money in his wallet & the price is not zero, then we should display this component.
|
|
||||||
*/
|
|
||||||
const shouldBeShown = (): boolean => {
|
|
||||||
return wallet.amount > 0 && price > 0;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* If the amount in the wallet is not enough to cover the whole price, then the user must pay the remaining price
|
|
||||||
* using another payment mean.
|
|
||||||
*/
|
|
||||||
const hasRemainingPrice = (): boolean => {
|
|
||||||
return remainingPrice > 0;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Does the current cart contains a payment schedule?
|
|
||||||
*/
|
|
||||||
const isPaymentSchedule = (): boolean => {
|
|
||||||
return reservation.plan_id && reservation.payment_schedule;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Return the human-readable name of the item currently bought with the wallet
|
|
||||||
*/
|
|
||||||
const getPriceItem = (): string => {
|
|
||||||
let item = 'other';
|
|
||||||
if (reservation.slots_attributes.length > 0) {
|
|
||||||
item = 'reservation';
|
|
||||||
} else if (reservation.plan_id) {
|
|
||||||
if (reservation.payment_schedule) {
|
|
||||||
item = 'first_deadline';
|
|
||||||
}
|
|
||||||
else item = 'subscription';
|
|
||||||
}
|
|
||||||
|
|
||||||
return t(`app.shared.wallet.wallet_info.item_${item}`);
|
/**
|
||||||
|
* Return the formatted localized amount for the given price (eg. 20.5 => "20,50 €")
|
||||||
|
*/
|
||||||
|
const formatPrice = (price: number): string => {
|
||||||
|
return new Intl.NumberFormat(Fablab.intl_locale, {style: 'currency', currency: Fablab.intl_currency}).format(price);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Check if the currently connected used is also the person making the reservation.
|
||||||
|
* If the currently connected user (ie. the operator), is an admin or a manager, he may book the reservation for someone else.
|
||||||
|
*/
|
||||||
|
const isOperatorAndClient = (): boolean => {
|
||||||
|
return currentUser.id == reservation.user_id;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* If the client has some money in his wallet & the price is not zero, then we should display this component.
|
||||||
|
*/
|
||||||
|
const shouldBeShown = (): boolean => {
|
||||||
|
return wallet.amount > 0 && price > 0;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* If the amount in the wallet is not enough to cover the whole price, then the user must pay the remaining price
|
||||||
|
* using another payment mean.
|
||||||
|
*/
|
||||||
|
const hasRemainingPrice = (): boolean => {
|
||||||
|
return remainingPrice > 0;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Does the current cart contains a payment schedule?
|
||||||
|
*/
|
||||||
|
const isPaymentSchedule = (): boolean => {
|
||||||
|
return reservation.plan_id && reservation.payment_schedule;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Return the human-readable name of the item currently bought with the wallet
|
||||||
|
*/
|
||||||
|
const getPriceItem = (): string => {
|
||||||
|
let item = 'other';
|
||||||
|
if (reservation.slots_attributes.length > 0) {
|
||||||
|
item = 'reservation';
|
||||||
|
} else if (reservation.plan_id) {
|
||||||
|
if (reservation.payment_schedule) {
|
||||||
|
item = 'first_deadline';
|
||||||
|
} else item = 'subscription';
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return t(`app.shared.wallet.wallet_info.item_${item}`);
|
||||||
<div className="wallet-info">
|
}
|
||||||
{shouldBeShown() && <div>
|
|
||||||
{isOperatorAndClient() && <div>
|
return (
|
||||||
<h3>{t('app.shared.wallet.wallet_info.you_have_AMOUNT_in_wallet', {AMOUNT : formatPrice(wallet.amount)})}</h3>
|
<div className="wallet-info">
|
||||||
{!hasRemainingPrice() &&<p>
|
{shouldBeShown() && <div>
|
||||||
{t('app.shared.wallet.wallet_info.wallet_pay_ITEM', {ITEM: getPriceItem()})}
|
{isOperatorAndClient() && <div>
|
||||||
</p>}
|
<h3>{t('app.shared.wallet.wallet_info.you_have_AMOUNT_in_wallet', {AMOUNT: formatPrice(wallet.amount)})}</h3>
|
||||||
{hasRemainingPrice() &&<p>
|
{!hasRemainingPrice() && <p>
|
||||||
{t('app.shared.wallet.wallet_info.credit_AMOUNT_for_pay_ITEM', {
|
{t('app.shared.wallet.wallet_info.wallet_pay_ITEM', {ITEM: getPriceItem()})}
|
||||||
AMOUNT: formatPrice(remainingPrice),
|
</p>}
|
||||||
ITEM: getPriceItem()
|
{hasRemainingPrice() && <p>
|
||||||
})}
|
{t('app.shared.wallet.wallet_info.credit_AMOUNT_for_pay_ITEM', {
|
||||||
</p>}
|
AMOUNT: formatPrice(remainingPrice),
|
||||||
</div>}
|
ITEM: getPriceItem()
|
||||||
{!isOperatorAndClient() && <div>
|
})}
|
||||||
<h3>{t('app.shared.wallet.wallet_info.client_have_AMOUNT_in_wallet', {AMOUNT : formatPrice(wallet.amount)})}</h3>
|
</p>}
|
||||||
{!hasRemainingPrice() &&<p>
|
</div>}
|
||||||
{t('app.shared.wallet.wallet_info.client_wallet_pay_ITEM', {ITEM: getPriceItem()})}
|
{!isOperatorAndClient() && <div>
|
||||||
</p>}
|
<h3>{t('app.shared.wallet.wallet_info.client_have_AMOUNT_in_wallet', {AMOUNT: formatPrice(wallet.amount)})}</h3>
|
||||||
{hasRemainingPrice() &&<p>
|
{!hasRemainingPrice() && <p>
|
||||||
{t('app.shared.wallet.wallet_info.client_credit_AMOUNT_for_pay_ITEM', {
|
{t('app.shared.wallet.wallet_info.client_wallet_pay_ITEM', {ITEM: getPriceItem()})}
|
||||||
AMOUNT: formatPrice(remainingPrice),
|
</p>}
|
||||||
ITEM: getPriceItem()
|
{hasRemainingPrice() && <p>
|
||||||
})}
|
{t('app.shared.wallet.wallet_info.client_credit_AMOUNT_for_pay_ITEM', {
|
||||||
</p>}
|
AMOUNT: formatPrice(remainingPrice),
|
||||||
</div>}
|
ITEM: getPriceItem()
|
||||||
{!hasRemainingPrice() && isPaymentSchedule() &&<p className="info-deadlines">
|
})}
|
||||||
<i className="fa fa-warning" />
|
</p>}
|
||||||
<span>{t('app.shared.wallet.wallet_info.other_deadlines_no_wallet')}</span>
|
</div>}
|
||||||
</p>}
|
{!hasRemainingPrice() && isPaymentSchedule() && <p className="info-deadlines">
|
||||||
</div>}
|
<i className="fa fa-warning"/>
|
||||||
</div>
|
<span>{t('app.shared.wallet.wallet_info.other_deadlines_no_wallet')}</span>
|
||||||
);
|
</p>}
|
||||||
|
</div>}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const WalletInfoWrapper: React.FC<WalletInfoProps> = ({ currentUser, reservation, $filter, price, remainingPrice, wallet }) => {
|
const WalletInfoWrapper: React.FC<WalletInfoProps> = ({currentUser, reservation, price, wallet}) => {
|
||||||
return (
|
return (
|
||||||
<Loader>
|
<Loader>
|
||||||
<WalletInfo currentUser={currentUser} reservation={reservation} $filter={$filter} price={price} remainingPrice={remainingPrice} wallet={wallet} />
|
<WalletInfo currentUser={currentUser} reservation={reservation} price={price} wallet={wallet}/>
|
||||||
</Loader>
|
</Loader>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Application.Components.component('walletInfo', react2angular(WalletInfoWrapper, ['currentUser', 'price', 'remainingPrice', 'reservation', 'wallet'], ['$filter']));
|
Application.Components.component('walletInfo', react2angular(WalletInfoWrapper, ['currentUser', 'price', 'reservation', 'wallet']));
|
||||||
|
@ -665,7 +665,9 @@ Application.Controllers.controller('ReserveMachineController', ['$scope', '$stat
|
|||||||
|
|
||||||
if ($scope.selectedPlan) {
|
if ($scope.selectedPlan) {
|
||||||
$scope.ctrl.member.subscribed_plan = angular.copy($scope.selectedPlan);
|
$scope.ctrl.member.subscribed_plan = angular.copy($scope.selectedPlan);
|
||||||
Auth._currentUser.subscribed_plan = angular.copy($scope.selectedPlan);
|
if ($scope.ctrl.member.id === Auth._currentUser.id) {
|
||||||
|
Auth._currentUser.subscribed_plan = angular.copy($scope.selectedPlan);
|
||||||
|
}
|
||||||
$scope.plansAreShown = false;
|
$scope.plansAreShown = false;
|
||||||
$scope.selectedPlan = null;
|
$scope.selectedPlan = null;
|
||||||
}
|
}
|
||||||
|
@ -167,7 +167,9 @@ Application.Controllers.controller('PlansIndexController', ['$scope', '$rootScop
|
|||||||
*/
|
*/
|
||||||
$scope.afterPayment = function () {
|
$scope.afterPayment = function () {
|
||||||
$scope.ctrl.member.subscribed_plan = angular.copy($scope.selectedPlan);
|
$scope.ctrl.member.subscribed_plan = angular.copy($scope.selectedPlan);
|
||||||
Auth._currentUser.subscribed_plan = angular.copy($scope.selectedPlan);
|
if ($scope.ctrl.member.id === Auth._currentUser.id) {
|
||||||
|
Auth._currentUser.subscribed_plan = angular.copy($scope.selectedPlan);
|
||||||
|
}
|
||||||
$scope.paid.plan = angular.copy($scope.selectedPlan);
|
$scope.paid.plan = angular.copy($scope.selectedPlan);
|
||||||
$scope.selectedPlan = null;
|
$scope.selectedPlan = null;
|
||||||
$scope.coupon.applied = null;
|
$scope.coupon.applied = null;
|
||||||
|
@ -571,14 +571,18 @@ Application.Controllers.controller('ReserveSpaceController', ['$scope', '$stateP
|
|||||||
|
|
||||||
if ($scope.selectedPlan) {
|
if ($scope.selectedPlan) {
|
||||||
$scope.ctrl.member.subscribed_plan = angular.copy($scope.selectedPlan);
|
$scope.ctrl.member.subscribed_plan = angular.copy($scope.selectedPlan);
|
||||||
Auth._currentUser.subscribed_plan = angular.copy($scope.selectedPlan);
|
if ($scope.ctrl.member.id === Auth._currentUser.id) {
|
||||||
|
Auth._currentUser.subscribed_plan = angular.copy($scope.selectedPlan);
|
||||||
|
}
|
||||||
$scope.plansAreShown = false;
|
$scope.plansAreShown = false;
|
||||||
$scope.selectedPlan = null;
|
$scope.selectedPlan = null;
|
||||||
}
|
}
|
||||||
$scope.ctrl.member.training_credits = angular.copy(reservation.user.training_credits);
|
$scope.ctrl.member.training_credits = angular.copy(reservation.user.training_credits);
|
||||||
$scope.ctrl.member.machine_credits = angular.copy(reservation.user.machine_credits);
|
$scope.ctrl.member.machine_credits = angular.copy(reservation.user.machine_credits);
|
||||||
Auth._currentUser.training_credits = angular.copy(reservation.user.training_credits);
|
if ($scope.ctrl.member.id === Auth._currentUser.id) {
|
||||||
Auth._currentUser.machine_credits = angular.copy(reservation.user.machine_credits);
|
Auth._currentUser.training_credits = angular.copy(reservation.user.training_credits);
|
||||||
|
Auth._currentUser.machine_credits = angular.copy(reservation.user.machine_credits);
|
||||||
|
}
|
||||||
|
|
||||||
refetchCalendar();
|
refetchCalendar();
|
||||||
};
|
};
|
||||||
|
@ -361,14 +361,18 @@ Application.Controllers.controller('ReserveTrainingController', ['$scope', '$sta
|
|||||||
|
|
||||||
if ($scope.selectedPlan) {
|
if ($scope.selectedPlan) {
|
||||||
$scope.ctrl.member.subscribed_plan = angular.copy($scope.selectedPlan);
|
$scope.ctrl.member.subscribed_plan = angular.copy($scope.selectedPlan);
|
||||||
Auth._currentUser.subscribed_plan = angular.copy($scope.selectedPlan);
|
if ($scope.ctrl.member.id === Auth._currentUser.id) {
|
||||||
|
Auth._currentUser.subscribed_plan = angular.copy($scope.selectedPlan);
|
||||||
|
}
|
||||||
$scope.plansAreShown = false;
|
$scope.plansAreShown = false;
|
||||||
$scope.selectedPlan = null;
|
$scope.selectedPlan = null;
|
||||||
}
|
}
|
||||||
$scope.ctrl.member.training_credits = angular.copy(reservation.user.training_credits);
|
$scope.ctrl.member.training_credits = angular.copy(reservation.user.training_credits);
|
||||||
$scope.ctrl.member.machine_credits = angular.copy(reservation.user.machine_credits);
|
$scope.ctrl.member.machine_credits = angular.copy(reservation.user.machine_credits);
|
||||||
Auth._currentUser.training_credits = angular.copy(reservation.user.training_credits);
|
if ($scope.ctrl.member.id === Auth._currentUser.id) {
|
||||||
Auth._currentUser.machine_credits = angular.copy(reservation.user.machine_credits);
|
Auth._currentUser.training_credits = angular.copy(reservation.user.training_credits);
|
||||||
|
Auth._currentUser.machine_credits = angular.copy(reservation.user.machine_credits);
|
||||||
|
}
|
||||||
|
|
||||||
refetchCalendar();
|
refetchCalendar();
|
||||||
};
|
};
|
||||||
|
@ -10,8 +10,8 @@
|
|||||||
* DS102: Remove unnecessary code created because of implicit returns
|
* DS102: Remove unnecessary code created because of implicit returns
|
||||||
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
||||||
*/
|
*/
|
||||||
Application.Directives.directive('cart', ['$rootScope', '$uibModal', 'dialogs', 'growl', 'Auth', 'Price', 'Wallet', 'CustomAsset', 'Slot', 'AuthService', 'helpers', '_t',
|
Application.Directives.directive('cart', ['$rootScope', '$uibModal', 'dialogs', 'growl', 'Auth', 'Price', 'Wallet', 'CustomAsset', 'Slot', 'AuthService', 'Payment', 'helpers', '_t',
|
||||||
function ($rootScope, $uibModal, dialogs, growl, Auth, Price, Wallet, CustomAsset, Slot, AuthService, helpers, _t) {
|
function ($rootScope, $uibModal, dialogs, growl, Auth, Price, Wallet, CustomAsset, Slot, AuthService, Payment, helpers, _t) {
|
||||||
return ({
|
return ({
|
||||||
restrict: 'E',
|
restrict: 'E',
|
||||||
scope: {
|
scope: {
|
||||||
@ -70,9 +70,18 @@ Application.Directives.directive('cart', ['$rootScope', '$uibModal', 'dialogs',
|
|||||||
// Payment schedule
|
// Payment schedule
|
||||||
$scope.schedule = {
|
$scope.schedule = {
|
||||||
requested_schedule: false, // does the user requests a payment schedule for his subscription
|
requested_schedule: false, // does the user requests a payment schedule for his subscription
|
||||||
payment_schedule: null // the effective computed payment schedule
|
payment_schedule: undefined // the effective computed payment schedule
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// online payments (stripe)
|
||||||
|
$scope.stripe = {
|
||||||
|
showModal: false,
|
||||||
|
cartItems: undefined
|
||||||
|
};
|
||||||
|
|
||||||
|
// currently logged-in user
|
||||||
|
$scope.currentUser = $rootScope.currentUser;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add the provided slot to the shopping cart (state transition from free to 'about to be reserved')
|
* Add the provided slot to the shopping cart (state transition from free to 'about to be reserved')
|
||||||
* and increment the total amount of the cart if needed.
|
* and increment the total amount of the cart if needed.
|
||||||
@ -303,6 +312,28 @@ Application.Directives.directive('cart', ['$rootScope', '$uibModal', 'dialogs',
|
|||||||
}, 50);
|
}, 50);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This will open/close the stripe payment modal
|
||||||
|
*/
|
||||||
|
$scope.toggleStripeModal = (beforeApply) => {
|
||||||
|
setTimeout(() => {
|
||||||
|
$scope.stripe.showModal = !$scope.stripe.showModal;
|
||||||
|
if (typeof beforeApply === 'function') {
|
||||||
|
beforeApply();
|
||||||
|
}
|
||||||
|
$scope.$apply();
|
||||||
|
}, 50);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invoked atfer a successful Stripe payment
|
||||||
|
* @param result {*} may be a reservation or a subscription
|
||||||
|
*/
|
||||||
|
$scope.afterStripeSuccess = (result) => {
|
||||||
|
$scope.toggleStripeModal();
|
||||||
|
afterPayment(result);
|
||||||
|
};
|
||||||
|
|
||||||
/* PRIVATE SCOPE */
|
/* PRIVATE SCOPE */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -530,6 +561,8 @@ Application.Directives.directive('cart', ['$rootScope', '$uibModal', 'dialogs',
|
|||||||
$scope.events.paid = [];
|
$scope.events.paid = [];
|
||||||
$scope.events.modifiable = null;
|
$scope.events.modifiable = null;
|
||||||
$scope.events.placable = null;
|
$scope.events.placable = null;
|
||||||
|
$scope.schedule.requested_schedule = false;
|
||||||
|
$scope.schedule.payment_schedule = null;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -606,9 +639,9 @@ Application.Directives.directive('cart', ['$rootScope', '$uibModal', 'dialogs',
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Format the parameters expected by /api/prices/compute or /api/reservations and return the resulting object
|
* Format the parameters expected by /api/prices/compute or /api/reservations and return the resulting object
|
||||||
* @param request {{reservation: object}|{subscription: object}} as returned by mkReservation()
|
* @param request {{reservation: *}|{subscription: *}} as returned by mkReservation()
|
||||||
* @param coupon {Object} Coupon as returned from the API
|
* @param coupon {{code: string}} Coupon as returned from the API
|
||||||
* @return {{reservation:Object, subscription: Object, coupon_code:string}}
|
* @return {CartItems}
|
||||||
*/
|
*/
|
||||||
const mkRequestParams = function (request, coupon) {
|
const mkRequestParams = function (request, coupon) {
|
||||||
return Object.assign({
|
return Object.assign({
|
||||||
@ -649,88 +682,43 @@ Application.Directives.directive('cart', ['$rootScope', '$uibModal', 'dialogs',
|
|||||||
* @param planId {number}
|
* @param planId {number}
|
||||||
* @param userId {number}
|
* @param userId {number}
|
||||||
* @param schedule {boolean}
|
* @param schedule {boolean}
|
||||||
|
* @param method {String} 'stripe' | ''
|
||||||
* @return {{subscription: {payment_schedule: boolean, user_id: number, plan_id: number}}}
|
* @return {{subscription: {payment_schedule: boolean, user_id: number, plan_id: number}}}
|
||||||
*/
|
*/
|
||||||
const mkSubscription = function (planId, userId, schedule) {
|
const mkSubscription = function (planId, userId, schedule, method) {
|
||||||
return {
|
return {
|
||||||
subscription: {
|
subscription: {
|
||||||
plan_id: planId,
|
plan_id: planId,
|
||||||
user_id: userId,
|
user_id: userId,
|
||||||
payment_schedule: schedule
|
payment_schedule: schedule,
|
||||||
|
payment_method: method
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build the CartItems object, from the current reservation
|
||||||
|
* @param reservation {*}
|
||||||
|
* @param paymentMethod {string}
|
||||||
|
* @return {CartItems}
|
||||||
|
*/
|
||||||
|
const mkCartItems = function (reservation, paymentMethod) {
|
||||||
|
let request = { reservation };
|
||||||
|
if (reservation.slots_attributes.length === 0 && reservation.plan_id) {
|
||||||
|
request = mkSubscription($scope.selectedPlan.id, reservation.user_id, $scope.schedule.requested_schedule, paymentMethod);
|
||||||
|
} else {
|
||||||
|
request.reservation.payment_method = paymentMethod;
|
||||||
|
}
|
||||||
|
return mkRequestParams(request, $scope.coupon.applied);
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Open a modal window that allows the user to process a credit card payment for his current shopping cart.
|
* Open a modal window that allows the user to process a credit card payment for his current shopping cart.
|
||||||
*/
|
*/
|
||||||
const payByStripe = function (reservation) {
|
const payByStripe = function (reservation) {
|
||||||
$uibModal.open({
|
$scope.toggleStripeModal(() => {
|
||||||
templateUrl: '/stripe/payment_modal.html',
|
$scope.stripe.cartItems = mkCartItems(reservation, 'stripe');
|
||||||
size: 'md',
|
});
|
||||||
resolve: {
|
|
||||||
reservation () {
|
|
||||||
return reservation;
|
|
||||||
},
|
|
||||||
price () {
|
|
||||||
return Price.compute(mkRequestParams({ reservation }, $scope.coupon.applied)).$promise;
|
|
||||||
},
|
|
||||||
wallet () {
|
|
||||||
return Wallet.getWalletByUser({ user_id: reservation.user_id }).$promise;
|
|
||||||
},
|
|
||||||
cgv () {
|
|
||||||
return CustomAsset.get({ name: 'cgv-file' }).$promise;
|
|
||||||
},
|
|
||||||
coupon () {
|
|
||||||
return $scope.coupon.applied;
|
|
||||||
},
|
|
||||||
cartItems () {
|
|
||||||
let request = { reservation };
|
|
||||||
if (reservation.slots_attributes.length === 0 && reservation.plan_id) {
|
|
||||||
request = mkSubscription($scope.selectedPlan.id, reservation.user_id, $scope.schedule.requested_schedule);
|
|
||||||
}
|
|
||||||
return mkRequestParams(request, $scope.coupon.applied);
|
|
||||||
},
|
|
||||||
schedule () {
|
|
||||||
return $scope.schedule.payment_schedule;
|
|
||||||
},
|
|
||||||
stripeKey: ['Setting', function (Setting) { return Setting.get({ name: 'stripe_public_key' }).$promise; }]
|
|
||||||
},
|
|
||||||
controller: ['$scope', '$uibModalInstance', '$state', 'reservation', 'price', 'cgv', 'Auth', 'Reservation', 'wallet', 'helpers', '$filter', 'coupon', 'cartItems', 'stripeKey', 'schedule',
|
|
||||||
function ($scope, $uibModalInstance, $state, reservation, price, cgv, Auth, Reservation, wallet, helpers, $filter, coupon, cartItems, stripeKey, schedule) {
|
|
||||||
// user wallet amount
|
|
||||||
$scope.walletAmount = wallet.amount;
|
|
||||||
|
|
||||||
// Price
|
|
||||||
$scope.amount = helpers.getAmountToPay(price.price, wallet.amount);
|
|
||||||
|
|
||||||
// Cart items
|
|
||||||
$scope.cartItems = cartItems;
|
|
||||||
|
|
||||||
// CGV
|
|
||||||
$scope.cgv = cgv.custom_asset;
|
|
||||||
|
|
||||||
// Reservation
|
|
||||||
$scope.reservation = reservation;
|
|
||||||
|
|
||||||
// Used in wallet info template to interpolate some translations
|
|
||||||
$scope.numberFilter = $filter('number');
|
|
||||||
|
|
||||||
// stripe publishable key
|
|
||||||
$scope.stripeKey = stripeKey.setting.value;
|
|
||||||
|
|
||||||
// Shows the schedule info in the modal
|
|
||||||
$scope.schedule = schedule;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Callback to handle the post-payment and reservation
|
|
||||||
*/
|
|
||||||
$scope.onPaymentSuccess = function (response) {
|
|
||||||
$uibModalInstance.close(response);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}).result.finally(null).then(function (reservation) { afterPayment(reservation); });
|
|
||||||
};
|
};
|
||||||
/**
|
/**
|
||||||
* Open a modal window that allows the user to process a local payment for his current shopping cart (admin only).
|
* Open a modal window that allows the user to process a local payment for his current shopping cart (admin only).
|
||||||
@ -746,6 +734,9 @@ Application.Directives.directive('cart', ['$rootScope', '$uibModal', 'dialogs',
|
|||||||
price () {
|
price () {
|
||||||
return Price.compute(mkRequestParams({ reservation }, $scope.coupon.applied)).$promise;
|
return Price.compute(mkRequestParams({ reservation }, $scope.coupon.applied)).$promise;
|
||||||
},
|
},
|
||||||
|
cartItems () {
|
||||||
|
return mkCartItems(reservation, 'stripe');
|
||||||
|
},
|
||||||
wallet () {
|
wallet () {
|
||||||
return Wallet.getWalletByUser({ user_id: reservation.user_id }).$promise;
|
return Wallet.getWalletByUser({ user_id: reservation.user_id }).$promise;
|
||||||
},
|
},
|
||||||
@ -757,10 +748,13 @@ Application.Directives.directive('cart', ['$rootScope', '$uibModal', 'dialogs',
|
|||||||
},
|
},
|
||||||
schedule () {
|
schedule () {
|
||||||
return $scope.schedule;
|
return $scope.schedule;
|
||||||
|
},
|
||||||
|
user () {
|
||||||
|
return $scope.user;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
controller: ['$scope', '$uibModalInstance', '$state', 'reservation', 'price', 'Auth', 'Reservation', 'Subscription', 'wallet', 'helpers', '$filter', 'coupon', 'selectedPlan', 'schedule',
|
controller: ['$scope', '$uibModalInstance', '$state', 'reservation', 'price', 'Auth', 'Reservation', 'Subscription', 'wallet', 'helpers', '$filter', 'coupon', 'selectedPlan', 'schedule', 'cartItems', 'user',
|
||||||
function ($scope, $uibModalInstance, $state, reservation, price, Auth, Reservation, Subscription, wallet, helpers, $filter, coupon, selectedPlan, schedule) {
|
function ($scope, $uibModalInstance, $state, reservation, price, Auth, Reservation, Subscription, wallet, helpers, $filter, coupon, selectedPlan, schedule, cartItems, user) {
|
||||||
// user wallet amount
|
// user wallet amount
|
||||||
$scope.wallet = wallet;
|
$scope.wallet = wallet;
|
||||||
|
|
||||||
@ -770,8 +764,9 @@ Application.Directives.directive('cart', ['$rootScope', '$uibModal', 'dialogs',
|
|||||||
// Price to pay (wallet deducted)
|
// Price to pay (wallet deducted)
|
||||||
$scope.amount = helpers.getAmountToPay(price.price, wallet.amount);
|
$scope.amount = helpers.getAmountToPay(price.price, wallet.amount);
|
||||||
|
|
||||||
// Reservation
|
// Reservation (simple & cartItems format)
|
||||||
$scope.reservation = reservation;
|
$scope.reservation = reservation;
|
||||||
|
$scope.cartItems = cartItems;
|
||||||
|
|
||||||
// Subscription
|
// Subscription
|
||||||
$scope.plan = selectedPlan;
|
$scope.plan = selectedPlan;
|
||||||
@ -790,14 +785,24 @@ Application.Directives.directive('cart', ['$rootScope', '$uibModal', 'dialogs',
|
|||||||
// "valid" Button label
|
// "valid" Button label
|
||||||
$scope.validButtonName = '';
|
$scope.validButtonName = '';
|
||||||
|
|
||||||
|
// stripe modal state
|
||||||
|
// this is used to collect card data when a payment-schedule was selected, and paid with a card
|
||||||
|
$scope.isOpenStripeModal = false;
|
||||||
|
|
||||||
|
// the customer
|
||||||
|
$scope.user = user;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback to process the local payment, triggered on button click
|
* Callback to process the local payment, triggered on button click
|
||||||
*/
|
*/
|
||||||
$scope.ok = function () {
|
$scope.ok = function () {
|
||||||
|
if ($scope.schedule && $scope.method.payment_method === 'stripe') {
|
||||||
|
return $scope.toggleStripeModal();
|
||||||
|
}
|
||||||
$scope.attempting = true;
|
$scope.attempting = true;
|
||||||
// save subscription (if there's only a subscription selected)
|
// save subscription (if there's only a subscription selected)
|
||||||
if (reservation.slots_attributes.length === 0 && selectedPlan) {
|
if ($scope.reservation.slots_attributes.length === 0 && selectedPlan) {
|
||||||
const sub = mkSubscription(selectedPlan.id, reservation.user_id, schedule.requested_schedule);
|
const sub = mkSubscription(selectedPlan.id, $scope.reservation.user_id, schedule.requested_schedule, $scope.method.payment_method);
|
||||||
|
|
||||||
return Subscription.save(mkRequestParams(sub, coupon),
|
return Subscription.save(mkRequestParams(sub, coupon),
|
||||||
function (subscription) {
|
function (subscription) {
|
||||||
@ -810,7 +815,8 @@ Application.Directives.directive('cart', ['$rootScope', '$uibModal', 'dialogs',
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
// otherwise, save the reservation (may include a subscription)
|
// otherwise, save the reservation (may include a subscription)
|
||||||
Reservation.save(mkRequestParams({ reservation: $scope.reservation }, coupon), function (reservation) {
|
const rsrv = Object.assign({}, $scope.reservation, { payment_method: $scope.method.payment_method });
|
||||||
|
Reservation.save(mkRequestParams({ reservation: rsrv }, coupon), function (reservation) {
|
||||||
$uibModalInstance.close(reservation);
|
$uibModalInstance.close(reservation);
|
||||||
$scope.attempting = true;
|
$scope.attempting = true;
|
||||||
}, function (response) {
|
}, function (response) {
|
||||||
@ -824,15 +830,34 @@ Application.Directives.directive('cart', ['$rootScope', '$uibModal', 'dialogs',
|
|||||||
*/
|
*/
|
||||||
$scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };
|
$scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asynchronously updates the status of the stripe modal
|
||||||
|
*/
|
||||||
|
$scope.toggleStripeModal = function () {
|
||||||
|
setTimeout(() => {
|
||||||
|
$scope.isOpenStripeModal = !$scope.isOpenStripeModal;
|
||||||
|
$scope.$apply();
|
||||||
|
}, 50);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* After creating a payment schedule by card, from an administrator.
|
||||||
|
* @param result {*} Reservation or Subscription
|
||||||
|
*/
|
||||||
|
$scope.afterCreatePaymentSchedule = function (result) {
|
||||||
|
$scope.toggleStripeModal();
|
||||||
|
$uibModalInstance.close(result);
|
||||||
|
};
|
||||||
|
|
||||||
/* PRIVATE SCOPE */
|
/* PRIVATE SCOPE */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Kind of constructor: these actions will be realized first when the directive is loaded
|
* Kind of constructor: these actions will be realized first when the directive is loaded
|
||||||
*/
|
*/
|
||||||
const initialize = function () {
|
const initialize = function () {
|
||||||
$scope.$watch('method.payment_method', function (newValue, oldValue) {
|
$scope.$watch('method.payment_method', function (newValue) {
|
||||||
console.log(`watch triggered: ${newValue}`);
|
|
||||||
$scope.validButtonName = computeValidButtonName();
|
$scope.validButtonName = computeValidButtonName();
|
||||||
|
$scope.cartItems = mkCartItems($scope.reservation, newValue);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -841,12 +866,13 @@ Application.Directives.directive('cart', ['$rootScope', '$uibModal', 'dialogs',
|
|||||||
*/
|
*/
|
||||||
const computeValidButtonName = function () {
|
const computeValidButtonName = function () {
|
||||||
let method = '';
|
let method = '';
|
||||||
if (AuthService.isAuthorized(['admin', 'manager']) && $rootScope.currentUser.id !== reservation.user_id) {
|
if ($scope.schedule) {
|
||||||
method = $scope.method.payment_method;
|
if (AuthService.isAuthorized(['admin', 'manager']) && $rootScope.currentUser.id !== reservation.user_id) {
|
||||||
} else {
|
method = $scope.method.payment_method;
|
||||||
method = 'stripe';
|
} else {
|
||||||
|
method = 'stripe';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
console.log(method);
|
|
||||||
if ($scope.amount > 0) {
|
if ($scope.amount > 0) {
|
||||||
return _t('app.shared.cart.confirm_payment_of_html', { METHOD: method, AMOUNT: $filter('currency')($scope.amount) });
|
return _t('app.shared.cart.confirm_payment_of_html', { METHOD: method, AMOUNT: $filter('currency')($scope.amount) });
|
||||||
} else {
|
} else {
|
||||||
@ -867,28 +893,28 @@ Application.Directives.directive('cart', ['$rootScope', '$uibModal', 'dialogs',
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Actions to run after the payment was successful
|
* Actions to run after the payment was successful
|
||||||
* @param reservation {Object} may be a reservation or a subscription
|
* @param paymentResult {*} may be a reservation or a subscription
|
||||||
*/
|
*/
|
||||||
const afterPayment = function (reservation) {
|
const afterPayment = function (paymentResult) {
|
||||||
// we set the cart content as 'paid' to display a summary of the transaction
|
// we set the cart content as 'paid' to display a summary of the transaction
|
||||||
$scope.events.paid = $scope.events.reserved;
|
$scope.events.paid = $scope.events.reserved;
|
||||||
$scope.amountPaid = $scope.amountTotal;
|
$scope.amountPaid = $scope.amountTotal;
|
||||||
// we call the external callback if present
|
// we call the external callback if present
|
||||||
if (typeof $scope.afterPayment === 'function') { $scope.afterPayment(reservation); }
|
if (typeof $scope.afterPayment === 'function') { $scope.afterPayment(paymentResult); }
|
||||||
// we reset the coupon, and the cart content, and we unselect the slot
|
// we reset the coupon, and the cart content, and we unselect the slot
|
||||||
$scope.coupon.applied = null;
|
$scope.coupon.applied = undefined;
|
||||||
if ($scope.slot) {
|
if ($scope.slot) {
|
||||||
// reservation (+ subscription)
|
// reservation (+ subscription)
|
||||||
$scope.slot = null;
|
$scope.slot = undefined;
|
||||||
$scope.events.reserved = [];
|
$scope.events.reserved = [];
|
||||||
} else {
|
} else {
|
||||||
// subscription only
|
// subscription only
|
||||||
$scope.events = {};
|
$scope.events = {};
|
||||||
}
|
}
|
||||||
$scope.paidPlan = $scope.selectedPlan;
|
$scope.paidPlan = $scope.selectedPlan;
|
||||||
$scope.selectedPlan = null;
|
$scope.selectedPlan = undefined;
|
||||||
$scope.schedule.requested_schedule = false;
|
$scope.schedule.requested_schedule = false;
|
||||||
$scope.schedule.payment_schedule = null;
|
$scope.schedule.payment_schedule = undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
20
app/frontend/src/javascript/lib/wallet.ts
Normal file
20
app/frontend/src/javascript/lib/wallet.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import { Wallet } from '../models/wallet';
|
||||||
|
|
||||||
|
export default class WalletLib {
|
||||||
|
private wallet: Wallet;
|
||||||
|
|
||||||
|
constructor (wallet: Wallet) {
|
||||||
|
this.wallet = wallet;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the price remaining to pay, after we have used the maximum possible amount in the wallet
|
||||||
|
*/
|
||||||
|
computeRemainingPrice = (price: number): number => {
|
||||||
|
if (this.wallet.amount > price) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return price - this.wallet.amount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,15 @@
|
|||||||
|
export enum CustomAssetName {
|
||||||
|
LogoFile = 'logo-file',
|
||||||
|
LogoBlackFile = 'logo-black-file',
|
||||||
|
CguFile = 'cgu-file',
|
||||||
|
CgvFile = 'cgv-file',
|
||||||
|
ProfileImageFile = 'profile-image-file',
|
||||||
|
FaviconFile = 'favicon-file'
|
||||||
|
}
|
||||||
|
|
||||||
export interface CustomAsset {
|
export interface CustomAsset {
|
||||||
id: number,
|
id: number,
|
||||||
name: string,
|
name: CustomAssetName,
|
||||||
custom_asset_file_attributes: {
|
custom_asset_file_attributes: {
|
||||||
id: number,
|
id: number,
|
||||||
attachment: string
|
attachment: string
|
||||||
|
29
app/frontend/src/javascript/models/fablab.ts
Normal file
29
app/frontend/src/javascript/models/fablab.ts
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
export interface IFablab {
|
||||||
|
plansModule: boolean,
|
||||||
|
spacesModule: boolean,
|
||||||
|
walletModule: boolean,
|
||||||
|
statisticsModule: boolean,
|
||||||
|
defaultHost: string,
|
||||||
|
trackingId: string,
|
||||||
|
superadminId: number,
|
||||||
|
baseHostUrl: string,
|
||||||
|
locale: string,
|
||||||
|
moment_locale: string,
|
||||||
|
summernote_locale: string,
|
||||||
|
fullcalendar_locale: string,
|
||||||
|
intl_locale: string,
|
||||||
|
intl_currency: string,
|
||||||
|
timezone: string,
|
||||||
|
weekStartingDay: string,
|
||||||
|
d3DateFormat: string,
|
||||||
|
uibDateFormat: string,
|
||||||
|
sessionTours: Array<string>,
|
||||||
|
translations: {
|
||||||
|
app: {
|
||||||
|
shared: {
|
||||||
|
buttons: Object,
|
||||||
|
messages: Object,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
9
app/frontend/src/javascript/models/history-value.ts
Normal file
9
app/frontend/src/javascript/models/history-value.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
export interface HistoryValue {
|
||||||
|
id: number,
|
||||||
|
value: string,
|
||||||
|
created_at: Date
|
||||||
|
user: {
|
||||||
|
id: number,
|
||||||
|
name: string
|
||||||
|
}
|
||||||
|
}
|
30
app/frontend/src/javascript/models/payment.ts
Normal file
30
app/frontend/src/javascript/models/payment.ts
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
import { Reservation } from './reservation';
|
||||||
|
|
||||||
|
export interface PaymentConfirmation {
|
||||||
|
requires_action?: boolean,
|
||||||
|
payment_intent_client_secret?: string,
|
||||||
|
success?: boolean,
|
||||||
|
error?: {
|
||||||
|
statusText: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IntentConfirmation {
|
||||||
|
client_secret: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum PaymentMethod {
|
||||||
|
Stripe = 'stripe',
|
||||||
|
Other = ''
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CartItems {
|
||||||
|
reservation?: Reservation,
|
||||||
|
subscription?: {
|
||||||
|
plan_id: number,
|
||||||
|
user_id: number,
|
||||||
|
payment_schedule: boolean,
|
||||||
|
payment_method: PaymentMethod
|
||||||
|
},
|
||||||
|
coupon_code?: string
|
||||||
|
}
|
@ -1,8 +1,27 @@
|
|||||||
export interface Price {
|
export interface Price {
|
||||||
id: number,
|
id: number,
|
||||||
group_id: number,
|
group_id: number,
|
||||||
plan_id: number,
|
plan_id: number,
|
||||||
priceable_type: string,
|
priceable_type: string,
|
||||||
priceable_id: number,
|
priceable_id: number,
|
||||||
amount: number
|
amount: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ComputePriceResult {
|
||||||
|
price: number,
|
||||||
|
price_without_coupon: number,
|
||||||
|
details?: {
|
||||||
|
slots: Array<{
|
||||||
|
start_at: Date,
|
||||||
|
price: number,
|
||||||
|
promo: boolean
|
||||||
|
}>
|
||||||
|
plan?: number
|
||||||
|
},
|
||||||
|
schedule?: {
|
||||||
|
items: Array<{
|
||||||
|
amount: number,
|
||||||
|
due_date: Date
|
||||||
|
}>
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
export interface ReservationSlot {
|
export interface ReservationSlot {
|
||||||
|
id?: number,
|
||||||
start_at: Date,
|
start_at: Date,
|
||||||
end_at: Date,
|
end_at: Date,
|
||||||
availability_id: number,
|
availability_id: number,
|
||||||
@ -10,6 +11,11 @@ export interface Reservation {
|
|||||||
reservable_id: number,
|
reservable_id: number,
|
||||||
reservable_type: string,
|
reservable_type: string,
|
||||||
slots_attributes: Array<ReservationSlot>,
|
slots_attributes: Array<ReservationSlot>,
|
||||||
plan_id: number
|
plan_id?: number,
|
||||||
payment_schedule: boolean
|
nb_reserve_places?: number,
|
||||||
|
payment_schedule?: boolean,
|
||||||
|
tickets_attributes?: {
|
||||||
|
event_price_category_id: number,
|
||||||
|
booked: boolean,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
109
app/frontend/src/javascript/models/setting.ts
Normal file
109
app/frontend/src/javascript/models/setting.ts
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
import { HistoryValue } from './history-value';
|
||||||
|
|
||||||
|
export enum SettingName {
|
||||||
|
AboutTitle = 'about_title',
|
||||||
|
AboutBody = 'about_body',
|
||||||
|
AboutContacts = 'about_contacts',
|
||||||
|
PrivacyDraft = 'privacy_draft',
|
||||||
|
PrivacyBody = 'privacy_body',
|
||||||
|
PrivacyDpo = 'privacy_dpo',
|
||||||
|
TwitterName = 'twitter_name',
|
||||||
|
HomeBlogpost = 'home_blogpost',
|
||||||
|
MachineExplicationsAlert = 'machine_explications_alert',
|
||||||
|
TrainingExplicationsAlert = 'training_explications_alert',
|
||||||
|
TrainingInformationMessage = 'training_information_message',
|
||||||
|
SubscriptionExplicationsAlert = 'subscription_explications_alert',
|
||||||
|
InvoiceLogo = 'invoice_logo',
|
||||||
|
InvoiceReference = 'invoice_reference',
|
||||||
|
InvoiceCodeActive = 'invoice_code-active',
|
||||||
|
InvoiceCodeValue = 'invoice_code-value',
|
||||||
|
InvoiceOrderNb = 'invoice_order-nb',
|
||||||
|
InvoiceVATActive = 'invoice_VAT-active',
|
||||||
|
InvoiceVATRate = 'invoice_VAT-rate',
|
||||||
|
InvoiceText = 'invoice_text',
|
||||||
|
InvoiceLegals = 'invoice_legals',
|
||||||
|
BookingWindowStart = 'booking_window_start',
|
||||||
|
BookingWindowEnd = 'booking_window_end',
|
||||||
|
BookingSlotDuration = 'booking_slot_duration',
|
||||||
|
BookingMoveEnable = 'booking_move_enable',
|
||||||
|
BookingMoveDelay = 'booking_move_delay',
|
||||||
|
BookingCancelEnable = 'booking_cancel_enable',
|
||||||
|
BookingCancelDelay = 'booking_cancel_delay',
|
||||||
|
MainColor = 'main_color',
|
||||||
|
SecondaryColor = 'secondary_color',
|
||||||
|
FablabName = 'fablab_name',
|
||||||
|
NameGenre = 'name_genre',
|
||||||
|
ReminderEnable = 'reminder_enable',
|
||||||
|
ReminderDelay = 'reminder_delay',
|
||||||
|
EventExplicationsAlert = 'event_explications_alert',
|
||||||
|
SpaceExplicationsAlert = 'space_explications_alert',
|
||||||
|
VisibilityYearly = 'visibility_yearly',
|
||||||
|
VisibilityOthers = 'visibility_others',
|
||||||
|
DisplayNameEnable = 'display_name_enable',
|
||||||
|
MachinesSortBy = 'machines_sort_by',
|
||||||
|
AccountingJournalCode = 'accounting_journal_code',
|
||||||
|
AccountingCardClientCode = 'accounting_card_client_code',
|
||||||
|
AccountingCardClientLabel = 'accounting_card_client_label',
|
||||||
|
AccountingWalletClientCode = 'accounting_wallet_client_code',
|
||||||
|
AccountingWalletClientLabel = 'accounting_wallet_client_label',
|
||||||
|
AccountingOtherClientCode = 'accounting_other_client_code',
|
||||||
|
AccountingOtherClientLabel = 'accounting_other_client_label',
|
||||||
|
AccountingWalletCode = 'accounting_wallet_code',
|
||||||
|
AccountingWalletLabel = 'accounting_wallet_label',
|
||||||
|
AccountingVATCode = 'accounting_VAT_code',
|
||||||
|
AccountingVATLabel = 'accounting_VAT_label',
|
||||||
|
AccountingSubscriptionCode = 'accounting_subscription_code',
|
||||||
|
AccountingSubscriptionLabel = 'accounting_subscription_label',
|
||||||
|
AccountingMachineCode = 'accounting_Machine_code',
|
||||||
|
AccountingMachineLabel = 'accounting_Machine_label',
|
||||||
|
AccountingTrainingCode = 'accounting_Training_code',
|
||||||
|
AccountingTrainingLabel = 'accounting_Training_label',
|
||||||
|
AccountingEventCode = 'accounting_Event_code',
|
||||||
|
AccountingEventLabel = 'accounting_Event_label',
|
||||||
|
AccountingSpaceCode = 'accounting_Space_code',
|
||||||
|
AccountingSpaceLabel = 'accounting_Space_label',
|
||||||
|
HubLastVersion = 'hub_last_version',
|
||||||
|
HubPublicKey = 'hub_public_key',
|
||||||
|
FabAnalytics = 'fab_analytics',
|
||||||
|
LinkName = 'link_name',
|
||||||
|
HomeContent = 'home_content',
|
||||||
|
HomeCss = 'home_css',
|
||||||
|
Origin = 'origin',
|
||||||
|
Uuid = 'uuid',
|
||||||
|
PhoneRequired = 'phone_required',
|
||||||
|
TrackingId = 'tracking_id',
|
||||||
|
BookOverlappingSlots = 'book_overlapping_slots',
|
||||||
|
SlotDuration = 'slot_duration',
|
||||||
|
EventsInCalendar = 'events_in_calendar',
|
||||||
|
SpacesModule = 'spaces_module',
|
||||||
|
PlansModule = 'plans_module',
|
||||||
|
InvoicingModule = 'invoicing_module',
|
||||||
|
FacebookAppId = 'facebook_app_id',
|
||||||
|
TwitterAnalytics = 'twitter_analytics',
|
||||||
|
RecaptchaSiteKey = 'recaptcha_site_key',
|
||||||
|
RecaptchaSecretKey = 'recaptcha_secret_key',
|
||||||
|
FeatureTourDisplay = 'feature_tour_display',
|
||||||
|
EmailFrom = 'email_from',
|
||||||
|
DisqusShortname = 'disqus_shortname',
|
||||||
|
AllowedCadExtensions = 'allowed_cad_extensions',
|
||||||
|
AllowedCadMimeTypes = 'allowed_cad_mime_types',
|
||||||
|
OpenlabAppId = 'openlab_app_id',
|
||||||
|
OpenlabAppSecret = 'openlab_app_secret',
|
||||||
|
OpenlabDefault = 'openlab_default',
|
||||||
|
OnlinePaymentModule = 'online_payment_module',
|
||||||
|
StripePublicKey = 'stripe_public_key',
|
||||||
|
StripeSecretKey = 'stripe_secret_key',
|
||||||
|
StripeCurrency = 'stripe_currency',
|
||||||
|
InvoicePrefix = 'invoice_prefix',
|
||||||
|
ConfirmationRequired = 'confirmation_required',
|
||||||
|
WalletModule = 'wallet_module',
|
||||||
|
StatisticsModule = 'statistics_module',
|
||||||
|
UpcomingEventsShown = 'upcoming_events_shown'
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Setting {
|
||||||
|
name: SettingName,
|
||||||
|
value: string,
|
||||||
|
last_update: Date,
|
||||||
|
history: Array<HistoryValue>
|
||||||
|
}
|
4
app/frontend/src/javascript/typings/import-png.d.ts
vendored
Normal file
4
app/frontend/src/javascript/typings/import-png.d.ts
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
declare module "*.png" {
|
||||||
|
const value: any;
|
||||||
|
export default value;
|
||||||
|
}
|
@ -24,5 +24,6 @@
|
|||||||
@import "modules/fab-modal";
|
@import "modules/fab-modal";
|
||||||
@import "modules/payment-schedule-summary";
|
@import "modules/payment-schedule-summary";
|
||||||
@import "modules/wallet-info";
|
@import "modules/wallet-info";
|
||||||
|
@import "modules/stripe-modal";
|
||||||
|
|
||||||
@import "app.responsive";
|
@import "app.responsive";
|
||||||
|
@ -19,11 +19,14 @@
|
|||||||
animation: 0.15s linear fadeIn;
|
animation: 0.15s linear fadeIn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.fab-modal-sm { width: 340px; }
|
||||||
|
.fab-modal-md { width: 440px; }
|
||||||
|
.fab-modal-lg { width: 600px; }
|
||||||
|
|
||||||
.fab-modal {
|
.fab-modal {
|
||||||
animation: 0.3s ease-out slideInFromTop;
|
animation: 0.3s ease-out slideInFromTop;
|
||||||
position: relative;
|
position: relative;
|
||||||
top: 90px;
|
top: 90px;
|
||||||
width: 340px;
|
|
||||||
margin: auto;
|
margin: auto;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
|
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
|
||||||
@ -58,13 +61,12 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.fab-modal-footer {
|
.fab-modal-footer {
|
||||||
|
position: relative;
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
border-top: 1px solid #e5e5e5;
|
border-top: 1px solid #e5e5e5;
|
||||||
|
|
||||||
.close-modal-btn {
|
.modal-btn {
|
||||||
color: black;
|
|
||||||
background-color: #fbfbfb;
|
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
margin-left: 5px;
|
margin-left: 5px;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
@ -75,14 +77,24 @@
|
|||||||
touch-action: manipulation;
|
touch-action: manipulation;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
background-image: none;
|
background-image: none;
|
||||||
border: 1px solid #c9c9c9;
|
|
||||||
padding: 6px 12px;
|
padding: 6px 12px;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 1.5;
|
line-height: 1.5;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
|
|
||||||
&:hover {
|
&--close {
|
||||||
background-color: #f2f2f2;
|
@extend .modal-btn;
|
||||||
|
color: black;
|
||||||
|
background-color: #fbfbfb;
|
||||||
|
border: 1px solid #c9c9c9;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: #f2f2f2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&--confirm {
|
||||||
|
@extend .modal-btn;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,14 +11,12 @@
|
|||||||
position: relative;
|
position: relative;
|
||||||
margin-bottom: 0.75em;
|
margin-bottom: 0.75em;
|
||||||
.schedule-item-info {
|
.schedule-item-info {
|
||||||
display: block;
|
display: inline;
|
||||||
border-bottom: 1px solid #ddd;
|
border-bottom: 1px solid #ddd;
|
||||||
margin-right: 2em;
|
|
||||||
}
|
}
|
||||||
.schedule-item-price {
|
.schedule-item-price {
|
||||||
position: absolute;
|
display: inline;
|
||||||
top: 0;
|
border-bottom: 1px solid #ddd;
|
||||||
right: 2em;
|
|
||||||
}
|
}
|
||||||
.schedule-item-date {
|
.schedule-item-date {
|
||||||
display: block;
|
display: block;
|
||||||
|
78
app/frontend/src/stylesheets/modules/stripe-modal.scss
Normal file
78
app/frontend/src/stylesheets/modules/stripe-modal.scss
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
.stripe-modal {
|
||||||
|
.fab-modal-content {
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
.stripe-form {
|
||||||
|
background-color: #f4f3f3;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
border-radius: 6px 6px 0 0;
|
||||||
|
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
|
||||||
|
padding: 15px;
|
||||||
|
|
||||||
|
.stripe-errors {
|
||||||
|
padding: 4px 0;
|
||||||
|
color: #9e2146;
|
||||||
|
margin-bottom: 1.2em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.terms-of-sales {
|
||||||
|
margin-top: 1em;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
font-size: 1.4rem;
|
||||||
|
font-weight: 600;
|
||||||
|
input {
|
||||||
|
display: inline;
|
||||||
|
margin-right: 0.5em;
|
||||||
|
}
|
||||||
|
label {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.stripe-modal-icons {
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
.fa.fa-lock {
|
||||||
|
top: 7px;
|
||||||
|
color: #9edd78;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment-schedule-info {
|
||||||
|
border: 1px solid #faebcc;
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 15px;
|
||||||
|
background-color: #fcf8e3;
|
||||||
|
color: #8a6d3b;
|
||||||
|
margin-top: 1em;
|
||||||
|
|
||||||
|
p {
|
||||||
|
font-size: small;
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.validate-btn {
|
||||||
|
width: 100%;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
border-radius: 0 0 6px 6px;
|
||||||
|
border-top: 0;
|
||||||
|
padding: 16px;
|
||||||
|
color: #fff;
|
||||||
|
background-color: #1d98ec;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
|
||||||
|
&[disabled] {
|
||||||
|
background-color: lighten(#1d98ec, 20%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment-pending {
|
||||||
|
@extend .validate-btn;
|
||||||
|
@extend .validate-btn[disabled];
|
||||||
|
text-align: center;
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
}
|
@ -6,18 +6,22 @@
|
|||||||
<div class="row row-centered padder">
|
<div class="row row-centered padder">
|
||||||
<div class="col-xs-12 col-md-12 col-lg-10 col-centered no-gutter">
|
<div class="col-xs-12 col-md-12 col-lg-10 col-centered no-gutter">
|
||||||
|
|
||||||
<!-- ng-class directive center the last item if the list length is odd -->
|
|
||||||
<div class="pricing-panel col-xs-6 col-md-6 col-lg-6 text-center"
|
|
||||||
ng-class="{'col-md-12 col-lg-12':(plansGroup.plans.filter(filterDisabledPlans).length % 2 == 1 && key == plansGroup.plans.filter(filterDisabledPlans).length-1)}"
|
|
||||||
ng-repeat="(key, plan) in plansGroup.plans.filter(filterDisabledPlans) | orderBy:'interval'">
|
|
||||||
|
|
||||||
<plan-card plan="plan"
|
<div ng-repeat="(key, plan) in plansGroup.plans.filter(filterDisabledPlans) | orderBy:'interval'"
|
||||||
user="ctrl.member"
|
ng-class-even="'row'">
|
||||||
operator="currentUser"
|
<div class="pricing-panel col-xs-12 col-md-6 col-lg-6 text-center"
|
||||||
on-select-plan="selectPlan"
|
ng-class="{'col-md-12 col-lg-12':(plansGroup.plans.filter(filterDisabledPlans).length % 2 == 1 && key == plansGroup.plans.filter(filterDisabledPlans).length-1)}">
|
||||||
is-selected="isSelected(plan)">
|
<!-- ng-class directive center the last item if the list length is odd -->
|
||||||
</plan-card>
|
|
||||||
|
|
||||||
|
<plan-card plan="plan"
|
||||||
|
user-id="ctrl.member.id"
|
||||||
|
subscribed-plan-id="ctrl.member.subscribed_plan.id"
|
||||||
|
operator="currentUser"
|
||||||
|
on-select-plan="selectPlan"
|
||||||
|
is-selected="isSelected(plan)">
|
||||||
|
</plan-card>
|
||||||
|
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<a class="m-t-lg btn btn-small btn-default pull-right" href="#" ng-click="doNotSubscribePlan($event)">{{ 'app.shared.plan_subscribe.do_not_subscribe' | translate }} <i class="fa fa-long-arrow-right"></i></a>
|
<a class="m-t-lg btn btn-small btn-default pull-right" href="#" ng-click="doNotSubscribePlan($event)">{{ 'app.shared.plan_subscribe.do_not_subscribe' | translate }} <i class="fa fa-long-arrow-right"></i></a>
|
||||||
|
@ -32,7 +32,8 @@
|
|||||||
ng-repeat="(key, plan) in plansGroup.plans.filter(filterDisabledPlans) | orderBy: '-ui_weight'">
|
ng-repeat="(key, plan) in plansGroup.plans.filter(filterDisabledPlans) | orderBy: '-ui_weight'">
|
||||||
|
|
||||||
<plan-card plan="plan"
|
<plan-card plan="plan"
|
||||||
user="ctrl.member"
|
user-id="ctrl.member.id"
|
||||||
|
subscribed-plan-id="ctrl.member.subscribed_plan.id"
|
||||||
operator="currentUser"
|
operator="currentUser"
|
||||||
on-select-plan="selectPlan"
|
on-select-plan="selectPlan"
|
||||||
is-selected="isSelected(plan)">
|
is-selected="isSelected(plan)">
|
||||||
|
@ -199,3 +199,12 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
<div ng-if="stripe.showModal">
|
||||||
|
<stripe-modal is-open="stripe.showModal"
|
||||||
|
toggle-modal="toggleStripeModal"
|
||||||
|
after-success="afterStripeSuccess"
|
||||||
|
cart-items="stripe.cartItems"
|
||||||
|
current-user="currentUser"
|
||||||
|
customer="user"
|
||||||
|
schedule="schedule.payment_schedule"/>
|
||||||
|
</div>
|
||||||
|
@ -38,15 +38,23 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
<wallet-info current-user="currentUser"
|
<wallet-info current-user="currentUser"
|
||||||
reservation="reservation"
|
reservation="reservation"
|
||||||
price="price"
|
price="price"
|
||||||
remaining-price="amount"
|
|
||||||
wallet="wallet"/>
|
wallet="wallet"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button class="btn btn-info" ng-click="ok()" ng-disabled="attempting" ng-bind-html="validButtonName"></button>
|
<button class="btn btn-info" ng-click="ok()" ng-disabled="attempting" ng-bind-html="validButtonName"></button>
|
||||||
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
|
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
|
||||||
|
<stripe-modal is-open="isOpenStripeModal"
|
||||||
|
toggle-modal="toggleStripeModal"
|
||||||
|
after-success="afterCreatePaymentSchedule"
|
||||||
|
cart-items="cartItems"
|
||||||
|
current-user="currentUser"
|
||||||
|
schedule="schedule"
|
||||||
|
customer="user"
|
||||||
|
processPayment="false"/>
|
||||||
</div>
|
</div>
|
||||||
|
@ -10,9 +10,12 @@
|
|||||||
<form name="stripeForm" stripe:form cart-items="cartItems" on-payment-success="onPaymentSuccess" stripe-key="{{stripeKey}}" class="form-horizontal">
|
<form name="stripeForm" stripe:form cart-items="cartItems" on-payment-success="onPaymentSuccess" stripe-key="{{stripeKey}}" class="form-horizontal">
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
|
|
||||||
<h3 class="m-t-xs" ng-if="walletAmount" ng-bind-html="'app.shared.wallet.you_have_amount_in_wallet' | translate:{ amount: numberFilter(walletAmount, 2), currency: currencySymbol }"></h3>
|
<div class="row">
|
||||||
<p ng-if="walletAmount > 0 && amount !== 0" class="text-italic" ng-bind-html="'app.shared.stripe.credit_amount_for_pay_reservation' | translate:{ amount: numberFilter(amount, 2), currency: currencySymbol }"></p>
|
<wallet-info current-user="currentUser"
|
||||||
|
reservation="reservation"
|
||||||
|
price="price"
|
||||||
|
wallet="wallet"/>
|
||||||
|
</div>
|
||||||
<div id="card-element"></div>
|
<div id="card-element"></div>
|
||||||
<div id="card-errors" role="alert"></div>
|
<div id="card-errors" role="alert"></div>
|
||||||
|
|
||||||
|
@ -138,7 +138,7 @@ class Reservation < ApplicationRecord
|
|||||||
if plan_id
|
if plan_id
|
||||||
self.subscription = Subscription.find_or_initialize_by(statistic_profile_id: statistic_profile_id)
|
self.subscription = Subscription.find_or_initialize_by(statistic_profile_id: statistic_profile_id)
|
||||||
subscription.attributes = { plan_id: plan_id, statistic_profile_id: statistic_profile_id, expiration_date: nil }
|
subscription.attributes = { plan_id: plan_id, statistic_profile_id: statistic_profile_id, expiration_date: nil }
|
||||||
if subscription.save_with_payment(operator_profile_id, false)
|
if subscription.save_with_payment(operator_profile_id, invoice: false)
|
||||||
invoice.invoice_items.push InvoiceItem.new(
|
invoice.invoice_items.push InvoiceItem.new(
|
||||||
amount: payment_details[:elements][:plan],
|
amount: payment_details[:elements][:plan],
|
||||||
description: subscription.plan.name,
|
description: subscription.plan.name,
|
||||||
|
@ -21,7 +21,8 @@ class Subscription < ApplicationRecord
|
|||||||
|
|
||||||
# @param invoice if true then only the subscription is payed, without reservation
|
# @param invoice if true then only the subscription is payed, without reservation
|
||||||
# if false then the subscription is payed with reservation
|
# if false then the subscription is payed with reservation
|
||||||
def save_with_payment(operator_profile_id, invoice = true, coupon_code = nil, payment_intent_id = nil, schedule = nil)
|
# @param payment_method is only used for schedules
|
||||||
|
def save_with_payment(operator_profile_id, invoice: true, coupon_code: nil, payment_intent_id: nil, schedule: nil, payment_method: nil)
|
||||||
return false unless valid?
|
return false unless valid?
|
||||||
|
|
||||||
set_expiration_date
|
set_expiration_date
|
||||||
@ -35,7 +36,7 @@ class Subscription < ApplicationRecord
|
|||||||
wallet_transaction = debit_user_wallet
|
wallet_transaction = debit_user_wallet
|
||||||
|
|
||||||
payment = if schedule
|
payment = if schedule
|
||||||
generate_schedule(operator_profile_id, coupon_code, payment_intent_id)
|
generate_schedule(operator_profile_id, payment_method, coupon_code)
|
||||||
else
|
else
|
||||||
generate_invoice(operator_profile_id, coupon_code, payment_intent_id)
|
generate_invoice(operator_profile_id, coupon_code, payment_intent_id)
|
||||||
end
|
end
|
||||||
@ -49,12 +50,18 @@ class Subscription < ApplicationRecord
|
|||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
def generate_schedule(operator_profile_id, coupon_code = nil, payment_intent_id = nil)
|
def generate_schedule(operator_profile_id, payment_method, coupon_code = nil)
|
||||||
operator = InvoicingProfile.find(operator_profile_id)&.user
|
operator = InvoicingProfile.find(operator_profile_id)&.user
|
||||||
method = operator&.admin? || (operator&.manager? && operator != user) ? nil : 'stripe' # FIXME, paiement à l'accueil
|
|
||||||
coupon = Coupon.find_by(code: coupon_code) unless coupon_code.nil?
|
coupon = Coupon.find_by(code: coupon_code) unless coupon_code.nil?
|
||||||
|
|
||||||
schedule = PaymentScheduleService.new.create(self, plan.amount, coupon: coupon, operator: operator, payment_method: method, user: user)
|
PaymentScheduleService.new.create(
|
||||||
|
self,
|
||||||
|
plan.amount,
|
||||||
|
coupon: coupon,
|
||||||
|
operator: operator,
|
||||||
|
payment_method: payment_method,
|
||||||
|
user: user
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
def generate_invoice(operator_profile_id, coupon_code = nil, payment_intent_id = nil)
|
def generate_invoice(operator_profile_id, coupon_code = nil, payment_intent_id = nil)
|
||||||
|
@ -61,7 +61,7 @@ class PaymentScheduleService
|
|||||||
item.save!
|
item.save!
|
||||||
end
|
end
|
||||||
|
|
||||||
StripeWorker.perform_async(:create_stripe_subscription, ps.id, reservation&.reservable&.stp_product_id)
|
StripeWorker.perform_async(:create_stripe_subscription, ps.id, reservation&.reservable&.stp_product_id) if payment_method == 'stripe'
|
||||||
ps
|
ps
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -9,7 +9,8 @@ class Reservations::Reserve
|
|||||||
@operator_profile_id = operator_profile_id
|
@operator_profile_id = operator_profile_id
|
||||||
end
|
end
|
||||||
|
|
||||||
def pay_and_save(reservation, payment_details: nil, payment_intent_id: nil)
|
def pay_and_save(reservation, payment_details: nil, payment_intent_id: nil, schedule: false)
|
||||||
|
# TODO, pass the schedule payment up to subscription.save_with_payment(... schedule: schedule)
|
||||||
reservation.statistic_profile_id = StatisticProfile.find_by(user_id: user_id).id
|
reservation.statistic_profile_id = StatisticProfile.find_by(user_id: user_id).id
|
||||||
reservation.save_with_payment(operator_profile_id, payment_details, payment_intent_id)
|
reservation.save_with_payment(operator_profile_id, payment_details, payment_intent_id)
|
||||||
end
|
end
|
||||||
|
@ -15,12 +15,18 @@ class Subscriptions::Subscribe
|
|||||||
# @param invoice {Boolean}
|
# @param invoice {Boolean}
|
||||||
# @param payment_intent_id {String} from stripe
|
# @param payment_intent_id {String} from stripe
|
||||||
# @param schedule {Boolean}
|
# @param schedule {Boolean}
|
||||||
|
# @param payment_method {String} only for schedules
|
||||||
##
|
##
|
||||||
def pay_and_save(subscription, coupon: nil, invoice: false, payment_intent_id: nil, schedule: false)
|
def pay_and_save(subscription, coupon: nil, invoice: false, payment_intent_id: nil, schedule: false, payment_method: nil)
|
||||||
return false if user_id.nil?
|
return false if user_id.nil?
|
||||||
|
|
||||||
subscription.statistic_profile_id = StatisticProfile.find_by(user_id: user_id).id
|
subscription.statistic_profile_id = StatisticProfile.find_by(user_id: user_id).id
|
||||||
subscription.save_with_payment(operator_profile_id, invoice, coupon, payment_intent_id, schedule)
|
subscription.save_with_payment(operator_profile_id,
|
||||||
|
invoice: invoice,
|
||||||
|
coupon_code: coupon,
|
||||||
|
payment_intent_id: payment_intent_id,
|
||||||
|
schedule: schedule,
|
||||||
|
payment_method: payment_method)
|
||||||
end
|
end
|
||||||
|
|
||||||
def extend_subscription(subscription, new_expiration_date, free_days)
|
def extend_subscription(subscription, new_expiration_date, free_days)
|
||||||
|
@ -94,6 +94,7 @@ a.project-author,
|
|||||||
a.dsq-brlink,
|
a.dsq-brlink,
|
||||||
.alert a,
|
.alert a,
|
||||||
.about-fablab a,
|
.about-fablab a,
|
||||||
|
.terms-of-sales a,
|
||||||
a.collected-infos {
|
a.collected-infos {
|
||||||
color: $primary;
|
color: $primary;
|
||||||
}
|
}
|
||||||
@ -110,6 +111,7 @@ a.dsq-brlink:hover,
|
|||||||
.payment-schedule-summary .view-full-schedule:hover,
|
.payment-schedule-summary .view-full-schedule:hover,
|
||||||
.alert a:hover,
|
.alert a:hover,
|
||||||
.about-fablab a:hover,
|
.about-fablab a:hover,
|
||||||
|
.terms-of-sales a:hover,
|
||||||
a.collected-infos:hover {
|
a.collected-infos:hover {
|
||||||
color: $primary-dark;
|
color: $primary-dark;
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,8 @@
|
|||||||
Fablab.moment_locale = "<%= Rails.application.secrets.moment_locale %>";
|
Fablab.moment_locale = "<%= Rails.application.secrets.moment_locale %>";
|
||||||
Fablab.summernote_locale = "<%= Rails.application.secrets.summernote_locale %>";
|
Fablab.summernote_locale = "<%= Rails.application.secrets.summernote_locale %>";
|
||||||
Fablab.fullcalendar_locale = "<%= Rails.application.secrets.fullcalendar_locale %>";
|
Fablab.fullcalendar_locale = "<%= Rails.application.secrets.fullcalendar_locale %>";
|
||||||
|
Fablab.intl_locale = "<%= Rails.application.secrets.intl_locale %>";
|
||||||
|
Fablab.intl_currency = "<%= Rails.application.secrets.intl_currency %>";
|
||||||
Fablab.timezone = "<%= Time.zone.tzinfo.name %>";
|
Fablab.timezone = "<%= Time.zone.tzinfo.name %>";
|
||||||
Fablab.translations = {
|
Fablab.translations = {
|
||||||
app: {
|
app: {
|
||||||
|
@ -18,23 +18,23 @@ pt:
|
|||||||
events: "Eventos"
|
events: "Eventos"
|
||||||
availabilities: "Disponíveis"
|
availabilities: "Disponíveis"
|
||||||
availabilities_notice: "Exportar para Excel livro com todos os slots disponíveis para reserva, e suas ocupações."
|
availabilities_notice: "Exportar para Excel livro com todos os slots disponíveis para reserva, e suas ocupações."
|
||||||
info: "Info"
|
info: "Informações"
|
||||||
tags: "Tags"
|
tags: "Tags"
|
||||||
slot_duration: "Slot duration: {DURATION} minutes"
|
slot_duration: "Duração do Slot {DURATION} minutos"
|
||||||
ongoing_reservations: "Reservas em curso"
|
ongoing_reservations: "Reservas em curso"
|
||||||
without_reservation: "Sem reservas"
|
without_reservation: "Sem reservas"
|
||||||
confirmation_required: "Confirmação Obrigatória"
|
confirmation_required: "Confirmação Obrigatória"
|
||||||
do_you_really_want_to_cancel_the_USER_s_reservation_the_DATE_at_TIME_concerning_RESERVATION: "Você realmente deseja cancelar a reserva do usuário {USER}, em {DATE} ás {TIME}, sobre {RESERVATION}?"
|
do_you_really_want_to_cancel_the_USER_s_reservation_the_DATE_at_TIME_concerning_RESERVATION: "Você realmente deseja cancelar a reserva do usuário {USER}, em {DATE} ás {TIME}, sobre {RESERVATION}?"
|
||||||
reservation_was_successfully_cancelled: "A reserva foi cancelada com sucesso"
|
reservation_was_successfully_cancelled: "A reserva foi cancelada com sucesso"
|
||||||
reservation_cancellation_failed: "Reservation cancellation failed."
|
reservation_cancellation_failed: "Cancelamento da reserva falhou."
|
||||||
unable_to_remove_the_last_machine_of_the_slot_delete_the_slot_rather: "Não é possível remover a última máquina do slot. Delete o slot primeiramente."
|
unable_to_remove_the_last_machine_of_the_slot_delete_the_slot_rather: "Não é possível remover a última máquina do slot. Delete o slot primeiramente."
|
||||||
do_you_really_want_to_remove_MACHINE_from_this_slot: "Você realmente deseja remover \"{MACHINE}\" desse slot?"
|
do_you_really_want_to_remove_MACHINE_from_this_slot: "Você realmente deseja remover \"{MACHINE}\" desse slot?"
|
||||||
this_will_prevent_any_new_reservation_on_this_slot_but_wont_cancel_those_existing: "Isso impedirá qualquer nova reserva neste slot, mas não cancelará os existentes."
|
this_will_prevent_any_new_reservation_on_this_slot_but_wont_cancel_those_existing: "Isso impedirá qualquer nova reserva neste slot, mas não cancelará os existentes."
|
||||||
beware_this_cannot_be_reverted: "Cuidado: isso não pode ser revertido."
|
beware_this_cannot_be_reverted: "Cuidado: isso não pode ser revertido."
|
||||||
the_machine_was_successfully_removed_from_the_slot: "A máquina foi removida com sucesso desse slot."
|
the_machine_was_successfully_removed_from_the_slot: "A máquina foi removida com sucesso desse slot."
|
||||||
deletion_failed: "Falha ao deletar."
|
deletion_failed: "Falha ao deletar."
|
||||||
do_you_really_want_to_remove_PLAN_from_this_slot: "Do you really want to remove \"{PLAN}\" from this slot?"
|
do_you_really_want_to_remove_PLAN_from_this_slot: "Você realmente deseja remover \"{PLAN}\" desse slot?"
|
||||||
the_plan_was_successfully_removed_from_the_slot: "The plan was successfully removed from the slot."
|
the_plan_was_successfully_removed_from_the_slot: "O plano foi removido do slot com sucesso."
|
||||||
DATE_slot: "{DATE} slot:"
|
DATE_slot: "{DATE} slot:"
|
||||||
what_kind_of_slot_do_you_want_to_create: "Qual tipo de slot você deseja criar?"
|
what_kind_of_slot_do_you_want_to_create: "Qual tipo de slot você deseja criar?"
|
||||||
training: "Treinamento"
|
training: "Treinamento"
|
||||||
@ -45,37 +45,37 @@ pt:
|
|||||||
select_some_machines: "Selecionar algumas máquinas"
|
select_some_machines: "Selecionar algumas máquinas"
|
||||||
select_all: "Tudo"
|
select_all: "Tudo"
|
||||||
select_none: "Não"
|
select_none: "Não"
|
||||||
manage_machines: "Click here to add or remove machines."
|
manage_machines: "Clique aqui para adicionar ou remover máquinas."
|
||||||
manage_spaces: "Click here to add or remove spaces."
|
manage_spaces: "Clique aqui para adicionar ou remover espaços."
|
||||||
manage_trainings: "Click here to add or remove trainings."
|
manage_trainings: "Clique aqui para adicionar ou remover treinamentos."
|
||||||
number_of_tickets: "Número de vagas: "
|
number_of_tickets: "Número de vagas: "
|
||||||
adjust_the_opening_hours: "Ajustar o horário de funcionamento"
|
adjust_the_opening_hours: "Ajustar o horário de funcionamento"
|
||||||
to_time: "ás" #eg. from 18:00 to 21:00
|
to_time: "ás" #eg. from 18:00 to 21:00
|
||||||
restrict_options: "Restriction options"
|
restrict_options: "Opções de restrição"
|
||||||
restrict_with_labels: "Restrinja este slot com etiquetas"
|
restrict_with_labels: "Restrinja este slot com etiquetas"
|
||||||
restrict_for_subscriptions: "Restrict this slot for subscription users"
|
restrict_for_subscriptions: "Restringir este slot para os usuários da assinatura"
|
||||||
select_some_plans: "Select some plans"
|
select_some_plans: "Selecione alguns planos"
|
||||||
plans: "Plan(s):"
|
plans: "Plano(s):"
|
||||||
recurrence: "Recurrence"
|
recurrence: "Recorrência"
|
||||||
enabled: "Enabled"
|
enabled: "Ativo"
|
||||||
period: "Period"
|
period: "Período"
|
||||||
week: "Week"
|
week: "Semana"
|
||||||
month: "Month"
|
month: "Mês"
|
||||||
number_of_periods: "Number of periods"
|
number_of_periods: "Número de períodos"
|
||||||
end_date: "End date"
|
end_date: "Data de término"
|
||||||
summary: "Summary"
|
summary: "Sumário"
|
||||||
select_period: "Please select a period for the recurrence"
|
select_period: "Por favor, selecione um período para a recorrência"
|
||||||
select_nb_period: "Please select a number of periods for the recurrence"
|
select_nb_period: "Por favor, selecione um período para a recorrência"
|
||||||
select_end_date: "Please select the date of the last occurrence"
|
select_end_date: "Por favor, selecione a data da última ocorrência"
|
||||||
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}}:"
|
about_to_create: "Você está prestes a criar um slot de {TYPE, select, machines{máquina} training{treinando} space{espaço} other{outro}} {NUMBER, plural, one{! slots} other{}}."
|
||||||
divided_in_slots: "{COUNT, plural, =1{This slot} other{These slots}} will be open for booking in {DURATION}-minutes increments."
|
divided_in_slots: "{COUNT, plural, one {} =1{Este slot será aberto} other{Estes slots serão abertos}} para a reserva em incrementos de {DURATION} minutos."
|
||||||
reservable: "Reservable(s) :"
|
reservable: "Reservable(s) :"
|
||||||
labels: "Etiqueta(s):"
|
labels: "Etiqueta(s):"
|
||||||
none: "Nenhuma"
|
none: "Nenhuma"
|
||||||
slot_successfully_deleted: "O slot {START} - {END} foi deletado com sucesso"
|
slot_successfully_deleted: "O slot {START} - {END} foi deletado com sucesso"
|
||||||
slots_deleted: "The slot of {START}, and {COUNT, plural, =1{one other} other{{COUNT} others}}}, have been deleted"
|
slots_deleted: "O slot de {START}, e {COUNT, plural, =1{one other} other{{COUNT} outros}}}, foram excluídos"
|
||||||
unable_to_delete_the_slot: "Não é possível deletar o slot {START} - {END}, provavelmente porque já foi reservado por um membro"
|
unable_to_delete_the_slot: "Não é possível deletar o slot {START} - {END}, provavelmente porque já foi reservado por um membro"
|
||||||
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}}."
|
slots_not_deleted: "Em {TOTAL} slots, {COUNT, plural, one {} =1{um não foi deletado} other{{COUNT} não foram deletados}}. Talvez existam algumas reservas {COUNT, plural, =1{nela} other{nelas}}."
|
||||||
you_should_select_at_least_a_machine: "Você deveria selecionar a última máquina neste slot."
|
you_should_select_at_least_a_machine: "Você deveria selecionar a última máquina neste slot."
|
||||||
export_is_running_you_ll_be_notified_when_its_ready: "A Exportação está em andamento. Você será notificado quando terminar."
|
export_is_running_you_ll_be_notified_when_its_ready: "A Exportação está em andamento. Você será notificado quando terminar."
|
||||||
actions: "Ações"
|
actions: "Ações"
|
||||||
@ -91,98 +91,98 @@ pt:
|
|||||||
unlockable_because_reservations: "Não é possível bloquear a reserva neste slot porque existem algumas reservas não cancelados nele."
|
unlockable_because_reservations: "Não é possível bloquear a reserva neste slot porque existem algumas reservas não cancelados nele."
|
||||||
delete_slot: "Exclua o slot"
|
delete_slot: "Exclua o slot"
|
||||||
do_you_really_want_to_delete_this_slot: "Você realmente quer excluir esse slot?"
|
do_you_really_want_to_delete_this_slot: "Você realmente quer excluir esse slot?"
|
||||||
delete_recurring_slot: "You're about to delete a recurring slot. What do you want to do?"
|
delete_recurring_slot: "Você está prestes a excluir um slot recorrente. O que deseja fazer?"
|
||||||
delete_this_slot: "Only this slot"
|
delete_this_slot: "Somente este slot"
|
||||||
delete_this_and_next: "This slot and the following"
|
delete_this_and_next: "Este slot e o seguinte"
|
||||||
delete_all: "All slots"
|
delete_all: "Todos os slots"
|
||||||
event_in_the_past: "Unable to create a slot in the past."
|
event_in_the_past: "Não foi possível criar um slot no passado."
|
||||||
edit_event: "Edit the event"
|
edit_event: "Editar evento"
|
||||||
view_reservations: "Ver reservas"
|
view_reservations: "Ver reservas"
|
||||||
legend: "Legenda"
|
legend: "Legenda"
|
||||||
and: "and"
|
and: "e"
|
||||||
external_sync: "Calendar synchronization"
|
external_sync: "Sincronização com a agenda"
|
||||||
divide_this_availability: "Divide this availability in"
|
divide_this_availability: "Divida esta disponibilidade em"
|
||||||
slots: "slots"
|
slots: "slots"
|
||||||
slots_of: "of"
|
slots_of: "do"
|
||||||
minutes: "minutes"
|
minutes: "minutos"
|
||||||
#import external iCal calendar
|
#import external iCal calendar
|
||||||
icalendar:
|
icalendar:
|
||||||
icalendar_import: "iCalendar import"
|
icalendar_import: "importar iCalendar"
|
||||||
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."
|
intro: "O Fab-manager permite importar automaticamente eventos do calendário, no formato RFC 5545 do iCalendar, a partir de uma URL externa. Esta URL é sincronizada a cada hora e os eventos são mostrados no calendário público. Você também pode acionar uma sincronização, clicando no botão correspondente, na frente de cada importação."
|
||||||
new_import: "New ICS import"
|
new_import: "Nova importação de ICS"
|
||||||
color: "Colour"
|
color: "Cor"
|
||||||
text_color: "Text colour"
|
text_color: "Cor do texto"
|
||||||
url: "URL"
|
url: "URL"
|
||||||
name: "Name"
|
name: "Nome"
|
||||||
example: "Example"
|
example: "Exemplo"
|
||||||
display: "Display"
|
display: "Visualização"
|
||||||
hide_text: "Hide the text"
|
hide_text: "Ocultar o texto"
|
||||||
hidden: "Hidden"
|
hidden: "Ocultado"
|
||||||
shown: "Shown"
|
shown: "Exibido"
|
||||||
create_error: "Unable to create iCalendar import. Please try again later"
|
create_error: "Não foi possível criar a importação iCalendar. Por favor, tente novamente mais tarde"
|
||||||
delete_failed: "Unable to delete the iCalendar import. Please try again later"
|
delete_failed: "Não foi possível excluir a importação do iCalendar. Por favor, tente novamente mais tarde"
|
||||||
refresh: "Updating..."
|
refresh: "Atualizando..."
|
||||||
sync_failed: "Unable to synchronize the URL. Please try again later"
|
sync_failed: "Não foi possível sincronizar a URL. Tente novamente mais tarde"
|
||||||
confirmation_required: "Confirmation required"
|
confirmation_required: "Confirmação necessária"
|
||||||
confirm_delete_import: "Do you really want to delete this iCalendar import?"
|
confirm_delete_import: "Você realmente deseja excluir esta importação do iCalendar?"
|
||||||
delete_success: "iCalendar import successfully deleted"
|
delete_success: "importação iCalendar excluída com sucesso"
|
||||||
#management of the projects' components & settings
|
#management of the projects' components & settings
|
||||||
projects:
|
projects:
|
||||||
name: "Name"
|
name: "Nome"
|
||||||
projects_settings: "Projects settings"
|
projects_settings: "Configurações do projeto"
|
||||||
materials: "Materials"
|
materials: "Materiais"
|
||||||
add_a_material: "Add a material"
|
add_a_material: "Adicionar material"
|
||||||
themes: "Themes"
|
themes: "Temas"
|
||||||
add_a_new_theme: "Add a new theme"
|
add_a_new_theme: "Adicionar um novo tema"
|
||||||
licences: "Licences"
|
licences: "Licenças"
|
||||||
description: "Description"
|
description: "Descrição"
|
||||||
add_a_new_licence: "Add a new licence"
|
add_a_new_licence: "Adicionar uma nova licença"
|
||||||
manage_abuses: "Manage the reports"
|
manage_abuses: "Gerenciar relatórios"
|
||||||
settings:
|
settings:
|
||||||
title: "Settings"
|
title: "Configurações"
|
||||||
comments: "Comments"
|
comments: "Comentários"
|
||||||
disqus: "Disqus"
|
disqus: "Discos"
|
||||||
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 <a href='https://help.disqus.com/customer/portal/articles/466208-what-s-a-shortname-' target='_blank'>the Disqus website</a> for more information."
|
disqus_info: "Se você quiser habilitar seus membros e visitantes para comentar em projetos, você pode habilitar os fóruns de Discos definindo o seguinte parâmetro. Visite <a href='https://help.disqus.com/customer/portal/articles/466208-what-s-a-shortname-' target='_blank'>o site do Disqus</a> para obter mais informações."
|
||||||
shortname: "Shortname"
|
shortname: "Shortname"
|
||||||
cad_files: "CAD files"
|
cad_files: "Arquivos CAD"
|
||||||
validation: "Validation"
|
validation: "Validação"
|
||||||
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."
|
validation_info: "Os usuários podem carregar arquivos CAD (Computador Aided Design) com a documentação de seus projetos. Pode especificar quais tipos de arquivos são permitidos. Utilize a entrada de teste abaixo para determinar o tipo MIME de um arquivo."
|
||||||
extensions: "Allowed extensions"
|
extensions: "Extensões permitidas"
|
||||||
new_extension: "New extension"
|
new_extension: "Nova extensão"
|
||||||
new_ext_info_html: "<p>Specify a new file extension to allow these files to be uploaded.</p><p>Please consider that allowing file archives (eg. ZIP) or binary executable (eg. EXE) may result in a <strong>dangerous security issue</strong> and must be avoided in any cases.</p>"
|
new_ext_info_html: "<p>Especifique uma extensão de arquivo para permitir que esses arquivos sejam carregados.</p><p>Por favor, considere que permitindo arquivos (por exemplo, ZIP) ou executável binário (ex. EXE) pode resultar numa <strong>questão de segurança perigosa</strong> e deve ser evitada em todos os casos.</p>"
|
||||||
mime_types: "Allowed MIME types"
|
mime_types: "Tipos MIME permitidos"
|
||||||
new_mime_type: "New MIME type"
|
new_mime_type: "Novo tipo MIME"
|
||||||
new_type_info_html: "<p>Specify a new MIME type to allow these files to be uploaded.</p><p>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 <strong>dangerous security issue</strong> and must be avoided in any cases.</p>"
|
new_type_info_html: "<p>Especifique um novo tipo MIME para permitir que esses arquivos sejam carregados.</p><p>Por favor, utilize a entrada de teste para determinar o tipo MIME de um arquivo. Por favor, considere que permitindo arquivos de arquivo (por exemplo, application/zip) ou executável binário (ex. application/exe) pode resultar em um <strong>perigoso problema de segurança</strong> e deve ser evitado em quaisquer casos.</p>"
|
||||||
test_file: "Test a file"
|
test_file: "Testar um arquivo"
|
||||||
set_a_file: "Select a file"
|
set_a_file: "Selecionar um arquivo"
|
||||||
file_is_TYPE: "MIME type of this file is {TYPE}"
|
file_is_TYPE: "O tipo MIME deste arquivo é {TYPE}"
|
||||||
projects_sharing: "Projects sharing"
|
projects_sharing: "Compartilhamento de projetos"
|
||||||
open_lab_projects: "OpenLab Projects"
|
open_lab_projects: "Projetos OpenLab"
|
||||||
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 <a href='mailto:contact@fab-manager.com'>contact@fab-manager.com</a> to get your access credentials for free."
|
open_lab_info_html: "Ative o OpenLab para compartilhar seus projetos com outros Laboratórios Fab e exibir uma galeria de projetos compartilhados. Envie um e-mail para <a href='mailto:contact@fab-manager.com'>contact@fab-manager.com</a> para obter suas credenciais de acesso gratuitamente."
|
||||||
open_lab_app_id: "ID"
|
open_lab_app_id: "ID"
|
||||||
open_lab_app_secret: "Secret"
|
open_lab_app_secret: "Senha"
|
||||||
openlab_default_info_html: "In the projects gallery, visitors can switch between two views: all shared projets from the whole OpenLab network, or only the projects documented in your Fab Lab.<br/>Here, you can choose which view is shown by default."
|
openlab_default_info_html: "Na galeria de projetos, os visitantes podem alternar entre duas visualizações: todos os projetos compartilhados de toda a rede OpenLab, ou apenas os projetos documentados no seu Fab Lab.<br/>Aqui, você pode escolher qual exibição é mostrada por padrão."
|
||||||
default_to_openlab: "Display OpenLab by default"
|
default_to_openlab: "Mostrar OpenLab por padrão"
|
||||||
#track and monitor the trainings
|
#track and monitor the trainings
|
||||||
trainings:
|
trainings:
|
||||||
trainings_monitoring: "Trainings monitoring"
|
trainings_monitoring: "Treinamentos"
|
||||||
plan_session: "Schedule a new session"
|
plan_session: "Agendar uma nova sessão"
|
||||||
trainings: "Treinamentos"
|
trainings: "Treinamentos"
|
||||||
add_a_new_training: "Adicionar um novo treinamento"
|
add_a_new_training: "Adicionar um novo treinamento"
|
||||||
name: "Name"
|
name: "Nome"
|
||||||
associated_machines: "Máquinas associadas"
|
associated_machines: "Máquinas associadas"
|
||||||
number_of_tickets: "Número de vagas"
|
number_of_tickets: "Número de vagas"
|
||||||
select_a_training: "Select a training"
|
select_a_training: "Selecione um treinamento"
|
||||||
training: "Training"
|
training: "Treinamento"
|
||||||
date: "Date"
|
date: "Data"
|
||||||
year_NUMBER: "Ano {NUMBER}"
|
year_NUMBER: "Ano {NUMBER}"
|
||||||
month_of_NAME: "Mês de {NAME}"
|
month_of_NAME: "Mês de {NAME}"
|
||||||
NUMBER_reservation: "{NUMBER} {NUMBER, plural, one{reserva} other{reservas}}"
|
NUMBER_reservation: "{NUMBER} {NUMBER, plural, one{reserva} other{reservas}}"
|
||||||
none: "Vazio"
|
none: "Vazio"
|
||||||
training_validation: "Validação de treinamentos"
|
training_validation: "Validação de treinamentos"
|
||||||
training_of_the_DATE_TIME_html: "Training of the <strong>{DATE} - {TIME}</strong>"
|
training_of_the_DATE_TIME_html: "Treinamento do <strong>{DATE} - {TIME}</strong>"
|
||||||
you_can_validate_the_training_of_the_following_members: "Você pode validar um treinamento dos seguintes membros:"
|
you_can_validate_the_training_of_the_following_members: "Você pode validar um treinamento dos seguintes membros:"
|
||||||
deleted_user: "Deleted user"
|
deleted_user: "Usuário deletado"
|
||||||
no_reservation: "Sem reservas"
|
no_reservation: "Sem reservas"
|
||||||
validate_the_trainings: "Validação de treinamentos"
|
validate_the_trainings: "Validação de treinamentos"
|
||||||
edition_of_the_description_tooltip: "Edição da descrição tooltip"
|
edition_of_the_description_tooltip: "Edição da descrição tooltip"
|
||||||
@ -191,7 +191,7 @@ pt:
|
|||||||
description_was_successfully_saved: "A descrição foi salva com sucesso."
|
description_was_successfully_saved: "A descrição foi salva com sucesso."
|
||||||
training_successfully_deleted: "O treinamento foi deletado com sucesso."
|
training_successfully_deleted: "O treinamento foi deletado com sucesso."
|
||||||
unable_to_delete_the_training_because_some_users_already_booked_it: "Não é possível deletar o treinamento, pois alguns membros já o reservaram."
|
unable_to_delete_the_training_because_some_users_already_booked_it: "Não é possível deletar o treinamento, pois alguns membros já o reservaram."
|
||||||
confirmation_required: "Confirmation required"
|
confirmation_required: "Confirmação obrigatória"
|
||||||
do_you_really_want_to_delete_this_training: "Você realmente quer deletar este treinamento?"
|
do_you_really_want_to_delete_this_training: "Você realmente quer deletar este treinamento?"
|
||||||
status_enabled: "Ativos"
|
status_enabled: "Ativos"
|
||||||
status_disabled: "Desabilitados"
|
status_disabled: "Desabilitados"
|
||||||
@ -206,7 +206,7 @@ pt:
|
|||||||
events_monitoring: "Monitoramento de eventos"
|
events_monitoring: "Monitoramento de eventos"
|
||||||
manage_filters: "Gerenciar filtros"
|
manage_filters: "Gerenciar filtros"
|
||||||
fablab_events: "Eventos do FabLab"
|
fablab_events: "Eventos do FabLab"
|
||||||
add_an_event: "Add an event"
|
add_an_event: "Adicionar um evento"
|
||||||
all_events: "Todos eventos"
|
all_events: "Todos eventos"
|
||||||
passed_events: "Eventos anteriores"
|
passed_events: "Eventos anteriores"
|
||||||
events_to_come: "Eventos futuros"
|
events_to_come: "Eventos futuros"
|
||||||
@ -214,21 +214,21 @@ pt:
|
|||||||
on_DATE: "No {DATE}"
|
on_DATE: "No {DATE}"
|
||||||
from_DATE: "Em {DATE}"
|
from_DATE: "Em {DATE}"
|
||||||
from_TIME: "Ás {TIME}"
|
from_TIME: "Ás {TIME}"
|
||||||
to_date: "to" #eg: from 01/01 to 01/05
|
to_date: "ás" #eg: from 01/01 to 01/05
|
||||||
to_time: "to" #eg. from 18:00 to 21:00
|
to_time: "ás" #eg. from 18:00 to 21:00
|
||||||
title: "Title"
|
title: "Título"
|
||||||
dates: "Dates"
|
dates: "Datas"
|
||||||
booking: "Reserva"
|
booking: "Reserva"
|
||||||
sold_out: "Esgotado"
|
sold_out: "Esgotado"
|
||||||
cancelled: "Cancelado"
|
cancelled: "Cancelado"
|
||||||
without_reservation: "Sem reservas"
|
without_reservation: "Sem reservas"
|
||||||
free_admission: "Admissão gratuita"
|
free_admission: "Admissão gratuita"
|
||||||
view_reservations: "Ver reservas"
|
view_reservations: "Ver reservas"
|
||||||
load_the_next_events: "Load the next events..."
|
load_the_next_events: "Carregar os próximos eventos..."
|
||||||
categories: "Categorias"
|
categories: "Categorias"
|
||||||
add_a_category: "Adicionar categoria"
|
add_a_category: "Adicionar categoria"
|
||||||
name: "Name"
|
name: "Nome"
|
||||||
themes: "Theme"
|
themes: "Tema"
|
||||||
add_a_theme: "Adicionar tema"
|
add_a_theme: "Adicionar tema"
|
||||||
age_ranges: "Faixa etária"
|
age_ranges: "Faixa etária"
|
||||||
add_a_range: "Adicionar faixa etária"
|
add_a_range: "Adicionar faixa etária"
|
||||||
@ -257,7 +257,7 @@ pt:
|
|||||||
price_category_deletion_failed: "Falha ao deletar preço de categoria."
|
price_category_deletion_failed: "Falha ao deletar preço de categoria."
|
||||||
#add a new event
|
#add a new event
|
||||||
events_new:
|
events_new:
|
||||||
add_an_event: "Add an event"
|
add_an_event: "Adicionar um evento"
|
||||||
none: "Vazio"
|
none: "Vazio"
|
||||||
every_days: "Todos os dias"
|
every_days: "Todos os dias"
|
||||||
every_week: "Toda semana"
|
every_week: "Toda semana"
|
||||||
@ -266,24 +266,24 @@ pt:
|
|||||||
#edit an existing event
|
#edit an existing event
|
||||||
events_edit:
|
events_edit:
|
||||||
edit_the_event: "Editar evento"
|
edit_the_event: "Editar evento"
|
||||||
confirmation_required: "Confirmation required"
|
confirmation_required: "Confirmação obrigatória"
|
||||||
edit_recurring_event: "You're about to update a periodic event. What do you want to update ?"
|
edit_recurring_event: "Você está prestes a atualizar um evento periódico. O que você quer atualizar ?"
|
||||||
edit_this_event: "Only this event"
|
edit_this_event: "Apenas este evento"
|
||||||
edit_this_and_next: "This event and the following"
|
edit_this_and_next: "Este evento e os seguintes"
|
||||||
edit_all: "All events"
|
edit_all: "Todos eventos"
|
||||||
date_wont_change: "Warning: you have changed the event date. This modification won't be propagated to other occurrences of the periodic event."
|
date_wont_change: "Atenção: você alterou a data do evento. Esta modificação não será propagada para outras ocorrências do evento periódico."
|
||||||
event_successfully_updated: "Event successfully updated."
|
event_successfully_updated: "Evento atualizado com sucesso."
|
||||||
events_updated: "The event, and {COUNT, plural, =1{one other} other{{COUNT} others}}, have been updated"
|
events_updated: "O evento e {COUNT, plural, one {} =1{mais um} other{{COUNT} outros}}, foram atualizados"
|
||||||
unable_to_update_the_event: "Unable to update the event"
|
unable_to_update_the_event: "Não foi possível atualizar o evento"
|
||||||
events_not_updated: "On {TOTAL} events, {COUNT, plural, =1{one was not updated} other{{COUNT} were not deleted}}."
|
events_not_updated: "Em {TOTAL} eventos, {COUNT, plural, one {} =1{um não foi atualizado} other{{COUNT} não foram deletados}}"
|
||||||
error_deleting_reserved_price: "Não permitido deletar o preço requisitado, pois está associado a algumas reservas"
|
error_deleting_reserved_price: "Não permitido deletar o preço requisitado, pois está associado a algumas reservas"
|
||||||
other_error: "Um erro inesperado ocorreu enquanto o evento era atualizado"
|
other_error: "Um erro inesperado ocorreu enquanto o evento era atualizado"
|
||||||
#event reservations list
|
#event reservations list
|
||||||
event_reservations:
|
event_reservations:
|
||||||
the_reservations: "Reservas :"
|
the_reservations: "Reservas :"
|
||||||
user: "User"
|
user: "Usuário"
|
||||||
payment_date: "Data de pagamento"
|
payment_date: "Data de pagamento"
|
||||||
full_price_: "Full price:"
|
full_price_: "Preço total:"
|
||||||
reserved_tickets: "Vagas reservadas"
|
reserved_tickets: "Vagas reservadas"
|
||||||
show_the_event: "Mostrar evento"
|
show_the_event: "Mostrar evento"
|
||||||
no_reservations_for_now: "Nenhuma reserva."
|
no_reservations_for_now: "Nenhuma reserva."
|
||||||
@ -295,7 +295,7 @@ pt:
|
|||||||
subscriptions: "Inscrições"
|
subscriptions: "Inscrições"
|
||||||
trainings: "Treinamentos"
|
trainings: "Treinamentos"
|
||||||
list_of_the_subscription_plans: "Lista dos planos de assinatura"
|
list_of_the_subscription_plans: "Lista dos planos de assinatura"
|
||||||
disabled_plans_info_html: "<p><strong>Warning:</strong> the subscriptions are disabled on this application.</p><p>You can still create some, but they won't be available until the activation of the plans module, from the « Customization » section.</p>"
|
disabled_plans_info_html: "<p><strong>Aviso:</strong> as assinaturas estão desativadas nesta aplicação.</p><p>Você ainda pode criar algumas, mas eles não estarão disponíveis até a ativação dos módulos de planos, na seção « Personalização».</p>"
|
||||||
add_a_new_subscription_plan: "Adicionar novo plano de assinatura"
|
add_a_new_subscription_plan: "Adicionar novo plano de assinatura"
|
||||||
type: "Tipo"
|
type: "Tipo"
|
||||||
partner: "Parceiro"
|
partner: "Parceiro"
|
||||||
@ -305,17 +305,17 @@ pt:
|
|||||||
group: "Grupo"
|
group: "Grupo"
|
||||||
prominence: "Relevância"
|
prominence: "Relevância"
|
||||||
price: "Preço"
|
price: "Preço"
|
||||||
machine_hours: "Machine slots"
|
machine_hours: "Slots de máquina"
|
||||||
these_prices_match_machine_hours_rates_html: "The prices below match one hour of machine usage, <strong>without subscription</strong>."
|
these_prices_match_machine_hours_rates_html: "Os preços abaixo correspondem a uma hora de uso de máquina, <strong>sem assinatura</strong>."
|
||||||
prices_calculated_on_hourly_rate_html: "All the prices will be automatically calculated based on the hourly rate defined here.<br/><em>For example</em>, if you define an hourly rate at {RATE}: a slot of {DURATION} minutes (default), will be charged <strong>{PRICE}</strong>."
|
prices_calculated_on_hourly_rate_html: "Todos os preços serão calculados automaticamente com base na taxa horária definida aqui.<br/><em>Por exemplo</em>, se você definir uma taxa horária em {RATE}: um slot de {DURATION} minutos (padrão), será cobrada a tarifa <strong>{PRICE}</strong>."
|
||||||
you_can_override: "You can override this duration for each availability you create in the agenda. The price will then be adjusted accordingly."
|
you_can_override: "Você pode substituir essa duração por cada disponibilidade que você criar na agenda. O preço será então ajustado em conformidade."
|
||||||
machines: "Máquinas"
|
machines: "Máquinas"
|
||||||
credits: "Créditos"
|
credits: "Créditos"
|
||||||
subscription: "Inscrições"
|
subscription: "Inscrições"
|
||||||
related_trainings: "Treinamentos relacionados"
|
related_trainings: "Treinamentos relacionados"
|
||||||
add_a_machine_credit: "Adicionar crédito de máquina"
|
add_a_machine_credit: "Adicionar crédito de máquina"
|
||||||
machine: "Máquina"
|
machine: "Máquina"
|
||||||
hours: "Slots (default {DURATION} minutes)"
|
hours: "Slots (padrão {DURATION} minutos)"
|
||||||
related_subscriptions: "Assinaturas relacionadas"
|
related_subscriptions: "Assinaturas relacionadas"
|
||||||
please_specify_a_number: "Por favor especifique um número."
|
please_specify_a_number: "Por favor especifique um número."
|
||||||
none: "Vazio" #grammar concordance with training.
|
none: "Vazio" #grammar concordance with training.
|
||||||
@ -323,7 +323,7 @@ pt:
|
|||||||
an_error_occurred_while_deleting_credit_with_the_TRAINING: "Um erro ocorreu enquanto o crédito era deletado do {TRAINING}."
|
an_error_occurred_while_deleting_credit_with_the_TRAINING: "Um erro ocorreu enquanto o crédito era deletado do {TRAINING}."
|
||||||
an_error_occurred_unable_to_find_the_credit_to_revoke: "Um erro ocorreu : incapaz de encontrar o crédito para revogar."
|
an_error_occurred_unable_to_find_the_credit_to_revoke: "Um erro ocorreu : incapaz de encontrar o crédito para revogar."
|
||||||
an_error_occurred_while_creating_credit_with_the_TRAINING: "Ocorreu um erro ao criar o crédito com o {TRAINING}."
|
an_error_occurred_while_creating_credit_with_the_TRAINING: "Ocorreu um erro ao criar o crédito com o {TRAINING}."
|
||||||
not_set: "Not set"
|
not_set: "Não definido"
|
||||||
error_a_credit_linking_this_machine_with_that_subscription_already_exists: "Erro : um link de crédito entre esta máquina e esta assinatura já existe."
|
error_a_credit_linking_this_machine_with_that_subscription_already_exists: "Erro : um link de crédito entre esta máquina e esta assinatura já existe."
|
||||||
changes_have_been_successfully_saved: "As modificações foram salvas com sucesso."
|
changes_have_been_successfully_saved: "As modificações foram salvas com sucesso."
|
||||||
credit_was_successfully_saved: "Crédito salvo com sucesso."
|
credit_was_successfully_saved: "Crédito salvo com sucesso."
|
||||||
@ -337,12 +337,12 @@ pt:
|
|||||||
nb_of_usages: "Número de usos"
|
nb_of_usages: "Número de usos"
|
||||||
status: "Status"
|
status: "Status"
|
||||||
add_a_new_coupon: "Adicionar novo cupom"
|
add_a_new_coupon: "Adicionar novo cupom"
|
||||||
display_more_coupons: "Display the next coupons"
|
display_more_coupons: "Mostrar os próximos cupons"
|
||||||
disabled: "Desabilitado"
|
disabled: "Desabilitado"
|
||||||
expired: "Expirado"
|
expired: "Expirado"
|
||||||
sold_out: "Esgotado"
|
sold_out: "Esgotado"
|
||||||
active: "Ativo"
|
active: "Ativo"
|
||||||
all: "Display all"
|
all: "Mostrar todos"
|
||||||
confirmation_required: "Confirmação obrigatória"
|
confirmation_required: "Confirmação obrigatória"
|
||||||
do_you_really_want_to_delete_this_coupon: "Você realmente deseja deletar este cupom?"
|
do_you_really_want_to_delete_this_coupon: "Você realmente deseja deletar este cupom?"
|
||||||
coupon_was_successfully_deleted: "O cupom foi deletado com sucesso."
|
coupon_was_successfully_deleted: "O cupom foi deletado com sucesso."
|
||||||
@ -351,7 +351,7 @@ pt:
|
|||||||
send_a_coupon: "Enviar cupom"
|
send_a_coupon: "Enviar cupom"
|
||||||
coupon: "Cupom"
|
coupon: "Cupom"
|
||||||
usages: "Usos"
|
usages: "Usos"
|
||||||
unlimited: "Unlimited"
|
unlimited: "Sem limite"
|
||||||
coupon_successfully_sent_to_USER: "Cupon enviado com sucesso para {USER}"
|
coupon_successfully_sent_to_USER: "Cupon enviado com sucesso para {USER}"
|
||||||
an_error_occurred_unable_to_send_the_coupon: "Um erro inesperado impede o envio do cupom."
|
an_error_occurred_unable_to_send_the_coupon: "Um erro inesperado impede o envio do cupom."
|
||||||
code: "Código"
|
code: "Código"
|
||||||
@ -361,7 +361,7 @@ pt:
|
|||||||
forever: "Cada uso"
|
forever: "Cada uso"
|
||||||
valid_until: "Válido até (incluindo)"
|
valid_until: "Válido até (incluindo)"
|
||||||
spaces: "Espaços"
|
spaces: "Espaços"
|
||||||
these_prices_match_space_hours_rates_html: "The prices below match one hour of space usage, <strong>without subscription</strong>."
|
these_prices_match_space_hours_rates_html: "Os preços abaixo correspondem a uma hora de uso do espaço, <strong>sem assinatura</strong>."
|
||||||
add_a_space_credit: "Adicionar espaço de crédito"
|
add_a_space_credit: "Adicionar espaço de crédito"
|
||||||
space: "Espaço"
|
space: "Espaço"
|
||||||
error_a_credit_linking_this_space_with_that_subscription_already_exists: "Erro: um crédito que vincula esse espaço com essa assinatura já existe."
|
error_a_credit_linking_this_space_with_that_subscription_already_exists: "Erro: um crédito que vincula esse espaço com essa assinatura já existe."
|
||||||
@ -374,7 +374,7 @@ pt:
|
|||||||
unable_to_create_the_coupon_check_code_already_used: "Impossível criar cupom. Por favor certifique-se que o código já não foi utilizado."
|
unable_to_create_the_coupon_check_code_already_used: "Impossível criar cupom. Por favor certifique-se que o código já não foi utilizado."
|
||||||
#mettre à jour un code promotionnel
|
#mettre à jour un code promotionnel
|
||||||
coupons_edit:
|
coupons_edit:
|
||||||
coupon: "Coupon:"
|
coupon: "Cupom:"
|
||||||
unable_to_update_the_coupon_an_error_occurred: "Impossível atualizar cupom: um erro ocorreu."
|
unable_to_update_the_coupon_an_error_occurred: "Impossível atualizar cupom: um erro ocorreu."
|
||||||
plans:
|
plans:
|
||||||
#add a subscription plan on the platform
|
#add a subscription plan on the platform
|
||||||
@ -390,7 +390,7 @@ pt:
|
|||||||
copy_prices_from: "Copiar preços de"
|
copy_prices_from: "Copiar preços de"
|
||||||
machines: "Máquinas"
|
machines: "Máquinas"
|
||||||
machine: "Máquina"
|
machine: "Máquina"
|
||||||
hourly_rate: "Hourly rate"
|
hourly_rate: "Preço por hora"
|
||||||
spaces: "Espaços"
|
spaces: "Espaços"
|
||||||
space: "Espaço"
|
space: "Espaço"
|
||||||
unable_to_save_subscription_changes_please_try_again: "Impossível salvar mudanças da assinatura. Por favor tente novamente."
|
unable_to_save_subscription_changes_please_try_again: "Impossível salvar mudanças da assinatura. Por favor tente novamente."
|
||||||
@ -398,10 +398,10 @@ pt:
|
|||||||
#list of all invoices & invoicing parameters
|
#list of all invoices & invoicing parameters
|
||||||
invoices:
|
invoices:
|
||||||
invoices: "Faturas"
|
invoices: "Faturas"
|
||||||
accounting_periods: "Accounting periods"
|
accounting_periods: "Períodos de contabilidade"
|
||||||
invoices_list: "Lista de faturas"
|
invoices_list: "Lista de faturas"
|
||||||
filter_invoices: "Filtrar faturas"
|
filter_invoices: "Filtrar faturas"
|
||||||
operator_: "Operator:"
|
operator_: "Operador:"
|
||||||
invoice_num_: "Fatura #:"
|
invoice_num_: "Fatura #:"
|
||||||
customer_: "Cliente:"
|
customer_: "Cliente:"
|
||||||
date_: "Data:"
|
date_: "Data:"
|
||||||
@ -415,9 +415,9 @@ pt:
|
|||||||
display_more_invoices: "Mostrar mais faturas..."
|
display_more_invoices: "Mostrar mais faturas..."
|
||||||
no_invoices_for_now: "Nenhuma fatura."
|
no_invoices_for_now: "Nenhuma fatura."
|
||||||
invoicing_settings: "Configurações do faturamento"
|
invoicing_settings: "Configurações do faturamento"
|
||||||
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."
|
warning_invoices_disabled: "Aviso: As faturas não estão ativadas. Nenhuma fatura será gerada pelo Fab-manager. No entanto, você deve preencher corretamente as informações abaixo, especialmente o IVA."
|
||||||
change_logo: "Mudar o logo"
|
change_logo: "Mudar o logo"
|
||||||
john_smith: "John Smith"
|
john_smith: "João da Silva"
|
||||||
john_smith_at_example_com: "jean.smith@example.com"
|
john_smith_at_example_com: "jean.smith@example.com"
|
||||||
invoice_reference_: "Referencia de fatura:"
|
invoice_reference_: "Referencia de fatura:"
|
||||||
code_: "Código:"
|
code_: "Código:"
|
||||||
@ -443,7 +443,7 @@ pt:
|
|||||||
year: "Ano"
|
year: "Ano"
|
||||||
month: "Mês"
|
month: "Mês"
|
||||||
day: "Dia"
|
day: "Dia"
|
||||||
num_of_invoice: "Num. of invoice"
|
num_of_invoice: "Num. de fatura"
|
||||||
online_sales: "Vendas online"
|
online_sales: "Vendas online"
|
||||||
wallet: "Carteira"
|
wallet: "Carteira"
|
||||||
refund: "Restituição"
|
refund: "Restituição"
|
||||||
@ -452,39 +452,39 @@ pt:
|
|||||||
2_digits_year: "2 dígitos ano (ex 70)"
|
2_digits_year: "2 dígitos ano (ex 70)"
|
||||||
4_digits_year: "4 dígitos ano (ex. 1970)"
|
4_digits_year: "4 dígitos ano (ex. 1970)"
|
||||||
month_number: "Número do mês (eg. 1)"
|
month_number: "Número do mês (eg. 1)"
|
||||||
2_digits_month_number: "2 digits month number (eg. 01)"
|
2_digits_month_number: "Número de 2 dígitos do mês (ex. 01)"
|
||||||
3_characters_month_name: "3 characters month name (eg. JAN)"
|
3_characters_month_name: "3 caracteres do nome do mês (ex. JAN)"
|
||||||
day_in_the_month: "Day in the month (eg. 1)"
|
day_in_the_month: "Dia no mês (ex. 1)"
|
||||||
2_digits_day_in_the_month: "2 digits in the month (eg. 01)"
|
2_digits_day_in_the_month: "2 dígitos no mês (ex. 01)"
|
||||||
n_digits_daily_count_of_invoices: "(n) digits, daily count of invoices (eg. ddd => 002 : 2nd invoice of the day)"
|
n_digits_daily_count_of_invoices: "(n) dígitos, contagem diária de faturas (ex. ddd => 002 : 2 faturas do dia)"
|
||||||
n_digits_monthly_count_of_invoices: "(n) digits, monthly count of invoices (eg. mmmm => 0012 : 12th invoice of the month)"
|
n_digits_monthly_count_of_invoices: "(n) dígitos, contagem mensal de faturas (ex. mmmm => 0012: décimo quinto pedido do mês)"
|
||||||
n_digits_annual_amount_of_invoices: "(n) digits, annual count of invoices (ex. yyyyyy => 000008 : 8th invoice of this year)"
|
n_digits_annual_amount_of_invoices: "(n) dígitos, contagem mensal de faturas (ex. mmmm => 000008: décimo quinto pedido do mês)"
|
||||||
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."
|
beware_if_the_number_exceed_the_specified_length_it_will_be_truncated_by_the_left: "Cuidado: se o número exceder o comprimento especificado, ele será truncado pela esquerda."
|
||||||
n_digits_count_of_orders: "(n) digits, count of invoices (eg. nnnn => 0327 : 327th order)"
|
n_digits_count_of_orders: "(n) dígitos, contagem de faturas (ex. nnnn => 0327 : 327th ordem)"
|
||||||
n_digits_daily_count_of_orders: "(n) digits, daily count of orders (eg. ddd => 002 : 2nd order of the day)"
|
n_digits_daily_count_of_orders: "(n) dígitos, contagem diária de pedidos (ex. ddd => 002: 2 da ordem do dia)"
|
||||||
n_digits_monthly_count_of_orders: "(n) digits, monthly count of orders (eg. mmmm => 0012 : 12th order of the month)"
|
n_digits_monthly_count_of_orders: "(n) dígitos, contagem mensal de pedidos (ex. mmmm => 0012: décimo primeiro da ordem do mês)"
|
||||||
n_digits_annual_amount_of_orders: "(n) digits, annual count of orders (ex. yyyyyy => 000008 : 8th order of this year)"
|
n_digits_annual_amount_of_orders: "(n) dígitos, contagem anual de pedidos (ex. aaaaaa => 000008: oitava ordem deste ano)"
|
||||||
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."
|
add_a_notice_regarding_the_online_sales_only_if_the_invoice_is_concerned: "Adicionar um aviso sobre as vendas on-line, somente se a fatura estiver envolvida."
|
||||||
this_will_never_be_added_when_a_refund_notice_is_present: "This will never be added when a refund notice is present."
|
this_will_never_be_added_when_a_refund_notice_is_present: "Isso nunca será adicionado quando uma notificação de reembolso estiver presente."
|
||||||
eg_XVL_will_add_VL_to_the_invoices_settled_with_stripe: '(eg. X[/VL] will add "/VL" to the invoices settled with stripe)'
|
eg_XVL_will_add_VL_to_the_invoices_settled_with_stripe: '(ex. X[/VL] irá adicionar "/VL" às faturas liquidadas com lista)'
|
||||||
add_a_notice_regarding_refunds_only_if_the_invoice_is_concerned: "Add a notice regarding refunds, only if the invoice is concerned."
|
add_a_notice_regarding_refunds_only_if_the_invoice_is_concerned: "Adicionar um aviso sobre reembolsos, apenas se a fatura estiver envolvida."
|
||||||
this_will_never_be_added_when_an_online_sales_notice_is_present: "This will never be added when an online sales notice is present."
|
this_will_never_be_added_when_an_online_sales_notice_is_present: "Isto nunca será adicionado quando uma notificação de vendas online estiver presente."
|
||||||
eg_RA_will_add_A_to_the_refund_invoices: '(ed. R[/A] will add "/A" to the refund invoices)'
|
eg_RA_will_add_A_to_the_refund_invoices: '(ed. R[/A] irá adicionar "/A" nas faturas reembolsadas)'
|
||||||
add_a_notice_regarding_the_wallet_only_if_the_invoice_is_concerned: "Add a notice regarding the wallet, only if the invoice is concerned."
|
add_a_notice_regarding_the_wallet_only_if_the_invoice_is_concerned: "Adicionar um aviso sobre a carteira, somente se a fatura estiver em questão."
|
||||||
eg_WPM_will_add_PM_to_the_invoices_settled_with_wallet: '(eg. W[/PM] will add "/PM" to the invoices settled with wallet)'
|
eg_WPM_will_add_PM_to_the_invoices_settled_with_wallet: '(ex. W[/PM] irá adicionar "/PM" às faturas liquidadas com a carteira)'
|
||||||
code: "Código"
|
code: "Código"
|
||||||
enable_the_code: "Ativar código"
|
enable_the_code: "Ativar código"
|
||||||
enabled: "Ativar"
|
enabled: "Ativar"
|
||||||
disabled: "Desativar"
|
disabled: "Desativar"
|
||||||
order_number: "Número de ordem"
|
order_number: "Número de ordem"
|
||||||
elements: "Elementos"
|
elements: "Elementos"
|
||||||
VAT: "VAT"
|
VAT: "Taxa de imposto"
|
||||||
enable_VAT: "Ativar VAT"
|
enable_VAT: "Ativar VAT"
|
||||||
VAT_rate: "VAT taxa"
|
VAT_rate: "VAT taxa"
|
||||||
VAT_history: "VAT rates history"
|
VAT_history: "Histórico de taxas"
|
||||||
changed_at: "Changed at"
|
changed_at: "Alterado em"
|
||||||
changed_by: "By"
|
changed_by: "Por"
|
||||||
deleted_user: "Deleted user"
|
deleted_user: "Usuário deletado"
|
||||||
refund_invoice_successfully_created: "Restituição de fatura criada com sucesso."
|
refund_invoice_successfully_created: "Restituição de fatura criada com sucesso."
|
||||||
create_a_refund_on_this_invoice: "Criar restituição de fatura"
|
create_a_refund_on_this_invoice: "Criar restituição de fatura"
|
||||||
creation_date_for_the_refund: "Criação de data de restituição"
|
creation_date_for_the_refund: "Criação de data de restituição"
|
||||||
@ -504,8 +504,8 @@ pt:
|
|||||||
unable_to_create_the_refund: "Não foi possível criar reembolso"
|
unable_to_create_the_refund: "Não foi possível criar reembolso"
|
||||||
invoice_reference_successfully_saved: "Referência de fatura salva com sucesso."
|
invoice_reference_successfully_saved: "Referência de fatura salva com sucesso."
|
||||||
an_error_occurred_while_saving_invoice_reference: "Um erro ocorreu enquanto era salvo a fatura de referência."
|
an_error_occurred_while_saving_invoice_reference: "Um erro ocorreu enquanto era salvo a fatura de referência."
|
||||||
invoicing_code_succesfully_saved: "Invoicing code successfully saved."
|
invoicing_code_succesfully_saved: "Código de fatura salvo com sucesso."
|
||||||
an_error_occurred_while_saving_the_invoicing_code: "An error occurred while saving the invoicing code."
|
an_error_occurred_while_saving_the_invoicing_code: "Ocorreu um erro ao salvar o código de faturação."
|
||||||
code_successfully_activated: "Código ativado com sucesso."
|
code_successfully_activated: "Código ativado com sucesso."
|
||||||
code_successfully_disabled: "Código desativado com êxito."
|
code_successfully_disabled: "Código desativado com êxito."
|
||||||
an_error_occurred_while_activating_the_invoicing_code: "Ocorreu um erro ao ativar o código de faturamento."
|
an_error_occurred_while_activating_the_invoicing_code: "Ocorreu um erro ao ativar o código de faturamento."
|
||||||
@ -522,158 +522,158 @@ pt:
|
|||||||
an_error_occurred_while_saving_the_address_and_the_legal_information: "Um erro ocorreu ao salvar o endereço e informações legais."
|
an_error_occurred_while_saving_the_address_and_the_legal_information: "Um erro ocorreu ao salvar o endereço e informações legais."
|
||||||
logo_successfully_saved: "Logo salvo com sucesso."
|
logo_successfully_saved: "Logo salvo com sucesso."
|
||||||
an_error_occurred_while_saving_the_logo: "Um erro ocorreu ao salvar o logo."
|
an_error_occurred_while_saving_the_logo: "Um erro ocorreu ao salvar o logo."
|
||||||
filename: "File name"
|
filename: "Nome do arquivo"
|
||||||
prefix_info: "The invoices will be generated as PDF files, named with the following prefix."
|
prefix_info: "As faturas serão geradas como arquivos PDF, com o seguinte prefixo."
|
||||||
prefix: "Prefix"
|
prefix: "Prefixo"
|
||||||
prefix_successfully_saved: "File prefix successfully saved"
|
prefix_successfully_saved: "Prefixo de arquivo salvo com sucesso"
|
||||||
an_error_occurred_while_saving_the_prefix: "An error occurred while saving the file prefix"
|
an_error_occurred_while_saving_the_prefix: "Ocorreu um erro ao salvar o prefixo do arquivo"
|
||||||
online_payment: "Pagamento Online"
|
online_payment: "Pagamento Online"
|
||||||
close_accounting_period: "Close an accounting period"
|
close_accounting_period: "Fechar um período de contabilidade"
|
||||||
close_from_date: "Close from"
|
close_from_date: "Fechar de"
|
||||||
start_date_is_required: "Start date is required"
|
start_date_is_required: "Data de início obrigatória"
|
||||||
close_until_date: "Close until"
|
close_until_date: "Fechar até"
|
||||||
end_date_is_required: "End date is required"
|
end_date_is_required: "A data final é obrigatória"
|
||||||
previous_closings: "Previous closings"
|
previous_closings: "Fechamentos anteriores"
|
||||||
start_date: "From"
|
start_date: "De"
|
||||||
end_date: "To"
|
end_date: "Até"
|
||||||
closed_at: "Closed at"
|
closed_at: "Fechado em"
|
||||||
closed_by: "By"
|
closed_by: "Por"
|
||||||
period_total: "Period total"
|
period_total: "Período total"
|
||||||
perpetual_total: "Perpetual total"
|
perpetual_total: "Total perpétuo"
|
||||||
integrity: "Verificação de integridade"
|
integrity: "Verificação de integridade"
|
||||||
confirmation_required: "Confirmation required"
|
confirmation_required: "Confirmação necessária"
|
||||||
confirm_close_START_END: "Do you really want to close the accounting period between {START} and {END}? Any subsequent changes will be impossible"
|
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."
|
period_must_match_fiscal_year: "O encerramento tem de ocorrer no final de um período anual mínimo, ou por exercício quando não se basear no calendário."
|
||||||
this_may_take_a_while: "This operation will take some time to complete."
|
this_may_take_a_while: "Esta operação levará algum tempo para ser concluída."
|
||||||
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."
|
period_START_END_closed_success: "O período de contabilidade de {START} a {END} foi fechado com sucesso. A geração de arquivos está em execução, você será notificado quando for finalizada."
|
||||||
failed_to_close_period: "An error occurred, unable to close the accounting period"
|
failed_to_close_period: "Ocorreu um erro, não foi possível fechar o período de contabilidade"
|
||||||
no_periods: "No closings for now"
|
no_periods: "Sem fechamentos por enquanto"
|
||||||
accounting_codes: "Accounting codes"
|
accounting_codes: "Códigos contábeis"
|
||||||
accounting_journal_code: "Journal code"
|
accounting_journal_code: "Código do diário"
|
||||||
general_journal_code: "Journal code"
|
general_journal_code: "Código do diário"
|
||||||
accounting_card_client_code: "Card clients code"
|
accounting_card_client_code: "Rótulo de cartão clientes"
|
||||||
card_client_code: "Accounting code for clients who paid by card"
|
card_client_code: "Código de contabilidade para clientes que pagaram com cartão"
|
||||||
accounting_card_client_label: "Card clients label"
|
accounting_card_client_label: "Rótulo de cartão clientes"
|
||||||
card_client_label: "Account label for clients who paid by card"
|
card_client_label: "Rótulo de conta para clientes que pagaram por cartão"
|
||||||
accounting_wallet_client_code: "Wallet clients code"
|
accounting_wallet_client_code: "Código de clientes da carteira"
|
||||||
wallet_client_code: "Accounting code for clients who paid by virtual wallet"
|
wallet_client_code: "Código de conta para clientes que pagaram por carteira virtual"
|
||||||
accounting_wallet_client_label: "Wallet clients label"
|
accounting_wallet_client_label: "Rótulo para carteira"
|
||||||
wallet_client_label: "Account label for clients who paid by virtual wallet"
|
wallet_client_label: "Rótulo de conta para clientes que pagaram por carteira virtual"
|
||||||
accounting_other_client_code: "Other payment client code"
|
accounting_other_client_code: "Other payment client code"
|
||||||
other_client_code: "Accounting code for clients who paid using another payment means"
|
other_client_code: "Código de conta para os clientes que pagaram usando outro meio de pagamento"
|
||||||
accounting_other_client_label: "Other payment client label"
|
accounting_other_client_label: "Other payment client label"
|
||||||
other_client_label: "Accounting label for clients who paid using another payment means"
|
other_client_label: "Etiqueta de contabilidade para os clientes que pagaram usando outro meio de pagamento"
|
||||||
accounting_wallet_code: "Wallet code"
|
accounting_wallet_code: "Código da carteira"
|
||||||
general_wallet_code: "Accounting code for wallet credit"
|
general_wallet_code: "Código de contabilidade para crédito da carteira"
|
||||||
accounting_wallet_label: "Wallet label"
|
accounting_wallet_label: "Rótulo da carteira"
|
||||||
general_wallet_label: "Account label for wallet credit"
|
general_wallet_label: "Rótulo de conta para crédito de carteira"
|
||||||
accounting_vat_code: "VAT code"
|
accounting_vat_code: "VAT code"
|
||||||
general_vat_code: "Accounting code for VAT"
|
general_vat_code: "Código de contabilidade para IVA"
|
||||||
accounting_vat_label: "VAT label"
|
accounting_vat_label: "Etiqueta de imposto"
|
||||||
general_vat_label: "VAT account label"
|
general_vat_label: "Rótulo de conta VAT"
|
||||||
accounting_subscription_code: "Subscriptions code"
|
accounting_subscription_code: "Código das assinaturas"
|
||||||
general_subscription_code: "Accounting code for all subscriptions"
|
general_subscription_code: "Código de contabilidade para todas as assinaturas"
|
||||||
accounting_subscription_label: "Subscriptions label"
|
accounting_subscription_label: "Rótulo das assinaturas"
|
||||||
general_subscription_label: "Account label for all subscriptions"
|
general_subscription_label: "Rótulo de conta para todas as assinaturas"
|
||||||
accounting_Machine_code: "Machines code"
|
accounting_Machine_code: "Código das máquinas"
|
||||||
general_machine_code: "Accounting code for all machines"
|
general_machine_code: "Código de contabilidade para todas as máquinas"
|
||||||
accounting_Machine_label: "Machine label"
|
accounting_Machine_label: "Etiqueta de máquina"
|
||||||
general_machine_label: "Account label for all machines"
|
general_machine_label: "Rótulo de conta para todas as máquinas"
|
||||||
accounting_Training_code: "Trainings code"
|
accounting_Training_code: "Código de treinamentos"
|
||||||
general_training_code: "Accounting code for all trainings"
|
general_training_code: "Código de contabilidade para todos os treinamentos"
|
||||||
accounting_Training_label: "Trainings label"
|
accounting_Training_label: "Rótulo de treinamentos"
|
||||||
general_training_label: "Account label for all trainings"
|
general_training_label: "Rótulo de conta para todos os treinamentos"
|
||||||
accounting_Event_code: "Events code"
|
accounting_Event_code: "Código de eventos"
|
||||||
general_event_code: "Accounting code for all events"
|
general_event_code: "Código de contabilidade para todos os eventos"
|
||||||
accounting_Event_label: "Events label"
|
accounting_Event_label: "Rótulo de eventos"
|
||||||
general_event_label: "Account label for all events"
|
general_event_label: "Rótulo de conta para todos os eventos"
|
||||||
accounting_Space_code: "Space code"
|
accounting_Space_code: "Código do espaço"
|
||||||
general_space_code: "Accounting code for all spaces"
|
general_space_code: "Código de contabilidade para todos os espaços"
|
||||||
accounting_Space_label: "Spaces label"
|
accounting_Space_label: "Rótulo de espaços"
|
||||||
general_space_label: "Account label for all spaces"
|
general_space_label: "Rótulo de conta para todos os espaços"
|
||||||
codes_customization_success: "Customization of accounting codes successfully saved."
|
codes_customization_success: "Customization of accounting codes successfully saved."
|
||||||
unexpected_error_occurred: "An unexpected error occurred while saving the codes. Please try again later."
|
unexpected_error_occurred: "Ocorreu um erro inesperado ao salvar os códigos. Tente novamente mais tarde."
|
||||||
export_accounting_data: "Export accounting data"
|
export_accounting_data: "Exportar dados de contabilidade"
|
||||||
export_to: "Export to the accounting software"
|
export_to: "Exportar para o software de contabilidade"
|
||||||
export_is_running: "A Exportação está em andamento. Você será notificado quando terminar."
|
export_is_running: "A Exportação está em andamento. Você será notificado quando terminar."
|
||||||
acd: "ACD"
|
acd: "ACD"
|
||||||
export_form_date: "Export from"
|
export_form_date: "Exportar de"
|
||||||
export_to_date: "Export until"
|
export_to_date: "Exportar até"
|
||||||
format: "File format"
|
format: "Formato do arquivo"
|
||||||
encoding: "Encoding"
|
encoding: "Codificação"
|
||||||
separator: "Separator"
|
separator: "Separador"
|
||||||
dateFormat: "Date format"
|
dateFormat: "Formato da Data"
|
||||||
labelMaxLength: "Label maximum length"
|
labelMaxLength: "Label maximum length"
|
||||||
decimalSeparator: "Decimal separator"
|
decimalSeparator: "Separador Decimal"
|
||||||
exportInvoicesAtZero: "Export invoices equal to 0"
|
exportInvoicesAtZero: "Exportar faturas iguais a 0"
|
||||||
columns: "Columns"
|
columns: "Colunas"
|
||||||
exportColumns:
|
exportColumns:
|
||||||
journal_code: "Journal code"
|
journal_code: "Código do diário"
|
||||||
date: "Entry date"
|
date: "Data de entrada"
|
||||||
account_code: "Account code"
|
account_code: "Código da conta"
|
||||||
account_label: "Account label"
|
account_label: "Nome da conta"
|
||||||
piece: "Document"
|
piece: "Documento"
|
||||||
line_label: "Entry label"
|
line_label: "Rótulo da postagem"
|
||||||
debit_origin: "Origin debit"
|
debit_origin: "Débito de origem"
|
||||||
credit_origin: "Origin credit"
|
credit_origin: "Crédito de origem"
|
||||||
debit_euro: "Euro debit"
|
debit_euro: "Débito em euro"
|
||||||
credit_euro: "Euro credit"
|
credit_euro: "Crédito em euro"
|
||||||
lettering: "Lettering"
|
lettering: "Letras"
|
||||||
payment:
|
payment:
|
||||||
payment_settings: "Payment settings"
|
payment_settings: "Configurações de pagamento"
|
||||||
online_payment: "Online payment"
|
online_payment: "Pagamento Online"
|
||||||
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."
|
online_payment_info_html: "Você pode permitir que seus membros façam uma reserva diretamente on-line, pagando por cartão. Como alternativa, você pode restringir os processos de reserva e pagamento para administradores e gerentes."
|
||||||
enable_online_payment: "Enable online payment"
|
enable_online_payment: "Habilitar pagamentos online"
|
||||||
stripe_keys: "Stripe keys"
|
stripe_keys: "Chaves do Stripe"
|
||||||
stripe_keys_info_html: "<p>To be able to collect online payments, you must configure the <a href='https://stripe.com' target='_blank'>Stripe</a> API keys.</p><p>Retrieve them from <a href='https://dashboard.stripe.com/account/apikeys' target='_blank'>your dashboard</a>.</p><p>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.</p>"
|
stripe_keys_info_html: "<p>Para coletar pagamentos online, você deve configurar as <a href='https://stripe.com' target='_blank'>chaves de API do Stripe</a>.</p><p>Recupere eles do <a href='https://dashboard.stripe.com/account/apikeys' target='_blank'>seu painel</a>.</p><p>A atualização dessas chaves ativará uma sincronização de todos os usuários no Stripe, isso pode levar algum tempo. Você receberá uma notificação quando estiver pronto.</p>"
|
||||||
public_key: "Public key"
|
public_key: "Chave pública"
|
||||||
secret_key: "Secret key"
|
secret_key: "Chave secreta"
|
||||||
error_check_keys: "Error: please check your Stripe keys."
|
error_check_keys: "Erro: por favor, verifique as suas chaves da Stripe."
|
||||||
stripe_keys_saved: "Stripe keys successfully saved."
|
stripe_keys_saved: "Chaves Stripe salvas com sucesso."
|
||||||
error_saving_stripe_keys: "Unable to save the Stripe keys. Please try again later."
|
error_saving_stripe_keys: "Não foi possível salvar as chaves do Stripe. Por favor, tente novamente mais tarde."
|
||||||
edit_keys: "Edit keys"
|
edit_keys: "Editar chaves"
|
||||||
currency: "Currency"
|
currency: "Moeda"
|
||||||
currency_info_html: "Please specify below the currency used for online payment. You should provide a three-letter ISO code, from the list of <a href='https://stripe.com/docs/currencies' target='_blank'>Stripe supported currencies</a>."
|
currency_info_html: "Por favor, especifique abaixo da moeda usada para pagamento online. Você deve fornecer um código ISO de três letras, da lista de <a href='https://stripe.com/docs/currencies' target='_blank'>moedas com suporte a Stripe</a>."
|
||||||
currency_alert_html: "<strong>Warning</strong>: the currency cannot be changed after the first online payment was made. Please define this setting carefully before opening Fab-manager to your members."
|
currency_alert_html: "<strong>Aviso</strong>: a moeda não pode ser alterada após o primeiro pagamento online ter sido feito. Defina essa configuração cuidadosamente antes de abrir o Fab-manager para seus membros."
|
||||||
stripe_currency: "Stripe currency"
|
stripe_currency: "Moeda do Stripe"
|
||||||
#management of users, labels, groups, and so on
|
#management of users, labels, groups, and so on
|
||||||
members:
|
members:
|
||||||
users_management: "Gerenciamento de usuários"
|
users_management: "Gerenciamento de usuários"
|
||||||
users: "Users"
|
users: "Usuários"
|
||||||
members: "Membros"
|
members: "Membros"
|
||||||
subscriptions: "Subscriptions"
|
subscriptions: "Assinaturas"
|
||||||
search_for_an_user: "Buscar por usuário"
|
search_for_an_user: "Buscar por usuário"
|
||||||
add_a_new_member: "Adicionar novo membro"
|
add_a_new_member: "Adicionar novo membro"
|
||||||
reservations: "Reservas"
|
reservations: "Reservas"
|
||||||
surname: "Last name"
|
surname: "Sobrenome"
|
||||||
first_name: "First name"
|
first_name: "Primeiro nome"
|
||||||
email: "Email"
|
email: "Email"
|
||||||
phone: "Telefone"
|
phone: "Telefone"
|
||||||
user_type: "Tipo de usuário"
|
user_type: "Tipo de usuário"
|
||||||
subscription: "Subscription"
|
subscription: "Assinatura"
|
||||||
display_more_users: "Mostrar mais usuários..."
|
display_more_users: "Mostrar mais usuários..."
|
||||||
administrators: "Administradores"
|
administrators: "Administradores"
|
||||||
search_for_an_administrator: "Buscar por administrador"
|
search_for_an_administrator: "Buscar por administrador"
|
||||||
add_a_new_administrator: "Adicionar novo administrador"
|
add_a_new_administrator: "Adicionar novo administrador"
|
||||||
managers: "Managers"
|
managers: "Gerentes"
|
||||||
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."
|
managers_info: "Um gerente é um administrador restrito que não pode modificar as configurações do aplicativo. No entanto, poderá ter reservas em relação a quaisquer membros e a todos os gestores, incluindo eles próprios, e processar pagamentos e reembolsos."
|
||||||
search_for_a_manager: "Search for a manager"
|
search_for_a_manager: "Procurar por um gerente"
|
||||||
add_a_new_manager: "Add a new manager"
|
add_a_new_manager: "Adicionar um novo gerente"
|
||||||
delete_this_manager: "Do you really want to delete this manager? This cannot be undone."
|
delete_this_manager: "Você realmente deseja excluir este gerenciador? Isso não pode ser desfeito."
|
||||||
manager_successfully_deleted: "Manager successfully deleted."
|
manager_successfully_deleted: "Gerente excluído com sucesso."
|
||||||
unable_to_delete_the_manager: "Unable to delete the manager."
|
unable_to_delete_the_manager: "Não foi possível excluir o gerente."
|
||||||
partners: "Partners"
|
partners: "Parceiros"
|
||||||
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."
|
partners_info: "O parceiro é um usuário especial que pode ser associado aos planos «Parceiros». Estes usuários não serão capazes de se conectar e apenas receberão notificações sobre as assinaturas do plano associado."
|
||||||
search_for_a_partner: "Search for a partner"
|
search_for_a_partner: "Procurar por um parceiro"
|
||||||
add_a_new_partner: "Add a new partner"
|
add_a_new_partner: "Adicionar um novo parceiro"
|
||||||
delete_this_partner: "Do you really want to delete this partner? This cannot be undone."
|
delete_this_partner: "Você realmente deseja excluir este parceiro? Isso não pode ser desfeito."
|
||||||
partner_successfully_deleted: "Partner successfully deleted."
|
partner_successfully_deleted: "Parceiro excluído com sucesso."
|
||||||
unable_to_delete_the_partner: "Unable to delete the partner."
|
unable_to_delete_the_partner: "Não é possível excluir o parceiro."
|
||||||
associated_plan: "Associated plan"
|
associated_plan: "Plano associado"
|
||||||
groups: "Grupos"
|
groups: "Grupos"
|
||||||
tags: "Tags"
|
tags: "Tags"
|
||||||
authentication: "Autenticação"
|
authentication: "Autenticação"
|
||||||
confirmation_required: "Confirmation required"
|
confirmation_required: "Confirmação obrigatória"
|
||||||
confirm_delete_member: "Você realmente deseja excluir este usuário? Isso não pode ser revertido."
|
confirm_delete_member: "Você realmente deseja excluir este usuário? Isso não pode ser revertido."
|
||||||
member_successfully_deleted: "Usuário excluído com sucesso."
|
member_successfully_deleted: "Usuário excluído com sucesso."
|
||||||
unable_to_delete_the_member: "Impossível excluir membro."
|
unable_to_delete_the_member: "Impossível excluir membro."
|
||||||
@ -682,30 +682,30 @@ pt:
|
|||||||
administrator_successfully_deleted: "Administrator excluído com sucesso."
|
administrator_successfully_deleted: "Administrator excluído com sucesso."
|
||||||
unable_to_delete_the_administrator: "Impossível excluir administrador."
|
unable_to_delete_the_administrator: "Impossível excluir administrador."
|
||||||
changes_successfully_saved: "Mudanças salvas com sucesso."
|
changes_successfully_saved: "Mudanças salvas com sucesso."
|
||||||
an_error_occurred_while_saving_changes: "An error occurred when saving changes."
|
an_error_occurred_while_saving_changes: "Ocorreu um erro ao salvar as alterações."
|
||||||
export_is_running_you_ll_be_notified_when_its_ready: "Export is running. You'll be notified when it's ready."
|
export_is_running_you_ll_be_notified_when_its_ready: "A exportação está em execução. Você será notificado quando estiver pronto."
|
||||||
tag_form:
|
tag_form:
|
||||||
tags: "Tags"
|
tags: "Etiquetas"
|
||||||
add_a_tag: "Adicionar tag"
|
add_a_tag: "Adicionar tag"
|
||||||
tag_name: "Nome da tag"
|
tag_name: "Nome da tag"
|
||||||
new_tag_successfully_saved: "Nova tag salva com sucesso."
|
new_tag_successfully_saved: "Nova tag salva com sucesso."
|
||||||
an_error_occurred_while_saving_the_new_tag: "Um erro ocorreu ao salvar nova tag."
|
an_error_occurred_while_saving_the_new_tag: "Um erro ocorreu ao salvar nova tag."
|
||||||
confirmation_required: "Delete this tag?"
|
confirmation_required: "Excluir esta tag?"
|
||||||
confirm_delete_tag_html: "Do you really want to delete this tag?<br>Users and slots currently associated with this tag will be dissociated.<br><strong>Warning: This cannot be undone!</strong>"
|
confirm_delete_tag_html: "Você realmente deseja excluir esta tag?<br>Os usuários e os slots que estão associados a esta tag serão dissociados.<br><strong>Aviso: Isso não pode ser desfeito!</strong>"
|
||||||
tag_successfully_deleted: "Tag excluída com sucesso."
|
tag_successfully_deleted: "Tag excluída com sucesso."
|
||||||
an_error_occurred_and_the_tag_deletion_failed: "Um erro ocorreu ao excluir tag."
|
an_error_occurred_and_the_tag_deletion_failed: "Um erro ocorreu ao excluir tag."
|
||||||
authentication_form:
|
authentication_form:
|
||||||
search_for_an_authentication_provider: "Procurar um provedor de autenticação"
|
search_for_an_authentication_provider: "Procurar um provedor de autenticação"
|
||||||
add_a_new_authentication_provider: "Adicionar um novo provedor de autenticação"
|
add_a_new_authentication_provider: "Adicionar um novo provedor de autenticação"
|
||||||
name: "Name"
|
name: "Nome"
|
||||||
strategy_name: "Nome da estratégia"
|
strategy_name: "Nome da estratégia"
|
||||||
type: "Type"
|
type: "Tipo"
|
||||||
state: "Estado"
|
state: "Estado"
|
||||||
unknown: "Desconhecido: "
|
unknown: "Desconhecido: "
|
||||||
active: "Ativo"
|
active: "Ativo"
|
||||||
pending: "Pendente"
|
pending: "Pendente"
|
||||||
previous_provider: "Fornecedor anterior"
|
previous_provider: "Fornecedor anterior"
|
||||||
confirmation_required: "Delete the provider?"
|
confirmation_required: "Excluir o provedor?"
|
||||||
do_you_really_want_to_delete_the_TYPE_authentication_provider_NAME: "Deseja realmente excluir o provedor de autenticação {TYPE}: {NAME}?"
|
do_you_really_want_to_delete_the_TYPE_authentication_provider_NAME: "Deseja realmente excluir o provedor de autenticação {TYPE}: {NAME}?"
|
||||||
authentication_provider_successfully_deleted: "Provedor de autenticação excluido com sucesso."
|
authentication_provider_successfully_deleted: "Provedor de autenticação excluido com sucesso."
|
||||||
an_error_occurred_unable_to_delete_the_specified_provider: "Ocorreu um erro: não é possível excluir o provedor especificado."
|
an_error_occurred_unable_to_delete_the_specified_provider: "Ocorreu um erro: não é possível excluir o provedor especificado."
|
||||||
@ -728,59 +728,59 @@ pt:
|
|||||||
status_enabled: "Ativos"
|
status_enabled: "Ativos"
|
||||||
status_disabled: "Desabilitados"
|
status_disabled: "Desabilitados"
|
||||||
status_all: "Todos"
|
status_all: "Todos"
|
||||||
member_filter_all: "All"
|
member_filter_all: "Tudo"
|
||||||
member_filter_not_confirmed: "Unconfirmed"
|
member_filter_not_confirmed: "Não Confirmado"
|
||||||
member_filter_inactive_for_3_years: "Inactive for 3 years"
|
member_filter_inactive_for_3_years: "Inativo por 3 anos"
|
||||||
#add a member
|
#add a member
|
||||||
members_new:
|
members_new:
|
||||||
add_a_member: "Adicionar membro"
|
add_a_member: "Adicionar membro"
|
||||||
user_is_an_organization: "Usuário é uma organização"
|
user_is_an_organization: "Usuário é uma organização"
|
||||||
#members bulk import
|
#members bulk import
|
||||||
members_import:
|
members_import:
|
||||||
import_members: "Import members"
|
import_members: "Importar membros"
|
||||||
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."
|
info: "Você pode enviar um arquivo CSV para criar novos membros ou atualizar os já existentes. Seu arquivo deve utilizar os identificadores abaixo para especificar o grupo, os treinamentos e as tags dos membros."
|
||||||
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."
|
required_fields: "Seu arquivo deve conter, pelo menos, as seguintes informações para cada usuário criar: e-mail, nome, nome e grupo. Se a senha estiver vazia, ela será gerada. Em atualizações, os campos vazios serão mantidos como está."
|
||||||
about_example: "Please refer to the provided example file to generate a correct CSV file. Be careful to use Unicode UTF-8 encoding."
|
about_example: "Por favor, consulte o arquivo de exemplo fornecido para gerar um arquivo CSV correto. Tenha cuidado ao usar a codificação Unicode UTF-8."
|
||||||
groups: "Groups"
|
groups: "Grupos"
|
||||||
group_name: "Group name"
|
group_name: "Nome do grupo"
|
||||||
group_identifier: "Identifier to use"
|
group_identifier: "Identificador a ser usado"
|
||||||
trainings: "Trainings"
|
trainings: "Treinamentos"
|
||||||
training_name: "Training name"
|
training_name: "Nome do treinamento"
|
||||||
training_identifier: "Identifier to use"
|
training_identifier: "Identificador a ser usado"
|
||||||
plans: "Plans"
|
plans: "Planos"
|
||||||
plan_name: "Plan name"
|
plan_name: "Nome do plano"
|
||||||
plan_identifier: "Identifier to use"
|
plan_identifier: "Identificador a ser usado"
|
||||||
tags: "Tags"
|
tags: "Etiquetas"
|
||||||
tag_name: "Tag name"
|
tag_name: "Nome da Tag"
|
||||||
tag_identifier: "Identifier to use"
|
tag_identifier: "Identificador a ser usado"
|
||||||
download_example: "Example file"
|
download_example: "Arquivo exemplo"
|
||||||
select_file: "Choose a file"
|
select_file: "Escolha um arquivo"
|
||||||
import: "Import"
|
import: "Importar"
|
||||||
update_field: "Reference field for users to update"
|
update_field: "Campo de referência para os usuários atualizarem"
|
||||||
update_on_id: "ID"
|
update_on_id: "ID"
|
||||||
update_on_username: "Username"
|
update_on_username: "Nome de Usuário"
|
||||||
update_on_email: "Email address"
|
update_on_email: "Endereço de e-mail"
|
||||||
#import results
|
#import results
|
||||||
members_import_result:
|
members_import_result:
|
||||||
import_results: "Import results"
|
import_results: "Importar resultados"
|
||||||
import_details: "Import # {ID}, of {DATE}, initiated by {USER}"
|
import_details: "Importação # {ID}, de {DATE}, iniciada por {USER}"
|
||||||
results: "Results"
|
results: "Resultados"
|
||||||
pending: "Pending..."
|
pending: "Pendente..."
|
||||||
status_create: "Creating a new user"
|
status_create: "Criando um novo usuário"
|
||||||
status_update: "Updating user {ID}"
|
status_update: "Atualizando usuário {ID}"
|
||||||
success: "Success"
|
success: "Sucesso"
|
||||||
failed: "Failed"
|
failed: "Falhou"
|
||||||
error_details: "Error's details:"
|
error_details: "Detalhes do erro:"
|
||||||
#edit a member
|
#edit a member
|
||||||
members_edit:
|
members_edit:
|
||||||
change_role: "Change role"
|
change_role: "Alterar cargo"
|
||||||
warning_role_change: "<p><strong>Warning:</strong> changing the role of a user is not a harmless operation. Is not currently possible to dismiss a user to a lower privileged role.</p><ul><li><strong>Members</strong> can only book reservations for themselves, paying by card or wallet.</li><li><strong>Managers</strong> can book reservations for themselves, paying by card or wallet, and for other members and managers, by collecting payments at the checkout.</li><li><strong>Administrators</strong> can only book reservations for members and managers, by collecting payments at the checkout. Moreover, they can change every settings of the application.</li></ul>"
|
warning_role_change: "<p><strong>Aviso:</strong> alterar a função de um usuário não é uma operação inofensiva. Atualmente não é possível descartar um usuário para um papel mais baixo.</p><ul><li><strong>membros</strong> só podem reservar reservas para si próprios, pagando com cartão ou carteira.</li><li><strong>Gerentes</strong> pode reservar reservas para si mesmos pagando com cartão ou carteira, e por outros membros e gerentes, coletando pagamentos no checkout.</li><li><strong>Administradores</strong> só podem reservar reservas para membros e gerentes, coletando pagamentos no pagamento. Além disso, podem alterar cada configuração da aplicação.</li></ul>"
|
||||||
admin: "Administrator"
|
admin: "Administrador"
|
||||||
manager: "Manager"
|
manager: "Gestor"
|
||||||
member: "Member"
|
member: "Membro"
|
||||||
role_changed: "Role successfully changed from {OLD} to {NEW}."
|
role_changed: "Função alterada com sucesso de {OLD} para {NEW}."
|
||||||
error_while_changing_role: "An error occurred while changing the role. Please try again later."
|
error_while_changing_role: "Ocorreu um erro ao alterar a função. Por favor, tente novamente mais tarde."
|
||||||
subscription: "Subscription"
|
subscription: "Assinatura"
|
||||||
duration: "Duração:"
|
duration: "Duração:"
|
||||||
expires_at: "Experia em:"
|
expires_at: "Experia em:"
|
||||||
price_: "Preço:"
|
price_: "Preço:"
|
||||||
@ -788,8 +788,8 @@ pt:
|
|||||||
extend_subscription: "Estender inscrição"
|
extend_subscription: "Estender inscrição"
|
||||||
user_has_no_current_subscription: "O usuário não possui inscrição."
|
user_has_no_current_subscription: "O usuário não possui inscrição."
|
||||||
subscribe_to_a_plan: "Plano de inscrição"
|
subscribe_to_a_plan: "Plano de inscrição"
|
||||||
trainings: "Trainings"
|
trainings: "Treinamentos"
|
||||||
no_trainings: "No trainings"
|
no_trainings: "Sem treinamentos"
|
||||||
next_trainings: "Próximos treinamentos"
|
next_trainings: "Próximos treinamentos"
|
||||||
passed_trainings: "Treinamentos anteriores"
|
passed_trainings: "Treinamentos anteriores"
|
||||||
validated_trainings: "Treinamentos validados"
|
validated_trainings: "Treinamentos validados"
|
||||||
@ -799,14 +799,14 @@ pt:
|
|||||||
NUMBER_full_price_tickets_reserved: "{NUMBER, plural, =0{} one{1 ticket com preço total reservado} other{{NUMBER} tickets com preço total reservados}}"
|
NUMBER_full_price_tickets_reserved: "{NUMBER, plural, =0{} one{1 ticket com preço total reservado} other{{NUMBER} tickets com preço total reservados}}"
|
||||||
NUMBER_NAME_tickets_reserved: "{NUMBER, plural, =0{} one{1 {NAME} ticket reservado} other{{NUMBER} {NAME} tickets reservados}}"
|
NUMBER_NAME_tickets_reserved: "{NUMBER, plural, =0{} one{1 {NAME} ticket reservado} other{{NUMBER} {NAME} tickets reservados}}"
|
||||||
passed_events: "Eventos anteriores"
|
passed_events: "Eventos anteriores"
|
||||||
no_passed_events: "No passed events"
|
no_passed_events: "Sem eventos"
|
||||||
invoices: "Faturas"
|
invoices: "Faturas"
|
||||||
invoice_num: "Faturas #"
|
invoice_num: "Faturas #"
|
||||||
date: "Date"
|
date: "Data"
|
||||||
price: "Price"
|
price: "Preço"
|
||||||
download_the_invoice: "Download the invoice"
|
download_the_invoice: "Baixar a fatura"
|
||||||
download_the_refund_invoice: "Baixar fatura de reembolso"
|
download_the_refund_invoice: "Baixar fatura de reembolso"
|
||||||
no_invoices_for_now: "No invoices for now."
|
no_invoices_for_now: "Nenhuma fatura."
|
||||||
expiration_date: "Data de expiração"
|
expiration_date: "Data de expiração"
|
||||||
you_intentionally_decide_to_extend_the_user_s_subscription_by_offering_him_free_days: "Você intencionalmente decidir estender a inscrição do usuário, oferecendo-lhe dias livres."
|
you_intentionally_decide_to_extend_the_user_s_subscription_by_offering_him_free_days: "Você intencionalmente decidir estender a inscrição do usuário, oferecendo-lhe dias livres."
|
||||||
credits_will_remain_unchanged: "O saldo de créditos gratuitos (treinamento / máquinas / espaços) do usuário permanecerá inalterado."
|
credits_will_remain_unchanged: "O saldo de créditos gratuitos (treinamento / máquinas / espaços) do usuário permanecerá inalterado."
|
||||||
@ -819,49 +819,49 @@ pt:
|
|||||||
you_are_about_to_purchase_a_subscription_to_NAME: "Você está prestes a comprar uma assinatura para {NAME}."
|
you_are_about_to_purchase_a_subscription_to_NAME: "Você está prestes a comprar uma assinatura para {NAME}."
|
||||||
subscription_successfully_purchased: "Assinatura adquirida com êxito."
|
subscription_successfully_purchased: "Assinatura adquirida com êxito."
|
||||||
a_problem_occurred_while_taking_the_subscription: "Ocorreu um problema ao fazer a assinatura"
|
a_problem_occurred_while_taking_the_subscription: "Ocorreu um problema ao fazer a assinatura"
|
||||||
wallet: "Wallet"
|
wallet: "Carteira"
|
||||||
to_credit: 'Credit'
|
to_credit: 'Crédito'
|
||||||
cannot_credit_own_wallet: "You cannot credit your own wallet. Please ask another manager or an administrator to credit your wallet."
|
cannot_credit_own_wallet: "Você não pode creditar sua própria carteira. Por favor, peça a outro gerente ou a um administrador para creditar sua carteira."
|
||||||
cannot_extend_own_subscription: "You cannot extend your own subscription. Please ask another manager or an administrator to extend your subscription."
|
cannot_extend_own_subscription: "Você não pode estender sua própria assinatura. Por favor, peça a outro gerente ou administrador para estender sua assinatura."
|
||||||
#add a new administrator to the platform
|
#add a new administrator to the platform
|
||||||
admins_new:
|
admins_new:
|
||||||
add_an_administrator: "Adicionar administrador"
|
add_an_administrator: "Adicionar administrador"
|
||||||
administrator_successfully_created_he_will_receive_his_connection_directives_by_email: "Administrator criado com sucesso. {GENDER, select, female{Ela} other{Ele}} receberá {GENDER, select, female{sua} other{seu}} diretivas de conexão por e-mail."
|
administrator_successfully_created_he_will_receive_his_connection_directives_by_email: "Administrator criado com sucesso. {GENDER, select, female{Ela} other{Ele}} receberá {GENDER, select, female{sua} other{seu}} diretivas de conexão por e-mail."
|
||||||
failed_to_create_admin: "Não é possível criar administrador:"
|
failed_to_create_admin: "Não é possível criar administrador:"
|
||||||
man: "Man"
|
man: "Homem"
|
||||||
woman: "Woman"
|
woman: "Mulher"
|
||||||
pseudonym: "Pseudonym"
|
pseudonym: "Apelido"
|
||||||
pseudonym_is_required: "Pseudonym is required."
|
pseudonym_is_required: "Apelido é obrigatório."
|
||||||
first_name: "First name"
|
first_name: "Primeiro nome"
|
||||||
first_name_is_required: "First name is required."
|
first_name_is_required: "Primeiro nome é obrigatório."
|
||||||
surname: "Last name"
|
surname: "Sobrenome"
|
||||||
surname_is_required: "Last name is required."
|
surname_is_required: "Sobrenome é obrigatório."
|
||||||
email_address: "Email address"
|
email_address: "Email"
|
||||||
email_is_required: "Email address is required."
|
email_is_required: "Email é obrigatório."
|
||||||
birth_date: "Date of birth"
|
birth_date: "Data de nascimento"
|
||||||
address: "Address"
|
address: "Endereço"
|
||||||
phone_number: "Phone number"
|
phone_number: "Número de telefone"
|
||||||
#add a new manager to the platform
|
#add a new manager to the platform
|
||||||
manager_new:
|
manager_new:
|
||||||
add_a_manager: "Add a manager"
|
add_a_manager: "Adicionar Gestor"
|
||||||
manager_successfully_created: "Manager successfully created. {GENDER, select, female{She} other{He}} receive {GENDER, select, female{her} other{his}} connection directives by e-mail."
|
manager_successfully_created: "Gerente criado com sucesso. {GENDER, select, female{Ela} other{Ele}} receberá {GENDER, select, female{Suas diretrizes de conexão por e-mail} other{Suas diretrizes de conexão por e-mail}}"
|
||||||
failed_to_create_manager: "Unable to create the manager:"
|
failed_to_create_manager: "Não foi possível criar o gerente:"
|
||||||
man: "Man"
|
man: "Homem"
|
||||||
woman: "Woman"
|
woman: "Mulher"
|
||||||
pseudonym: "Pseudonym"
|
pseudonym: "Apelido"
|
||||||
pseudonym_is_required: "Pseudonym is required."
|
pseudonym_is_required: "Apelido é obrigatório."
|
||||||
first_name: "First name"
|
first_name: "Primeiro nome"
|
||||||
first_name_is_required: "First name is required."
|
first_name_is_required: "Primeiro nome é obrigatório."
|
||||||
surname: "Last name"
|
surname: "Sobrenome"
|
||||||
surname_is_required: "Last name is required."
|
surname_is_required: "Sobrenome é obrigatório."
|
||||||
email_address: "Email address"
|
email_address: "Endereço de e-mail"
|
||||||
email_is_required: "Email address is required."
|
email_is_required: "Email é obrigatório."
|
||||||
birth_date: "Date of birth"
|
birth_date: "Data de nascimento"
|
||||||
address: "Address"
|
address: "Endereço"
|
||||||
phone_number: "Phone number"
|
phone_number: "Número de telefone"
|
||||||
#add a new authentication provider (SSO)
|
#add a new authentication provider (SSO)
|
||||||
authentication_new:
|
authentication_new:
|
||||||
local_database: "Local Database"
|
local_database: "Database local"
|
||||||
o_auth2: "OAuth 2.0"
|
o_auth2: "OAuth 2.0"
|
||||||
add_a_new_authentication_provider: "Adicionar novo provedor de autenticação"
|
add_a_new_authentication_provider: "Adicionar novo provedor de autenticação"
|
||||||
a_local_database_provider_already_exists_unable_to_create_another: "Um provedor \"Local Database\" já existe. Não foi possível criar outro."
|
a_local_database_provider_already_exists_unable_to_create_another: "Um provedor \"Local Database\" já existe. Não foi possível criar outro."
|
||||||
@ -877,11 +877,11 @@ pt:
|
|||||||
authentication_edit:
|
authentication_edit:
|
||||||
provider: "Provedor :"
|
provider: "Provedor :"
|
||||||
it_is_required_to_set_the_matching_between_User.uid_and_the_API_to_add_this_provider: "É necessário definir a correspondência entre User.uid ea API para adicionar este fornecedor."
|
it_is_required_to_set_the_matching_between_User.uid_and_the_API_to_add_this_provider: "É necessário definir a correspondência entre User.uid ea API para adicionar este fornecedor."
|
||||||
provider_successfully_updated: "Provider successfully updated."
|
provider_successfully_updated: "Provedor modificado com sucesso."
|
||||||
an_error_occurred_unable_to_update_the_provider: "Um erro ocorreu: não é possível atualizar provedor."
|
an_error_occurred_unable_to_update_the_provider: "Um erro ocorreu: não é possível atualizar provedor."
|
||||||
#statistics tables
|
#statistics tables
|
||||||
statistics:
|
statistics:
|
||||||
statistics: "Statistics"
|
statistics: "Estatísticas"
|
||||||
evolution: "Evolução"
|
evolution: "Evolução"
|
||||||
age_filter: "Filtro de idade"
|
age_filter: "Filtro de idade"
|
||||||
from_age: "Dos" #eg. from 8 to 40 years old
|
from_age: "Dos" #eg. from 8 to 40 years old
|
||||||
@ -893,8 +893,8 @@ pt:
|
|||||||
criterion: "Critério:"
|
criterion: "Critério:"
|
||||||
value: "Valor:"
|
value: "Valor:"
|
||||||
exclude: "Excluir"
|
exclude: "Excluir"
|
||||||
from_date: "From" #eg: from 01/01 to 01/05
|
from_date: "De" #eg: from 01/01 to 01/05
|
||||||
to_date: "to" #eg: from 01/01 to 01/05
|
to_date: "até" #eg: from 01/01 to 01/05
|
||||||
entries: "Entradas:"
|
entries: "Entradas:"
|
||||||
revenue_: "Receita:"
|
revenue_: "Receita:"
|
||||||
average_age: "Idade média:"
|
average_age: "Idade média:"
|
||||||
@ -902,11 +902,11 @@ pt:
|
|||||||
total: "Total"
|
total: "Total"
|
||||||
available_hours: "Horas disponíveis para reserva:"
|
available_hours: "Horas disponíveis para reserva:"
|
||||||
available_tickets: "Vagas disponíveis para reserva:"
|
available_tickets: "Vagas disponíveis para reserva:"
|
||||||
date: "Date"
|
date: "Data"
|
||||||
user: "User"
|
user: "Usuário"
|
||||||
gender: "Gênero"
|
gender: "Gênero"
|
||||||
age: "Ano"
|
age: "Ano"
|
||||||
type: "Type"
|
type: "Tipo"
|
||||||
revenue: "Receita"
|
revenue: "Receita"
|
||||||
unknown: "Desconhecido"
|
unknown: "Desconhecido"
|
||||||
user_id: "ID do usuário"
|
user_id: "ID do usuário"
|
||||||
@ -915,31 +915,31 @@ pt:
|
|||||||
export_all_statistics: "Exportar todas estatísticas"
|
export_all_statistics: "Exportar todas estatísticas"
|
||||||
export_the_current_search_results: "Exportar resultados encontrados"
|
export_the_current_search_results: "Exportar resultados encontrados"
|
||||||
export: "Exportar"
|
export: "Exportar"
|
||||||
deleted_user: "Deleted user"
|
deleted_user: "Usuário deletado"
|
||||||
man: "Man"
|
man: "Homem"
|
||||||
woman: "Woman"
|
woman: "Mulher"
|
||||||
export_is_running_you_ll_be_notified_when_its_ready: "Export is running. You'll be notified when it's ready."
|
export_is_running_you_ll_be_notified_when_its_ready: "A exportação está em execução. Você será notificado quando estiver pronto."
|
||||||
create_plans_to_start: "Start by creating new subscription plans."
|
create_plans_to_start: "Comece criando novos planos de assinatura."
|
||||||
click_here: "Click here to create your first one."
|
click_here: "Clique aqui para criar o seu primeiro."
|
||||||
#statistics graphs
|
#statistics graphs
|
||||||
stats_graphs:
|
stats_graphs:
|
||||||
statistics: "Statistics"
|
statistics: "Estatísticas"
|
||||||
data: "Dado"
|
data: "Dado"
|
||||||
day: "Dia"
|
day: "Dia"
|
||||||
week: "Semana"
|
week: "Semana"
|
||||||
from_date: "From" #eg: from 01/01 to 01/05
|
from_date: "De" #eg: from 01/01 to 01/05
|
||||||
to_date: "to" #eg: from 01/01 to 01/05
|
to_date: "até" #eg: from 01/01 to 01/05
|
||||||
month: "Month"
|
month: "Mês"
|
||||||
start: "Início:"
|
start: "Início:"
|
||||||
end: "Fim:"
|
end: "Fim:"
|
||||||
type: "Type"
|
type: "Tipo"
|
||||||
revenue: "Receita"
|
revenue: "Receita"
|
||||||
top_list_of: "Topo da lista de"
|
top_list_of: "Topo da lista de"
|
||||||
number: "Número"
|
number: "Número"
|
||||||
week_short: "Semana"
|
week_short: "Semana"
|
||||||
week_of_START_to_END: "Semana de {START} á {END}"
|
week_of_START_to_END: "Semana de {START} á {END}"
|
||||||
no_data_for_this_period: "Nenhum dado para este período"
|
no_data_for_this_period: "Nenhum dado para este período"
|
||||||
date: "Date"
|
date: "Data"
|
||||||
#global application parameters and customization
|
#global application parameters and customization
|
||||||
settings:
|
settings:
|
||||||
customize_the_application: "Customizar a aplicação"
|
customize_the_application: "Customizar a aplicação"
|
||||||
@ -976,11 +976,11 @@ pt:
|
|||||||
news_of_the_home_page: "Notícias da página inicial:"
|
news_of_the_home_page: "Notícias da página inicial:"
|
||||||
type_your_news_here: "Escreva aqui suas notícias"
|
type_your_news_here: "Escreva aqui suas notícias"
|
||||||
leave_it_empty_to_not_bring_up_any_news_on_the_home_page: "Deixe vazio para não abrir nenhuma notícia na home page"
|
leave_it_empty_to_not_bring_up_any_news_on_the_home_page: "Deixe vazio para não abrir nenhuma notícia na home page"
|
||||||
twitter_stream: "Twitter Stream:"
|
twitter_stream: "Transmissão do Twitter:"
|
||||||
name_of_the_twitter_account: "Nome da conta do Twitter"
|
name_of_the_twitter_account: "Nome da conta do Twitter"
|
||||||
link: "Link"
|
link: "Link"
|
||||||
link_to_about: 'Link title to the "About" page'
|
link_to_about: 'Link do título para a página "Sobre"'
|
||||||
content: "Content"
|
content: "Conteúdo"
|
||||||
title_of_the_about_page: "Título da página sobre"
|
title_of_the_about_page: "Título da página sobre"
|
||||||
shift_enter_to_force_carriage_return: "SHIFT + ENTER para forçar o retorno"
|
shift_enter_to_force_carriage_return: "SHIFT + ENTER para forçar o retorno"
|
||||||
input_the_main_content: "Introduza o conteúdo principal"
|
input_the_main_content: "Introduza o conteúdo principal"
|
||||||
@ -1014,28 +1014,28 @@ pt:
|
|||||||
space_explications_alert: "mensagem de explicação na página de reserva de espaço"
|
space_explications_alert: "mensagem de explicação na página de reserva de espaço"
|
||||||
main_color: "Cor principal"
|
main_color: "Cor principal"
|
||||||
secondary_color: "Cor secundária"
|
secondary_color: "Cor secundária"
|
||||||
customize_home_page: "Customize home page"
|
customize_home_page: "Personalizar página inicial"
|
||||||
reset_home_page: "Reset the home page to its initial state"
|
reset_home_page: "Redefinir a página inicial para seu estado inicial"
|
||||||
confirmation_required: "Confirmation required"
|
confirmation_required: "Confirmação obrigatória"
|
||||||
confirm_reset_home_page: "Do you really want to reset the home page to its factory value?"
|
confirm_reset_home_page: "Você realmente quer redefinir a página inicial para o seu valor de fábrica?"
|
||||||
home_items: "Home page items"
|
home_items: "Itens da página inicial"
|
||||||
item_news: "News"
|
item_news: "Notícias"
|
||||||
item_projects: "Last projects"
|
item_projects: "Últimos projetos"
|
||||||
item_twitter: "Last tweet"
|
item_twitter: "Último tweet"
|
||||||
item_members: "Last members"
|
item_members: "Últimos membros"
|
||||||
item_events: "Next events"
|
item_events: "Próximos eventos"
|
||||||
home_content: "the home page"
|
home_content: "a página inicial"
|
||||||
home_content_reset: "Home page was successfully reset to its initial configuration."
|
home_content_reset: "Página inicial redefinida com sucesso para sua configuração inicial."
|
||||||
home_css: "the stylesheet of the home page"
|
home_css: "a folha de estilos da página inicial"
|
||||||
home_blogpost: "Resumo da página inicial"
|
home_blogpost: "Resumo da página inicial"
|
||||||
twitter_name: "Nome do feed do Twitter"
|
twitter_name: "Nome do feed do Twitter"
|
||||||
link_name: "link title to the \"About\" page"
|
link_name: "link do título para a página \"Sobre\""
|
||||||
about_title: "\"Sobre\" título da página"
|
about_title: "\"Sobre\" título da página"
|
||||||
about_body: "\"Sobre\" conteúdo da página"
|
about_body: "\"Sobre\" conteúdo da página"
|
||||||
about_contacts: "\"Sobre\" página de contatos"
|
about_contacts: "\"Sobre\" página de contatos"
|
||||||
privacy_draft: "privacy policy draft"
|
privacy_draft: "rascunho da política de privacidade"
|
||||||
privacy_body: "política de privacidade"
|
privacy_body: "política de privacidade"
|
||||||
privacy_dpo: "data protection officer address"
|
privacy_dpo: "endereço do oficial de proteção de dados"
|
||||||
booking_window_start: "Horário de abertura"
|
booking_window_start: "Horário de abertura"
|
||||||
booking_window_end: "Horário de fechamento"
|
booking_window_end: "Horário de fechamento"
|
||||||
booking_move_enable: "Mover reserva habilitado"
|
booking_move_enable: "Mover reserva habilitado"
|
||||||
@ -1047,164 +1047,164 @@ pt:
|
|||||||
default_value_is_24_hours: "Se o campo estiver vazio: 24 horas."
|
default_value_is_24_hours: "Se o campo estiver vazio: 24 horas."
|
||||||
visibility_yearly: "visibilidade máxima para assinantes anuais"
|
visibility_yearly: "visibilidade máxima para assinantes anuais"
|
||||||
visibility_others: "visibilidade máxima para outros membros"
|
visibility_others: "visibilidade máxima para outros membros"
|
||||||
display: "Display"
|
display: "Visualização"
|
||||||
display_name_info_html: "When enabled, members and visitors browsing the calendar or booking a machine will see the name of the members who has booked some slots. When disabled, only administrators and managers will view the names.<br/><strong>Warning:</strong> if you enable this feature, remember to write it in your privacy policy."
|
display_name_info_html: "Quando ativado, membros e visitantes navegando no calendário ou reservando uma máquina verão o nome dos membros que reservaram alguns slots. Quando desativado, somente administradores e gerentes exibirão os nomes.<br/><strong>Aviso:</strong> se você ativar este recurso, lembre-se de escrevê-lo na sua política de privacidade."
|
||||||
display_machine_reservation_user_name: "Exibir o nome completo do usuário que reservou um slot de máquina"
|
display_machine_reservation_user_name: "Exibir o nome completo do usuário que reservou um slot de máquina"
|
||||||
display_name: "Nome de exibição"
|
display_name: "Nome de exibição"
|
||||||
display_name_enable: "exibição de nome"
|
display_name_enable: "exibição de nome"
|
||||||
events_in_the_calendar: "Display the events in the calendar"
|
events_in_the_calendar: "Exibir os eventos no calendário"
|
||||||
events_in_calendar_info: "When enabled, the admin calendar will display the scheduled events, as read-only items."
|
events_in_calendar_info: "Quando ativado, o calendário do administrador exibirá os eventos agendados, como itens somente leitura."
|
||||||
show_event: "Show the events"
|
show_event: "Mostrar os eventos"
|
||||||
events_in_calendar: "events display in the calendar"
|
events_in_calendar: "eventos exibidos no calendário"
|
||||||
machines_sort_by: "ordem de exibição das máquinas"
|
machines_sort_by: "ordem de exibição das máquinas"
|
||||||
fab_analytics: "Fab Analytics"
|
fab_analytics: "Fab Analytics"
|
||||||
phone_required: "phone required"
|
phone_required: "telefone é obrigatório"
|
||||||
tracking_id: "tracking ID"
|
tracking_id: "tracking ID"
|
||||||
facebook_app_id: "Facebook App ID"
|
facebook_app_id: "ID de Utilizador do Facebook"
|
||||||
twitter_analytics: "Twitter analytics account"
|
twitter_analytics: "Analisador de conta Twitter"
|
||||||
book_overlapping_slots: "book overlapping slots"
|
book_overlapping_slots: "agendar horários conflitantes"
|
||||||
slot_duration: "slots duration"
|
slot_duration: "duração dos slots"
|
||||||
advanced: "Advanced settings"
|
advanced: "Configurações Avançadas"
|
||||||
customize_home_page_css: "Customise the stylesheet of the home page"
|
customize_home_page_css: "Personalizar a folha de estilos da página inicial"
|
||||||
home_css_notice_html: "You can customize the stylesheet which will apply to the home page, using the <a href=\"https://sass-lang.com/documentation\" target=\"_blank\">SASS</a> syntax. These styles will be automatically subordinated to the <code>.home-page</code> 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."
|
home_css_notice_html: "Você pode personalizar a folha de estilo que será aplicada à página inicial, usando a sintaxe <a href=\"https://sass-lang.com/documentation\" target=\"_blank\">SASS</a>. Estes estilos serão automaticamente subordinados ao <code>. Seletor de ome-page</code> para evitar qualquer risco de quebra do aplicativo. Enquanto isso, por favor, tenha cuidado, qualquer mudança no editor de página inicial no topo da página pode quebrar seus estilos, sempre se refere ao código HTML."
|
||||||
error_SETTING_locked: "Unable to update the setting: {SETTING} is locked. Please contact your system administrator."
|
error_SETTING_locked: "Não foi possível atualizar a configuração: {SETTING} está bloqueado. Por favor contate o administrador do sistema."
|
||||||
an_error_occurred_saving_the_setting: "An error occurred while saving the setting. Please try again later."
|
an_error_occurred_saving_the_setting: "Ocorreu um erro ao salvar a configuração. Por favor, tente novamente mais tarde."
|
||||||
book_overlapping_slots_info: "Allow / prevent the reservation of overlapping slots"
|
book_overlapping_slots_info: "Permitir / impedir a reserva de slots sobrepostos"
|
||||||
allow_booking: "Allow booking"
|
allow_booking: "Permitir reserva"
|
||||||
default_slot_duration: "Default duration for slots"
|
default_slot_duration: "Duração padrão para slots"
|
||||||
duration_minutes: "Duration (in minutes)"
|
duration_minutes: "Duração (em minutos)"
|
||||||
default_slot_duration_info: "Machine and space availabilities are divided in multiple slots of this duration. This value can be overridden per availability."
|
default_slot_duration_info: "Máquina e espaço disponíveis são divididos em vários slots desta duração. Esse valor pode ser substituído por disponibilidade."
|
||||||
modules: "Modules"
|
modules: "Modulos"
|
||||||
spaces: "Spaces"
|
spaces: "Espaços"
|
||||||
spaces_info_html: "<p>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.</p><p><strong>Warning:</strong> It is not recommended to disable spaces if at least one space reservation was made on the system.</p>"
|
spaces_info_html: "<p>Uma sala pode ser, por exemplo, uma floresta ou uma sala de reunião. A sua especificidade é que podem ser reservados por várias pessoas ao mesmo tempo.</p><p><strong>Aviso:</strong> não é recomendado desabilitar espaços se pelo menos uma reserva de espaço for feita no sistema.</p>"
|
||||||
enable_spaces: "Enable the spaces"
|
enable_spaces: "Ativar os espaços"
|
||||||
spaces_module: "spaces module"
|
spaces_module: "módulo de espaços"
|
||||||
plans: "Plans"
|
plans: "Planos"
|
||||||
plans_info_html: "<p>Subscriptions provide a way to segment your prices and provide benefits to regular users.</p><p><strong>Warning:</strong> It is not recommended to disable plans if at least one subscription is active on the system.</p>"
|
plans_info_html: "<p>As assinaturas fornecem uma maneira de segmentar seus preços e proporcionar benefícios aos usuários normais.</p><p><strong>Aviso:</strong> não é recomendável desativar os planos se pelo menos uma assinatura estiver ativa no sistema.</p>"
|
||||||
enable_plans: "Enable the plans"
|
enable_plans: "Ativar os planos"
|
||||||
plans_module: "plans module"
|
plans_module: "módulo de planos"
|
||||||
invoicing: "Invoicing"
|
invoicing: "Faturamento"
|
||||||
invoicing_info_html: "<p>You can fully disable the invoicing module.</p><p>This is useful if you have your own invoicing system, and you don't want Fab-manager generates and sends invoices to the members.</p><p><strong>Warning:</strong> 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.</p>"
|
invoicing_info_html: "<p>Você pode desativar completamente o módulo de faturamento.</p><p>Isso é útil se você tiver o seu próprio sistema de faturação, e não quer que o Fab-manager gere e envie faturas para os membros.</p><p><strong>Aviso:</strong> mesmo se você desativar o módulo de faturação, você deve configurar o IVA para evitar erros na contabilidade e nos preços. Faça isso na seção « Faturas > Configurações de faturação ».</p>"
|
||||||
enable_invoicing: "Enable invoicing"
|
enable_invoicing: "Habilitar faturamento"
|
||||||
invoicing_module: "invoicing module"
|
invoicing_module: "módulo de faturamento"
|
||||||
account_creation: "Account creation"
|
account_creation: "Criação de conta"
|
||||||
phone: "Phone"
|
phone: "Telefone"
|
||||||
phone_is_required: "Phone required"
|
phone_is_required: "Telefone é obrigatório"
|
||||||
phone_required_info: "You can define if the phone number should be required to register a new user on Fab-manager."
|
phone_required_info: "Você pode definir se o número de telefone deve ser exigido para registrar um novo usuário no Fab-manager."
|
||||||
captcha: "Captcha"
|
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 <a href='http://www.google.com/recaptcha/admin' target='_blank'>an API key pair</a> to start using the captcha."
|
captcha_info_html: "Você pode configurar uma proteção contra robôs, para evitar que eles criem contas de membros. Esta proteção está usando o Google reCAPTCHA. Inscreva-se para <a href='http://www.google.com/recaptcha/admin' target='_blank'>um par de chaves de API</a> para começar a usar o captcha."
|
||||||
site_key: "Site key"
|
site_key: "Chave do site"
|
||||||
secret_key: "Secret key"
|
secret_key: "Chave secreta"
|
||||||
recaptcha_site_key: "reCAPTCHA Site Key"
|
recaptcha_site_key: "chave do site reCAPTCHA"
|
||||||
recaptcha_secret_key: "reCAPTCHA Secret Key"
|
recaptcha_secret_key: "chave secreta reCAPTCHA"
|
||||||
feature_tour_display: "feature tour display"
|
feature_tour_display: "exibir tour de recursos"
|
||||||
email_from: "expeditor's address"
|
email_from: "endereço do expedidor"
|
||||||
disqus_shortname: "Disqus shortname"
|
disqus_shortname: "Atalho Disqus"
|
||||||
COUNT_items_removed: "{COUNT, plural, =1{One item} other{{COUNT} items}} removed"
|
COUNT_items_removed: "{COUNT, plural, one {} =1{Um item} other{{COUNT} itens}} removeu"
|
||||||
item_added: "One item added"
|
item_added: "1 artigo adicionado"
|
||||||
openlab_app_id: "OpenLab ID"
|
openlab_app_id: "ID OpenLab"
|
||||||
openlab_app_secret: "OpenLab secret"
|
openlab_app_secret: "Senha OpenLab"
|
||||||
openlab_default: "default gallery view"
|
openlab_default: "visualização padrão da galeria"
|
||||||
online_payment_module: "online payment module"
|
online_payment_module: "módulo de pagamento online"
|
||||||
stripe_currency: "Stripe currency"
|
stripe_currency: "Moeda do Stripe"
|
||||||
account_confirmation: "Account confirmation"
|
account_confirmation: "Confirmação da Conta"
|
||||||
confirmation_required_info: "Optionally, you can force the users to confirm their email address before being able to access Fab-manager."
|
confirmation_required_info: "Opcionalmente, você pode forçar os usuários a confirmar o endereço de e-mail deles antes de poder acessar o Fab-manager."
|
||||||
confirmation_is_required: "Confirmation required"
|
confirmation_is_required: "Confirmação obrigatória"
|
||||||
wallet_module: "wallet module"
|
wallet_module: "módulo de carteira"
|
||||||
statistics_module: "statistics module"
|
statistics_module: "módulo de estatísticas"
|
||||||
upcoming_events_shown: "display limit for upcoming events"
|
upcoming_events_shown: "exibir limite para eventos futuros"
|
||||||
general:
|
general:
|
||||||
general: "General"
|
general: "Geral"
|
||||||
title: "Title"
|
title: "Título"
|
||||||
fablab_title: "FabLab title"
|
fablab_title: "Título do FabLab"
|
||||||
title_concordance: "Title concordance"
|
title_concordance: "Concordância do título"
|
||||||
male: "Male."
|
male: "Masculino."
|
||||||
female: "Female."
|
female: "Feminino."
|
||||||
neutral: "Neutral."
|
neutral: "Neutro."
|
||||||
eg: "eg:"
|
eg: "ex:"
|
||||||
the_team: "The team of"
|
the_team: "A equipe"
|
||||||
male_preposition: "the"
|
male_preposition: "o"
|
||||||
female_preposition: "the"
|
female_preposition: "a"
|
||||||
neutral_preposition: ""
|
neutral_preposition: ""
|
||||||
elements_ordering: "Elements ordering"
|
elements_ordering: "Ordenação de elementos"
|
||||||
machines_order: "Machines order"
|
machines_order: "Ordem das máquinas"
|
||||||
display_machines_sorted_by: "Display machines sorted by"
|
display_machines_sorted_by: "Exibir máquinas ordenadas por"
|
||||||
sort_by:
|
sort_by:
|
||||||
default: "Default"
|
default: "Padrão"
|
||||||
name: "Name"
|
name: "Nome"
|
||||||
created_at: "Creation date"
|
created_at: "Data de criação"
|
||||||
updated_at: "Last update date"
|
updated_at: "Última Data de Atualização"
|
||||||
help: "Help"
|
help: "Ajuda"
|
||||||
feature_tour: "Feature tour"
|
feature_tour: "Tour de recursos"
|
||||||
feature_tour_info_html: "<p>When an administrator or a manager in logged-in, a feature tour will be triggered the first time he/she visits each section of the application. You can change this behavior to one of the following values:</p><ul><li>« Once » to keep the default behavior.</li><li>« By session » to display the tours each time you reopen the application.</li><li>« Manual trigger » to prevent displaying the tours automatically. It'll still be possible to trigger them by pressing the F1 key or by clicking on « Help » in the user's menu.</li></ul>"
|
feature_tour_info_html: "<p>Quando um administrador ou um gerente está logado, um tour de recurso será acionado na primeira vez que ele/ela visita cada seção do aplicativo. Você pode mudar esse comportamento para um dos seguintes valores:</p><ul><li>« Uma vez » para manter o comportamento padrão.</li><li>« Por sessão » para exibir os tours cada vez que você reabrir o aplicativo.</li><li>« Ativação manual » para evitar a exibição automática dos tours. Ainda será possível ativá-los pressionando a tecla F1 ou clicando em « Ajuda » no menu do usuário.</li></ul>"
|
||||||
feature_tour_display_mode: "Feature tour display mode"
|
feature_tour_display_mode: "Modo de exibição de recursos do tour"
|
||||||
display_mode:
|
display_mode:
|
||||||
once: "Once"
|
once: "Uma vez"
|
||||||
session: "By session"
|
session: "Por sessão"
|
||||||
manual: "Manual trigger"
|
manual: "Gatilho manual"
|
||||||
notifications: "Notifications"
|
notifications: "Nofificações"
|
||||||
email: "Email"
|
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_info: "O endereço de e-mail do qual as notificações serão enviadas. Você pode usar um endereço não existente (como noreply@..) ou um endereço existente se você quiser permitir que seus membros respondam às notificações que receberão."
|
||||||
email_from: "Expeditor's address"
|
email_from: "Endereço do expeditor"
|
||||||
wallet: "Wallet"
|
wallet: "Carteira"
|
||||||
wallet_info_html: "<p>The virtual wallet allows you to allocate a sum of money to users. Then, can spend this money as they wish, in Fab-manager.</p><p>Members cannot credit their wallet themselves, it's a privilege of managers and administrators.</p>"
|
wallet_info_html: "<p>A carteira virtual permite alocar uma soma de dinheiro aos usuários. Em seguida, pode gastar esse dinheiro como quiserem, no Fab-manager.</p><p>Membros não podem creditar suas carteiras, é um privilégio de gerentes e administradores.</p>"
|
||||||
enable_wallet: "Enable wallet"
|
enable_wallet: "Habilitar Carteira"
|
||||||
statistics: "Statistics"
|
statistics: "Estatísticas"
|
||||||
statistics_info_html: "<p>Enable or disable the statistics module.</p><p>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.</p>"
|
statistics_info_html: "<p>Ativar ou desativar módulo de estatísticas.</p><p>Se ativado, todas as noites, os dados do dia que acabou de ser passado serão consolidados na base de dados de um poderoso motor de análise. Então, todos os administradores poderão navegar em gráficos estatísticos e tabelas na seção correspondente.</p>"
|
||||||
enable_statistics: "Enable statistics"
|
enable_statistics: "Habilitar estatísticas"
|
||||||
home:
|
home:
|
||||||
show_upcoming_events: "Show upcoming events"
|
show_upcoming_events: "Mostrar próximos eventos"
|
||||||
upcoming_events:
|
upcoming_events:
|
||||||
until_start: "Until they start"
|
until_start: "Até que eles comecem"
|
||||||
2h_before_end: "Until 2 hours before they end"
|
2h_before_end: "Até 2 horas antes de terminar"
|
||||||
until_end: "Until they end"
|
until_end: "Até que terminem"
|
||||||
privacy:
|
privacy:
|
||||||
title: "Privacidade"
|
title: "Privacidade"
|
||||||
privacy_policy: "Política de privacidade"
|
privacy_policy: "Política de privacidade"
|
||||||
input_the_dpo: "Data Protection Officer"
|
input_the_dpo: "Oficial de Proteção de Dados"
|
||||||
current_policy: "Current policy"
|
current_policy: "Política atual"
|
||||||
draft_from_USER_DATE: "Draft, saved by {USER}, on {DATE}"
|
draft_from_USER_DATE: "Rascunho, salvo por {USER}, em {DATE}"
|
||||||
save_or_publish: "Save or publish?"
|
save_or_publish: "Salvar ou publicar?"
|
||||||
save_or_publish_body: "Do you want to publish a new version of the privacy policy or save it as a draft?"
|
save_or_publish_body: "Deseja publicar uma nova versão da política de privacidade ou salvá-la como rascunho?"
|
||||||
publish_will_notify: "Publish a new version will send a notification to every users."
|
publish_will_notify: "Publicar uma nova versão enviará uma notificação a todos os usuários."
|
||||||
publish: "Publish"
|
publish: "Publicar"
|
||||||
users_notified: "Platform users will be notified of the update."
|
users_notified: "Os usuários da plataforma serão notificados da atualização."
|
||||||
about_analytics: "I agree to share anonymous data with the development team to help improve Fab-manager."
|
about_analytics: "Concordo em compartilhar dados anônimos com a equipe de desenvolvimento para ajudar a melhorar o Fab-manager."
|
||||||
read_more: "Which data do we collect?"
|
read_more: "Quais dados nós coletamos?"
|
||||||
statistics: "Statistics"
|
statistics: "Estatísticas"
|
||||||
google_analytics: "Google Analytics"
|
google_analytics: "Google Analytics"
|
||||||
facebook: "Facebook"
|
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 <a href='https://developers.facebook.com/docs/apps#register' target='_blank'>this guide</a> to get one."
|
facebook_info_html: "Para habilitar o rastreamento estatístico dos compartilhamentos na rede social do Facebook, defina seu App ID aqui. Consulte <a href='https://developers.facebook.com/docs/apps#register' target='_blank'>este guia</a> para obter um."
|
||||||
app_id: "App ID"
|
app_id: "ID da Aplicação"
|
||||||
twitter: "Twitter"
|
twitter: "Twitter"
|
||||||
twitter_info_html: "To enable the statistical tracking of the shares on the Twitter social network, <a href='https://analytics.twitter.com/' target='_blank'>Twitter analytics</a>, set the name of your Twitter account here."
|
twitter_info_html: "Para habilitar o rastreamento estatístico das ações na rede social do Twitter. <a href='https://analytics.twitter.com/' target='_blank'>Análise de Twitter</a>, defina o nome da sua conta do Twitter aqui."
|
||||||
twitter_analytics: "Twitter account"
|
twitter_analytics: "Conta do Twitter"
|
||||||
analytics:
|
analytics:
|
||||||
title: "Application improvement"
|
title: "Melhoria do Aplicativo"
|
||||||
intro_analytics_html: "You'll find below a detailed view of all the data, Fab-manager will collect <strong>if permission is granted.</strong>"
|
intro_analytics_html: "Você encontrará abaixo uma visão detalhada de todos os dados, o Fab-manager coletará <strong>se a permissão for concedida.</strong>"
|
||||||
version: "Application version"
|
version: "Versão do aplicativo"
|
||||||
members: "Number of members"
|
members: "Número de membros"
|
||||||
admins: "Number of administrators"
|
admins: "Número de administradores"
|
||||||
availabilities: "Number of availabilities of the last 7 days"
|
availabilities: "Número de disponibilidades dos últimos 7 dias"
|
||||||
reservations: "Number of reservations during the last 7 days"
|
reservations: "Número de reservas nos últimos 7 dias"
|
||||||
plans: "Is the subscription module active?"
|
plans: "O módulo de assinatura está ativo?"
|
||||||
spaces: "Is the space management module active?"
|
spaces: "O módulo de gerenciamento de espaço está ativo?"
|
||||||
online_payment: "Is the online payment module active?"
|
online_payment: "O módulo de pagamento online está ativo?"
|
||||||
invoices: "Is the invoicing module active?"
|
invoices: "O módulo de faturação está ativo?"
|
||||||
openlab: "Is the project sharing module (OpenLab) active?"
|
openlab: "O módulo de compartilhamento de projetos (OpenLab) está ativo?"
|
||||||
tracking_id_info_html: "<p>To enable the statistical tracking of the visits using Google Analytics, set your tracking ID here. It is in the form UA-000000-2. Visit <a href='https://analytics.google.com/analytics/web/' target='_blank'>the Google Analytics website</a> to get one.<br/><strong>Warning:</strong> if you enable this feature, remember to write it in your privacy policy, above.</p><p>The host name is also required to use Google Analytics. You can get it by clicking on the adjacent button. This last parameter is used elsewhere, please set it carefully.</p>"
|
tracking_id_info_html: "<p>Para ativar o rastreamento estatístico das visitas usando o Google Analytics, defina seu ID de rastreamento aqui. Está na forma de UA-000000-2. Visite <a href='https://analytics.google.com/analytics/web/' target='_blank'>o site do Google Analytics</a> para obter um.<br/><strong>Aviso:</strong> se você ativar este recurso, lembre-se de escrevê-lo na sua política de privacidade.</p><p>O nome do host também é necessário para usar o Google Analytics. Você pode obtê-lo clicando no botão adjacente. Este último parâmetro é usado em outro lugar, por favor, defina-o com cuidado.</p>"
|
||||||
tracking_id: "Tracking ID"
|
tracking_id: "ID de rastreamento"
|
||||||
open_api_clients:
|
open_api_clients:
|
||||||
add_new_client: "Criar novo cliente de API"
|
add_new_client: "Criar novo cliente de API"
|
||||||
api_documentation: "Documentação da API"
|
api_documentation: "Documentação da API"
|
||||||
open_api_clients: "Cliente OpenAPI"
|
open_api_clients: "Cliente OpenAPI"
|
||||||
name: "Name"
|
name: "Nome"
|
||||||
calls_count: "Contagem de chamadas"
|
calls_count: "Contagem de chamadas"
|
||||||
token: "Token"
|
token: "Token"
|
||||||
created_at: "Data de criação"
|
created_at: "Data de criação"
|
||||||
reset_token: "Revogar acesso"
|
reset_token: "Revogar acesso"
|
||||||
client_name: "Nome do cliente"
|
client_name: "Nome do cliente"
|
||||||
confirmation_required: "Confirmation required"
|
confirmation_required: "Confirmação obrigatória"
|
||||||
do_you_really_want_to_delete_this_open_api_client: "Deseja realmente excluir este cliente OpenAPI??"
|
do_you_really_want_to_delete_this_open_api_client: "Deseja realmente excluir este cliente OpenAPI??"
|
||||||
do_you_really_want_to_revoke_this_open_api_access: "Deseja mesmo revogar este acesso? Ele apagará e substituirá o token atual."
|
do_you_really_want_to_revoke_this_open_api_access: "Deseja mesmo revogar este acesso? Ele apagará e substituirá o token atual."
|
||||||
client_successfully_created: "Cliente criado com sucesso."
|
client_successfully_created: "Cliente criado com sucesso."
|
||||||
@ -1225,217 +1225,217 @@ pt:
|
|||||||
manage_abuses:
|
manage_abuses:
|
||||||
abuses_list: "Lista de relatórios"
|
abuses_list: "Lista de relatórios"
|
||||||
no_reports: "Não há relatos de agora"
|
no_reports: "Não há relatos de agora"
|
||||||
published_by: "published by"
|
published_by: "publicado por"
|
||||||
at_date: "on"
|
at_date: "em"
|
||||||
has_reported: "made the following report:"
|
has_reported: "fez o seguinte relatório:"
|
||||||
confirmation_required: "Confirm the processing of the report"
|
confirmation_required: "Confirme o processamento do relatório"
|
||||||
report_will_be_destroyed: "Once the report has been processed, it will be deleted. This can't be undone, continue?"
|
report_will_be_destroyed: "Depois que o relatório for processado, ele será excluído. Isso não pode ser desfeito, continuar?"
|
||||||
report_removed: "The report has been deleted"
|
report_removed: "O relatório foi eliminado"
|
||||||
failed_to_remove: "An error occurred, unable to delete the report"
|
failed_to_remove: "Ocorreu um erro, não é possível excluir o relatório"
|
||||||
#feature tour
|
#feature tour
|
||||||
tour:
|
tour:
|
||||||
conclusion:
|
conclusion:
|
||||||
title: "Thank you for your attention"
|
title: "Obrigado pela sua atenção"
|
||||||
content: "<p>If you want to restart this contextual help, press <strong>F1</strong> at any time or click on [? Help] from the user's menu.</p><p>If you need additional help, you can <a href='https://github.com/sleede/fab-manager/raw/master/doc/fr/guide_utilisation_fab_manager_v4.5.pdf' target='_blank'>check the user guide</a> (only in French for now).</p><p>The Fab-manager's team also provides personalized support (help with getting started, help with installation, customization, etc.), <a href='mailto:contact@fab-manager.com'>contact-us</a> for more info.</p>"
|
content: "<p>Se você deseja reiniciar esta ajuda contextual, pressione <strong>F1</strong> a qualquer momento ou clique em [? Ajuda] do menu do usuário.</p><p>Se precisar de ajuda adicional, você pode <a href='https://github.com/sleede/fab-manager/raw/master/doc/fr/guide_utilisation_fab_manager_v4.5.pdf' target='_blank'>verificar o guia do usuário</a> (apenas em francês por enquanto).</p><p>A equipe do Fab-Gerente também fornece suporte personalizado (ajuda para começar, ajuda com a instalação, personalização, etc.), <a href='mailto:contact@fab-manager.com'>contacte-nos</a> para mais informações.</p>"
|
||||||
trainings:
|
trainings:
|
||||||
welcome:
|
welcome:
|
||||||
title: "Trainings"
|
title: "Treinamentos"
|
||||||
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."
|
content: "Aqui você pode criar, modificar e excluir treinamentos. É também o lugar onde você pode validar os cursos de treinamento seguidos por seus membros."
|
||||||
welcome_manager:
|
welcome_manager:
|
||||||
title: "Trainings"
|
title: "Treinamentos"
|
||||||
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."
|
content: "Este é o lugar onde se pode ver os treinamentos e suas associações com as máquinas. É também o lugar onde é possível validar os cursos de treinamento seguidos pelos seus membros."
|
||||||
trainings:
|
trainings:
|
||||||
title: "Manage trainings"
|
title: "Gerenciar treinamentos"
|
||||||
content: "<p>With each training, a default number of places is associated. However, the number of actual places may be modified for each session.</p><p>The training sessions are scheduled from the administrator tab « Calendar ».</p><p>Furthermore, a training may be associated with one or more machines. This makes it a prerequisite for the reservation of these machines.</p>"
|
content: "<p>Em cada treinamento, um número padrão de lugares está associado. No entanto, o número de lugares reais pode ser modificado para cada sessão.</p><p>As sessões de treinamento são agendadas na aba do administrador « calendário\".</p><p>Além disso, uma formação pode ser associada a uma ou mais máquinas. Isto faz dela um pré-requisito para a reserva dessas máquinas.</p>"
|
||||||
filter:
|
filter:
|
||||||
title: "Filter"
|
title: "Filtro"
|
||||||
content: "By default, only active courses are displayed here. Display the others by choosing another filter here."
|
content: "Por padrão, apenas cursos ativos são exibidos aqui. Exiba os outros, escolhendo outro filtro aqui."
|
||||||
tracking:
|
tracking:
|
||||||
title: "Trainings monitoring"
|
title: "Treinamentos"
|
||||||
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."
|
content: "Quando uma sessão de treinamento estiver concluída, você poderá validar o treinamento para os membros presentes nessa tela. Essa validação é essencial para permitir a utilização das máquinas associadas, se aplicável."
|
||||||
calendar:
|
calendar:
|
||||||
welcome:
|
welcome:
|
||||||
title: "Calendar"
|
title: "Agenda"
|
||||||
content: "From this screen, you can plan the slots during which training, machines and spaces will be bookable by members."
|
content: "Nesta tela, você pode planejar os espaços durante os quais treinamento, máquinas e espaços serão reservados pelos membros."
|
||||||
agenda:
|
agenda:
|
||||||
title: "The calendar"
|
title: "O calendário"
|
||||||
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."
|
content: "Clique no calendário para começar a criar um novo intervalo de disponibilidade. Você pode selecionar diretamente o intervalo de tempo desejado mantendo seu clique."
|
||||||
export:
|
export:
|
||||||
title: "Export"
|
title: "Exportar"
|
||||||
content: "Start generating an Excel file, listing all the availability slots created in the calendar."
|
content: "Comece a gerar um arquivo Excel, listando todos os slots de disponibilidade criados no calendário."
|
||||||
import:
|
import:
|
||||||
title: "Import external calendars"
|
title: "Importar calendários externos"
|
||||||
content: "Allows you to import calendars from an external source in iCal format."
|
content: "Permite importar calendários de uma fonte externa no formato iCal."
|
||||||
members:
|
members:
|
||||||
welcome:
|
welcome:
|
||||||
title: "Users"
|
title: "Usuários"
|
||||||
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."
|
content: "Aqui você pode criar, modificar e excluir membros e administradores. Você também pode gerenciar grupos, etiquetas, importar / exportar com arquivos de planilha e conectar SSO."
|
||||||
list:
|
list:
|
||||||
title: "Members list"
|
title: "Lista de membros"
|
||||||
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."
|
content: "Por padrão, essa tabela lista todos os membros do seu Fab-manager. Você pode classificar a lista em uma ordem diferente clicando no cabeçalho de cada coluna."
|
||||||
search:
|
search:
|
||||||
title: "Find a user"
|
title: "Encontrar um usuário"
|
||||||
content: "This input field allows you to search for any text on all of the columns in the table below."
|
content: "Este campo de entrada permite que você procure qualquer texto em todas as colunas na tabela abaixo."
|
||||||
filter:
|
filter:
|
||||||
title: "Filter the list"
|
title: "Filtrar a lista"
|
||||||
content: "<p>Filter the list below to display only users who have not confirmed their email address or inactive accounts for more than 3 years.</p><p>Please notice that the GDPR requires that you delete any accounts inactive for more than 3 years.</p>"
|
content: "<p>Filtrar a lista abaixo para exibir somente os usuários que não confirmaram seu endereço de e-mail ou contas inativas por mais de 3 anos.</p><p>Note que o GDPR requer que você exclua todas as contas inativas por mais de 3 anos.</p>"
|
||||||
actions:
|
actions:
|
||||||
title: "Members actions"
|
title: "Ações dos membros"
|
||||||
content: "<p>The buttons in this column allow you to display and modify all of the member's parameters, or to delete them irreversibly.</p><p>In the event of a deletion, the billing information will be kept for 10 years and statistical data will also be kept anonymously.</p>"
|
content: "<p>Os botões desta coluna permitem que você exiba e modifique todos os parâmetros do membro, ou excluí-los irreversivelmente.</p><p>No caso de exclusão, A informação sobre o facturamento será mantida durante 10 anos e os dados estatísticos serão mantidos anonimamente.</p>"
|
||||||
exports:
|
exports:
|
||||||
title: "Export"
|
title: "Exportar"
|
||||||
content: "Each of these buttons starts the generation of an Excel file listing all the members, subscriptions or reservations, current and past."
|
content: "Cada um destes botões inicia a geração de um arquivo Excel que lista todos os membros, assinaturas ou reservas, atuais e passados."
|
||||||
import:
|
import:
|
||||||
title: "Import members"
|
title: "Importar membros"
|
||||||
content: "Allows you to import a list of members to create in Fab-manager, from a CSV file."
|
content: "Permite importar uma lista de membros para criar no Fab-manager, de um arquivo CSV."
|
||||||
admins:
|
admins:
|
||||||
title: "Manage administrators"
|
title: "Gerenciar administradores"
|
||||||
content: "In the same way as the members, manage the administrators of your Fab-manager here.<br>The administrators can take reservations for any member as well as modify all the parameters of the software."
|
content: "Da mesma forma que os membros, gerenciem os administradores do seu Gestor Fab-Manager aqui.<br>Os administradores podem ter reservas para qualquer membro bem como modificar todos os parâmetros do software."
|
||||||
groups:
|
groups:
|
||||||
title: "Manage groups"
|
title: "Gerenciar grupos"
|
||||||
content: "<p>Groups allow you to better segment your price list.</p><p>When you set up Fab-manager for the first time, it is recommended to start by defining the groups.</p>"
|
content: "<p>Grupos permitem que você segmente melhor sua lista de preços.</p><p>Quando você configurar o Fab-manager pela primeira vez, é recomendado começar a definir os grupos.</p>"
|
||||||
labels:
|
labels:
|
||||||
title: "Manage tags"
|
title: "Gerenciar etiquetas"
|
||||||
content: "The labels allow you to reserve certain slots for users associated with these same labels."
|
content: "Os rótulos permitem reservar determinados espaços para os usuários associados a esses mesmos rótulos."
|
||||||
sso:
|
sso:
|
||||||
title: "Single Sign-On"
|
title: "Logon único"
|
||||||
content: "Here you can set up and manage a single authentication system (SSO)."
|
content: "Aqui você pode configurar e gerenciar um único sistema de autenticação (SSO)."
|
||||||
invoices:
|
invoices:
|
||||||
welcome:
|
welcome:
|
||||||
title: "Invoices"
|
title: "Faturas"
|
||||||
content: "<p>Here you will be able to download invoices and credit notes issued, as well as manage everything related to accounting and invoicing.</p><p>If you use third-party software to manage your invoices, it is possible to deactivate the billing module. For this, contact your system administrator.</p>"
|
content: "<p>Aqui você poderá baixar faturas e notas de crédito emitidas, bem como gerenciar tudo relacionado a contabilidade e faturação.</p><p>Se você usa software de terceiros para gerenciar suas faturas, é possível desativar o módulo de cobrança. Para isso, contate o administrador do sistema</p>"
|
||||||
welcome_manager:
|
welcome_manager:
|
||||||
title: "Invoices"
|
title: "Faturas"
|
||||||
content: "Here you will be able to download invoices and create credit notes."
|
content: "Aqui poderá fazer o download das faturas e criar notas de crédito."
|
||||||
list:
|
list:
|
||||||
title: "Invoices list"
|
title: "Lista de faturas"
|
||||||
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."
|
content: "Por padrão, esta tabela lista todas as faturas e notas de crédito emitidas pelo Fab-manager. Você pode classificar a lista em uma ordem diferente clicando no cabeçalho de cada coluna."
|
||||||
chained:
|
chained:
|
||||||
title: "Chaining indicator"
|
title: "Indicador de encadeamento"
|
||||||
content: "<p>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.</p><p>If a red icon appears instead of this one , please contact technical support immediately.</p>"
|
content: "<p>Este ícone garante a inalterabilidade dos dados de contabilidade da fatura nesta linha, de acordo com a lei francesa das finanças de 2018 contra a fraude do IVA.</p><p>Se um ícone vermelho aparecer em vez deste, por favor contate o suporte técnico imediatamente.</p>"
|
||||||
download:
|
download:
|
||||||
title: "Download"
|
title: "Baixar"
|
||||||
content: "Click here to download the invoice in PDF format."
|
content: "Clique aqui para baixar a fatura em formato PDF."
|
||||||
refund:
|
refund:
|
||||||
title: "Credit note"
|
title: "Nota de crédito"
|
||||||
content: "Allows you to generate a credit note for the invoice on this line or some of its sub-elements. <strong>Warning:</strong> This will only generate the accounting document, the actual refund of the user will always be your responsibility."
|
content: "Permite gerar uma nota de crédito para a fatura nesta linha ou alguns de seus sub-elementos. <strong>Aviso:</strong> Isto só irá gerar o documento de contabilidade, o reembolso real do usuário será sempre sua responsabilidade."
|
||||||
settings:
|
settings:
|
||||||
title: "Settings"
|
title: "Configurações"
|
||||||
content: "<p>Here you can modify the parameters for invoices generation. Click on the item you are interested in to start editing.</p><p>In particular, this is where you can set if you are subject to VAT and the applicable rate.</p>"
|
content: "<p>Aqui você pode modificar os parâmetros para a geração de faturas. Clique no item em que está interessado para começar a editar.</p><p>Em particular, é aqui que você pode definir se está sujeito a IVA e à taxa aplicável.</p>"
|
||||||
codes:
|
codes:
|
||||||
title: "Accounting codes"
|
title: "Códigos contábeis"
|
||||||
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."
|
content: "Defina aqui os códigos de contabilidade para todos os tipos de lançamentos gerados pelo software. Essa configuração só é necessária se você usar a funcionalidade de exportação contábil."
|
||||||
export:
|
export:
|
||||||
title: "Accounting export"
|
title: "Exportação de contabilidade"
|
||||||
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."
|
content: "Depois que os códigos forem configurados, clique aqui para acessar a interface que lhe permite exportar as entradas para um software de contabilidade de terceiros."
|
||||||
payment:
|
payment:
|
||||||
title: "Payment settings"
|
title: "Configurações de pagamento"
|
||||||
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."
|
content: "Se você quiser permitir que seus membros façam uma reserva online diretamente pagando com cartão de crédito, você pode ativar e configurar esta funcionalidade a partir desta página."
|
||||||
periods:
|
periods:
|
||||||
title: "Close accounting periods"
|
title: "Fechar períodos de contabilidade"
|
||||||
content: "<p>The regulations of your country may require you to close your accounts regularly. The interface accessible from this button allows you to do this.</p> <p><strong>In France,</strong> if you are subject to VAT anti-fraud law <a href='https://bofip.impots.gouv.fr/bofip/10691-PGP.html' target='_blank'>BOI-TVA-DECLA-30-10-30-20160803</a>, this closing is mandatory at least once a year.</p><p>As a reminder, if you have to use a certified software (<a href='https://www.impots.gouv.fr/portail/suis-je-oblige-davoir-un-logiciel-de-caisse-securise' target='_blank'>take the test here</a>), you are under the legal obligation to provide a certificate of compliance of the software. <a href='mailto:contact@fab-manager.com'>Contact-us<a/> to get it.</p>"
|
content: "<p>As regulamentações de seu país podem exigir que você feche suas contas regularmente. A interface acessível a partir deste botão permite que você faça isso.</p> <p><strong>Em França,</strong> se você estiver sujeito à lei anti-fraude do IVA <a href='https://bofip.impots.gouv.fr/bofip/10691-PGP.html' target='_blank'>BOI-TVA-DECLA-30-30-30-20160803</a>, este encerramento é obrigatório pelo menos uma vez por ano.</p><p>Como lembrete, se você precisa usar um software certificado (<a href='https://www.impots.gouv.fr/portail/suis-je-oblige-davoir-un-logiciel-de-caisse-securise' target='_blank'>faça o teste aqui</a>), está sob a obrigação legal de fornecer um certificado de conformidade com o software. <a href='mailto:contact@fab-manager.com'>contato-nos<a/> para pegá-lo.</p>"
|
||||||
pricing:
|
pricing:
|
||||||
welcome:
|
welcome:
|
||||||
title: "Subscriptions & Prices"
|
title: "Assinaturas & Preços"
|
||||||
content: "Manage subscription plans and prices for the various services you offer to your members."
|
content: "Gerencie planos de assinatura e preços para os vários serviços que você oferece aos seus membros."
|
||||||
new_plan:
|
new_plan:
|
||||||
title: "New subscription plan"
|
title: "Novo plano de assinatura"
|
||||||
content: "Create subscription plans to offer preferential prices on machines and spaces to regular users."
|
content: "Crie planos de assinatura para oferecer preços preferenciais em máquinas e espaços para usuários normais."
|
||||||
trainings:
|
trainings:
|
||||||
title: "Trainings"
|
title: "Treinamentos"
|
||||||
content: "Define training prices here, by user group."
|
content: "Defina os preços de treinamento aqui, pelo grupo de usuários."
|
||||||
machines:
|
machines:
|
||||||
title: "Machines"
|
title: "Máquinas"
|
||||||
content: "Define here the prices of the machine slots, by user group. These prices will be applied to users who do not have subscriptions."
|
content: "Defina aqui os preços dos slots de máquina, pelo grupo de usuário. Estes preços serão aplicados aos usuários que não possuem assinaturas."
|
||||||
spaces:
|
spaces:
|
||||||
title: "Spaces"
|
title: "Espaços"
|
||||||
content: "In the same way, define here the prices of the spaces slots, for the users without subscriptions."
|
content: "Da mesma forma, defina aqui os preços das faixas horárias para os usuários sem assinaturas."
|
||||||
credits:
|
credits:
|
||||||
title: "Credits"
|
title: "Créditos"
|
||||||
content: "<p>Credits allow you to give certain services for free to users who subscribe to a plan.</p><p>You can, for example, offer 2 hours of 3D printer for all annual subscriptions; or training of your choice for student subscribers, etc.</p>"
|
content: "<p>Os créditos permitem que você conceda certos serviços gratuitamente para os usuários que se inscrevem em um plano.</p><p>Você pode, por exemplo, oferecer 2 horas de impressora 3D para todas as assinaturas anuais; ou treinamento de sua escolha para assinantes de alunos, etc.</p>"
|
||||||
coupons:
|
coupons:
|
||||||
title: "Coupons"
|
title: "Cupons"
|
||||||
content: "Create and manage promotional coupons allowing to offer punctual discounts to their holders."
|
content: "Crie e gerencie cupons promocionais, permitindo oferecer descontos pontuais aos seus participantes."
|
||||||
events:
|
events:
|
||||||
welcome:
|
welcome:
|
||||||
title: "Events"
|
title: "Eventos"
|
||||||
content: "Create events, track their reservations and organize them from this page."
|
content: "Crie eventos, acompanhe suas reservas e organize-as a partir desta página."
|
||||||
list:
|
list:
|
||||||
title: "The events"
|
title: "Os eventos"
|
||||||
content: "This list displays all past or future events, as well as the number of reservations for each of them."
|
content: "Esta lista exibe todos os eventos passados ou futuros, bem como o número de reservas para cada um deles."
|
||||||
filter:
|
filter:
|
||||||
title: "Filter events"
|
title: "Filtrar eventos"
|
||||||
content: "Only display upcoming events in the list below; or on the contrary, only those already passed."
|
content: "Exibir somente eventos futuros na lista abaixo; ou pelo contrário, apenas aqueles já passados."
|
||||||
categories:
|
categories:
|
||||||
title: "Categories"
|
title: "Categorias"
|
||||||
content: "Categories help your users know what type of event it is. A category is required for each of the newly created events."
|
content: "As categorias ajudam seus usuários a saber que tipo de evento é necessário. Uma categoria é necessária para cada um dos eventos recém-criados."
|
||||||
themes:
|
themes:
|
||||||
title: "Themes"
|
title: "Temas"
|
||||||
content: "<p>Themes are an additional (and optional) categorization of your events. They can group together different events of very different forms.</p><p>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 ».</p>"
|
content: "<p>Temas são uma categorização adicional (e opcional) de seus eventos. Eles podem agrupar eventos diferentes de formulários diferentes.</p><p>Por exemplo, um curso de dois dias sobre marqueza e um workshop sobre o manuseio do plantador de madeira, pode ser encontrado no tema « carpinteiro ».</p>"
|
||||||
ages:
|
ages:
|
||||||
title: "Age groups"
|
title: "Grupos de idade"
|
||||||
content: "This other optional filter will help your users find events suited to their profile."
|
content: "Este outro filtro opcional ajudará seus usuários a encontrar eventos adequados ao seu perfil."
|
||||||
prices:
|
prices:
|
||||||
title: "Pricing categories"
|
title: "Categorias de preços"
|
||||||
content: "The price of events does not depend on groups or subscriptions, but on the categories you define on this page."
|
content: "O preço dos eventos não depende de grupos ou assinaturas, mas das categorias que você definir nesta página."
|
||||||
projects:
|
projects:
|
||||||
welcome:
|
welcome:
|
||||||
title: "Projects"
|
title: "Projetos"
|
||||||
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."
|
content: "Aqui você pode definir todos os elementos que estarão disponíveis para os membros documentarem os projetos que realizarem. Você também pode definir vários parâmetros relacionados aos projetos."
|
||||||
abuses:
|
abuses:
|
||||||
title: "Manage reports"
|
title: "Gerenciar relatórios"
|
||||||
content: "<p>Access here the management of reports.</p><p>Visitors can signal projects, for example for copyright infringement or for hate speech.</p><p>GDPR requires you to delete this reporting data once the required actions have been taken.</p>"
|
content: "<p>Acesse aqui o gerenciamento dos relatórios.</p><p>Os visitantes podem sinalizar projetos, por exemplo, por violação de direitos autorais ou por discurso de ódio.</p><p>GDPR requer que você exclua esses dados reportados uma vez que tenham sido tomadas as ações necessárias.</p>"
|
||||||
settings:
|
settings:
|
||||||
title: "Settings"
|
title: "Confirgurações"
|
||||||
content: "<p>Comments, CAD files ... Manage project parameters here</p><p>You can also activate OpenLab projects, in order to display the projects shared by other Fab Labs in your gallery.</p>"
|
content: "<p>Comentários, arquivos CAD ... Gerenciar parâmetros do projeto aqui</p><p>Você também pode ativar projetos OpenLab, para exibir os projetos compartilhados por outros Laboratórios Fab em sua galeria.</p>"
|
||||||
statistics:
|
statistics:
|
||||||
welcome:
|
welcome:
|
||||||
title: "Statistics"
|
title: "Estatísticas"
|
||||||
content: "<p>From here, you will be able to access many statistics on your members and their uses within your Fab Lab.</p><p>In accordance with GDPR, users who have deleted their account continue to be reported in the statistics, but anonymously.</p>"
|
content: "<p>A partir daqui, você será capaz de acessar muitas estatísticas sobre seus membros e seus usos no seu Laboratório Fab.</p><p>De acordo com o GDPR, os usuários que deletaram sua conta continuam sendo relatados nas estatísticas, mas anonimamente.</p>"
|
||||||
export:
|
export:
|
||||||
title: "Export data"
|
title: "Exportar dados"
|
||||||
content: "You can choose to export all or part of the statistical data to an Excel file."
|
content: "Você pode optar por exportar toda ou parte dos dados estatísticos para um arquivo do Excel."
|
||||||
trending:
|
trending:
|
||||||
title: "Evolution"
|
title: "Evolução"
|
||||||
content: "Visualize the evolution over time of the main uses of your Fab Lab, thanks to graphs and curves."
|
content: "Visualize a evolução ao longo do tempo dos principais usos do seu Laboratório de Fab graças aos gráficos e curvas."
|
||||||
settings:
|
settings:
|
||||||
welcome:
|
welcome:
|
||||||
title: "Application customization"
|
title: "Personalização da aplicação"
|
||||||
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."
|
content: "A partir daqui, você pode configurar as configurações gerais do Fab-manager, ativar ou desativar os módulos opcionais e personalizar vários elementos da interface."
|
||||||
general:
|
general:
|
||||||
title: "General settings"
|
title: "Configurações gerais"
|
||||||
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."
|
content: "Muitas configurações podem ser personalizadas a partir daqui. Dê uma olhada em toda esta página, ela permitirá que você personalize mensagens, documentos, módulos opcionais, registros, aspecto visual do Fab-manager, e muito mais."
|
||||||
home:
|
home:
|
||||||
title: "Customize home page"
|
title: "Personalizar página inicial"
|
||||||
content: "<p>This WYSIWYG editor allows you to customize the appearance of the home page while using different components (last tweet, brief, etc.).</p><p><strong>Warning:</strong> Keep in mind that any uncontrolled changes can break the appearance of the home page.</p>"
|
content: "<p>Este editor WYSIWYG permite que você personalize a aparência da página inicial enquanto utiliza diferentes componentes (último tweet, breve, etc.).</p><p><strong>Aviso:</strong> Tenha em mente que qualquer alteração descontrolada pode quebrar a aparência da página inicial.</p>"
|
||||||
components:
|
components:
|
||||||
title: "Insert a component"
|
title: "Inserir um comentário"
|
||||||
content: "Click here to insert a pre-existing component into the home page."
|
content: "Clique aqui para inserir um componente pré-existente na página inicial."
|
||||||
codeview:
|
codeview:
|
||||||
title: "Display HTML code"
|
title: "Exibir código HTML"
|
||||||
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."
|
content: "Este botão permite que você veja diretamente e modifique o código da página inicial. Esta é a forma recomendada de proceder, mas requer conhecimento prévio de HTML."
|
||||||
reset:
|
reset:
|
||||||
title: "Go back"
|
title: "Voltar"
|
||||||
content: "At any time, you can restore the original home page by clicking here."
|
content: "A qualquer momento, você pode restaurar a página inicial clicando aqui."
|
||||||
css:
|
css:
|
||||||
title: "Customize the style sheet"
|
title: "Customizar CSS"
|
||||||
content: "For advanced users, it is possible to define a custom style sheet (CSS) for the home page."
|
content: "Para usuários avançados, é possível definir uma folha de estilo personalizada (CSS) para a página inicial."
|
||||||
about:
|
about:
|
||||||
title: "About"
|
title: "Sobre"
|
||||||
content: "Fully personalize this page to present your activity."
|
content: "Personalize totalmente esta página para apresentar a sua atividade."
|
||||||
privacy:
|
privacy:
|
||||||
title: "Política de privacidade"
|
title: "Política de privacidade"
|
||||||
content: "<p>Explain here how you use the data you collect about your members.</p><p>GDPR requires that a confidentiality policy is defined, as well as a data protection officer.</p>"
|
content: "<p>Explique aqui como você utiliza os dados coletados sobre os seus membros.</p><p>O RGPD requer que uma política de confidencialidade seja definida, bem como um oficial de proteção de dados.</p>"
|
||||||
draft:
|
draft:
|
||||||
title: "Draft"
|
title: "Rascunho"
|
||||||
content: "Click here to view a privacy policy draft with holes, which you just need to read and complete."
|
content: "Clique aqui para ver um rascunho da política de privacidade com buracos, que você só precisa ler e completar."
|
||||||
reservations:
|
reservations:
|
||||||
title: "Reservations"
|
title: "Reservas"
|
||||||
content: "Opening hours, chance to cancel reservations... Each Fablab has its own reservation rules, which you can define on this page."
|
content: "Horário de funcionamento, chance de cancelar reservas... Cada Fablab tem suas próprias regras de reserva, que você pode definir nesta página."
|
||||||
open_api:
|
open_api:
|
||||||
welcome:
|
welcome:
|
||||||
title: "OpenAPI"
|
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."
|
content: "Fab-manager oferece uma API aberta que permite que outros softwares lidem simplesmente com seus dados. Esta tela permite que você conceda acessos a esta API."
|
||||||
doc:
|
doc:
|
||||||
title: "Documentation"
|
title: "Documentação"
|
||||||
content: "Click here to access the API online documentation."
|
content: "Clique aqui para acessar a documentação online da API."
|
||||||
|
@ -35,10 +35,10 @@ pt:
|
|||||||
_the_fablab_policy: "a política do FabLab"
|
_the_fablab_policy: "a política do FabLab"
|
||||||
change_my_data: "Alterar meus dados"
|
change_my_data: "Alterar meus dados"
|
||||||
sync_my_profile: "Sincronizar meu perfil"
|
sync_my_profile: "Sincronizar meu perfil"
|
||||||
once_your_data_are_up_to_date_: "Once your data are up to date,"
|
once_your_data_are_up_to_date_: "Assim que seus dados estiverem atualizados,"
|
||||||
_click_on_the_synchronization_button_opposite_: "click on the synchronization button opposite"
|
_click_on_the_synchronization_button_opposite_: "clique no botão de sincronização oposto"
|
||||||
_disconnect_then_reconnect_: "disconnect then reconnect"
|
_disconnect_then_reconnect_: "disconecte e se conecte novamente"
|
||||||
_for_your_changes_to_take_effect: "for your changes to take effect."
|
_for_your_changes_to_take_effect: "para que suas alterações tenham efeito."
|
||||||
dashboard:
|
dashboard:
|
||||||
#dashboard: public profile
|
#dashboard: public profile
|
||||||
profile:
|
profile:
|
||||||
@ -65,20 +65,20 @@ pt:
|
|||||||
edit_my_profile: "Editar meu perfil"
|
edit_my_profile: "Editar meu perfil"
|
||||||
your_group_has_been_successfully_changed: "Seu grupo foi modificado com sucesso."
|
your_group_has_been_successfully_changed: "Seu grupo foi modificado com sucesso."
|
||||||
an_unexpected_error_prevented_your_group_from_being_changed: "Um erro inesperado impediu o seu grupo de ser alterado."
|
an_unexpected_error_prevented_your_group_from_being_changed: "Um erro inesperado impediu o seu grupo de ser alterado."
|
||||||
confirmation_required: "Confirmation required"
|
confirmation_required: "Confirmação obrigatória"
|
||||||
confirm_delete_your_account: "Você realmente deseja deletar sua conta?"
|
confirm_delete_your_account: "Você realmente deseja deletar sua conta?"
|
||||||
all_data_will_be_lost: "All your data will be destroyed and won't be recoverable."
|
all_data_will_be_lost: "Todos os seus dados serão destruídos e não serão recuperáveis."
|
||||||
invoicing_data_kept: "According to regulation, all data related to your invoices will be kept separately for 10 years."
|
invoicing_data_kept: "De acordo com os regulamentos, todos os dados relacionados às suas faturas serão mantidos separadamente por 10 anos."
|
||||||
statistic_data_anonymized: "Some data (sex, date of birth, group) will be anonymized and kept for statistical purposes."
|
statistic_data_anonymized: "Alguns dados (sexo, data de nascimento, grupo) serão anonimizados e mantidos para fins estatísticos."
|
||||||
no_further_access_to_projects: "Your published projects will be anonymized and you won't get any further ability to edit them."
|
no_further_access_to_projects: "Seus projetos publicados ficarão anônimos e você não terá mais a capacidade de editá-los."
|
||||||
your_user_account_has_been_successfully_deleted_goodbye: "Sua conta de usuário foi excluída com êxito. Até mais."
|
your_user_account_has_been_successfully_deleted_goodbye: "Sua conta de usuário foi excluída com êxito. Até mais."
|
||||||
an_error_occured_preventing_your_account_from_being_deleted: "Ocorreu um erro, impedindo que sua conta fosse excluída."
|
an_error_occured_preventing_your_account_from_being_deleted: "Ocorreu um erro, impedindo que sua conta fosse excluída."
|
||||||
used_for_statistics: "This data will be used for statistical purposes"
|
used_for_statistics: "Estes dados serão utilizados para fins estatísticos"
|
||||||
used_for_invoicing: "This data will be used for billing purposes"
|
used_for_invoicing: "Esses dados serão usados para fins de faturamento"
|
||||||
used_for_reservation: "This data will be used in case of change on one of your bookings"
|
used_for_reservation: "Estes dados serão utilizados em caso de alteração em uma das suas reservas"
|
||||||
used_for_profile: "This data will only be displayed on your profile"
|
used_for_profile: "Estes dados serão exibidos apenas no seu perfil"
|
||||||
used_for_pricing_stats: "This data will be used to determine the prices to which you are entitled, and for statistical purposes"
|
used_for_pricing_stats: "Estes dados serão usados para determinar os preços a que você tem direito, e para fins estatísticos"
|
||||||
public_profile: "You will have a public profile and other users will be able to associate you in their projects"
|
public_profile: "Você terá um perfil público e outros usuários poderão associá-lo em seus projetos"
|
||||||
trainings: "Treinamentos"
|
trainings: "Treinamentos"
|
||||||
no_trainings: "Sem treinamentos"
|
no_trainings: "Sem treinamentos"
|
||||||
subscription: "Assinatura"
|
subscription: "Assinatura"
|
||||||
@ -94,37 +94,37 @@ pt:
|
|||||||
#dashboard: my projects
|
#dashboard: my projects
|
||||||
projects:
|
projects:
|
||||||
you_dont_have_any_projects: "Você não tem nenhum projeto."
|
you_dont_have_any_projects: "Você não tem nenhum projeto."
|
||||||
add_a_project: "Add a project"
|
add_a_project: "Adicionar projeto"
|
||||||
author: "Autor"
|
author: "Autor"
|
||||||
collaborator: "Colaborador"
|
collaborator: "Colaborador"
|
||||||
rough_draft: "Draft"
|
rough_draft: "Rascunho"
|
||||||
description: "Description"
|
description: "Descrição"
|
||||||
machines_and_materials: "Machines and materials"
|
machines_and_materials: "Máquinas e materiais"
|
||||||
machines: "Machines"
|
machines: "Máquinas"
|
||||||
materials: "Materials"
|
materials: "Materiais"
|
||||||
collaborators: "Collaborators"
|
collaborators: "Colaboradores"
|
||||||
#dashboard: my trainings
|
#dashboard: my trainings
|
||||||
trainings:
|
trainings:
|
||||||
your_next_trainings: "Seus próximos treinamentos"
|
your_next_trainings: "Seus próximos treinamentos"
|
||||||
your_previous_trainings: "Seus treinamentos anteriores"
|
your_previous_trainings: "Seus treinamentos anteriores"
|
||||||
your_approved_trainings: "Seus treinamentos aprovados"
|
your_approved_trainings: "Seus treinamentos aprovados"
|
||||||
no_trainings: "No trainings"
|
no_trainings: "Sem treinamentos"
|
||||||
#dashboard: my events
|
#dashboard: my events
|
||||||
events:
|
events:
|
||||||
your_next_events: "Seus próximos eventos"
|
your_next_events: "Seus próximos eventos"
|
||||||
no_events_to_come: "Sem eventos futuros"
|
no_events_to_come: "Sem eventos futuros"
|
||||||
your_previous_events: "Seus eventos anteriores"
|
your_previous_events: "Seus eventos anteriores"
|
||||||
no_passed_events: "No passed events"
|
no_passed_events: "Sem eventos"
|
||||||
NUMBER_normal_places_reserved: "{NUMBER} {NUMBER, plural, =0{} =1{lugar normal reservado} other{lugares normais reservados}}"
|
NUMBER_normal_places_reserved: "{NUMBER} {NUMBER, plural, =0{} =1{lugar normal reservado} other{lugares normais reservados}}"
|
||||||
NUMBER_of_NAME_places_reserved: "{NUMBER} {NUMBER, plural, =0{} =1{{NAME} lugar reservado} other{{NAME} lugares reservados}}"
|
NUMBER_of_NAME_places_reserved: "{NUMBER} {NUMBER, plural, =0{} =1{{NAME} lugar reservado} other{{NAME} lugares reservados}}"
|
||||||
#dashboard: my invoices
|
#dashboard: my invoices
|
||||||
invoices:
|
invoices:
|
||||||
reference_number: "Número de referência"
|
reference_number: "Número de referência"
|
||||||
date: "Date"
|
date: "Data"
|
||||||
price: "Price"
|
price: "Preço"
|
||||||
download_the_invoice: "Download the invoice"
|
download_the_invoice: "Baixar a fatura"
|
||||||
download_the_credit_note: "Download the refund invoice"
|
download_the_credit_note: "Baixar fatura de reembolso"
|
||||||
no_invoices_for_now: "No invoices for now."
|
no_invoices_for_now: "Nenhuma fatura."
|
||||||
#public profil of a member
|
#public profil of a member
|
||||||
members_show:
|
members_show:
|
||||||
members_list: "Lista de membros"
|
members_list: "Lista de membros"
|
||||||
@ -133,17 +133,17 @@ pt:
|
|||||||
the_fablab_members: "Membros do FabLab"
|
the_fablab_members: "Membros do FabLab"
|
||||||
display_more_members: "Mostrar mais membros..."
|
display_more_members: "Mostrar mais membros..."
|
||||||
no_members_for_now: "Sem membros"
|
no_members_for_now: "Sem membros"
|
||||||
avatar: "Avatar"
|
avatar: "Imagem de Perfil"
|
||||||
user: "User"
|
user: "Usuário"
|
||||||
pseudonym: "Pseudonym"
|
pseudonym: "Apelido"
|
||||||
email_address: "Email address"
|
email_address: "Email"
|
||||||
#add a new project
|
#add a new project
|
||||||
projects_new:
|
projects_new:
|
||||||
add_a_new_project: "Adicionar novo projeto"
|
add_a_new_project: "Adicionar novo projeto"
|
||||||
#modify an existing project
|
#modify an existing project
|
||||||
projects_edit:
|
projects_edit:
|
||||||
edit_the_project: "Editar projeto"
|
edit_the_project: "Editar projeto"
|
||||||
rough_draft: "Draft"
|
rough_draft: "Rascunho"
|
||||||
publish: "Publicar"
|
publish: "Publicar"
|
||||||
#book a machine
|
#book a machine
|
||||||
machines_reserve:
|
machines_reserve:
|
||||||
@ -153,18 +153,18 @@ pt:
|
|||||||
i_reserve: "Eu reservo"
|
i_reserve: "Eu reservo"
|
||||||
i_shift: "Eu mudo"
|
i_shift: "Eu mudo"
|
||||||
i_change: "Eu altero"
|
i_change: "Eu altero"
|
||||||
do_you_really_want_to_cancel_this_reservation: "Do you really want to cancel this reservation?"
|
do_you_really_want_to_cancel_this_reservation: "Você realmente quer cancelar essa reserva?"
|
||||||
reservation_was_cancelled_successfully: "Reservation was cancelled successfully."
|
reservation_was_cancelled_successfully: "Reserva a foi cancelada com sucesso."
|
||||||
cancellation_failed: "Cancellation failed."
|
cancellation_failed: "Cancelamento falhou."
|
||||||
a_problem_occured_during_the_payment_process_please_try_again_later: "A problem occurred during the payment process. Please try again later."
|
a_problem_occured_during_the_payment_process_please_try_again_later: "Um problema ocorreu durante o processo de pagamento. Por favor tente novamente mais tarde."
|
||||||
#book a training
|
#book a training
|
||||||
trainings_reserve:
|
trainings_reserve:
|
||||||
trainings_planning: "Planos de treinamento"
|
trainings_planning: "Planos de treinamento"
|
||||||
planning_of: "Planejamento de " #eg. Planning of 3d printer training
|
planning_of: "Planejamento de " #eg. Planning of 3d printer training
|
||||||
all_trainings: "Todos treinamentos"
|
all_trainings: "Todos treinamentos"
|
||||||
cancel_my_selection: "Cancelar minha seleção"
|
cancel_my_selection: "Cancelar minha seleção"
|
||||||
i_change: "I change"
|
i_change: "Eu altero"
|
||||||
i_shift: "I shift"
|
i_shift: "Eu troco"
|
||||||
i_ve_reserved: "Eu reservei"
|
i_ve_reserved: "Eu reservei"
|
||||||
#book a space
|
#book a space
|
||||||
space_reserve:
|
space_reserve:
|
||||||
@ -175,7 +175,7 @@ pt:
|
|||||||
notifications:
|
notifications:
|
||||||
notifications_center: "Centro de notificações"
|
notifications_center: "Centro de notificações"
|
||||||
mark_all_as_read: "Marcar todas como lidas"
|
mark_all_as_read: "Marcar todas como lidas"
|
||||||
date: "Date"
|
date: "Data"
|
||||||
notif_title: "Título"
|
notif_title: "Título"
|
||||||
no_new_notifications: "Nenhuma nova notificação."
|
no_new_notifications: "Nenhuma nova notificação."
|
||||||
archives: "Arquivos"
|
archives: "Arquivos"
|
||||||
|
@ -3,7 +3,7 @@ pt:
|
|||||||
public:
|
public:
|
||||||
#header and "about" page
|
#header and "about" page
|
||||||
common:
|
common:
|
||||||
about_the_fablab: "Sobre {GENDER, select, male{o} female{a} neutral{} other{do}} {NAME}"
|
about_the_fablab: "Sobre {GENDER, select, male{o} female{a} neutral{} other{}} {NAME}"
|
||||||
return: "Voltar"
|
return: "Voltar"
|
||||||
#cookies
|
#cookies
|
||||||
cookies:
|
cookies:
|
||||||
@ -12,7 +12,7 @@ pt:
|
|||||||
accept: "Aceitar cookies"
|
accept: "Aceitar cookies"
|
||||||
decline: "Recusar"
|
decline: "Recusar"
|
||||||
#dashboard sections
|
#dashboard sections
|
||||||
dashboard: "Dashboard"
|
dashboard: "Painel de controle"
|
||||||
my_profile: "Meu Perfil"
|
my_profile: "Meu Perfil"
|
||||||
my_settings: "Minhas Configurações"
|
my_settings: "Minhas Configurações"
|
||||||
my_projects: "Meus Projetos"
|
my_projects: "Meus Projetos"
|
||||||
@ -21,22 +21,22 @@ pt:
|
|||||||
my_invoices: "Minhas Contas"
|
my_invoices: "Minhas Contas"
|
||||||
my_wallet: "Minha Carteira"
|
my_wallet: "Minha Carteira"
|
||||||
#contextual help
|
#contextual help
|
||||||
help: "Help"
|
help: "Ajuda"
|
||||||
#login/logout
|
#login/logout
|
||||||
sign_out: "Sair"
|
sign_out: "Sair"
|
||||||
sign_up: "Cadastrar"
|
sign_up: "Cadastrar"
|
||||||
sign_in: "Entrar"
|
sign_in: "Entrar"
|
||||||
#left menu
|
#left menu
|
||||||
notifications: "Nofificações"
|
notifications: "Nofificações"
|
||||||
admin: "Admin"
|
admin: "Administrador"
|
||||||
manager: "Manager"
|
manager: "Gestor"
|
||||||
reduce_panel: "Reduzir painel"
|
reduce_panel: "Reduzir painel"
|
||||||
#left menu (public)
|
#left menu (public)
|
||||||
home: "Início"
|
home: "Início"
|
||||||
reserve_a_machine: "Reservar Máquina"
|
reserve_a_machine: "Reservar Máquina"
|
||||||
trainings_registrations: "Registro de treinamentos"
|
trainings_registrations: "Treinamentos"
|
||||||
events_registrations: "Registro de Eventos"
|
events_registrations: "Eventos"
|
||||||
reserve_a_space: "Reserva de espaço"
|
reserve_a_space: "Reservar Espaço"
|
||||||
projects_gallery: "Galeria de Projetos"
|
projects_gallery: "Galeria de Projetos"
|
||||||
subscriptions: "Assinaturas"
|
subscriptions: "Assinaturas"
|
||||||
public_calendar: "Agenda"
|
public_calendar: "Agenda"
|
||||||
@ -52,7 +52,7 @@ pt:
|
|||||||
projects: "Projetos"
|
projects: "Projetos"
|
||||||
statistics: "Estatísticas"
|
statistics: "Estatísticas"
|
||||||
customization: "Customizações"
|
customization: "Customizações"
|
||||||
open_api_clients: "OpenAPI clients"
|
open_api_clients: "Clientes OpenAPI"
|
||||||
#account creation modal
|
#account creation modal
|
||||||
create_your_account: "Criar sua conta"
|
create_your_account: "Criar sua conta"
|
||||||
man: "Masculino"
|
man: "Masculino"
|
||||||
@ -87,13 +87,13 @@ pt:
|
|||||||
i_accept_to_receive_information_from_the_fablab: "Eu aceito receber informações do FabLab"
|
i_accept_to_receive_information_from_the_fablab: "Eu aceito receber informações do FabLab"
|
||||||
i_ve_read_and_i_accept_: "Eu li e aceito"
|
i_ve_read_and_i_accept_: "Eu li e aceito"
|
||||||
_the_fablab_policy: "a política do FabLab"
|
_the_fablab_policy: "a política do FabLab"
|
||||||
field_required: "Field required"
|
field_required: "Campo obrigatório"
|
||||||
unexpected_error_occurred: "An unexpected error occurred. Please try again later."
|
unexpected_error_occurred: "Ocorreu um erro inesperado. Por favor, tenta novamente mais tarde."
|
||||||
used_for_statistics: "This data will be used for statistical purposes"
|
used_for_statistics: "Estes dados serão utilizados para fins estatísticos"
|
||||||
used_for_invoicing: "This data will be used for billing purposes"
|
used_for_invoicing: "Esses dados serão usados para fins de faturamento"
|
||||||
used_for_reservation: "This data will be used in case of change on one of your bookings"
|
used_for_reservation: "Estes dados serão utilizados em caso de alteração em uma das suas reservas"
|
||||||
used_for_profile: "This data will only be displayed on your profile"
|
used_for_profile: "Estes dados serão exibidos apenas no seu perfil"
|
||||||
public_profile: "You will have a public profile and other users will be able to associate you in their projects"
|
public_profile: "Você terá um perfil público e outros usuários poderão associá-lo em seus projetos"
|
||||||
you_will_receive_confirmation_instructions_by_email_detailed: "Você receberá um email com instruções sobre como confirmar sua conta em alguns minutos."
|
you_will_receive_confirmation_instructions_by_email_detailed: "Você receberá um email com instruções sobre como confirmar sua conta em alguns minutos."
|
||||||
#password modification modal
|
#password modification modal
|
||||||
change_your_password: "Mudar sua senha"
|
change_your_password: "Mudar sua senha"
|
||||||
@ -114,14 +114,14 @@ pt:
|
|||||||
you_will_receive_in_a_moment_an_email_with_instructions_to_reset_your_password: "Você irá receber um e-mail com as instruções para resetar sua senha."
|
you_will_receive_in_a_moment_an_email_with_instructions_to_reset_your_password: "Você irá receber um e-mail com as instruções para resetar sua senha."
|
||||||
#Fab-manager's version
|
#Fab-manager's version
|
||||||
version: "Versão:"
|
version: "Versão:"
|
||||||
upgrade_fabmanager: "Upgrade Fab-manager"
|
upgrade_fabmanager: "Atualizar Fab-manager"
|
||||||
current_version: "You are currently using version {VERSION} of Fab-manager."
|
current_version: "Você está usando a versão {VERSION} do Fab-manager."
|
||||||
upgrade_to: "A new release is available. You can upgrade up to version {VERSION}."
|
upgrade_to: "Uma nova versão está disponível. Você pode atualizar até a versão {VERSION}."
|
||||||
read_more: "View the details of this release"
|
read_more: "Veja os detalhes dessa versão"
|
||||||
security_version_html: "<strong>Your current version is vulnerable!</strong><br> A later version, currently available, includes security fixes. Upgrade as soon as possible!"
|
security_version_html: "<strong>Sua versão atual está vulnerável!</strong><br> Uma versão posterior, atualmente disponível, inclui correções de segurança. Atualize o mais rápido possível!"
|
||||||
how_to: "How to upgrade?"
|
how_to: "Como fazer a atualização?"
|
||||||
#Notifications
|
#Notifications
|
||||||
and_NUMBER_other_notifications: "and {NUMBER, plural, =0{no other notifications} =1{one other notification} other{{NUMBER} other notifications}}..."
|
and_NUMBER_other_notifications: "e {NUMBER, plural, =0{sem notificação} =1{uma notificação} other{{NUMBER} notificações}}..."
|
||||||
#about page
|
#about page
|
||||||
about:
|
about:
|
||||||
read_the_fablab_policy: "Ler a política do FabLab"
|
read_the_fablab_policy: "Ler a política do FabLab"
|
||||||
@ -173,19 +173,19 @@ pt:
|
|||||||
rough_draft: "Rascunho"
|
rough_draft: "Rascunho"
|
||||||
#details of a projet
|
#details of a projet
|
||||||
projects_show:
|
projects_show:
|
||||||
rough_draft: "Draft"
|
rough_draft: "Rascunho"
|
||||||
project_description: "Descrição do projeto"
|
project_description: "Descrição do projeto"
|
||||||
by_name: "Por {NAME}"
|
by_name: "Por {NAME}"
|
||||||
step_N: "Step {INDEX}"
|
step_N: "Passo {INDEX}"
|
||||||
share_on_facebook: "Share on Facebook"
|
share_on_facebook: "Compartilhar no Facebook"
|
||||||
share_on_twitter: "Share on Twitter"
|
share_on_twitter: "Compartilhar no Twitter"
|
||||||
deleted_user: "Deleted user"
|
deleted_user: "Usuário deletado"
|
||||||
posted_on_: "Criado em"
|
posted_on_: "Criado em"
|
||||||
CAD_file_to_download: "{COUNT, plural, =0{No CAD files} =1{CAD file to download} other{CAD files to download}}"
|
CAD_file_to_download: "{COUNT, plural, =0{Sem arquivos CAD} =1{Arquivo CAD para download} other{Arquivos CAD para download}}"
|
||||||
machines_and_materials: "Machines and materials"
|
machines_and_materials: "Máquinas e materiais"
|
||||||
collaborators: "Collaborators"
|
collaborators: "Colaboradores"
|
||||||
licence: "Licença"
|
licence: "Licença"
|
||||||
confirmation_required: "Confirmation required"
|
confirmation_required: "Confirmação obrigatória"
|
||||||
report_an_abuse: "Denunciar"
|
report_an_abuse: "Denunciar"
|
||||||
unauthorized_operation: "Operação não autorizada"
|
unauthorized_operation: "Operação não autorizada"
|
||||||
your_report_was_successful_thanks: "Sua denúncia foi enviada com sucesso. Obrigado."
|
your_report_was_successful_thanks: "Sua denúncia foi enviada com sucesso. Obrigado."
|
||||||
@ -204,7 +204,7 @@ pt:
|
|||||||
machines_list:
|
machines_list:
|
||||||
the_fablab_s_machines: "Lista de máquinas no FabLab"
|
the_fablab_s_machines: "Lista de máquinas no FabLab"
|
||||||
add_a_machine: "Adicionar uma máquina"
|
add_a_machine: "Adicionar uma máquina"
|
||||||
new_availability: "Open reservations"
|
new_availability: "Reservas em aberto"
|
||||||
book: "Reservar"
|
book: "Reservar"
|
||||||
_or_the_: " ou o "
|
_or_the_: " ou o "
|
||||||
status_enabled: "Ativo"
|
status_enabled: "Ativo"
|
||||||
@ -213,24 +213,24 @@ pt:
|
|||||||
#details of a machine
|
#details of a machine
|
||||||
machines_show:
|
machines_show:
|
||||||
book_this_machine: "Reservar essa máquina"
|
book_this_machine: "Reservar essa máquina"
|
||||||
technical_specifications: "Technical specifications"
|
technical_specifications: "Especificações técnicas"
|
||||||
files_to_download: "Arquivos para download"
|
files_to_download: "Arquivos para download"
|
||||||
projects_using_the_machine: "Projetos usando esta máquina"
|
projects_using_the_machine: "Projetos usando esta máquina"
|
||||||
_or_the_: " ou o "
|
_or_the_: " ou o "
|
||||||
confirmation_required: "Confirmation required"
|
confirmation_required: "Confirmação obrigatória"
|
||||||
do_you_really_want_to_delete_this_machine: "Você realmente quer deletar essa máquina?"
|
do_you_really_want_to_delete_this_machine: "Você realmente quer deletar essa máquina?"
|
||||||
unauthorized_operation: "Operação não autorizada"
|
unauthorized_operation: "Operação não autorizada"
|
||||||
the_machine_cant_be_deleted_because_it_is_already_reserved_by_some_users: "Esta máquina não pode ser deletada, pois já está em reservada por alguns usuários."
|
the_machine_cant_be_deleted_because_it_is_already_reserved_by_some_users: "Esta máquina não pode ser deletada, pois já está em reservada por alguns usuários."
|
||||||
#list of trainings
|
#list of trainings
|
||||||
trainings_list:
|
trainings_list:
|
||||||
book: "Book"
|
book: "Reservar"
|
||||||
the_trainings: "Os treinamentos"
|
the_trainings: "Os treinamentos"
|
||||||
#details of a training
|
#details of a training
|
||||||
training_show:
|
training_show:
|
||||||
book_this_training: "Reservar este treinamento"
|
book_this_training: "Reservar este treinamento"
|
||||||
do_you_really_want_to_delete_this_training: "Você realmente quer deletar esse treinamento?"
|
do_you_really_want_to_delete_this_training: "Você realmente quer deletar esse treinamento?"
|
||||||
unauthorized_operation: "Operação não autorizada"
|
unauthorized_operation: "Operação não autorizada"
|
||||||
confirmation_required: "Confirmation required"
|
confirmation_required: "Confirmação obrigatória"
|
||||||
the_training_cant_be_deleted_because_it_is_already_reserved_by_some_users: "O treinamento não pode ser deletado pois já foi reservado por alguns usuários."
|
the_training_cant_be_deleted_because_it_is_already_reserved_by_some_users: "O treinamento não pode ser deletado pois já foi reservado por alguns usuários."
|
||||||
#summary of the subscriptions
|
#summary of the subscriptions
|
||||||
plans:
|
plans:
|
||||||
@ -240,19 +240,19 @@ pt:
|
|||||||
i_already_subscribed: "Eu já estou inscrito"
|
i_already_subscribed: "Eu já estou inscrito"
|
||||||
more_information: "Mais informação"
|
more_information: "Mais informação"
|
||||||
your_subscription_expires_on_the_DATE: "Sua inscrição expira em {DATE}"
|
your_subscription_expires_on_the_DATE: "Sua inscrição expira em {DATE}"
|
||||||
no_plans: "No plans are available for your group"
|
no_plans: "Não há planos disponíveis para o seu grupo"
|
||||||
my_group: "Meu grupo"
|
my_group: "Meu grupo"
|
||||||
his_group: "{GENDER, select, male{Ele} female{Ela} other{Esses}} grupo"
|
his_group: "{GENDER, select, male{Ele} female{Ela} other{Esses}} grupo"
|
||||||
he_wants_to_change_group: "{ROLE, select, member{Eu quero} other{O usuário quer}} trocar de grupo"
|
he_wants_to_change_group: "{ROLE, select, member{Eu quero} other{O usuário quer}} trocar de grupo"
|
||||||
change_my_group: "Mudar {ROLE, select, member{meu} other{{GENDER, select, other{seu}}}} grupo"
|
change_my_group: "Mudar {ROLE, select, member{meu} other{{GENDER, select, other{seu}}}} grupo"
|
||||||
summary: "Summary"
|
summary: "Sumário"
|
||||||
your_subscription_has_expired_on_the_DATE: "Sua inscrição expirou em {DATE}"
|
your_subscription_has_expired_on_the_DATE: "Sua inscrição expirou em {DATE}"
|
||||||
subscription_price: "Subscription price"
|
subscription_price: "Preço da assinatura"
|
||||||
you_ve_just_selected_a_subscription_html: "You've just selected a <strong>subscription</strong>:"
|
you_ve_just_selected_a_subscription_html: "Você acabou de selecionar uma <strong>assinatura</strong>:"
|
||||||
confirm_and_pay: "Confirm and pay"
|
confirm_and_pay: "Confirmar e pagar"
|
||||||
you_ve_just_payed_the_subscription_html: "Você acabou de pagar o <strong>inscrição</strong>:"
|
you_ve_just_payed_the_subscription_html: "Você acabou de pagar o <strong>inscrição</strong>:"
|
||||||
thank_you_your_subscription_is_successful: "Obrigado. Sua inscrição foi feita com sucesso!"
|
thank_you_your_subscription_is_successful: "Obrigado. Sua inscrição foi feita com sucesso!"
|
||||||
your_invoice_will_be_available_soon_from_your_dashboard: "Your invoice will be available soon from your dashboard"
|
your_invoice_will_be_available_soon_from_your_dashboard: "Sua fatura estará disponível em breve a partir do seu painel de controle"
|
||||||
your_group_was_successfully_changed: "Seu grupo foi alterado com sucesso."
|
your_group_was_successfully_changed: "Seu grupo foi alterado com sucesso."
|
||||||
the_user_s_group_was_successfully_changed: "O grupo de usuários foi alterado com sucesso."
|
the_user_s_group_was_successfully_changed: "O grupo de usuários foi alterado com sucesso."
|
||||||
an_error_prevented_your_group_from_being_changed: "Um erro impediu que seu grupo fosse alterado."
|
an_error_prevented_your_group_from_being_changed: "Um erro impediu que seu grupo fosse alterado."
|
||||||
@ -260,8 +260,8 @@ pt:
|
|||||||
an_error_occured_during_the_payment_process_please_try_again_later: "Um erro ocorreu durante o processo de pagamento. Por favor tente novamente mais tarde."
|
an_error_occured_during_the_payment_process_please_try_again_later: "Um erro ocorreu durante o processo de pagamento. Por favor tente novamente mais tarde."
|
||||||
subscription_confirmation: "Inscrição confirmada"
|
subscription_confirmation: "Inscrição confirmada"
|
||||||
here_is_the_NAME_subscription_summary: "Aqui é o sumário de inscrição do {NAME}:"
|
here_is_the_NAME_subscription_summary: "Aqui é o sumário de inscrição do {NAME}:"
|
||||||
confirm_payment_of_html: "{ROLE, select, admin{Cash} other{Pay}}: {AMOUNT}" #(contexte : validate a payment of $20,00)
|
confirm_payment_of_html: "{ROLE, select, admin{Pagamento pelo site} other{Pagamento}}: {AMOUNT}" #(contexte : validate a payment of $20,00)
|
||||||
online_payment_disabled: "Payment by credit card is not available. Please contact the FabLab's reception directly."
|
online_payment_disabled: "Pagamento por cartão de crédito não está disponível. Por favor, contate a recepção do FabLab diretamente."
|
||||||
#Fablab's events list
|
#Fablab's events list
|
||||||
events_list:
|
events_list:
|
||||||
the_fablab_s_events: "Eventos do Fablab"
|
the_fablab_s_events: "Eventos do Fablab"
|
||||||
@ -272,61 +272,61 @@ pt:
|
|||||||
free_admission: "Admissão grátis"
|
free_admission: "Admissão grátis"
|
||||||
still_available: "lugares disponíveis"
|
still_available: "lugares disponíveis"
|
||||||
without_reservation: "Sem reservas"
|
without_reservation: "Sem reservas"
|
||||||
add_an_event: "Add an event"
|
add_an_event: "Adicionar um evento"
|
||||||
load_the_next_events: "Load the next events..."
|
load_the_next_events: "Carregar os próximos eventos..."
|
||||||
full_price_: "Valor inteira:"
|
full_price_: "Valor inteira:"
|
||||||
to_date: "to" #eg. from 01/01 to 01/05
|
to_date: "até" #eg. from 01/01 to 01/05
|
||||||
all_themes: "All themes"
|
all_themes: "Todos os temas"
|
||||||
#details and booking of an event
|
#details and booking of an event
|
||||||
events_show:
|
events_show:
|
||||||
event_description: "Descrição do evento"
|
event_description: "Descrição do evento"
|
||||||
downloadable_documents: "Documentos para download"
|
downloadable_documents: "Documentos para download"
|
||||||
information_and_booking: "Informações e reservas"
|
information_and_booking: "Informações e reservas"
|
||||||
dates: "Dates"
|
dates: "Datas"
|
||||||
beginning: "Início:"
|
beginning: "Início:"
|
||||||
ending: "Término:"
|
ending: "Término:"
|
||||||
opening_hours: "Abre ás:"
|
opening_hours: "Abre ás:"
|
||||||
all_day: "O dia inteiro"
|
all_day: "O dia inteiro"
|
||||||
from_time: "From" #eg. from 18:00 to 21:00
|
from_time: "Das" #eg. from 18:00 to 21:00
|
||||||
to_time: "to" #eg. from 18:00 to 21:00
|
to_time: "ás" #eg. from 18:00 to 21:00
|
||||||
full_price_: "Valor inteira:"
|
full_price_: "Valor inteira:"
|
||||||
tickets_still_availables: "Tickets ainda disponíveis:"
|
tickets_still_availables: "Tickets ainda disponíveis:"
|
||||||
sold_out: "Esgotado."
|
sold_out: "Esgotado."
|
||||||
without_reservation: "Sem reservas"
|
without_reservation: "Sem reservas"
|
||||||
cancelled: "Cancelado"
|
cancelled: "Cancelado"
|
||||||
ticket: "{NUMBER, plural, one{ticket} other{tickets}}"
|
ticket: "{NUMBER, plural, one{ingresso} other{ingressos}}"
|
||||||
make_a_gift_of_this_reservation: "Doe esta reserva"
|
make_a_gift_of_this_reservation: "Doe esta reserva"
|
||||||
thank_you_your_payment_has_been_successfully_registered: "Tank you. Your payment has been successfully registered!"
|
thank_you_your_payment_has_been_successfully_registered: "Obrigado. Seu pagamento foi registrado com sucesso!"
|
||||||
you_can_find_your_reservation_s_details_on_your_: "Você pode encontrar detalhes da sua reserva em seu"
|
you_can_find_your_reservation_s_details_on_your_: "Você pode encontrar detalhes da sua reserva em seu"
|
||||||
dashboard: "dashboard"
|
dashboard: "painel de controle"
|
||||||
you_booked_DATE: "Sua reserva ({DATE}):"
|
you_booked_DATE: "Sua reserva ({DATE}):"
|
||||||
canceled_reservation_SEATS: "Reservation canceled ({SEATS} seats)"
|
canceled_reservation_SEATS: "Reserva cancelada ({SEATS} lugares)"
|
||||||
book: "Reservar"
|
book: "Reservar"
|
||||||
confirm_and_pay: "Confirm and pay"
|
confirm_and_pay: "Confirmar e pagar"
|
||||||
confirm_payment_of_html: "{ROLE, select, admin{Cash} other{Pay}}: {AMOUNT}" #(contexte : validate a payment of $20,00)
|
confirm_payment_of_html: "{ROLE, select, admin{Pagamento pelo site} other{Pagamento}}: {AMOUNT}" #(contexte : validate a payment of $20,00)
|
||||||
online_payment_disabled: "Payment by credit card is not available. Please contact the FabLab's reception directly."
|
online_payment_disabled: "Pagamento por cartão de crédito não está disponível. Por favor, contate a recepção do FabLab diretamente."
|
||||||
please_select_a_member_first: "Please select a member first"
|
please_select_a_member_first: "Por favor, selecione um membro primeiro"
|
||||||
change_the_reservation: "Alterar reserva"
|
change_the_reservation: "Alterar reserva"
|
||||||
you_can_shift_this_reservation_on_the_following_slots: "Você pode alterar essa reserva nos campos a seguir:"
|
you_can_shift_this_reservation_on_the_following_slots: "Você pode alterar essa reserva nos campos a seguir:"
|
||||||
confirmation_required: "Confirmação obrigatória"
|
confirmation_required: "Confirmação obrigatória"
|
||||||
do_you_really_want_to_delete_this_event: "Vocêrealmente deseja remover este evento?"
|
do_you_really_want_to_delete_this_event: "Vocêrealmente deseja remover este evento?"
|
||||||
delete_recurring_event: "You're about to delete a periodic event. What do you want to do?"
|
delete_recurring_event: "Você está prestes a excluir um evento periódico. O que você deseja fazer?"
|
||||||
delete_this_event: "Only this event"
|
delete_this_event: "Apenas este evento"
|
||||||
delete_this_and_next: "This event and the following"
|
delete_this_and_next: "Este evento e os seguintes"
|
||||||
delete_all: "All events"
|
delete_all: "Todos eventos"
|
||||||
event_successfully_deleted: "Evento excluído com sucesso."
|
event_successfully_deleted: "Evento excluído com sucesso."
|
||||||
events_deleted: "The event, and {COUNT, plural, =1{one other} other{{COUNT} others}}, have been deleted"
|
events_deleted: "O evento e {COUNT, plural, one {} =1{mais um} other{{COUNT} outros}}, foram excluídos"
|
||||||
unable_to_delete_the_event: "Unable to delete the event, it may be booked by a member"
|
unable_to_delete_the_event: "Não é possível excluir o evento, ele pode ser reservado por um membro"
|
||||||
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}}."
|
events_not_deleted: "Em {TOTAL} eventos, {COUNT, plural, one {} =1{um não foi deletado. } other{{COUNT} não foram deletados. }}Talvez existam algumas reservas {COUNT, plural, =1{nele} other{neles}}."
|
||||||
cancel_the_reservation: "Cancel the reservation"
|
cancel_the_reservation: "Cancelar a reserva"
|
||||||
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."
|
do_you_really_want_to_cancel_this_reservation_this_apply_to_all_booked_tickets: "Você realmente deseja cancelar esta reserva? Isto se aplica a TODOS os pedidos reservados."
|
||||||
reservation_was_successfully_cancelled: "Reservation was successfully cancelled."
|
reservation_was_successfully_cancelled: "A reserva foi cancelada com sucesso."
|
||||||
cancellation_failed: "Cancellation failed."
|
cancellation_failed: "Cancelamento falhou."
|
||||||
event_is_over: "The event is over."
|
event_is_over: "O Evento acabou."
|
||||||
thanks_for_coming: "Thanks for coming!"
|
thanks_for_coming: "Obrigado por ter vindo!"
|
||||||
view_event_list: "View events to come"
|
view_event_list: "Visualizar próximos eventos"
|
||||||
share_on_facebook: "Share on Facebook"
|
share_on_facebook: "Compartilhar no Facebook"
|
||||||
share_on_twitter: "Share on Twitter"
|
share_on_twitter: "Compartilhar no Twitter"
|
||||||
#public calendar
|
#public calendar
|
||||||
calendar:
|
calendar:
|
||||||
calendar: "Calendário"
|
calendar: "Calendário"
|
||||||
@ -340,7 +340,7 @@ pt:
|
|||||||
#list of spaces
|
#list of spaces
|
||||||
spaces_list:
|
spaces_list:
|
||||||
the_spaces: "Os espaços"
|
the_spaces: "Os espaços"
|
||||||
new_availability: "Open reservations"
|
new_availability: "Reservas abertas"
|
||||||
add_a_space: "Adicionar espaço"
|
add_a_space: "Adicionar espaço"
|
||||||
status_enabled: "Ativo"
|
status_enabled: "Ativo"
|
||||||
status_disabled: "Desabilitado"
|
status_disabled: "Desabilitado"
|
||||||
@ -358,92 +358,92 @@ pt:
|
|||||||
projects_using_the_space: "Projetos usando espaço"
|
projects_using_the_space: "Projetos usando espaço"
|
||||||
tour:
|
tour:
|
||||||
conclusion:
|
conclusion:
|
||||||
title: "Thank you for your attention"
|
title: "Obrigado pela sua atenção"
|
||||||
content: "<p>If you want to restart this contextual help, press <strong>F1</strong> at any time or click on « ? Help » from the user's menu.</p><p>If you need additional help, you can <a href='https://github.com/sleede/fab-manager/raw/master/doc/fr/guide_utilisation_fab_manager_v4.5.pdf' target='_blank'>check the user guide</a> (only in French for now).</p><p>The Fab-manager's team also provides personalized support (help with getting started, help with installation, customization, etc.), <a href='mailto:contact@fab-manager.com'>contact-us</a> for more info.</p>"
|
content: "<p>Se você deseja reiniciar esta ajuda contextual, pressione <strong>F1</strong> a qualquer momento ou clique em « ? Ajuda » no menu do usuário.</p><p>Se precisar de ajuda adicional, você pode <a href='https://github.com/sleede/fab-manager/raw/master/doc/fr/guide_utilisation_fab_manager_v4.5.pdf' target='_blank'>verificar o guia do usuário</a> (apenas em francês por enquanto).</p><p>A equipe do Fab-Gerente também fornece suporte personalizado (ajuda para começar, ajuda com a instalação, personalização, etc.) , <a href='mailto:contact@fab-manager.com'>contacte-nos</a> para mais informações.</p>"
|
||||||
welcome:
|
welcome:
|
||||||
welcome:
|
welcome:
|
||||||
title: "Welcome to Fab-manager"
|
title: "Bem-vindo ao Fab-manager"
|
||||||
content: "To help you get started with the application, we are going to take a quick tour of the features."
|
content: "Para ajudar você a começar o aplicativo, vamos fazer um rápido tour pelos recursos."
|
||||||
home:
|
home:
|
||||||
title: "Home page"
|
title: "Página inicial"
|
||||||
content: "Clicking here will take you back to the home page where you are currently."
|
content: "Clicar aqui te levará de volta à página inicial onde você está atualmente."
|
||||||
machines:
|
machines:
|
||||||
title: "Machines"
|
title: "Máquinas"
|
||||||
content: "<p>This page will allow you to consult the list of all machines and reserve a slot on behalf of a member.</p><p>A machine can be, for example, a 3D printer.</p><p>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.</p>"
|
content: "<p>Esta página permitirá que você consulte a lista de todas as máquinas e reserve um slot em nome de um membro.</p><p>Uma máquina pode ser, por exemplo, uma impressora 3D.</p><p>Membros também podem acessar esta página e reservar uma máquina eles mesmos, se o pagamento com cartão de crédito estiver ativado, ou se alguns preços são iguais a 0.</p>"
|
||||||
trainings:
|
trainings:
|
||||||
title: "Trainings"
|
title: "Treinamentos"
|
||||||
content: "<p>This page will allow you to consult the list of all training sessions and to register a member for a training session.</p><p>Trainings can be set as prerequisites before allowing reservation of certain machines.</p><p>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.</p>"
|
content: "<p>Esta página permitirá que você consulte a lista de todas as máquinas e reserve um slot em nome de um membro.</p><p>Uma máquina pode ser, por exemplo, uma impressora 3D.</p><p>Membros também podem acessar esta página e reservar uma máquina eles mesmos, se o pagamento com cartão de crédito estiver ativado, ou se alguns preços são iguais a 0.</p>"
|
||||||
spaces:
|
spaces:
|
||||||
title: "Spaces"
|
title: "Espaços"
|
||||||
content: "<p>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.</p><p>A space can be, for example, a woodshop or a meeting room.</p><p>Their particularity is that they can be booked by several people at the same time.</p><p>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.</p>"
|
content: "<p>Esta página permitirá que você consulte a lista de todos os espaços disponíveis e reservar um lugar em um slot, em nome de um membro.</p><p>Um espaço pode ser, por exemplo, uma floresta ou uma sala de reunião.</p><p>A particularidade deles é que podem ser reservados por várias pessoas ao mesmo tempo.</p><p>Membros também podem acessar esta página e reservar uma máquina eles mesmos, se o pagamento com cartão de crédito estiver ativado, ou se alguns preços são iguais a 0.</p>"
|
||||||
events:
|
events:
|
||||||
title: "Events"
|
title: "Eventos"
|
||||||
content: "<p>An open house evening or an internship to make your desk lamp? It's over here!</p><p>Events can be free or paid (with different prices), with or without reservation.</p><p>Again, members can access this page and book themselves places for free events, or paid events if credit card payment is enabled.</p>"
|
content: "<p>Uma noite em casa ou um estágio para fazer a sua lâmpada de mesa? </p><p>Os eventos podem ser gratuitos ou pagos (com preços diferentes), com ou sem reservas.</p><p>Mais uma vez, membros podem acessar esta página e reservar lugares para eventos gratuitos ou eventos pagos se o pagamento por cartão de crédito for ativado.</p>"
|
||||||
calendar:
|
calendar:
|
||||||
title: "Agenda"
|
title: "Agenda"
|
||||||
content: "Visualize at a glance everything that is scheduled for the next coming weeks (events, training, machines available, etc.)."
|
content: "Visualize de imediato tudo o que estiver agendado para as próximas semanas (eventos, formação, máquinas disponíveis, etc.)."
|
||||||
projects:
|
projects:
|
||||||
title: "Projetos"
|
title: "Projetos"
|
||||||
content: "<p>Document and share all your creations with the community.</p><p>If you use OpenLab, you will also be able to consult the projects of the entire Fab-manager network. <a href='mailto:contact@fab-manager.com'>Contact-us</a> to get your access, it's free!</p>"
|
content: "<p>Documentar e compartilhar todas as suas criações com a comunidade.</p><p>Se você usar o OpenLab, você também será capaz de consultar os projetos de toda a rede Fab-Manager. <a href='mailto:contact@fab-manager.com'>Entre em contato conosco</a> para obter seu acesso, é grátis!</p>"
|
||||||
plans:
|
plans:
|
||||||
title: "Subscriptions"
|
title: "Assinaturas"
|
||||||
content: "Subscriptions provide a way to segment your prices and provide benefits to regular users."
|
content: "As assinaturas fornecem uma maneira de segmentar seus preços e proporcionar benefícios aos usuários normais."
|
||||||
admin:
|
admin:
|
||||||
title: "{ROLE} section"
|
title: "{ROLE} seção"
|
||||||
content: "<p>All of the elements below are only accessible to administrators and managers. They allow you to manage and configure Fab-manager.</p><p>At the end of this visit, click on one of them to find out more.</p>"
|
content: "<p>Todos os elementos abaixo só são acessíveis a administradores e gerentes. Eles permitem que você gerencie e e configure o Fab-manager.</p><p>No final desta visita, clique em um deles para saber mais.</p>"
|
||||||
about:
|
about:
|
||||||
title: "About"
|
title: "Sobre"
|
||||||
content: "A page that you can fully customize, to present your activity and your structure."
|
content: "Uma página que você pode personalizar completamente, para apresentar sua atividade e sua estrutura."
|
||||||
notifications:
|
notifications:
|
||||||
title: "Notifications center"
|
title: "Centro de notificações"
|
||||||
content: "<p>Every time something important happens (reservations, creation of accounts, activity of your members, etc.), you will be notified here.</p><p>Your members also receive notifications there.</p>"
|
content: "<p>Toda vez que algo importante acontece (reservas, criação de contas, atividade de seus membros, etc., você será notificado aqui.</p><p>Seus membros também recebem notificações lá.</p>"
|
||||||
profile:
|
profile:
|
||||||
title: "User's menu"
|
title: "Menu do usuário"
|
||||||
content: "<p>Find your personal information here as well as all your activity on Fab-manager.</p><p>This space is also available for all your members.</p>"
|
content: "<p>Encontre suas informações pessoais aqui bem como todas as suas atividades no Fab-manager.</p><p>Esta comunidade também está disponível para todos os seus membros.</p>"
|
||||||
news:
|
news:
|
||||||
title: "News"
|
title: "Notícias"
|
||||||
content: "<p>This space allows you to display the latest news from your structure.</p><p>You can easily change its content from « Customization », « Home page ».</p>"
|
content: "<p>Este espaço permite exibir as últimas notícias de sua estrutura.</p><p>Você pode facilmente alterar seu conteúdo de « Personalização », « Página inicial».</p>"
|
||||||
last_projects:
|
last_projects:
|
||||||
title: "Últimos projetos"
|
title: "Últimos projetos"
|
||||||
content: "<p>This carousel scrolls through the latest projects documented by your members.</p>"
|
content: "<p>Este carrosel rola os últimos projetos documentados pelos seus membros.</p>"
|
||||||
last_tweet:
|
last_tweet:
|
||||||
title: "Last tweet"
|
title: "Último tweet"
|
||||||
content: "<p>The last tweet of your Tweeter feed can be shown here.</p><p>Configure it from « Customization », « Home page ».</p>"
|
content: "<p>O último tweet do seu feed de Tweeter pode ser mostrado aqui.</p><p>Configure-o a partir de « Personalização », « Página inicial ».</p>"
|
||||||
last_members:
|
last_members:
|
||||||
title: "Last members"
|
title: "Últimos membros"
|
||||||
content: "The last registered members who have validated their address and agreed to be contacted will be shown here."
|
content: "Os últimos membros cadastrados que validaram seu endereço e concordaram em ser contatados serão mostrados aqui."
|
||||||
next_events:
|
next_events:
|
||||||
title: "Upcoming events"
|
title: "Próximos eventos"
|
||||||
content: "The next three scheduled events are displayed in this space."
|
content: "Os próximos três eventos agendados são exibidos neste espaço."
|
||||||
customize:
|
customize:
|
||||||
title: "Customize the home page"
|
title: "Personalizar a página inicial"
|
||||||
content: "<p>This page can be fully personalized.</p><p>You can <a href='mailto:contact@fab-manager.com'>contact-us</a> to make a tailored customization of the home page.</p>"
|
content: "<p>Esta página pode ser totalmente personalizada.</p><p>Você pode <a href='mailto:contact@fab-manager.com'>contacte-nos</a> para fazer uma personalização personalizada da página inicial.</p>"
|
||||||
version:
|
version:
|
||||||
title: "Application version"
|
title: "Versão da aplicação"
|
||||||
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."
|
content: "Passe o mouse sobre este ícone para descobrir a versão do Fab-manager. Se você não estiver atualizado, este será reportado aqui e você poderá obter detalhes clicando nele."
|
||||||
machines:
|
machines:
|
||||||
welcome:
|
welcome:
|
||||||
title: "Machines"
|
title: "Máquinas"
|
||||||
content: "<p>Machines are the tools available for your users. You must create here the machines which can then be reserved by the members.</p><p>You can also create entries for non-bookable or free access machines, then you just need to not associate availability slots with them.</p>"
|
content: "<p>Máquinas são as ferramentas disponíveis para seus usuários. Você deve criar aqui as máquinas que podem ser reservadas pelos membros.</p><p>Você também pode criar entradas para máquinas de acesso não-reservadas ou gratuitas, então você só precisa não associar slots de disponibilidade com elas.</p>"
|
||||||
welcome_manager:
|
welcome_manager:
|
||||||
title: "Machines"
|
title: "Máquinas"
|
||||||
content: "Machines are the tools available for the users to reserve."
|
content: "Máquinas são as ferramentas disponíveis para reservar aos usuários."
|
||||||
view:
|
view:
|
||||||
title: "View"
|
title: "Visualizar"
|
||||||
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."
|
content: "Para modificar ou excluir uma máquina, clique aqui primeiro. Você não poderá excluir uma máquina que já tenha sido associada com slots de disponibilidade, mas você pode desativá-la."
|
||||||
reserve:
|
reserve:
|
||||||
title: "Reserve"
|
title: "Reservar"
|
||||||
content: "Click here to access an agenda showing free slots. This will let you book this machine for an user and manage existing reservations."
|
content: "Clique aqui para acessar uma agenda mostrando espaços livres. Isso permitirá que você reserve esta máquina para um usuário e gerencie as reservas existentes."
|
||||||
spaces:
|
spaces:
|
||||||
welcome:
|
welcome:
|
||||||
title: "Spaces"
|
title: "Espaços"
|
||||||
content: "<p>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.</p><p>The specificity of the spaces is that they can be reserved by several users at the same time.</p>"
|
content: "<p>Espaços são lugares disponíveis para seus usuários. Por exemplo, uma sala de reunião ou uma bancada. Você deve criar aqui os espaços que podem ser reservados pelos membros.</p><p>A especificidade dos espaços é que eles podem ser reservados por vários usuários ao mesmo tempo.</p>"
|
||||||
welcome_manager:
|
welcome_manager:
|
||||||
title: "Spaces"
|
title: "Espaços"
|
||||||
content: "<p>Spaces are places available to users, by reservation. For example, a meeting room or a woodshop.</p><p>The specificity of the spaces is that they can be reserved by several users at the same time.</p>"
|
content: "<p>Espaços são locais disponíveis para os usuários, por reserva. Por exemplo, uma sala de reunião ou uma bancada.</p><p>A especificidade dos espaços é que eles podem ser reservados por vários usuários ao mesmo tempo.</p>"
|
||||||
view:
|
view:
|
||||||
title: "View"
|
title: "Visualizar"
|
||||||
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."
|
content: "Para modificar ou deletar um espaço, clique aqui primeiro. Você não poderá excluir um espaço que já tenha sido associado com slots de disponibilidade, mas você pode desativá-lo."
|
||||||
reserve:
|
reserve:
|
||||||
title: "Reserve"
|
title: "Reservar"
|
||||||
content: "Click here to access an agenda showing free slots. This will let you book this space for an user and manage existing reservations."
|
content: "Clique aqui para acessar uma agenda mostrando espaços livres. Isso permitirá que você reserve este espaço para um usuário e gerencie as reservas existentes."
|
||||||
|
@ -117,11 +117,11 @@ en:
|
|||||||
#stripe payment modal
|
#stripe payment modal
|
||||||
stripe:
|
stripe:
|
||||||
online_payment: "Online payment"
|
online_payment: "Online payment"
|
||||||
i_have_read_and_accept_: "I have read, and accept"
|
i_have_read_and_accept_: "I have read, and accept "
|
||||||
_the_general_terms_and_conditions: "the general terms and conditions."
|
_the_general_terms_and_conditions: "the general terms and conditions."
|
||||||
credit_amount_for_pay_reservation: "{amount} {currency} remains to be paid to confirm your reservation"
|
credit_amount_for_pay_reservation: "{amount} {currency} remains to be paid to confirm your reservation"
|
||||||
client_credit_amount_for_pay_reservation: "{amount} {currency} remains to be paid to confirm reservation of client"
|
client_credit_amount_for_pay_reservation: "{amount} {currency} remains to be paid to confirm reservation of client"
|
||||||
payment_schedule: "You're about to subscribe to a payment schedule of {DEADLINES} months. By paying this bill, you agree to pay all payment deadlines."
|
payment_schedule_html: "<p>You're about to subscribe to a payment schedule of {DEADLINES} months.</p><p>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 Stripe and a series of payments will be initiated on your behalf, conforming to the payment schedule previously shown.</p>"
|
||||||
confirm_payment_of_: "Pay: {AMOUNT}"
|
confirm_payment_of_: "Pay: {AMOUNT}"
|
||||||
#dialog of on site payment for reservations
|
#dialog of on site payment for reservations
|
||||||
valid_reservation_modal:
|
valid_reservation_modal:
|
||||||
@ -413,7 +413,7 @@ en:
|
|||||||
you_ve_just_selected_a_subscription_html: "You've just selected a <strong>subscription</strong>:"
|
you_ve_just_selected_a_subscription_html: "You've just selected a <strong>subscription</strong>:"
|
||||||
monthly_payment: "Monthly payment"
|
monthly_payment: "Monthly payment"
|
||||||
your_payment_schedule: "Your payment schedule"
|
your_payment_schedule: "Your payment schedule"
|
||||||
monthly_payment_NUMBER: "{NUMBER}{NUMBER, plural, =1{st} =2{nd} =3{rd} other{th}} monthly payment:"
|
monthly_payment_NUMBER: "{NUMBER}{NUMBER, plural, =1{st} =2{nd} =3{rd} other{th}} monthly payment: "
|
||||||
NUMBER_monthly_payment_of_AMOUNT: "{NUMBER} monthly {NUMBER, plural, =1{payment} other{payments}} of {AMOUNT}"
|
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."
|
first_debit: "First debit on the day of the order."
|
||||||
debit: "Debit on the day of the order."
|
debit: "Debit on the day of the order."
|
||||||
|
@ -117,7 +117,7 @@ es:
|
|||||||
#stripe payment modal
|
#stripe payment modal
|
||||||
stripe:
|
stripe:
|
||||||
online_payment: "Online payment"
|
online_payment: "Online payment"
|
||||||
i_have_read_and_accept_: "He leido y acepto"
|
i_have_read_and_accept_: "He leido y acepto "
|
||||||
_the_general_terms_and_conditions: "Los términos y condiciones."
|
_the_general_terms_and_conditions: "Los términos y condiciones."
|
||||||
credit_amount_for_pay_reservation: "{amount} {currency} falta por pagar para efectuar su reserva"
|
credit_amount_for_pay_reservation: "{amount} {currency} falta por pagar para efectuar su reserva"
|
||||||
client_credit_amount_for_pay_reservation: "{amount} {currency} falta por pagar para efectuar la reserva del cliente"
|
client_credit_amount_for_pay_reservation: "{amount} {currency} falta por pagar para efectuar la reserva del cliente"
|
||||||
|
@ -117,11 +117,11 @@ fr:
|
|||||||
#stripe payment modal
|
#stripe payment modal
|
||||||
stripe:
|
stripe:
|
||||||
online_payment: "Paiement en ligne"
|
online_payment: "Paiement en ligne"
|
||||||
i_have_read_and_accept_: "J'ai bien pris connaissance, et accepte"
|
i_have_read_and_accept_: "J'ai bien pris connaissance, et accepte "
|
||||||
_the_general_terms_and_conditions: "les conditions générales de vente."
|
_the_general_terms_and_conditions: "les conditions générales de vente."
|
||||||
credit_amount_for_pay_reservation: "Il vous reste {amount} {currency} à payer pour valider votre réservation"
|
credit_amount_for_pay_reservation: "Il vous reste {amount} {currency} à payer pour valider votre réservation"
|
||||||
client_credit_amount_for_pay_reservation: "Il reste {amount} {currency} à payer pour valider la réservation"
|
client_credit_amount_for_pay_reservation: "Il reste {amount} {currency} à payer pour valider la réservation"
|
||||||
payment_schedule: "Vous êtes sur le point de souscrire à un échéancier de paiement de {DEADLINES} mois. En payant cette facture, vous vous engagez à payer l'ensemble des échéances."
|
payment_schedule_html: "<p>Vous êtes sur le point de souscrire à un échéancier de paiement de {DEADLINES} mois.</p><p>En payant cette facture, vous vous engagez à l'envoi d'instructions vers l'institution financière émettrice de votre carte, afin de prélever des paiements sur votre compte, pendant toute la durée de cet abonnement. Cela implique que les données de votre carte soient enregistrées par Stripe et qu'une série de paiements sera initiée en votre nom, conformément à l'échéancier de paiement précédemment affiché.</p>"
|
||||||
confirm_payment_of_: "Payer : {AMOUNT}"
|
confirm_payment_of_: "Payer : {AMOUNT}"
|
||||||
#dialog of on site payment for reservations
|
#dialog of on site payment for reservations
|
||||||
valid_reservation_modal:
|
valid_reservation_modal:
|
||||||
@ -413,7 +413,7 @@ fr:
|
|||||||
you_ve_just_selected_a_subscription_html: "Vous venez de sélectionner un <strong>abonnement</strong> :"
|
you_ve_just_selected_a_subscription_html: "Vous venez de sélectionner un <strong>abonnement</strong> :"
|
||||||
monthly_payment: "Paiement mensuel"
|
monthly_payment: "Paiement mensuel"
|
||||||
your_payment_schedule: "Votre échéancier de paiement"
|
your_payment_schedule: "Votre échéancier de paiement"
|
||||||
monthly_payment_NUMBER: "{NUMBER}{NUMBER, plural, =1{ère} other{ème}} mensualité :"
|
monthly_payment_NUMBER: "{NUMBER}{NUMBER, plural, =1{ère} other{ème}} mensualité : "
|
||||||
NUMBER_monthly_payment_of_AMOUNT: "{NUMBER} {NUMBER, plural, =1{mensualité} other{mensualités}} de {AMOUNT}"
|
NUMBER_monthly_payment_of_AMOUNT: "{NUMBER} {NUMBER, plural, =1{mensualité} other{mensualités}} de {AMOUNT}"
|
||||||
first_debit: "Premier prélèvement le jour de la commande."
|
first_debit: "Premier prélèvement le jour de la commande."
|
||||||
debit: "Prélèvement le jour de la commande."
|
debit: "Prélèvement le jour de la commande."
|
||||||
|
@ -21,24 +21,24 @@ pt:
|
|||||||
messages:
|
messages:
|
||||||
you_will_lose_any_unsaved_modification_if_you_quit_this_page: "Você irá perder todas as modificações não salvas se sair desta página"
|
you_will_lose_any_unsaved_modification_if_you_quit_this_page: "Você irá perder todas as modificações não salvas se sair desta página"
|
||||||
you_will_lose_any_unsaved_modification_if_you_reload_this_page: "Você irá perder todas as modificações não salvas se recarregar desta página"
|
you_will_lose_any_unsaved_modification_if_you_reload_this_page: "Você irá perder todas as modificações não salvas se recarregar desta página"
|
||||||
payment_card_error: "A problem has occurred with your credit card:"
|
payment_card_error: "Ocorreu um problema com o seu cartão de crédito:"
|
||||||
#user edition form
|
#user edition form
|
||||||
user:
|
user:
|
||||||
man: "Man"
|
man: "Homem"
|
||||||
woman: "Woman"
|
woman: "Mulher"
|
||||||
add_an_avatar: "Adicionar avatar"
|
add_an_avatar: "Adicionar avatar"
|
||||||
pseudonym: "Apelido"
|
pseudonym: "Apelido"
|
||||||
pseudonym_is_required: "Pseudonym is required."
|
pseudonym_is_required: "Apelido é obrigatório."
|
||||||
first_name: "Your first name"
|
first_name: "Seu primeiro nome"
|
||||||
first_name_is_required: "First name is required."
|
first_name_is_required: "Primeiro nome é obrigatório."
|
||||||
surname: "Your last name"
|
surname: "Seu sobrenome"
|
||||||
surname_is_required: "Last name is required."
|
surname_is_required: "Sobrenome é obrigatório."
|
||||||
email_address: "Email address"
|
email_address: "Endereço de e-mail"
|
||||||
email_address_is_required: "E-mail é obrigatório."
|
email_address_is_required: "E-mail é obrigatório."
|
||||||
change_password: "Alterar senha"
|
change_password: "Alterar senha"
|
||||||
new_password: "Nova senha"
|
new_password: "Nova senha"
|
||||||
password_is_required: "Password is required."
|
password_is_required: "Senha é obrigatório."
|
||||||
password_is_too_short: "Password is too short (at least 8 characters)"
|
password_is_too_short: "Senha muito curta (mínimo 8 caracteres)"
|
||||||
confirmation_of_new_password: "Confirmação da nova senha"
|
confirmation_of_new_password: "Confirmação da nova senha"
|
||||||
confirmation_of_password_is_required: "A confirmação da senha é obrigatória."
|
confirmation_of_password_is_required: "A confirmação da senha é obrigatória."
|
||||||
confirmation_of_password_is_too_short: "A confirmação da senha é muito curta (mínimo 8 caracteres)."
|
confirmation_of_password_is_too_short: "A confirmação da senha é muito curta (mínimo 8 caracteres)."
|
||||||
@ -47,50 +47,50 @@ pt:
|
|||||||
organization_address: "Endereço da organização"
|
organization_address: "Endereço da organização"
|
||||||
date_of_birth: "Data de nascimento"
|
date_of_birth: "Data de nascimento"
|
||||||
date_of_birth_is_required: "Data de nascimento é obrigatório."
|
date_of_birth_is_required: "Data de nascimento é obrigatório."
|
||||||
website: "Website"
|
website: "Site"
|
||||||
job: "Ocupação"
|
job: "Ocupação"
|
||||||
interests: "Interests"
|
interests: "Interesses"
|
||||||
CAD_softwares_mastered: "CAD Softwares mastered"
|
CAD_softwares_mastered: "Softwares de CAD dominados"
|
||||||
birthday: "Date of birth"
|
birthday: "Data de nascimento"
|
||||||
birthday_is_required: "Date of birth is required."
|
birthday_is_required: "Data de nascimento é obrigatório."
|
||||||
address: "Address"
|
address: "Endereço"
|
||||||
phone_number: "Phone number"
|
phone_number: "Número de telefone"
|
||||||
phone_number_is_required: "Phone number is required."
|
phone_number_is_required: "Número de telefone é obrigatório."
|
||||||
i_authorize_Fablab_users_registered_on_the_site_to_contact_me: "I authorize FabLab users, registered on the site, to contact me"
|
i_authorize_Fablab_users_registered_on_the_site_to_contact_me: "Eu autorizo usuários do FabLab, registrados no site, a entrarem em contato comigo"
|
||||||
i_accept_to_receive_information_from_the_fablab: "Eu aceito receber informações do FabLab"
|
i_accept_to_receive_information_from_the_fablab: "Eu aceito receber informações do FabLab"
|
||||||
used_for_statistics: "This data will be used for statistical purposes"
|
used_for_statistics: "Estes dados serão utilizados para fins estatísticos"
|
||||||
used_for_invoicing: "This data will be used for billing purposes"
|
used_for_invoicing: "Esses dados serão usados para fins de faturamento"
|
||||||
used_for_reservation: "This data will be used in case of change on one of your bookings"
|
used_for_reservation: "Estes dados serão utilizados em caso de alteração em uma das suas reservas"
|
||||||
used_for_profile: "This data will only be displayed on your profile"
|
used_for_profile: "Estes dados serão exibidos apenas no seu perfil"
|
||||||
#project edition form
|
#project edition form
|
||||||
project:
|
project:
|
||||||
name: "Name"
|
name: "Nome"
|
||||||
name_is_required: "Name is required."
|
name_is_required: "Nome é obrigatório."
|
||||||
illustration: "Ilustração"
|
illustration: "Ilustração"
|
||||||
add_an_illustration: "Adicionar ilustração"
|
add_an_illustration: "Adicionar ilustração"
|
||||||
CAD_file: "Arquivo do CAD"
|
CAD_file: "Arquivo do CAD"
|
||||||
allowed_extensions: "Extensões permitidas:"
|
allowed_extensions: "Extensões permitidas:"
|
||||||
add_a_new_file: "Adicionar novo arquivo"
|
add_a_new_file: "Adicionar novo arquivo"
|
||||||
description: "Description"
|
description: "Descrição"
|
||||||
description_is_required: "Description is required."
|
description_is_required: "Descrição é obrigatório."
|
||||||
steps: "Passos"
|
steps: "Passos"
|
||||||
step_N: "Step {INDEX}"
|
step_N: "Passo {INDEX}"
|
||||||
step_title: "Passo Título"
|
step_title: "Passo Título"
|
||||||
add_a_picture: "Adicionar imagem"
|
add_a_picture: "Adicionar imagem"
|
||||||
change_the_picture: "Alterar imagem"
|
change_the_picture: "Alterar imagem"
|
||||||
delete_the_step: "Deletar este passo"
|
delete_the_step: "Deletar este passo"
|
||||||
confirmation_required: "Confirmation required"
|
confirmation_required: "Confirmação é obrigatória"
|
||||||
do_you_really_want_to_delete_this_step: "Você realmente deseja deletar este passo?"
|
do_you_really_want_to_delete_this_step: "Você realmente deseja deletar este passo?"
|
||||||
add_a_new_step: "Adicionar novo passo"
|
add_a_new_step: "Adicionar novo passo"
|
||||||
publish_your_project: "Publicar seu projeto"
|
publish_your_project: "Publicar seu projeto"
|
||||||
or: "or"
|
or: "ou"
|
||||||
employed_materials: "Materiais utilizados"
|
employed_materials: "Materiais utilizados"
|
||||||
employed_machines: "Máquinas utilizadas"
|
employed_machines: "Máquinas utilizadas"
|
||||||
collaborators: "Collaborators"
|
collaborators: "Colaboradores"
|
||||||
creative_commons_licences: "Licença Creative Commons"
|
creative_commons_licences: "Licença Creative Commons"
|
||||||
themes: "Themes"
|
themes: "Temas"
|
||||||
tags: "Tags"
|
tags: "Tags"
|
||||||
save_as_draft: "Save as draft"
|
save_as_draft: "Salvar como rascunho"
|
||||||
#machine edition form
|
#machine edition form
|
||||||
machine:
|
machine:
|
||||||
name: "Nome"
|
name: "Nome"
|
||||||
@ -116,24 +116,24 @@ pt:
|
|||||||
start_typing: "Escrevendo..."
|
start_typing: "Escrevendo..."
|
||||||
#stripe payment modal
|
#stripe payment modal
|
||||||
stripe:
|
stripe:
|
||||||
online_payment: "Online payment"
|
online_payment: "Pagamento Online"
|
||||||
i_have_read_and_accept_: "Eu li e aceito"
|
i_have_read_and_accept_: "Eu li e aceito "
|
||||||
_the_general_terms_and_conditions: "os termos e condições."
|
_the_general_terms_and_conditions: "os termos e condições."
|
||||||
credit_amount_for_pay_reservation: "{amount} {currency} a ser pago para confirmar sua inscrição"
|
credit_amount_for_pay_reservation: "{amount} {currency} a ser pago para confirmar sua inscrição"
|
||||||
client_credit_amount_for_pay_reservation: "{amount} {currency} a ser pago para confirmar a inscrição do cliente"
|
client_credit_amount_for_pay_reservation: "{amount} {currency} a ser pago para confirmar a inscrição do cliente"
|
||||||
confirm_payment_of_: "Pay: {AMOUNT}"
|
confirm_payment_of_: "Pagamento: {AMOUNT}"
|
||||||
#dialog of on site payment for reservations
|
#dialog of on site payment for reservations
|
||||||
valid_reservation_modal:
|
valid_reservation_modal:
|
||||||
booking_confirmation: "Confirmação de reserva"
|
booking_confirmation: "Confirmação de reserva"
|
||||||
here_is_the_summary_of_the_slots_to_book_for_the_current_user: "Aqui está um resumo das reservas para o usuário atual:"
|
here_is_the_summary_of_the_slots_to_book_for_the_current_user: "Aqui está um resumo das reservas para o usuário atual:"
|
||||||
#event edition form
|
#event edition form
|
||||||
event:
|
event:
|
||||||
title: "Title"
|
title: "Título"
|
||||||
title_is_required: "Título é obrigatório."
|
title_is_required: "Título é obrigatório."
|
||||||
matching_visual: "Correspondência visual"
|
matching_visual: "Correspondência visual"
|
||||||
choose_a_picture: "Escolha uma imagem"
|
choose_a_picture: "Escolha uma imagem"
|
||||||
description: "Description"
|
description: "Descrição"
|
||||||
description_is_required: "Description is required."
|
description_is_required: "Descrição é obrigatório."
|
||||||
attachments: "Anexos"
|
attachments: "Anexos"
|
||||||
add_a_new_file: "Adicionar um novo arquivo"
|
add_a_new_file: "Adicionar um novo arquivo"
|
||||||
event_type: "Tipo de evento"
|
event_type: "Tipo de evento"
|
||||||
@ -158,8 +158,8 @@ pt:
|
|||||||
name_is_required: "Nome é obrigatório."
|
name_is_required: "Nome é obrigatório."
|
||||||
name_length_must_be_less_than_24_characters: "O nome deve conter no máximo 24 caracteres."
|
name_length_must_be_less_than_24_characters: "O nome deve conter no máximo 24 caracteres."
|
||||||
type: "Tipo"
|
type: "Tipo"
|
||||||
partner: "Partner"
|
partner: "Parceiro"
|
||||||
standard: "Standard"
|
standard: "Padrão"
|
||||||
type_is_required: "Tipo é obrigatório."
|
type_is_required: "Tipo é obrigatório."
|
||||||
group: "Grupo"
|
group: "Grupo"
|
||||||
groups: "Grupos"
|
groups: "Grupos"
|
||||||
@ -187,11 +187,11 @@ pt:
|
|||||||
new_user: "Novo usuário ..."
|
new_user: "Novo usuário ..."
|
||||||
as_part_of_a_partner_subscription_some_notifications_may_be_sent_to_this_user: "Como parte da inscrição do parceiro, algumas notificações podem ser enviadas para este usuário."
|
as_part_of_a_partner_subscription_some_notifications_may_be_sent_to_this_user: "Como parte da inscrição do parceiro, algumas notificações podem ser enviadas para este usuário."
|
||||||
new_partner: "Novo parceiro"
|
new_partner: "Novo parceiro"
|
||||||
first_name: "First name"
|
first_name: "Primeiro nome"
|
||||||
first_name_is_required: "First name is required."
|
first_name_is_required: "Primeiro nome é obrigatório."
|
||||||
surname: "Last name"
|
surname: "Sobrenome"
|
||||||
surname_is_required: "Last name is required."
|
surname_is_required: "Sobrenome é obrigatório."
|
||||||
email_address: "Email address"
|
email_address: "Endereço de e-mail"
|
||||||
email_address_is_required: "Email é obrigatório."
|
email_address_is_required: "Email é obrigatório."
|
||||||
disabled: "Disable subscrição"
|
disabled: "Disable subscrição"
|
||||||
disable_plan_will_not_unsubscribe_users: "Aviso: desativar a assinatura não desautorizará os usuários que atualmente possuem esta assinatura ativa."
|
disable_plan_will_not_unsubscribe_users: "Aviso: desativar a assinatura não desautorizará os usuários que atualmente possuem esta assinatura ativa."
|
||||||
@ -211,8 +211,8 @@ pt:
|
|||||||
disable_training: "Desativar treinamento"
|
disable_training: "Desativar treinamento"
|
||||||
#partial form to edit/create an user (admin view)
|
#partial form to edit/create an user (admin view)
|
||||||
user_admin:
|
user_admin:
|
||||||
user: "User"
|
user: "Usuário"
|
||||||
incomplete_profile: "Incomplete profile"
|
incomplete_profile: "Perfil incompleto"
|
||||||
user_profile: "Perfil de usuário"
|
user_profile: "Perfil de usuário"
|
||||||
warning_incomplete_user_profile_probably_imported_from_sso: "Atenção: Esse perfil de usuário está incompleto. 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."
|
warning_incomplete_user_profile_probably_imported_from_sso: "Atenção: Esse perfil de usuário está incompleto. 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: "Grupo"
|
group: "Grupo"
|
||||||
@ -224,7 +224,7 @@ pt:
|
|||||||
name: "Nome"
|
name: "Nome"
|
||||||
provider_name_is_required: "Nome da provider é obrigatório."
|
provider_name_is_required: "Nome da provider é obrigatório."
|
||||||
authentication_type: "Tipo de autenticação"
|
authentication_type: "Tipo de autenticação"
|
||||||
local_database: "Local database"
|
local_database: "Database local"
|
||||||
o_auth2: "OAuth 2.0"
|
o_auth2: "OAuth 2.0"
|
||||||
authentication_type_is_required: "Tipo de autenticação é obrigatório."
|
authentication_type_is_required: "Tipo de autenticação é obrigatório."
|
||||||
data_mapping: "Mapeando dados"
|
data_mapping: "Mapeando dados"
|
||||||
@ -233,24 +233,24 @@ pt:
|
|||||||
mappings: "Mapeamentos"
|
mappings: "Mapeamentos"
|
||||||
#edition/creation form of an OAuth2 authentication provider
|
#edition/creation form of an OAuth2 authentication provider
|
||||||
oauth2:
|
oauth2:
|
||||||
common_url: "Common URL"
|
common_url: "URL comum"
|
||||||
common_url_is_required: "Common URL is required."
|
common_url_is_required: "URL comum é necessária."
|
||||||
provided_url_is_not_a_valid_url: "Provided URL is not a valid URL."
|
provided_url_is_not_a_valid_url: "A URL fornecida não é uma URL válida."
|
||||||
authorization_endpoint: "Authorization endpoint"
|
authorization_endpoint: "Endpoint da autorização"
|
||||||
oauth2_authorization_endpoint_is_required: "OAuth 2.0 authorization endpoint is required."
|
oauth2_authorization_endpoint_is_required: "Um endpoint de autorização OAuth 2.0 é necessário."
|
||||||
provided_endpoint_is_not_valid: "Provided endpoint is not valid."
|
provided_endpoint_is_not_valid: "O endpoint fornecido não é válido."
|
||||||
token_acquisition_endpoint: "Token acquisition endpoint"
|
token_acquisition_endpoint: "Endpoint da aquisição de token"
|
||||||
oauth2_token_acquisition_endpoint_is_required: "OAuth 2.0 token acquisition endpoint is required."
|
oauth2_token_acquisition_endpoint_is_required: "Um endpoint de autorização OAuth 2.0 é necessário."
|
||||||
profil_edition_url: "Profil edition URL"
|
profil_edition_url: "URL da edição do Perfil"
|
||||||
profile_edition_url_is_required: "Profile edition URL is required."
|
profile_edition_url_is_required: "URL de edição do perfil é necessária."
|
||||||
client_identifier: "Client identifier"
|
client_identifier: "Client identifier"
|
||||||
oauth2_client_identifier_is_required: "OAuth 2.0 client identifier is required."
|
oauth2_client_identifier_is_required: "O identificador do cliente OAuth 2.0 é necessário."
|
||||||
obtain_it_when_registering_with_your_provider: "Obtain it when registering with your provider."
|
obtain_it_when_registering_with_your_provider: "Obtenha-o ao se registrar no seu provedor."
|
||||||
client_secret: "Client secret"
|
client_secret: "Chave secreta"
|
||||||
oauth2_client_secret_is_required: "OAuth 2.0 client secret is required."
|
oauth2_client_secret_is_required: "A senha do cliente OAuth 2.0 é necessário."
|
||||||
define_the_fields_mapping: "Define the fields mapping"
|
define_the_fields_mapping: "Defina o mapeamento dos campos"
|
||||||
add_a_match: "Add a match"
|
add_a_match: "Adicionar uma correspondência"
|
||||||
model: "Model"
|
model: "Modelo"
|
||||||
field: "Linhas"
|
field: "Linhas"
|
||||||
api_endpoint_url: "API endpoint URL"
|
api_endpoint_url: "API endpoint URL"
|
||||||
api_type: "API tipo"
|
api_type: "API tipo"
|
||||||
@ -282,11 +282,11 @@ pt:
|
|||||||
author: "Autor"
|
author: "Autor"
|
||||||
collaborator: "Colaboradores"
|
collaborator: "Colaboradores"
|
||||||
private_profile: "Perfil privado"
|
private_profile: "Perfil privado"
|
||||||
interests: "Interests"
|
interests: "Interesses"
|
||||||
CAD_softwares_mastered: "CAD softwares mastered"
|
CAD_softwares_mastered: "Softwares de CAD dominados"
|
||||||
email_address: "Email address"
|
email_address: "Endereço de e-mail"
|
||||||
trainings: "Trainings"
|
trainings: "Treinamentos"
|
||||||
no_trainings: "No trainings"
|
no_trainings: "Sem treinamentos"
|
||||||
#wallet
|
#wallet
|
||||||
wallet:
|
wallet:
|
||||||
wallet: 'Carteira'
|
wallet: 'Carteira'
|
||||||
@ -326,7 +326,7 @@ pt:
|
|||||||
#promotional coupon (creation/edition form)
|
#promotional coupon (creation/edition form)
|
||||||
coupon:
|
coupon:
|
||||||
name: "Nome"
|
name: "Nome"
|
||||||
name_is_required: "Name is required."
|
name_is_required: "Nome é obrigatório."
|
||||||
code: "Código"
|
code: "Código"
|
||||||
code_is_required: "Código é obrigatório."
|
code_is_required: "Código é obrigatório."
|
||||||
code_must_be_composed_of_capital_letters_digits_and_or_dashes: "O código deve ser composto de letras maiúsculas, dígitos e / ou traços."
|
code_must_be_composed_of_capital_letters_digits_and_or_dashes: "O código deve ser composto de letras maiúsculas, dígitos e / ou traços."
|
||||||
@ -397,7 +397,7 @@ pt:
|
|||||||
total_: "TOTAL :"
|
total_: "TOTAL :"
|
||||||
thank_you_your_payment_has_been_successfully_registered: "Obrigado. Seu pagamento foi registrado com sucesso !"
|
thank_you_your_payment_has_been_successfully_registered: "Obrigado. Seu pagamento foi registrado com sucesso !"
|
||||||
your_invoice_will_be_available_soon_from_your_: "Sua fatura estará disponível em breve"
|
your_invoice_will_be_available_soon_from_your_: "Sua fatura estará disponível em breve"
|
||||||
dashboard: "Dashboard"
|
dashboard: "Painel de controle"
|
||||||
i_want_to_change_the_following_reservation: "Eu quero mudar a seguinte reserva:"
|
i_want_to_change_the_following_reservation: "Eu quero mudar a seguinte reserva:"
|
||||||
cancel_my_modification: "Cancelar minha modificação"
|
cancel_my_modification: "Cancelar minha modificação"
|
||||||
select_a_new_slot_in_the_calendar: "Selecionar um novo slot no calendário"
|
select_a_new_slot_in_the_calendar: "Selecionar um novo slot no calendário"
|
||||||
@ -418,29 +418,29 @@ pt:
|
|||||||
a_problem_occurred_during_the_payment_process_please_try_again_later: "Um problema ocorreu durante o processo de pagamento. Por favor tente novamente mais tarde."
|
a_problem_occurred_during_the_payment_process_please_try_again_later: "Um problema ocorreu durante o processo de pagamento. Por favor tente novamente mais tarde."
|
||||||
none: "Vazio"
|
none: "Vazio"
|
||||||
online_payment_disabled: "O pagamento online não está disponível. Entre em contato diretamente com a recepção do FabLab."
|
online_payment_disabled: "O pagamento online não está disponível. Entre em contato diretamente com a recepção do FabLab."
|
||||||
slot_restrict_plans: "This slot is restricted for the plans below:"
|
slot_restrict_plans: "Este slot está restrito para os planos abaixo:"
|
||||||
slot_restrict_subscriptions_must_select_plan: "The slot is restricted for the subscribers. Please select a plan first."
|
slot_restrict_subscriptions_must_select_plan: "O slot está restrito para os assinantes. Por favor, selecione um plano primeiro."
|
||||||
slot_restrict_plans_of_others_groups: "The slot is restricted for the subscribers of others groups."
|
slot_restrict_plans_of_others_groups: "O slot está restrito para os assinantes de outros grupos."
|
||||||
selected_plan_dont_match_slot: "Selected plan dont match this slot"
|
selected_plan_dont_match_slot: "O plano selecionado não corresponde a este slot"
|
||||||
user_plan_dont_match_slot: "User subscribed plan dont match this slot"
|
user_plan_dont_match_slot: "Plano do usuário não corresponde a esse slot"
|
||||||
no_plan_match_slot: "You dont have any matching plan for this slot"
|
no_plan_match_slot: "Você não tem nenhum plano que corresponda a esse slot"
|
||||||
slot_at_same_time: "Conflict with others reservations"
|
slot_at_same_time: "Conflito com outras reservas"
|
||||||
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"
|
do_you_really_want_to_book_slot_at_same_time: "Você realmente quer reservar este slot? Outras reservas ocorrerão ao mesmo tempo"
|
||||||
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."
|
unable_to_book_slot_because_really_have_reservation_at_same_time: "Não é possível reservar este slot porque a seguinte reserva ocorre ao mesmo tempo."
|
||||||
tags_mismatch: "Tags mismatch"
|
tags_mismatch: "Incompatibilidade de tags"
|
||||||
confirm_book_slot_tags_mismatch: "Do you really want to book this slot? {USER} does not have any of the required tags."
|
confirm_book_slot_tags_mismatch: "Você realmente quer reservar este slot? {USER} não tem nenhuma das tags necessárias."
|
||||||
unable_to_book_slot_tags_mismatch: "Unable to book this slot because you don't have any of the required tags."
|
unable_to_book_slot_tags_mismatch: "Não foi possível reservar este slot porque você não tem nenhuma das tags obrigatórias."
|
||||||
slot_tags: "Slot tags"
|
slot_tags: "Tags do Slot"
|
||||||
user_tags: "User tags"
|
user_tags: "Etiquetas de usuários"
|
||||||
no_tags: "No tags"
|
no_tags: "Sem etiquetas"
|
||||||
#feature-tour modal
|
#feature-tour modal
|
||||||
tour:
|
tour:
|
||||||
previous: "Previous"
|
previous: "Anterior"
|
||||||
next: "Next"
|
next: "Próximo"
|
||||||
end: "End the tour"
|
end: "Encerrar o tour"
|
||||||
#help modal
|
#help modal
|
||||||
help:
|
help:
|
||||||
title: "Ajuda"
|
title: "Ajuda"
|
||||||
what_to_do: "What do you want to do?"
|
what_to_do: "O que deseja fazer?"
|
||||||
tour: "Start the feature tour"
|
tour: "Iniciar o tour em destaque"
|
||||||
guide: "Open the user's manual"
|
guide: "Abrir manual do usuário"
|
||||||
|
@ -14,17 +14,17 @@ pt:
|
|||||||
not_found_in_database: "Email ou senha inválidos."
|
not_found_in_database: "Email ou senha inválidos."
|
||||||
timeout: "Sua sessão expirou, faça login novamente para continuar."
|
timeout: "Sua sessão expirou, faça login novamente para continuar."
|
||||||
unauthenticated: "Você precisa fazer login ou se registrar, antes de continuar."
|
unauthenticated: "Você precisa fazer login ou se registrar, antes de continuar."
|
||||||
unconfirmed: "You have to confirm your account before continuing. Please click on the link below the form."
|
unconfirmed: "Você precisa confirmar sua conta antes de continuar. Por favor, clique no link abaixo do formulário."
|
||||||
mailer:
|
mailer:
|
||||||
confirmation_instructions:
|
confirmation_instructions:
|
||||||
action: "Confirm my email address"
|
action: "Confirmar o meu endereço de e-mail"
|
||||||
instruction: "You can finalize your registration by confirming your email address. Please click on the following link:"
|
instruction: "Você pode finalizar o seu cadastro confirmando seu endereço de e-mail. Por favor clique no link a seguir:"
|
||||||
subject: "Confirmation instructions"
|
subject: "Instruções de confirmação"
|
||||||
reset_password_instructions:
|
reset_password_instructions:
|
||||||
action: "Change my password"
|
action: "Alterar a minha senha"
|
||||||
instruction: "Someone asked for a link to change your password. You can do it through the link below."
|
instruction: "Alguém pediu um link para alterar sua senha. Você pode fazer isso através do link abaixo."
|
||||||
ignore_otherwise: "If you have not made this request, please ignore this message."
|
ignore_otherwise: "Se você não fez essa solicitação, por favor ignore essa mensagem."
|
||||||
subject: "Reset password instructions"
|
subject: "Instruções para redefinir a senha"
|
||||||
unlock_instructions:
|
unlock_instructions:
|
||||||
subject: "Instruções para desbloquear sua conta"
|
subject: "Instruções para desbloquear sua conta"
|
||||||
omniauth_callbacks:
|
omniauth_callbacks:
|
||||||
@ -53,10 +53,10 @@ pt:
|
|||||||
unlocked: "Sua conta foi desbloqueada com sucesso. Faça login para continuar."
|
unlocked: "Sua conta foi desbloqueada com sucesso. Faça login para continuar."
|
||||||
errors:
|
errors:
|
||||||
messages:
|
messages:
|
||||||
already_confirmed: "This email was already confirmed, please try signing in."
|
already_confirmed: "Este e-mail já foi confirmado, por favor, tente logar."
|
||||||
confirmation_period_expired: "deve ser confirmada dentro de %{period}, por favor solicite uma nova"
|
confirmation_period_expired: "deve ser confirmada dentro de %{period}, por favor solicite uma nova"
|
||||||
expired: "expirado, por favor solicite uma nova"
|
expired: "expirado, por favor solicite uma nova"
|
||||||
not_found: "This email was not found"
|
not_found: "Este e-mail não foi encontrado"
|
||||||
not_locked: "não encontra-se bloqueada"
|
not_locked: "não encontra-se bloqueada"
|
||||||
not_saved:
|
not_saved:
|
||||||
one: "1 erro impediu a gravação de %{resource} :"
|
one: "1 erro impediu a gravação de %{resource} :"
|
||||||
|
@ -205,7 +205,7 @@ pt:
|
|||||||
signaled_by: "sinalizado por:"
|
signaled_by: "sinalizado por:"
|
||||||
signaled_on: "sinalizado em:"
|
signaled_on: "sinalizado em:"
|
||||||
message: "Menssagem:"
|
message: "Menssagem:"
|
||||||
visit_management_interface: "Refer to the Reporting Management Interface for more information."
|
visit_management_interface: "Consulte a Interface de Gerenciamento de Relatórios para obter mais informações."
|
||||||
notify_user_wallet_is_credited:
|
notify_user_wallet_is_credited:
|
||||||
subject: "Sua carteira foi creditada"
|
subject: "Sua carteira foi creditada"
|
||||||
body:
|
body:
|
||||||
@ -237,11 +237,11 @@ pt:
|
|||||||
xlsx: "Excel"
|
xlsx: "Excel"
|
||||||
csv: "CSV"
|
csv: "CSV"
|
||||||
notify_admin_import_complete:
|
notify_admin_import_complete:
|
||||||
subject: "Import completed"
|
subject: "Importação concluída"
|
||||||
body:
|
body:
|
||||||
you_made_an_import: "You have initiated an import %{CATEGORY}"
|
you_made_an_import: "Você iniciou uma importação %{CATEGORY}"
|
||||||
category_members: "of the members"
|
category_members: "dos membros"
|
||||||
click_to_view_results: "Click here to view results"
|
click_to_view_results: "Clique aqui para ver os resultados"
|
||||||
notify_member_about_coupon:
|
notify_member_about_coupon:
|
||||||
subject: "Cupom"
|
subject: "Cupom"
|
||||||
body:
|
body:
|
||||||
@ -249,43 +249,43 @@ pt:
|
|||||||
enjoy_a_discount_of_AMOUNT_with_code_CODE: "Desfrute de um desconto de %{AMOUNT} em todo o site com o código %{CODE}."
|
enjoy_a_discount_of_AMOUNT_with_code_CODE: "Desfrute de um desconto de %{AMOUNT} em todo o site com o código %{CODE}."
|
||||||
this_coupon_is_valid_USAGE_times_until_DATE_for_all_your_purchases: "Esse cupom é válido {USAGE, plural, =1{uma vez} other{vérias vezes}}: para todas as suas compras {TYPE, select, amount_off{pelo menos igual ao montante do cupom} other{}}, from now {DATE, select, NO-DATE{e sem limite de tempo} other{até {DATE}}}."
|
this_coupon_is_valid_USAGE_times_until_DATE_for_all_your_purchases: "Esse cupom é válido {USAGE, plural, =1{uma vez} other{vérias vezes}}: para todas as suas compras {TYPE, select, amount_off{pelo menos igual ao montante do cupom} other{}}, from now {DATE, select, NO-DATE{e sem limite de tempo} other{até {DATE}}}."
|
||||||
notify_admin_free_disk_space:
|
notify_admin_free_disk_space:
|
||||||
subject: "Low disk space"
|
subject: "Espaço em disco baixo"
|
||||||
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."
|
body: "Atenção: o espaço disponível em disco no servidor de hospedagem Fab-manager é menor que %{THRESHOLD} MiB. Isso pode afetar sua operação e evitar salvar alguns dados. Atualmente, %{AVAILABLE} MiB de espaço livre permanece disponível no ponto de montagem."
|
||||||
notify_admin_close_period_reminder:
|
notify_admin_close_period_reminder:
|
||||||
subject: "Remind to close your accounting periods"
|
subject: "Lembrar de encerrar seus períodos de contabilidade"
|
||||||
body:
|
body:
|
||||||
warning_last_closed_period_over_1_year: "Please remind to periodically close your accounting periods. Last closed period ended at %{LAST_END}."
|
warning_last_closed_period_over_1_year: "Por favor, lembre-se de encerrar periodicamente seus períodos de contabilidade. O último período de fechamento terminou em %{LAST_END}."
|
||||||
warning_no_closed_periods: "Please remind to periodically close your accounting periods. You have to close periods from %{FIRST_DATE}."
|
warning_no_closed_periods: "Lembre-se de fechar periodicamente os seus períodos de contabilidade. Você tem que fechar períodos de %{FIRST_DATE}."
|
||||||
notify_admin_archive_complete:
|
notify_admin_archive_complete:
|
||||||
subject: "Archiving completed"
|
subject: "Arquivamento concluído"
|
||||||
body:
|
body:
|
||||||
archive_complete: "You have closed the accounting period from %{START} to %{END}. Archiving of data is now complete."
|
archive_complete: "Você fechou o período de contabilidade de %{START} a %{END}. O arquivo de dados está completo."
|
||||||
click_to_download: "To download the ZIP archive, click"
|
click_to_download: "Para baixar o arquivo ZIP, clique"
|
||||||
here: "here."
|
here: "aqui."
|
||||||
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."
|
save_on_secured: "Lembre-se de que você deve salvar este arquivo num apoio externo seguro, que possa ser solicitado pelas autoridades fiscais durante um controle."
|
||||||
notify_privacy_policy_changed:
|
notify_privacy_policy_changed:
|
||||||
subject: "Privacy policy updated"
|
subject: "Política de privacidade atualizada"
|
||||||
body:
|
body:
|
||||||
content_html: "<p>We wish to inform you that we have just updated our privacy policy.</p><p>We may change our privacy policy regularly. In accordance with the regulations, you will receive a notification for each update.</p><p>By accessing or using our services after the privacy policy update, we will consider that you agree its terms, updates included.</p>"
|
content_html: "<p>Gostaríamos de informá-lo que acabamos de atualizar nossa política de privacidade.</p><p>Podemos alterar nossa política de privacidade regularmente. De acordo com as regulamentações, você receberá uma notificação para cada atualização.</p><p>Ao acessar ou utilizar nossos serviços após a atualização da política de privacidade, consideraremos que você concorda com seus termos, incluindo atualizações.</p>"
|
||||||
link_to_policy: "Click here to view the privacy policy."
|
link_to_policy: "Clique aqui para ver a política de privacidade."
|
||||||
notify_admin_refund_created:
|
notify_admin_refund_created:
|
||||||
subject: "A refund has been generated"
|
subject: "Um reembolso foi gerado"
|
||||||
body:
|
body:
|
||||||
refund_created: "A refund of %{AMOUNT} has been generated on invoice %{INVOICE} of user %{USER}"
|
refund_created: "Um reembolso de %{AMOUNT} foi gerado na fatura %{INVOICE} do usuário %{USER}"
|
||||||
download: "Click here to download this refund invoice"
|
download: "Clique aqui para fazer o download da fatura de reembolso"
|
||||||
notify_admins_role_update:
|
notify_admins_role_update:
|
||||||
subject: "The role of a user has changed"
|
subject: "O papel de um usuário foi alterado"
|
||||||
body:
|
body:
|
||||||
user_role_changed_html: "The role of the user <em><strong>%{NAME}</strong></em> has changed."
|
user_role_changed_html: "A função do usuário <em><strong>%{NAME}</strong></em> foi alterada."
|
||||||
previous_role: "Previous role:"
|
previous_role: "Função anterior:"
|
||||||
new_role: "New role:"
|
new_role: "Novo cargo:"
|
||||||
notify_user_role_update:
|
notify_user_role_update:
|
||||||
subject: "Your role has changed"
|
subject: "Sua função mudou"
|
||||||
body:
|
body:
|
||||||
role_changed_html: "Your role at {GENDER, select, male{the} female{the} neutral{} other{the}} {NAME} has changed. You are now <strong>{ROLE}</strong>.<br/>With great power comes great responsibility, use your new privileges fairly and respectfully."
|
role_changed_html: "Seu cargo em {NAME} mudou. Você está agora em <strong>{ROLE}</strong></strong>.<br/>Com grande poder vem grande responsabilidade, use os seus novos privilégios de forma justa e respeitosa."
|
||||||
notify_admin_members_stripe_sync:
|
notify_admin_members_stripe_sync:
|
||||||
subject: "Stripe synchronization"
|
subject: "Sincronização do Stripe"
|
||||||
body:
|
body:
|
||||||
members_sync: "All members were successfully synchronized on Stripe."
|
members_sync: "Todos os membros foram sincronizados com sucesso no Stripe."
|
||||||
shared:
|
shared:
|
||||||
hello: "Olá %{user_name}"
|
hello: "Olá %{user_name}"
|
||||||
|
@ -30,13 +30,13 @@ pt:
|
|||||||
cannot_be_blank_at_same_time: "Não pode ficar em branco quando %{field} estiver em branco também"
|
cannot_be_blank_at_same_time: "Não pode ficar em branco quando %{field} estiver em branco também"
|
||||||
cannot_be_in_the_past: "não pode ser no passado"
|
cannot_be_in_the_past: "não pode ser no passado"
|
||||||
cannot_be_before_previous_value: "não pode ser antes do valor anterior"
|
cannot_be_before_previous_value: "não pode ser antes do valor anterior"
|
||||||
cannot_overlap: "can't overlap an existing accounting period"
|
cannot_overlap: "não é possível sobrepor um período de contabilidade existente"
|
||||||
cannot_encompass: "can't encompass an existing accounting period"
|
cannot_encompass: "não é possível incluir um período de contabilidade existente"
|
||||||
in_closed_period: "can't be within a closed accounting period"
|
in_closed_period: "não pode ser dentro de um período de contabilidade fechado"
|
||||||
invalid_footprint: "invoice's checksum is invalid"
|
invalid_footprint: "a verificação da fatura é inválida"
|
||||||
end_before_start: "The end date can't be before the start date. Pick a date after %{START}"
|
end_before_start: "A data final não pode ser anterior à data de início. Escolha uma data após %{START}"
|
||||||
invalid_duration: "The allowed duration must be between 1 day and 1 year. Your period is %{DAYS} days long."
|
invalid_duration: "A duração permitida deve ter entre 1 dia e 1 ano. Sua menstruação tem %{DAYS} dias."
|
||||||
must_be_in_the_past: "The period must be strictly prior to today's date."
|
must_be_in_the_past: "O período deve ser estritamente anterior à data de hoje."
|
||||||
apipie:
|
apipie:
|
||||||
api_documentation: "Documentação da API"
|
api_documentation: "Documentação da API"
|
||||||
#error messages when importing an account from a SSO
|
#error messages when importing an account from a SSO
|
||||||
@ -54,7 +54,7 @@ pt:
|
|||||||
#members management
|
#members management
|
||||||
members:
|
members:
|
||||||
unable_to_change_the_group_while_a_subscription_is_running: "Não é possível alterar o grupo enquanto uma assinatura está sendo executada"
|
unable_to_change_the_group_while_a_subscription_is_running: "Não é possível alterar o grupo enquanto uma assinatura está sendo executada"
|
||||||
admins_cant_change_group: "Unable to remove an administrator from his dedicated group"
|
admins_cant_change_group: "Não é possível remover o administrador do seu grupo dedicado"
|
||||||
please_input_the_authentication_code_sent_to_the_address: "Por favor insira o código de autenticação enviado para seu endereço de email %{EMAIL}"
|
please_input_the_authentication_code_sent_to_the_address: "Por favor insira o código de autenticação enviado para seu endereço de email %{EMAIL}"
|
||||||
your_authentication_code_is_not_valid: "Seu código de autentiicação não é válido."
|
your_authentication_code_is_not_valid: "Seu código de autentiicação não é válido."
|
||||||
current_authentication_method_no_code: "O método de autenticação atual não requer nenhum código de migração"
|
current_authentication_method_no_code: "O método de autenticação atual não requer nenhum código de migração"
|
||||||
@ -111,27 +111,27 @@ pt:
|
|||||||
subscription_of_NAME_for_DURATION_starting_from_DATE: "Assinatura de %{NAME} de %{DURATION} começando em %{DATE}"
|
subscription_of_NAME_for_DURATION_starting_from_DATE: "Assinatura de %{NAME} de %{DURATION} começando em %{DATE}"
|
||||||
subscription_of_NAME_extended_starting_from_STARTDATE_until_ENDDATE: "Assinatura de %{NAME} estendida (dias livres) a partir de% STARTDATE até %{ENDDATE}"
|
subscription_of_NAME_extended_starting_from_STARTDATE_until_ENDDATE: "Assinatura de %{NAME} estendida (dias livres) a partir de% STARTDATE até %{ENDDATE}"
|
||||||
and: 'e'
|
and: 'e'
|
||||||
invoice_text_example: "Our association is not subject to VAT"
|
invoice_text_example: "Nossa associação não está sujeita a IVA"
|
||||||
#CVS accounting export (columns headers)
|
#CVS accounting export (columns headers)
|
||||||
accounting_export:
|
accounting_export:
|
||||||
journal_code: "Journal code"
|
journal_code: "Código do diário"
|
||||||
date: "Entry date"
|
date: "Data de entrada"
|
||||||
account_code: "Account code"
|
account_code: "Código da conta"
|
||||||
account_label: "Account label"
|
account_label: "Rótulo da conta"
|
||||||
piece: "Document"
|
piece: "Documento"
|
||||||
line_label: "Entry label"
|
line_label: "Rótulo da postagem"
|
||||||
debit_origin: "Origin debit"
|
debit_origin: "Débito de origem"
|
||||||
credit_origin: "Origin credit"
|
credit_origin: "Crédito de origem"
|
||||||
debit_euro: "Euro debit"
|
debit_euro: "Débito em euro"
|
||||||
credit_euro: "Euro credit"
|
credit_euro: "Crédito em euro"
|
||||||
lettering: "Lettering"
|
lettering: "Letras"
|
||||||
VAT: 'IVA'
|
VAT: 'IVA'
|
||||||
subscription: "subscr."
|
subscription: "subscr."
|
||||||
Machine_reservation: "machine reserv."
|
Machine_reservation: "reserva de máquina."
|
||||||
Training_reservation: "training reserv."
|
Training_reservation: "reserva de treinamento."
|
||||||
Event_reservation: "event reserv."
|
Event_reservation: "reserva de evento."
|
||||||
Space_reservation: "space reserv."
|
Space_reservation: "reserva de espaço."
|
||||||
wallet: "wallet"
|
wallet: "carteira"
|
||||||
#training availabilities
|
#training availabilities
|
||||||
trainings:
|
trainings:
|
||||||
i_ve_reserved: "Eu reservei"
|
i_ve_reserved: "Eu reservei"
|
||||||
@ -156,10 +156,10 @@ pt:
|
|||||||
age: "Idade"
|
age: "Idade"
|
||||||
address: "Endereço"
|
address: "Endereço"
|
||||||
phone: "Telefone"
|
phone: "Telefone"
|
||||||
website: "Website"
|
website: "Site"
|
||||||
job: "Emprego"
|
job: "Emprego"
|
||||||
interests: "Interesses"
|
interests: "Interesses"
|
||||||
cad_software_mastered: "CAD Softwares mastered"
|
cad_software_mastered: "Softwares de CAD dominados"
|
||||||
group: "Grupo"
|
group: "Grupo"
|
||||||
subscription: "Assinatura"
|
subscription: "Assinatura"
|
||||||
subscription_end_date: "Assinatura e data"
|
subscription_end_date: "Assinatura e data"
|
||||||
@ -212,7 +212,7 @@ pt:
|
|||||||
events: "Eventos"
|
events: "Eventos"
|
||||||
day_of_week: "Dia da semana"
|
day_of_week: "Dia da semana"
|
||||||
date: "Data"
|
date: "Data"
|
||||||
slot: "Slot"
|
slot: "Vaga"
|
||||||
machine: "Máquina"
|
machine: "Máquina"
|
||||||
training: "Treinamento"
|
training: "Treinamento"
|
||||||
space: "Espaço"
|
space: "Espaço"
|
||||||
@ -220,9 +220,9 @@ pt:
|
|||||||
reservations: "Reservas"
|
reservations: "Reservas"
|
||||||
available_seats: "Assentos disponíveis"
|
available_seats: "Assentos disponíveis"
|
||||||
roles:
|
roles:
|
||||||
member: "Member"
|
member: "Membro"
|
||||||
manager: "Manager"
|
manager: "Gestor"
|
||||||
admin: "Administrator"
|
admin: "Administrador"
|
||||||
api:
|
api:
|
||||||
#internal app notifications
|
#internal app notifications
|
||||||
notifications:
|
notifications:
|
||||||
@ -320,30 +320,30 @@ pt:
|
|||||||
is_over: "está finalizado."
|
is_over: "está finalizado."
|
||||||
download_here: "Baixe aqui"
|
download_here: "Baixe aqui"
|
||||||
notify_admin_import_complete:
|
notify_admin_import_complete:
|
||||||
import_over: "%{CATEGORY} import is over. "
|
import_over: "A importação de %{CATEGORY} terminou. "
|
||||||
members: "Members"
|
members: "Membros"
|
||||||
view_results: "View results."
|
view_results: "Ver resultados."
|
||||||
notify_member_about_coupon:
|
notify_member_about_coupon:
|
||||||
enjoy_a_discount_of_PERCENT_with_code_CODE: "Desfrute de um desconto de %{PERCENT}% com o código %{CODE}"
|
enjoy_a_discount_of_PERCENT_with_code_CODE: "Desfrute de um desconto de %{PERCENT}% com o código %{CODE}"
|
||||||
enjoy_a_discount_of_AMOUNT_with_code_CODE: "Desfrute de um desconto de %{AMOUNT} com o código %{CODE}"
|
enjoy_a_discount_of_AMOUNT_with_code_CODE: "Desfrute de um desconto de %{AMOUNT} com o código %{CODE}"
|
||||||
notify_admin_free_disk_space:
|
notify_admin_free_disk_space:
|
||||||
warning_free_disk_space: "Warning: the server's available disk space is now %{AVAILABLE} MiB"
|
warning_free_disk_space: "Aviso: o espaço em disco do servidor agora é %{AVAILABLE} MiB"
|
||||||
notify_admin_close_period_reminder:
|
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_last_closed_period_over_1_year: "Por favor, lembre-se de encerrar periodicamente seus períodos de contabilidade. O último período de fechamento terminou em %{LAST_END}"
|
||||||
warning_no_closed_periods: "Please remind to periodically close your accounting periods. You have to close periods from %{FIRST_DATE}"
|
warning_no_closed_periods: "Lembre-se de fechar periodicamente os seus períodos de contabilidade. Você tem que fechar períodos de %{FIRST_DATE}"
|
||||||
notify_admin_archive_complete:
|
notify_admin_archive_complete:
|
||||||
archive_complete: "Data archiving from %{START} to %{END} is done. <a href='api/accounting_periods/%{ID}/archive' target='_blank'>click here to download</a>. Remember to save it on an external secured media."
|
archive_complete: "O arquivamento de dados de %{START} para %{END} está pronto. <a href='api/accounting_periods/%{ID}/archive' target='_blank'>clique aqui para baixar</a>. Lembre-se de salvá-lo em uma mídia externa segura."
|
||||||
notify_privacy_policy_changed:
|
notify_privacy_policy_changed:
|
||||||
policy_updated: "Privacy policy updated."
|
policy_updated: "Política de privacidade atualizada."
|
||||||
click_to_show: "Click here to consult"
|
click_to_show: "Clique aqui para consultar"
|
||||||
notify_admin_refund_created:
|
notify_admin_refund_created:
|
||||||
refund_created: "A refund of %{AMOUNT} has been created for user %{USER}"
|
refund_created: "Um reembolso de %{AMOUNT} foi criado para o usuário %{USER}"
|
||||||
notify_user_role_update:
|
notify_user_role_update:
|
||||||
your_role_is_ROLE: "Your role has been changed to %{ROLE}."
|
your_role_is_ROLE: "Seu cargo foi alterado para %{ROLE}."
|
||||||
notify_admins_role_update:
|
notify_admins_role_update:
|
||||||
user_NAME_changed_ROLE_html: "User <strong><em>%{NAME}</strong></em> is now %{ROLE}."
|
user_NAME_changed_ROLE_html: "O usuário <strong><em>%{NAME}</strong></em> agora é %{ROLE}."
|
||||||
notify_admin_members_stripe_sync:
|
notify_admin_members_stripe_sync:
|
||||||
all_members_sync: "All members were successfully synchronized on Stripe."
|
all_members_sync: "Todos os membros foram sincronizados com sucesso no Stripe."
|
||||||
#statistics tools for admins
|
#statistics tools for admins
|
||||||
statistics:
|
statistics:
|
||||||
subscriptions: "Assinaturas"
|
subscriptions: "Assinaturas"
|
||||||
|
@ -165,6 +165,8 @@ Rails.application.routes.draw do
|
|||||||
# payments handling
|
# payments handling
|
||||||
post 'payments/confirm_payment' => 'payments/confirm_payment'
|
post 'payments/confirm_payment' => 'payments/confirm_payment'
|
||||||
get 'payments/online_payment_status' => 'payments/online_payment_status'
|
get 'payments/online_payment_status' => 'payments/online_payment_status'
|
||||||
|
get 'payments/setup_intent/:user_id' => 'payments#setup_intent'
|
||||||
|
post 'payments/confirm_payment_schedule' => 'payments#confirm_payment_schedule'
|
||||||
|
|
||||||
# FabAnalytics
|
# FabAnalytics
|
||||||
get 'analytics/data' => 'analytics#data'
|
get 'analytics/data' => 'analytics#data'
|
||||||
|
@ -26,6 +26,8 @@ development:
|
|||||||
moment_locale: <%= ENV["MOMENT_LOCALE"] %>
|
moment_locale: <%= ENV["MOMENT_LOCALE"] %>
|
||||||
summernote_locale: <%= ENV["SUMMERNOTE_LOCALE"] %>
|
summernote_locale: <%= ENV["SUMMERNOTE_LOCALE"] %>
|
||||||
angular_locale: <%= ENV["ANGULAR_LOCALE"] %>
|
angular_locale: <%= ENV["ANGULAR_LOCALE"] %>
|
||||||
|
intl_locale: <%= ENV["INTL_LOCALE"] %>
|
||||||
|
intl_currency: <%= ENV["INTL_CURRENCY"] %>
|
||||||
fullcalendar_locale: <%= ENV["FULLCALENDAR_LOCALE"] %>
|
fullcalendar_locale: <%= ENV["FULLCALENDAR_LOCALE"] %>
|
||||||
postgresql_language_analyzer: <%= ENV.fetch("POSTGRESQL_LANGUAGE_ANALYZER", 'simple') %>
|
postgresql_language_analyzer: <%= ENV.fetch("POSTGRESQL_LANGUAGE_ANALYZER", 'simple') %>
|
||||||
openlab_base_uri: <%= ENV["OPENLAB_BASE_URI"] %>
|
openlab_base_uri: <%= ENV["OPENLAB_BASE_URI"] %>
|
||||||
@ -54,6 +56,8 @@ test:
|
|||||||
moment_locale: en
|
moment_locale: en
|
||||||
summernote_locale: en-US
|
summernote_locale: en-US
|
||||||
angular_locale: en-us
|
angular_locale: en-us
|
||||||
|
intl_locale: en-US
|
||||||
|
intl_currency: USD
|
||||||
fullcalendar_locale: en
|
fullcalendar_locale: en
|
||||||
postgresql_language_analyzer: french
|
postgresql_language_analyzer: french
|
||||||
openlab_base_uri:
|
openlab_base_uri:
|
||||||
@ -90,6 +94,8 @@ staging:
|
|||||||
moment_locale: <%= ENV["MOMENT_LOCALE"] %>
|
moment_locale: <%= ENV["MOMENT_LOCALE"] %>
|
||||||
summernote_locale: <%= ENV["SUMMERNOTE_LOCALE"] %>
|
summernote_locale: <%= ENV["SUMMERNOTE_LOCALE"] %>
|
||||||
angular_locale: <%= ENV["ANGULAR_LOCALE"] %>
|
angular_locale: <%= ENV["ANGULAR_LOCALE"] %>
|
||||||
|
intl_locale: <%= ENV["INTL_LOCALE"] %>
|
||||||
|
intl_currency: <%= ENV["INTL_CURRENCY"] %>
|
||||||
fullcalendar_locale: <%= ENV["FULLCALENDAR_LOCALE"] %>
|
fullcalendar_locale: <%= ENV["FULLCALENDAR_LOCALE"] %>
|
||||||
postgresql_language_analyzer: <%= ENV.fetch("POSTGRESQL_LANGUAGE_ANALYZER", 'simple') %>
|
postgresql_language_analyzer: <%= ENV.fetch("POSTGRESQL_LANGUAGE_ANALYZER", 'simple') %>
|
||||||
openlab_base_uri: <%= ENV["OPENLAB_BASE_URI"] %>
|
openlab_base_uri: <%= ENV["OPENLAB_BASE_URI"] %>
|
||||||
@ -129,6 +135,8 @@ production:
|
|||||||
moment_locale: <%= ENV["MOMENT_LOCALE"] %>
|
moment_locale: <%= ENV["MOMENT_LOCALE"] %>
|
||||||
summernote_locale: <%= ENV["SUMMERNOTE_LOCALE"] %>
|
summernote_locale: <%= ENV["SUMMERNOTE_LOCALE"] %>
|
||||||
angular_locale: <%= ENV["ANGULAR_LOCALE"] %>
|
angular_locale: <%= ENV["ANGULAR_LOCALE"] %>
|
||||||
|
intl_locale: <%= ENV["INTL_LOCALE"] %>
|
||||||
|
intl_currency: <%= ENV["INTL_CURRENCY"] %>
|
||||||
fullcalendar_locale: <%= ENV["FULLCALENDAR_LOCALE"] %>
|
fullcalendar_locale: <%= ENV["FULLCALENDAR_LOCALE"] %>
|
||||||
postgresql_language_analyzer: <%= ENV.fetch("POSTGRESQL_LANGUAGE_ANALYZER", 'simple') %>
|
postgresql_language_analyzer: <%= ENV.fetch("POSTGRESQL_LANGUAGE_ANALYZER", 'simple') %>
|
||||||
openlab_base_uri: <%= ENV["OPENLAB_BASE_URI"] %>
|
openlab_base_uri: <%= ENV["OPENLAB_BASE_URI"] %>
|
||||||
|
@ -32,7 +32,6 @@ environment.loaders.prepend('js', js);
|
|||||||
environment.loaders.append('html', html);
|
environment.loaders.append('html', html);
|
||||||
environment.loaders.append('sass', sass);
|
environment.loaders.append('sass', sass);
|
||||||
environment.loaders.append('uiTour', uiTour);
|
environment.loaders.append('uiTour', uiTour);
|
||||||
environment.loaders.insert('foo', jsErb, { alter: 'bar' });
|
|
||||||
|
|
||||||
environment.splitChunks();
|
environment.splitChunks();
|
||||||
|
|
||||||
|
@ -26,11 +26,11 @@ If you run the application in production with docker, the settings are localized
|
|||||||
DNS name or IP address of the server hosting the PostgreSQL database of the application (see [PostgreSQL](../README.md#postgresql)).
|
DNS name or IP address of the server hosting the PostgreSQL database of the application (see [PostgreSQL](../README.md#postgresql)).
|
||||||
This value is only used when deploying in production, otherwise this is configured in [config/database.yml](../config/database.yml.default).
|
This value is only used when deploying in production, otherwise this is configured in [config/database.yml](../config/database.yml.default).
|
||||||
When using docker-compose, you should provide the name of the service in your [docker-compose.yml](../docker/docker-compose.yml) file (`postgres` by default).
|
When using docker-compose, you should provide the name of the service in your [docker-compose.yml](../docker/docker-compose.yml) file (`postgres` by default).
|
||||||
<a name="POSTGRES_PASSWORD"></a>
|
<a name="POSTGRES_PASSWORD"></a><a name="POSTGRES_USERNAME"></a>
|
||||||
|
|
||||||
POSTGRES_PASSWORD
|
POSTGRES_USERNAME, POSTGRES_PASSWORD
|
||||||
|
|
||||||
Password for the PostgreSQL user, as specified in `database.yml` (default: `postgres`).
|
Username and password for the connection to the PostgreSQL database.
|
||||||
This value is only used when deploying in production, otherwise this is configured in [config/database.yml](../config/database.yml.default).
|
This value is only used when deploying in production, otherwise this is configured in [config/database.yml](../config/database.yml.default).
|
||||||
When using docker-compose, the default configuration (with `postgres` user) does not uses any password as it is confined in the docker container.
|
When using docker-compose, the default configuration (with `postgres` user) does not uses any password as it is confined in the docker container.
|
||||||
<a name="REDIS_HOST"></a>
|
<a name="REDIS_HOST"></a>
|
||||||
@ -187,14 +187,29 @@ Please, be aware that **the configured locale will imply the CURRENCY displayed
|
|||||||
|
|
||||||
_Eg.: configuring **fr-fr** will set the currency symbol to **€** but **fr-ca** will set **$** as currency symbol, so setting the `ANGULAR_LOCALE` to simple **fr** (without country indication) will probably not do what you expect._
|
_Eg.: configuring **fr-fr** will set the currency symbol to **€** but **fr-ca** will set **$** as currency symbol, so setting the `ANGULAR_LOCALE` to simple **fr** (without country indication) will probably not do what you expect._
|
||||||
|
|
||||||
See [code.angularjs.org/i18n/angular-locale_*.js](https://code.angularjs.org/1.6.10/i18n/) for a list of available locales. Default is **en**.
|
See [code.angularjs.org/i18n/angular-locale_*.js](https://code.angularjs.org/1.8.2/i18n/) for a list of available locales. Default is **en**.
|
||||||
<a name="FULLCALENDAR_LOCALE"></a>
|
<a name="FULLCALENDAR_LOCALE"></a>
|
||||||
|
|
||||||
FULLCALENDAR_LOCALE
|
FULLCALENDAR_LOCALE
|
||||||
|
|
||||||
Configure the fullCalendar JS agenda library.
|
Configure the fullCalendar JS agenda library.
|
||||||
|
|
||||||
See [github.com/fullcalendar/fullcalendar/lang/*.js](https://github.com/fullcalendar/fullcalendar/tree/v2.3.1/lang) for a list of available locales. Default is **en-us**.
|
See [github.com/fullcalendar/fullcalendar/lang/*.js](https://github.com/fullcalendar/fullcalendar/tree/v3.10.2/locale) for a list of available locales. Default is **en-us**.
|
||||||
|
<a name="INTL_LOCALE"></a>
|
||||||
|
|
||||||
|
INTL_LOCALE
|
||||||
|
|
||||||
|
Configure the locale for the javascript Intl Object.
|
||||||
|
This locale must be a Unicode BCP 47 locale identifier.
|
||||||
|
See [Intl - Javascript | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_identification_and_negotiation) for more info about configuring this setting.
|
||||||
|
<a name="INTL_CURRENCY"></a>
|
||||||
|
|
||||||
|
INTL_CURRENCY
|
||||||
|
|
||||||
|
Configure the currency for the javascript Intl Object.
|
||||||
|
Possible values are the ISO 4217 currency codes, such as "USD" for the US dollar, "EUR" for the euro.
|
||||||
|
See [Current currency & funds code list](http://www.currency-iso.org/en/home/tables/table-a1.html) for a list of available values.
|
||||||
|
There is no default value; this setting MUST be provided.
|
||||||
<a name="POSTGRESQL_LANGUAGE_ANALYZER"></a>
|
<a name="POSTGRESQL_LANGUAGE_ANALYZER"></a>
|
||||||
|
|
||||||
POSTGRESQL_LANGUAGE_ANALYZER
|
POSTGRESQL_LANGUAGE_ANALYZER
|
||||||
|
@ -5,7 +5,7 @@ default: &default
|
|||||||
adapter: postgresql
|
adapter: postgresql
|
||||||
encoding: unicode
|
encoding: unicode
|
||||||
pool: 25
|
pool: 25
|
||||||
username: postgres
|
username: <%= ENV["POSTGRES_USERNAME"] %>
|
||||||
password: <%= ENV["POSTGRES_PASSWORD"] %>
|
password: <%= ENV["POSTGRES_PASSWORD"] %>
|
||||||
host: <%= ENV["POSTGRES_HOST"] %>
|
host: <%= ENV["POSTGRES_HOST"] %>
|
||||||
|
|
||||||
|
@ -38,6 +38,8 @@ MOMENT_LOCALE=fr
|
|||||||
SUMMERNOTE_LOCALE=fr-FR
|
SUMMERNOTE_LOCALE=fr-FR
|
||||||
ANGULAR_LOCALE=fr-fr
|
ANGULAR_LOCALE=fr-fr
|
||||||
FULLCALENDAR_LOCALE=fr
|
FULLCALENDAR_LOCALE=fr
|
||||||
|
INTL_LOCALE=fr-FR
|
||||||
|
INTL_CURRENCY=EUR
|
||||||
FORCE_VERSION_CHECK=false
|
FORCE_VERSION_CHECK=false
|
||||||
ALLOW_INSECURE_HTTP=false
|
ALLOW_INSECURE_HTTP=false
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "fab-manager",
|
"name": "fab-manager",
|
||||||
"version": "4.6.3",
|
"version": "4.6.5",
|
||||||
"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.",
|
"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": [
|
"keywords": [
|
||||||
"fablab",
|
"fablab",
|
||||||
@ -41,6 +41,8 @@
|
|||||||
"@claviska/jquery-minicolors": "^2.3.5",
|
"@claviska/jquery-minicolors": "^2.3.5",
|
||||||
"@fortawesome/fontawesome-free": "5.14.0",
|
"@fortawesome/fontawesome-free": "5.14.0",
|
||||||
"@rails/webpacker": "5.2.1",
|
"@rails/webpacker": "5.2.1",
|
||||||
|
"@stripe/react-stripe-js": "^1.1.2",
|
||||||
|
"@stripe/stripe-js": "^1.11.0",
|
||||||
"@types/react": "^16.9.53",
|
"@types/react": "^16.9.53",
|
||||||
"@types/react-dom": "^16.9.8",
|
"@types/react-dom": "^16.9.8",
|
||||||
"@uirouter/angularjs": "0.4",
|
"@uirouter/angularjs": "0.4",
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
POSTGRES_HOST=postgres
|
POSTGRES_HOST=postgres
|
||||||
|
POSTGRES_USERNAME=postgres
|
||||||
REDIS_HOST=redis
|
REDIS_HOST=redis
|
||||||
ELASTICSEARCH_HOST=elasticsearch
|
ELASTICSEARCH_HOST=elasticsearch
|
||||||
|
|
||||||
@ -26,6 +27,8 @@ MOMENT_LOCALE=fr
|
|||||||
SUMMERNOTE_LOCALE=fr-FR
|
SUMMERNOTE_LOCALE=fr-FR
|
||||||
ANGULAR_LOCALE=fr-fr
|
ANGULAR_LOCALE=fr-fr
|
||||||
FULLCALENDAR_LOCALE=fr
|
FULLCALENDAR_LOCALE=fr
|
||||||
|
INTL_LOCALE=fr-FR
|
||||||
|
INTL_CURRENCY=EUR
|
||||||
|
|
||||||
POSTGRESQL_LANGUAGE_ANALYZER=french
|
POSTGRESQL_LANGUAGE_ANALYZER=french
|
||||||
|
|
||||||
|
@ -236,7 +236,7 @@ configure_env_file()
|
|||||||
doc=$(\curl -sSL https://raw.githubusercontent.com/sleede/fab-manager/master/doc/environment.md)
|
doc=$(\curl -sSL https://raw.githubusercontent.com/sleede/fab-manager/master/doc/environment.md)
|
||||||
variables=(DEFAULT_HOST DEFAULT_PROTOCOL DELIVERY_METHOD SMTP_ADDRESS SMTP_PORT SMTP_USER_NAME SMTP_PASSWORD SMTP_AUTHENTICATION \
|
variables=(DEFAULT_HOST DEFAULT_PROTOCOL DELIVERY_METHOD SMTP_ADDRESS SMTP_PORT SMTP_USER_NAME SMTP_PASSWORD SMTP_AUTHENTICATION \
|
||||||
SMTP_ENABLE_STARTTLS_AUTO SMTP_OPENSSL_VERIFY_MODE SMTP_TLS LOG_LEVEL MAX_IMAGE_SIZE MAX_CAO_SIZE MAX_IMPORT_SIZE DISK_SPACE_MB_ALERT \
|
SMTP_ENABLE_STARTTLS_AUTO SMTP_OPENSSL_VERIFY_MODE SMTP_TLS LOG_LEVEL MAX_IMAGE_SIZE MAX_CAO_SIZE MAX_IMPORT_SIZE DISK_SPACE_MB_ALERT \
|
||||||
SUPERADMIN_EMAIL APP_LOCALE RAILS_LOCALE MOMENT_LOCALE SUMMERNOTE_LOCALE ANGULAR_LOCALE FULLCALENDAR_LOCALE \
|
SUPERADMIN_EMAIL APP_LOCALE RAILS_LOCALE MOMENT_LOCALE SUMMERNOTE_LOCALE ANGULAR_LOCALE FULLCALENDAR_LOCALE INTL_LOCALE INTL_CURRENCY\
|
||||||
POSTGRESQL_LANGUAGE_ANALYZER TIME_ZONE WEEK_STARTING_DAY D3_DATE_FORMAT UIB_DATE_FORMAT EXCEL_DATE_FORMAT)
|
POSTGRESQL_LANGUAGE_ANALYZER TIME_ZONE WEEK_STARTING_DAY D3_DATE_FORMAT UIB_DATE_FORMAT EXCEL_DATE_FORMAT)
|
||||||
for variable in "${variables[@]}"; do
|
for variable in "${variables[@]}"; do
|
||||||
local var_doc current
|
local var_doc current
|
||||||
|
@ -75,9 +75,9 @@ version_error()
|
|||||||
|
|
||||||
version_check()
|
version_check()
|
||||||
{
|
{
|
||||||
VERSION=$(docker-compose exec "$SERVICE" cat .fabmanager-version)
|
VERSION=$(docker-compose exec -T "$SERVICE" cat .fabmanager-version)
|
||||||
if [[ $? = 1 ]]; then
|
if [[ $? = 1 ]]; then
|
||||||
VERSION=$(docker-compose exec "$SERVICE" cat package.json | grep version | awk 'BEGIN { FS = "\"" } ; {print $4}')
|
VERSION=$(docker-compose exec -T "$SERVICE" cat package.json | grep version | awk 'BEGIN { FS = "\"" } ; {print $4}')
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if verlt "$VERSION" 2.8.3; then
|
if verlt "$VERSION" 2.8.3; then
|
||||||
|
212
yarn.lock
212
yarn.lock
@ -56,12 +56,12 @@
|
|||||||
jsesc "^2.5.1"
|
jsesc "^2.5.1"
|
||||||
source-map "^0.5.0"
|
source-map "^0.5.0"
|
||||||
|
|
||||||
"@babel/generator@^7.12.1":
|
"@babel/generator@^7.12.5":
|
||||||
version "7.12.1"
|
version "7.12.5"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.1.tgz#0d70be32bdaa03d7c51c8597dda76e0df1f15468"
|
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.5.tgz#a2c50de5c8b6d708ab95be5e6053936c1884a4de"
|
||||||
integrity sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==
|
integrity sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/types" "^7.12.1"
|
"@babel/types" "^7.12.5"
|
||||||
jsesc "^2.5.1"
|
jsesc "^2.5.1"
|
||||||
source-map "^0.5.0"
|
source-map "^0.5.0"
|
||||||
|
|
||||||
@ -80,7 +80,7 @@
|
|||||||
"@babel/helper-explode-assignable-expression" "^7.10.4"
|
"@babel/helper-explode-assignable-expression" "^7.10.4"
|
||||||
"@babel/types" "^7.10.4"
|
"@babel/types" "^7.10.4"
|
||||||
|
|
||||||
"@babel/helper-builder-react-jsx-experimental@^7.12.1":
|
"@babel/helper-builder-react-jsx-experimental@^7.12.4":
|
||||||
version "7.12.4"
|
version "7.12.4"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.4.tgz#55fc1ead5242caa0ca2875dcb8eed6d311e50f48"
|
resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.4.tgz#55fc1ead5242caa0ca2875dcb8eed6d311e50f48"
|
||||||
integrity sha512-AjEa0jrQqNk7eDQOo0pTfUOwQBMF+xVqrausQwT9/rTKy0g04ggFNaJpaE09IQMn9yExluigWMJcj0WC7bq+Og==
|
integrity sha512-AjEa0jrQqNk7eDQOo0pTfUOwQBMF+xVqrausQwT9/rTKy0g04ggFNaJpaE09IQMn9yExluigWMJcj0WC7bq+Og==
|
||||||
@ -187,11 +187,11 @@
|
|||||||
"@babel/types" "^7.11.0"
|
"@babel/types" "^7.11.0"
|
||||||
|
|
||||||
"@babel/helper-member-expression-to-functions@^7.12.1":
|
"@babel/helper-member-expression-to-functions@^7.12.1":
|
||||||
version "7.12.1"
|
version "7.12.7"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz#fba0f2fcff3fba00e6ecb664bb5e6e26e2d6165c"
|
resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz#aa77bd0396ec8114e5e30787efa78599d874a855"
|
||||||
integrity sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==
|
integrity sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/types" "^7.12.1"
|
"@babel/types" "^7.12.7"
|
||||||
|
|
||||||
"@babel/helper-module-imports@^7.10.4":
|
"@babel/helper-module-imports@^7.10.4":
|
||||||
version "7.10.4"
|
version "7.10.4"
|
||||||
@ -201,11 +201,11 @@
|
|||||||
"@babel/types" "^7.10.4"
|
"@babel/types" "^7.10.4"
|
||||||
|
|
||||||
"@babel/helper-module-imports@^7.12.1":
|
"@babel/helper-module-imports@^7.12.1":
|
||||||
version "7.12.1"
|
version "7.12.5"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz#1644c01591a15a2f084dd6d092d9430eb1d1216c"
|
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb"
|
||||||
integrity sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==
|
integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/types" "^7.12.1"
|
"@babel/types" "^7.12.5"
|
||||||
|
|
||||||
"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0":
|
"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0":
|
||||||
version "7.11.0"
|
version "7.11.0"
|
||||||
@ -221,11 +221,11 @@
|
|||||||
lodash "^4.17.19"
|
lodash "^4.17.19"
|
||||||
|
|
||||||
"@babel/helper-optimise-call-expression@^7.10.4":
|
"@babel/helper-optimise-call-expression@^7.10.4":
|
||||||
version "7.10.4"
|
version "7.12.7"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673"
|
resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.7.tgz#7f94ae5e08721a49467346aa04fd22f750033b9c"
|
||||||
integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==
|
integrity sha512-I5xc9oSJ2h59OwyUqjv95HRyzxj53DAubUERgQMrpcCEYQyToeHA+NEcUEsVWB4j53RDeskeBJ0SgRAYHDBckw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/types" "^7.10.4"
|
"@babel/types" "^7.12.7"
|
||||||
|
|
||||||
"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
|
"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
|
||||||
version "7.10.4"
|
version "7.10.4"
|
||||||
@ -260,14 +260,14 @@
|
|||||||
"@babel/types" "^7.10.4"
|
"@babel/types" "^7.10.4"
|
||||||
|
|
||||||
"@babel/helper-replace-supers@^7.12.1":
|
"@babel/helper-replace-supers@^7.12.1":
|
||||||
version "7.12.1"
|
version "7.12.5"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz#f15c9cc897439281891e11d5ce12562ac0cf3fa9"
|
resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz#f009a17543bbbbce16b06206ae73b63d3fca68d9"
|
||||||
integrity sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==
|
integrity sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/helper-member-expression-to-functions" "^7.12.1"
|
"@babel/helper-member-expression-to-functions" "^7.12.1"
|
||||||
"@babel/helper-optimise-call-expression" "^7.10.4"
|
"@babel/helper-optimise-call-expression" "^7.10.4"
|
||||||
"@babel/traverse" "^7.12.1"
|
"@babel/traverse" "^7.12.5"
|
||||||
"@babel/types" "^7.12.1"
|
"@babel/types" "^7.12.5"
|
||||||
|
|
||||||
"@babel/helper-simple-access@^7.10.4":
|
"@babel/helper-simple-access@^7.10.4":
|
||||||
version "7.10.4"
|
version "7.10.4"
|
||||||
@ -296,6 +296,11 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2"
|
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2"
|
||||||
integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==
|
integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==
|
||||||
|
|
||||||
|
"@babel/helper-validator-option@^7.12.1":
|
||||||
|
version "7.12.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz#175567380c3e77d60ff98a54bb015fe78f2178d9"
|
||||||
|
integrity sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==
|
||||||
|
|
||||||
"@babel/helper-wrap-function@^7.10.4":
|
"@babel/helper-wrap-function@^7.10.4":
|
||||||
version "7.10.4"
|
version "7.10.4"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87"
|
resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87"
|
||||||
@ -333,15 +338,15 @@
|
|||||||
chalk "^2.0.0"
|
chalk "^2.0.0"
|
||||||
js-tokens "^4.0.0"
|
js-tokens "^4.0.0"
|
||||||
|
|
||||||
"@babel/parser@^7.10.4", "@babel/parser@^7.11.5":
|
"@babel/parser@^7.11.5":
|
||||||
version "7.11.5"
|
version "7.11.5"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037"
|
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037"
|
||||||
integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==
|
integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==
|
||||||
|
|
||||||
"@babel/parser@^7.12.1":
|
"@babel/parser@^7.12.7":
|
||||||
version "7.12.3"
|
version "7.12.7"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.3.tgz#a305415ebe7a6c7023b40b5122a0662d928334cd"
|
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.7.tgz#fee7b39fe809d0e73e5b25eecaf5780ef3d73056"
|
||||||
integrity sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==
|
integrity sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg==
|
||||||
|
|
||||||
"@babel/plugin-proposal-async-generator-functions@^7.10.4":
|
"@babel/plugin-proposal-async-generator-functions@^7.10.4":
|
||||||
version "7.10.5"
|
version "7.10.5"
|
||||||
@ -739,12 +744,12 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@babel/helper-plugin-utils" "^7.10.4"
|
"@babel/helper-plugin-utils" "^7.10.4"
|
||||||
|
|
||||||
"@babel/plugin-transform-react-jsx-development@^7.12.1":
|
"@babel/plugin-transform-react-jsx-development@^7.12.7":
|
||||||
version "7.12.1"
|
version "7.12.7"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.1.tgz#0b8f8cd531dcf7991f1e5f2c10a2a4f1cfc78e36"
|
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.7.tgz#4c2a647de79c7e2b16bfe4540677ba3121e82a08"
|
||||||
integrity sha512-IilcGWdN1yNgEGOrB96jbTplRh+V2Pz1EoEwsKsHfX1a/L40cUYuD71Zepa7C+ujv7kJIxnDftWeZbKNEqZjCQ==
|
integrity sha512-Rs3ETtMtR3VLXFeYRChle5SsP/P9Jp/6dsewBQfokDSzKJThlsuFcnzLTDRALiUmTC48ej19YD9uN1mupEeEDg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/helper-builder-react-jsx-experimental" "^7.12.1"
|
"@babel/helper-builder-react-jsx-experimental" "^7.12.4"
|
||||||
"@babel/helper-plugin-utils" "^7.10.4"
|
"@babel/helper-plugin-utils" "^7.10.4"
|
||||||
"@babel/plugin-syntax-jsx" "^7.12.1"
|
"@babel/plugin-syntax-jsx" "^7.12.1"
|
||||||
|
|
||||||
@ -762,13 +767,13 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@babel/helper-plugin-utils" "^7.10.4"
|
"@babel/helper-plugin-utils" "^7.10.4"
|
||||||
|
|
||||||
"@babel/plugin-transform-react-jsx@^7.12.1":
|
"@babel/plugin-transform-react-jsx@^7.12.7":
|
||||||
version "7.12.1"
|
version "7.12.7"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.1.tgz#c2d96c77c2b0e4362cc4e77a43ce7c2539d478cb"
|
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.7.tgz#8b14d45f6eccd41b7f924bcb65c021e9f0a06f7f"
|
||||||
integrity sha512-RmKejwnT0T0QzQUzcbP5p1VWlpnP8QHtdhEtLG55ZDQnJNalbF3eeDyu3dnGKvGzFIQiBzFhBYTwvv435p9Xpw==
|
integrity sha512-YFlTi6MEsclFAPIDNZYiCRbneg1MFGao9pPG9uD5htwE0vDbPaMUMeYd6itWjw7K4kro4UbdQf3ljmFl9y48dQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/helper-builder-react-jsx" "^7.10.4"
|
"@babel/helper-builder-react-jsx" "^7.10.4"
|
||||||
"@babel/helper-builder-react-jsx-experimental" "^7.12.1"
|
"@babel/helper-builder-react-jsx-experimental" "^7.12.4"
|
||||||
"@babel/helper-plugin-utils" "^7.10.4"
|
"@babel/helper-plugin-utils" "^7.10.4"
|
||||||
"@babel/plugin-syntax-jsx" "^7.12.1"
|
"@babel/plugin-syntax-jsx" "^7.12.1"
|
||||||
|
|
||||||
@ -952,24 +957,25 @@
|
|||||||
esutils "^2.0.2"
|
esutils "^2.0.2"
|
||||||
|
|
||||||
"@babel/preset-react@^7.12.1":
|
"@babel/preset-react@^7.12.1":
|
||||||
version "7.12.1"
|
version "7.12.7"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.1.tgz#7f022b13f55b6dd82f00f16d1c599ae62985358c"
|
resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.7.tgz#36d61d83223b07b6ac4ec55cf016abb0f70be83b"
|
||||||
integrity sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g==
|
integrity sha512-wKeTdnGUP5AEYCYQIMeXMMwU7j+2opxrG0WzuZfxuuW9nhKvvALBjl67653CWamZJVefuJGI219G591RSldrqQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/helper-plugin-utils" "^7.10.4"
|
"@babel/helper-plugin-utils" "^7.10.4"
|
||||||
"@babel/plugin-transform-react-display-name" "^7.12.1"
|
"@babel/plugin-transform-react-display-name" "^7.12.1"
|
||||||
"@babel/plugin-transform-react-jsx" "^7.12.1"
|
"@babel/plugin-transform-react-jsx" "^7.12.7"
|
||||||
"@babel/plugin-transform-react-jsx-development" "^7.12.1"
|
"@babel/plugin-transform-react-jsx-development" "^7.12.7"
|
||||||
"@babel/plugin-transform-react-jsx-self" "^7.12.1"
|
"@babel/plugin-transform-react-jsx-self" "^7.12.1"
|
||||||
"@babel/plugin-transform-react-jsx-source" "^7.12.1"
|
"@babel/plugin-transform-react-jsx-source" "^7.12.1"
|
||||||
"@babel/plugin-transform-react-pure-annotations" "^7.12.1"
|
"@babel/plugin-transform-react-pure-annotations" "^7.12.1"
|
||||||
|
|
||||||
"@babel/preset-typescript@^7.12.1":
|
"@babel/preset-typescript@^7.12.1":
|
||||||
version "7.12.1"
|
version "7.12.7"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz#86480b483bb97f75036e8864fe404cc782cc311b"
|
resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.12.7.tgz#fc7df8199d6aae747896f1e6c61fc872056632a3"
|
||||||
integrity sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw==
|
integrity sha512-nOoIqIqBmHBSEgBXWR4Dv/XBehtIFcw9PqZw6rFYuKrzsZmOQm3PR5siLBnKZFEsDb03IegG8nSjU/iXXXYRmw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/helper-plugin-utils" "^7.10.4"
|
"@babel/helper-plugin-utils" "^7.10.4"
|
||||||
|
"@babel/helper-validator-option" "^7.12.1"
|
||||||
"@babel/plugin-transform-typescript" "^7.12.1"
|
"@babel/plugin-transform-typescript" "^7.12.1"
|
||||||
|
|
||||||
"@babel/runtime@^7.11.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4":
|
"@babel/runtime@^7.11.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4":
|
||||||
@ -987,13 +993,13 @@
|
|||||||
regenerator-runtime "^0.13.4"
|
regenerator-runtime "^0.13.4"
|
||||||
|
|
||||||
"@babel/template@^7.10.4":
|
"@babel/template@^7.10.4":
|
||||||
version "7.10.4"
|
version "7.12.7"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278"
|
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc"
|
||||||
integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==
|
integrity sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/code-frame" "^7.10.4"
|
"@babel/code-frame" "^7.10.4"
|
||||||
"@babel/parser" "^7.10.4"
|
"@babel/parser" "^7.12.7"
|
||||||
"@babel/types" "^7.10.4"
|
"@babel/types" "^7.12.7"
|
||||||
|
|
||||||
"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5":
|
"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5":
|
||||||
version "7.11.5"
|
version "7.11.5"
|
||||||
@ -1010,34 +1016,34 @@
|
|||||||
globals "^11.1.0"
|
globals "^11.1.0"
|
||||||
lodash "^4.17.19"
|
lodash "^4.17.19"
|
||||||
|
|
||||||
"@babel/traverse@^7.12.1":
|
"@babel/traverse@^7.12.5":
|
||||||
version "7.12.1"
|
version "7.12.9"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.1.tgz#941395e0c5cc86d5d3e75caa095d3924526f0c1e"
|
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.9.tgz#fad26c972eabbc11350e0b695978de6cc8e8596f"
|
||||||
integrity sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==
|
integrity sha512-iX9ajqnLdoU1s1nHt36JDI9KG4k+vmI8WgjK5d+aDTwQbL2fUnzedNedssA645Ede3PM2ma1n8Q4h2ohwXgMXw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/code-frame" "^7.10.4"
|
"@babel/code-frame" "^7.10.4"
|
||||||
"@babel/generator" "^7.12.1"
|
"@babel/generator" "^7.12.5"
|
||||||
"@babel/helper-function-name" "^7.10.4"
|
"@babel/helper-function-name" "^7.10.4"
|
||||||
"@babel/helper-split-export-declaration" "^7.11.0"
|
"@babel/helper-split-export-declaration" "^7.11.0"
|
||||||
"@babel/parser" "^7.12.1"
|
"@babel/parser" "^7.12.7"
|
||||||
"@babel/types" "^7.12.1"
|
"@babel/types" "^7.12.7"
|
||||||
debug "^4.1.0"
|
debug "^4.1.0"
|
||||||
globals "^11.1.0"
|
globals "^11.1.0"
|
||||||
lodash "^4.17.19"
|
lodash "^4.17.19"
|
||||||
|
|
||||||
"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.11.5", "@babel/types@^7.4.4":
|
"@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.12.7":
|
||||||
version "7.11.5"
|
version "7.12.7"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d"
|
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.7.tgz#6039ff1e242640a29452c9ae572162ec9a8f5d13"
|
||||||
integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==
|
integrity sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/helper-validator-identifier" "^7.10.4"
|
"@babel/helper-validator-identifier" "^7.10.4"
|
||||||
lodash "^4.17.19"
|
lodash "^4.17.19"
|
||||||
to-fast-properties "^2.0.0"
|
to-fast-properties "^2.0.0"
|
||||||
|
|
||||||
"@babel/types@^7.12.1":
|
"@babel/types@^7.10.5", "@babel/types@^7.11.5", "@babel/types@^7.4.4":
|
||||||
version "7.12.1"
|
version "7.11.5"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.1.tgz#e109d9ab99a8de735be287ee3d6a9947a190c4ae"
|
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d"
|
||||||
integrity sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==
|
integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/helper-validator-identifier" "^7.10.4"
|
"@babel/helper-validator-identifier" "^7.10.4"
|
||||||
lodash "^4.17.19"
|
lodash "^4.17.19"
|
||||||
@ -1066,9 +1072,9 @@
|
|||||||
mkdirp "^1.0.4"
|
mkdirp "^1.0.4"
|
||||||
|
|
||||||
"@pmmmwh/react-refresh-webpack-plugin@^0.4.2":
|
"@pmmmwh/react-refresh-webpack-plugin@^0.4.2":
|
||||||
version "0.4.2"
|
version "0.4.3"
|
||||||
resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.2.tgz#1f9741e0bde9790a0e13272082ed7272a083620d"
|
resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz#1eec460596d200c0236bf195b078a5d1df89b766"
|
||||||
integrity sha512-Loc4UDGutcZ+Bd56hBInkm6JyjyCwWy4t2wcDXzN8EDPANgVRj0VP8Nxn0Zq2pc+WKauZwEivQgbDGg4xZO20A==
|
integrity sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
ansi-html "^0.0.7"
|
ansi-html "^0.0.7"
|
||||||
error-stack-parser "^2.0.6"
|
error-stack-parser "^2.0.6"
|
||||||
@ -1121,6 +1127,18 @@
|
|||||||
webpack-cli "^3.3.12"
|
webpack-cli "^3.3.12"
|
||||||
webpack-sources "^1.4.3"
|
webpack-sources "^1.4.3"
|
||||||
|
|
||||||
|
"@stripe/react-stripe-js@^1.1.2":
|
||||||
|
version "1.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@stripe/react-stripe-js/-/react-stripe-js-1.1.2.tgz#a7f5ef5b4d7dc7fa723501b706644414cfe6dcba"
|
||||||
|
integrity sha512-07hu8RJXwWKGbvdvd1yt1cYvGtDB8jFX+q10f7FQuItUt9rlSo0am3WIx845iMHANiYgxyRb1PS201Yle9xxPQ==
|
||||||
|
dependencies:
|
||||||
|
prop-types "^15.7.2"
|
||||||
|
|
||||||
|
"@stripe/stripe-js@^1.11.0":
|
||||||
|
version "1.11.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@stripe/stripe-js/-/stripe-js-1.11.0.tgz#00e812d72a7760dae08237875066d263671478ee"
|
||||||
|
integrity sha512-SDNZKuETBEVkernd1tq8tL6wNfVKrl24Txs3p+4NYxoaIbNaEO7mrln/2Y/WRcQBWjagvhDIM5I6+X1rfK0qhQ==
|
||||||
|
|
||||||
"@types/angular@^1.6.39":
|
"@types/angular@^1.6.39":
|
||||||
version "1.7.3"
|
version "1.7.3"
|
||||||
resolved "https://registry.yarnpkg.com/@types/angular/-/angular-1.7.3.tgz#138c2f2f688e9dcb413c6052d9483d773ce7f627"
|
resolved "https://registry.yarnpkg.com/@types/angular/-/angular-1.7.3.tgz#138c2f2f688e9dcb413c6052d9483d773ce7f627"
|
||||||
@ -1416,7 +1434,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2:
|
|||||||
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
|
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
|
||||||
integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
|
integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
|
||||||
|
|
||||||
ajv@^6.1.0, ajv@^6.12.3, ajv@^6.12.4:
|
ajv@^6.1.0, ajv@^6.12.3:
|
||||||
version "6.12.4"
|
version "6.12.4"
|
||||||
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234"
|
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234"
|
||||||
integrity sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==
|
integrity sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==
|
||||||
@ -1436,6 +1454,16 @@ ajv@^6.10.0, ajv@^6.10.2:
|
|||||||
json-schema-traverse "^0.4.1"
|
json-schema-traverse "^0.4.1"
|
||||||
uri-js "^4.2.2"
|
uri-js "^4.2.2"
|
||||||
|
|
||||||
|
ajv@^6.12.4:
|
||||||
|
version "6.12.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
|
||||||
|
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
|
||||||
|
dependencies:
|
||||||
|
fast-deep-equal "^3.1.1"
|
||||||
|
fast-json-stable-stringify "^2.0.0"
|
||||||
|
json-schema-traverse "^0.4.1"
|
||||||
|
uri-js "^4.2.2"
|
||||||
|
|
||||||
alphanum-sort@^1.0.0:
|
alphanum-sort@^1.0.0:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
|
resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
|
||||||
@ -2362,7 +2390,7 @@ chalk@^1.1.1:
|
|||||||
strip-ansi "^3.0.0"
|
strip-ansi "^3.0.0"
|
||||||
supports-color "^2.0.0"
|
supports-color "^2.0.0"
|
||||||
|
|
||||||
chalk@^2.0, chalk@^2.4.1, chalk@^2.4.2:
|
chalk@^2.0, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2:
|
||||||
version "2.4.2"
|
version "2.4.2"
|
||||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
|
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
|
||||||
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
|
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
|
||||||
@ -2371,7 +2399,7 @@ chalk@^2.0, chalk@^2.4.1, chalk@^2.4.2:
|
|||||||
escape-string-regexp "^1.0.5"
|
escape-string-regexp "^1.0.5"
|
||||||
supports-color "^5.3.0"
|
supports-color "^5.3.0"
|
||||||
|
|
||||||
chalk@^2.0.0, chalk@^2.1.0:
|
chalk@^2.1.0:
|
||||||
version "2.4.1"
|
version "2.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
|
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
|
||||||
integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==
|
integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==
|
||||||
@ -3091,7 +3119,14 @@ debug@^4.0.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
ms "^2.1.1"
|
ms "^2.1.1"
|
||||||
|
|
||||||
debug@^4.1.0, debug@^4.1.1:
|
debug@^4.1.0:
|
||||||
|
version "4.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
|
||||||
|
integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
|
||||||
|
dependencies:
|
||||||
|
ms "2.1.2"
|
||||||
|
|
||||||
|
debug@^4.1.1:
|
||||||
version "4.1.1"
|
version "4.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
|
resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
|
||||||
integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
|
integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
|
||||||
@ -3921,14 +3956,14 @@ extsprintf@^1.2.0:
|
|||||||
integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
|
integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
|
||||||
|
|
||||||
fast-deep-equal@^3.1.1:
|
fast-deep-equal@^3.1.1:
|
||||||
version "3.1.1"
|
version "3.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4"
|
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
|
||||||
integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==
|
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
|
||||||
|
|
||||||
fast-json-stable-stringify@^2.0.0:
|
fast-json-stable-stringify@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
|
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
|
||||||
integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
|
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
|
||||||
|
|
||||||
fast-levenshtein@~2.0.6:
|
fast-levenshtein@~2.0.6:
|
||||||
version "2.0.6"
|
version "2.0.6"
|
||||||
@ -5959,11 +5994,16 @@ ms@2.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
|
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
|
||||||
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
|
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
|
||||||
|
|
||||||
ms@2.1.1, ms@^2.1.1:
|
ms@2.1.1:
|
||||||
version "2.1.1"
|
version "2.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
|
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
|
||||||
integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
|
integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
|
||||||
|
|
||||||
|
ms@2.1.2, ms@^2.1.1:
|
||||||
|
version "2.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
|
||||||
|
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
|
||||||
|
|
||||||
multicast-dns-service-types@^1.1.0:
|
multicast-dns-service-types@^1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901"
|
resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901"
|
||||||
@ -7657,9 +7697,9 @@ react-lifecycles-compat@^3.0.0:
|
|||||||
integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
|
integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
|
||||||
|
|
||||||
react-modal@^3.11.2:
|
react-modal@^3.11.2:
|
||||||
version "3.11.2"
|
version "3.12.1"
|
||||||
resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.11.2.tgz#bad911976d4add31aa30dba8a41d11e21c4ac8a4"
|
resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.12.1.tgz#38c33f70d81c33d02ff1ed115530443a3dc2afd3"
|
||||||
integrity sha512-o8gvvCOFaG1T7W6JUvsYjRjMVToLZgLIsi5kdhFIQCtHxDkA47LznX62j+l6YQkpXDbvQegsDyxe/+JJsFQN7w==
|
integrity sha512-WGuXn7Fq31PbFJwtWmOk+jFtGC7E9tJVbFX0lts8ZoS5EPi9+WWylUJWLKKVm3H4GlQ7ZxY7R6tLlbSIBQ5oZA==
|
||||||
dependencies:
|
dependencies:
|
||||||
exenv "^1.2.0"
|
exenv "^1.2.0"
|
||||||
prop-types "^15.5.10"
|
prop-types "^15.5.10"
|
||||||
@ -9214,9 +9254,9 @@ upath@^1.1.1:
|
|||||||
integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
|
integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
|
||||||
|
|
||||||
uri-js@^4.2.2:
|
uri-js@^4.2.2:
|
||||||
version "4.2.2"
|
version "4.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
|
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602"
|
||||||
integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==
|
integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==
|
||||||
dependencies:
|
dependencies:
|
||||||
punycode "^2.1.0"
|
punycode "^2.1.0"
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user