@stapel/listings-react 0.1.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.
- package/CHANGELOG.md +1 -0
- package/MODULE.md +191 -0
- package/README.md +169 -0
- package/dist/api/generated/schema.d.ts +1253 -0
- package/dist/api/generated/schema.d.ts.map +1 -0
- package/dist/api/generated/schema.js +2 -0
- package/dist/api/generated/schema.js.map +1 -0
- package/dist/api/listingsApi.d.ts +145 -0
- package/dist/api/listingsApi.d.ts.map +1 -0
- package/dist/api/listingsApi.js +38 -0
- package/dist/api/listingsApi.js.map +1 -0
- package/dist/api/types.d.ts +156 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +37 -0
- package/dist/api/types.js.map +1 -0
- package/dist/default/ErrorAlert.d.ts +9 -0
- package/dist/default/ErrorAlert.d.ts.map +1 -0
- package/dist/default/ErrorAlert.js +27 -0
- package/dist/default/ErrorAlert.js.map +1 -0
- package/dist/default/FavoritesPane.d.ts +18 -0
- package/dist/default/FavoritesPane.d.ts.map +1 -0
- package/dist/default/FavoritesPane.js +28 -0
- package/dist/default/FavoritesPane.js.map +1 -0
- package/dist/default/ListingCard.d.ts +42 -0
- package/dist/default/ListingCard.d.ts.map +1 -0
- package/dist/default/ListingCard.js +37 -0
- package/dist/default/ListingCard.js.map +1 -0
- package/dist/default/ListingComposerPage.d.ts +46 -0
- package/dist/default/ListingComposerPage.d.ts.map +1 -0
- package/dist/default/ListingComposerPage.js +99 -0
- package/dist/default/ListingComposerPage.js.map +1 -0
- package/dist/default/ListingDetailPane.d.ts +33 -0
- package/dist/default/ListingDetailPane.d.ts.map +1 -0
- package/dist/default/ListingDetailPane.js +48 -0
- package/dist/default/ListingDetailPane.js.map +1 -0
- package/dist/default/ListingPhoto.d.ts +25 -0
- package/dist/default/ListingPhoto.d.ts.map +1 -0
- package/dist/default/ListingPhoto.js +20 -0
- package/dist/default/ListingPhoto.js.map +1 -0
- package/dist/default/MyListingsPane.d.ts +25 -0
- package/dist/default/MyListingsPane.d.ts.map +1 -0
- package/dist/default/MyListingsPane.js +84 -0
- package/dist/default/MyListingsPane.js.map +1 -0
- package/dist/default/StatusTags.d.ts +31 -0
- package/dist/default/StatusTags.d.ts.map +1 -0
- package/dist/default/StatusTags.js +40 -0
- package/dist/default/StatusTags.js.map +1 -0
- package/dist/default/icons.d.ts +16 -0
- package/dist/default/icons.d.ts.map +1 -0
- package/dist/default/icons.js +5 -0
- package/dist/default/icons.js.map +1 -0
- package/dist/default/index.d.ts +35 -0
- package/dist/default/index.d.ts.map +1 -0
- package/dist/default/index.js +26 -0
- package/dist/default/index.js.map +1 -0
- package/dist/default/theme.d.ts +25 -0
- package/dist/default/theme.d.ts.map +1 -0
- package/dist/default/theme.js +40 -0
- package/dist/default/theme.js.map +1 -0
- package/dist/default/types.d.ts +12 -0
- package/dist/default/types.d.ts.map +1 -0
- package/dist/default/types.js +2 -0
- package/dist/default/types.js.map +1 -0
- package/dist/flows/registry.d.ts +35 -0
- package/dist/flows/registry.d.ts.map +1 -0
- package/dist/flows/registry.js +33 -0
- package/dist/flows/registry.js.map +1 -0
- package/dist/headless/Favorites.d.ts +52 -0
- package/dist/headless/Favorites.d.ts.map +1 -0
- package/dist/headless/Favorites.js +78 -0
- package/dist/headless/Favorites.js.map +1 -0
- package/dist/headless/ListingActions.d.ts +30 -0
- package/dist/headless/ListingActions.d.ts.map +1 -0
- package/dist/headless/ListingActions.js +54 -0
- package/dist/headless/ListingActions.js.map +1 -0
- package/dist/headless/ListingComposer.d.ts +133 -0
- package/dist/headless/ListingComposer.d.ts.map +1 -0
- package/dist/headless/ListingComposer.js +246 -0
- package/dist/headless/ListingComposer.js.map +1 -0
- package/dist/headless/ListingDetail.d.ts +81 -0
- package/dist/headless/ListingDetail.d.ts.map +1 -0
- package/dist/headless/ListingDetail.js +101 -0
- package/dist/headless/ListingDetail.js.map +1 -0
- package/dist/headless/ListingsProvider.d.ts +17 -0
- package/dist/headless/ListingsProvider.d.ts.map +1 -0
- package/dist/headless/ListingsProvider.js +16 -0
- package/dist/headless/ListingsProvider.js.map +1 -0
- package/dist/headless/MyListings.d.ts +44 -0
- package/dist/headless/MyListings.d.ts.map +1 -0
- package/dist/headless/MyListings.js +82 -0
- package/dist/headless/MyListings.js.map +1 -0
- package/dist/headless/useMandateGate.d.ts +28 -0
- package/dist/headless/useMandateGate.d.ts.map +1 -0
- package/dist/headless/useMandateGate.js +39 -0
- package/dist/headless/useMandateGate.js.map +1 -0
- package/dist/i18n/errorsMap.d.ts +34 -0
- package/dist/i18n/errorsMap.d.ts.map +1 -0
- package/dist/i18n/errorsMap.js +45 -0
- package/dist/i18n/errorsMap.js.map +1 -0
- package/dist/i18n/es.d.ts +21 -0
- package/dist/i18n/es.d.ts.map +1 -0
- package/dist/i18n/es.js +146 -0
- package/dist/i18n/es.js.map +1 -0
- package/dist/i18n/generated/errors.es.gen.d.ts +16 -0
- package/dist/i18n/generated/errors.es.gen.d.ts.map +1 -0
- package/dist/i18n/generated/errors.es.gen.js +58 -0
- package/dist/i18n/generated/errors.es.gen.js.map +1 -0
- package/dist/i18n/generated/errors.gen.d.ts +413 -0
- package/dist/i18n/generated/errors.gen.d.ts.map +1 -0
- package/dist/i18n/generated/errors.gen.js +210 -0
- package/dist/i18n/generated/errors.gen.js.map +1 -0
- package/dist/i18n/generated/errors.ru.gen.d.ts +16 -0
- package/dist/i18n/generated/errors.ru.gen.d.ts.map +1 -0
- package/dist/i18n/generated/errors.ru.gen.js +58 -0
- package/dist/i18n/generated/errors.ru.gen.js.map +1 -0
- package/dist/i18n/keys.d.ts +170 -0
- package/dist/i18n/keys.d.ts.map +1 -0
- package/dist/i18n/keys.js +295 -0
- package/dist/i18n/keys.js.map +1 -0
- package/dist/i18n/ru.d.ts +37 -0
- package/dist/i18n/ru.d.ts.map +1 -0
- package/dist/i18n/ru.js +162 -0
- package/dist/i18n/ru.js.map +1 -0
- package/dist/index.d.ts +103 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +98 -0
- package/dist/index.js.map +1 -0
- package/dist/model/context.d.ts +11 -0
- package/dist/model/context.d.ts.map +1 -0
- package/dist/model/context.js +16 -0
- package/dist/model/context.js.map +1 -0
- package/dist/model/draft.d.ts +138 -0
- package/dist/model/draft.d.ts.map +1 -0
- package/dist/model/draft.js +192 -0
- package/dist/model/draft.js.map +1 -0
- package/dist/model/features.d.ts +69 -0
- package/dist/model/features.d.ts.map +1 -0
- package/dist/model/features.js +73 -0
- package/dist/model/features.js.map +1 -0
- package/dist/model/mineSource.d.ts +47 -0
- package/dist/model/mineSource.d.ts.map +1 -0
- package/dist/model/mineSource.js +45 -0
- package/dist/model/mineSource.js.map +1 -0
- package/dist/model/mutations.d.ts +60 -0
- package/dist/model/mutations.d.ts.map +1 -0
- package/dist/model/mutations.js +165 -0
- package/dist/model/mutations.js.map +1 -0
- package/dist/model/queries.d.ts +75 -0
- package/dist/model/queries.d.ts.map +1 -0
- package/dist/model/queries.js +117 -0
- package/dist/model/queries.js.map +1 -0
- package/dist/model/queryKeys.d.ts +50 -0
- package/dist/model/queryKeys.d.ts.map +1 -0
- package/dist/model/queryKeys.js +24 -0
- package/dist/model/queryKeys.js.map +1 -0
- package/dist/model/runtime.d.ts +69 -0
- package/dist/model/runtime.d.ts.map +1 -0
- package/dist/model/runtime.js +14 -0
- package/dist/model/runtime.js.map +1 -0
- package/dist/model/status.d.ts +117 -0
- package/dist/model/status.d.ts.map +1 -0
- package/dist/model/status.js +164 -0
- package/dist/model/status.js.map +1 -0
- package/dist/model/transitions.d.ts +41 -0
- package/dist/model/transitions.d.ts.map +1 -0
- package/dist/model/transitions.js +25 -0
- package/dist/model/transitions.js.map +1 -0
- package/dist/model/validation.d.ts +135 -0
- package/dist/model/validation.d.ts.map +1 -0
- package/dist/model/validation.js +191 -0
- package/dist/model/validation.js.map +1 -0
- package/dist/nav/manifest.d.ts +46 -0
- package/dist/nav/manifest.d.ts.map +1 -0
- package/dist/nav/manifest.js +56 -0
- package/dist/nav/manifest.js.map +1 -0
- package/llms.txt +118 -0
- package/manifest.json +1044 -0
- package/nav-manifest.json +84 -0
- package/package.json +121 -0
- package/src/analytics/generated/events.json +7 -0
- package/src/api/generated/schema.ts +1255 -0
- package/src/api/listingsApi.ts +237 -0
- package/src/api/types.ts +193 -0
- package/src/default/ErrorAlert.tsx +46 -0
- package/src/default/FavoritesPane.tsx +123 -0
- package/src/default/ListingCard.tsx +178 -0
- package/src/default/ListingComposerPage.tsx +466 -0
- package/src/default/ListingDetailPane.tsx +271 -0
- package/src/default/ListingPhoto.tsx +62 -0
- package/src/default/MyListingsPane.tsx +333 -0
- package/src/default/StatusTags.tsx +86 -0
- package/src/default/icons.tsx +31 -0
- package/src/default/index.ts +35 -0
- package/src/default/theme.tsx +67 -0
- package/src/default/types.ts +12 -0
- package/src/flows/registry.ts +45 -0
- package/src/headless/Favorites.tsx +137 -0
- package/src/headless/ListingActions.tsx +101 -0
- package/src/headless/ListingComposer.tsx +476 -0
- package/src/headless/ListingDetail.tsx +231 -0
- package/src/headless/ListingsProvider.tsx +20 -0
- package/src/headless/MyListings.tsx +148 -0
- package/src/headless/useMandateGate.ts +40 -0
- package/src/i18n/errorsMap.ts +62 -0
- package/src/i18n/es.ts +198 -0
- package/src/i18n/generated/errors.es.gen.ts +64 -0
- package/src/i18n/generated/errors.gen.ts +241 -0
- package/src/i18n/generated/errors.json +499 -0
- package/src/i18n/generated/errors.ru.gen.ts +64 -0
- package/src/i18n/keys.ts +356 -0
- package/src/i18n/ru.ts +215 -0
- package/src/index.ts +260 -0
- package/src/model/context.tsx +28 -0
- package/src/model/draft.ts +307 -0
- package/src/model/features.ts +122 -0
- package/src/model/mineSource.ts +55 -0
- package/src/model/mutations.ts +224 -0
- package/src/model/queries.ts +150 -0
- package/src/model/queryKeys.ts +76 -0
- package/src/model/runtime.ts +87 -0
- package/src/model/status.ts +279 -0
- package/src/model/transitions.ts +62 -0
- package/src/model/validation.ts +271 -0
- package/src/nav/manifest.ts +97 -0
- package/tsconfig.json +26 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ListingsErrorCode } from "./errors.gen.js";
|
|
2
|
+
/**
|
|
3
|
+
* `ru` texts for the backend error codes this catalog carries.
|
|
4
|
+
*
|
|
5
|
+
* PARTIAL, and deliberately typed to say so: 21 key(s) owned by
|
|
6
|
+
* stapel_attributes, stapel_listings are absent, because that owner ships no locale catalog
|
|
7
|
+
* (ERRORS_LOCALE_EXEMPT_OWNERS). English for them still comes from the registry
|
|
8
|
+
* artifact via the en bundle; the pair layers its own authored `ru`
|
|
9
|
+
* strings over this one until upstream ships translations. `Partial` is what
|
|
10
|
+
* makes the gap visible to TypeScript instead of a silent English fallback.
|
|
11
|
+
*
|
|
12
|
+
* Import from the pair's `./i18n/ru` subpath, NOT the main entry, so
|
|
13
|
+
* the locale stays out of hosts that don't ship it.
|
|
14
|
+
*/
|
|
15
|
+
export declare const listingsErrorBundleRu: Partial<Record<ListingsErrorCode, string>>;
|
|
16
|
+
//# sourceMappingURL=errors.ru.gen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.ru.gen.d.ts","sourceRoot":"","sources":["../../../src/i18n/generated/errors.ru.gen.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qBAAqB,EAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CA2C5E,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ru` texts for the backend error codes this catalog carries.
|
|
3
|
+
*
|
|
4
|
+
* PARTIAL, and deliberately typed to say so: 21 key(s) owned by
|
|
5
|
+
* stapel_attributes, stapel_listings are absent, because that owner ships no locale catalog
|
|
6
|
+
* (ERRORS_LOCALE_EXEMPT_OWNERS). English for them still comes from the registry
|
|
7
|
+
* artifact via the en bundle; the pair layers its own authored `ru`
|
|
8
|
+
* strings over this one until upstream ships translations. `Partial` is what
|
|
9
|
+
* makes the gap visible to TypeScript instead of a silent English fallback.
|
|
10
|
+
*
|
|
11
|
+
* Import from the pair's `./i18n/ru` subpath, NOT the main entry, so
|
|
12
|
+
* the locale stays out of hosts that don't ship it.
|
|
13
|
+
*/
|
|
14
|
+
export const listingsErrorBundleRu = {
|
|
15
|
+
"error.400.bad_request": "Некорректный запрос",
|
|
16
|
+
"error.400.captcha_invalid": "Проверка капчи не пройдена. Пожалуйста, попробуйте ещё раз.",
|
|
17
|
+
"error.400.captcha_required": "Требуется токен капчи.",
|
|
18
|
+
"error.400.expected_list": "Ожидался список элементов",
|
|
19
|
+
"error.400.field.blank": "Поле «{field}» не может быть пустым",
|
|
20
|
+
"error.400.field.does_not_exist": "«{field}» не существует",
|
|
21
|
+
"error.400.field.invalid": "Поле «{field}» содержит недопустимое значение",
|
|
22
|
+
"error.400.field.invalid_choice": "Недопустимый вариант для поля «{field}»",
|
|
23
|
+
"error.400.field.max_length": "Поле «{field}» должно содержать не более {max_length} символов",
|
|
24
|
+
"error.400.field.max_value": "Значение поля «{field}» должно быть не больше {max_value}",
|
|
25
|
+
"error.400.field.min_length": "Поле «{field}» должно содержать не менее {min_length} символов",
|
|
26
|
+
"error.400.field.min_value": "Значение поля «{field}» должно быть не меньше {min_value}",
|
|
27
|
+
"error.400.field.null": "Поле «{field}» не может быть null",
|
|
28
|
+
"error.400.field.required": "Поле «{field}» обязательно",
|
|
29
|
+
"error.400.field.unique": "Значение поля «{field}» должно быть уникальным",
|
|
30
|
+
"error.400.invalid_ad_id": "Недопустимый идентификатор объявления",
|
|
31
|
+
"error.400.validation_error": "Ошибка валидации",
|
|
32
|
+
"error.400.verification_failed": "Проверка не пройдена",
|
|
33
|
+
"error.400.verification_invalid_factor": "Этот способ подтверждения недоступен",
|
|
34
|
+
"error.401.unauthorized": "Требуется аутентификация",
|
|
35
|
+
"error.402.payment_required": "Требуется оплата",
|
|
36
|
+
"error.403.forbidden": "У вас нет прав для выполнения этого действия",
|
|
37
|
+
"error.403.network_blocked": "Запросы из этой сети не разрешены.",
|
|
38
|
+
"error.403.verification_enrollment_required": "Требуется регистрация фактора подтверждения.",
|
|
39
|
+
"error.403.verification_required": "Требуется дополнительная проверка",
|
|
40
|
+
"error.404.ad_not_found": "Объявление не найдено",
|
|
41
|
+
"error.404.not_found": "Запрошенный ресурс не найден",
|
|
42
|
+
"error.404.verification_challenge_not_found": "Запрос на подтверждение не найден или истёк",
|
|
43
|
+
"error.405.method_not_allowed": "Метод не разрешён",
|
|
44
|
+
"error.406.not_acceptable": "Недопустимый формат ответа",
|
|
45
|
+
"error.408.request_timeout": "Время ожидания запроса истекло",
|
|
46
|
+
"error.409.conflict": "Ресурс уже существует",
|
|
47
|
+
"error.410.gone": "Ресурс был безвозвратно удалён",
|
|
48
|
+
"error.413.payload_too_large": "Тело запроса слишком большое",
|
|
49
|
+
"error.415.unsupported_media_type": "Неподдерживаемый тип данных",
|
|
50
|
+
"error.422.unprocessable_entity": "Невозможно обработать данные запроса",
|
|
51
|
+
"error.423.locked": "Ресурс заблокирован",
|
|
52
|
+
"error.423.verification_locked": "Слишком много неудачных попыток — подтверждение заблокировано",
|
|
53
|
+
"error.429.rate_limit": "Слишком много попыток. Повторите попытку через {retry_after_minutes} мин.",
|
|
54
|
+
"error.429.too_many_requests": "Слишком много запросов. Пожалуйста, повторите попытку позже.",
|
|
55
|
+
"error.500.internal": "Что-то пошло не так",
|
|
56
|
+
"error.503.mandate_unavailable": "Не удалось проверить доступ к рабочему пространству",
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=errors.ru.gen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.ru.gen.js","sourceRoot":"","sources":["../../../src/i18n/generated/errors.ru.gen.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAA+C;IAC/E,uBAAuB,EAAE,qBAAqB;IAC9C,2BAA2B,EAAE,6DAA6D;IAC1F,4BAA4B,EAAE,wBAAwB;IACtD,yBAAyB,EAAE,2BAA2B;IACtD,uBAAuB,EAAE,qCAAqC;IAC9D,gCAAgC,EAAE,yBAAyB;IAC3D,yBAAyB,EAAE,+CAA+C;IAC1E,gCAAgC,EAAE,yCAAyC;IAC3E,4BAA4B,EAAE,gEAAgE;IAC9F,2BAA2B,EAAE,2DAA2D;IACxF,4BAA4B,EAAE,gEAAgE;IAC9F,2BAA2B,EAAE,2DAA2D;IACxF,sBAAsB,EAAE,mCAAmC;IAC3D,0BAA0B,EAAE,4BAA4B;IACxD,wBAAwB,EAAE,gDAAgD;IAC1E,yBAAyB,EAAE,uCAAuC;IAClE,4BAA4B,EAAE,kBAAkB;IAChD,+BAA+B,EAAE,sBAAsB;IACvD,uCAAuC,EAAE,sCAAsC;IAC/E,wBAAwB,EAAE,0BAA0B;IACpD,4BAA4B,EAAE,kBAAkB;IAChD,qBAAqB,EAAE,8CAA8C;IACrE,2BAA2B,EAAE,oCAAoC;IACjE,4CAA4C,EAAE,8CAA8C;IAC5F,iCAAiC,EAAE,mCAAmC;IACtE,wBAAwB,EAAE,uBAAuB;IACjD,qBAAqB,EAAE,8BAA8B;IACrD,4CAA4C,EAAE,6CAA6C;IAC3F,8BAA8B,EAAE,mBAAmB;IACnD,0BAA0B,EAAE,4BAA4B;IACxD,2BAA2B,EAAE,gCAAgC;IAC7D,oBAAoB,EAAE,uBAAuB;IAC7C,gBAAgB,EAAE,gCAAgC;IAClD,6BAA6B,EAAE,8BAA8B;IAC7D,kCAAkC,EAAE,6BAA6B;IACjE,gCAAgC,EAAE,sCAAsC;IACxE,kBAAkB,EAAE,qBAAqB;IACzC,+BAA+B,EAAE,+DAA+D;IAChG,sBAAsB,EAAE,2EAA2E;IACnG,6BAA6B,EAAE,8DAA8D;IAC7F,oBAAoB,EAAE,qBAAqB;IAC3C,+BAA+B,EAAE,qDAAqD;CACvF,CAAC"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import type { I18nEngine } from "@stapel/core";
|
|
2
|
+
/**
|
|
3
|
+
* listings-react's own translation KEYS (frontend-standard §4.2): headless
|
|
4
|
+
* components never render literal strings — hosts resolve these via core's
|
|
5
|
+
* i18n engine (`useT`). Backend error codes flow through the SAME contour: a
|
|
6
|
+
* `StapelApiError.code` is already a key, so the default bundle below ships
|
|
7
|
+
* English fallbacks for the 63 backend error codes (generated) plus the
|
|
8
|
+
* pair's own UI keys. All UI keys live under the `listings.` namespace.
|
|
9
|
+
*
|
|
10
|
+
* ── WHAT IS DELIBERATELY NOT IN THIS FILE ──────────────────────────────────
|
|
11
|
+
*
|
|
12
|
+
* **The twelve `error.400.feature_*` / `description_too_*` keys.** They are
|
|
13
|
+
* owned by `stapel_attributes` and translated by `@stapel/attributes-react`
|
|
14
|
+
* (`/i18n/ru`, `/i18n/es`) — the package that draws and mirrors those values.
|
|
15
|
+
* Restating them here would give one refusal two sentences. A host registers
|
|
16
|
+
* both bundles; `test/i18n.test.ts` proves the union covers the whole
|
|
17
|
+
* registry in all three locales.
|
|
18
|
+
*
|
|
19
|
+
* **A category name, a feature name, an option label.** All three arrive from
|
|
20
|
+
* the wire as translation keys; a deployment's catalogue copy belongs in the
|
|
21
|
+
* HOST's bundle. Same rule `@stapel/categories-react` writes down at length.
|
|
22
|
+
*
|
|
23
|
+
* **`listings.compose.blocked.unsupported_type` is HERE and its twin is
|
|
24
|
+
* not.** `@stapel/attributes-react` owns the FACT (`unsupportedTypes` /
|
|
25
|
+
* `unsupportedTypeGate`) and its own key; this pair raises its own sentence
|
|
26
|
+
* from the same fact rather than re-deriving the fact or borrowing the other
|
|
27
|
+
* package's namespace (spec §13.2, note 3, which called for exactly this
|
|
28
|
+
* split).
|
|
29
|
+
*/
|
|
30
|
+
export declare const LISTINGS_I18N_KEYS: {
|
|
31
|
+
readonly unknownError: "listings.error.unknown";
|
|
32
|
+
readonly statusDraft: "listings.status.draft";
|
|
33
|
+
readonly statusPending: "listings.status.pending";
|
|
34
|
+
readonly statusPublished: "listings.status.published";
|
|
35
|
+
readonly statusPaused: "listings.status.paused";
|
|
36
|
+
readonly statusExpired: "listings.status.expired";
|
|
37
|
+
readonly statusSold: "listings.status.sold";
|
|
38
|
+
readonly statusRejected: "listings.status.rejected";
|
|
39
|
+
readonly statusBlocked: "listings.status.blocked";
|
|
40
|
+
readonly statusArchived: "listings.status.archived";
|
|
41
|
+
/** First submission: nothing is public yet. */
|
|
42
|
+
readonly moderationFirstReview: "listings.moderation.first_review";
|
|
43
|
+
/** THE 0.5.0 sentence: live to everyone, edit under re-screening. */
|
|
44
|
+
readonly moderationLiveEditPending: "listings.moderation.live_edit_pending";
|
|
45
|
+
/** A pending verdict on a listing the lifecycle already took offline. */
|
|
46
|
+
readonly moderationPendingOffline: "listings.moderation.pending_offline";
|
|
47
|
+
readonly moderationNeedsReview: "listings.moderation.needs_review";
|
|
48
|
+
readonly moderationLiveNeedsReview: "listings.moderation.live_needs_review";
|
|
49
|
+
readonly moderationRejected: "listings.moderation.rejected";
|
|
50
|
+
/** Refused by a moderator while the lifecycle has not moved yet. */
|
|
51
|
+
readonly moderationRejectedStillLive: "listings.moderation.rejected_still_live";
|
|
52
|
+
readonly cardNoPhoto: "listings.card.no_photo";
|
|
53
|
+
readonly cardPhotoUnavailable: "listings.card.photo_unavailable";
|
|
54
|
+
readonly cardPriceAbsent: "listings.card.price_absent";
|
|
55
|
+
readonly cardFavoriteAdd: "listings.card.favorite_add";
|
|
56
|
+
readonly cardFavoriteRemove: "listings.card.favorite_remove";
|
|
57
|
+
readonly cardOpen: "listings.card.open";
|
|
58
|
+
readonly detailLoading: "listings.detail.loading";
|
|
59
|
+
readonly detailLoadFailed: "listings.detail.load_failed";
|
|
60
|
+
readonly detailRetry: "listings.detail.retry";
|
|
61
|
+
readonly detailNotFound: "listings.detail.not_found";
|
|
62
|
+
/** Soft-deleted: the status probe answers where the detail 404s. */
|
|
63
|
+
readonly detailRemoved: "listings.detail.removed";
|
|
64
|
+
/** Readable by id, but not on the shelf — and the reader is not the owner. */
|
|
65
|
+
readonly detailNotPublished: "listings.detail.not_published";
|
|
66
|
+
readonly detailOwnerOnlyView: "listings.detail.owner_only_view";
|
|
67
|
+
readonly detailDescription: "listings.detail.description";
|
|
68
|
+
readonly detailSpecs: "listings.detail.specs";
|
|
69
|
+
readonly detailNoSpecs: "listings.detail.no_specs";
|
|
70
|
+
readonly detailUnreadableFeatures: "listings.detail.unreadable_features";
|
|
71
|
+
readonly detailPhotosUnavailable: "listings.detail.photos_unavailable";
|
|
72
|
+
readonly detailPhotoAlt: "listings.detail.photo_alt";
|
|
73
|
+
readonly detailPublishedAt: "listings.detail.published_at";
|
|
74
|
+
readonly detailExpiresAt: "listings.detail.expires_at";
|
|
75
|
+
readonly detailStock: "listings.detail.stock";
|
|
76
|
+
readonly composeNewTitle: "listings.compose.new_title";
|
|
77
|
+
readonly composeEditTitle: "listings.compose.edit_title";
|
|
78
|
+
readonly composeCategory: "listings.compose.category";
|
|
79
|
+
readonly composeCategoryHelp: "listings.compose.category_help";
|
|
80
|
+
readonly composeCategoryRequired: "listings.compose.category_required";
|
|
81
|
+
readonly composeCategoryChangedDropped: "listings.compose.category_changed_dropped";
|
|
82
|
+
readonly composeTitleLabel: "listings.compose.title_label";
|
|
83
|
+
readonly composeTitleTooLong: "listings.compose.title_too_long";
|
|
84
|
+
readonly composeDescriptionLabel: "listings.compose.description_label";
|
|
85
|
+
readonly composePriceLabel: "listings.compose.price_label";
|
|
86
|
+
readonly composePriceInvalid: "listings.compose.price_invalid";
|
|
87
|
+
readonly composeCurrencyLabel: "listings.compose.currency_label";
|
|
88
|
+
readonly composeLocationLabel: "listings.compose.location_label";
|
|
89
|
+
readonly composeLatLabel: "listings.compose.lat_label";
|
|
90
|
+
readonly composeLonLabel: "listings.compose.lon_label";
|
|
91
|
+
readonly composeGeoIncomplete: "listings.compose.geo_incomplete";
|
|
92
|
+
readonly composePhotos: "listings.compose.photos";
|
|
93
|
+
readonly composeTooManyImages: "listings.compose.too_many_images";
|
|
94
|
+
readonly composeDetails: "listings.compose.details";
|
|
95
|
+
readonly composeDetailsLoading: "listings.compose.details_loading";
|
|
96
|
+
readonly composeDetailsFailed: "listings.compose.details_failed";
|
|
97
|
+
readonly composeDetailsEmpty: "listings.compose.details_empty";
|
|
98
|
+
readonly composeCountable: "listings.compose.countable";
|
|
99
|
+
readonly composeStock: "listings.compose.stock";
|
|
100
|
+
readonly composeAutoRepublish: "listings.compose.auto_republish";
|
|
101
|
+
readonly composeSave: "listings.compose.save";
|
|
102
|
+
readonly composeSaving: "listings.compose.saving";
|
|
103
|
+
readonly composeSaved: "listings.compose.saved";
|
|
104
|
+
readonly composePublish: "listings.compose.publish";
|
|
105
|
+
readonly composeRepublish: "listings.compose.republish";
|
|
106
|
+
readonly composePublishing: "listings.compose.publishing";
|
|
107
|
+
readonly composePublishedFirst: "listings.compose.published_first";
|
|
108
|
+
readonly composePublishedLive: "listings.compose.published_live";
|
|
109
|
+
readonly composeInvalidSummary: "listings.compose.invalid_summary";
|
|
110
|
+
readonly composeBlockedNoCategory: "listings.compose.blocked.no_category";
|
|
111
|
+
readonly composeBlockedUnsupportedType: "listings.compose.blocked.unsupported_type";
|
|
112
|
+
readonly composeBlockedPhotosPending: "listings.compose.blocked.photos_pending";
|
|
113
|
+
readonly composeBlockedNoDraft: "listings.compose.blocked.no_draft";
|
|
114
|
+
readonly composeBlockedBusy: "listings.compose.blocked.busy";
|
|
115
|
+
readonly composeBlockedMirror: "listings.compose.blocked.mirror";
|
|
116
|
+
readonly composeBlockedDetailsUnavailable: "listings.compose.blocked.details_unavailable";
|
|
117
|
+
readonly mineTitle: "listings.mine.title";
|
|
118
|
+
readonly mineTabActive: "listings.mine.tab.active";
|
|
119
|
+
readonly mineTabDrafts: "listings.mine.tab.drafts";
|
|
120
|
+
readonly mineTabArchived: "listings.mine.tab.archived";
|
|
121
|
+
readonly mineLoading: "listings.mine.loading";
|
|
122
|
+
readonly mineLoadFailed: "listings.mine.load_failed";
|
|
123
|
+
readonly mineEmpty: "listings.mine.empty";
|
|
124
|
+
readonly mineRetry: "listings.mine.retry";
|
|
125
|
+
readonly mineCountersFailed: "listings.mine.counters_failed";
|
|
126
|
+
/** The upstream gap, named on screen — see `headless/MyListings.tsx`. */
|
|
127
|
+
readonly mineSourceMissing: "listings.mine.source_missing";
|
|
128
|
+
readonly mineLiveUnderReview: "listings.mine.live_under_review";
|
|
129
|
+
readonly mineEdit: "listings.mine.edit";
|
|
130
|
+
readonly mineArchive: "listings.mine.archive";
|
|
131
|
+
readonly mineComplete: "listings.mine.complete";
|
|
132
|
+
readonly mineDelete: "listings.mine.delete";
|
|
133
|
+
readonly favoritesTitle: "listings.favorites.title";
|
|
134
|
+
readonly favoritesLoading: "listings.favorites.loading";
|
|
135
|
+
readonly favoritesLoadFailed: "listings.favorites.load_failed";
|
|
136
|
+
readonly favoritesEmpty: "listings.favorites.empty";
|
|
137
|
+
readonly blockedSignIn: "listings.blocked.sign_in";
|
|
138
|
+
readonly blockedGuest: "listings.blocked.guest";
|
|
139
|
+
readonly blockedMandateUnknown: "listings.blocked.mandate_unknown";
|
|
140
|
+
/** A lifecycle move the server's whitelist does not allow, named with the
|
|
141
|
+
* status it would be moving FROM. */
|
|
142
|
+
readonly blockedTransition: "listings.blocked.transition";
|
|
143
|
+
readonly blockedDeleteActive: "listings.blocked.delete_active";
|
|
144
|
+
readonly blockedInFlight: "listings.blocked.in_flight";
|
|
145
|
+
readonly pagePrev: "listings.page.prev";
|
|
146
|
+
readonly pageNext: "listings.page.next";
|
|
147
|
+
readonly navDetail: "listings.nav.detail";
|
|
148
|
+
readonly navCompose: "listings.nav.compose";
|
|
149
|
+
readonly navMine: "listings.nav.mine";
|
|
150
|
+
readonly navFavorites: "listings.nav.favorites";
|
|
151
|
+
};
|
|
152
|
+
export type ListingsI18nKey = (typeof LISTINGS_I18N_KEYS)[keyof typeof LISTINGS_I18N_KEYS];
|
|
153
|
+
/**
|
|
154
|
+
* English fallback bundle for listings-react UI keys + backend error codes.
|
|
155
|
+
* The generated backend texts are spread FIRST so coverage of the error
|
|
156
|
+
* registry is by construction; the pair's own copy follows.
|
|
157
|
+
*/
|
|
158
|
+
export declare const listingsI18nBundleEn: Record<string, string>;
|
|
159
|
+
/**
|
|
160
|
+
* Register the English bundle into a core i18n engine. Locale bundles ship as
|
|
161
|
+
* opt-in subpaths (`@stapel/listings-react/i18n/ru`, `…/es`) so a host that
|
|
162
|
+
* needs only English never carries them.
|
|
163
|
+
*
|
|
164
|
+
* A host that renders a listing's details also registers
|
|
165
|
+
* `@stapel/attributes-react`'s bundles — that package owns the twelve
|
|
166
|
+
* `stapel_attributes` error keys in every locale, and the value editors that
|
|
167
|
+
* raise them.
|
|
168
|
+
*/
|
|
169
|
+
export declare function registerListingsI18n(i18n: I18nEngine): void;
|
|
170
|
+
//# sourceMappingURL=keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/i18n/keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/D;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;IAe7B,+CAA+C;;IAE/C,qEAAqE;;IAErE,yEAAyE;;;;;IAKzE,oEAAoE;;;;;;;;;;;;IAgBpE,oEAAoE;;IAEpE,8EAA8E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAoE9E,yEAAyE;;;;;;;;;;;;;;IAkBzE;yCACqC;;;;;;;;;;CAc7B,CAAC;AAEX,MAAM,MAAM,eAAe,GACzB,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC,CAAC;AAE/D;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA6JvD,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAE3D"}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { listingsErrorBundleEn } from "./generated/errors.gen.js";
|
|
2
|
+
/**
|
|
3
|
+
* listings-react's own translation KEYS (frontend-standard §4.2): headless
|
|
4
|
+
* components never render literal strings — hosts resolve these via core's
|
|
5
|
+
* i18n engine (`useT`). Backend error codes flow through the SAME contour: a
|
|
6
|
+
* `StapelApiError.code` is already a key, so the default bundle below ships
|
|
7
|
+
* English fallbacks for the 63 backend error codes (generated) plus the
|
|
8
|
+
* pair's own UI keys. All UI keys live under the `listings.` namespace.
|
|
9
|
+
*
|
|
10
|
+
* ── WHAT IS DELIBERATELY NOT IN THIS FILE ──────────────────────────────────
|
|
11
|
+
*
|
|
12
|
+
* **The twelve `error.400.feature_*` / `description_too_*` keys.** They are
|
|
13
|
+
* owned by `stapel_attributes` and translated by `@stapel/attributes-react`
|
|
14
|
+
* (`/i18n/ru`, `/i18n/es`) — the package that draws and mirrors those values.
|
|
15
|
+
* Restating them here would give one refusal two sentences. A host registers
|
|
16
|
+
* both bundles; `test/i18n.test.ts` proves the union covers the whole
|
|
17
|
+
* registry in all three locales.
|
|
18
|
+
*
|
|
19
|
+
* **A category name, a feature name, an option label.** All three arrive from
|
|
20
|
+
* the wire as translation keys; a deployment's catalogue copy belongs in the
|
|
21
|
+
* HOST's bundle. Same rule `@stapel/categories-react` writes down at length.
|
|
22
|
+
*
|
|
23
|
+
* **`listings.compose.blocked.unsupported_type` is HERE and its twin is
|
|
24
|
+
* not.** `@stapel/attributes-react` owns the FACT (`unsupportedTypes` /
|
|
25
|
+
* `unsupportedTypeGate`) and its own key; this pair raises its own sentence
|
|
26
|
+
* from the same fact rather than re-deriving the fact or borrowing the other
|
|
27
|
+
* package's namespace (spec §13.2, note 3, which called for exactly this
|
|
28
|
+
* split).
|
|
29
|
+
*/
|
|
30
|
+
export const LISTINGS_I18N_KEYS = {
|
|
31
|
+
unknownError: "listings.error.unknown",
|
|
32
|
+
// ── the lifecycle axis (nine states) ─────────────────────────────────────
|
|
33
|
+
statusDraft: "listings.status.draft",
|
|
34
|
+
statusPending: "listings.status.pending",
|
|
35
|
+
statusPublished: "listings.status.published",
|
|
36
|
+
statusPaused: "listings.status.paused",
|
|
37
|
+
statusExpired: "listings.status.expired",
|
|
38
|
+
statusSold: "listings.status.sold",
|
|
39
|
+
statusRejected: "listings.status.rejected",
|
|
40
|
+
statusBlocked: "listings.status.blocked",
|
|
41
|
+
statusArchived: "listings.status.archived",
|
|
42
|
+
// ── the moderation axis (what the owner is told, given BOTH fields) ──────
|
|
43
|
+
/** First submission: nothing is public yet. */
|
|
44
|
+
moderationFirstReview: "listings.moderation.first_review",
|
|
45
|
+
/** THE 0.5.0 sentence: live to everyone, edit under re-screening. */
|
|
46
|
+
moderationLiveEditPending: "listings.moderation.live_edit_pending",
|
|
47
|
+
/** A pending verdict on a listing the lifecycle already took offline. */
|
|
48
|
+
moderationPendingOffline: "listings.moderation.pending_offline",
|
|
49
|
+
moderationNeedsReview: "listings.moderation.needs_review",
|
|
50
|
+
moderationLiveNeedsReview: "listings.moderation.live_needs_review",
|
|
51
|
+
moderationRejected: "listings.moderation.rejected",
|
|
52
|
+
/** Refused by a moderator while the lifecycle has not moved yet. */
|
|
53
|
+
moderationRejectedStillLive: "listings.moderation.rejected_still_live",
|
|
54
|
+
// ── card ─────────────────────────────────────────────────────────────────
|
|
55
|
+
cardNoPhoto: "listings.card.no_photo",
|
|
56
|
+
cardPhotoUnavailable: "listings.card.photo_unavailable",
|
|
57
|
+
cardPriceAbsent: "listings.card.price_absent",
|
|
58
|
+
cardFavoriteAdd: "listings.card.favorite_add",
|
|
59
|
+
cardFavoriteRemove: "listings.card.favorite_remove",
|
|
60
|
+
cardOpen: "listings.card.open",
|
|
61
|
+
// ── detail ───────────────────────────────────────────────────────────────
|
|
62
|
+
detailLoading: "listings.detail.loading",
|
|
63
|
+
detailLoadFailed: "listings.detail.load_failed",
|
|
64
|
+
detailRetry: "listings.detail.retry",
|
|
65
|
+
detailNotFound: "listings.detail.not_found",
|
|
66
|
+
/** Soft-deleted: the status probe answers where the detail 404s. */
|
|
67
|
+
detailRemoved: "listings.detail.removed",
|
|
68
|
+
/** Readable by id, but not on the shelf — and the reader is not the owner. */
|
|
69
|
+
detailNotPublished: "listings.detail.not_published",
|
|
70
|
+
detailOwnerOnlyView: "listings.detail.owner_only_view",
|
|
71
|
+
detailDescription: "listings.detail.description",
|
|
72
|
+
detailSpecs: "listings.detail.specs",
|
|
73
|
+
detailNoSpecs: "listings.detail.no_specs",
|
|
74
|
+
detailUnreadableFeatures: "listings.detail.unreadable_features",
|
|
75
|
+
detailPhotosUnavailable: "listings.detail.photos_unavailable",
|
|
76
|
+
detailPhotoAlt: "listings.detail.photo_alt",
|
|
77
|
+
detailPublishedAt: "listings.detail.published_at",
|
|
78
|
+
detailExpiresAt: "listings.detail.expires_at",
|
|
79
|
+
detailStock: "listings.detail.stock",
|
|
80
|
+
// ── composer ─────────────────────────────────────────────────────────────
|
|
81
|
+
composeNewTitle: "listings.compose.new_title",
|
|
82
|
+
composeEditTitle: "listings.compose.edit_title",
|
|
83
|
+
composeCategory: "listings.compose.category",
|
|
84
|
+
composeCategoryHelp: "listings.compose.category_help",
|
|
85
|
+
composeCategoryRequired: "listings.compose.category_required",
|
|
86
|
+
composeCategoryChangedDropped: "listings.compose.category_changed_dropped",
|
|
87
|
+
composeTitleLabel: "listings.compose.title_label",
|
|
88
|
+
composeTitleTooLong: "listings.compose.title_too_long",
|
|
89
|
+
composeDescriptionLabel: "listings.compose.description_label",
|
|
90
|
+
composePriceLabel: "listings.compose.price_label",
|
|
91
|
+
composePriceInvalid: "listings.compose.price_invalid",
|
|
92
|
+
composeCurrencyLabel: "listings.compose.currency_label",
|
|
93
|
+
composeLocationLabel: "listings.compose.location_label",
|
|
94
|
+
composeLatLabel: "listings.compose.lat_label",
|
|
95
|
+
composeLonLabel: "listings.compose.lon_label",
|
|
96
|
+
composeGeoIncomplete: "listings.compose.geo_incomplete",
|
|
97
|
+
composePhotos: "listings.compose.photos",
|
|
98
|
+
composeTooManyImages: "listings.compose.too_many_images",
|
|
99
|
+
composeDetails: "listings.compose.details",
|
|
100
|
+
composeDetailsLoading: "listings.compose.details_loading",
|
|
101
|
+
composeDetailsFailed: "listings.compose.details_failed",
|
|
102
|
+
composeDetailsEmpty: "listings.compose.details_empty",
|
|
103
|
+
composeCountable: "listings.compose.countable",
|
|
104
|
+
composeStock: "listings.compose.stock",
|
|
105
|
+
composeAutoRepublish: "listings.compose.auto_republish",
|
|
106
|
+
composeSave: "listings.compose.save",
|
|
107
|
+
composeSaving: "listings.compose.saving",
|
|
108
|
+
composeSaved: "listings.compose.saved",
|
|
109
|
+
composePublish: "listings.compose.publish",
|
|
110
|
+
composeRepublish: "listings.compose.republish",
|
|
111
|
+
composePublishing: "listings.compose.publishing",
|
|
112
|
+
composePublishedFirst: "listings.compose.published_first",
|
|
113
|
+
composePublishedLive: "listings.compose.published_live",
|
|
114
|
+
composeInvalidSummary: "listings.compose.invalid_summary",
|
|
115
|
+
// ── composer: every switched-off control states its reason ───────────────
|
|
116
|
+
composeBlockedNoCategory: "listings.compose.blocked.no_category",
|
|
117
|
+
composeBlockedUnsupportedType: "listings.compose.blocked.unsupported_type",
|
|
118
|
+
composeBlockedPhotosPending: "listings.compose.blocked.photos_pending",
|
|
119
|
+
composeBlockedNoDraft: "listings.compose.blocked.no_draft",
|
|
120
|
+
composeBlockedBusy: "listings.compose.blocked.busy",
|
|
121
|
+
composeBlockedMirror: "listings.compose.blocked.mirror",
|
|
122
|
+
composeBlockedDetailsUnavailable: "listings.compose.blocked.details_unavailable",
|
|
123
|
+
// ── the owner's dashboard ────────────────────────────────────────────────
|
|
124
|
+
mineTitle: "listings.mine.title",
|
|
125
|
+
mineTabActive: "listings.mine.tab.active",
|
|
126
|
+
mineTabDrafts: "listings.mine.tab.drafts",
|
|
127
|
+
mineTabArchived: "listings.mine.tab.archived",
|
|
128
|
+
mineLoading: "listings.mine.loading",
|
|
129
|
+
mineLoadFailed: "listings.mine.load_failed",
|
|
130
|
+
mineEmpty: "listings.mine.empty",
|
|
131
|
+
mineRetry: "listings.mine.retry",
|
|
132
|
+
mineCountersFailed: "listings.mine.counters_failed",
|
|
133
|
+
/** The upstream gap, named on screen — see `headless/MyListings.tsx`. */
|
|
134
|
+
mineSourceMissing: "listings.mine.source_missing",
|
|
135
|
+
mineLiveUnderReview: "listings.mine.live_under_review",
|
|
136
|
+
mineEdit: "listings.mine.edit",
|
|
137
|
+
mineArchive: "listings.mine.archive",
|
|
138
|
+
mineComplete: "listings.mine.complete",
|
|
139
|
+
mineDelete: "listings.mine.delete",
|
|
140
|
+
// ── favourites ───────────────────────────────────────────────────────────
|
|
141
|
+
favoritesTitle: "listings.favorites.title",
|
|
142
|
+
favoritesLoading: "listings.favorites.loading",
|
|
143
|
+
favoritesLoadFailed: "listings.favorites.load_failed",
|
|
144
|
+
favoritesEmpty: "listings.favorites.empty",
|
|
145
|
+
// ── gates shared by every action a visitor cannot take ───────────────────
|
|
146
|
+
blockedSignIn: "listings.blocked.sign_in",
|
|
147
|
+
blockedGuest: "listings.blocked.guest",
|
|
148
|
+
blockedMandateUnknown: "listings.blocked.mandate_unknown",
|
|
149
|
+
/** A lifecycle move the server's whitelist does not allow, named with the
|
|
150
|
+
* status it would be moving FROM. */
|
|
151
|
+
blockedTransition: "listings.blocked.transition",
|
|
152
|
+
blockedDeleteActive: "listings.blocked.delete_active",
|
|
153
|
+
blockedInFlight: "listings.blocked.in_flight",
|
|
154
|
+
// ── keyset pagination ────────────────────────────────────────────────────
|
|
155
|
+
pagePrev: "listings.page.prev",
|
|
156
|
+
pageNext: "listings.page.next",
|
|
157
|
+
// ── nav labels ───────────────────────────────────────────────────────────
|
|
158
|
+
navDetail: "listings.nav.detail",
|
|
159
|
+
navCompose: "listings.nav.compose",
|
|
160
|
+
navMine: "listings.nav.mine",
|
|
161
|
+
navFavorites: "listings.nav.favorites",
|
|
162
|
+
};
|
|
163
|
+
/**
|
|
164
|
+
* English fallback bundle for listings-react UI keys + backend error codes.
|
|
165
|
+
* The generated backend texts are spread FIRST so coverage of the error
|
|
166
|
+
* registry is by construction; the pair's own copy follows.
|
|
167
|
+
*/
|
|
168
|
+
export const listingsI18nBundleEn = {
|
|
169
|
+
...listingsErrorBundleEn,
|
|
170
|
+
"listings.error.unknown": "Something went wrong with this listing",
|
|
171
|
+
"listings.status.draft": "Draft",
|
|
172
|
+
"listings.status.pending": "Awaiting review",
|
|
173
|
+
"listings.status.published": "Published",
|
|
174
|
+
"listings.status.paused": "Paused",
|
|
175
|
+
"listings.status.expired": "Expired",
|
|
176
|
+
"listings.status.sold": "Sold",
|
|
177
|
+
"listings.status.rejected": "Rejected",
|
|
178
|
+
"listings.status.blocked": "Taken down",
|
|
179
|
+
"listings.status.archived": "Archived",
|
|
180
|
+
"listings.moderation.first_review": "Sent for review. It goes on sale once a moderator approves it.",
|
|
181
|
+
"listings.moderation.live_edit_pending": "Your listing stays published while we review the changes — buyers can see it right now.",
|
|
182
|
+
"listings.moderation.pending_offline": "A review was requested, but this listing is no longer on sale.",
|
|
183
|
+
"listings.moderation.needs_review": "A moderator is looking at this one by hand.",
|
|
184
|
+
"listings.moderation.live_needs_review": "Published, and a moderator is looking at the changes by hand.",
|
|
185
|
+
"listings.moderation.rejected": "A moderator refused this listing. Edit it and send it again.",
|
|
186
|
+
"listings.moderation.rejected_still_live": "A moderator refused this listing; it is still visible while that is applied.",
|
|
187
|
+
"listings.card.no_photo": "No photo",
|
|
188
|
+
"listings.card.photo_unavailable": "Photo unavailable",
|
|
189
|
+
"listings.card.price_absent": "Price on request",
|
|
190
|
+
"listings.card.favorite_add": "Save to favourites",
|
|
191
|
+
"listings.card.favorite_remove": "Remove from favourites",
|
|
192
|
+
"listings.card.open": "Open",
|
|
193
|
+
"listings.detail.loading": "Loading the listing…",
|
|
194
|
+
"listings.detail.load_failed": "We could not load this listing",
|
|
195
|
+
"listings.detail.retry": "Try again",
|
|
196
|
+
"listings.detail.not_found": "There is no listing at this address",
|
|
197
|
+
"listings.detail.removed": "This listing was removed",
|
|
198
|
+
"listings.detail.not_published": "This listing is not on sale right now, so what you see may be out of date",
|
|
199
|
+
"listings.detail.owner_only_view": "Only you can see this — it is not published yet",
|
|
200
|
+
"listings.detail.description": "Description",
|
|
201
|
+
"listings.detail.specs": "Details",
|
|
202
|
+
"listings.detail.no_specs": "The seller listed no extra details",
|
|
203
|
+
"listings.detail.unreadable_features": "{count} details of this listing could not be read by this version",
|
|
204
|
+
"listings.detail.photos_unavailable": "Photos cannot be shown here — this app has no way to resolve them",
|
|
205
|
+
"listings.detail.photo_alt": "Photo {index} of {total}",
|
|
206
|
+
"listings.detail.published_at": "Published {date}",
|
|
207
|
+
"listings.detail.expires_at": "Listed until {date}",
|
|
208
|
+
"listings.detail.stock": "{count} available",
|
|
209
|
+
"listings.compose.new_title": "New listing",
|
|
210
|
+
"listings.compose.edit_title": "Edit listing",
|
|
211
|
+
"listings.compose.category": "Category",
|
|
212
|
+
"listings.compose.category_help": "The category decides which details buyers are asked for",
|
|
213
|
+
"listings.compose.category_required": "Choose a category first",
|
|
214
|
+
"listings.compose.category_changed_dropped": "{count} answers do not apply to this category and were cleared",
|
|
215
|
+
"listings.compose.title_label": "Title",
|
|
216
|
+
"listings.compose.title_too_long": "The title must be at most {max_length} characters",
|
|
217
|
+
"listings.compose.description_label": "Description",
|
|
218
|
+
"listings.compose.price_label": "Price",
|
|
219
|
+
"listings.compose.price_invalid": "Enter a price as a number, with at most two decimals",
|
|
220
|
+
"listings.compose.currency_label": "Currency",
|
|
221
|
+
"listings.compose.location_label": "Where it is",
|
|
222
|
+
"listings.compose.lat_label": "Latitude",
|
|
223
|
+
"listings.compose.lon_label": "Longitude",
|
|
224
|
+
"listings.compose.geo_incomplete": "A latitude needs a longitude beside it — half a coordinate points nowhere",
|
|
225
|
+
"listings.compose.photos": "Photos",
|
|
226
|
+
"listings.compose.too_many_images": "A listing can carry at most {max} photos",
|
|
227
|
+
"listings.compose.details": "Details",
|
|
228
|
+
"listings.compose.details_loading": "Loading what this category asks for…",
|
|
229
|
+
"listings.compose.details_failed": "We could not load what this category asks for",
|
|
230
|
+
"listings.compose.details_empty": "This category asks for no extra details",
|
|
231
|
+
"listings.compose.countable": "I am selling a countable item",
|
|
232
|
+
"listings.compose.stock": "How many",
|
|
233
|
+
"listings.compose.auto_republish": "Re-publish automatically when it expires",
|
|
234
|
+
"listings.compose.save": "Save draft",
|
|
235
|
+
"listings.compose.saving": "Saving…",
|
|
236
|
+
"listings.compose.saved": "Draft saved",
|
|
237
|
+
"listings.compose.publish": "Publish",
|
|
238
|
+
"listings.compose.republish": "Send changes",
|
|
239
|
+
"listings.compose.publishing": "Sending…",
|
|
240
|
+
"listings.compose.published_first": "Sent for review. It goes on sale once a moderator approves it.",
|
|
241
|
+
"listings.compose.published_live": "Changes sent. Your listing stays published while we review them.",
|
|
242
|
+
"listings.compose.invalid_summary": "{count} details need your attention before this can go out",
|
|
243
|
+
"listings.compose.blocked.no_category": "Choose a category — the rest of the form depends on it",
|
|
244
|
+
"listings.compose.blocked.unsupported_type": "This category asks for a kind of detail this app cannot show yet ({types}), so it cannot fill it in for you",
|
|
245
|
+
"listings.compose.blocked.photos_pending": "Wait for the photos to finish uploading",
|
|
246
|
+
"listings.compose.blocked.no_draft": "The draft has not been created yet",
|
|
247
|
+
"listings.compose.blocked.busy": "One moment — the last change is still saving",
|
|
248
|
+
"listings.compose.blocked.mirror": "Fix the highlighted fields first",
|
|
249
|
+
"listings.compose.blocked.details_unavailable": "We could not load what this category asks for, so we cannot check the form",
|
|
250
|
+
"listings.mine.title": "My listings",
|
|
251
|
+
"listings.mine.tab.active": "Active",
|
|
252
|
+
"listings.mine.tab.drafts": "Drafts",
|
|
253
|
+
"listings.mine.tab.archived": "Archived",
|
|
254
|
+
"listings.mine.loading": "Loading your listings…",
|
|
255
|
+
"listings.mine.load_failed": "We could not load your listings",
|
|
256
|
+
"listings.mine.empty": "Nothing here yet",
|
|
257
|
+
"listings.mine.retry": "Try again",
|
|
258
|
+
"listings.mine.counters_failed": "We could not count your listings",
|
|
259
|
+
"listings.mine.source_missing": "This app cannot list your own listings yet: the listings service has no owner-scoped list endpoint. Your counts below are real.",
|
|
260
|
+
"listings.mine.live_under_review": "Published, changes under review",
|
|
261
|
+
"listings.mine.edit": "Edit",
|
|
262
|
+
"listings.mine.archive": "Archive",
|
|
263
|
+
"listings.mine.complete": "Mark sold",
|
|
264
|
+
"listings.mine.delete": "Delete",
|
|
265
|
+
"listings.favorites.title": "Favourites",
|
|
266
|
+
"listings.favorites.loading": "Loading your favourites…",
|
|
267
|
+
"listings.favorites.load_failed": "We could not load your favourites",
|
|
268
|
+
"listings.favorites.empty": "You have not saved anything yet",
|
|
269
|
+
"listings.blocked.sign_in": "Sign in to do this",
|
|
270
|
+
"listings.blocked.guest": "Your account cannot do this yet — finish setting it up first",
|
|
271
|
+
"listings.blocked.mandate_unknown": "We could not check your account, so we are not guessing whether you may do this",
|
|
272
|
+
"listings.blocked.transition": "A listing that is {from_status} cannot be moved that way",
|
|
273
|
+
"listings.blocked.delete_active": "Archive it first — a listing that is on sale cannot be deleted",
|
|
274
|
+
"listings.blocked.in_flight": "One moment — that is already under way",
|
|
275
|
+
"listings.page.prev": "Previous",
|
|
276
|
+
"listings.page.next": "Next",
|
|
277
|
+
"listings.nav.detail": "Listing",
|
|
278
|
+
"listings.nav.compose": "Post a listing",
|
|
279
|
+
"listings.nav.mine": "My listings",
|
|
280
|
+
"listings.nav.favorites": "Favourites",
|
|
281
|
+
};
|
|
282
|
+
/**
|
|
283
|
+
* Register the English bundle into a core i18n engine. Locale bundles ship as
|
|
284
|
+
* opt-in subpaths (`@stapel/listings-react/i18n/ru`, `…/es`) so a host that
|
|
285
|
+
* needs only English never carries them.
|
|
286
|
+
*
|
|
287
|
+
* A host that renders a listing's details also registers
|
|
288
|
+
* `@stapel/attributes-react`'s bundles — that package owns the twelve
|
|
289
|
+
* `stapel_attributes` error keys in every locale, and the value editors that
|
|
290
|
+
* raise them.
|
|
291
|
+
*/
|
|
292
|
+
export function registerListingsI18n(i18n) {
|
|
293
|
+
i18n.registerBundle("en", listingsI18nBundleEn);
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/i18n/keys.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { I18nDictionary, I18nEngine } from "@stapel/core";
|
|
2
|
+
export { listingsErrorBundleRu } from "./generated/errors.ru.gen.js";
|
|
3
|
+
/**
|
|
4
|
+
* Russian bundle for listings-react — the `@stapel/listings-react/i18n/ru`
|
|
5
|
+
* subpath (i18n-shipping.md §2) so the locale is opt-in: hosts that do not
|
|
6
|
+
* register it never carry these strings (the main entry does not import this
|
|
7
|
+
* module — gated by size-limit + the bundle-purity test).
|
|
8
|
+
*
|
|
9
|
+
* This is the storefront's DEFAULT language (darom-storefront verdict F1:
|
|
10
|
+
* ru-first), which is why the UI copy is here in full and not only the error
|
|
11
|
+
* keys: a seller filling in a listing is the surface where a half-translated
|
|
12
|
+
* form is most obvious.
|
|
13
|
+
*
|
|
14
|
+
* ── What comes from where ──────────────────────────────────────────────────
|
|
15
|
+
*
|
|
16
|
+
* `stapel-listings` ships **no `translations/` directory at all**, so 21 of
|
|
17
|
+
* the 63 registry codes can never come from an upstream catalogue. They split
|
|
18
|
+
* by owner:
|
|
19
|
+
*
|
|
20
|
+
* - the 42 cross-cutting `stapel_core` codes are GENERATED, merged in from
|
|
21
|
+
* stapel-core's own catalogue by `pnpm gen:errors` (spread first below);
|
|
22
|
+
* - the **9 `stapel_listings` codes** are authored here — and when upstream
|
|
23
|
+
* ships a catalogue, nine lines are deleted and no key or text moves;
|
|
24
|
+
* - the **12 `stapel_attributes` codes** are NOT here. They belong to
|
|
25
|
+
* `@stapel/attributes-react`, which already translates them and which is a
|
|
26
|
+
* peer of this pair anyway. Two packages must not give one refusal two
|
|
27
|
+
* sentences (spec §13.2, note 3). A host registers both bundles;
|
|
28
|
+
* `test/i18n.test.ts` proves the union covers the registry.
|
|
29
|
+
*
|
|
30
|
+
* PROVENANCE, stated rather than implied: the core catalogue ships
|
|
31
|
+
* `origin=seed:authored` and is UNREVIEWED; the pair-authored strings below
|
|
32
|
+
* are the same grade. Neither is a claim of review.
|
|
33
|
+
*/
|
|
34
|
+
export declare const listingsI18nBundleRu: I18nDictionary;
|
|
35
|
+
/** Register the Russian bundle into a core i18n engine. */
|
|
36
|
+
export declare function registerListingsI18nRu(i18n: I18nEngine): void;
|
|
37
|
+
//# sourceMappingURL=ru.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ru.d.ts","sourceRoot":"","sources":["../../src/i18n/ru.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,oBAAoB,EAAE,cA6KlC,CAAC;AAEF,2DAA2D;AAC3D,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAE7D"}
|