@stapel/listings-react 0.28.1 → 0.29.1
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.
- package/CHANGELOG.md +75 -0
- package/MODULE.md +25 -8
- package/README.md +16 -6
- package/dist/api/generated/schema.d.ts +2 -0
- package/dist/api/generated/schema.d.ts.map +1 -1
- package/dist/i18n/es.d.ts +7 -5
- package/dist/i18n/es.d.ts.map +1 -1
- package/dist/i18n/es.js +18 -28
- package/dist/i18n/es.js.map +1 -1
- package/dist/i18n/generated/errors.es.gen.d.ts +2 -2
- package/dist/i18n/generated/errors.es.gen.d.ts.map +1 -1
- package/dist/i18n/generated/errors.es.gen.js +19 -2
- package/dist/i18n/generated/errors.es.gen.js.map +1 -1
- package/dist/i18n/generated/errors.gen.d.ts +2 -2
- package/dist/i18n/generated/errors.gen.js +2 -2
- package/dist/i18n/generated/errors.gen.js.map +1 -1
- package/dist/i18n/generated/errors.ru.gen.d.ts +2 -2
- package/dist/i18n/generated/errors.ru.gen.d.ts.map +1 -1
- package/dist/i18n/generated/errors.ru.gen.js +19 -2
- package/dist/i18n/generated/errors.ru.gen.js.map +1 -1
- package/dist/i18n/keys.d.ts.map +1 -1
- package/dist/i18n/keys.js +6 -7
- package/dist/i18n/keys.js.map +1 -1
- package/dist/i18n/ru.d.ts +21 -13
- package/dist/i18n/ru.d.ts.map +1 -1
- package/dist/i18n/ru.js +34 -44
- package/dist/i18n/ru.js.map +1 -1
- package/llms.txt +1 -2
- package/manifest.json +2 -4
- package/nav-manifest.json +1 -1
- package/package.json +3 -3
- package/src/analytics/generated/events.json +1 -1
- package/src/api/generated/schema.ts +2 -0
- package/src/i18n/es.ts +18 -44
- package/src/i18n/generated/errors.es.gen.ts +19 -2
- package/src/i18n/generated/errors.gen.ts +2 -2
- package/src/i18n/generated/errors.json +2 -4
- package/src/i18n/generated/errors.ru.gen.ts +19 -2
- package/src/i18n/keys.ts +6 -7
- package/src/i18n/ru.ts +34 -60
package/src/i18n/es.ts
CHANGED
|
@@ -8,39 +8,33 @@ export { listingsErrorBundleEs } from "./generated/errors.es.gen.js";
|
|
|
8
8
|
* Spanish bundle for listings-react — the `@stapel/listings-react/i18n/es`
|
|
9
9
|
* subpath (i18n-shipping.md §2), opt-in exactly like `./i18n/ru`.
|
|
10
10
|
*
|
|
11
|
-
* It carries the UI copy
|
|
11
|
+
* It carries the UI copy, which is now the ONLY thing it carries by hand. The
|
|
12
12
|
* composer and the owner's dashboard are the surfaces a seller works in for
|
|
13
13
|
* minutes at a time; a half-translated form there is visible immediately, in
|
|
14
14
|
* the way a half-translated settings pane is not. Same call chat-react made
|
|
15
15
|
* for the buyer↔seller thread.
|
|
16
16
|
*
|
|
17
|
-
* Provenance and the owner split are as in `./ru.ts`:
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
17
|
+
* Provenance and the owner split are as in `./ru.ts`: of the 72 registry
|
|
18
|
+
* codes, 42 cross-cutting `stapel_core` ones are generated from core's
|
|
19
|
+
* catalogue and the 17 `stapel_listings` ones from the module's own — which
|
|
20
|
+
* stapel-listings 0.22.8 ships for the first time, and which is why the
|
|
21
|
+
* seventeen strings that used to be authored here are gone. The 13
|
|
22
|
+
* `stapel_attributes` codes stay with `@stapel/attributes-react`.
|
|
21
23
|
*/
|
|
22
24
|
export const listingsI18nBundleEs: I18nDictionary = {
|
|
23
25
|
...listingsErrorBundleEs,
|
|
24
26
|
|
|
25
|
-
// ──
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"Para publicar un anuncio, inicia sesión o crea una cuenta",
|
|
37
|
-
"error.403.listing_not_owner": "Este anuncio no es tuyo",
|
|
38
|
-
"error.404.listing_not_found": "No se encontró el anuncio",
|
|
39
|
-
"error.409.already_favorited": "El anuncio ya está en favoritos",
|
|
40
|
-
"error.409.invalid_listing_transition":
|
|
41
|
-
"Desde su estado actual, el anuncio no se puede mover así",
|
|
42
|
-
"error.409.listing_cannot_delete_active":
|
|
43
|
-
"Archívalo primero — un anuncio a la venta no se puede borrar",
|
|
27
|
+
// ── stapel_listings' own refusals: NONE are authored here any more ───────
|
|
28
|
+
//
|
|
29
|
+
// stapel-listings 0.22.8 ships `translations/errors.es.json`, so all
|
|
30
|
+
// SEVENTEEN codes it owns arrive through the generated spread above and the
|
|
31
|
+
// seventeen lines that stood in for them are deleted — one string, one
|
|
32
|
+
// source. The reasoning, and the single surviving override, are spelled out
|
|
33
|
+
// once in `./ru.ts`; this is its es half.
|
|
34
|
+
//
|
|
35
|
+
// The one override that survived 0.22.8 is gone with it: stapel-listings
|
|
36
|
+
// 0.22.10 dropped the {from_status} slot from all three languages, so there
|
|
37
|
+
// is nothing left for this pair to correct.
|
|
44
38
|
|
|
45
39
|
"listings.error.unknown": "Algo salió mal con este anuncio",
|
|
46
40
|
|
|
@@ -230,26 +224,6 @@ export const listingsI18nBundleEs: I18nDictionary = {
|
|
|
230
224
|
"listings.favorites.sign_in_hint":
|
|
231
225
|
"Los favoritos se guardan en tu cuenta, así que te siguen entre dispositivos.",
|
|
232
226
|
|
|
233
|
-
// Las dos comprobaciones de publicación que llegaron con el contrato 0.17.
|
|
234
|
-
"error.400.listing_location_required":
|
|
235
|
-
"Indica dónde está el artículo antes de publicarlo",
|
|
236
|
-
"error.400.listing_zero_price_not_allowed":
|
|
237
|
-
"En esta categoría no se permite un precio de 0. Deja el precio vacío para «precio no indicado».",
|
|
238
|
-
|
|
239
|
-
"error.400.listing_draft_meta_too_large":
|
|
240
|
-
"El borrador es demasiado grande (máximo {max_bytes} bytes). Quita parte de los datos y guarda de nuevo.",
|
|
241
|
-
|
|
242
|
-
// stapel-listings 0.22.3: the features_draft WRITE now accepts the shape a
|
|
243
|
-
// listing READ returns. These three are the refusals for a body that is
|
|
244
|
-
// neither — read by whoever is wiring the integration, so each names the
|
|
245
|
-
// shape it wanted instead of advising "try again".
|
|
246
|
-
"error.400.listing_features_draft_shape":
|
|
247
|
-
"features_draft debe ser un objeto con los slugs de las características como claves, o la lista de objetos de característica que devuelve la lectura del anuncio (cada uno con su propio «slug»). Llegó: {got_type}. Ejemplo de la forma de objeto aceptada: {example}",
|
|
248
|
-
"error.400.listing_features_draft_unknown_slug":
|
|
249
|
-
"Cada elemento de una lista features_draft debe llevar su propio «slug» no vacío — el que la lectura del anuncio guarda en ese elemento — para poder archivarlo bajo la característica correcta. El elemento en el índice {index} no lo tiene. Ejemplo: {example}",
|
|
250
|
-
"error.400.listing_features_draft_value_shape":
|
|
251
|
-
"features_draft['{slug}'] debe ser a su vez un objeto de la forma {{\"type\": <tipo de característica>, \"value\": <valor de característica>}}. Llegó: {got_type}. Ejemplo: {example}",
|
|
252
|
-
|
|
253
227
|
"listings.blocked.sign_in": "Inicia sesión para hacer esto",
|
|
254
228
|
"listings.blocked.guest":
|
|
255
229
|
"Esta cuenta todavía no puede hacerlo — termina de configurarla primero",
|
|
@@ -8,8 +8,8 @@ import type { ListingsErrorCode } from "./errors.gen.js";
|
|
|
8
8
|
/**
|
|
9
9
|
* `es` texts for the backend error codes this catalog carries.
|
|
10
10
|
*
|
|
11
|
-
* PARTIAL, and deliberately typed to say so:
|
|
12
|
-
* stapel_attributes
|
|
11
|
+
* PARTIAL, and deliberately typed to say so: 13 key(s) owned by
|
|
12
|
+
* stapel_attributes are absent, because that owner ships no locale catalog
|
|
13
13
|
* (ERRORS_LOCALE_EXEMPT_OWNERS). English for them still comes from the registry
|
|
14
14
|
* artifact via the en bundle; the pair layers its own authored `es`
|
|
15
15
|
* strings over this one until upstream ships translations. `Partial` is what
|
|
@@ -22,6 +22,7 @@ export const listingsErrorBundleEs: Partial<Record<ListingsErrorCode, string>> =
|
|
|
22
22
|
"error.400.bad_request": "Solicitud incorrecta",
|
|
23
23
|
"error.400.captcha_invalid": "La verificación del captcha ha fallado. Inténtalo de nuevo.",
|
|
24
24
|
"error.400.captcha_required": "Se requiere el token del captcha.",
|
|
25
|
+
"error.400.category_required": "La categoría es obligatoria",
|
|
25
26
|
"error.400.expected_list": "Se esperaba una lista de elementos",
|
|
26
27
|
"error.400.field.blank": "{field} no puede estar vacío",
|
|
27
28
|
"error.400.field.does_not_exist": "{field} no existe",
|
|
@@ -34,23 +35,39 @@ export const listingsErrorBundleEs: Partial<Record<ListingsErrorCode, string>> =
|
|
|
34
35
|
"error.400.field.null": "{field} no puede ser nulo",
|
|
35
36
|
"error.400.field.required": "{field} es obligatorio",
|
|
36
37
|
"error.400.field.unique": "{field} debe ser único",
|
|
38
|
+
"error.400.image_required": "Se necesita al menos una imagen para publicar",
|
|
37
39
|
"error.400.invalid_ad_id": "ID de anuncio no válido",
|
|
40
|
+
"error.400.listing_draft_meta_too_large": "El campo draft_meta es demasiado grande (máximo {max_bytes} bytes)",
|
|
41
|
+
"error.400.listing_feature_not_allowed": "La característica {feature} no está permitida en esta categoría",
|
|
42
|
+
"error.400.listing_features_draft_shape": "features_draft debe ser un objeto con los slugs de las características como claves, o la lista de objetos de característica que devuelve la lectura de un anuncio (cada uno con su propio «slug»); se recibió {got_type}. Ejemplo de la forma de objeto aceptada: {example}",
|
|
43
|
+
"error.400.listing_features_draft_unknown_slug": "Cada elemento de una lista features_draft debe llevar su propia cadena «slug» no vacía (el slug que la lectura de un anuncio guarda en ese elemento) para poder asignarlo a la característica correcta; el elemento con índice {index} no la tiene. Ejemplo: {example}",
|
|
44
|
+
"error.400.listing_features_draft_value_shape": "features_draft['{slug}'] debe ser a su vez un objeto de la forma {{\"type\": <tipo de característica>, \"value\": <valor de la característica>}}; se recibió {got_type}. Ejemplo: {example}",
|
|
45
|
+
"error.400.listing_invalid_status_filter": "Estado de anuncio desconocido: {status}",
|
|
46
|
+
"error.400.listing_location_required": "Indica dónde se encuentra el artículo antes de publicar",
|
|
47
|
+
"error.400.listing_zero_price_not_allowed": "No se permite un precio de 0 en esta categoría. Deja el precio vacío para indicar «precio no indicado».",
|
|
48
|
+
"error.400.publish_validation_failed": "La validación del anuncio ha fallado",
|
|
38
49
|
"error.400.validation_error": "Error de validación",
|
|
39
50
|
"error.400.verification_failed": "La verificación ha fallado",
|
|
40
51
|
"error.400.verification_invalid_factor": "Este factor de verificación no está disponible",
|
|
41
52
|
"error.401.unauthorized": "Se requiere autenticación",
|
|
42
53
|
"error.402.payment_required": "Se requiere pago",
|
|
43
54
|
"error.403.forbidden": "No tienes permiso para realizar esta acción",
|
|
55
|
+
"error.403.listing_anonymous_not_allowed": "Una cuenta de invitado no puede publicar anuncios",
|
|
56
|
+
"error.403.listing_not_owner": "Este anuncio no es tuyo",
|
|
44
57
|
"error.403.network_blocked": "No se permiten solicitudes desde esta red.",
|
|
45
58
|
"error.403.verification_enrollment_required": "Es necesario registrar un factor de verificación.",
|
|
46
59
|
"error.403.verification_required": "Se requiere verificación adicional",
|
|
47
60
|
"error.404.ad_not_found": "Anuncio no encontrado",
|
|
61
|
+
"error.404.listing_not_found": "Anuncio no encontrado",
|
|
48
62
|
"error.404.not_found": "Recurso solicitado no encontrado",
|
|
49
63
|
"error.404.verification_challenge_not_found": "Desafío de verificación no encontrado o caducado",
|
|
50
64
|
"error.405.method_not_allowed": "Método no permitido",
|
|
51
65
|
"error.406.not_acceptable": "No aceptable",
|
|
52
66
|
"error.408.request_timeout": "Tiempo de espera de la solicitud agotado",
|
|
67
|
+
"error.409.already_favorited": "El anuncio ya está en favoritos",
|
|
53
68
|
"error.409.conflict": "El recurso ya existe",
|
|
69
|
+
"error.409.invalid_listing_transition": "El anuncio no puede pasar de su estado actual al estado elegido",
|
|
70
|
+
"error.409.listing_cannot_delete_active": "No se puede eliminar un anuncio activo. Archívalo primero.",
|
|
54
71
|
"error.410.gone": "El recurso se ha eliminado permanentemente",
|
|
55
72
|
"error.413.payload_too_large": "El cuerpo de la solicitud es demasiado grande",
|
|
56
73
|
"error.415.unsupported_media_type": "Tipo de contenido no compatible",
|
|
@@ -95,7 +95,7 @@ export const LISTINGS_ERRORS = {
|
|
|
95
95
|
"error.408.request_timeout": { status: 408, params: [], remediation: "retry", en: "Request timeout" },
|
|
96
96
|
"error.409.already_favorited": { status: 409, params: [], remediation: "fix_input", en: "Listing already favorited" },
|
|
97
97
|
"error.409.conflict": { status: 409, params: [], remediation: "fix_input", en: "Resource already exists" },
|
|
98
|
-
"error.409.invalid_listing_transition": { status: 409, params: [
|
|
98
|
+
"error.409.invalid_listing_transition": { status: 409, params: [], remediation: "fix_input", en: "This listing cannot move to that status from the one it is in now" },
|
|
99
99
|
"error.409.listing_cannot_delete_active": { status: 409, params: [], remediation: "fix_input", en: "Cannot delete an active listing. Archive it first." },
|
|
100
100
|
"error.410.gone": { status: 410, params: [], remediation: "retry", en: "Resource has been permanently removed" },
|
|
101
101
|
"error.413.payload_too_large": { status: 413, params: [], remediation: "retry", en: "Request body is too large" },
|
|
@@ -253,7 +253,7 @@ export const listingsErrorBundleEn: Record<ListingsErrorCode, string> = {
|
|
|
253
253
|
"error.408.request_timeout": "Request timeout",
|
|
254
254
|
"error.409.already_favorited": "Listing already favorited",
|
|
255
255
|
"error.409.conflict": "Resource already exists",
|
|
256
|
-
"error.409.invalid_listing_transition": "
|
|
256
|
+
"error.409.invalid_listing_transition": "This listing cannot move to that status from the one it is in now",
|
|
257
257
|
"error.409.listing_cannot_delete_active": "Cannot delete an active listing. Archive it first.",
|
|
258
258
|
"error.410.gone": "Resource has been permanently removed",
|
|
259
259
|
"error.413.payload_too_large": "Request body is too large",
|
|
@@ -490,11 +490,9 @@
|
|
|
490
490
|
{
|
|
491
491
|
"code": "error.409.invalid_listing_transition",
|
|
492
492
|
"status": 409,
|
|
493
|
-
"params": [
|
|
494
|
-
"from_status"
|
|
495
|
-
],
|
|
493
|
+
"params": [],
|
|
496
494
|
"remediation": "fix_input",
|
|
497
|
-
"en": "
|
|
495
|
+
"en": "This listing cannot move to that status from the one it is in now"
|
|
498
496
|
},
|
|
499
497
|
{
|
|
500
498
|
"code": "error.409.listing_cannot_delete_active",
|
|
@@ -8,8 +8,8 @@ import type { ListingsErrorCode } from "./errors.gen.js";
|
|
|
8
8
|
/**
|
|
9
9
|
* `ru` texts for the backend error codes this catalog carries.
|
|
10
10
|
*
|
|
11
|
-
* PARTIAL, and deliberately typed to say so:
|
|
12
|
-
* stapel_attributes
|
|
11
|
+
* PARTIAL, and deliberately typed to say so: 13 key(s) owned by
|
|
12
|
+
* stapel_attributes are absent, because that owner ships no locale catalog
|
|
13
13
|
* (ERRORS_LOCALE_EXEMPT_OWNERS). English for them still comes from the registry
|
|
14
14
|
* artifact via the en bundle; the pair layers its own authored `ru`
|
|
15
15
|
* strings over this one until upstream ships translations. `Partial` is what
|
|
@@ -22,6 +22,7 @@ export const listingsErrorBundleRu: Partial<Record<ListingsErrorCode, string>> =
|
|
|
22
22
|
"error.400.bad_request": "Некорректный запрос",
|
|
23
23
|
"error.400.captcha_invalid": "Проверка капчи не пройдена. Пожалуйста, попробуйте ещё раз.",
|
|
24
24
|
"error.400.captcha_required": "Требуется токен капчи.",
|
|
25
|
+
"error.400.category_required": "Категория обязательна",
|
|
25
26
|
"error.400.expected_list": "Ожидался список элементов",
|
|
26
27
|
"error.400.field.blank": "Поле «{field}» не может быть пустым",
|
|
27
28
|
"error.400.field.does_not_exist": "«{field}» не существует",
|
|
@@ -34,23 +35,39 @@ export const listingsErrorBundleRu: Partial<Record<ListingsErrorCode, string>> =
|
|
|
34
35
|
"error.400.field.null": "Поле «{field}» не может быть null",
|
|
35
36
|
"error.400.field.required": "Поле «{field}» обязательно",
|
|
36
37
|
"error.400.field.unique": "Значение поля «{field}» должно быть уникальным",
|
|
38
|
+
"error.400.image_required": "Для публикации нужна хотя бы одна фотография",
|
|
37
39
|
"error.400.invalid_ad_id": "Недопустимый идентификатор объявления",
|
|
40
|
+
"error.400.listing_draft_meta_too_large": "Поле draft_meta слишком большое (не более {max_bytes} байт)",
|
|
41
|
+
"error.400.listing_feature_not_allowed": "Характеристика «{feature}» недопустима для этой категории",
|
|
42
|
+
"error.400.listing_features_draft_shape": "features_draft должен быть объектом с ключами-слагами характеристик либо списком объектов характеристик, который возвращает чтение объявления (у каждого есть собственный «slug») — получено {got_type}. Пример допустимой формы объекта: {example}",
|
|
43
|
+
"error.400.listing_features_draft_unknown_slug": "Каждый элемент списка features_draft должен содержать собственную непустую строку «slug» (тот слаг, который чтение объявления сохраняет в этом элементе), чтобы значение вернулось к нужной характеристике — у элемента с индексом {index} его нет. Пример: {example}",
|
|
44
|
+
"error.400.listing_features_draft_value_shape": "features_draft['{slug}'] сам должен быть объектом вида {{\"type\": <тип характеристики>, \"value\": <значение характеристики>}} — получено {got_type}. Пример: {example}",
|
|
45
|
+
"error.400.listing_invalid_status_filter": "Неизвестный статус объявления «{status}»",
|
|
46
|
+
"error.400.listing_location_required": "Перед публикацией укажите, где находится товар",
|
|
47
|
+
"error.400.listing_zero_price_not_allowed": "Цена 0 в этой категории недопустима. Оставьте поле цены пустым — это означает «цена не указана».",
|
|
48
|
+
"error.400.publish_validation_failed": "Объявление не прошло проверку",
|
|
38
49
|
"error.400.validation_error": "Ошибка валидации",
|
|
39
50
|
"error.400.verification_failed": "Проверка не пройдена",
|
|
40
51
|
"error.400.verification_invalid_factor": "Этот способ подтверждения недоступен",
|
|
41
52
|
"error.401.unauthorized": "Требуется аутентификация",
|
|
42
53
|
"error.402.payment_required": "Требуется оплата",
|
|
43
54
|
"error.403.forbidden": "У вас нет прав для выполнения этого действия",
|
|
55
|
+
"error.403.listing_anonymous_not_allowed": "Гостевая учётная запись не может публиковать объявления",
|
|
56
|
+
"error.403.listing_not_owner": "Это не ваше объявление",
|
|
44
57
|
"error.403.network_blocked": "Запросы из этой сети не разрешены.",
|
|
45
58
|
"error.403.verification_enrollment_required": "Требуется регистрация фактора подтверждения.",
|
|
46
59
|
"error.403.verification_required": "Требуется дополнительная проверка",
|
|
47
60
|
"error.404.ad_not_found": "Объявление не найдено",
|
|
61
|
+
"error.404.listing_not_found": "Объявление не найдено",
|
|
48
62
|
"error.404.not_found": "Запрошенный ресурс не найден",
|
|
49
63
|
"error.404.verification_challenge_not_found": "Запрос на подтверждение не найден или истёк",
|
|
50
64
|
"error.405.method_not_allowed": "Метод не разрешён",
|
|
51
65
|
"error.406.not_acceptable": "Недопустимый формат ответа",
|
|
52
66
|
"error.408.request_timeout": "Время ожидания запроса истекло",
|
|
67
|
+
"error.409.already_favorited": "Объявление уже в избранном",
|
|
53
68
|
"error.409.conflict": "Ресурс уже существует",
|
|
69
|
+
"error.409.invalid_listing_transition": "Из текущего статуса объявление нельзя перевести в выбранный",
|
|
70
|
+
"error.409.listing_cannot_delete_active": "Активное объявление нельзя удалить. Сначала перенесите его в архив.",
|
|
54
71
|
"error.410.gone": "Ресурс был безвозвратно удалён",
|
|
55
72
|
"error.413.payload_too_large": "Тело запроса слишком большое",
|
|
56
73
|
"error.415.unsupported_media_type": "Неподдерживаемый тип данных",
|
package/src/i18n/keys.ts
CHANGED
|
@@ -546,13 +546,12 @@ export const listingsI18nBundleEn: Record<string, string> = {
|
|
|
546
546
|
* the reader needs is which MOVE is impossible, and that is the control
|
|
547
547
|
* they are looking at.
|
|
548
548
|
*
|
|
549
|
-
* The SERVER's own 409 (`error.409.invalid_listing_transition`)
|
|
550
|
-
* same placeholder and
|
|
551
|
-
*
|
|
552
|
-
*
|
|
553
|
-
*
|
|
554
|
-
*
|
|
555
|
-
* and is right. The refusal is in any case now close to unreachable: the
|
|
549
|
+
* The SERVER's own 409 (`error.409.invalid_listing_transition`) carried the
|
|
550
|
+
* same placeholder and was reworded here, in the ru and es bundles, for the
|
|
551
|
+
* same reason. That override is GONE as of stapel-listings 0.22.10, which
|
|
552
|
+
* dropped the slot upstream in all three languages — so the refusal now
|
|
553
|
+
* arrives already free of the wire value and this pair authors nothing under
|
|
554
|
+
* `error.*` at all. The refusal is in any case close to unreachable: the
|
|
556
555
|
* dashboard offers only the moves the server declared.
|
|
557
556
|
*/
|
|
558
557
|
"listings.blocked.transition":
|
package/src/i18n/ru.ts
CHANGED
|
@@ -17,50 +17,48 @@ export { listingsErrorBundleRu } from "./generated/errors.ru.gen.js";
|
|
|
17
17
|
*
|
|
18
18
|
* ── What comes from where ──────────────────────────────────────────────────
|
|
19
19
|
*
|
|
20
|
-
* `stapel-listings` ships
|
|
21
|
-
*
|
|
22
|
-
* by owner:
|
|
20
|
+
* `stapel-listings` 0.22.8 ships `translations/errors.ru.json`, which is the
|
|
21
|
+
* line that used to say the opposite. Of the 72 registry codes:
|
|
23
22
|
*
|
|
24
23
|
* - the 42 cross-cutting `stapel_core` codes are GENERATED, merged in from
|
|
25
|
-
* stapel-core's own catalogue by `pnpm gen:errors
|
|
26
|
-
* - the **
|
|
27
|
-
*
|
|
28
|
-
*
|
|
24
|
+
* stapel-core's own catalogue by `pnpm gen:errors`;
|
|
25
|
+
* - the **17 `stapel_listings` codes** are GENERATED too, from the module's
|
|
26
|
+
* own catalogue — the seventeen hand-authored lines that stood in for it
|
|
27
|
+
* are deleted, so each of those strings has exactly one source and the
|
|
28
|
+
* drift gate owns it;
|
|
29
|
+
* - the **13 `stapel_attributes` codes** are NOT here. They belong to
|
|
29
30
|
* `@stapel/attributes-react`, which already translates them and which is a
|
|
30
31
|
* peer of this pair anyway. Two packages must not give one refusal two
|
|
31
32
|
* sentences (spec §13.2, note 3). A host registers both bundles;
|
|
32
|
-
* `test/i18n.test.ts` proves the union covers the registry.
|
|
33
|
+
* `test/i18n.test.ts` proves the union covers the registry. stapel-attributes
|
|
34
|
+
* 0.9.3 ships a catalogue of its own now, and merging it in HERE would
|
|
35
|
+
* recreate exactly the two-sources problem this file just removed — the
|
|
36
|
+
* place to consume it is that pair, not this one.
|
|
37
|
+
*
|
|
38
|
+
* The first two bullets are the whole generated spread below; what follows it
|
|
39
|
+
* by hand is UI copy plus one deliberate override, called out where it sits.
|
|
33
40
|
*
|
|
34
41
|
* PROVENANCE, stated rather than implied: the core catalogue ships
|
|
35
|
-
* `origin=seed:authored` and is UNREVIEWED; the
|
|
36
|
-
* are the same grade.
|
|
42
|
+
* `origin=seed:authored` and is UNREVIEWED; the module's own catalogue and the
|
|
43
|
+
* pair-authored UI copy below are the same grade. None of it is a claim of
|
|
44
|
+
* review.
|
|
37
45
|
*/
|
|
38
46
|
export const listingsI18nBundleRu: I18nDictionary = {
|
|
39
47
|
...listingsErrorBundleRu,
|
|
40
48
|
|
|
41
|
-
// ──
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
"error.404.listing_not_found": "Объявление не найдено",
|
|
55
|
-
"error.409.already_favorited": "Объявление уже в избранном",
|
|
56
|
-
// No `{from_status}`: what landed in that slot was the wire value
|
|
57
|
-
// ('draft', 'archived'), and the status is already named in the reader's
|
|
58
|
-
// own words beside the control. See the note on this pair of keys in
|
|
59
|
-
// keys.ts.
|
|
60
|
-
"error.409.invalid_listing_transition":
|
|
61
|
-
"Из текущего состояния объявление так перевести нельзя",
|
|
62
|
-
"error.409.listing_cannot_delete_active":
|
|
63
|
-
"Сначала снимите объявление с публикации — активное удалить нельзя",
|
|
49
|
+
// ── stapel_listings' own refusals: NONE are authored here any more ───────
|
|
50
|
+
//
|
|
51
|
+
// The module ships `translations/errors.ru.json` as of 0.22.8, so all
|
|
52
|
+
// SEVENTEEN codes it owns arrive through the generated spread above. The
|
|
53
|
+
// seventeen lines that used to sit here are deleted rather than kept beside
|
|
54
|
+
// it: a key with two sources drifts, and nothing in this file could tell a
|
|
55
|
+
// reader which of the two a screen had shown them.
|
|
56
|
+
//
|
|
57
|
+
// The ONE override this pair kept at 0.22.8 is gone too, as its own note
|
|
58
|
+
// said it should be: upstream's text interpolated {from_status} — the WIRE
|
|
59
|
+
// value ('draft', 'archived') — into translated prose, and stapel-listings
|
|
60
|
+
// 0.22.10 dropped the placeholder from all three languages. The pair now
|
|
61
|
+
// authors nothing at all under `error.*`.
|
|
64
62
|
|
|
65
63
|
"listings.error.unknown": "Что-то пошло не так с этим объявлением",
|
|
66
64
|
|
|
@@ -253,30 +251,6 @@ export const listingsI18nBundleRu: I18nDictionary = {
|
|
|
253
251
|
"listings.favorites.sign_in_hint":
|
|
254
252
|
"Избранное хранится в аккаунте, поэтому переходит с вами на другие устройства.",
|
|
255
253
|
|
|
256
|
-
// The two publish checks the 0.17 contract brought with it: a place is
|
|
257
|
-
// required, and a zero price in such a category is an empty field rather
|
|
258
|
-
// than "free".
|
|
259
|
-
"error.400.listing_location_required":
|
|
260
|
-
"Перед публикацией укажите, где находится товар",
|
|
261
|
-
"error.400.listing_zero_price_not_allowed":
|
|
262
|
-
"В этой категории цена 0 недопустима. Оставьте поле пустым — это и есть «цена не указана».",
|
|
263
|
-
|
|
264
|
-
// stapel-listings 0.21.2: the composer's per-field provenance sidecar has a
|
|
265
|
-
// size ceiling, and the number is the server's own — never restated here.
|
|
266
|
-
"error.400.listing_draft_meta_too_large":
|
|
267
|
-
"Черновик слишком большой (не больше {max_bytes} байт). Уберите часть данных и сохраните ещё раз.",
|
|
268
|
-
|
|
269
|
-
// stapel-listings 0.22.3: the features_draft WRITE now accepts the shape a
|
|
270
|
-
// listing READ returns. These three are the refusals for a body that is
|
|
271
|
-
// neither — read by whoever is wiring the integration, so each names the
|
|
272
|
-
// shape it wanted instead of advising "try again".
|
|
273
|
-
"error.400.listing_features_draft_shape":
|
|
274
|
-
"features_draft должен быть объектом со слагами признаков в ключах — или тем списком объектов признаков, который возвращает чтение объявления (у каждого свой «slug»). Пришло: {got_type}. Пример принимаемой формы объекта: {example}",
|
|
275
|
-
"error.400.listing_features_draft_unknown_slug":
|
|
276
|
-
"У каждого элемента списка features_draft должен быть свой непустой «slug» — тот, который чтение объявления хранит на этом элементе, иначе значение некуда положить. У элемента с индексом {index} его нет. Пример: {example}",
|
|
277
|
-
"error.400.listing_features_draft_value_shape":
|
|
278
|
-
"features_draft['{slug}'] сам должен быть объектом вида {{\"type\": <тип признака>, \"value\": <значение признака>}}. Пришло: {got_type}. Пример: {example}",
|
|
279
|
-
|
|
280
254
|
"listings.blocked.sign_in": "Войдите, чтобы сделать это",
|
|
281
255
|
"listings.blocked.guest":
|
|
282
256
|
"Этот аккаунт пока так не может — сначала завершите настройку",
|
|
@@ -303,17 +277,17 @@ export const listingsI18nBundleRu: I18nDictionary = {
|
|
|
303
277
|
};
|
|
304
278
|
|
|
305
279
|
/**
|
|
306
|
-
* Register the Russian bundle into a core i18n engine — AND the
|
|
280
|
+
* Register the Russian bundle into a core i18n engine — AND the thirteen
|
|
307
281
|
* `stapel_attributes` sentences this pair deliberately does not author.
|
|
308
282
|
*
|
|
309
283
|
* The split of ownership is right and stays: two packages must not give one
|
|
310
284
|
* refusal two sentences. What was wrong was leaving the JOIN to a README. A
|
|
311
|
-
* host that registered only this bundle got
|
|
285
|
+
* host that registered only this bundle got thirteen of the composer's most
|
|
312
286
|
* common refusals ("this value is below the minimum", "the description is too
|
|
313
287
|
* long") in English on a Russian page, and nothing failed anywhere to say so.
|
|
314
288
|
*
|
|
315
289
|
* `@stapel/attributes-react` is a peer of this pair and its editors are what
|
|
316
|
-
* RAISE those
|
|
290
|
+
* RAISE those thirteen, so a listings-ru host is an attributes-ru host by
|
|
317
291
|
* construction; chaining the registration states that instead of asking. It is
|
|
318
292
|
* idempotent — a host that also registers the bundle itself simply writes the
|
|
319
293
|
* same keys twice.
|