Internacionalización
El SDK incluye tablas en inglés (en) y español (es). Para ajustes de copy
puntuales, sobrescribe strings individuales con
<RiftProvider strings={{...}}>. Para agregar un locale completo, extiende las
tablas incluidas.
Orden de resolución
useLocale().t(key, params?) resuelve cada clave en este orden:
- Override del consumidor en
<RiftProvider strings={...}>. - Tabla incluida para el subtag primario del locale resuelto
(
"es-MX"->"es"). - Tabla incluida en inglés.
- La clave literal, como indicador visible de "missing string" durante desarrollo.
El locale activo se negocia en useLocale():
<RiftProvider locale="...">, si coincide conconfig.locales.supported.- El subtag primario de ese locale (
"es-MX"->"es"), si está presente ensupported. config.locales.default."en"como fallback final.
Sobrescribir strings individuales
La mayoría de los consumidores solo necesitan ajustar unas cuantas etiquetas. Pásalas al provider:
<RiftProvider
locale="es-MX"
strings={{
"reservation.reserve": "Apartar boletos",
"checkout.confirm": "Pagar ahora",
"captcha.actionVerify": "Verifica que no eres un bot",
}}
>
{children}
</RiftProvider>
Los overrides aplican globalmente al subárbol. También siguen disponibles los
overrides por componente mediante sus props de etiqueta, por ejemplo
<ReserveButton label="..."> o <CheckoutForm submitLabel="...">.
Interpolación de placeholders
Las claves con segmentos {placeholder} reciben sustituciones mediante el
argumento params de t():
t("ticketRow.increment", { name: "VIP" });
// -> "Add one VIP ticket"
Cuando sobrescribas una clave que toma placeholders, conserva los mismos nombres. El SDK hace match por nombre exacto.
Agregar un locale nuevo
Para un locale de terceros, publica overrides por clave mediante la prop
strings. La tabla debe implementar cada clave de StringKey, el set canónico
del SDK. TypeScript lo valida en el código fuente.
import { type StringsTable } from "@feelrift/react";
const fr: StringsTable = {
"event.hostedBy": "Organisé par {name}",
"event.dateRangeLabel": "Quand",
"event.locationLabel": "Où",
"event.organizerLabel": "Organisateur",
"reservation.reserve": "Réserver",
// ...every other key in StringKey
};
<RiftProvider locale="fr-FR" strings={fr}>
{children}
</RiftProvider>;
Cuando uses un locale fuera de los incluidos (en / es), el SDK cae a inglés
en cualquier clave no provista. Tipar los overrides como StringsTable ayuda a
detectar claves faltantes en compile time.
Catálogo de claves
Cada clave que expone el SDK. Los placeholders se muestran en {braces}. Los
valores de la columna "Default en inglés" se mantienen en inglés porque son la
tabla base del SDK.
Event header
| Clave | Default en inglés | Notas |
|---|---|---|
event.hostedBy | Hosted by {name} | Prefijo de la fila de organizador. |
event.dateRangeLabel | When | Etiqueta <dt> visualmente oculta. |
event.locationLabel | Where | Etiqueta <dt> visualmente oculta. |
event.organizerLabel | Organizer | Etiqueta <dt> visualmente oculta. |
Reservation
| Clave | Default en inglés |
|---|---|
reservation.reserve | Reserve |
reservation.reserving | Reserving… |
reservation.expiresIn | Expires in {remaining} |
reservation.expired | Reservation expired |
reservation.priceChangedTitle | Price has changed |
reservation.priceChangedDetail | The total updated from {oldTotal} to {newTotal} between reservation and checkout. |
reservation.priceChangedAccept | Accept new price |
reservation.priceChangedCancel | Cancel |
Ticket row
| Clave | Default en inglés | Notas |
|---|---|---|
ticketRow.fromPrice | From {price} | Display del tier más barato. |
ticketRow.remaining | {count} left | Se muestra cuando showRemaining está activo. |
ticketRow.soldOut | Sold out | |
ticketRow.increment | Add one {name} ticket | aria-label del botón de incremento. |
ticketRow.decrement | Remove one {name} ticket | aria-label del botón de decremento. |
Estimate / breakdown
| Clave | Default en inglés |
|---|---|
estimate.subtotal | Subtotal |
estimate.grandSubtotal | Subtotal |
estimate.total | Total |
estimate.colQuantity | Qty |
estimate.colItem | Item |
estimate.colPrice | Price |
estimate.disclaimer | We pick the cheapest available tier first. Final price (including any fees) is confirmed when you reserve. |
estimate.empty | Pick tickets to see the breakdown. |
Checkout
| Clave | Default en inglés |
|---|---|
checkout.emailLabel | Email address |
checkout.emailPlaceholder | you@example.com |
checkout.confirm | Confirm and pay |
checkout.confirmFree | Confirm |
checkout.confirming | Confirming… |
checkout.resuming | Resuming checkout… |
checkout.windowClosed | The checkout window for this reservation has closed. |
checkout.missingReturnUrl | This checkout requires a return URL but none was configured. Contact the organizer if this persists. |
Captcha
| Clave | Default en inglés |
|---|---|
captcha.statusIdle | Captcha required |
captcha.statusSolving | Solving captcha… |
captcha.statusSolved | Captcha solved |
captcha.statusError | Captcha failed |
captcha.actionVerify | Verify you're human |
captcha.actionRetry | Try again |
Auth
| Clave | Default en inglés |
|---|---|
auth.signIn | Sign in |
auth.signOut | Sign out |
auth.signingIn | Signing in… |
auth.alreadySignedIn | Already signed in. |
Orders
| Clave | Default en inglés |
|---|---|
orders.title | Your orders |
orders.empty | You don't have any orders yet. |
orders.loading | Loading your orders… |
orders.error | Couldn't load your orders. |
Errors
| Clave | Default en inglés |
|---|---|
error.generic | Something went wrong. Please try again. |
error.rateLimited | Too many requests. Try again in {seconds} seconds. |
error.insufficientInventory | These tickets are no longer available. |
Relacionado
<RiftProvider>->strings: la prop que recibe los overrides.useLocale: el hook que resuelve el locale y traduce claves.