@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
package/src/i18n/keys.ts
ADDED
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import type { I18nDictionary, I18nEngine } from "@stapel/core";
|
|
2
|
+
import { listingsErrorBundleEn } from "./generated/errors.gen.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* listings-react's own translation KEYS (frontend-standard §4.2): headless
|
|
6
|
+
* components never render literal strings — hosts resolve these via core's
|
|
7
|
+
* i18n engine (`useT`). Backend error codes flow through the SAME contour: a
|
|
8
|
+
* `StapelApiError.code` is already a key, so the default bundle below ships
|
|
9
|
+
* English fallbacks for the 63 backend error codes (generated) plus the
|
|
10
|
+
* pair's own UI keys. All UI keys live under the `listings.` namespace.
|
|
11
|
+
*
|
|
12
|
+
* ── WHAT IS DELIBERATELY NOT IN THIS FILE ──────────────────────────────────
|
|
13
|
+
*
|
|
14
|
+
* **The twelve `error.400.feature_*` / `description_too_*` keys.** They are
|
|
15
|
+
* owned by `stapel_attributes` and translated by `@stapel/attributes-react`
|
|
16
|
+
* (`/i18n/ru`, `/i18n/es`) — the package that draws and mirrors those values.
|
|
17
|
+
* Restating them here would give one refusal two sentences. A host registers
|
|
18
|
+
* both bundles; `test/i18n.test.ts` proves the union covers the whole
|
|
19
|
+
* registry in all three locales.
|
|
20
|
+
*
|
|
21
|
+
* **A category name, a feature name, an option label.** All three arrive from
|
|
22
|
+
* the wire as translation keys; a deployment's catalogue copy belongs in the
|
|
23
|
+
* HOST's bundle. Same rule `@stapel/categories-react` writes down at length.
|
|
24
|
+
*
|
|
25
|
+
* **`listings.compose.blocked.unsupported_type` is HERE and its twin is
|
|
26
|
+
* not.** `@stapel/attributes-react` owns the FACT (`unsupportedTypes` /
|
|
27
|
+
* `unsupportedTypeGate`) and its own key; this pair raises its own sentence
|
|
28
|
+
* from the same fact rather than re-deriving the fact or borrowing the other
|
|
29
|
+
* package's namespace (spec §13.2, note 3, which called for exactly this
|
|
30
|
+
* split).
|
|
31
|
+
*/
|
|
32
|
+
export const LISTINGS_I18N_KEYS = {
|
|
33
|
+
unknownError: "listings.error.unknown",
|
|
34
|
+
|
|
35
|
+
// ── the lifecycle axis (nine states) ─────────────────────────────────────
|
|
36
|
+
statusDraft: "listings.status.draft",
|
|
37
|
+
statusPending: "listings.status.pending",
|
|
38
|
+
statusPublished: "listings.status.published",
|
|
39
|
+
statusPaused: "listings.status.paused",
|
|
40
|
+
statusExpired: "listings.status.expired",
|
|
41
|
+
statusSold: "listings.status.sold",
|
|
42
|
+
statusRejected: "listings.status.rejected",
|
|
43
|
+
statusBlocked: "listings.status.blocked",
|
|
44
|
+
statusArchived: "listings.status.archived",
|
|
45
|
+
|
|
46
|
+
// ── the moderation axis (what the owner is told, given BOTH fields) ──────
|
|
47
|
+
/** First submission: nothing is public yet. */
|
|
48
|
+
moderationFirstReview: "listings.moderation.first_review",
|
|
49
|
+
/** THE 0.5.0 sentence: live to everyone, edit under re-screening. */
|
|
50
|
+
moderationLiveEditPending: "listings.moderation.live_edit_pending",
|
|
51
|
+
/** A pending verdict on a listing the lifecycle already took offline. */
|
|
52
|
+
moderationPendingOffline: "listings.moderation.pending_offline",
|
|
53
|
+
moderationNeedsReview: "listings.moderation.needs_review",
|
|
54
|
+
moderationLiveNeedsReview: "listings.moderation.live_needs_review",
|
|
55
|
+
moderationRejected: "listings.moderation.rejected",
|
|
56
|
+
/** Refused by a moderator while the lifecycle has not moved yet. */
|
|
57
|
+
moderationRejectedStillLive: "listings.moderation.rejected_still_live",
|
|
58
|
+
|
|
59
|
+
// ── card ─────────────────────────────────────────────────────────────────
|
|
60
|
+
cardNoPhoto: "listings.card.no_photo",
|
|
61
|
+
cardPhotoUnavailable: "listings.card.photo_unavailable",
|
|
62
|
+
cardPriceAbsent: "listings.card.price_absent",
|
|
63
|
+
cardFavoriteAdd: "listings.card.favorite_add",
|
|
64
|
+
cardFavoriteRemove: "listings.card.favorite_remove",
|
|
65
|
+
cardOpen: "listings.card.open",
|
|
66
|
+
|
|
67
|
+
// ── detail ───────────────────────────────────────────────────────────────
|
|
68
|
+
detailLoading: "listings.detail.loading",
|
|
69
|
+
detailLoadFailed: "listings.detail.load_failed",
|
|
70
|
+
detailRetry: "listings.detail.retry",
|
|
71
|
+
detailNotFound: "listings.detail.not_found",
|
|
72
|
+
/** Soft-deleted: the status probe answers where the detail 404s. */
|
|
73
|
+
detailRemoved: "listings.detail.removed",
|
|
74
|
+
/** Readable by id, but not on the shelf — and the reader is not the owner. */
|
|
75
|
+
detailNotPublished: "listings.detail.not_published",
|
|
76
|
+
detailOwnerOnlyView: "listings.detail.owner_only_view",
|
|
77
|
+
detailDescription: "listings.detail.description",
|
|
78
|
+
detailSpecs: "listings.detail.specs",
|
|
79
|
+
detailNoSpecs: "listings.detail.no_specs",
|
|
80
|
+
detailUnreadableFeatures: "listings.detail.unreadable_features",
|
|
81
|
+
detailPhotosUnavailable: "listings.detail.photos_unavailable",
|
|
82
|
+
detailPhotoAlt: "listings.detail.photo_alt",
|
|
83
|
+
detailPublishedAt: "listings.detail.published_at",
|
|
84
|
+
detailExpiresAt: "listings.detail.expires_at",
|
|
85
|
+
detailStock: "listings.detail.stock",
|
|
86
|
+
|
|
87
|
+
// ── composer ─────────────────────────────────────────────────────────────
|
|
88
|
+
composeNewTitle: "listings.compose.new_title",
|
|
89
|
+
composeEditTitle: "listings.compose.edit_title",
|
|
90
|
+
composeCategory: "listings.compose.category",
|
|
91
|
+
composeCategoryHelp: "listings.compose.category_help",
|
|
92
|
+
composeCategoryRequired: "listings.compose.category_required",
|
|
93
|
+
composeCategoryChangedDropped: "listings.compose.category_changed_dropped",
|
|
94
|
+
composeTitleLabel: "listings.compose.title_label",
|
|
95
|
+
composeTitleTooLong: "listings.compose.title_too_long",
|
|
96
|
+
composeDescriptionLabel: "listings.compose.description_label",
|
|
97
|
+
composePriceLabel: "listings.compose.price_label",
|
|
98
|
+
composePriceInvalid: "listings.compose.price_invalid",
|
|
99
|
+
composeCurrencyLabel: "listings.compose.currency_label",
|
|
100
|
+
composeLocationLabel: "listings.compose.location_label",
|
|
101
|
+
composeLatLabel: "listings.compose.lat_label",
|
|
102
|
+
composeLonLabel: "listings.compose.lon_label",
|
|
103
|
+
composeGeoIncomplete: "listings.compose.geo_incomplete",
|
|
104
|
+
composePhotos: "listings.compose.photos",
|
|
105
|
+
composeTooManyImages: "listings.compose.too_many_images",
|
|
106
|
+
composeDetails: "listings.compose.details",
|
|
107
|
+
composeDetailsLoading: "listings.compose.details_loading",
|
|
108
|
+
composeDetailsFailed: "listings.compose.details_failed",
|
|
109
|
+
composeDetailsEmpty: "listings.compose.details_empty",
|
|
110
|
+
composeCountable: "listings.compose.countable",
|
|
111
|
+
composeStock: "listings.compose.stock",
|
|
112
|
+
composeAutoRepublish: "listings.compose.auto_republish",
|
|
113
|
+
composeSave: "listings.compose.save",
|
|
114
|
+
composeSaving: "listings.compose.saving",
|
|
115
|
+
composeSaved: "listings.compose.saved",
|
|
116
|
+
composePublish: "listings.compose.publish",
|
|
117
|
+
composeRepublish: "listings.compose.republish",
|
|
118
|
+
composePublishing: "listings.compose.publishing",
|
|
119
|
+
composePublishedFirst: "listings.compose.published_first",
|
|
120
|
+
composePublishedLive: "listings.compose.published_live",
|
|
121
|
+
composeInvalidSummary: "listings.compose.invalid_summary",
|
|
122
|
+
|
|
123
|
+
// ── composer: every switched-off control states its reason ───────────────
|
|
124
|
+
composeBlockedNoCategory: "listings.compose.blocked.no_category",
|
|
125
|
+
composeBlockedUnsupportedType: "listings.compose.blocked.unsupported_type",
|
|
126
|
+
composeBlockedPhotosPending: "listings.compose.blocked.photos_pending",
|
|
127
|
+
composeBlockedNoDraft: "listings.compose.blocked.no_draft",
|
|
128
|
+
composeBlockedBusy: "listings.compose.blocked.busy",
|
|
129
|
+
composeBlockedMirror: "listings.compose.blocked.mirror",
|
|
130
|
+
composeBlockedDetailsUnavailable: "listings.compose.blocked.details_unavailable",
|
|
131
|
+
|
|
132
|
+
// ── the owner's dashboard ────────────────────────────────────────────────
|
|
133
|
+
mineTitle: "listings.mine.title",
|
|
134
|
+
mineTabActive: "listings.mine.tab.active",
|
|
135
|
+
mineTabDrafts: "listings.mine.tab.drafts",
|
|
136
|
+
mineTabArchived: "listings.mine.tab.archived",
|
|
137
|
+
mineLoading: "listings.mine.loading",
|
|
138
|
+
mineLoadFailed: "listings.mine.load_failed",
|
|
139
|
+
mineEmpty: "listings.mine.empty",
|
|
140
|
+
mineRetry: "listings.mine.retry",
|
|
141
|
+
mineCountersFailed: "listings.mine.counters_failed",
|
|
142
|
+
/** The upstream gap, named on screen — see `headless/MyListings.tsx`. */
|
|
143
|
+
mineSourceMissing: "listings.mine.source_missing",
|
|
144
|
+
mineLiveUnderReview: "listings.mine.live_under_review",
|
|
145
|
+
mineEdit: "listings.mine.edit",
|
|
146
|
+
mineArchive: "listings.mine.archive",
|
|
147
|
+
mineComplete: "listings.mine.complete",
|
|
148
|
+
mineDelete: "listings.mine.delete",
|
|
149
|
+
|
|
150
|
+
// ── favourites ───────────────────────────────────────────────────────────
|
|
151
|
+
favoritesTitle: "listings.favorites.title",
|
|
152
|
+
favoritesLoading: "listings.favorites.loading",
|
|
153
|
+
favoritesLoadFailed: "listings.favorites.load_failed",
|
|
154
|
+
favoritesEmpty: "listings.favorites.empty",
|
|
155
|
+
|
|
156
|
+
// ── gates shared by every action a visitor cannot take ───────────────────
|
|
157
|
+
blockedSignIn: "listings.blocked.sign_in",
|
|
158
|
+
blockedGuest: "listings.blocked.guest",
|
|
159
|
+
blockedMandateUnknown: "listings.blocked.mandate_unknown",
|
|
160
|
+
/** A lifecycle move the server's whitelist does not allow, named with the
|
|
161
|
+
* status it would be moving FROM. */
|
|
162
|
+
blockedTransition: "listings.blocked.transition",
|
|
163
|
+
blockedDeleteActive: "listings.blocked.delete_active",
|
|
164
|
+
blockedInFlight: "listings.blocked.in_flight",
|
|
165
|
+
|
|
166
|
+
// ── keyset pagination ────────────────────────────────────────────────────
|
|
167
|
+
pagePrev: "listings.page.prev",
|
|
168
|
+
pageNext: "listings.page.next",
|
|
169
|
+
|
|
170
|
+
// ── nav labels ───────────────────────────────────────────────────────────
|
|
171
|
+
navDetail: "listings.nav.detail",
|
|
172
|
+
navCompose: "listings.nav.compose",
|
|
173
|
+
navMine: "listings.nav.mine",
|
|
174
|
+
navFavorites: "listings.nav.favorites",
|
|
175
|
+
} as const;
|
|
176
|
+
|
|
177
|
+
export type ListingsI18nKey =
|
|
178
|
+
(typeof LISTINGS_I18N_KEYS)[keyof typeof LISTINGS_I18N_KEYS];
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* English fallback bundle for listings-react UI keys + backend error codes.
|
|
182
|
+
* The generated backend texts are spread FIRST so coverage of the error
|
|
183
|
+
* registry is by construction; the pair's own copy follows.
|
|
184
|
+
*/
|
|
185
|
+
export const listingsI18nBundleEn: Record<string, string> = {
|
|
186
|
+
...listingsErrorBundleEn,
|
|
187
|
+
|
|
188
|
+
"listings.error.unknown": "Something went wrong with this listing",
|
|
189
|
+
|
|
190
|
+
"listings.status.draft": "Draft",
|
|
191
|
+
"listings.status.pending": "Awaiting review",
|
|
192
|
+
"listings.status.published": "Published",
|
|
193
|
+
"listings.status.paused": "Paused",
|
|
194
|
+
"listings.status.expired": "Expired",
|
|
195
|
+
"listings.status.sold": "Sold",
|
|
196
|
+
"listings.status.rejected": "Rejected",
|
|
197
|
+
"listings.status.blocked": "Taken down",
|
|
198
|
+
"listings.status.archived": "Archived",
|
|
199
|
+
|
|
200
|
+
"listings.moderation.first_review":
|
|
201
|
+
"Sent for review. It goes on sale once a moderator approves it.",
|
|
202
|
+
"listings.moderation.live_edit_pending":
|
|
203
|
+
"Your listing stays published while we review the changes — buyers can see it right now.",
|
|
204
|
+
"listings.moderation.pending_offline":
|
|
205
|
+
"A review was requested, but this listing is no longer on sale.",
|
|
206
|
+
"listings.moderation.needs_review":
|
|
207
|
+
"A moderator is looking at this one by hand.",
|
|
208
|
+
"listings.moderation.live_needs_review":
|
|
209
|
+
"Published, and a moderator is looking at the changes by hand.",
|
|
210
|
+
"listings.moderation.rejected":
|
|
211
|
+
"A moderator refused this listing. Edit it and send it again.",
|
|
212
|
+
"listings.moderation.rejected_still_live":
|
|
213
|
+
"A moderator refused this listing; it is still visible while that is applied.",
|
|
214
|
+
|
|
215
|
+
"listings.card.no_photo": "No photo",
|
|
216
|
+
"listings.card.photo_unavailable": "Photo unavailable",
|
|
217
|
+
"listings.card.price_absent": "Price on request",
|
|
218
|
+
"listings.card.favorite_add": "Save to favourites",
|
|
219
|
+
"listings.card.favorite_remove": "Remove from favourites",
|
|
220
|
+
"listings.card.open": "Open",
|
|
221
|
+
|
|
222
|
+
"listings.detail.loading": "Loading the listing…",
|
|
223
|
+
"listings.detail.load_failed": "We could not load this listing",
|
|
224
|
+
"listings.detail.retry": "Try again",
|
|
225
|
+
"listings.detail.not_found": "There is no listing at this address",
|
|
226
|
+
"listings.detail.removed": "This listing was removed",
|
|
227
|
+
"listings.detail.not_published":
|
|
228
|
+
"This listing is not on sale right now, so what you see may be out of date",
|
|
229
|
+
"listings.detail.owner_only_view":
|
|
230
|
+
"Only you can see this — it is not published yet",
|
|
231
|
+
"listings.detail.description": "Description",
|
|
232
|
+
"listings.detail.specs": "Details",
|
|
233
|
+
"listings.detail.no_specs": "The seller listed no extra details",
|
|
234
|
+
"listings.detail.unreadable_features":
|
|
235
|
+
"{count} details of this listing could not be read by this version",
|
|
236
|
+
"listings.detail.photos_unavailable":
|
|
237
|
+
"Photos cannot be shown here — this app has no way to resolve them",
|
|
238
|
+
"listings.detail.photo_alt": "Photo {index} of {total}",
|
|
239
|
+
"listings.detail.published_at": "Published {date}",
|
|
240
|
+
"listings.detail.expires_at": "Listed until {date}",
|
|
241
|
+
"listings.detail.stock": "{count} available",
|
|
242
|
+
|
|
243
|
+
"listings.compose.new_title": "New listing",
|
|
244
|
+
"listings.compose.edit_title": "Edit listing",
|
|
245
|
+
"listings.compose.category": "Category",
|
|
246
|
+
"listings.compose.category_help":
|
|
247
|
+
"The category decides which details buyers are asked for",
|
|
248
|
+
"listings.compose.category_required": "Choose a category first",
|
|
249
|
+
"listings.compose.category_changed_dropped":
|
|
250
|
+
"{count} answers do not apply to this category and were cleared",
|
|
251
|
+
"listings.compose.title_label": "Title",
|
|
252
|
+
"listings.compose.title_too_long":
|
|
253
|
+
"The title must be at most {max_length} characters",
|
|
254
|
+
"listings.compose.description_label": "Description",
|
|
255
|
+
"listings.compose.price_label": "Price",
|
|
256
|
+
"listings.compose.price_invalid":
|
|
257
|
+
"Enter a price as a number, with at most two decimals",
|
|
258
|
+
"listings.compose.currency_label": "Currency",
|
|
259
|
+
"listings.compose.location_label": "Where it is",
|
|
260
|
+
"listings.compose.lat_label": "Latitude",
|
|
261
|
+
"listings.compose.lon_label": "Longitude",
|
|
262
|
+
"listings.compose.geo_incomplete":
|
|
263
|
+
"A latitude needs a longitude beside it — half a coordinate points nowhere",
|
|
264
|
+
"listings.compose.photos": "Photos",
|
|
265
|
+
"listings.compose.too_many_images":
|
|
266
|
+
"A listing can carry at most {max} photos",
|
|
267
|
+
"listings.compose.details": "Details",
|
|
268
|
+
"listings.compose.details_loading": "Loading what this category asks for…",
|
|
269
|
+
"listings.compose.details_failed":
|
|
270
|
+
"We could not load what this category asks for",
|
|
271
|
+
"listings.compose.details_empty": "This category asks for no extra details",
|
|
272
|
+
"listings.compose.countable": "I am selling a countable item",
|
|
273
|
+
"listings.compose.stock": "How many",
|
|
274
|
+
"listings.compose.auto_republish": "Re-publish automatically when it expires",
|
|
275
|
+
"listings.compose.save": "Save draft",
|
|
276
|
+
"listings.compose.saving": "Saving…",
|
|
277
|
+
"listings.compose.saved": "Draft saved",
|
|
278
|
+
"listings.compose.publish": "Publish",
|
|
279
|
+
"listings.compose.republish": "Send changes",
|
|
280
|
+
"listings.compose.publishing": "Sending…",
|
|
281
|
+
"listings.compose.published_first":
|
|
282
|
+
"Sent for review. It goes on sale once a moderator approves it.",
|
|
283
|
+
"listings.compose.published_live":
|
|
284
|
+
"Changes sent. Your listing stays published while we review them.",
|
|
285
|
+
"listings.compose.invalid_summary":
|
|
286
|
+
"{count} details need your attention before this can go out",
|
|
287
|
+
|
|
288
|
+
"listings.compose.blocked.no_category":
|
|
289
|
+
"Choose a category — the rest of the form depends on it",
|
|
290
|
+
"listings.compose.blocked.unsupported_type":
|
|
291
|
+
"This category asks for a kind of detail this app cannot show yet ({types}), so it cannot fill it in for you",
|
|
292
|
+
"listings.compose.blocked.photos_pending":
|
|
293
|
+
"Wait for the photos to finish uploading",
|
|
294
|
+
"listings.compose.blocked.no_draft": "The draft has not been created yet",
|
|
295
|
+
"listings.compose.blocked.busy": "One moment — the last change is still saving",
|
|
296
|
+
"listings.compose.blocked.mirror":
|
|
297
|
+
"Fix the highlighted fields first",
|
|
298
|
+
"listings.compose.blocked.details_unavailable":
|
|
299
|
+
"We could not load what this category asks for, so we cannot check the form",
|
|
300
|
+
|
|
301
|
+
"listings.mine.title": "My listings",
|
|
302
|
+
"listings.mine.tab.active": "Active",
|
|
303
|
+
"listings.mine.tab.drafts": "Drafts",
|
|
304
|
+
"listings.mine.tab.archived": "Archived",
|
|
305
|
+
"listings.mine.loading": "Loading your listings…",
|
|
306
|
+
"listings.mine.load_failed": "We could not load your listings",
|
|
307
|
+
"listings.mine.empty": "Nothing here yet",
|
|
308
|
+
"listings.mine.retry": "Try again",
|
|
309
|
+
"listings.mine.counters_failed": "We could not count your listings",
|
|
310
|
+
"listings.mine.source_missing":
|
|
311
|
+
"This app cannot list your own listings yet: the listings service has no owner-scoped list endpoint. Your counts below are real.",
|
|
312
|
+
"listings.mine.live_under_review":
|
|
313
|
+
"Published, changes under review",
|
|
314
|
+
"listings.mine.edit": "Edit",
|
|
315
|
+
"listings.mine.archive": "Archive",
|
|
316
|
+
"listings.mine.complete": "Mark sold",
|
|
317
|
+
"listings.mine.delete": "Delete",
|
|
318
|
+
|
|
319
|
+
"listings.favorites.title": "Favourites",
|
|
320
|
+
"listings.favorites.loading": "Loading your favourites…",
|
|
321
|
+
"listings.favorites.load_failed": "We could not load your favourites",
|
|
322
|
+
"listings.favorites.empty": "You have not saved anything yet",
|
|
323
|
+
|
|
324
|
+
"listings.blocked.sign_in": "Sign in to do this",
|
|
325
|
+
"listings.blocked.guest":
|
|
326
|
+
"Your account cannot do this yet — finish setting it up first",
|
|
327
|
+
"listings.blocked.mandate_unknown":
|
|
328
|
+
"We could not check your account, so we are not guessing whether you may do this",
|
|
329
|
+
"listings.blocked.transition":
|
|
330
|
+
"A listing that is {from_status} cannot be moved that way",
|
|
331
|
+
"listings.blocked.delete_active":
|
|
332
|
+
"Archive it first — a listing that is on sale cannot be deleted",
|
|
333
|
+
"listings.blocked.in_flight": "One moment — that is already under way",
|
|
334
|
+
|
|
335
|
+
"listings.page.prev": "Previous",
|
|
336
|
+
"listings.page.next": "Next",
|
|
337
|
+
|
|
338
|
+
"listings.nav.detail": "Listing",
|
|
339
|
+
"listings.nav.compose": "Post a listing",
|
|
340
|
+
"listings.nav.mine": "My listings",
|
|
341
|
+
"listings.nav.favorites": "Favourites",
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Register the English bundle into a core i18n engine. Locale bundles ship as
|
|
346
|
+
* opt-in subpaths (`@stapel/listings-react/i18n/ru`, `…/es`) so a host that
|
|
347
|
+
* needs only English never carries them.
|
|
348
|
+
*
|
|
349
|
+
* A host that renders a listing's details also registers
|
|
350
|
+
* `@stapel/attributes-react`'s bundles — that package owns the twelve
|
|
351
|
+
* `stapel_attributes` error keys in every locale, and the value editors that
|
|
352
|
+
* raise them.
|
|
353
|
+
*/
|
|
354
|
+
export function registerListingsI18n(i18n: I18nEngine): void {
|
|
355
|
+
i18n.registerBundle("en", listingsI18nBundleEn as I18nDictionary);
|
|
356
|
+
}
|
package/src/i18n/ru.ts
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import type { I18nDictionary, I18nEngine } from "@stapel/core";
|
|
2
|
+
import { listingsErrorBundleRu } from "./generated/errors.ru.gen.js";
|
|
3
|
+
|
|
4
|
+
export { listingsErrorBundleRu } from "./generated/errors.ru.gen.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Russian bundle for listings-react — the `@stapel/listings-react/i18n/ru`
|
|
8
|
+
* subpath (i18n-shipping.md §2) so the locale is opt-in: hosts that do not
|
|
9
|
+
* register it never carry these strings (the main entry does not import this
|
|
10
|
+
* module — gated by size-limit + the bundle-purity test).
|
|
11
|
+
*
|
|
12
|
+
* This is the storefront's DEFAULT language (storefront spec verdict F1:
|
|
13
|
+
* ru-first), which is why the UI copy is here in full and not only the error
|
|
14
|
+
* keys: a seller filling in a listing is the surface where a half-translated
|
|
15
|
+
* form is most obvious.
|
|
16
|
+
*
|
|
17
|
+
* ── What comes from where ──────────────────────────────────────────────────
|
|
18
|
+
*
|
|
19
|
+
* `stapel-listings` ships **no `translations/` directory at all**, so 21 of
|
|
20
|
+
* the 63 registry codes can never come from an upstream catalogue. They split
|
|
21
|
+
* by owner:
|
|
22
|
+
*
|
|
23
|
+
* - the 42 cross-cutting `stapel_core` codes are GENERATED, merged in from
|
|
24
|
+
* stapel-core's own catalogue by `pnpm gen:errors` (spread first below);
|
|
25
|
+
* - the **9 `stapel_listings` codes** are authored here — and when upstream
|
|
26
|
+
* ships a catalogue, nine lines are deleted and no key or text moves;
|
|
27
|
+
* - the **12 `stapel_attributes` codes** are NOT here. They belong to
|
|
28
|
+
* `@stapel/attributes-react`, which already translates them and which is a
|
|
29
|
+
* peer of this pair anyway. Two packages must not give one refusal two
|
|
30
|
+
* sentences (spec §13.2, note 3). A host registers both bundles;
|
|
31
|
+
* `test/i18n.test.ts` proves the union covers the registry.
|
|
32
|
+
*
|
|
33
|
+
* PROVENANCE, stated rather than implied: the core catalogue ships
|
|
34
|
+
* `origin=seed:authored` and is UNREVIEWED; the pair-authored strings below
|
|
35
|
+
* are the same grade. Neither is a claim of review.
|
|
36
|
+
*/
|
|
37
|
+
export const listingsI18nBundleRu: I18nDictionary = {
|
|
38
|
+
...listingsErrorBundleRu,
|
|
39
|
+
|
|
40
|
+
// ── the 9 stapel_listings-owned codes, pair-authored ─────────────────────
|
|
41
|
+
"error.400.category_required": "Нужно выбрать категорию",
|
|
42
|
+
"error.400.image_required":
|
|
43
|
+
"Чтобы опубликовать объявление, добавьте хотя бы одно фото",
|
|
44
|
+
"error.400.listing_feature_not_allowed":
|
|
45
|
+
"Характеристика «{feature}» не относится к этой категории",
|
|
46
|
+
"error.400.publish_validation_failed":
|
|
47
|
+
"Объявление не прошло проверку и не опубликовано",
|
|
48
|
+
"error.403.listing_not_owner": "Это не ваше объявление",
|
|
49
|
+
"error.404.listing_not_found": "Объявление не найдено",
|
|
50
|
+
"error.409.already_favorited": "Объявление уже в избранном",
|
|
51
|
+
"error.409.invalid_listing_transition":
|
|
52
|
+
"Объявление в статусе «{from_status}» так перевести нельзя",
|
|
53
|
+
"error.409.listing_cannot_delete_active":
|
|
54
|
+
"Сначала снимите объявление с публикации — активное удалить нельзя",
|
|
55
|
+
|
|
56
|
+
"listings.error.unknown": "Что-то пошло не так с этим объявлением",
|
|
57
|
+
|
|
58
|
+
"listings.status.draft": "Черновик",
|
|
59
|
+
"listings.status.pending": "На проверке",
|
|
60
|
+
"listings.status.published": "Опубликовано",
|
|
61
|
+
"listings.status.paused": "Приостановлено",
|
|
62
|
+
"listings.status.expired": "Срок вышел",
|
|
63
|
+
"listings.status.sold": "Продано",
|
|
64
|
+
"listings.status.rejected": "Отклонено",
|
|
65
|
+
"listings.status.blocked": "Снято модератором",
|
|
66
|
+
"listings.status.archived": "В архиве",
|
|
67
|
+
|
|
68
|
+
"listings.moderation.first_review":
|
|
69
|
+
"Отправлено на проверку. Объявление появится в продаже после одобрения модератора.",
|
|
70
|
+
"listings.moderation.live_edit_pending":
|
|
71
|
+
"Объявление остаётся опубликованным, пока мы проверяем правки — покупатели видят его прямо сейчас.",
|
|
72
|
+
"listings.moderation.pending_offline":
|
|
73
|
+
"Проверка была запрошена, но объявление уже не в продаже.",
|
|
74
|
+
"listings.moderation.needs_review":
|
|
75
|
+
"Объявление смотрит модератор вручную.",
|
|
76
|
+
"listings.moderation.live_needs_review":
|
|
77
|
+
"Опубликовано, правки смотрит модератор вручную.",
|
|
78
|
+
"listings.moderation.rejected":
|
|
79
|
+
"Модератор отклонил объявление. Исправьте и отправьте снова.",
|
|
80
|
+
"listings.moderation.rejected_still_live":
|
|
81
|
+
"Модератор отклонил объявление; пока решение применяется, оно ещё видно.",
|
|
82
|
+
|
|
83
|
+
"listings.card.no_photo": "Без фото",
|
|
84
|
+
"listings.card.photo_unavailable": "Фото недоступно",
|
|
85
|
+
"listings.card.price_absent": "Цена по запросу",
|
|
86
|
+
"listings.card.favorite_add": "В избранное",
|
|
87
|
+
"listings.card.favorite_remove": "Убрать из избранного",
|
|
88
|
+
"listings.card.open": "Открыть",
|
|
89
|
+
|
|
90
|
+
"listings.detail.loading": "Загружаем объявление…",
|
|
91
|
+
"listings.detail.load_failed": "Не удалось загрузить объявление",
|
|
92
|
+
"listings.detail.retry": "Повторить",
|
|
93
|
+
"listings.detail.not_found": "По этому адресу объявления нет",
|
|
94
|
+
"listings.detail.removed": "Это объявление удалено",
|
|
95
|
+
"listings.detail.not_published":
|
|
96
|
+
"Объявление сейчас не в продаже, и то, что вы видите, может быть неактуальным",
|
|
97
|
+
"listings.detail.owner_only_view":
|
|
98
|
+
"Это видите только вы — объявление ещё не опубликовано",
|
|
99
|
+
"listings.detail.description": "Описание",
|
|
100
|
+
"listings.detail.specs": "Характеристики",
|
|
101
|
+
"listings.detail.no_specs": "Продавец не указал дополнительных характеристик",
|
|
102
|
+
"listings.detail.unreadable_features":
|
|
103
|
+
"Характеристик, которые эта версия не смогла прочитать: {count}",
|
|
104
|
+
"listings.detail.photos_unavailable":
|
|
105
|
+
"Фото здесь показать нельзя — приложению нечем их разрешить",
|
|
106
|
+
"listings.detail.photo_alt": "Фото {index} из {total}",
|
|
107
|
+
"listings.detail.published_at": "Опубликовано {date}",
|
|
108
|
+
"listings.detail.expires_at": "В продаже до {date}",
|
|
109
|
+
"listings.detail.stock": "В наличии: {count}",
|
|
110
|
+
|
|
111
|
+
"listings.compose.new_title": "Новое объявление",
|
|
112
|
+
"listings.compose.edit_title": "Редактирование объявления",
|
|
113
|
+
"listings.compose.category": "Категория",
|
|
114
|
+
"listings.compose.category_help":
|
|
115
|
+
"От категории зависит, какие характеристики спросят у продавца",
|
|
116
|
+
"listings.compose.category_required": "Сначала выберите категорию",
|
|
117
|
+
"listings.compose.category_changed_dropped":
|
|
118
|
+
"Ответов, которые не относятся к этой категории и были очищены: {count}",
|
|
119
|
+
"listings.compose.title_label": "Заголовок",
|
|
120
|
+
"listings.compose.title_too_long":
|
|
121
|
+
"Заголовок должен быть не длиннее {max_length} символов",
|
|
122
|
+
"listings.compose.description_label": "Описание",
|
|
123
|
+
"listings.compose.price_label": "Цена",
|
|
124
|
+
"listings.compose.price_invalid":
|
|
125
|
+
"Введите цену числом, не более двух знаков после запятой",
|
|
126
|
+
"listings.compose.currency_label": "Валюта",
|
|
127
|
+
"listings.compose.location_label": "Где находится",
|
|
128
|
+
"listings.compose.lat_label": "Широта",
|
|
129
|
+
"listings.compose.lon_label": "Долгота",
|
|
130
|
+
"listings.compose.geo_incomplete":
|
|
131
|
+
"Рядом с широтой нужна долгота — половина координаты никуда не указывает",
|
|
132
|
+
"listings.compose.photos": "Фотографии",
|
|
133
|
+
"listings.compose.too_many_images":
|
|
134
|
+
"К объявлению можно приложить не больше {max} фото",
|
|
135
|
+
"listings.compose.details": "Характеристики",
|
|
136
|
+
"listings.compose.details_loading": "Загружаем характеристики категории…",
|
|
137
|
+
"listings.compose.details_failed":
|
|
138
|
+
"Не удалось загрузить характеристики категории",
|
|
139
|
+
"listings.compose.details_empty":
|
|
140
|
+
"Эта категория не спрашивает дополнительных характеристик",
|
|
141
|
+
"listings.compose.countable": "Продаю штучный товар",
|
|
142
|
+
"listings.compose.stock": "Сколько штук",
|
|
143
|
+
"listings.compose.auto_republish": "Публиковать заново, когда истечёт срок",
|
|
144
|
+
"listings.compose.save": "Сохранить черновик",
|
|
145
|
+
"listings.compose.saving": "Сохраняем…",
|
|
146
|
+
"listings.compose.saved": "Черновик сохранён",
|
|
147
|
+
"listings.compose.publish": "Опубликовать",
|
|
148
|
+
"listings.compose.republish": "Отправить правки",
|
|
149
|
+
"listings.compose.publishing": "Отправляем…",
|
|
150
|
+
"listings.compose.published_first":
|
|
151
|
+
"Отправлено на проверку. Объявление появится в продаже после одобрения модератора.",
|
|
152
|
+
"listings.compose.published_live":
|
|
153
|
+
"Правки отправлены. Объявление остаётся опубликованным, пока мы их проверяем.",
|
|
154
|
+
"listings.compose.invalid_summary":
|
|
155
|
+
"Прежде чем отправить, поправьте характеристик: {count}",
|
|
156
|
+
|
|
157
|
+
"listings.compose.blocked.no_category":
|
|
158
|
+
"Выберите категорию — от неё зависит остальная форма",
|
|
159
|
+
"listings.compose.blocked.unsupported_type":
|
|
160
|
+
"Эта категория спрашивает характеристику, которую приложение пока не умеет показывать ({types}), поэтому заполнить её здесь нельзя",
|
|
161
|
+
"listings.compose.blocked.photos_pending":
|
|
162
|
+
"Дождитесь окончания загрузки фотографий",
|
|
163
|
+
"listings.compose.blocked.no_draft": "Черновик ещё не создан",
|
|
164
|
+
"listings.compose.blocked.busy":
|
|
165
|
+
"Секунду — предыдущее изменение ещё сохраняется",
|
|
166
|
+
"listings.compose.blocked.mirror": "Сначала поправьте отмеченные поля",
|
|
167
|
+
"listings.compose.blocked.details_unavailable":
|
|
168
|
+
"Не удалось загрузить характеристики категории, поэтому проверить форму нельзя",
|
|
169
|
+
|
|
170
|
+
"listings.mine.title": "Мои объявления",
|
|
171
|
+
"listings.mine.tab.active": "Активные",
|
|
172
|
+
"listings.mine.tab.drafts": "Черновики",
|
|
173
|
+
"listings.mine.tab.archived": "Архив",
|
|
174
|
+
"listings.mine.loading": "Загружаем ваши объявления…",
|
|
175
|
+
"listings.mine.load_failed": "Не удалось загрузить ваши объявления",
|
|
176
|
+
"listings.mine.empty": "Здесь пока пусто",
|
|
177
|
+
"listings.mine.retry": "Повторить",
|
|
178
|
+
"listings.mine.counters_failed": "Не удалось посчитать ваши объявления",
|
|
179
|
+
"listings.mine.source_missing":
|
|
180
|
+
"Приложение пока не может перечислить ваши объявления: у сервиса объявлений нет списка, ограниченного владельцем. Счётчики ниже — настоящие.",
|
|
181
|
+
"listings.mine.live_under_review": "Опубликовано, правки на проверке",
|
|
182
|
+
"listings.mine.edit": "Редактировать",
|
|
183
|
+
"listings.mine.archive": "В архив",
|
|
184
|
+
"listings.mine.complete": "Отметить проданным",
|
|
185
|
+
"listings.mine.delete": "Удалить",
|
|
186
|
+
|
|
187
|
+
"listings.favorites.title": "Избранное",
|
|
188
|
+
"listings.favorites.loading": "Загружаем избранное…",
|
|
189
|
+
"listings.favorites.load_failed": "Не удалось загрузить избранное",
|
|
190
|
+
"listings.favorites.empty": "Вы ещё ничего не сохранили",
|
|
191
|
+
|
|
192
|
+
"listings.blocked.sign_in": "Войдите, чтобы сделать это",
|
|
193
|
+
"listings.blocked.guest":
|
|
194
|
+
"Этот аккаунт пока так не может — сначала завершите настройку",
|
|
195
|
+
"listings.blocked.mandate_unknown":
|
|
196
|
+
"Не удалось проверить ваш аккаунт, поэтому мы не угадываем, можно ли вам это",
|
|
197
|
+
"listings.blocked.transition":
|
|
198
|
+
"Объявление в статусе «{from_status}» так перевести нельзя",
|
|
199
|
+
"listings.blocked.delete_active":
|
|
200
|
+
"Сначала уберите в архив — объявление в продаже удалить нельзя",
|
|
201
|
+
"listings.blocked.in_flight": "Секунду — это уже выполняется",
|
|
202
|
+
|
|
203
|
+
"listings.page.prev": "Назад",
|
|
204
|
+
"listings.page.next": "Дальше",
|
|
205
|
+
|
|
206
|
+
"listings.nav.detail": "Объявление",
|
|
207
|
+
"listings.nav.compose": "Подать объявление",
|
|
208
|
+
"listings.nav.mine": "Мои объявления",
|
|
209
|
+
"listings.nav.favorites": "Избранное",
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
/** Register the Russian bundle into a core i18n engine. */
|
|
213
|
+
export function registerListingsI18nRu(i18n: I18nEngine): void {
|
|
214
|
+
i18n.registerBundle("ru", listingsI18nBundleRu);
|
|
215
|
+
}
|