orionplace-react 0.7.6 → 0.7.8

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 (39) hide show
  1. package/README.md +1 -1
  2. package/package.json +2 -2
  3. package/templates/components/orionplace/legal/StorefrontPrivacy.README.md +2 -2
  4. package/templates/components/orionplace/orders/OrderDetails.tsx +2 -2
  5. package/templates/components/orionplace/search/MainSearch.tsx +2 -2
  6. package/templates/components/orionplace/shared/OrionplaceBreadcrumbs.tsx +1 -1
  7. package/templates/components/orionplace/shared/StorefrontPagination.tsx +1 -1
  8. package/templates/components/orionplace/storefront/StorefrontFooter.tsx +1 -1
  9. package/templates/hooks/useOrionplaceStorefront.tsx +26 -8
  10. package/templates/lib/orionplace/accountLabels.ts +7 -0
  11. package/templates/lib/orionplace/activityLabels.ts +32 -1
  12. package/templates/lib/orionplace/blogLabels.ts +47 -1
  13. package/templates/lib/orionplace/browseLabels.ts +48 -1
  14. package/templates/lib/orionplace/cartLabels.ts +128 -1
  15. package/templates/lib/orionplace/cartPreview.ts +15 -0
  16. package/templates/lib/orionplace/categoryLabels.ts +9 -1
  17. package/templates/lib/orionplace/contactLabels.ts +51 -1
  18. package/templates/lib/orionplace/directoryLabels.ts +66 -1
  19. package/templates/lib/orionplace/errorPageLabels.ts +15 -0
  20. package/templates/lib/orionplace/featureLabels.ts +136 -1
  21. package/templates/lib/orionplace/featuredLabels.ts +10 -0
  22. package/templates/lib/orionplace/footerLabels.ts +17 -1
  23. package/templates/lib/orionplace/headerLabels.ts +30 -0
  24. package/templates/lib/orionplace/homeLabels.ts +22 -0
  25. package/templates/lib/orionplace/manufacturerIndex.ts +15 -0
  26. package/templates/lib/orionplace/orderLabels.ts +148 -1
  27. package/templates/lib/orionplace/orderPresentation.ts +45 -2
  28. package/templates/lib/orionplace/privacyLabels.ts +77 -2
  29. package/templates/lib/orionplace/productActionLabels.ts +48 -0
  30. package/templates/lib/orionplace/productLabels.ts +37 -0
  31. package/templates/lib/orionplace/profileLabels.ts +75 -1
  32. package/templates/lib/orionplace/promoLabels.ts +37 -1
  33. package/templates/lib/orionplace/reviewLabels.ts +81 -1
  34. package/templates/lib/orionplace/sessionLabels.ts +12 -1
  35. package/templates/lib/orionplace/subscriptionLabels.ts +34 -1
  36. package/templates/lib/orionplace/subscriptionManageLabels.ts +118 -2
  37. package/templates/lib/orionplace/tariffLabels.ts +54 -3
  38. package/templates/lib/orionplace/tariffVariables.ts +38 -0
  39. package/templates/lib/orionplace/ticketLabels.ts +94 -1
@@ -109,6 +109,81 @@ const ru: PrivacyLabels = {
109
109
  },
110
110
  };
111
111
 
112
+ const es: PrivacyLabels = {
113
+ title: 'Política de privacidad',
114
+ lead: 'Qué datos recibe la tienda, para qué, con quién los comparte y cuánto tiempo los conserva.',
115
+ contents: 'Contenido',
116
+ operator: 'Responsable del tratamiento',
117
+ operatorUnknown: 'Los datos del responsable están en la página de contacto.',
118
+ sections: [
119
+ {
120
+ id: 'operator',
121
+ title: '1. Quién trata los datos',
122
+ text: [
123
+ 'El responsable del tratamiento es {company} (la Tienda). Los datos de la Tienda aparecen al final de esta página.',
124
+ 'Los datos se tratan conforme a la Ley Federal rusa n.º 152-FZ «Sobre datos personales».',
125
+ ],
126
+ },
127
+ {
128
+ id: 'data',
129
+ title: '2. Qué datos',
130
+ text: [
131
+ 'Cuenta: número de teléfono y, si los añades, nombre, dirección de correo, fecha de nacimiento y foto.',
132
+ 'Pedidos: productos, direcciones de entrega, nombre y teléfono del destinatario, importes, método y estado del pago, devoluciones. Los datos de la tarjeta se introducen en la página del proveedor de pagos; la Tienda no recibe números de tarjeta.',
133
+ 'Solicitudes de soporte, reseñas y comentarios, favoritos, suscripciones a productos e historial de búsqueda.',
134
+ 'Historial de accesos: fecha y hora, dirección IP, navegador y tipo de dispositivo.',
135
+ ],
136
+ },
137
+ {
138
+ id: 'purposes',
139
+ title: '3. Para qué',
140
+ text: [
141
+ 'Para que puedas iniciar sesión, hacer, pagar, recibir y devolver pedidos, recibir respuestas a tus solicitudes y publicar reseñas; para proteger la cuenta y cumplir las obligaciones legales. Los correos de novedades y promociones solo llegan si los has activado.',
142
+ ],
143
+ },
144
+ {
145
+ id: 'recipients',
146
+ title: '4. Quién recibe los datos',
147
+ text: [
148
+ 'Solo quienes los necesitan para cumplir un pedido, y solo lo que necesitan: servicios de envío, proveedores de pago, operadores de telecomunicaciones (para los códigos de confirmación) y la plataforma en cuyos servidores funciona la Tienda. Los datos no se venden.',
149
+ ],
150
+ },
151
+ {
152
+ id: 'storage',
153
+ title: '5. Cuánto tiempo se conservan',
154
+ text: [
155
+ 'Mientras existe la cuenta. Los registros de pedidos y pagos se conservan el tiempo que exige la legislación contable.',
156
+ ],
157
+ },
158
+ {
159
+ id: 'rights',
160
+ title: '6. Tus derechos',
161
+ text: [
162
+ 'En el perfil puedes cambiar tus datos, desactivar los correos y eliminar la cuenta. También puedes preguntar qué datos se tratan, pedir que se corrijan o eliminen y retirar tu consentimiento: escribe al soporte o usa la página de contacto.',
163
+ ],
164
+ },
165
+ {
166
+ id: 'cookies',
167
+ title: '7. Cookies y almacenamiento local',
168
+ text: [
169
+ 'El sitio solo usa las cookies que necesita para funcionar: sessionid mantiene tu sesión iniciada y csrftoken protege los formularios contra la falsificación de solicitudes.',
170
+ 'El almacenamiento local del navegador guarda el hecho de que ya has visto el aviso de cookies. No hay cookies publicitarias ni de analítica. Si bloqueas las cookies, no funcionan el inicio de sesión ni la compra.',
171
+ ],
172
+ },
173
+ {
174
+ id: 'changes',
175
+ title: '8. Cambios en esta política',
176
+ text: ['Una nueva versión se aplica desde su publicación en esta página.'],
177
+ },
178
+ ],
179
+ cookie: {
180
+ label: 'Aviso de cookies',
181
+ text: 'El sitio solo usa las cookies que necesita: para iniciar tu sesión y proteger los formularios.',
182
+ link: 'Más información',
183
+ ok: 'Aceptar',
184
+ },
185
+ };
186
+
112
187
  const en: PrivacyLabels = {
113
188
  title: 'Privacy policy',
114
189
  lead: 'Which data the store receives, why, who it shares it with and how long it keeps it.',
@@ -185,8 +260,8 @@ const en: PrivacyLabels = {
185
260
  };
186
261
 
187
262
  export function privacyLabels(locale: string, company = ''): PrivacyLabels {
188
- const copy = locale.toLowerCase().startsWith('ru') ? ru : en;
189
- const name = company || (copy === ru ? 'Магазин' : 'the Store');
263
+ const copy = locale.toLowerCase().startsWith('ru') ? ru : locale.toLowerCase().startsWith('es') ? es : en;
264
+ const name = company || (copy === ru ? 'Магазин' : copy === es ? 'la Tienda' : 'the Store');
190
265
 
191
266
  return {
192
267
  ...copy,
@@ -4,6 +4,13 @@ const labels = {
4
4
  en: {
5
5
  pending: 'Updating product…',
6
6
  saved: 'Product updated.',
7
+ cartAdded: 'Added to the cart.',
8
+ cartUpdated: 'Cart quantity updated.',
9
+ cartRemoved: 'Removed from the cart.',
10
+ favoriteAdded: 'Saved to favorites.',
11
+ favoriteRemoved: 'Removed from favorites.',
12
+ subscribed: 'We will let you know when it is back in stock.',
13
+ unsubscribed: 'Availability notification turned off.',
7
14
  failed: 'The request failed. Your confirmed product data is unchanged.',
8
15
  unavailable: 'This action is unavailable.',
9
16
  login: 'Sign in to save favorites or availability notifications.',
@@ -31,6 +38,13 @@ const labels = {
31
38
  ru: {
32
39
  pending: 'Обновляем товар…',
33
40
  saved: 'Товар обновлён.',
41
+ cartAdded: 'Товар добавлен в корзину.',
42
+ cartUpdated: 'Количество в корзине изменено.',
43
+ cartRemoved: 'Товар удалён из корзины.',
44
+ favoriteAdded: 'Товар добавлен в избранное.',
45
+ favoriteRemoved: 'Товар удалён из избранного.',
46
+ subscribed: 'Сообщим, когда товар появится в наличии.',
47
+ unsubscribed: 'Уведомление о наличии отключено.',
34
48
  failed: 'Запрос не выполнен. Подтверждённые данные товара сохранены.',
35
49
  unavailable: 'Это действие недоступно.',
36
50
  login: 'Войдите, чтобы сохранять избранное и уведомления о наличии.',
@@ -53,6 +67,40 @@ const labels = {
53
67
  submit: 'Подтвердить',
54
68
  cancel: 'Отмена',
55
69
  },
70
+ es: {
71
+ pending: 'Actualizando el producto…',
72
+ saved: 'Producto actualizado.',
73
+ cartAdded: 'Añadido al carrito.',
74
+ cartUpdated: 'Cantidad del carrito actualizada.',
75
+ cartRemoved: 'Eliminado del carrito.',
76
+ favoriteAdded: 'Guardado en favoritos.',
77
+ favoriteRemoved: 'Eliminado de favoritos.',
78
+ subscribed: 'Te avisaremos cuando vuelva a estar disponible.',
79
+ unsubscribed: 'Aviso de disponibilidad desactivado.',
80
+ failed: 'La solicitud ha fallado. Los datos confirmados del producto no han cambiado.',
81
+ unavailable: 'Esta acción no está disponible.',
82
+ login: 'Inicia sesión para guardar favoritos o avisos de disponibilidad.',
83
+ email:
84
+ 'Añade una dirección de correo a tu perfil para recibir avisos de disponibilidad.',
85
+ contact: 'Indica un correo electrónico o un número de teléfono para tu reserva.',
86
+ invalid:
87
+ 'Esta acción no está disponible para el producto o la cantidad seleccionados.',
88
+ refreshFailed:
89
+ 'La acción se ha aceptado, pero no se han podido actualizar los datos del producto. Vuelve a cargarlos antes de otra acción.',
90
+ retry: 'Recargar',
91
+ preorder: 'Reservar',
92
+ close: 'Cerrar',
93
+ preorderContact:
94
+ 'Deja un correo electrónico o un número de teléfono para que el vendedor pueda contactarte sobre esta reserva. Si tienes una cuenta, inicia sesión primero.',
95
+ preorderAccount: 'Tu reserva quedará vinculada a tu cuenta.',
96
+ preorderPending: 'Enviando…',
97
+ preorderSaved: 'Hemos recibido tu reserva.',
98
+ emailLabel: 'Correo electrónico',
99
+ phoneLabel: 'Teléfono',
100
+ signIn: 'Iniciar sesión',
101
+ submit: 'Confirmar',
102
+ cancel: 'Cancelar',
103
+ },
56
104
  };
57
105
 
58
106
  export function productActionLabels(locale: string) {
@@ -75,6 +75,43 @@ const labels = {
75
75
  previewUnpublished: 'Предпросмотр: товар не опубликован.',
76
76
  previewOption: 'Предпросмотр: товар опубликован только как вариант.',
77
77
  },
78
+ es: {
79
+ addFavorite: 'Añadir a favoritos',
80
+ removeFavorite: 'Quitar de favoritos',
81
+ saveFavorite: 'Guardar',
82
+ unsaveFavorite: 'Quitar',
83
+ add: 'Añadir',
84
+ addHint: 'Añadir al carrito',
85
+ increase: 'Aumentar cantidad',
86
+ decrease: 'Reducir cantidad',
87
+ remove: 'Quitar del carrito',
88
+ quantity: 'Cantidad',
89
+ subscribe: 'Avisarme',
90
+ subscribeHint: 'Avisarme cuando esté disponible',
91
+ unsubscribe: 'Cancelar aviso',
92
+ unsubscribeHint: 'Cancelar los avisos de disponibilidad',
93
+ preorder: 'Reservar',
94
+ unavailable: 'No disponible',
95
+ lowStock: 'Pocas unidades',
96
+ badgeNew: 'Nuevo',
97
+ badgePopular: 'Popular',
98
+ badgeDeal: 'Oferta',
99
+ badgeLowStock: 'Pocas unidades',
100
+ reviews: ['reseña', 'reseñas'],
101
+ variants: 'Variantes',
102
+ secondary: 'Variantes adicionales',
103
+ chooseVariant: 'Elige una variante',
104
+ closeVariants: 'Cerrar la selección de variante',
105
+ loadingVariants: 'Cargando las opciones disponibles…',
106
+ variantsFailed: 'No se han podido cargar las opciones. Inténtalo de nuevo.',
107
+ variantsUnavailable: 'La búsqueda de variantes secundarias no está disponible.',
108
+ variantsEmpty: 'No hay opciones secundarias para esta elección.',
109
+ retryVariants: 'Reintentar',
110
+ variantLoading: 'Cargando la variante seleccionada…',
111
+ variantFailed: 'No se ha podido cargar esta variante. Vuelve a seleccionarla para reintentar.',
112
+ previewUnpublished: 'Vista previa: este producto no está publicado.',
113
+ previewOption: 'Vista previa: este producto solo está publicado como opción.',
114
+ },
78
115
  };
79
116
 
80
117
  export function productLabels(locale: string) {
@@ -75,7 +75,81 @@ export function profileLabels(locale: string) {
75
75
  deleting: 'Удаляем…',
76
76
  deleted: 'Аккаунт удалён.',
77
77
  }
78
- : {
78
+ : locale.toLowerCase().startsWith('es') ? {
79
+ title: 'Perfil personal',
80
+ intro: 'Tus datos, preferencias de contacto y la seguridad de la cuenta.',
81
+ overview: 'Cuenta',
82
+ home: 'Inicio',
83
+ saved: 'Cambios guardados.',
84
+ loading: 'Cargando tu perfil…',
85
+ retry: 'Reintentar',
86
+ failed: 'No se ha podido completar la solicitud. Inténtalo de nuevo.',
87
+ details: 'Datos personales',
88
+ detailsHint: 'Tu nombre, el teléfono de acceso y la fecha de nacimiento.',
89
+ firstName: 'Nombre',
90
+ lastName: 'Apellidos',
91
+ phone: 'Número de teléfono',
92
+ phoneHint: 'Tu teléfono de acceso.',
93
+ phoneCountryHint: 'Tu teléfono de acceso. Su país, {country}, decide qué métodos de pago puedes usar.',
94
+ dob: 'Fecha de nacimiento',
95
+ save: 'Guardar',
96
+ pending: 'Guardando…',
97
+ emailTitle: 'Correo y notificaciones',
98
+ email: 'Dirección de correo',
99
+ emailHint:
100
+ 'Verifica tu dirección antes de recibir novedades de pedidos y notificaciones por correo.',
101
+ sendCode: 'Enviar',
102
+ sendCodeHint: 'Enviar código de verificación',
103
+ code: 'Código de verificación',
104
+ verify: 'Verificar',
105
+ changeEmail: 'Cambiar',
106
+ changeEmailHint: 'Cambiar la dirección de correo',
107
+ resend: 'Reenviar',
108
+ resendHint: 'Enviar un código nuevo',
109
+ notifications: 'Notificaciones por correo',
110
+ notificationsHint: 'Novedades de pedidos, soporte y suscripciones, avisos de disponibilidad y ofertas. Los códigos de acceso se envían siempre.',
111
+ notificationLocale: 'Idioma de los correos',
112
+ chooseLocale: 'Elige un idioma',
113
+ oldPassword: 'Contraseña actual',
114
+ newPassword: 'Nueva contraseña',
115
+ confirmPassword: 'Confirma la nueva contraseña',
116
+ passwordHint: 'Usa al menos 6 caracteres.',
117
+ mismatch: 'Las contraseñas no coinciden.',
118
+ changePassword: 'Cambiar la contraseña',
119
+ createPassword: 'Crear contraseña',
120
+ showPassword: 'Mostrar la contraseña',
121
+ hidePassword: 'Ocultar la contraseña',
122
+ avatar: 'Foto de perfil',
123
+ upload: 'Elegir una foto',
124
+ change: 'Cambiar la foto',
125
+ remove: 'Quitar la foto',
126
+ signIn: 'Inicia sesión en tu cuenta',
127
+ signInOrRegister: 'Inicia sesión o regístrate',
128
+ signUp: 'Crear una cuenta',
129
+ signInHint:
130
+ 'Introduce tu número de teléfono para continuar. Los clientes nuevos pueden crear una cuenta aquí.',
131
+ next: 'Continuar',
132
+ password: 'Contraseña',
133
+ back: 'Atrás',
134
+ otpHint: 'Introduce el código de verificación que has recibido.',
135
+ otpSms: 'Introduce el código de 4 dígitos del SMS.',
136
+ otpCall: 'Introduce los 4 últimos dígitos del número que te llama.',
137
+ otpEmail: 'Introduce el código del correo enviado a',
138
+ signingIn: 'Iniciando sesión…',
139
+ refreshFailed: 'Has iniciado sesión, pero no se han podido cargar los datos de la cuenta.',
140
+ cooldown: 'Pide otro código en',
141
+ phoneCooldown: 'Vuelve a intentarlo en',
142
+ seconds: 's',
143
+ deleteTitle: 'Eliminar la cuenta',
144
+ deleteHint:
145
+ 'Elimina tu nombre, número de teléfono, correo, foto, direcciones y carrito, y cierra tu sesión. Los pedidos y las reseñas se conservan sin tus datos.',
146
+ deleteBlocked:
147
+ 'No es posible mientras haya un pedido abierto, un reembolso sin pagar, dinero en tu saldo o una suscripción de pago activa.',
148
+ deleteConfirm: 'Entiendo que la cuenta no se puede recuperar',
149
+ deleteAction: 'Eliminar la cuenta',
150
+ deleting: 'Eliminando…',
151
+ deleted: 'Tu cuenta se ha eliminado.',
152
+ } : {
79
153
  title: 'Personal profile',
80
154
  intro: 'Your details, contact preferences and account security.',
81
155
  overview: 'Account',
@@ -70,6 +70,42 @@ const ru: typeof en = {
70
70
  backToPromocodes: 'Мои промокоды',
71
71
  };
72
72
 
73
+ const es: typeof en = {
74
+ conditions: 'Condiciones',
75
+ discount: 'Descuento',
76
+ freeShipping: 'Envío gratuito',
77
+ scope: 'Se aplica a',
78
+ scopeSellers: 'Vendedores',
79
+ scopeCategories: 'Categorías',
80
+ scopeProducts: 'Productos',
81
+ scopeEverything: 'Todos los productos de la tienda',
82
+ minimumOrderAmount: 'Pedido mínimo',
83
+ maximumDiscount: 'Descuento máximo',
84
+ firstOrder: 'Primera compra',
85
+ firstOrderOnly: 'Solo para la primera compra en la tienda',
86
+ stacking: 'Artículos con descuento',
87
+ stackingAllowed: 'El código también se aplica a ellos',
88
+ stackingBlocked: 'El código no se aplica a ellos',
89
+ period: 'Válido',
90
+ until: 'Hasta',
91
+ untilLower: 'hasta',
92
+ since: 'Desde',
93
+ noPeriod: 'Sin fecha de fin',
94
+ usage: 'Usos restantes',
95
+ ofTotal: 'de',
96
+ unlimited: 'Ilimitado',
97
+ separator: ', ',
98
+ crumbPromocodes: 'Códigos promocionales',
99
+ crumbProducts: 'Productos',
100
+ products: 'Productos a los que se aplica este código',
101
+ productsHint:
102
+ 'Estos productos encajan con la oferta. Un código sigue necesitando las condiciones de arriba.',
103
+ productsEmpty: 'Ahora mismo ningún producto encaja con esta oferta.',
104
+ productsMissing: 'Esta oferta ya no está vigente.',
105
+ openProducts: 'Mostrar los productos',
106
+ backToPromocodes: 'Mis códigos promocionales',
107
+ };
108
+
73
109
  export function promoLabels(locale: string) {
74
- return locale.toLowerCase().startsWith('ru') ? ru : en;
110
+ return locale.toLowerCase().startsWith('ru') ? ru : locale.toLowerCase().startsWith('es') ? es : en;
75
111
  }
@@ -156,8 +156,88 @@ const ru: typeof en = {
156
156
  unhelpfulHint: 'Отметить отзыв как бесполезный',
157
157
  repliesHint: 'Показать ответы',
158
158
  };
159
+
160
+ const es: typeof en = {
161
+ title: 'Reseñas de clientes',
162
+ mine: 'Mis reseñas',
163
+ all: 'Todos',
164
+ write: 'Escribir una reseña',
165
+ writeAction: 'Reseña',
166
+ writeHint: 'Reseña este producto',
167
+ reply: 'Responder',
168
+ replies: 'Respuestas',
169
+ text: 'Texto de la reseña',
170
+ rating: 'Valoración',
171
+ chooseRating: 'Elige una valoración',
172
+ ratingRequired: 'Valora el producto de 1 a 5 estrellas.',
173
+ textMinimum: 'Al menos {count} caracteres',
174
+ images: 'Fotos',
175
+ addImages: 'Añadir fotos',
176
+ photosOnly: 'Con fotos',
177
+ allPhotos: 'Fotos de clientes',
178
+ photosTab: 'Fotos',
179
+ mineTab: 'Mías',
180
+ image: 'Foto de la reseña',
181
+ openImage: 'Abrir la foto',
182
+ photoViewer: 'Fotos de reseñas',
183
+ productPhotos: 'Fotos del producto',
184
+ openProductPhoto: 'Abrir la foto a pantalla completa',
185
+ empty: 'Aún no hay reseñas.',
186
+ emptyImages: 'Aún no hay fotos de clientes.',
187
+ send: 'Enviar',
188
+ save: 'Guardar',
189
+ editing: 'Editar la reseña',
190
+ pending: 'Pendiente de publicación',
191
+ denied: 'No publicada',
192
+ liked: 'Útil',
193
+ disliked: 'No útil',
194
+ repliesTo: 'Responder a',
195
+ newest: 'Más recientes primero',
196
+ highest: 'Mejor valoración',
197
+ lowest: 'Peor valoración',
198
+ order: 'Ordenar reseñas',
199
+ tooMany: 'Una reseña puede tener hasta cinco fotos.',
200
+ cannotEdit: 'Esta reseña no se puede editar.',
201
+ imageRemove: 'Quitar la foto',
202
+ product: 'Producto',
203
+ notFound: 'Este producto no está disponible.',
204
+ description: 'Sobre este producto',
205
+ more: 'Más',
206
+ less: 'Menos',
207
+ gallery: 'Imágenes del producto',
208
+ previousImage: 'Imagen anterior',
209
+ zoomIn: 'Ver a tamaño completo',
210
+ zoomOut: 'Ajustar a la pantalla',
211
+ nextImage: 'Imagen siguiente',
212
+ thumbnailsBack: 'Ver miniaturas anteriores',
213
+ thumbnailsForward: 'Ver miniaturas siguientes',
214
+ characteristics: 'Características',
215
+ allCharacteristics: 'Todas las características',
216
+ manufacturer: 'Fabricante',
217
+ manufacturerHint: 'Abrir la página del fabricante',
218
+ weight: 'Peso',
219
+ dimensions: 'Dimensiones (L × A × A)',
220
+ type: 'Tipo',
221
+ digital: 'Producto digital',
222
+ returns: 'Devoluciones',
223
+ returnRegular: 'Sin defecto',
224
+ returnDefect: 'Con defecto',
225
+ within: 'en un plazo de',
226
+ days: ['día', 'días'],
227
+ seller: 'Vendedor',
228
+ sellerHint: 'Abrir la página del vendedor',
229
+ showReviews: 'Ir a las reseñas',
230
+ average: 'Valoración media',
231
+ ofFive: 'de 5',
232
+ ratingFilter: 'Filtrar reseñas por valoración',
233
+ allRatings: 'Ver reseñas con cualquier valoración',
234
+ stars: 'estrellas',
235
+ helpfulHint: 'Marcar esta reseña como útil',
236
+ unhelpfulHint: 'Marcar esta reseña como no útil',
237
+ repliesHint: 'Ver respuestas',
238
+ };
159
239
  export function reviewLabels(locale: string) {
160
- return locale.toLowerCase().startsWith('ru') ? ru : en;
240
+ return locale.toLowerCase().startsWith('ru') ? ru : locale.toLowerCase().startsWith('es') ? es : en;
161
241
  }
162
242
 
163
243
  // OrionMarketplace's domain setting feedback_text_min_length, sent as
@@ -12,7 +12,18 @@ export function sessionLabels(locale: string) {
12
12
  done: 'Вы вышли из аккаунта',
13
13
  home: 'Главная',
14
14
  }
15
- : {
15
+ : locale.toLowerCase().startsWith('es') ? {
16
+ title: 'Cerrando sesión',
17
+ pending: 'Terminando tu sesión…',
18
+ hint: 'Volverás a la página de inicio de la tienda.',
19
+ failed: 'No se ha podido cerrar la sesión',
20
+ retryHint: 'Inténtalo de nuevo. El cierre de sesión lo confirma el servidor.',
21
+ refreshFailed:
22
+ 'Tu sesión ha terminado. No se ha podido recargar la tienda.',
23
+ retry: 'Reintentar',
24
+ done: 'Has cerrado la sesión',
25
+ home: 'Inicio',
26
+ } : {
16
27
  title: 'Signing out',
17
28
  pending: 'Ending your session…',
18
29
  hint: 'You will return to the storefront home page.',
@@ -62,6 +62,39 @@ const ru: typeof en = {
62
62
  allPlansHint: 'Показать все тарифы',
63
63
  emptyIds: 'Тарифы из этой ссылки недоступны.',
64
64
  };
65
+
66
+ const es: typeof en = {
67
+ offers: 'Planes de suscripción',
68
+ search: 'Buscar',
69
+ mine: 'Mis suscripciones',
70
+ emptyOffers: 'Ningún plan coincide con esta búsqueda.',
71
+ empty: 'Todavía no tienes suscripciones.',
72
+ choose: 'Ver los planes',
73
+ subscription: 'Suscripción',
74
+ created: 'Inicio',
75
+ until: 'Activa hasta',
76
+ renewal: 'Renovación automática',
77
+ disabled: 'Desactivada',
78
+ days: 'días',
79
+ stop: 'Desactivar',
80
+ stopHint: 'Desactivar la renovación automática',
81
+ stopQuestion:
82
+ '¿Desactivar la renovación automática? El periodo que ya has pagado seguirá disponible.',
83
+ confirmed: 'Suscripción comprada. Tu cuenta se ha actualizado.',
84
+ refreshRequired:
85
+ 'La acción se ha completado. Actualiza los datos de la cuenta para ver el resultado.',
86
+ intro:
87
+ 'Elige un plan y un periodo de suscripción. Los periodos de pago se cobran del saldo de la cuenta.',
88
+ noOffers: 'Todavía no hay planes de suscripción disponibles.',
89
+ reset: 'Restablecer',
90
+ support: 'Soporte de suscripciones',
91
+ wallet: 'Recargar saldo',
92
+ searchHint: 'Buscar por nombre del plan',
93
+ filtered: 'Solo se muestran los planes del enlace abierto.',
94
+ allPlans: 'Todos',
95
+ allPlansHint: 'Ver todos los planes',
96
+ emptyIds: 'Los planes de este enlace no están disponibles.',
97
+ };
65
98
  export function subscriptionLabels(locale: string) {
66
- return locale.toLowerCase().startsWith('ru') ? ru : en;
99
+ return locale.toLowerCase().startsWith('ru') ? ru : locale.toLowerCase().startsWith('es') ? es : en;
67
100
  }
@@ -280,14 +280,130 @@ const ru: typeof en = {
280
280
  usageOf: '{used} из {limit}',
281
281
  actions: 'Действия с подпиской',
282
282
  };
283
+
284
+ const es: typeof en = {
285
+ statusActive: 'Activos',
286
+ statusExpired: 'Terminada',
287
+ statusPending: 'Configurándose',
288
+ statusPendingHint:
289
+ 'El servicio se está preparando y confirma la suscripción por sí mismo.',
290
+ manage: 'Gestionar la suscripción',
291
+ extend: 'Prolongar ahora',
292
+ extendHint: 'Pagar otro periodo con el saldo de la cuenta',
293
+ renewalSettings: 'Renovación automática',
294
+ renewalHint: 'Elige el periodo que se paga automáticamente, o desactívalo',
295
+ changePlan: 'Cambiar de plan',
296
+ changePlanHint: 'Pasar esta suscripción a otro plan',
297
+ close: 'Cerrar',
298
+ cancel: 'Cancelar',
299
+ period: 'Periodo',
300
+ promo: 'Código promocional',
301
+ promoHint: 'Opcional. Un código promocional se aplica a un periodo de pago.',
302
+ balance: 'Saldo de la cuenta',
303
+ planPrice: 'Plan para este periodo',
304
+ optionPrice: 'Opción del servicio',
305
+ insufficient:
306
+ 'El saldo es inferior a este periodo. Recarga el saldo o elige otro periodo.',
307
+ topUp: 'Depósito',
308
+ extendTitle: 'Prolongar la suscripción',
309
+ extendSummary:
310
+ 'El periodo elegido se cobra del saldo de la cuenta en el acto y se suma a la suscripción.',
311
+ extendAfter:
312
+ 'Se suma {period} a la suscripción, y el importe se cobra ahora del saldo de la cuenta.',
313
+ extendSubmit: 'Pagar',
314
+ extendPending: 'Pagando…',
315
+ extendConfirm: 'Confirmar',
316
+ renewalTitle: 'Renovación automática',
317
+ renewalCurrentOn: 'Ahora: cada {days} por {price}.',
318
+ renewalCurrentOff: 'Ahora: la renovación automática está desactivada.',
319
+ renewalOff: 'Desactivar la renovación automática',
320
+ renewalOffHint: 'No se cobra nada; el periodo pagado sigue disponible.',
321
+ renewalEffectOff:
322
+ 'La renovación automática se detiene. La suscripción sigue disponible hasta el final del periodo pagado y no se vuelve a cobrar del saldo.',
323
+ renewalEffectOn:
324
+ 'La renovación por {days} cuesta {price} por el plan, más el cargo de la opción si la hay. Al terminar el periodo pagado, la renovación necesita saldo suficiente para el total. Si el periodo ya ha terminado, empieza de inmediato cuando el saldo alcanza. Si no, solo se guarda el ajuste.',
325
+ renewalSubmit: 'Guardar',
326
+ renewalPending: 'Guardando…',
327
+ renewalNoChange: 'Este es el ajuste actual.',
328
+ changeOption: 'Cambiar la opción del servicio',
329
+ changeOptionHint: 'Pasar esta suscripción a otra opción del servicio',
330
+ changePlanTitle: 'Cambiar el plan',
331
+ changeOptionTitle: 'Cambiar la opción del servicio',
332
+ changePlanSummary:
333
+ 'Los días no usados del periodo actual se reembolsan en el saldo de la cuenta, y el periodo seleccionado del nuevo plan se cobra completo.',
334
+ changeOptionSummary:
335
+ 'Los días no usados del periodo actual se reembolsan en el saldo de la cuenta, y el periodo seleccionado con la nueva opción del servicio se cobra completo.',
336
+ changePlanField: 'Nuevo plan',
337
+ changeOptionField: 'Opción del servicio',
338
+ changeCurrentPlan: 'Ahora: {plan}.',
339
+ changeCurrentOption: 'Ahora: {option}.',
340
+ changeNoOption: 'Sin opción del servicio',
341
+ changeRefund: 'Reembolso por los días no usados',
342
+ changeRefundHint:
343
+ 'Primero se abona el reembolso en el saldo de la cuenta y después se cobra el nuevo periodo, así que un cambio puede ser posible aunque ese mismo periodo no se pudiera comprar por separado.',
344
+ changeRefundUnknown:
345
+ 'El backend de la tienda calcula este importe cuando se envía el cambio.',
346
+ changeAvailable: 'Disponible para este cambio',
347
+ changeTotal: 'Se cobra por el nuevo periodo',
348
+ changeAfterPlan:
349
+ 'La suscripción pasa ahora a {plan} por {period}. Los días no usados se reembolsan en el saldo de la cuenta y se cobran {price} por el nuevo periodo.',
350
+ changeAfterOption:
351
+ 'La suscripción pasa ahora a {option} por {period}. Los días no usados se reembolsan en el saldo de la cuenta y se cobran {price} por el nuevo periodo.',
352
+ changeAfterPlanRefund:
353
+ 'La suscripción pasa ahora a {plan} por {period}. Se reembolsan {refund} en el saldo de la cuenta por los días no usados y se cobran {price} por el nuevo periodo.',
354
+ changeAfterOptionRefund:
355
+ 'La suscripción pasa ahora a {option} por {period}. Se reembolsan {refund} en el saldo de la cuenta por los días no usados y se cobran {price} por el nuevo periodo.',
356
+ changeConfirm: 'Confirmar',
357
+ changeSubmit: 'Pagar',
358
+ changePending: 'Cambiando…',
359
+ changeNoPlans: 'No hay otro plan al que pasar esta suscripción.',
360
+ changeNoOptions: 'Este plan no tiene ninguna opción del servicio que elegir.',
361
+ changeNoPeriods: 'Este plan no tiene ningún periodo con el que se pueda comprar un cambio.',
362
+ changeInsufficient:
363
+ 'El saldo es inferior al nuevo periodo. Primero se suma al saldo el reembolso por los días no usados, así que el cambio aún puede salir bien; recarga el saldo si la tienda lo rechaza.',
364
+ changeShort:
365
+ 'El saldo y el reembolso juntos son inferiores al nuevo periodo. Recarga el saldo o elige un periodo más corto.',
366
+ cancelSubscription: 'Cancelar la suscripción',
367
+ cancelHint: 'Detener la renovación automática y conservar el periodo pagado',
368
+ cancelTitle: 'Cancelar la suscripción',
369
+ cancelSummary:
370
+ 'La renovación automática se detiene y no se vuelve a cobrar nada. La suscripción sigue disponible hasta el {date} y no se reembolsa dinero.',
371
+ cancelSummaryNoDate:
372
+ 'La renovación automática se detiene y no se vuelve a cobrar nada. La suscripción sigue disponible hasta el final del periodo pagado y no se reembolsa dinero.',
373
+ cancelResume:
374
+ 'Elegir de nuevo un periodo de renovación automática reanuda la renovación y quita el estado de cancelada.',
375
+ cancelSubmit: 'Cancelar aviso',
376
+ cancelPending: 'Cancelando…',
377
+ cancelKeep: 'Conservar',
378
+ cancelled: 'Cancelada',
379
+ cancelledOn: 'Cancelada el {date}',
380
+ cancelledState:
381
+ 'La renovación automática está detenida. La suscripción sigue disponible hasta el {date}. Elegir un periodo de renovación automática la reanuda.',
382
+ cancelledStateNoDate:
383
+ 'La renovación automática está detenida. La suscripción sigue disponible hasta el final del periodo pagado. Elegir un periodo de renovación automática la reanuda.',
384
+ remoteTitle: 'Servicio de suscripción',
385
+ remoteId: 'ID de la suscripción en el servicio',
386
+ remoteSync: 'Última confirmación del servicio',
387
+ remoteSyncPending: 'Esperando a que el servicio confirme el último cambio',
388
+ remoteHost: 'Host',
389
+ planTitle: 'Plan',
390
+ planIncludes: 'Incluido en el plan',
391
+ planNotIncluded: 'no incluido',
392
+ usageTitle: 'Uso',
393
+ usageOf: '{used} de {limit}',
394
+ actions: 'Acciones de la suscripción',
395
+ };
283
396
  export function subscriptionManageLabels(locale: string) {
284
- return locale.toLowerCase().startsWith('ru') ? ru : en;
397
+ return locale.toLowerCase().startsWith('ru') ? ru : locale.toLowerCase().startsWith('es') ? es : en;
285
398
  }
286
399
 
287
400
  const russianDays = ['день', 'дня', 'дней'];
288
401
 
289
- /** A period length with its noun: `30 days`, `30 дней`, `1 день`. */
402
+ /** A period length with its noun: `30 days`, `30 días`, `30 дней`, `1 день`. */
290
403
  export function subscriptionDays(days: number, locale: string) {
404
+ if (locale.toLowerCase().startsWith('es')) {
405
+ return `${days} ${days === 1 ? 'día' : 'días'}`;
406
+ }
291
407
  if (!locale.toLowerCase().startsWith('ru')) {
292
408
  return `${days} ${days === 1 ? 'day' : 'days'}`;
293
409
  }