@base44/app-plugin-commerce 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/README.md +4 -10
  2. package/base44/entities/commerce.ProductReview.jsonc +2 -2
  3. package/base44/functions/commerce/storefront-catalog/entry.ts +7 -3
  4. package/package.json +1 -1
  5. package/scripts/install.js +2 -4
  6. package/skills/commerce/SKILL.md +9 -3
  7. package/skills/commerce/docs/api-storefront.md +3 -3
  8. package/skills/commerce/install/01-install.md +8 -24
  9. package/skills/commerce/install/02-storefront.md +21 -9
  10. package/skills/commerce/references/admin-localization.md +95 -0
  11. package/skills/commerce/references/reviews.md +7 -6
  12. package/src/commerce/admin/README.md +36 -14
  13. package/src/commerce/admin/bot/StoreAdminBot.jsx +12 -11
  14. package/src/commerce/admin/components/AddressForm.jsx +13 -12
  15. package/src/commerce/admin/components/ConfirmDialog.jsx +5 -4
  16. package/src/commerce/admin/components/CountrySelect.jsx +12 -8
  17. package/src/commerce/admin/components/DataTable.jsx +3 -2
  18. package/src/commerce/admin/components/DateRangePicker.jsx +11 -10
  19. package/src/commerce/admin/components/EmptyState.jsx +2 -1
  20. package/src/commerce/admin/components/MediaUploader.jsx +3 -2
  21. package/src/commerce/admin/components/MetaDataEditor.jsx +4 -3
  22. package/src/commerce/admin/components/SearchSelect.jsx +4 -3
  23. package/src/commerce/admin/context/SettingsContext.jsx +12 -25
  24. package/src/commerce/admin/hooks/useMoney.js +3 -2
  25. package/src/commerce/admin/i18n/index.js +54 -0
  26. package/src/commerce/admin/i18n/locales/de.js +896 -0
  27. package/src/commerce/admin/i18n/locales/en.js +900 -0
  28. package/src/commerce/admin/i18n/locales/es.js +896 -0
  29. package/src/commerce/admin/i18n/locales/fr.js +896 -0
  30. package/src/commerce/admin/i18n/locales/ja.js +896 -0
  31. package/src/commerce/admin/i18n/locales/pt.js +896 -0
  32. package/src/commerce/admin/index.jsx +6 -30
  33. package/src/commerce/admin/layout/AccessDenied.jsx +8 -9
  34. package/src/commerce/admin/layout/AuthGuard.jsx +2 -1
  35. package/src/commerce/admin/layout/Sidebar.jsx +29 -18
  36. package/src/commerce/admin/layout/Topbar.jsx +4 -3
  37. package/src/commerce/admin/lib/api.js +3 -2
  38. package/src/commerce/admin/lib/constants.js +44 -43
  39. package/src/commerce/admin/lib/format.js +4 -3
  40. package/src/commerce/admin/lib/paths.js +2 -3
  41. package/src/commerce/admin/pages/Dashboard.jsx +25 -24
  42. package/src/commerce/admin/pages/coupons/CouponEditor.jsx +55 -57
  43. package/src/commerce/admin/pages/coupons/CouponsList.jsx +22 -21
  44. package/src/commerce/admin/pages/customers/CustomerEditor.jsx +31 -30
  45. package/src/commerce/admin/pages/customers/CustomersList.jsx +19 -18
  46. package/src/commerce/admin/pages/orders/OrderEditor.jsx +75 -71
  47. package/src/commerce/admin/pages/orders/OrdersList.jsx +16 -15
  48. package/src/commerce/admin/pages/orders/components/AddProductDialog.jsx +12 -11
  49. package/src/commerce/admin/pages/orders/components/DownloadPermissionsPanel.jsx +14 -13
  50. package/src/commerce/admin/pages/orders/components/LineItemsTable.jsx +12 -11
  51. package/src/commerce/admin/pages/orders/components/OrderNotesPanel.jsx +11 -10
  52. package/src/commerce/admin/pages/orders/components/PaymentPanel.jsx +22 -22
  53. package/src/commerce/admin/pages/orders/components/RefundPanel.jsx +18 -17
  54. package/src/commerce/admin/pages/orders/components/TotalsBox.jsx +18 -17
  55. package/src/commerce/admin/pages/products/Categories.jsx +14 -13
  56. package/src/commerce/admin/pages/products/ProductEditor.jsx +16 -15
  57. package/src/commerce/admin/pages/products/ProductsList.jsx +41 -36
  58. package/src/commerce/admin/pages/products/Reviews.jsx +54 -46
  59. package/src/commerce/admin/pages/products/components/AttributesSection.jsx +45 -39
  60. package/src/commerce/admin/pages/products/components/ProductDataPanel.jsx +8 -7
  61. package/src/commerce/admin/pages/products/components/PublishBox.jsx +10 -9
  62. package/src/commerce/admin/pages/products/components/TaxonomyPanel.jsx +18 -17
  63. package/src/commerce/admin/pages/products/components/tabs/DownloadsTab.jsx +11 -10
  64. package/src/commerce/admin/pages/products/components/tabs/LinkedTab.jsx +9 -10
  65. package/src/commerce/admin/pages/products/components/tabs/ModifiersTab.jsx +3 -9
  66. package/src/commerce/admin/pages/products/components/tabs/PriceInventoryTab.jsx +76 -78
  67. package/src/commerce/admin/pages/reports/Reports.jsx +33 -32
  68. package/src/commerce/admin/pages/settings/EmailsSettings.jsx +36 -39
  69. package/src/commerce/admin/pages/settings/GeneralSettings.jsx +13 -14
  70. package/src/commerce/admin/pages/settings/InventorySettings.jsx +12 -13
  71. package/src/commerce/admin/pages/settings/LocationEditor.jsx +48 -47
  72. package/src/commerce/admin/pages/settings/PaymentsSettings.jsx +32 -33
  73. package/src/commerce/admin/pages/settings/SettingsLayout.jsx +13 -12
  74. package/src/commerce/admin/pages/settings/ShippingTaxSettings.jsx +31 -31
  75. package/src/commerce/admin/pages/settings/useGroupForm.jsx +4 -3
  76. package/src/commerce/admin/pages/status/WebhookEditor.jsx +34 -31
  77. package/src/commerce/admin/pages/status/Webhooks.jsx +11 -10
  78. package/src/commerce/admin/routes.jsx +31 -43
  79. package/src/commerce/storefront/pickers.jsx +19 -5
  80. package/src/commerce/storefront/useCheckout.jsx +28 -3
  81. package/src/commerce/utils/storefront.js +49 -2
@@ -0,0 +1,896 @@
1
+ /**
2
+ * Português (Portuguese). Same keys as en.js — a key missing here falls back to
3
+ * the English value. `{placeholders}` are kept verbatim.
4
+ */
5
+ export default {
6
+ $locale: "pt",
7
+
8
+ // ── shared vocabulary ───────────────────────────────────────────
9
+ "common.add": "Adicionar",
10
+ "common.amount": "Valor",
11
+ "common.cancel": "Cancelar",
12
+ "common.confirm": "Confirmar",
13
+ "common.delete": "Eliminar",
14
+ "common.description": "Descrição",
15
+ "common.edit": "Editar",
16
+ "common.email": "E-mail",
17
+ "common.name": "Nome",
18
+ "common.no_results": "Sem resultados.",
19
+ "common.phone": "Telefone",
20
+ "common.request_failed": "O pedido falhou",
21
+ "common.save": "Guardar",
22
+ "common.search": "Pesquisar…",
23
+ "common.selected_count": "{count} selecionados",
24
+ "common.status": "Estado",
25
+ "common.type": "Tipo",
26
+ "common.upload_failed": "Falha no envio do ficheiro",
27
+
28
+ // ── generic table ───────────────────────────────────────────────
29
+ "table.empty_title": "Ainda não há nada aqui",
30
+ "table.page": "Página {page}",
31
+
32
+ // ── confirm dialog ──────────────────────────────────────────────
33
+ "confirm.description": "Esta ação não pode ser anulada.",
34
+ "confirm.title": "Tem a certeza?",
35
+
36
+ // ── date-range presets ──────────────────────────────────────────
37
+ "dates.all_time": "Todo o período",
38
+ "dates.last_7_days": "Últimos 7 dias",
39
+ "dates.last_month": "Mês passado",
40
+ "dates.this_month": "Este mês",
41
+ "dates.this_year": "Este ano",
42
+ "dates.today": "Hoje",
43
+
44
+ // ── navigation ──────────────────────────────────────────────────
45
+ "nav.all_products": "Todos os produtos",
46
+ "nav.marketing_group": "Marketing",
47
+ "nav.products_group": "Produtos",
48
+ "nav.store_management": "Gestão da loja",
49
+ "nav.storeadmin_bot": "Bot StoreAdmin",
50
+ "nav.view_storefront": "Ver a loja",
51
+
52
+ // ── route + breadcrumb labels ───────────────────────────────────
53
+ "routes.categories": "Categorias",
54
+ "routes.coupons": "Cupões",
55
+ "routes.coupons_edit": "Editar cupão",
56
+ "routes.coupons_new": "Adicionar cupão",
57
+ "routes.customer": "Cliente",
58
+ "routes.customers": "Clientes",
59
+ "routes.customers_new": "Adicionar cliente",
60
+ "routes.dashboard": "Painel",
61
+ "routes.order": "Encomenda",
62
+ "routes.orders": "Encomendas",
63
+ "routes.orders_new": "Adicionar encomenda",
64
+ "routes.products": "Produtos",
65
+ "routes.products_edit": "Editar produto",
66
+ "routes.products_new": "Adicionar produto",
67
+ "routes.reports": "Relatórios",
68
+ "routes.reviews": "Avaliações",
69
+ "routes.settings": "Definições",
70
+ "routes.settings_emails": "E-mails",
71
+ "routes.settings_general": "Geral",
72
+ "routes.settings_inventory": "Inventário",
73
+ "routes.settings_location": "Localização",
74
+ "routes.settings_payments": "Pagamentos",
75
+ "routes.settings_shipping_tax": "Envio e impostos",
76
+ "routes.settings_webhooks": "Webhooks",
77
+ "routes.webhook": "Webhook",
78
+ "routes.webhooks_new": "Adicionar webhook",
79
+
80
+ // ── 404 ─────────────────────────────────────────────────────────
81
+ "notfound.back": "Voltar ao painel",
82
+ "notfound.description": "Esta não é uma página de administração.",
83
+ "notfound.title": "Página não encontrada",
84
+
85
+ // ── auth / access screens ───────────────────────────────────────
86
+ "auth.admin_required": "É necessário acesso de administrador",
87
+ "auth.administrator": "Administrador",
88
+ "auth.checking_access": "A verificar o seu acesso…",
89
+ "auth.must_sign_in": "Tem de iniciar sessão para aceder à administração da loja.",
90
+ "auth.no_admin_role": "A sua conta não tem a função de administrador. Peça a um administrador da loja que lhe conceda acesso.",
91
+ "auth.sign_in": "Iniciar sessão",
92
+ "auth.sign_in_required": "É necessário iniciar sessão",
93
+ "auth.sign_in_timeout": "Não foi possível confirmar a sua identidade. Inicie sessão para continuar — se esta página estiver incorporada num painel de pré-visualização, abra-a primeiro num separador próprio, pois o início de sessão não se conclui dentro de uma frame.",
94
+ "auth.sign_out": "Terminar sessão",
95
+ "auth.signed_in_as": "Sessão iniciada como {email}",
96
+
97
+ // ── address form ────────────────────────────────────────────────
98
+ "address.city": "Cidade",
99
+ "address.company": "Empresa",
100
+ "address.country": "País",
101
+ "address.first_name": "Nome próprio",
102
+ "address.last_name": "Apelido",
103
+ "address.line1": "Morada linha 1",
104
+ "address.line2": "Morada linha 2",
105
+ "address.postcode": "Código postal",
106
+ "address.select_state": "Selecione o distrito…",
107
+ "address.state": "Distrito / Estado",
108
+
109
+ // ── country picker ──────────────────────────────────────────────
110
+ "country.any": "Qualquer país",
111
+ "country.none_found": "Nenhum país encontrado.",
112
+ "country.search": "Pesquisar países…",
113
+ "country.select": "Selecione um país…",
114
+
115
+ // ── media uploader ──────────────────────────────────────────────
116
+ "media.add_images": "Adicionar imagens",
117
+ "media.set_image": "Definir imagem",
118
+
119
+ // ── meta-data editor ────────────────────────────────────────────
120
+ "meta.add_field": "Adicionar campo",
121
+ "meta.key": "Chave",
122
+ "meta.value": "Valor",
123
+
124
+ // ── first-run setup screen ──────────────────────────────────────
125
+ "setup.description": "Isto parece ser uma instalação nova. Inicialize a loja com as definições predefinidas (moeda, classes de imposto, métodos de pagamento, zona de envio e configuração de e-mail) para começar a usar a administração.",
126
+ "setup.run": "Inicializar predefinições da loja",
127
+ "setup.sample_hint": "Adiciona categorias de demonstração, 10 produtos (três com variantes de tamanho/cor e um descarregável) e cupões para poder explorar a administração.",
128
+ "setup.sample_label": "Incluir dados de exemplo",
129
+ "setup.schema_error_description": "Os esquemas de entidade desta aplicação foram alterados de forma que impede a inicialização. Restaure os esquemas do modelo ou corrija os campos abaixo e tente novamente.",
130
+ "setup.schema_error_title": "Os esquemas de entidade são incompatíveis",
131
+ "setup.store_name": "Nome da loja",
132
+ "setup.store_name_hint": "Usado no assunto e como nome do remetente em todos os e-mails transacionais. Editável depois em Definições → E-mails.",
133
+ "setup.store_name_placeholder": "O nome da sua loja",
134
+ "setup.success": "Predefinições da loja inicializadas",
135
+ "setup.title": "Configure a sua loja",
136
+
137
+ // ── status enums ────────────────────────────────────────────────
138
+ "status.order.cancelled": "Cancelada",
139
+ "status.order.completed": "Concluída",
140
+ "status.order.failed": "Falhada",
141
+ "status.order.on-hold": "Em espera",
142
+ "status.order.pending": "Pagamento pendente",
143
+ "status.order.processing": "Em processamento",
144
+ "status.order.refunded": "Reembolsada",
145
+ "status.product.draft": "Rascunho",
146
+ "status.product.pending": "Pendente de revisão",
147
+ "status.product.private": "Privado",
148
+ "status.product.publish": "Publicado",
149
+ "status.review.approved": "Aprovada",
150
+ "status.review.hold": "Pendente",
151
+ "status.review.spam": "Spam",
152
+ "status.review.trash": "Lixo",
153
+ "status.stock.instock": "Em stock",
154
+ "status.stock.onbackorder": "Em reposição",
155
+ "status.stock.outofstock": "Sem stock",
156
+ "status.webhook.active": "Ativo",
157
+ "status.webhook.disabled": "Desativado",
158
+ "status.webhook.paused": "Em pausa",
159
+
160
+ // ── backorder options ───────────────────────────────────────────
161
+ "backorder.no": "Não permitir",
162
+ "backorder.notify": "Permitir, mas avisar o cliente",
163
+ "backorder.yes": "Permitir",
164
+
165
+ // ── tax status ──────────────────────────────────────────────────
166
+ "tax_status.none": "Nenhum",
167
+ "tax_status.taxable": "Sujeito a imposto",
168
+
169
+ // ── coupon types ────────────────────────────────────────────────
170
+ "coupon_type.fixed_cart": "Desconto fixo no carrinho",
171
+ "coupon_type.fixed_product": "Desconto fixo por produto",
172
+ "coupon_type.percent": "Desconto percentual",
173
+
174
+ // ── transactional emails ────────────────────────────────────────
175
+ "email_type.cancelled_order": "Encomenda cancelada",
176
+ "email_type.completed_order": "Encomenda concluída",
177
+ "email_type.customer_invoice": "Fatura do cliente / Detalhes da encomenda",
178
+ "email_type.customer_note": "Nota ao cliente",
179
+ "email_type.failed_order": "Encomenda falhada",
180
+ "email_type.low_stock": "Stock baixo",
181
+ "email_type.new_account": "Nova conta",
182
+ "email_type.new_order": "Nova encomenda",
183
+ "email_type.on_hold_order": "Encomenda em espera",
184
+ "email_type.out_of_stock": "Sem stock",
185
+ "email_type.processing_order": "Encomenda em processamento",
186
+ "email_type.refunded_order": "Encomenda reembolsada",
187
+ "email_type.reset_password": "Repor palavra-passe",
188
+
189
+ // ── dashboard ───────────────────────────────────────────────────
190
+ "dashboard.all_stocked_description": "Nenhum produto está com stock baixo.",
191
+ "dashboard.all_stocked_title": "Stock em dia",
192
+ "dashboard.awaiting_processing": "A aguardar processamento",
193
+ "dashboard.create_coupon": "Criar cupão",
194
+ "dashboard.date": "Data",
195
+ "dashboard.latest_orders": "Últimas encomendas",
196
+ "dashboard.low_on_stock": "Stock baixo",
197
+ "dashboard.low_stock": "Stock baixo",
198
+ "dashboard.low_stock_hint": "produtos no limiar ou abaixo dele",
199
+ "dashboard.n_left": "restam {count}",
200
+ "dashboard.net_sales_month": "Vendas líquidas este mês",
201
+ "dashboard.net_sales_today": "Vendas líquidas hoje",
202
+ "dashboard.no_orders_description": "As encomendas aparecerão aqui assim que chegarem.",
203
+ "dashboard.no_orders_title": "Ainda não há encomendas",
204
+ "dashboard.orders_to_fulfill": "encomendas por preparar",
205
+ "dashboard.sku": "SKU: {sku}",
206
+ "dashboard.status_count": "{status}: {count}",
207
+ "dashboard.subtitle": "A sua loja num relance.",
208
+ "dashboard.total": "Total",
209
+ "dashboard.view_reports": "Ver relatórios",
210
+
211
+ // ── orders ──────────────────────────────────────────────────────
212
+ "orders.add_fee": "Adicionar taxa",
213
+ "orders.add_note_placeholder": "Adicionar uma nota…",
214
+ "orders.add_products": "Adicionar produto(s)",
215
+ "orders.add_shipping": "Adicionar envio",
216
+ "orders.add_to_order": "Adicionar à encomenda",
217
+ "orders.addr_billing": "faturação",
218
+ "orders.addr_shipping": "envio",
219
+ "orders.all": "Todas",
220
+ "orders.already_customer_linked": "{name} já é cliente — associado. Guarde a encomenda para manter a associação.",
221
+ "orders.and_separator": " e ",
222
+ "orders.apply": "Aplicar",
223
+ "orders.apply_coupon": "Aplicar cupão",
224
+ "orders.apply_coupon_dirty_tip": "Guarda as alterações pendentes e depois aplica o cupão",
225
+ "orders.available_to_refund": "Total disponível para reembolso:",
226
+ "orders.awaiting_payment": "A aguardar pagamento",
227
+ "orders.billing": "Faturação",
228
+ "orders.change_status_to": "Mudar estado para…",
229
+ "orders.check_payment": "Verificar pagamento",
230
+ "orders.choose_variation": "Escolha uma variação…",
231
+ "orders.close_refund": "Fechar reembolso",
232
+ "orders.copy_failed": "Não foi possível copiar — selecione a ligação e copie manualmente",
233
+ "orders.copy_from_billing": "Copiar a morada de faturação para o envio",
234
+ "orders.copy_link": "Copiar ligação",
235
+ "orders.cost": "Custo",
236
+ "orders.coupon_applied": "Cupão {code} aplicado",
237
+ "orders.coupon_code": "Código do cupão",
238
+ "orders.coupon_code_placeholder": "p. ex. welcome10",
239
+ "orders.coupon_removed": "Cupão {code} removido",
240
+ "orders.coupons_codes": "Cupão(ões): {codes}",
241
+ "orders.coupons_label": "Cupões:",
242
+ "orders.create_payment_link": "Criar ligação de pagamento",
243
+ "orders.custom_fields": "Campos personalizados",
244
+ "orders.customer_created": "Cliente {name} criado. Guarde a encomenda para manter a associação.",
245
+ "orders.customer_load_failed": "Não foi possível carregar esse registo de cliente",
246
+ "orders.customer_no_saved_address": "Esse cliente não tem nenhuma morada guardada",
247
+ "orders.customer_provided_note": "Nota deixada pelo cliente",
248
+ "orders.date": "Data",
249
+ "orders.delete_note": "Eliminar nota",
250
+ "orders.delete_order": "Eliminar encomenda",
251
+ "orders.delete_order_description": "Só podem ser eliminadas encomendas pendentes, canceladas ou falhadas. Esta ação não pode ser anulada.",
252
+ "orders.delete_order_title": "Eliminar a encomenda n.º {number}?",
253
+ "orders.deleted": "Encomenda eliminada",
254
+ "orders.discount": "Desconto",
255
+ "orders.download_granted": "Acesso à transferência concedido",
256
+ "orders.download_permissions": "Permissões de produtos descarregáveis",
257
+ "orders.download_revoked": "Acesso à transferência revogado",
258
+ "orders.empty_description": "As encomendas aparecerão aqui à medida que chegarem.",
259
+ "orders.empty_search_hint": "Experimente ajustar a pesquisa ou o intervalo de datas.",
260
+ "orders.empty_title": "Não foram encontradas encomendas",
261
+ "orders.expires": "Expira",
262
+ "orders.fee": "Taxa",
263
+ "orders.fee_name": "Nome da taxa",
264
+ "orders.fees": "Taxas",
265
+ "orders.file": "Ficheiro",
266
+ "orders.filled_from": "{parts} preenchido(a) a partir de {name}",
267
+ "orders.from_billing": "Da faturação",
268
+ "orders.general": "Geral",
269
+ "orders.grant_access": "Conceder acesso",
270
+ "orders.guest_order": "Encomenda de convidado",
271
+ "orders.guest_order_hint": "Encomenda de convidado. Escolha um cliente para preencher as moradas a partir do registo dele, ou introduza os dados abaixo — o e-mail de faturação é para onde seguem os e-mails desta encomenda.",
272
+ "orders.guest_order_needs_email": "Encomenda de convidado — falta o e-mail de faturação",
273
+ "orders.guest_search_customers": "Convidado — pesquisar clientes…",
274
+ "orders.invoice_sent": "Detalhes da encomenda enviados ao cliente",
275
+ "orders.item": "Artigo",
276
+ "orders.items": "Artigos",
277
+ "orders.items_subtotal": "Subtotal dos artigos",
278
+ "orders.kept_existing_addresses": "Mantivemos as moradas que já estavam nesta encomenda — use «Usar as moradas do cliente» para as substituir.",
279
+ "orders.link_copied": "Ligação copiada",
280
+ "orders.link_sets_method": "Enviar uma ligação de pagamento passa esta encomenda para pagamento com cartão.",
281
+ "orders.link_switches_method": "Enviar uma ligação de pagamento muda esta encomenda de {method} para pagamento com cartão.",
282
+ "orders.loading_variations": "A carregar variações…",
283
+ "orders.method": "Método",
284
+ "orders.method_title": "Nome do método",
285
+ "orders.n_orders": "{count} encomenda(s)",
286
+ "orders.n_updated": "{count} encomenda(s) atualizadas",
287
+ "orders.net_payment": "Pagamento líquido",
288
+ "orders.never": "Nunca",
289
+ "orders.new_payment_link": "Nova ligação de pagamento",
290
+ "orders.no_address_set": "Nenhuma morada definida.",
291
+ "orders.no_card_payment_tip": "Esta encomenda não tem nenhum pagamento com cartão registado para reembolsar",
292
+ "orders.no_download_permissions": "Esta encomenda não tem permissões de transferência.",
293
+ "orders.no_items": "Sem artigos.",
294
+ "orders.no_items_hint": "Use «Adicionar produto(s)» abaixo.",
295
+ "orders.no_notes": "Ainda não há notas.",
296
+ "orders.no_payment_method_hint": "Esta encomenda não tem método de pagamento definido. Receba o pagamento fora da loja e passe-a para «Em processamento», ou envie ao cliente uma ligação de pagamento.",
297
+ "orders.no_payment_yet": "Ainda não foi recebido nenhum pagamento",
298
+ "orders.no_saved_address_enter_below": "{name} não tem nenhuma morada guardada — introduza os dados abaixo.",
299
+ "orders.no_variations": "Este produto ainda não tem variações.",
300
+ "orders.not_found": "Encomenda não encontrada.",
301
+ "orders.note_added": "Nota adicionada",
302
+ "orders.note_sent": "Nota enviada ao cliente",
303
+ "orders.note_to_customer": "Nota para o cliente",
304
+ "orders.open": "Abrir",
305
+ "orders.open_customer": "Abrir cliente",
306
+ "orders.order_actions": "Ações da encomenda",
307
+ "orders.order_notes": "Notas da encomenda",
308
+ "orders.order_number": "N.º da encomenda",
309
+ "orders.order_total": "Total da encomenda",
310
+ "orders.paid": "Paga",
311
+ "orders.pay_outside_hint": "Esta encomenda está definida para ser paga fora da loja ({method}); marque-a como paga passando-a para «Em processamento» assim que receber o valor.",
312
+ "orders.payment": "Pagamento",
313
+ "orders.payment_confirmed": "Pagamento confirmado",
314
+ "orders.payment_link_created": "Ligação de pagamento criada",
315
+ "orders.payment_link_hint": "Envie-a ao cliente — abre a página de pagamento segura do fornecedor. A encomenda atualiza-se sozinha depois de ele pagar.",
316
+ "orders.placed_via": "{date} via {via}",
317
+ "orders.preview_failed": "Não foi possível calcular estas alterações:",
318
+ "orders.preview_failed_generic": "Não foi possível calcular estas alterações",
319
+ "orders.previous_refunds": "Reembolsos anteriores",
320
+ "orders.pricing_changes": "A calcular as suas alterações…",
321
+ "orders.private_note": "Nota privada",
322
+ "orders.product": "Produto",
323
+ "orders.qty": "Qtd.",
324
+ "orders.quantity": "Quantidade",
325
+ "orders.recalculate": "Recalcular",
326
+ "orders.recalculate_dirty_tip": "Guarda as alterações pendentes e recalcula impostos e totais com as definições atuais",
327
+ "orders.recalculate_tip": "Recalcular impostos e totais com as definições atuais",
328
+ "orders.recalculated": "Totais recalculados",
329
+ "orders.reference": "Referência",
330
+ "orders.refund": "Reembolso",
331
+ "orders.refund_amount": "Reembolso",
332
+ "orders.refund_over_max": "O valor excede o total reembolsável.",
333
+ "orders.refund_reason": "Motivo do reembolso (opcional)",
334
+ "orders.refund_shipping": "Reembolsar o envio",
335
+ "orders.refund_via_provider": "Devolver o dinheiro através do fornecedor de pagamento",
336
+ "orders.refunded": "Reembolsado",
337
+ "orders.refunded_amount": "Reembolsado {amount}",
338
+ "orders.refunded_by": "por {name}",
339
+ "orders.refunded_via_provider": "Reembolsado {amount} através do fornecedor de pagamento",
340
+ "orders.remaining": "Restante",
341
+ "orders.remove_coupon": "Remover cupão",
342
+ "orders.replaced_from_customer": "{parts} substituído(a) a partir do registo do cliente",
343
+ "orders.restock_items": "Repor em stock os artigos reembolsados",
344
+ "orders.revoke": "Revogar",
345
+ "orders.save_and_recalculate": "Guardar e recalcular",
346
+ "orders.save_as_customer": "Guardar como cliente",
347
+ "orders.save_as_customer_needs_email_tip": "Adicione abaixo um e-mail de faturação para guardar estes dados como cliente",
348
+ "orders.save_as_customer_tip": "Criar um cliente a partir dos dados de faturação abaixo e associar esta encomenda a ele",
349
+ "orders.save_order": "Guardar encomenda",
350
+ "orders.saved": "Encomenda guardada",
351
+ "orders.saved_recalculated": "Encomenda guardada e totais recalculados",
352
+ "orders.search_downloadable": "Pesquisar produtos descarregáveis…",
353
+ "orders.search_placeholder": "Pesquisar n.º de encomenda, nome, e-mail…",
354
+ "orders.search_products": "Pesquisar produtos…",
355
+ "orders.send_details": "Enviar os detalhes da encomenda ao cliente",
356
+ "orders.sent_to_customer": "· enviada ao cliente",
357
+ "orders.shipping": "Envio",
358
+ "orders.sku": "SKU: {sku}",
359
+ "orders.system": "· sistema",
360
+ "orders.tax": "Imposto",
361
+ "orders.total": "Total",
362
+ "orders.unsaved_totals": "Por guardar — os totais abaixo incluem as suas alterações",
363
+ "orders.use_customer_addresses": "Usar as moradas do cliente",
364
+ "orders.use_customer_addresses_tip": "Substituir a faturação e o envio da encomenda pelas moradas guardadas do cliente",
365
+ "orders.used_count": "(usado {count})",
366
+ "orders.variation": "Variação",
367
+ "orders.view_edit": "Ver / editar",
368
+
369
+ // ── products ────────────────────────────────────────────────────
370
+ "products.add_file": "Adicionar ficheiro",
371
+ "products.add_gallery_images": "Adicionar imagens à galeria",
372
+ "products.add_new": "Adicionar novo",
373
+ "products.add_new_category": "Adicionar nova categoria",
374
+ "products.add_new_product": "Adicionar novo produto",
375
+ "products.add_new_ribbon": "Adicionar nova etiqueta",
376
+ "products.add_option_placeholder": "Adicionar opção…",
377
+ "products.add_value": "Adicionar valor",
378
+ "products.all_categories": "Todas as categorias",
379
+ "products.all_stock": "Todo o stock",
380
+ "products.backorders": "Reposições",
381
+ "products.bulk_copied": "Copiado para {count} variante(s).",
382
+ "products.bulk_price_set": "Preço aplicado a {count} variante(s).",
383
+ "products.bulk_stock_set": "Stock aplicado a {count} variante(s).",
384
+ "products.category_create_failed": "Não foi possível criar a categoria",
385
+ "products.category_created": "Categoria criada",
386
+ "products.category_name_placeholder": "Nome da categoria",
387
+ "products.clear": "Limpar",
388
+ "products.code": "Código",
389
+ "products.confirm_delete_bulk": "Eliminar {count} produto(s)?",
390
+ "products.confirm_delete_description": "Isto elimina permanentemente o produto e as suas variações.",
391
+ "products.confirm_delete_one": "Eliminar «{name}»?",
392
+ "products.confirm_delete_this": "Eliminar este produto?",
393
+ "products.confirm_remove_option": "Remover a opção «{name}»?",
394
+ "products.confirm_remove_option_all": "Isto elimina as {count} variante(s) com os seus preços, stock e SKU.",
395
+ "products.confirm_remove_option_rebuild": "A lista de variantes é reconstruída sem ela — os preços, o stock e os SKU das {count} variante(s) atuais podem perder-se.",
396
+ "products.confirm_remove_values": "Remover {values}?",
397
+ "products.confirm_remove_values_description": "Isto elimina {count} variante(s). Os seus preços, stock e SKU perder-se-ão ao guardar.",
398
+ "products.confirm_remove_values_description_stock": "Isto elimina {count} variante(s) e as suas {stock} unidades de stock. Os seus preços, stock e SKU perder-se-ão ao guardar.",
399
+ "products.copy_to_selected": "Copiar para a seleção",
400
+ "products.create_named": "Criar «{name}»",
401
+ "products.created": "Produto criado",
402
+ "products.cross_sells": "Vendas cruzadas",
403
+ "products.cross_sells_hint": "Promovido no carrinho junto a este produto.",
404
+ "products.cross_sells_placeholder": "Pesquisar produtos para venda cruzada…",
405
+ "products.date": "Data",
406
+ "products.default": "Predefinida",
407
+ "products.default_value_name": "Valor {number}",
408
+ "products.delete_count": "Eliminar ({count})",
409
+ "products.delete_product": "Eliminar produto",
410
+ "products.delete_variants": "Eliminar variantes",
411
+ "products.deleted": "Produto eliminado",
412
+ "products.deleted_product": "(produto eliminado)",
413
+ "products.description_placeholder": "Descrição completa do produto (HTML permitido)",
414
+ "products.dimensions_with_unit": "Dimensões C×L×A ({unit})",
415
+ "products.done": "Concluído",
416
+ "products.download_expiry": "Validade da transferência (dias)",
417
+ "products.download_expiry_hint": "-1 para não expirar.",
418
+ "products.download_limit": "Limite de transferências",
419
+ "products.download_limit_hint": "-1 para transferências ilimitadas.",
420
+ "products.download_name_placeholder": "p. ex. Manual do utilizador",
421
+ "products.downloadable": "Descarregável",
422
+ "products.downloadable_files": "Ficheiros descarregáveis",
423
+ "products.downloads": "Transferências",
424
+ "products.duplicate": "Duplicar",
425
+ "products.duplicated": "Produto duplicado",
426
+ "products.empty_create": "Crie o seu primeiro produto para começar.",
427
+ "products.empty_search": "Experimente outra pesquisa ou outro filtro.",
428
+ "products.empty_title": "Não foram encontrados produtos",
429
+ "products.enable_variant": "Ativar {name}",
430
+ "products.enabled": "Ativa",
431
+ "products.featured_product": "Produto em destaque",
432
+ "products.file": "Ficheiro",
433
+ "products.file_url": "URL do ficheiro",
434
+ "products.from_price": "desde {price}",
435
+ "products.has_variants": "Com variantes",
436
+ "products.image": "Imagem",
437
+ "products.linked_products": "Produtos associados",
438
+ "products.load_failed": "Não foi possível carregar o produto",
439
+ "products.low_stock_threshold": "Limiar de stock baixo",
440
+ "products.lowest_enabled_variant": "(variante ativa mais barata)",
441
+ "products.make_default": "Tornar {name} a predefinida",
442
+ "products.manage_catalog": "Faça a gestão do seu catálogo",
443
+ "products.manage_option_catalog": "Gerir o catálogo de opções (afeta todos os produtos)",
444
+ "products.max_one_per_order": "máx. 1 por encomenda",
445
+ "products.modifiers_empty_hint": "Quer que o produto varie consoante algo? Adicione-o como opção em Preço e inventário.",
446
+ "products.modifiers_hint": "Detalhes descritivos mostrados na página do produto (p. ex. ingredientes, alergénios, instruções de conservação).",
447
+ "products.more_fields": "Mais campos (imagem, promoção, envio)",
448
+ "products.move_down": "Descer",
449
+ "products.move_up": "Subir",
450
+ "products.n_deleted": "{count} produto(s) eliminados",
451
+ "products.name_placeholder": "Nome do produto",
452
+ "products.name_required": "O nome do produto é obrigatório",
453
+ "products.new_option": "Nova opção",
454
+ "products.new_option_placeholder": "p. ex. Tecido",
455
+ "products.no_categories": "Ainda não há categorias.",
456
+ "products.no_options": "Ainda não há opções.",
457
+ "products.no_parent": "— Nenhuma —",
458
+ "products.no_title": "(sem título)",
459
+ "products.no_values": "Ainda não há valores.",
460
+ "products.no_variants_description": "Escolha acima os valores em que este produto existe e as suas variantes aparecerão aqui automaticamente.",
461
+ "products.no_variants_title": "Ainda não há variantes — os clientes não podem comprar este produto",
462
+ "products.not_tracked": "Sem controlo — escreva uma quantidade para começar a controlar",
463
+ "products.option_catalog": "Catálogo de opções",
464
+ "products.option_catalog_hint": "Partilhado por todos os produtos — as alterações são guardadas imediatamente. Para eliminar uma opção ou um valor, remova-o dos dados da entidade.",
465
+ "products.options": "Opções",
466
+ "products.options_empty": "Ainda não há opções. Adicione uma (Tamanho, Cor, Pack…) e escolha os valores em que este produto existe.",
467
+ "products.options_hint": "Aquilo em que este produto varia — cada combinação de valores dá origem a uma variante abaixo.",
468
+ "products.order": "Ordem",
469
+ "products.parent": "Categoria superior",
470
+ "products.price": "Preço",
471
+ "products.price_inventory": "Preço e inventário",
472
+ "products.product_data": "Dados do produto",
473
+ "products.product_gallery": "Galeria do produto",
474
+ "products.product_image": "Imagem do produto",
475
+ "products.publish": "Publicar",
476
+ "products.qty": "Qtd.",
477
+ "products.quick_edit": "Edição rápida",
478
+ "products.regular_price": "Preço normal",
479
+ "products.remove_from_product": "Remover deste produto",
480
+ "products.remove_option": "Remover opção",
481
+ "products.remove_variants": "Remover variantes",
482
+ "products.ribbon_create_failed": "Não foi possível criar a etiqueta",
483
+ "products.ribbon_created": "Etiqueta criada",
484
+ "products.ribbons": "Etiquetas",
485
+ "products.sale_end": "Fim da promoção",
486
+ "products.sale_price": "Preço promocional",
487
+ "products.sale_start": "Início da promoção",
488
+ "products.saved": "Produto guardado",
489
+ "products.schedule_sale": "Agendar promoção",
490
+ "products.search_placeholder": "Pesquisar produtos…",
491
+ "products.section_files": "Ficheiros",
492
+ "products.section_inventory": "Inventário",
493
+ "products.section_price": "Preço",
494
+ "products.section_sale": "Promoção",
495
+ "products.section_shipping": "Envio",
496
+ "products.section_type": "Tipo",
497
+ "products.select_all_variants": "Selecionar todas as variantes",
498
+ "products.select_ribbons": "Selecionar etiquetas",
499
+ "products.select_variant": "Selecionar {name}",
500
+ "products.set_price": "Definir preço",
501
+ "products.set_product_image": "Definir a imagem do produto",
502
+ "products.set_stock": "Definir stock",
503
+ "products.short_description": "Descrição curta",
504
+ "products.short_description_placeholder": "Resumo curto mostrado nas listagens",
505
+ "products.single_hint": "Um preço, um stock. Mude se o produto existir em tamanhos, packs ou cores.",
506
+ "products.single_product": "Produto único",
507
+ "products.sku": "SKU",
508
+ "products.sku_line": "SKU: {sku}",
509
+ "products.sku_placeholder": "Referência única de stock",
510
+ "products.slug_label": "Slug:",
511
+ "products.sold_individually": "Limitar a compra a 1 artigo por encomenda",
512
+ "products.specifications": "Especificações",
513
+ "products.stock": "Stock",
514
+ "products.stock_dont_track": "Não controlar",
515
+ "products.stock_management": "Gestão de stock",
516
+ "products.stock_quantity": "Quantidade em stock",
517
+ "products.stock_same_as_product": "Igual ao produto",
518
+ "products.stock_status": "Estado do stock",
519
+ "products.stock_track_quantity": "Controlar a quantidade",
520
+ "products.store_default": "Predefinição da loja",
521
+ "products.store_price": "Preço na loja:",
522
+ "products.switch_single_description": "Isto remove {count} variante(s) e o respetivo stock e preços. O produto fica com um preço e um stock.",
523
+ "products.switch_single_title": "Mudar para produto único?",
524
+ "products.tax_group": "Grupo de imposto",
525
+ "products.tax_purchase_rules": "Regras de imposto e compra",
526
+ "products.tax_status": "Estado fiscal",
527
+ "products.toggle_featured": "Alternar destaque",
528
+ "products.track_stock_quantity": "Controlar a quantidade em stock",
529
+ "products.tracked_quantity": "Quantidade controlada",
530
+ "products.updated": "Produto atualizado",
531
+ "products.upload_file": "Enviar ficheiro",
532
+ "products.upsells": "Vendas superiores",
533
+ "products.upsells_hint": "Recomendado em vez deste produto, p. ex. alternativas de gama superior.",
534
+ "products.upsells_placeholder": "Pesquisar produtos para venda superior…",
535
+ "products.values": "Valores",
536
+ "products.values_placeholder": "Valores em que este produto existe…",
537
+ "products.variant": "Variante",
538
+ "products.variant_count": "{count} variante(s)",
539
+ "products.variants_hint": "Cada combinação de valores de opção dá origem a uma variante com preço, stock e SKU próprios.",
540
+ "products.virtual": "Virtual",
541
+ "products.visible": "Visível",
542
+ "products.visible_off": "Oculto — guardado como rascunho",
543
+ "products.visible_on": "Visível na loja",
544
+ "products.weight_with_unit": "Peso ({unit})",
545
+
546
+ // ── categories ──────────────────────────────────────────────────
547
+ "categories.add": "Adicionar categoria",
548
+ "categories.added": "Categoria adicionada",
549
+ "categories.confirm_delete_description": "Os produtos desta categoria não são eliminados; apenas deixam de ter a categoria. Esta ação não pode ser anulada.",
550
+ "categories.confirm_delete_title": "Eliminar «{name}»?",
551
+ "categories.deleted": "Categoria eliminada",
552
+ "categories.description": "Organize os produtos por categorias",
553
+ "categories.empty": "Ainda não há categorias — adicione a primeira abaixo.",
554
+ "categories.name_placeholder": "Nome da categoria",
555
+ "categories.order": "Ordem",
556
+ "categories.saved": "Categoria guardada",
557
+ "categories.slug": "Slug",
558
+ "categories.slug_placeholder": "automático a partir do nome",
559
+
560
+ // ── reviews ─────────────────────────────────────────────────────
561
+ "reviews.anonymous": "Anónimo",
562
+ "reviews.approve": "Aprovar",
563
+ "reviews.author": "Autor",
564
+ "reviews.auto_approve_label": "Aprovar automaticamente as novas avaliações",
565
+ "reviews.auto_approve_off": "As novas avaliações ficam retidas para moderação",
566
+ "reviews.auto_approve_on": "As novas avaliações são publicadas de imediato",
567
+ "reviews.confirm_delete_bulk": "Eliminar {count} avaliação(ões)?",
568
+ "reviews.confirm_delete_description": "Isto remove permanentemente a avaliação.",
569
+ "reviews.confirm_delete_one": "Eliminar esta avaliação?",
570
+ "reviews.date": "Data",
571
+ "reviews.delete_permanently": "Eliminar permanentemente",
572
+ "reviews.deleted": "Avaliação eliminada",
573
+ "reviews.deleted_plural": "Avaliações eliminadas",
574
+ "reviews.deleted_product": "(produto eliminado)",
575
+ "reviews.edit_review": "Editar avaliação",
576
+ "reviews.empty_description": "As avaliações enviadas pelos clientes aparecerão aqui.",
577
+ "reviews.empty_title": "Sem avaliações",
578
+ "reviews.hold": "Reter",
579
+ "reviews.page_description": "Modere as avaliações de produtos dos clientes",
580
+ "reviews.product": "Produto",
581
+ "reviews.rating": "Classificação",
582
+ "reviews.rating_only": "Apenas classificação — sem texto",
583
+ "reviews.review": "Avaliação",
584
+ "reviews.save_failed": "Falha ao guardar",
585
+ "reviews.tab_all": "Todas",
586
+ "reviews.updated": "Avaliação atualizada",
587
+ "reviews.updated_plural": "Avaliações atualizadas",
588
+ "reviews.verified_owner": "✓ Compra verificada",
589
+
590
+ // ── coupons ─────────────────────────────────────────────────────
591
+ "coupons.allowed_emails": "E-mails permitidos",
592
+ "coupons.allowed_emails_hint": "Só estes endereços podem usar o cupão. Deixe vazio para permitir a qualquer pessoa.",
593
+ "coupons.amount_label": "Valor",
594
+ "coupons.amount_label_percent": "Percentagem",
595
+ "coupons.amount_required": "É obrigatório indicar um valor de desconto",
596
+ "coupons.any_category": "Qualquer categoria",
597
+ "coupons.any_product": "Qualquer produto",
598
+ "coupons.apply_all_items": "Aplicar a todos os artigos elegíveis",
599
+ "coupons.code": "Código",
600
+ "coupons.code_placeholder": "p. ex. VERAO20",
601
+ "coupons.code_required": "É obrigatório indicar um código de cupão",
602
+ "coupons.confirm_delete_description": "Os clientes deixarão de o poder usar. Esta ação não pode ser anulada.",
603
+ "coupons.confirm_delete_many": "Eliminar {count} cupão(ões)?",
604
+ "coupons.confirm_delete_one": "Eliminar este cupão?",
605
+ "coupons.coupon_code": "Código do cupão",
606
+ "coupons.coupon_expiry_date": "Data de validade do cupão",
607
+ "coupons.create": "Criar cupão",
608
+ "coupons.delete_selected": "Eliminar selecionados ({count})",
609
+ "coupons.deleted": "Cupão eliminado",
610
+ "coupons.description_optional": "Descrição (opcional)",
611
+ "coupons.disabled": "Desativado",
612
+ "coupons.disabled_hint": "Desativado — os clientes não podem aplicar este cupão, e os carrinhos que o tenham perdem-no.",
613
+ "coupons.discount_type": "Tipo de desconto",
614
+ "coupons.email_chips_placeholder": "email@example.com ou *@example.com — prima Enter",
615
+ "coupons.empty_description": "Os cupões permitem-lhe oferecer descontos na finalização da compra.",
616
+ "coupons.empty_title": "Ainda não há cupões",
617
+ "coupons.enabled": "Ativado",
618
+ "coupons.exclude_categories": "Excluir categorias",
619
+ "coupons.exclude_products": "Excluir produtos",
620
+ "coupons.exclude_sale_items": "Excluir artigos em promoção",
621
+ "coupons.exclude_sale_items_hint": "O cupão não se aplicará a artigos em promoção.",
622
+ "coupons.expiry_date": "Data de validade",
623
+ "coupons.free_shipping": "Permitir envio grátis",
624
+ "coupons.free_shipping_hint": "Dá acesso aos métodos de envio grátis que exigem um cupão.",
625
+ "coupons.general": "Geral",
626
+ "coupons.generate": "Gerar",
627
+ "coupons.individual_use": "Apenas uso individual",
628
+ "coupons.individual_use_hint": "Não pode ser combinado com outros cupões.",
629
+ "coupons.limit_usage_items": "Limitar a X artigos",
630
+ "coupons.limit_usage_items_hint": "Número máximo de artigos individuais a que o cupão se aplica (descontos por produto).",
631
+ "coupons.maximum_spend": "Valor máximo ({code})",
632
+ "coupons.minimum_spend": "Valor mínimo ({code})",
633
+ "coupons.n_deleted": "{count} cupão(ões) eliminados",
634
+ "coupons.no_exclusions": "Sem exclusões",
635
+ "coupons.no_maximum": "Sem máximo",
636
+ "coupons.no_minimum": "Sem mínimo",
637
+ "coupons.product_categories": "Categorias de produtos",
638
+ "coupons.publish": "Publicar",
639
+ "coupons.save": "Guardar cupão",
640
+ "coupons.saved": "Cupão guardado",
641
+ "coupons.search_placeholder": "Pesquisar cupões…",
642
+ "coupons.subtitle": "Crie e faça a gestão dos códigos de desconto.",
643
+ "coupons.title_with_code": "Cupão: {code}",
644
+ "coupons.unlimited": "Ilimitado",
645
+ "coupons.usage_limit_col": "Utilizações / Limite",
646
+ "coupons.usage_limit_per_coupon": "Limite de utilizações por cupão",
647
+ "coupons.usage_limit_per_coupon_hint": "Quantas vezes o cupão pode ser usado no total.",
648
+ "coupons.usage_limit_per_user": "Limite de utilizações por cliente",
649
+ "coupons.usage_limit_per_user_hint": "Quantas vezes um mesmo cliente (pelo e-mail de faturação) o pode usar.",
650
+ "coupons.usage_limits": "Limites de utilização",
651
+ "coupons.usage_restriction": "Restrição de utilização",
652
+ "coupons.used_times": "Usado: {count}",
653
+
654
+ // ── customers ───────────────────────────────────────────────────
655
+ "customers.account": "Conta",
656
+ "customers.average_order_value": "Valor médio por encomenda",
657
+ "customers.billing_address": "Morada de faturação",
658
+ "customers.confirm_delete_description": "As encomendas são mantidas e reatribuídas a Convidado. Esta ação não pode ser anulada.",
659
+ "customers.confirm_delete_title": "Eliminar este cliente?",
660
+ "customers.copied_from_billing": "Copiado da faturação",
661
+ "customers.copy_from_billing": "Copiar da faturação",
662
+ "customers.create": "Criar cliente",
663
+ "customers.custom_fields": "Campos personalizados",
664
+ "customers.deleted": "Cliente eliminado",
665
+ "customers.email_address_required": "Endereço de e-mail *",
666
+ "customers.email_required": "É obrigatório um endereço de e-mail",
667
+ "customers.email_username": "E-mail / Nome de utilizador",
668
+ "customers.empty_description": "Os clientes aparecem aqui depois da compra ou quando os adiciona manualmente.",
669
+ "customers.empty_title": "Ainda não há clientes",
670
+ "customers.guest_badge": "Convidado",
671
+ "customers.invite_sent": "Convite enviado",
672
+ "customers.location": "Localização",
673
+ "customers.no_orders_yet": "Ainda não há encomendas.",
674
+ "customers.paying_customer": "Cliente pagante ✓",
675
+ "customers.recalculate": "Recalcular",
676
+ "customers.recent_orders": "Encomendas recentes",
677
+ "customers.save": "Guardar cliente",
678
+ "customers.saved": "Cliente guardado",
679
+ "customers.search_placeholder": "Pesquisar por nome, e-mail ou nome de utilizador…",
680
+ "customers.send_invite": "Enviar ao novo utilizador um convite de conta",
681
+ "customers.shipping_address": "Morada de envio",
682
+ "customers.stats": "Estatísticas",
683
+ "customers.stats_recalculated": "Estatísticas recalculadas",
684
+ "customers.subtitle": "Clientes registados e convidados da finalização de compra.",
685
+ "customers.total_spend": "Total gasto",
686
+ "customers.username": "Nome de utilizador",
687
+
688
+ // ── reports ─────────────────────────────────────────────────────
689
+ "reports.attributes": "Atributos",
690
+ "reports.coupons_by_type": "Cupões por tipo",
691
+ "reports.discounted": "Com desconto",
692
+ "reports.empty_no_sales": "Sem vendas neste período",
693
+ "reports.gross_sales": "Vendas brutas",
694
+ "reports.items_sold": "Artigos vendidos",
695
+ "reports.net_revenue": "Receita líquida",
696
+ "reports.net_sales": "Vendas líquidas",
697
+ "reports.no_sales_in_period": "Sem vendas neste período.",
698
+ "reports.orders_by_status": "Encomendas por estado",
699
+ "reports.product": "Produto",
700
+ "reports.products_by_status": "Produtos por estado",
701
+ "reports.quantity": "Quantidade",
702
+ "reports.quantity_sold": "Quantidade vendida",
703
+ "reports.reviews_by_status": "Avaliações por estado",
704
+ "reports.ribbons": "Etiquetas",
705
+ "reports.shipping": "Envio",
706
+ "reports.subtitle": "Desempenho de vendas e totais da loja.",
707
+ "reports.tab_sales": "Vendas",
708
+ "reports.tab_top_sellers": "Mais vendidos",
709
+ "reports.tab_totals": "Totais",
710
+ "reports.top_sellers_by_quantity": "Mais vendidos por quantidade",
711
+
712
+ // ── settings ────────────────────────────────────────────────────
713
+ "settings.description": "Configure o funcionamento da sua loja.",
714
+ "settings.emails.additional_content": "Conteúdo adicional",
715
+ "settings.emails.additional_content_placeholder": "Texto acrescentado abaixo do corpo do e-mail.",
716
+ "settings.emails.admin": "Administrador",
717
+ "settings.emails.admin_recipients": "Destinatários das notificações de administração",
718
+ "settings.emails.admin_users_fallback": "os utilizadores administradores da sua aplicação",
719
+ "settings.emails.default_placeholder": "Deixe em branco para usar a predefinição",
720
+ "settings.emails.done": "Concluído",
721
+ "settings.emails.enabled": "Ativado",
722
+ "settings.emails.heading": "Cabeçalho do e-mail",
723
+ "settings.emails.manage": "Gerir",
724
+ "settings.emails.managed_by_auth": "Tratado pela autenticação Base44",
725
+ "settings.emails.manual": "Manual",
726
+ "settings.emails.no_admin_warning": "Nenhum utilizador da aplicação tem a função de administrador, por isso deixar isto em branco faz com que estes e-mails não cheguem a ninguém.",
727
+ "settings.emails.notifications": "Notificações por e-mail",
728
+ "settings.emails.notifications_description": "Ative, desative e personalize cada e-mail transacional, incluindo os alertas de stock baixo e de rutura de stock.",
729
+ "settings.emails.placeholders_hint": "Marcadores disponíveis: {order_number}, {customer_name}, {store_name}, {order_total}",
730
+ "settings.emails.recipient": "Destinatário",
731
+ "settings.emails.recipient_override_hint": "Separados por vírgulas. Substitui os destinatários de administração acima apenas para este e-mail.",
732
+ "settings.emails.recipient_placeholder": "Deixe em branco para usar os destinatários de administração predefinidos",
733
+ "settings.emails.recipients_hint": "Deixe em branco para notificar {users}.",
734
+ "settings.emails.recipients_label": "Destinatário(s)",
735
+ "settings.emails.recipients_placeholder": "admin@example.com, ops@example.com",
736
+ "settings.emails.sender_options": "Opções do remetente",
737
+ "settings.emails.sender_options_description": "Como são identificados os e-mails transacionais e quem recebe as cópias de administração. O endereço de envio é definido pela sua configuração de e-mail do Base44, não aqui.",
738
+ "settings.emails.sent_to_admin": "Enviados ao administrador da loja",
739
+ "settings.emails.sent_to_customer": "Enviados ao cliente",
740
+ "settings.emails.store_name_hint": "Enviado como «{name}» no assunto e como nome do remetente de todos os e-mails transacionais.",
741
+ "settings.emails.subject": "Assunto",
742
+ "settings.emails.type_email_title": "E-mail «{type}»",
743
+ "settings.emails.your_store": "A sua loja",
744
+ "settings.general.checkout": "Finalização de compra",
745
+ "settings.general.checkout_description": "Onde os clientes aterram ao regressar do pagamento.",
746
+ "settings.general.currency": "Moeda",
747
+ "settings.general.currency_description": "Todos os preços da loja são guardados e apresentados nesta moeda.",
748
+ "settings.general.dimension_unit": "Unidade de dimensões",
749
+ "settings.general.measurements": "Medidas",
750
+ "settings.general.measurements_description": "Unidades usadas para o peso e as dimensões dos produtos.",
751
+ "settings.general.payment_return_path": "Caminho de regresso após o pagamento",
752
+ "settings.general.payment_return_path_hint": "A rota da loja para onde os clientes regressam depois de pagar, no endereço da sua própria loja. Tem de corresponder à página que criou — um caminho errado envia os clientes que pagam para um 404.",
753
+ "settings.general.weight_unit": "Unidade de peso",
754
+ "settings.inventory.description": "Predefinições de gestão de stock para os produtos que controlam inventário.",
755
+ "settings.inventory.hide_out_of_stock": "Ocultar do catálogo os artigos sem stock",
756
+ "settings.inventory.hide_out_of_stock_hint": "As APIs da loja excluirão das listagens os produtos sem stock.",
757
+ "settings.inventory.hold_stock": "Reservar stock (minutos)",
758
+ "settings.inventory.hold_stock_hint": "Reserva o stock das encomendas não pagas durante este número de minutos. Atingido o limite, a encomenda pendente é cancelada e o stock libertado. A libertação é executada de forma oportunista — consulte references/operations.md na skill de commerce.",
759
+ "settings.inventory.low_stock_threshold": "Limiar de stock baixo",
760
+ "settings.inventory.manage_stock": "Gerir stock",
761
+ "settings.inventory.manage_stock_hint": "Ativa a gestão de stock em toda a loja.",
762
+ "settings.inventory.out_of_stock_threshold": "Limiar de rutura de stock",
763
+ "settings.inventory.visibility": "Visibilidade",
764
+ "settings.location.add_rate": "Adicionar tarifa",
765
+ "settings.location.add_region": "Adicionar região",
766
+ "settings.location.add_tax_group": "Adicionar grupo de imposto",
767
+ "settings.location.continent": "Continente",
768
+ "settings.location.cost": "Custo",
769
+ "settings.location.created": "Localização criada",
770
+ "settings.location.default_group_hint": "Grupo predefinido — os produtos sem grupo de imposto usam este",
771
+ "settings.location.delivery_option": "Opção de entrega",
772
+ "settings.location.edit_location": "Editar localização",
773
+ "settings.location.exact_amount": "Valor exato",
774
+ "settings.location.free_over": "Grátis acima de",
775
+ "settings.location.free_over_title": "Subtotal dos artigos (após descontos) a partir do qual esta tarifa passa a ser grátis",
776
+ "settings.location.group_name_placeholder": "Nome do grupo",
777
+ "settings.location.header_description": "Faça a gestão de onde vende e do envio e impostos aí cobrados.",
778
+ "settings.location.load_failed": "Não foi possível carregar a localização",
779
+ "settings.location.match_order": "Ordem de correspondência",
780
+ "settings.location.name_placeholder": "p. ex. Portugal",
781
+ "settings.location.name_required": "O nome da localização é obrigatório",
782
+ "settings.location.never": "Nunca",
783
+ "settings.location.no_tax_rates": "Sem taxas de imposto para os artigos {name}.",
784
+ "settings.location.no_tax_rates_default": "Sem taxas de imposto — estes artigos não são tributados aqui.",
785
+ "settings.location.no_tax_rates_unnamed": "Sem taxas de imposto para estes artigos.",
786
+ "settings.location.not_taxed": "Não tributado",
787
+ "settings.location.rate_name_placeholder": "p. ex. Envio normal",
788
+ "settings.location.rate_percent": "Taxa %",
789
+ "settings.location.rate_placeholder": "Nome da taxa — p. ex. IVA, imposto sobre vendas",
790
+ "settings.location.rates_hint": "Tarifas oferecidas na finalização da compra para encomendas enviadas para esta localização.",
791
+ "settings.location.regions_hint": "Deixe as regiões vazias para que esta seja a localização de reserva que abrange todas as moradas que nenhuma outra cobre.",
792
+ "settings.location.save_failed": "Não foi possível guardar a localização",
793
+ "settings.location.saved": "Localização guardada",
794
+ "settings.location.select_continent": "Selecione um continente…",
795
+ "settings.location.state": "Distrito",
796
+ "settings.location.state_placeholder": "PAÍS:REGIÃO — p. ex. US:CA",
797
+ "settings.location.tax_example": "Exemplo: {base} no grupo Products a 18 % gera {tax} de imposto.",
798
+ "settings.location.tax_group": "Grupo de imposto",
799
+ "settings.location.tax_hint": "Aplica-se aos artigos {group}.",
800
+ "settings.location.tax_on_shipping": "Imposto sobre o envio",
801
+ "settings.location.tax_on_shipping_hint": "Aplicado ao custo de envio nesta localização — separado dos grupos de produtos acima.",
802
+ "settings.payments.account_n": "Conta",
803
+ "settings.payments.account_name": "Titular da conta",
804
+ "settings.payments.account_number": "Número de conta",
805
+ "settings.payments.add_account": "Adicionar conta",
806
+ "settings.payments.add_method": "Adicionar método de pagamento",
807
+ "settings.payments.added": "Método de pagamento adicionado",
808
+ "settings.payments.bank_details": "Dados bancários",
809
+ "settings.payments.bank_name": "Nome do banco",
810
+ "settings.payments.bank_none": "Ainda nenhuma — não faz falta para pagamento à cobrança; adicione uma para transferência bancária.",
811
+ "settings.payments.bic": "BIC / Swift",
812
+ "settings.payments.checkout_options": "Opções na finalização da compra",
813
+ "settings.payments.checkout_options_description": "Que opções de pagamento os clientes podem escolher na finalização da compra, por esta ordem, e com que designação as veem. Todas as opções exceto Cartão de crédito são liquidadas fora da loja: a encomenda fica em espera com a descrição da opção como instruções, e é o utilizador que a faz avançar depois de paga.",
814
+ "settings.payments.delete_confirm": "Eliminar a opção de pagamento «{title}»?",
815
+ "settings.payments.delete_failed": "Falha ao eliminar",
816
+ "settings.payments.deleted": "Método de pagamento eliminado",
817
+ "settings.payments.description_hint": "Também apresentado como instruções de pagamento depois de a encomenda ser feita.",
818
+ "settings.payments.iban": "IBAN",
819
+ "settings.payments.reorder_failed": "Falha ao reordenar",
820
+ "settings.payments.saved": "Método de pagamento guardado",
821
+ "settings.payments.sort_code": "Código bancário",
822
+ "settings.payments.title_hint": "Apresentado aos clientes durante a finalização da compra.",
823
+ "settings.payments.title_label": "Designação",
824
+ "settings.payments.title_required": "Dê uma designação ao método de pagamento",
825
+ "settings.payments.update_failed": "Não foi possível atualizar o gateway",
826
+ "settings.save_changes": "Guardar alterações",
827
+ "settings.save_failed": "Falha ao guardar",
828
+ "settings.save_settings_failed": "Não foi possível guardar as definições",
829
+ "settings.saved": "Definições guardadas",
830
+ "settings.shipping.add_location": "Adicionar localização",
831
+ "settings.shipping.charge_shipping": "Cobrar envio",
832
+ "settings.shipping.charge_shipping_hint": "Desligado significa que os carrinhos nunca têm passo de envio — para lojas totalmente virtuais.",
833
+ "settings.shipping.clone": "Clonar",
834
+ "settings.shipping.clone_failed": "Não foi possível clonar a localização",
835
+ "settings.shipping.copy_name": "{name} (cópia)",
836
+ "settings.shipping.delete_confirm_description": "As encomendas já feitas mantêm os seus custos; os carrinhos com envio para esta localização perdem as suas opções.",
837
+ "settings.shipping.delete_confirm_title": "Eliminar «{name}»?",
838
+ "settings.shipping.delete_failed": "Não foi possível eliminar a localização",
839
+ "settings.shipping.disabled_toast": "Envio desativado",
840
+ "settings.shipping.empty_description": "Adicione uma localização para definir para onde envia e que imposto se aplica.",
841
+ "settings.shipping.empty_title": "Ainda não há localizações",
842
+ "settings.shipping.enabled_toast": "Envio ativado",
843
+ "settings.shipping.everywhere_else": "Todos os outros locais (reserva)",
844
+ "settings.shipping.location": "Localização",
845
+ "settings.shipping.location_cloned": "Localização clonada",
846
+ "settings.shipping.location_deleted": "Localização eliminada",
847
+ "settings.shipping.locations_intro": "Uma localização cobre as regiões que indica; a localização sem regiões abrange todas as restantes. Cada uma tem as suas próprias tarifas de envio e impostos.",
848
+ "settings.shipping.no_rates": "nenhuma — não se envia para aqui",
849
+ "settings.shipping.no_tax": "sem imposto",
850
+ "settings.shipping.rate_fallback": "Tarifa",
851
+ "settings.shipping.regions": "Regiões",
852
+ "settings.shipping.shipping_amount": "Envio {amount}",
853
+ "settings.shipping.shipping_rates": "Tarifas de envio",
854
+ "settings.shipping.tax": "Imposto",
855
+
856
+ // ── webhooks ────────────────────────────────────────────────────
857
+ "webhooks.api_version": "Versão da API",
858
+ "webhooks.create": "Criar webhook",
859
+ "webhooks.created": "Criado",
860
+ "webhooks.created_toast": "Webhook criado",
861
+ "webhooks.delete_confirm": "Eliminar o webhook?",
862
+ "webhooks.delete_failed": "Falha ao eliminar",
863
+ "webhooks.deleted": "Webhook eliminado",
864
+ "webhooks.delivery_url": "URL de entrega",
865
+ "webhooks.description": "Notifique serviços externos quando ocorrerem eventos na loja.",
866
+ "webhooks.details": "Detalhes do webhook",
867
+ "webhooks.edit_title": "Editar webhook",
868
+ "webhooks.empty_description": "Crie um webhook para enviar por POST os dados dos eventos para um URL externo.",
869
+ "webhooks.empty_title": "Sem webhooks",
870
+ "webhooks.failures": "Falhas",
871
+ "webhooks.generate": "Gerar",
872
+ "webhooks.load_failed": "Não foi possível carregar o webhook",
873
+ "webhooks.name_url_required": "O nome e o URL de entrega são obrigatórios",
874
+ "webhooks.no_deliveries": "Ainda não há entregas.",
875
+ "webhooks.recent_deliveries": "Entregas recentes",
876
+ "webhooks.redeliver": "Reenviar",
877
+ "webhooks.redelivered": "Reenviado",
878
+ "webhooks.request": "Pedido",
879
+ "webhooks.response": "Resposta",
880
+ "webhooks.save_failed": "Não foi possível guardar o webhook",
881
+ "webhooks.saved": "Webhook guardado",
882
+ "webhooks.secret": "Segredo",
883
+ "webhooks.secret_placeholder": "Usado para assinar o payload (HMAC-SHA256)",
884
+ "webhooks.send_test": "Enviar teste",
885
+ "webhooks.test_delivered": "Teste entregue",
886
+ "webhooks.test_delivered_code": "Teste entregue — HTTP {code}",
887
+ "webhooks.topic": "Tópico",
888
+
889
+ // ── StoreAdmin bot ──────────────────────────────────────────────
890
+ "bot.error_reach": "Não foi possível contactar o StoreAdmin",
891
+ "bot.input_placeholder": "p. ex. Mostra as encomendas pendentes numa tabela",
892
+ "bot.intro": "Pergunte-me o que quiser sobre a sua loja — posso consultar dados e fazer alterações por si.",
893
+ "bot.new_chat": "Nova conversa",
894
+ "bot.title": "StoreAdmin",
895
+ "bot.working": "A trabalhar…",
896
+ };