@djangocfg/i18n 2.1.605 → 2.1.607
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/dist/{chunk-WGTVO2XB.mjs → chunk-QNCDAJBH.mjs} +7 -6
- package/dist/chunk-QNCDAJBH.mjs.map +1 -0
- package/dist/copy/index.mjs +1 -1
- package/dist/index.d.mts +9 -4
- package/dist/index.mjs +12 -10
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/locales/ar.ts +4 -3
- package/src/locales/da.ts +4 -3
- package/src/locales/de.ts +4 -3
- package/src/locales/en.ts +4 -3
- package/src/locales/es.ts +4 -3
- package/src/locales/fr.ts +4 -3
- package/src/locales/it.ts +4 -3
- package/src/locales/ja.ts +4 -3
- package/src/locales/ko.ts +4 -3
- package/src/locales/nl.ts +4 -3
- package/src/locales/no.ts +4 -3
- package/src/locales/pl.ts +4 -3
- package/src/locales/pt-BR.ts +4 -3
- package/src/locales/ru.ts +4 -3
- package/src/locales/sv.ts +4 -3
- package/src/locales/tr.ts +4 -3
- package/src/locales/zh.ts +4 -3
- package/src/types.ts +8 -3
- package/dist/chunk-WGTVO2XB.mjs.map +0 -1
package/src/locales/it.ts
CHANGED
|
@@ -242,8 +242,8 @@ export const it: I18nTranslations = {
|
|
|
242
242
|
},
|
|
243
243
|
button: "Continua",
|
|
244
244
|
oauth: {
|
|
245
|
-
|
|
246
|
-
|
|
245
|
+
continueWith: "Continua con {provider}",
|
|
246
|
+
groupLabel: "Accedi con un provider",
|
|
247
247
|
},
|
|
248
248
|
channel: {
|
|
249
249
|
email: "Email",
|
|
@@ -308,9 +308,9 @@ export const it: I18nTranslations = {
|
|
|
308
308
|
signingInBody: "Attendi, stiamo completando l'accesso con {provider}.",
|
|
309
309
|
notice: {
|
|
310
310
|
linkNotAllowedTitle: "Usa il codice via email per questo indirizzo",
|
|
311
|
-
useEmail: "Continua con l'email",
|
|
312
311
|
retry: "Riprova con {provider}",
|
|
313
312
|
dismiss: "Chiudi",
|
|
313
|
+
originNotAllowedHint: "Per gli sviluppatori: {origin} non è un origin del sito Django. Aggiungilo agli origin del sito e registra {origin}/auth?provider={id} come redirect URI presso il provider.",
|
|
314
314
|
},
|
|
315
315
|
error: {
|
|
316
316
|
invalid_state: "Il link di accesso è scaduto. Riprova.",
|
|
@@ -323,6 +323,7 @@ export const it: I18nTranslations = {
|
|
|
323
323
|
link_not_allowed: "L'accesso con {provider} non è disponibile per questo account. Ricevi invece un codice via email.",
|
|
324
324
|
rate_limited: "Troppi tentativi. Attendi un momento e riprova.",
|
|
325
325
|
provider_unavailable: "Il provider non è disponibile al momento. Riprova tra poco.",
|
|
326
|
+
not_configured: "L'accesso con {provider} non è disponibile su questo sito. Usa invece l'e-mail.",
|
|
326
327
|
cancelled: "Accesso annullato.",
|
|
327
328
|
generic: "Accesso non riuscito. Riprova o usa l'email.",
|
|
328
329
|
},
|
package/src/locales/ja.ts
CHANGED
|
@@ -242,8 +242,8 @@ export const ja: I18nTranslations = {
|
|
|
242
242
|
},
|
|
243
243
|
button: "続行",
|
|
244
244
|
oauth: {
|
|
245
|
-
|
|
246
|
-
|
|
245
|
+
continueWith: "{provider}でログイン",
|
|
246
|
+
groupLabel: "外部アカウントでログイン",
|
|
247
247
|
},
|
|
248
248
|
channel: {
|
|
249
249
|
email: "メール",
|
|
@@ -308,9 +308,9 @@ export const ja: I18nTranslations = {
|
|
|
308
308
|
signingInBody: "{provider}でのログインを完了するまでお待ちください。",
|
|
309
309
|
notice: {
|
|
310
310
|
linkNotAllowedTitle: "このアドレスにはメールコードをご利用ください",
|
|
311
|
-
useEmail: "メールで続ける",
|
|
312
311
|
retry: "{provider} でもう一度試す",
|
|
313
312
|
dismiss: "閉じる",
|
|
313
|
+
originNotAllowedHint: "開発者向け: {origin} は Django サイトの origin ではありません。サイトの origins に追加し、プロバイダーに {origin}/auth?provider={id} をリダイレクト URI として登録してください。",
|
|
314
314
|
},
|
|
315
315
|
error: {
|
|
316
316
|
invalid_state: "ログインリンクの有効期限が切れました。もう一度お試しください。",
|
|
@@ -323,6 +323,7 @@ export const ja: I18nTranslations = {
|
|
|
323
323
|
link_not_allowed: "このアカウントでは {provider} でのログインは使えません。代わりにメールでコードを受け取ってください。",
|
|
324
324
|
rate_limited: "試行回数が多すぎます。しばらくしてからもう一度お試しください。",
|
|
325
325
|
provider_unavailable: "プロバイダーが現在利用できません。しばらくしてからもう一度お試しください。",
|
|
326
|
+
not_configured: "このサイトでは{provider}でのログインを利用できません。メールでログインしてください。",
|
|
326
327
|
cancelled: "ログインがキャンセルされました。",
|
|
327
328
|
generic: "ログインできませんでした。もう一度お試しいただくか、メールをご利用ください。",
|
|
328
329
|
},
|
package/src/locales/ko.ts
CHANGED
|
@@ -242,8 +242,8 @@ export const ko: I18nTranslations = {
|
|
|
242
242
|
},
|
|
243
243
|
button: "계속",
|
|
244
244
|
oauth: {
|
|
245
|
-
|
|
246
|
-
|
|
245
|
+
continueWith: "{provider}로 계속",
|
|
246
|
+
groupLabel: "외부 계정으로 로그인",
|
|
247
247
|
},
|
|
248
248
|
channel: {
|
|
249
249
|
email: "이메일",
|
|
@@ -308,9 +308,9 @@ export const ko: I18nTranslations = {
|
|
|
308
308
|
signingInBody: "{provider} 로그인을 완료하는 동안 잠시 기다려 주세요.",
|
|
309
309
|
notice: {
|
|
310
310
|
linkNotAllowedTitle: "이 주소는 이메일 코드를 사용하세요",
|
|
311
|
-
useEmail: "이메일로 계속",
|
|
312
311
|
retry: "{provider}로 다시 시도",
|
|
313
312
|
dismiss: "닫기",
|
|
313
|
+
originNotAllowedHint: "개발자용: {origin}은(는) Django 사이트의 origin이 아닙니다. 사이트 origins에 추가하고, 제공업체에 {origin}/auth?provider={id}를 리디렉션 URI로 등록하세요.",
|
|
314
314
|
},
|
|
315
315
|
error: {
|
|
316
316
|
invalid_state: "로그인 링크가 만료되었습니다. 다시 시도하세요.",
|
|
@@ -323,6 +323,7 @@ export const ko: I18nTranslations = {
|
|
|
323
323
|
link_not_allowed: "이 계정은 {provider} 로그인을 사용할 수 없습니다. 대신 이메일로 코드를 받으세요.",
|
|
324
324
|
rate_limited: "시도가 너무 많습니다. 잠시 후 다시 시도해 주세요.",
|
|
325
325
|
provider_unavailable: "제공업체를 지금 사용할 수 없습니다. 잠시 후 다시 시도해 주세요.",
|
|
326
|
+
not_configured: "이 사이트에서는 {provider} 로그인을 사용할 수 없습니다. 대신 이메일을 사용해 주세요.",
|
|
326
327
|
cancelled: "로그인이 취소되었습니다.",
|
|
327
328
|
generic: "로그인하지 못했습니다. 다시 시도하거나 이메일을 사용하세요.",
|
|
328
329
|
},
|
package/src/locales/nl.ts
CHANGED
|
@@ -242,8 +242,8 @@ export const nl: I18nTranslations = {
|
|
|
242
242
|
},
|
|
243
243
|
button: "Doorgaan",
|
|
244
244
|
oauth: {
|
|
245
|
-
|
|
246
|
-
|
|
245
|
+
continueWith: "Doorgaan met {provider}",
|
|
246
|
+
groupLabel: "Inloggen met een provider",
|
|
247
247
|
},
|
|
248
248
|
channel: {
|
|
249
249
|
email: "E-mail",
|
|
@@ -308,9 +308,9 @@ export const nl: I18nTranslations = {
|
|
|
308
308
|
signingInBody: "Even geduld, we ronden je aanmelding via {provider} af.",
|
|
309
309
|
notice: {
|
|
310
310
|
linkNotAllowedTitle: "Gebruik de e-mailcode voor dit adres",
|
|
311
|
-
useEmail: "Verder met e-mail",
|
|
312
311
|
retry: "{provider} opnieuw proberen",
|
|
313
312
|
dismiss: "Sluiten",
|
|
313
|
+
originNotAllowedHint: "Voor ontwikkelaars: {origin} is geen origin van de Django-site. Voeg hem toe aan de origins van de site en registreer {origin}/auth?provider={id} als redirect-URI bij de provider.",
|
|
314
314
|
},
|
|
315
315
|
error: {
|
|
316
316
|
invalid_state: "De inloglink is verlopen. Probeer het opnieuw.",
|
|
@@ -323,6 +323,7 @@ export const nl: I18nTranslations = {
|
|
|
323
323
|
link_not_allowed: "Inloggen met {provider} is niet beschikbaar voor dit account. Vraag in plaats daarvan een code per e-mail aan.",
|
|
324
324
|
rate_limited: "Te veel pogingen. Wacht even en probeer het opnieuw.",
|
|
325
325
|
provider_unavailable: "De provider is nu niet beschikbaar. Probeer het zo opnieuw.",
|
|
326
|
+
not_configured: "Inloggen met {provider} is op deze site niet beschikbaar. Gebruik in plaats daarvan e-mail.",
|
|
326
327
|
cancelled: "Inloggen geannuleerd.",
|
|
327
328
|
generic: "Inloggen mislukt. Probeer het opnieuw of gebruik e-mail.",
|
|
328
329
|
},
|
package/src/locales/no.ts
CHANGED
|
@@ -242,8 +242,8 @@ export const no: I18nTranslations = {
|
|
|
242
242
|
},
|
|
243
243
|
button: "Fortsett",
|
|
244
244
|
oauth: {
|
|
245
|
-
|
|
246
|
-
|
|
245
|
+
continueWith: "Fortsett med {provider}",
|
|
246
|
+
groupLabel: "Logg inn med en leverandør",
|
|
247
247
|
},
|
|
248
248
|
channel: {
|
|
249
249
|
email: "E-post",
|
|
@@ -308,9 +308,9 @@ export const no: I18nTranslations = {
|
|
|
308
308
|
signingInBody: "Vent litt mens vi fullfører innloggingen via {provider}.",
|
|
309
309
|
notice: {
|
|
310
310
|
linkNotAllowedTitle: "Bruk e-postkoden for denne adressen",
|
|
311
|
-
useEmail: "Fortsett med e-post",
|
|
312
311
|
retry: "Prøv {provider} igjen",
|
|
313
312
|
dismiss: "Lukk",
|
|
313
|
+
originNotAllowedHint: "For utviklere: {origin} er ikke en origin for Django-nettstedet. Legg den til i nettstedets origins, og registrer {origin}/auth?provider={id} som redirect-URI hos leverandøren.",
|
|
314
314
|
},
|
|
315
315
|
error: {
|
|
316
316
|
invalid_state: "Innloggingslenken har utløpt. Prøv igjen.",
|
|
@@ -323,6 +323,7 @@ export const no: I18nTranslations = {
|
|
|
323
323
|
link_not_allowed: "Innlogging med {provider} er ikke tilgjengelig for denne kontoen. Få en kode på e-post i stedet.",
|
|
324
324
|
rate_limited: "For mange forsøk. Vent litt og prøv igjen.",
|
|
325
325
|
provider_unavailable: "Leverandøren er utilgjengelig akkurat nå. Prøv igjen om litt.",
|
|
326
|
+
not_configured: "Innlogging med {provider} er ikke tilgjengelig på dette nettstedet. Bruk e-post i stedet.",
|
|
326
327
|
cancelled: "Innloggingen ble avbrutt.",
|
|
327
328
|
generic: "Kunne ikke logge inn. Prøv igjen eller bruk e-post.",
|
|
328
329
|
},
|
package/src/locales/pl.ts
CHANGED
|
@@ -242,8 +242,8 @@ export const pl: I18nTranslations = {
|
|
|
242
242
|
},
|
|
243
243
|
button: "Kontynuuj",
|
|
244
244
|
oauth: {
|
|
245
|
-
|
|
246
|
-
|
|
245
|
+
continueWith: "Kontynuuj z {provider}",
|
|
246
|
+
groupLabel: "Zaloguj się przez dostawcę",
|
|
247
247
|
},
|
|
248
248
|
channel: {
|
|
249
249
|
email: "E-mail",
|
|
@@ -308,9 +308,9 @@ export const pl: I18nTranslations = {
|
|
|
308
308
|
signingInBody: "Poczekaj, kończymy logowanie przez {provider}.",
|
|
309
309
|
notice: {
|
|
310
310
|
linkNotAllowedTitle: "Użyj kodu z e-maila dla tego adresu",
|
|
311
|
-
useEmail: "Kontynuuj przez e-mail",
|
|
312
311
|
retry: "Spróbuj ponownie przez {provider}",
|
|
313
312
|
dismiss: "Zamknij",
|
|
313
|
+
originNotAllowedHint: "Dla programistów: {origin} nie jest originem witryny Django. Dodaj go do originów witryny i zarejestruj {origin}/auth?provider={id} jako redirect URI u dostawcy.",
|
|
314
314
|
},
|
|
315
315
|
error: {
|
|
316
316
|
invalid_state: "Link do logowania wygasł. Spróbuj ponownie.",
|
|
@@ -323,6 +323,7 @@ export const pl: I18nTranslations = {
|
|
|
323
323
|
link_not_allowed: "Logowanie przez {provider} jest niedostępne dla tego konta. Zamiast tego odbierz kod e-mailem.",
|
|
324
324
|
rate_limited: "Zbyt wiele prób. Poczekaj chwilę i spróbuj ponownie.",
|
|
325
325
|
provider_unavailable: "Dostawca jest teraz niedostępny. Spróbuj ponownie za chwilę.",
|
|
326
|
+
not_configured: "Logowanie przez {provider} nie jest dostępne w tej witrynie. Użyj e-maila.",
|
|
326
327
|
cancelled: "Logowanie anulowano.",
|
|
327
328
|
generic: "Nie udało się zalogować. Spróbuj ponownie lub użyj e-maila.",
|
|
328
329
|
},
|
package/src/locales/pt-BR.ts
CHANGED
|
@@ -242,8 +242,8 @@ export const ptBR: I18nTranslations = {
|
|
|
242
242
|
},
|
|
243
243
|
button: "Continuar",
|
|
244
244
|
oauth: {
|
|
245
|
-
|
|
246
|
-
|
|
245
|
+
continueWith: "Continuar com {provider}",
|
|
246
|
+
groupLabel: "Entrar com um provedor",
|
|
247
247
|
},
|
|
248
248
|
channel: {
|
|
249
249
|
email: "E-mail",
|
|
@@ -308,9 +308,9 @@ export const ptBR: I18nTranslations = {
|
|
|
308
308
|
signingInBody: "Aguarde enquanto concluímos seu login com {provider}.",
|
|
309
309
|
notice: {
|
|
310
310
|
linkNotAllowedTitle: "Use o código por e-mail para este endereço",
|
|
311
|
-
useEmail: "Continuar com e-mail",
|
|
312
311
|
retry: "Tentar {provider} novamente",
|
|
313
312
|
dismiss: "Fechar",
|
|
313
|
+
originNotAllowedHint: "Para desenvolvedores: {origin} não é uma origem do site Django. Adicione-a às origens do site e registre {origin}/auth?provider={id} como URI de redirecionamento no provedor.",
|
|
314
314
|
},
|
|
315
315
|
error: {
|
|
316
316
|
invalid_state: "O link de login expirou. Tente novamente.",
|
|
@@ -323,6 +323,7 @@ export const ptBR: I18nTranslations = {
|
|
|
323
323
|
link_not_allowed: "O login com {provider} não está disponível para esta conta. Receba um código por e-mail.",
|
|
324
324
|
rate_limited: "Muitas tentativas. Aguarde um momento e tente novamente.",
|
|
325
325
|
provider_unavailable: "O provedor está indisponível no momento. Tente novamente em instantes.",
|
|
326
|
+
not_configured: "O login com {provider} não está disponível neste site. Use o e-mail.",
|
|
326
327
|
cancelled: "Login cancelado.",
|
|
327
328
|
generic: "Não foi possível entrar. Tente novamente ou use o e-mail.",
|
|
328
329
|
},
|
package/src/locales/ru.ts
CHANGED
|
@@ -242,8 +242,8 @@ export const ru: I18nTranslations = {
|
|
|
242
242
|
},
|
|
243
243
|
button: "Продолжить",
|
|
244
244
|
oauth: {
|
|
245
|
-
|
|
246
|
-
|
|
245
|
+
continueWith: "Войти через {provider}",
|
|
246
|
+
groupLabel: "Войти через сторонний сервис",
|
|
247
247
|
},
|
|
248
248
|
channel: {
|
|
249
249
|
email: "Email",
|
|
@@ -308,9 +308,9 @@ export const ru: I18nTranslations = {
|
|
|
308
308
|
signingInBody: "Подождите, мы завершаем вход через {provider}.",
|
|
309
309
|
notice: {
|
|
310
310
|
linkNotAllowedTitle: "Для этого адреса вход по коду из письма",
|
|
311
|
-
useEmail: "Продолжить с почтой",
|
|
312
311
|
retry: "Повторить вход через {provider}",
|
|
313
312
|
dismiss: "Закрыть",
|
|
313
|
+
originNotAllowedHint: "Для разработчиков: {origin} не входит в origins сайта Django. Добавьте его в origins сайта и зарегистрируйте {origin}/auth?provider={id} как redirect URI у провайдера.",
|
|
314
314
|
},
|
|
315
315
|
error: {
|
|
316
316
|
invalid_state: "Ссылка для входа устарела. Попробуйте ещё раз.",
|
|
@@ -323,6 +323,7 @@ export const ru: I18nTranslations = {
|
|
|
323
323
|
link_not_allowed: "Вход через {provider} недоступен для этого аккаунта. Получите код по почте.",
|
|
324
324
|
rate_limited: "Слишком много попыток. Подождите немного и повторите.",
|
|
325
325
|
provider_unavailable: "Провайдер сейчас недоступен. Попробуйте чуть позже.",
|
|
326
|
+
not_configured: "Вход через {provider} недоступен на этом сайте. Войдите по почте.",
|
|
326
327
|
cancelled: "Вход отменён.",
|
|
327
328
|
generic: "Не удалось войти. Попробуйте ещё раз или войдите по почте.",
|
|
328
329
|
},
|
package/src/locales/sv.ts
CHANGED
|
@@ -242,8 +242,8 @@ export const sv: I18nTranslations = {
|
|
|
242
242
|
},
|
|
243
243
|
button: "Fortsätt",
|
|
244
244
|
oauth: {
|
|
245
|
-
|
|
246
|
-
|
|
245
|
+
continueWith: "Fortsätt med {provider}",
|
|
246
|
+
groupLabel: "Logga in med en leverantör",
|
|
247
247
|
},
|
|
248
248
|
channel: {
|
|
249
249
|
email: "E-post",
|
|
@@ -308,9 +308,9 @@ export const sv: I18nTranslations = {
|
|
|
308
308
|
signingInBody: "Vänta medan vi slutför inloggningen via {provider}.",
|
|
309
309
|
notice: {
|
|
310
310
|
linkNotAllowedTitle: "Använd e-postkoden för den här adressen",
|
|
311
|
-
useEmail: "Fortsätt med e-post",
|
|
312
311
|
retry: "Försök med {provider} igen",
|
|
313
312
|
dismiss: "Stäng",
|
|
313
|
+
originNotAllowedHint: "För utvecklare: {origin} är inte en origin för Django-webbplatsen. Lägg till den i webbplatsens origins och registrera {origin}/auth?provider={id} som redirect-URI hos leverantören.",
|
|
314
314
|
},
|
|
315
315
|
error: {
|
|
316
316
|
invalid_state: "Inloggningslänken har gått ut. Försök igen.",
|
|
@@ -323,6 +323,7 @@ export const sv: I18nTranslations = {
|
|
|
323
323
|
link_not_allowed: "Inloggning med {provider} är inte tillgänglig för det här kontot. Få en kod via e-post i stället.",
|
|
324
324
|
rate_limited: "För många försök. Vänta en stund och försök igen.",
|
|
325
325
|
provider_unavailable: "Leverantören är inte tillgänglig just nu. Försök igen om en stund.",
|
|
326
|
+
not_configured: "Inloggning med {provider} är inte tillgänglig på den här webbplatsen. Använd e-post i stället.",
|
|
326
327
|
cancelled: "Inloggningen avbröts.",
|
|
327
328
|
generic: "Det gick inte att logga in. Försök igen eller använd e-post.",
|
|
328
329
|
},
|
package/src/locales/tr.ts
CHANGED
|
@@ -242,8 +242,8 @@ export const tr: I18nTranslations = {
|
|
|
242
242
|
},
|
|
243
243
|
button: "Devam et",
|
|
244
244
|
oauth: {
|
|
245
|
-
|
|
246
|
-
|
|
245
|
+
continueWith: "{provider} ile devam et",
|
|
246
|
+
groupLabel: "Bir sağlayıcıyla giriş yap",
|
|
247
247
|
},
|
|
248
248
|
channel: {
|
|
249
249
|
email: "E-posta",
|
|
@@ -308,9 +308,9 @@ export const tr: I18nTranslations = {
|
|
|
308
308
|
signingInBody: "Lütfen bekleyin, {provider} ile girişinizi tamamlıyoruz.",
|
|
309
309
|
notice: {
|
|
310
310
|
linkNotAllowedTitle: "Bu adres için e-posta kodunu kullanın",
|
|
311
|
-
useEmail: "E-posta ile devam et",
|
|
312
311
|
retry: "{provider} ile tekrar dene",
|
|
313
312
|
dismiss: "Kapat",
|
|
313
|
+
originNotAllowedHint: "Geliştiriciler için: {origin}, Django sitesinin origin'i değil. Sitenin origins listesine ekleyin ve {origin}/auth?provider={id} adresini sağlayıcıda yönlendirme URI'si olarak kaydedin.",
|
|
314
314
|
},
|
|
315
315
|
error: {
|
|
316
316
|
invalid_state: "Giriş bağlantısının süresi doldu. Tekrar deneyin.",
|
|
@@ -323,6 +323,7 @@ export const tr: I18nTranslations = {
|
|
|
323
323
|
link_not_allowed: "Bu hesap için {provider} ile giriş kullanılamıyor. Bunun yerine e-postayla kod alın.",
|
|
324
324
|
rate_limited: "Çok fazla deneme. Biraz bekleyip tekrar deneyin.",
|
|
325
325
|
provider_unavailable: "Sağlayıcı şu an kullanılamıyor. Birazdan tekrar deneyin.",
|
|
326
|
+
not_configured: "Bu sitede {provider} ile giriş kullanılamıyor. Bunun yerine e-posta kullanın.",
|
|
326
327
|
cancelled: "Giriş iptal edildi.",
|
|
327
328
|
generic: "Giriş yapılamadı. Tekrar deneyin veya e-postayı kullanın.",
|
|
328
329
|
},
|
package/src/locales/zh.ts
CHANGED
|
@@ -242,8 +242,8 @@ export const zh: I18nTranslations = {
|
|
|
242
242
|
},
|
|
243
243
|
button: "继续",
|
|
244
244
|
oauth: {
|
|
245
|
-
|
|
246
|
-
|
|
245
|
+
continueWith: "使用 {provider} 登录",
|
|
246
|
+
groupLabel: "使用第三方账号登录",
|
|
247
247
|
},
|
|
248
248
|
channel: {
|
|
249
249
|
email: "电子邮件",
|
|
@@ -308,9 +308,9 @@ export const zh: I18nTranslations = {
|
|
|
308
308
|
signingInBody: "请稍候,我们正在完成通过 {provider} 的登录。",
|
|
309
309
|
notice: {
|
|
310
310
|
linkNotAllowedTitle: "此地址请使用邮件验证码",
|
|
311
|
-
useEmail: "使用邮箱继续",
|
|
312
311
|
retry: "重新尝试 {provider}",
|
|
313
312
|
dismiss: "关闭",
|
|
313
|
+
originNotAllowedHint: "开发者提示:{origin} 不是 Django 站点的 origin。请将其添加到站点 origins,并在提供方处将 {origin}/auth?provider={id} 注册为重定向 URI。",
|
|
314
314
|
},
|
|
315
315
|
error: {
|
|
316
316
|
invalid_state: "登录链接已过期,请重试。",
|
|
@@ -323,6 +323,7 @@ export const zh: I18nTranslations = {
|
|
|
323
323
|
link_not_allowed: "此账户无法使用 {provider} 登录,请改用邮件验证码。",
|
|
324
324
|
rate_limited: "尝试次数过多。请稍后再试。",
|
|
325
325
|
provider_unavailable: "服务提供方暂时不可用。请稍后再试。",
|
|
326
|
+
not_configured: "此网站暂不支持使用 {provider} 登录。请改用电子邮件。",
|
|
326
327
|
cancelled: "登录已取消。",
|
|
327
328
|
generic: "无法登录。请重试或使用邮箱。",
|
|
328
329
|
},
|
package/src/types.ts
CHANGED
|
@@ -330,8 +330,10 @@ export interface I18nTranslations {
|
|
|
330
330
|
}
|
|
331
331
|
button: string
|
|
332
332
|
oauth: {
|
|
333
|
-
|
|
334
|
-
|
|
333
|
+
/** {provider} is the provider's brand name: "Continue with GitHub" */
|
|
334
|
+
continueWith: string
|
|
335
|
+
/** Accessible name of the group of provider buttons */
|
|
336
|
+
groupLabel: string
|
|
335
337
|
}
|
|
336
338
|
channel: {
|
|
337
339
|
email: string
|
|
@@ -407,10 +409,11 @@ export interface I18nTranslations {
|
|
|
407
409
|
notice: {
|
|
408
410
|
/** Title of the notice for `link_not_allowed` (staff accounts sign in by email code) */
|
|
409
411
|
linkNotAllowedTitle: string
|
|
410
|
-
useEmail: string
|
|
411
412
|
/** {provider} is the provider's brand name */
|
|
412
413
|
retry: string
|
|
413
414
|
dismiss: string
|
|
415
|
+
/** Developer-only line under the `origin_not_allowed` notice. {origin}: the page origin, {id}: provider id */
|
|
416
|
+
originNotAllowedHint: string
|
|
414
417
|
}
|
|
415
418
|
error: {
|
|
416
419
|
invalid_state: string
|
|
@@ -423,6 +426,8 @@ export interface I18nTranslations {
|
|
|
423
426
|
link_not_allowed: string
|
|
424
427
|
rate_limited: string
|
|
425
428
|
provider_unavailable: string
|
|
429
|
+
/** The site cannot start this provider's sign-in (origin or redirect not configured); {provider} is the brand name */
|
|
430
|
+
not_configured: string
|
|
426
431
|
cancelled: string
|
|
427
432
|
generic: string
|
|
428
433
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/locales/en.ts","../src/utils/interpolate.ts","../src/utils/merge.ts","../src/utils/get-value.ts","../src/context.tsx"],"names":["value"],"mappings":";;;;AAKO,IAAM,EAAA,GAAuB;AAAA,EAClC,EAAA,EAAI;AAAA,IACF,MAAA,EAAQ;AAAA,MACN,WAAA,EAAa,kBAAA;AAAA,MACb,MAAA,EAAQ,WAAA;AAAA,MACR,SAAA,EAAW,mBAAA;AAAA,MACX,SAAA,EAAW,YAAA;AAAA,MACX,QAAA,EAAU,WAAA;AAAA,MACV,SAAA,EAAW,eAAA;AAAA,MACX,OAAA,EAAS;AAAA,KACX;AAAA,IACA,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,UAAA;AAAA,MACV,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,aAAA;AAAA,MACN,EAAA,EAAI,YAAA;AAAA,MACJ,OAAA,EAAS;AAAA,KACX;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,OAAA,EAAS,SAAA;AAAA,MACT,MAAA,EAAQ,QAAA;AAAA,MACR,EAAA,EAAI,IAAA;AAAA,MACJ,GAAA,EAAK,KAAA;AAAA,MACL,EAAA,EAAI,IAAA;AAAA,MACJ,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,SAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,YAAA,EAAc,SAAA;AAAA,MACd,aAAA,EAAe,uCAAA;AAAA,MACf,WAAA,EAAa,gBAAA;AAAA,MACb,iBAAA,EAAmB;AAAA,KACrB;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,MAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,MAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAQ,QAAA;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO,OAAA;AAAA,MACP,OAAA,EAAS,YAAA;AAAA,MACT,MAAA,EAAQ,WAAA;AAAA,MACR,QAAA,EAAU,aAAA;AAAA,MACV,QAAA,EAAU,wBAAA;AAAA,MACV,QAAA,EAAU,UAAA;AAAA,MACV,SAAA,EAAW,0BAAA;AAAA,MACX,SAAA,EAAW,0BAAA;AAAA,MACX,YAAA,EAAc,oCAAA;AAAA,MACd,UAAA,EAAY,0BAAA;AAAA,MACZ,YAAA,EAAc,mCAAA;AAAA,MACd,gBAAA,EAAkB;AAAA,KACpB;AAAA,IACA,QAAA,EAAU;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,SAAA,EAAW,WAAA;AAAA,MACX,QAAA,EAAU,UAAA;AAAA,MACV,GAAA,EAAK,UAAA;AAAA,MACL,UAAA,EAAY,qBAAA;AAAA,MACZ,UAAA,EAAY,qBAAA;AAAA,MACZ,QAAA,EAAU,mBAAA;AAAA,MACV,OAAA,EAAS,kBAAA;AAAA,MACT,QAAA,EAAU,aAAA;AAAA,MACV,QAAA,EAAU,aAAA;AAAA,MACV,YAAA,EAAc,oBAAA;AAAA,MACd,aAAA,EAAe;AAAA,KACjB;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,MAAA,EAAQ,QAAA;AAAA,MACR,SAAA,EAAW,cAAA;AAAA,MACX,QAAA,EAAU,0BAAA;AAAA,MACV,MAAA,EAAQ,cAAA;AAAA,MACR,MAAA,EAAQ,QAAA;AAAA,MACR,OAAA,EAAS,kBAAA;AAAA,MACT,WAAA,EAAa,mBAAA;AAAA,MACb,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,KAAA,EAAO;AAAA,MACL,MAAA,EAAQ,mBAAA;AAAA,MACR,OAAA,EAAS,iBAAA;AAAA,MACT,OAAA,EAAS,gCAAA;AAAA,MACT,WAAA,EAAa,eAAA;AAAA,MACb,OAAA,EAAS,gBAAA;AAAA,MACT,QAAA,EAAU,iBAAA;AAAA,MACV,MAAA,EAAQ,QAAA;AAAA,MACR,YAAA,EAAc,eAAA;AAAA,MACd,SAAA,EAAW,YAAA;AAAA,MACX,WAAA,EAAa,cAAA;AAAA,MACb,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,MAAA,EAAQ,SAAA;AAAA,MACR,eAAA,EAAiB,mBAAA;AAAA,MACjB,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,OAAA;AAAA,MACP,OAAA,EAAS,SAAA;AAAA,MACT,KAAA,EAAO,OAAA;AAAA,MACP,MAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAU,UAAA;AAAA,MACV,QAAA,EAAU,WAAA;AAAA,MACV,QAAA,EAAU,WAAA;AAAA,MACV,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA,EAAQ,QAAA;AAAA,MACR,aAAA,EAAe,gBAAA;AAAA,MACf,SAAA,EAAW;AAAA,KACb;AAAA,IACA,KAAA,EAAO;AAAA,MACL,eAAA,EAAiB,qBAAA;AAAA,MACjB,WAAA,EAAa;AAAA,KACf;AAAA,IACA,UAAA,EAAY;AAAA,MACV,KAAA,EAAO;AAAA,KACT;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,SAAA;AAAA,MACT,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO,OAAA;AAAA,MACP,OAAA,EAAS,SAAA;AAAA,MACT,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,SAAA;AAAA,MACT,MAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAU,UAAA;AAAA,MACV,OAAA,EAAS,SAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,sBAAA;AAAA,MACT,OAAA,EAAS,8CAAA;AAAA,MACT,OAAA,EAAS,sCAAA;AAAA,MACT,QAAA,EAAU,WAAA;AAAA,MACV,YAAA,EAAc,4BAAA;AAAA,MACd,SAAA,EAAW,2CAAA;AAAA,MACX,WAAA,EAAa,uCAAA;AAAA,MACb,UAAA,EAAY,kCAAA;AAAA,MACZ,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS;AAAA,MACP,MAAA,EAAQ,gBAAA;AAAA,MACR,QAAA,EAAU,kBAAA;AAAA,MACV,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,SAAA;AAAA,MACT,YAAA,EAAc,oBAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACd;AAAA,IACA,OAAA,EAAS;AAAA,MACP,QAAA,EAAU,UAAA;AAAA,MACV,OAAA,EAAS,SAAA;AAAA,MACT,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO,QAAA;AAAA,MACP,MAAA,EAAQ,SAAA;AAAA,MACR,OAAA,EAAS,UAAA;AAAA,MACT,QAAA,EAAU,WAAA;AAAA,MACV,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,KAAA,EAAO;AAAA,MACL,MAAA,EAAQ,cAAA;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,MAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,WAAA,EAAa,WAAA;AAAA,MACb,SAAA,EAAW,kBAAA;AAAA,MACX,cAAA,EAAgB,iBAAA;AAAA,MAChB,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,SAAA,EAAW;AAAA,KACb;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,kBAAA,EAAoB,sBAAA;AAAA,MACpB,aAAA,EAAe,iFAAA;AAAA,MACf,WAAA,EAAa,cAAA;AAAA,MACb,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA,EAAQ,SAAA;AAAA,MACR,QAAA,EAAU,YAAA;AAAA,MACV,cAAA,EAAgB,iBAAA;AAAA,MAChB,WAAA,EAAa,sBAAA;AAAA,MACb,eAAA,EAAiB,iDAAA;AAAA,MACjB,KAAA,EAAO,OAAA;AAAA,MACP,UAAA,EAAY,aAAA;AAAA,MACZ,YAAA,EAAc,yBAAA;AAAA,MACd,YAAA,EAAc,eAAA;AAAA,MACd,YAAA,EAAc,gBAAA;AAAA,MACd,cAAA,EAAgB,iBAAA;AAAA,MAChB,WAAA,EAAa,cAAA;AAAA,MACb,UAAA,EAAY,aAAA;AAAA,MACZ,kBAAA,EAAoB,qBAAA;AAAA,MACpB,cAAA,EAAgB,iBAAA;AAAA,MAChB,cAAA,EAAgB,6EAAA;AAAA,MAChB,gBAAA,EAAkB,0CAAA;AAAA,MAClB,gBAAA,EAAkB,oDAAA;AAAA,MAClB,gBAAA,EAAkB,8DAAA;AAAA,MAClB,kBAAA,EAAoB,yDAAA;AAAA,MACpB,eAAA,EAAiB,2DAAA;AAAA,MACjB,cAAA,EAAgB,kEAAA;AAAA,MAChB,sBAAA,EAAwB,iEAAA;AAAA,MACxB,kBAAA,EAAoB,wDAAA;AAAA,MACpB,gBAAA,EAAkB;AAAA,KACpB;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,mBAAA,EAAqB,sBAAA;AAAA,MACrB,WAAA,EAAa,gDAAA;AAAA,MACb,MAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAQ,SAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACX;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,YAAA,EAAc,yBAAA;AAAA,MACd,YAAA,EAAc,4BAAA;AAAA,MACd,UAAA,EAAY,eAAA;AAAA,MACZ,UAAA,EAAY;AAAA,QACV,KAAA,EAAO,SAAA;AAAA,QACP,QAAA,EAAU;AAAA,UACR,KAAA,EAAO,8BAAA;AAAA,UACP,KAAA,EAAO;AAAA,SACT;AAAA,QACA,WAAA,EAAa;AAAA,UACX,KAAA,EAAO,mBAAA;AAAA,UACP,KAAA,EAAO;AAAA,SACT;AAAA,QACA,MAAA,EAAQ,UAAA;AAAA,QACR,KAAA,EAAO;AAAA,UACL,MAAA,EAAQ,sBAAA;AAAA,UACR,MAAA,EAAQ;AAAA,SACV;AAAA,QACA,OAAA,EAAS;AAAA,UACP,KAAA,EAAO,OAAA;AAAA,UACP,KAAA,EAAO;AAAA;AACT,OACF;AAAA,MACA,GAAA,EAAK;AAAA,QACH,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,mBAAA;AAAA,QACV,MAAA,EAAQ,QAAA;AAAA,QACR,MAAA,EAAQ,aAAA;AAAA,QACR,WAAA,EAAa,cAAA;AAAA,QACb,WAAA,EAAa,cAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW;AAAA,QACT,KAAA,EAAO,2BAAA;AAAA,QACP,QAAA,EAAU;AAAA,UACR,IAAA,EAAM,gDAAA;AAAA,UACN,MAAA,EAAQ;AAAA,SACV;AAAA,QACA,WAAA,EAAa;AAAA,UACX,MAAA,EAAQ;AAAA,SACV;AAAA,QACA,MAAA,EAAQ,QAAA;AAAA,QACR,MAAA,EAAQ;AAAA,UACN,QAAA,EAAU,iBAAA;AAAA,UACV,MAAA,EAAQ;AAAA;AACV,OACF;AAAA,MACA,KAAA,EAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP,KAAA,EAAO,eAAA;AAAA,UACP,MAAA,EAAQ;AAAA,SACV;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,KAAA,EAAO,YAAA;AAAA,UACP,QAAA,EAAU,+CAAA;AAAA,UACV,WAAA,EAAa,4BAAA;AAAA,UACb,aAAA,EAAe,mCAAA;AAAA,UACf,MAAA,EAAQ,YAAA;AAAA,UACR,IAAA,EAAM;AAAA,SACR;AAAA,QACA,QAAA,EAAU;AAAA,UACR,KAAA,EAAO,aAAA;AAAA,UACP,QAAA,EAAU,kCAAA;AAAA,UACV,WAAA,EAAa,iCAAA;AAAA,UACb,OAAA,EAAS,gBAAA;AAAA,UACT,MAAA,EAAQ,QAAA;AAAA,UACR,IAAA,EAAM;AAAA;AACR,OACF;AAAA,MACA,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,wBAAA;AAAA,QACT,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAA,EAAS;AAAA,QACP,EAAA,EAAI;AAAA,OACN;AAAA,MACA,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,sBAAA;AAAA,QACX,aAAA,EAAe,wDAAA;AAAA,QACf,MAAA,EAAQ;AAAA,UACN,mBAAA,EAAqB,qCAAA;AAAA,UACrB,QAAA,EAAU,qBAAA;AAAA,UACV,KAAA,EAAO,sBAAA;AAAA,UACP,OAAA,EAAS;AAAA,SACX;AAAA,QACA,KAAA,EAAO;AAAA,UACL,aAAA,EAAe,sCAAA;AAAA,UACf,qBAAA,EAAuB,4DAAA;AAAA,UACvB,gBAAA,EAAkB,qDAAA;AAAA,UAClB,aAAA,EAAe,0EAAA;AAAA,UACf,kBAAA,EAAoB,mGAAA;AAAA,UACpB,yBAAA,EAA2B,gDAAA;AAAA,UAC3B,gBAAA,EAAkB,mDAAA;AAAA,UAClB,gBAAA,EAAkB,oFAAA;AAAA,UAClB,YAAA,EAAc,wDAAA;AAAA,UACd,oBAAA,EAAsB,kEAAA;AAAA,UACtB,SAAA,EAAW,wBAAA;AAAA,UACX,OAAA,EAAS;AAAA;AACX,OACF;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,OAAA,EAAS,SAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACX;AAAA,MACA,GAAA,EAAK;AAAA,QACH,YAAA,EAAc;AAAA;AAChB,KACF;AAAA,IACA,GAAA,EAAK;AAAA,MACH,eAAA,EAAiB,oBAAA;AAAA,MACjB,UAAA,EAAY,aAAA;AAAA,MACZ,aAAA,EAAe,kBAAA;AAAA,MACf,eAAA,EAAiB,4BAAA;AAAA,MACjB,YAAA,EAAc,gBAAA;AAAA,MACd,UAAA,EAAY,eAAA;AAAA,MACZ,OAAA,EAAS,SAAA;AAAA,MACT,OAAA,EAAS,UAAA;AAAA,MACT,QAAA,EAAU,oBAAA;AAAA,MACV,cAAA,EAAgB,0EAAA;AAAA,MAChB,aAAA,EAAe,WAAA;AAAA,MACf,YAAA,EAAc,yBAAA;AAAA,MACd,aAAA,EAAe,cAAA;AAAA,MACf,YAAA,EAAc,sBAAA;AAAA,MACd,aAAA,EAAe,SAAA;AAAA,MACf,YAAA,EAAc,wBAAA;AAAA,MACd,KAAA,EAAO,QAAA;AAAA,MACP,YAAA,EAAc,wBAAA;AAAA,MACd,kBAAA,EAAoB,kEAAA;AAAA,MACpB,iBAAA,EAAmB,+FAAA;AAAA,MACnB,UAAA,EAAY,8EAAA;AAAA,MACZ,kBAAA,EAAoB,0EAAA;AAAA,MACpB,kBAAA,EAAoB,mBAAA;AAAA,MACpB,iBAAA,EAAmB,mDAAA;AAAA,MACnB,kBAAA,EAAoB,eAAA;AAAA,MACpB,iBAAA,EAAmB,qCAAA;AAAA,MACnB,kBAAA,EAAoB,SAAA;AAAA,MACpB,iBAAA,EAAmB,qCAAA;AAAA,MACnB,iBAAA,EAAmB,WAAA;AAAA,MACnB,gBAAA,EAAkB,qCAAA;AAAA,MAClB,iBAAA,EAAmB,qBAAA;AAAA,MACnB,gBAAA,EAAkB,4CAAA;AAAA,MAClB,iBAAA,EAAmB,SAAA;AAAA,MACnB,gBAAA,EAAkB,iCAAA;AAAA,MAClB,gBAAA,EAAkB,iBAAA;AAAA,MAClB,eAAA,EAAiB,yCAAA;AAAA,MACjB,gBAAA,EAAkB,sBAAA;AAAA,MAClB,eAAA,EAAiB,+DAAA;AAAA,MACjB,iBAAA,EAAmB,mBAAA;AAAA,MACnB,gBAAA,EAAkB,sCAAA;AAAA,MAClB,iBAAA,EAAmB,aAAA;AAAA,MACnB,gBAAA,EAAkB,uCAAA;AAAA,MAClB,iBAAA,EAAmB,SAAA;AAAA,MACnB,gBAAA,EAAkB,iCAAA;AAAA,MAClB,KAAA,EAAO;AAAA,KACT;AAAA,IACA,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,SAAA;AAAA,MACP,OAAA,EAAS,SAAA;AAAA,MACT,YAAA,EAAc,sBAAA;AAAA,MACd,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,UAAA;AAAA,MACV,OAAA,EAAS,SAAA;AAAA,MACT,KAAA,EAAO,OAAA;AAAA,MACP,SAAA,EAAW,YAAA;AAAA,MACX,QAAA,EAAU,WAAA;AAAA,MACV,OAAA,EAAS,SAAA;AAAA,MACT,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,OAAA;AAAA,MACP,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA,EAAc,gBAAA;AAAA,MACd,WAAA,EAAa,eAAA;AAAA,MACb,QAAA,EAAU,kBAAA;AAAA,MACV,UAAA,EAAY,aAAA;AAAA,MACZ,WAAA,EAAa,cAAA;AAAA,MACb,EAAA,EAAI,IAAA;AAAA,MACJ,GAAA,EAAK,KAAA;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ,QAAA;AAAA,MACR,OAAA,EAAS,UAAA;AAAA,MACT,aAAA,EAAe,gBAAA;AAAA,MACf,QAAA,EAAU,aAAA;AAAA,MACV,aAAA,EAAe,2BAAA;AAAA,MACf,gBAAA,EAAkB,sCAAA;AAAA,MAClB,iBAAA,EAAmB,gCAAA;AAAA,MACnB,SAAA,EAAW,QAAA;AAAA,MACX,MAAA,EAAQ,QAAA;AAAA,MACR,YAAA,EAAc,eAAA;AAAA,MACd,WAAA,EAAa,qBAAA;AAAA,MACb,UAAA,EAAY,eAAA;AAAA,MACZ,cAAA,EAAgB,iBAAA;AAAA,MAChB,aAAA,EAAe,gBAAA;AAAA,MACf,cAAA,EAAgB,kBAAA;AAAA,MAChB,oBAAA,EAAsB,yBAAA;AAAA,MACtB,eAAA,EAAiB,6BAAA;AAAA,MACjB,YAAA,EAAc,iCAAA;AAAA,MACd,gBAAA,EAAkB,mBAAA;AAAA,MAClB,WAAA,EAAa,qCAAA;AAAA,MACb,kBAAA,EAAoB,gBAAA;AAAA,MACpB,iBAAA,EAAmB,yEAAA;AAAA,MACnB,aAAA,EAAe,yBAAA;AAAA,MACf,gBAAA,EAAkB;AAAA;AACpB,GACF;AAAA,EACA,GAAA,EAAK;AAAA,IACH,MAAA,EAAQ;AAAA,MACN,YAAA,EAAc,eAAA;AAAA,MACd,gBAAA,EAAkB,mBAAA;AAAA,MAClB,cAAA,EAAgB,mBAAA;AAAA,MAChB,iBAAA,EAAmB,uBAAA;AAAA,MACnB,eAAA,EAAiB,8BAAA;AAAA,MACjB,WAAA,EAAa;AAAA,KACf;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,UAAA,EAAY,eAAA;AAAA,MACZ,SAAA,EAAW,WAAA;AAAA,MACX,YAAA,EAAc,cAAA;AAAA,MACd,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,OAAA,EAAS,kCAAA;AAAA,MACT,OAAA,EAAS,QAAA;AAAA,MACT,MAAA,EAAQ;AAAA;AACV,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,QAAA,EAAU,WAAA;AAAA,MACV,SAAA,EAAW;AAAA,KACb;AAAA,IACA,OAAA,EAAS;AAAA,MACP,KAAA,EAAO,SAAA;AAAA,MACP,WAAA,EAAa;AAAA,KACf;AAAA,IACA,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,kBAAA;AAAA,MACT,YAAA,EAAc,sBAAA;AAAA,MACd,MAAA,EAAQ,SAAA;AAAA,MACR,OAAA,EAAS,UAAA;AAAA,MACT,SAAA,EAAW,aAAA;AAAA,MACX,cAAA,EAAgB,iBAAA;AAAA,MAChB,YAAA,EAAc,eAAA;AAAA,MACd,MAAA,EAAQ,eAAA;AAAA,MACR,UAAA,EAAY;AAAA,KACd;AAAA,IACA,OAAA,EAAS;AAAA,MACP,QAAA,EAAU,qBAAA;AAAA,MACV,QAAA,EAAU,gBAAA;AAAA,MACV,QAAA,EAAU,gBAAA;AAAA,MACV,IAAA,EAAM,YAAA;AAAA,MACN,KAAA,EAAO,gBAAA;AAAA,MACP,QAAA,EAAU,gBAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACT;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,YAAA;AAAA,MACN,UAAA,EAAY,YAAA;AAAA,MACZ,WAAA,EAAa;AAAA,KACf;AAAA,IACA,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM,gBAAA;AAAA,MACN,OAAA,EAAS,mBAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAAA,IACA,QAAA,EAAU;AAAA,MACR,gBAAA,EAAkB,mBAAA;AAAA,MAClB,OAAA,EAAS,UAAA;AAAA,MACT,YAAA,EAAc,gBAAA;AAAA,MACd,OAAA,EAAS;AAAA,KACX;AAAA,IACA,OAAA,EAAS;AAAA,MACP,QAAA,EAAU,UAAA;AAAA,MACV,UAAA,EAAY,4BAAA;AAAA,MACZ,QAAA,EAAU,UAAA;AAAA,MACV,QAAA,EAAU,UAAA;AAAA,MACV,eAAA,EAAiB,qBAAA;AAAA,MACjB,GAAA,EAAK,KAAA;AAAA,MACL,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM,MAAA;AAAA,MACN,WAAA,EAAa,aAAA;AAAA,MACb,UAAA,EAAY,YAAA;AAAA,MACZ,QAAA,EAAU,UAAA;AAAA,MACV,IAAA,EAAM,MAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO;AAAA,KACT;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,MAAA;AAAA,MACV,IAAA,EAAM,MAAA;AAAA,MACN,MAAA,EAAQ,QAAA;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,QAAA,EAAU,sCAAA;AAAA,MACV,QAAA,EAAU,iBAAA;AAAA,MACV,OAAA,EAAS,uBAAA;AAAA,MACT,SAAA,EAAW,cAAA;AAAA,MACX,QAAA,EAAU,UAAA;AAAA,MACV,MAAA,EAAQ,QAAA;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,MAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAQ,QAAA;AAAA,MACR,OAAA,EAAS;AAAA;AACX;AAEJ;;;ACvhBO,SAAS,WAAA,CACd,UACA,MAAA,EACQ;AACR,EAAA,IAAI,CAAC,QAAQ,OAAO,QAAA;AAEpB,EAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,YAAA,EAAc,CAAC,OAAO,GAAA,KAAQ;AACpD,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,OAAO,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IAC3B;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA;AACH;;;ACfA,SAAS,SAAA,CAAU,QAAmB,MAAA,EAA8B;AAClE,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,MAAA,EAAO;AAE3B,EAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,IAAA,IAAI,OAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,GAAG,CAAA,EAAG;AACrD,MAAA,MAAM,WAAA,GAAc,OAAO,GAAG,CAAA;AAC9B,MAAA,MAAM,WAAA,GAAc,OAAO,GAAG,CAAA;AAE9B,MAAA,IACE,gBAAgB,IAAA,IAChB,OAAO,gBAAgB,QAAA,IACvB,CAAC,MAAM,OAAA,CAAQ,WAAW,KAC1B,WAAA,KAAgB,IAAA,IAChB,OAAO,WAAA,KAAgB,QAAA,IACvB,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAC1B;AAEA,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,SAAA;AAAA,UACZ,WAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,CAAA,MAAA,IAAW,gBAAgB,MAAA,EAAW;AAEpC,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,WAAA;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAuBO,SAAS,iBAAA,CACd,MACA,SAAA,EACsB;AACtB,EAAA,OAAO,SAAA;AAAA,IACL,IAAA;AAAA,IACA;AAAA,GACF;AACF;AAYO,SAAS,kBAAA,CACd,SACG,SAAA,EACe;AAClB,EAAA,OAAO,SAAA,CAAU,MAAA;AAAA,IACf,CAAC,GAAA,EAAK,QAAA,KAAa,iBAAA,CAAkB,KAAK,QAAQ,CAAA;AAAA,IAClD;AAAA,GACF;AACF;;;AChFO,SAAS,cAAA,CACd,KACA,IAAA,EACoB;AACpB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC3B,EAAA,IAAI,OAAA,GAAmB,GAAA;AAEvB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,MAAA,EAAW;AAC7C,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAA,GAAW,QAAoC,GAAG,CAAA;AAAA,EACpD;AAEA,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;ACbA,IAAM,WAAA,GAAoB,oBAAuC,IAAI,CAAA;AAKrE,IAAM,mBAAA,GAAwC,EAAA;AAqCvC,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA;AAAA,EACA,QAAQ,aAAA,GAAgB,IAAA;AAAA,EACxB,YAAA,EAAc,mBAAA;AAAA,EACd,eAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,CAAC,MAAA,EAAQ,cAAc,CAAA,GAAU,eAAqB,aAAa,CAAA;AAGzE,EAAA,MAAM,YAAA,GAAqB,cAA0B,MAAM;AAEzD,IAAA,IAAI,eAAA,IAAmB,eAAA,CAAgB,MAAM,CAAA,EAAG;AAC9C,MAAA,MAAM,kBAAA,GAAqB,gBAAgB,MAAM,CAAA;AAEjD,MAAA,OAAO,iBAAA,CAAkB,qBAAqB,kBAAkB,CAAA;AAAA,IAClE;AAGA,IAAA,IAAI,mBAAA,EAAqB;AACvB,MAAA,OAAO,iBAAA;AAAA,QACL,mBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAGA,IAAA,OAAO,mBAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAA,EAAQ,eAAA,EAAiB,mBAAmB,CAAC,CAAA;AAGjD,EAAA,MAAM,CAAA,GAAU,KAAA,CAAA,WAAA;AAAA,IACd,CAAC,KAAa,MAAA,KAAqD;AACjE,MAAA,MAAMA,MAAAA,GAAQ,cAAA;AAAA,QACZ,YAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAIA,WAAU,MAAA,EAAW;AAEvB,QAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,QAAA,CAAS,aAAa,WAAA,EAAa;AAC7E,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,iCAAA,EAAoC,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,QACzD;AAEA,QAAA,OAAO,GAAA;AAAA,MACT;AAEA,MAAA,OAAO,WAAA,CAAYA,QAAO,MAAM,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAGA,EAAA,MAAM,SAAA,GAAkB,KAAA,CAAA,WAAA;AAAA,IACtB,CAAC,SAAA,KAA0B;AACzB,MAAA,cAAA,CAAe,SAAS,CAAA;AACxB,MAAA,cAAA,GAAiB,SAAS,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AAQA,EAAM,gBAAU,MAAM;AACpB,IAAA,cAAA,CAAe,CAAC,OAAA,KAAa,OAAA,KAAY,aAAA,GAAgB,UAAU,aAAc,CAAA;AAAA,EACnF,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,MAAM,KAAA,GAAc,KAAA,CAAA,OAAA;AAAA,IAClB,OAAO;AAAA,MACL,MAAA;AAAA,MACA,YAAA;AAAA,MACA,CAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,YAAA,EAAc,CAAA,EAAG,SAAS;AAAA,GACrC;AAEA,EAAA,uBAAO,GAAA,CAAC,WAAA,CAAY,QAAA,EAAZ,EAAqB,OAAe,QAAA,EAAS,CAAA;AACvD;AAkBO,SAAS,OAAA,GAA4B;AAC1C,EAAA,MAAM,OAAA,GAAgB,iBAAW,WAAW,CAAA;AAE5C,EAAA,IAAI,CAAC,OAAA,EAAS;AAGZ,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,IAAA;AAAA,MACR,YAAA,EAAc,mBAAA;AAAA,MACd,CAAA,EAAG,CAAC,GAAA,EAAa,MAAA,KAA6C;AAC5D,QAAA,MAAM,KAAA,GAAQ,cAAA;AAAA,UACZ,mBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,KAAA,KAAU,QAAW,OAAO,GAAA;AAChC,QAAA,OAAO,WAAA,CAAY,OAAO,MAAM,CAAA;AAAA,MAClC,CAAA;AAAA,MACA,WAAW,MAAM;AACf,QAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,QAAA,CAAS,aAAa,WAAA,EAAa;AAC7E,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN;AAAA,WACF;AAAA,QACF;AAAA,MACF;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAYO,SAAS,cAAA,GAAiB;AAC/B,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,OAAO,CAAA;AACT;AAWO,SAAS,SAAA,GAAwB;AACtC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,OAAA,EAAQ;AAC3B,EAAA,OAAO,MAAA;AACT;AASO,SAAS,iBAAA,GAAuC;AACrD,EAAA,MAAM,OAAA,GAAgB,iBAAW,WAAW,CAAA;AAC5C,EAAA,OAAO,SAAS,MAAA,IAAU,IAAA;AAC5B;AAaO,IAAM,IAAA,GAAO;AA+Bb,SAAS,SAAA,GAGJ;AACV,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,OAAA,EAAQ;AACtB,EAAA,OAAO,CAAA;AAIT;AAiBO,SAAS,IAAA,CACd,KACA,MAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,cAAA;AAAA,IACZ,mBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,GAAA;AAChC,EAAA,OAAO,WAAA,CAAY,OAAO,MAAM,CAAA;AAClC","file":"chunk-WGTVO2XB.mjs","sourcesContent":["import type { I18nTranslations } from '../types'\n\n/**\n * English translations (default)\n */\nexport const en: I18nTranslations = {\n ui: {\n select: {\n placeholder: \"Select option...\",\n search: \"Search...\",\n noResults: \"No results found.\",\n selectAll: \"Select all\",\n clearAll: \"Clear all\",\n moreItems: \"+{count} more\",\n loading: \"Loading...\",\n },\n pagination: {\n previous: \"Previous\",\n next: \"Next\",\n first: \"First\",\n last: \"Last\",\n page: \"Page {page}\",\n of: \"of {total}\",\n showing: \"{from}-{to} of {total}\",\n },\n dialog: {\n close: \"Close\",\n confirm: \"Confirm\",\n cancel: \"Cancel\",\n ok: \"OK\",\n yes: \"Yes\",\n no: \"No\",\n delete: \"Delete\",\n save: \"Save\",\n discard: \"Discard\",\n alertTitle: \"Notice\",\n confirmTitle: \"Confirm\",\n confirmDelete: \"Are you sure you want to delete this?\",\n promptTitle: \"Input Required\",\n promptPlaceholder: \"Enter value...\",\n },\n form: {\n submit: \"Submit\",\n cancel: \"Cancel\",\n save: \"Save\",\n delete: \"Delete\",\n edit: \"Edit\",\n create: \"Create\",\n update: \"Update\",\n reset: \"Reset\",\n clear: \"Clear\",\n loading: \"Loading...\",\n saving: \"Saving...\",\n deleting: \"Deleting...\",\n required: \"This field is required\",\n optional: \"Optional\",\n minLength: \"{min} characters minimum\",\n maxLength: \"{max} characters maximum\",\n invalidEmail: \"Please enter a valid email address\",\n invalidUrl: \"Please enter a valid URL\",\n invalidPhone: \"Please enter a valid phone number\",\n passwordMismatch: \"Passwords do not match\",\n },\n datetime: {\n today: \"Today\",\n yesterday: \"Yesterday\",\n tomorrow: \"Tomorrow\",\n now: \"Just now\",\n secondsAgo: \"{count} seconds ago\",\n minutesAgo: \"{count} minutes ago\",\n hoursAgo: \"{count} hours ago\",\n daysAgo: \"{count} days ago\",\n pickDate: \"Pick a date\",\n pickTime: \"Pick a time\",\n pickDateTime: \"Pick date and time\",\n pickDateRange: \"Pick a date range\",\n },\n file: {\n upload: \"Upload\",\n uploading: \"Uploading...\",\n dragDrop: \"Drag and drop files here\",\n browse: \"Browse files\",\n remove: \"Remove\",\n maxSize: \"Max size: {size}\",\n invalidType: \"Invalid file type\",\n tooLarge: \"File is too large\",\n },\n table: {\n noData: \"No data available\",\n loading: \"Loading data...\",\n showing: \"Showing {from}-{to} of {total}\",\n rowsPerPage: \"Rows per page\",\n sortAsc: \"Sort ascending\",\n sortDesc: \"Sort descending\",\n filter: \"Filter\",\n clearFilters: \"Clear filters\",\n selectAll: \"Select all\",\n deselectAll: \"Deselect all\",\n selected: \"{count} selected\",\n },\n actions: {\n view: \"View\",\n copy: \"Copy\",\n copied: \"Copied!\",\n copyToClipboard: \"Copy to clipboard\",\n download: \"Download\",\n share: \"Share\",\n refresh: \"Refresh\",\n retry: \"Retry\",\n expand: \"Expand\",\n collapse: \"Collapse\",\n showMore: \"Show more\",\n showLess: \"Show less\",\n seeAll: \"See all\",\n goBack: \"Go back\",\n remove: \"Remove\",\n previousSlide: \"Previous slide\",\n nextSlide: \"Next slide\",\n },\n phone: {\n searchCountries: \"Search countries...\",\n noCountries: \"No countries found\",\n },\n navigation: {\n title: \"Navigation\",\n },\n states: {\n loading: \"Loading\",\n empty: \"Empty\",\n error: \"Error\",\n success: \"Success\",\n warning: \"Warning\",\n info: \"Info\",\n pending: \"Pending\",\n active: \"Active\",\n inactive: \"Inactive\",\n enabled: \"Enabled\",\n disabled: \"Disabled\",\n },\n errors: {\n generic: \"Something went wrong\",\n network: \"Network error. Please check your connection.\",\n timeout: \"Request timed out. Please try again.\",\n notFound: \"Not found\",\n unauthorized: \"Please sign in to continue\",\n forbidden: \"You do not have permission to access this\",\n serverError: \"Server error. Please try again later.\",\n validation: \"Please check the form for errors\",\n unknown: \"An unknown error occurred\",\n },\n },\n layouts: {\n sidebar: {\n toggle: \"Toggle sidebar\",\n collapse: \"Collapse sidebar\",\n expand: \"Expand sidebar\",\n },\n navigation: {\n menu: \"Menu\",\n home: \"Home\",\n back: \"Back\",\n forward: \"Forward\",\n toggleMobile: \"Toggle mobile menu\",\n breadcrumb: \"Breadcrumb\",\n },\n profile: {\n settings: \"Settings\",\n account: \"Account\",\n logout: \"Log out\",\n login: \"Log in\",\n signUp: \"Sign up\",\n signOut: \"Sign Out\",\n userMenu: \"User menu\",\n language: \"Language\",\n },\n theme: {\n toggle: \"Toggle theme\",\n light: \"Light\",\n dark: \"Dark\",\n system: \"System\",\n },\n search: {\n placeholder: \"Search...\",\n noResults: \"No results found\",\n recentSearches: \"Recent searches\",\n clearHistory: \"Clear history\",\n },\n mobile: {\n closeMenu: \"Close menu\",\n },\n errors: {\n somethingWentWrong: \"Something went wrong\",\n tryRefreshing: \"We're sorry, but something unexpected happened. Please try refreshing the page.\",\n refreshPage: \"Refresh Page\",\n goBack: \"Go Back\",\n goHome: \"Go Home\",\n needHelp: \"Need help?\",\n contactSupport: \"Contact support\",\n checkStatus: \"Check service status\",\n persistsContact: \"If the problem persists, please contact {email}\",\n error: \"Error\",\n badRequest: \"Bad Request\",\n authRequired: \"Authentication Required\",\n accessDenied: \"Access Denied\",\n pageNotFound: \"Page Not Found\",\n requestTimeout: \"Request Timeout\",\n serverError: \"Server Error\",\n badGateway: \"Bad Gateway\",\n serviceUnavailable: \"Service Unavailable\",\n gatewayTimeout: \"Gateway Timeout\",\n badRequestDesc: \"The request could not be understood. Please check your input and try again.\",\n authRequiredDesc: \"You need to sign in to access this page.\",\n accessDeniedDesc: \"You don't have permission to access this resource.\",\n pageNotFoundDesc: \"The page you're looking for doesn't exist or has been moved.\",\n requestTimeoutDesc: \"The request took too long to process. Please try again.\",\n serverErrorDesc: \"Something went wrong on our end. We're working to fix it.\",\n badGatewayDesc: \"The server received an invalid response. Please try again later.\",\n serviceUnavailableDesc: \"The service is temporarily unavailable. Please try again later.\",\n gatewayTimeoutDesc: \"The server took too long to respond. Please try again.\",\n unknownErrorDesc: \"An unexpected error occurred. Please try again or contact support.\",\n },\n push: {\n enableNotifications: \"Enable notifications\",\n stayUpdated: \"Stay updated with important updates and alerts\",\n enable: \"Enable\",\n notNow: \"Not now\",\n dismiss: \"Dismiss\",\n },\n auth: {\n authRequired: \"Authentication Required\",\n pleaseSignIn: \"Please sign in to continue\",\n goToSignIn: \"Go to Sign In\",\n identifier: {\n title: \"Sign in\",\n subtitle: {\n email: \"Enter your email to continue\",\n phone: \"Enter your phone number to continue\",\n },\n placeholder: {\n email: \"email@example.com\",\n phone: \"Enter your phone number\",\n },\n button: \"Continue\",\n oauth: {\n github: \"Continue with GitHub\",\n google: \"Continue with Google\",\n },\n channel: {\n email: \"Email\",\n phone: \"Phone\",\n },\n },\n otp: {\n title: \"Enter code\",\n subtitle: \"We sent a code to\",\n button: \"Verify\",\n resend: \"Resend code\",\n changeEmail: \"Change email\",\n changePhone: \"Change phone\",\n openMailbox: \"Open {provider}\",\n },\n twoFactor: {\n title: \"Two-factor authentication\",\n subtitle: {\n totp: \"Enter the 6-digit code from your authenticator\",\n backup: \"Enter one of your backup codes\",\n },\n placeholder: {\n backup: \"XXXXXXXX\",\n },\n button: \"Verify\",\n toggle: {\n toBackup: \"Use backup code\",\n toTotp: \"Use authenticator app\",\n },\n },\n setup: {\n loading: {\n title: \"Setting up...\",\n button: \"Loading\",\n },\n qrCode: {\n title: \"Set up 2FA\",\n subtitle: \"Scan this QR code with your authenticator app\",\n manualEntry: \"Can't scan? Enter manually\",\n confirmPrompt: \"Enter the 6-digit code to confirm\",\n button: \"Enable 2FA\",\n skip: \"Skip for now\",\n },\n complete: {\n title: \"2FA enabled\",\n subtitle: \"Save these backup codes securely\",\n instruction: \"Each code can only be used once\",\n copyAll: \"Copy all codes\",\n copied: \"Copied\",\n done: \"Done\",\n },\n },\n success: {\n message: \"Signed in successfully\",\n redirecting: \"Taking you in…\",\n },\n divider: {\n or: \"or\",\n },\n oauth: {\n signingIn: \"Signing you in…\",\n signingInBody: \"Please wait while we complete your {provider} sign-in.\",\n notice: {\n linkNotAllowedTitle: \"Use the email code for this address\",\n useEmail: \"Continue with email\",\n retry: \"Try {provider} again\",\n dismiss: \"Dismiss\",\n },\n error: {\n invalid_state: \"The sign-in link expired. Try again.\",\n oauth_exchange_failed: \"The provider did not accept the sign-in. Please try again.\",\n invalid_id_token: \"We could not verify your sign-in. Please try again.\",\n email_missing: \"The provider did not share an email address. Try another sign-in method.\",\n email_not_verified: \"The provider has not verified your email address. Verify it there, or use another sign-in method.\",\n hosted_domain_not_allowed: \"Accounts from this domain cannot sign in here.\",\n account_inactive: \"This account is disabled. Please contact support.\",\n link_not_allowed: \"{provider} sign-in is not available for this account. Get a code by email instead.\",\n rate_limited: \"Too many attempts. Please wait a moment and try again.\",\n provider_unavailable: \"The provider is unavailable right now. Please try again shortly.\",\n cancelled: \"Sign-in was cancelled.\",\n generic: \"Could not sign in. Try again or use email.\",\n },\n },\n footer: {\n terms: \"Terms\",\n privacy: \"Privacy\",\n support: \"Support\",\n },\n dev: {\n anyCodeWorks: \"Dev Mode: Any code works\",\n },\n },\n pwa: {\n addToHomeScreen: \"Add to Home Screen\",\n installApp: \"Install App\",\n tapToLearnHow: \"Tap to learn how\",\n clickToSeeGuide: \"Click to see desktop guide\",\n tapToInstall: \"Tap to install\",\n installing: \"Installing...\",\n dismiss: \"Dismiss\",\n appLogo: \"App logo\",\n iosTitle: \"Add to Home Screen\",\n iosDescription: \"Install this app on your iPhone for quick access and a better experience\",\n iosStep1Title: \"Tap Share\",\n iosStep1Desc: \"At the bottom of Safari\",\n iosStep2Title: \"Scroll & Tap\",\n iosStep2Desc: \"\\\"Add to Home Screen\\\"\",\n iosStep3Title: \"Confirm\",\n iosStep3Desc: \"Tap \\\"Add\\\" in top-right\",\n gotIt: \"Got It\",\n desktopTitle: \"Install App on Desktop\",\n desktopDescription: \"Install this app on {browser} for quick access from your desktop\",\n desktopDescSafari: \"Safari on macOS has limited PWA support. For the best experience, use Chrome, Edge, or Brave.\",\n desktopTip: \"You can also right-click the page and look for \\\"Install\\\" option in {browser}\",\n desktopFirefoxNote: \"Firefox has limited PWA support. Some features may not work as expected.\",\n chromiumStep1Title: \"Find Install Icon\",\n chromiumStep1Desc: \"Look for install icon in address bar (right side)\",\n chromiumStep2Title: \"Click Install\",\n chromiumStep2Desc: \"Click the icon and select \\\"Install\\\"\",\n chromiumStep3Title: \"Confirm\",\n chromiumStep3Desc: \"Click \\\"Install\\\" in the popup dialog\",\n firefoxStep1Title: \"Open Menu\",\n firefoxStep1Desc: \"Click the menu button (three lines)\",\n firefoxStep2Title: \"Find Install Option\",\n firefoxStep2Desc: \"Look for \\\"Install\\\" or \\\"Add to Home Screen\\\"\",\n firefoxStep3Title: \"Confirm\",\n firefoxStep3Desc: \"Follow the installation prompts\",\n safariStep1Title: \"Limited Support\",\n safariStep1Desc: \"Safari on macOS has limited PWA support\",\n safariStep2Title: \"Use Chromium Browser\",\n safariStep2Desc: \"Consider using Chrome, Edge, or Brave for full PWA experience\",\n unknownStep1Title: \"Check Address Bar\",\n unknownStep1Desc: \"Look for an install or download icon\",\n unknownStep2Title: \"Or Use Menu\",\n unknownStep2Desc: \"Check browser menu for install option\",\n unknownStep3Title: \"Confirm\",\n unknownStep3Desc: \"Follow the installation prompts\",\n close: \"Close\",\n },\n profilePage: {\n title: \"Profile\",\n account: \"Account\",\n personalInfo: \"Personal Information\",\n work: \"Work\",\n security: \"Security\",\n actions: \"Actions\",\n email: \"Email\",\n firstName: \"First Name\",\n lastName: \"Last Name\",\n company: \"Company\",\n position: \"Position\",\n phone: \"Phone\",\n notSet: \"Not set\",\n addFirstName: \"Add first name\",\n addLastName: \"Add last name\",\n addPhone: \"Add phone number\",\n addCompany: \"Add company\",\n addPosition: \"Add position\",\n on: \"On\",\n off: \"Off\",\n save: \"Save\",\n saving: \"Saving...\",\n cancel: \"Cancel\",\n signOut: \"Sign Out\",\n deleteAccount: \"Delete Account\",\n deleting: \"Deleting...\",\n twoFactorAuth: \"Two-Factor Authentication\",\n twoFactorEnabled: \"Two-factor authentication is enabled\",\n twoFactorDisabled: \"Add an extra layer of security\",\n enable2FA: \"Enable\",\n avatar: \"Avatar\",\n changeAvatar: \"Change avatar\",\n memberSince: \"Member since {date}\",\n enterField: \"Enter {field}\",\n profileUpdated: \"Profile updated\",\n avatarUpdated: \"Avatar updated\",\n failedToUpdate: \"Failed to update\",\n failedToUploadAvatar: \"Failed to upload avatar\",\n selectImageFile: \"Please select an image file\",\n fileTooLarge: \"File size must be less than 5MB\",\n notAuthenticated: \"Not Authenticated\",\n pleaseLogIn: \"Please log in to view your profile.\",\n deleteAccountTitle: \"Delete Account\",\n deleteAccountDesc: \"This action cannot be undone. Your account will be permanently deleted.\",\n typeToConfirm: \"Type {word} to confirm:\",\n confirmationWord: \"DELETE\",\n },\n },\n api: {\n errors: {\n networkError: \"Network error\",\n connectionFailed: \"Connection failed\",\n requestTimeout: \"Request timed out\",\n serverUnavailable: \"Server is unavailable\",\n invalidResponse: \"Invalid response from server\",\n rateLimited: \"Too many requests. Please wait.\",\n },\n status: {\n connecting: \"Connecting...\",\n connected: \"Connected\",\n disconnected: \"Disconnected\",\n reconnecting: \"Reconnecting...\",\n },\n logout: {\n title: \"Logout\",\n message: \"Are you sure you want to logout?\",\n confirm: \"Logout\",\n cancel: \"Cancel\",\n },\n },\n tools: {\n code: {\n copyCode: \"Copy code\",\n noContent: \"No content available\",\n },\n diagram: {\n title: \"Diagram\",\n clickToView: \"Click to view fullscreen\",\n },\n image: {\n noImage: \"No image content\",\n failedToLoad: \"Failed to load image\",\n zoomIn: \"Zoom in\",\n zoomOut: \"Zoom out\",\n fitToView: \"Fit to view\",\n flipHorizontal: \"Flip horizontal\",\n flipVertical: \"Flip vertical\",\n rotate: \"Rotate 90°\",\n fullscreen: \"Open in fullscreen\",\n },\n gallery: {\n noImages: \"No images available\",\n lightbox: \"Image lightbox\",\n previous: \"Previous image\",\n next: \"Next image\",\n close: \"Close lightbox\",\n download: \"Download image\",\n share: \"Share image\",\n },\n video: {\n play: \"Play video\",\n fullscreen: \"Fullscreen\",\n unavailable: \"Video unavailable\",\n },\n audio: {\n restart: \"Restart\",\n back: \"Back 5 seconds\",\n forward: \"Forward 5 seconds\",\n volume: \"Volume\",\n },\n color: {\n pick: \"Pick color\",\n },\n jsonForm: {\n validationErrors: \"Validation Errors\",\n addItem: \"Add Item\",\n addFirstItem: \"Add First Item\",\n noItems: \"No items added yet.\",\n },\n openapi: {\n response: \"Response\",\n noResponse: \"No response body available\",\n required: \"Required\",\n optional: \"Optional\",\n searchEndpoints: \"Search endpoints...\",\n all: \"All\",\n methods: \"Methods\",\n path: \"Path\",\n description: \"Description\",\n navigation: \"Navigation\",\n previous: \"Previous\",\n next: \"Next\",\n bearerToken: \"Enter Bearer token (optional, uses JWT if empty)\",\n },\n form: {\n title: \"Form\",\n },\n tour: {\n next: \"Next\",\n previous: \"Back\",\n skip: \"Skip\",\n finish: \"Finish\",\n close: \"Close\",\n stepOf: \"Step {current} of {total}\",\n },\n upload: {\n dragDrop: \"Drag & drop files or click to browse\",\n dropHere: \"Drop files here\",\n maxSize: \"Max {size}MB per file\",\n uploading: \"Uploading...\",\n uploaded: \"Uploaded\",\n failed: \"Failed\",\n retry: \"Retry\",\n remove: \"Remove\",\n cancel: \"Cancel\",\n paused: \"Paused\",\n pending: \"Pending\",\n },\n },\n}\n","/**\n * Interpolate variables in a translation string\n *\n * @example\n * interpolate(\"Hello, {name}!\", { name: \"World\" })\n * // => \"Hello, World!\"\n *\n * interpolate(\"+{count} more\", { count: 5 })\n * // => \"+5 more\"\n */\nexport function interpolate(\n template: string,\n params?: Record<string, string | number>\n): string {\n if (!params) return template\n\n return template.replace(/\\{(\\w+)\\}/g, (match, key) => {\n if (key in params) {\n return String(params[key])\n }\n return match\n })\n}\n","import type { I18nTranslations, PartialTranslations } from '../types'\n\ntype AnyObject = { [key: string]: unknown }\n\n/**\n * Deep merge two objects\n */\nfunction deepMerge(target: AnyObject, source: AnyObject): AnyObject {\n const result = { ...target }\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key]\n const targetValue = result[key]\n\n if (\n sourceValue !== null &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n targetValue !== null &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue)\n ) {\n // Recursively merge objects\n result[key] = deepMerge(\n targetValue as AnyObject,\n sourceValue as AnyObject\n )\n } else if (sourceValue !== undefined) {\n // Override with source value\n result[key] = sourceValue\n }\n }\n }\n\n return result\n}\n\n/**\n * Merge base translations with partial overrides or additional namespaces\n *\n * @example\n * // Override existing keys\n * const customRu = mergeTranslations(ru, {\n * ui: {\n * select: {\n * placeholder: 'Выберите марку авто...'\n * }\n * }\n * })\n *\n * @example\n * // Add app-specific namespace\n * const appTranslations = mergeTranslations(en, {\n * hub: {\n * nav: { home: 'Home' }\n * }\n * })\n */\nexport function mergeTranslations<T extends Record<string, unknown> = Record<string, unknown>>(\n base: I18nTranslations,\n overrides: PartialTranslations | T\n): I18nTranslations & T {\n return deepMerge(\n base as unknown as AnyObject,\n overrides as unknown as AnyObject\n ) as unknown as I18nTranslations & T\n}\n\n/**\n * Create translations from multiple partial sources\n *\n * @example\n * const translations = createTranslations(\n * en, // base\n * uiOverrides, // UI customizations\n * appStrings // App-specific strings\n * )\n */\nexport function createTranslations(\n base: I18nTranslations,\n ...overrides: PartialTranslations[]\n): I18nTranslations {\n return overrides.reduce<I18nTranslations>(\n (acc, override) => mergeTranslations(acc, override),\n base\n )\n}\n","/**\n * Get a nested value from an object using dot notation\n *\n * @example\n * getNestedValue({ ui: { select: { placeholder: 'Select...' } } }, 'ui.select.placeholder')\n * // => 'Select...'\n */\nexport function getNestedValue(\n obj: Record<string, unknown>,\n path: string\n): string | undefined {\n const keys = path.split('.')\n let current: unknown = obj\n\n for (const key of keys) {\n if (current === null || current === undefined) {\n return undefined\n }\n if (typeof current !== 'object') {\n return undefined\n }\n current = (current as Record<string, unknown>)[key]\n }\n\n if (typeof current === 'string') {\n return current\n }\n\n return undefined\n}\n","'use client'\n\nimport * as React from 'react'\n\nimport { en } from './locales/en'\nimport type {\n I18nContextValue,\n I18nProviderProps,\n I18nTranslations,\n LocaleCode,\n} from './types'\nimport { getNestedValue, interpolate, mergeTranslations } from './utils'\n\n/**\n * I18n Context\n */\nconst I18nContext = React.createContext<I18nContextValue | null>(null)\n\n/**\n * Default translations (English)\n */\nconst defaultTranslations: I18nTranslations = en\n\n/**\n * I18n Provider\n *\n * @example\n * // Basic usage with single locale\n * import { I18nProvider, ru } from '@djangocfg/i18n'\n *\n * <I18nProvider locale=\"ru\" translations={ru}>\n * <App />\n * </I18nProvider>\n *\n * @example\n * // With all translations for dynamic switching\n * import { I18nProvider, en, ru, ko } from '@djangocfg/i18n'\n *\n * <I18nProvider\n * locale={currentLocale}\n * allTranslations={{ en, ru, ko }}\n * onLocaleChange={(locale) => setCurrentLocale(locale)}\n * >\n * <App />\n * </I18nProvider>\n *\n * @example\n * // With custom overrides\n * import { I18nProvider, ru, mergeTranslations } from '@djangocfg/i18n'\n *\n * const customRu = mergeTranslations(ru, {\n * ui: { select: { placeholder: 'Выберите марку...' } }\n * })\n *\n * <I18nProvider locale=\"ru\" translations={customRu}>\n * <App />\n * </I18nProvider>\n */\nexport function I18nProvider({\n children,\n locale: initialLocale = 'en',\n translations: initialTranslations,\n allTranslations,\n onLocaleChange,\n}: I18nProviderProps) {\n const [locale, setLocaleState] = React.useState<LocaleCode>(initialLocale)\n\n // Resolve current translations\n const translations = React.useMemo<I18nTranslations>(() => {\n // If allTranslations provided, use it to get translations for current locale\n if (allTranslations && allTranslations[locale]) {\n const localeTranslations = allTranslations[locale]\n // Merge with defaults to fill any missing keys\n return mergeTranslations(defaultTranslations, localeTranslations)\n }\n\n // If single translations provided, use them\n if (initialTranslations) {\n return mergeTranslations(\n defaultTranslations,\n initialTranslations as I18nTranslations\n )\n }\n\n // Fallback to defaults\n return defaultTranslations\n }, [locale, allTranslations, initialTranslations])\n\n // Translation function\n const t = React.useCallback(\n (key: string, params?: Record<string, string | number>): string => {\n const value = getNestedValue(\n translations as unknown as Record<string, unknown>,\n key\n )\n\n if (value === undefined) {\n // Development warning\n if (typeof window !== 'undefined' && window.location.hostname === 'localhost') {\n console.warn(`[i18n] Missing translation key: \"${key}\"`)\n }\n // Return the key as fallback\n return key\n }\n\n return interpolate(value, params)\n },\n [translations]\n )\n\n // Locale change handler\n const setLocale = React.useCallback(\n (newLocale: LocaleCode) => {\n setLocaleState(newLocale)\n onLocaleChange?.(newLocale)\n },\n [onLocaleChange]\n )\n\n // Sync with external locale changes.\n //\n // The comparison moved inside the updater rather than `locale` joining the\n // deps: this effect must run when the PROP changes, not when local state\n // does. Depending on `locale` would re-run it after every `setLocale` call\n // and reset the user's choice back to `initialLocale`.\n React.useEffect(() => {\n setLocaleState((current) => (current === initialLocale ? current : initialLocale))\n }, [initialLocale])\n\n const value = React.useMemo<I18nContextValue>(\n () => ({\n locale,\n translations,\n t,\n setLocale,\n }),\n [locale, translations, t, setLocale]\n )\n\n return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>\n}\n\n/**\n * Hook to access i18n context\n *\n * @example\n * function MyComponent() {\n * const { t, locale, setLocale } = useI18n()\n *\n * return (\n * <div>\n * <p>{t('ui.select.placeholder')}</p>\n * <p>{t('ui.pagination.showing', { from: 1, to: 10, total: 100 })}</p>\n * <button onClick={() => setLocale('ru')}>Switch to Russian</button>\n * </div>\n * )\n * }\n */\nexport function useI18n(): I18nContextValue {\n const context = React.useContext(I18nContext)\n\n if (!context) {\n // Return default implementation if no provider\n // This allows components to work without provider (using English defaults)\n return {\n locale: 'en',\n translations: defaultTranslations,\n t: (key: string, params?: Record<string, string | number>) => {\n const value = getNestedValue(\n defaultTranslations as unknown as Record<string, unknown>,\n key\n )\n if (value === undefined) return key\n return interpolate(value, params)\n },\n setLocale: () => {\n if (typeof window !== 'undefined' && window.location.hostname === 'localhost') {\n console.warn(\n '[i18n] setLocale called but no I18nProvider found. Wrap your app with I18nProvider to enable locale switching.'\n )\n }\n },\n }\n }\n\n return context\n}\n\n/**\n * Hook to get the translation function only\n * Useful when you only need translations without other context values\n *\n * @example\n * function MyComponent() {\n * const t = useTranslation()\n * return <span>{t('ui.form.save')}</span>\n * }\n */\nexport function useTranslation() {\n const { t } = useI18n()\n return t\n}\n\n/**\n * Hook to get current locale\n *\n * @example\n * function MyComponent() {\n * const locale = useLocale()\n * return <span>Current: {locale}</span>\n * }\n */\nexport function useLocale(): LocaleCode {\n const { locale } = useI18n()\n return locale\n}\n\n/**\n * Like `useLocale()`, but returns `null` when no `<I18nProvider>` is\n * mounted instead of falling back to `'en'`. Useful for code that\n * needs to distinguish \"no app locale at all\" from \"app locale is en\"\n * — e.g. speech recognition's `auto` mode wants to fall through to\n * `navigator.language` when the app hasn't set one.\n */\nexport function useLocaleOptional(): LocaleCode | null {\n const context = React.useContext(I18nContext)\n return context?.locale ?? null\n}\n\n/**\n * Alias for useTranslation\n * Lightweight hook that just returns the t function\n * Works with or without I18nProvider (falls back to English)\n *\n * @example\n * function MyComponent() {\n * const t = useT()\n * return <span>{t('ui.form.save')}</span>\n * }\n */\nexport const useT = useTranslation\n\n/**\n * Type-safe translation hook\n *\n * Returns a translation function that only accepts valid keys from your translations type.\n * Use this when you want compile-time checking of translation keys.\n *\n * @example\n * ```typescript\n * import { useTypedT } from '@djangocfg/i18n'\n * import type { I18nTranslations } from '@djangocfg/i18n'\n *\n * function MyComponent() {\n * const t = useTypedT<I18nTranslations>()\n * return <span>{t('ui.form.save')}</span> // OK\n * return <span>{t('ui.form.typo')}</span> // Compile error!\n * }\n * ```\n *\n * @example\n * ```typescript\n * // With merged translations (app + extensions)\n * import type { AppTranslations } from '@/i18n/types'\n *\n * function MyComponent() {\n * const t = useTypedT<AppTranslations>()\n * return <span>{t('leads.form.title')}</span> // OK if leads is in AppTranslations\n * }\n * ```\n */\nexport function useTypedT<T extends object>(): (\n key: import('./utils/path-keys').PathKeys<T>,\n params?: Record<string, string | number>\n) => string {\n const { t } = useI18n()\n return t as (\n key: import('./utils/path-keys').PathKeys<T>,\n params?: Record<string, string | number>\n ) => string\n}\n\n/**\n * Get translation without hook (for class components or non-React contexts)\n * Always uses English defaults, no context support\n *\n * @example\n * // In a class component\n * render() {\n * const title = getT('layouts.errors.somethingWentWrong')\n * return <h1>{title}</h1>\n * }\n *\n * @example\n * // With interpolation\n * const message = getT('ui.pagination.showing', { from: 1, to: 10, total: 100 })\n */\nexport function getT(\n key: string,\n params?: Record<string, string | number>\n): string {\n const value = getNestedValue(\n defaultTranslations as unknown as Record<string, unknown>,\n key\n )\n if (value === undefined) return key\n return interpolate(value, params)\n}\n"]}
|