@djangocfg/i18n 2.1.601 → 2.1.603
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-QWIPEHVK.mjs → chunk-WGTVO2XB.mjs} +11 -8
- package/dist/chunk-WGTVO2XB.mjs.map +1 -0
- package/dist/copy/index.mjs +1 -1
- package/dist/index.d.mts +10 -5
- package/dist/index.mjs +20 -14
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/locales/ar.ts +9 -6
- package/src/locales/da.ts +9 -6
- package/src/locales/de.ts +9 -6
- package/src/locales/en.ts +9 -6
- package/src/locales/es.ts +9 -6
- package/src/locales/fr.ts +9 -6
- package/src/locales/it.ts +9 -6
- package/src/locales/ja.ts +9 -6
- package/src/locales/ko.ts +9 -6
- package/src/locales/nl.ts +9 -6
- package/src/locales/no.ts +9 -6
- package/src/locales/pl.ts +9 -6
- package/src/locales/pt-BR.ts +9 -6
- package/src/locales/ru.ts +9 -6
- package/src/locales/sv.ts +9 -6
- package/src/locales/tr.ts +9 -6
- package/src/locales/zh.ts +9 -6
- package/src/types.ts +9 -4
- package/dist/chunk-QWIPEHVK.mjs.map +0 -1
package/src/locales/fr.ts
CHANGED
|
@@ -306,22 +306,25 @@ export const fr: I18nTranslations = {
|
|
|
306
306
|
oauth: {
|
|
307
307
|
signingIn: "Connexion en cours…",
|
|
308
308
|
signingInBody: "Veuillez patienter, nous terminons votre connexion avec {provider}.",
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
309
|
+
notice: {
|
|
310
|
+
linkNotAllowedTitle: "Utilisez le code par e-mail pour cette adresse",
|
|
311
|
+
useEmail: "Continuer avec l'e-mail",
|
|
312
|
+
retry: "Réessayer avec {provider}",
|
|
313
|
+
dismiss: "Fermer",
|
|
314
|
+
},
|
|
312
315
|
error: {
|
|
313
|
-
invalid_state: "
|
|
316
|
+
invalid_state: "Le lien de connexion a expiré. Réessayez.",
|
|
314
317
|
oauth_exchange_failed: "Le fournisseur n'a pas accepté la connexion. Veuillez réessayer.",
|
|
315
318
|
invalid_id_token: "Nous n'avons pas pu vérifier votre connexion. Veuillez réessayer.",
|
|
316
319
|
email_missing: "Le fournisseur n'a pas transmis d'adresse e-mail. Essayez un autre mode de connexion.",
|
|
317
320
|
email_not_verified: "Le fournisseur n'a pas vérifié votre adresse e-mail. Vérifiez-la chez lui ou utilisez un autre mode de connexion.",
|
|
318
321
|
hosted_domain_not_allowed: "Les comptes de ce domaine ne peuvent pas se connecter ici.",
|
|
319
322
|
account_inactive: "Ce compte est désactivé. Veuillez contacter le support.",
|
|
320
|
-
link_not_allowed: "
|
|
323
|
+
link_not_allowed: "La connexion avec {provider} n'est pas disponible pour ce compte. Recevez plutôt un code par e-mail.",
|
|
321
324
|
rate_limited: "Trop de tentatives. Patientez un instant et réessayez.",
|
|
322
325
|
provider_unavailable: "Le fournisseur est indisponible pour le moment. Réessayez dans un instant.",
|
|
323
326
|
cancelled: "Connexion annulée.",
|
|
324
|
-
generic: "
|
|
327
|
+
generic: "Connexion impossible. Réessayez ou utilisez l'e-mail.",
|
|
325
328
|
},
|
|
326
329
|
},
|
|
327
330
|
footer: {
|
package/src/locales/it.ts
CHANGED
|
@@ -306,22 +306,25 @@ export const it: I18nTranslations = {
|
|
|
306
306
|
oauth: {
|
|
307
307
|
signingIn: "Accesso in corso…",
|
|
308
308
|
signingInBody: "Attendi, stiamo completando l'accesso con {provider}.",
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
309
|
+
notice: {
|
|
310
|
+
linkNotAllowedTitle: "Usa il codice via email per questo indirizzo",
|
|
311
|
+
useEmail: "Continua con l'email",
|
|
312
|
+
retry: "Riprova con {provider}",
|
|
313
|
+
dismiss: "Chiudi",
|
|
314
|
+
},
|
|
312
315
|
error: {
|
|
313
|
-
invalid_state: "
|
|
316
|
+
invalid_state: "Il link di accesso è scaduto. Riprova.",
|
|
314
317
|
oauth_exchange_failed: "Il provider non ha accettato l'accesso. Riprova.",
|
|
315
318
|
invalid_id_token: "Non siamo riusciti a verificare l'accesso. Riprova.",
|
|
316
319
|
email_missing: "Il provider non ha condiviso un indirizzo email. Prova un altro metodo.",
|
|
317
320
|
email_not_verified: "Il provider non ha verificato il tuo indirizzo email. Verificalo lì o usa un altro metodo.",
|
|
318
321
|
hosted_domain_not_allowed: "Gli account di questo dominio non possono accedere qui.",
|
|
319
322
|
account_inactive: "Questo account è disattivato. Contatta l'assistenza.",
|
|
320
|
-
link_not_allowed: "
|
|
323
|
+
link_not_allowed: "L'accesso con {provider} non è disponibile per questo account. Ricevi invece un codice via email.",
|
|
321
324
|
rate_limited: "Troppi tentativi. Attendi un momento e riprova.",
|
|
322
325
|
provider_unavailable: "Il provider non è disponibile al momento. Riprova tra poco.",
|
|
323
326
|
cancelled: "Accesso annullato.",
|
|
324
|
-
generic: "Accesso non riuscito. Riprova.",
|
|
327
|
+
generic: "Accesso non riuscito. Riprova o usa l'email.",
|
|
325
328
|
},
|
|
326
329
|
},
|
|
327
330
|
footer: {
|
package/src/locales/ja.ts
CHANGED
|
@@ -306,22 +306,25 @@ export const ja: I18nTranslations = {
|
|
|
306
306
|
oauth: {
|
|
307
307
|
signingIn: "ログインしています…",
|
|
308
308
|
signingInBody: "{provider}でのログインを完了するまでお待ちください。",
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
309
|
+
notice: {
|
|
310
|
+
linkNotAllowedTitle: "このアドレスにはメールコードをご利用ください",
|
|
311
|
+
useEmail: "メールで続ける",
|
|
312
|
+
retry: "{provider} でもう一度試す",
|
|
313
|
+
dismiss: "閉じる",
|
|
314
|
+
},
|
|
312
315
|
error: {
|
|
313
|
-
invalid_state: "
|
|
316
|
+
invalid_state: "ログインリンクの有効期限が切れました。もう一度お試しください。",
|
|
314
317
|
oauth_exchange_failed: "プロバイダーがログインを受け付けませんでした。もう一度お試しください。",
|
|
315
318
|
invalid_id_token: "ログインを確認できませんでした。もう一度お試しください。",
|
|
316
319
|
email_missing: "プロバイダーからメールアドレスが提供されませんでした。別の方法でログインしてください。",
|
|
317
320
|
email_not_verified: "プロバイダーでメールアドレスが確認されていません。そちらで確認するか、別の方法でログインしてください。",
|
|
318
321
|
hosted_domain_not_allowed: "このドメインのアカウントではログインできません。",
|
|
319
322
|
account_inactive: "このアカウントは無効です。サポートにお問い合わせください。",
|
|
320
|
-
link_not_allowed: "
|
|
323
|
+
link_not_allowed: "このアカウントでは {provider} でのログインは使えません。代わりにメールでコードを受け取ってください。",
|
|
321
324
|
rate_limited: "試行回数が多すぎます。しばらくしてからもう一度お試しください。",
|
|
322
325
|
provider_unavailable: "プロバイダーが現在利用できません。しばらくしてからもう一度お試しください。",
|
|
323
326
|
cancelled: "ログインがキャンセルされました。",
|
|
324
|
-
generic: "
|
|
327
|
+
generic: "ログインできませんでした。もう一度お試しいただくか、メールをご利用ください。",
|
|
325
328
|
},
|
|
326
329
|
},
|
|
327
330
|
footer: {
|
package/src/locales/ko.ts
CHANGED
|
@@ -306,22 +306,25 @@ export const ko: I18nTranslations = {
|
|
|
306
306
|
oauth: {
|
|
307
307
|
signingIn: "로그인하는 중…",
|
|
308
308
|
signingInBody: "{provider} 로그인을 완료하는 동안 잠시 기다려 주세요.",
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
309
|
+
notice: {
|
|
310
|
+
linkNotAllowedTitle: "이 주소는 이메일 코드를 사용하세요",
|
|
311
|
+
useEmail: "이메일로 계속",
|
|
312
|
+
retry: "{provider}로 다시 시도",
|
|
313
|
+
dismiss: "닫기",
|
|
314
|
+
},
|
|
312
315
|
error: {
|
|
313
|
-
invalid_state: "로그인 링크가
|
|
316
|
+
invalid_state: "로그인 링크가 만료되었습니다. 다시 시도하세요.",
|
|
314
317
|
oauth_exchange_failed: "제공업체가 로그인을 수락하지 않았습니다. 다시 시도해 주세요.",
|
|
315
318
|
invalid_id_token: "로그인을 확인하지 못했습니다. 다시 시도해 주세요.",
|
|
316
319
|
email_missing: "제공업체가 이메일 주소를 전달하지 않았습니다. 다른 로그인 방법을 사용해 주세요.",
|
|
317
320
|
email_not_verified: "제공업체에서 이메일 주소가 확인되지 않았습니다. 그곳에서 확인하거나 다른 로그인 방법을 사용해 주세요.",
|
|
318
321
|
hosted_domain_not_allowed: "이 도메인의 계정은 여기서 로그인할 수 없습니다.",
|
|
319
322
|
account_inactive: "이 계정은 비활성화되었습니다. 지원팀에 문의해 주세요.",
|
|
320
|
-
link_not_allowed: "이
|
|
323
|
+
link_not_allowed: "이 계정은 {provider} 로그인을 사용할 수 없습니다. 대신 이메일로 코드를 받으세요.",
|
|
321
324
|
rate_limited: "시도가 너무 많습니다. 잠시 후 다시 시도해 주세요.",
|
|
322
325
|
provider_unavailable: "제공업체를 지금 사용할 수 없습니다. 잠시 후 다시 시도해 주세요.",
|
|
323
326
|
cancelled: "로그인이 취소되었습니다.",
|
|
324
|
-
generic: "로그인하지 못했습니다. 다시
|
|
327
|
+
generic: "로그인하지 못했습니다. 다시 시도하거나 이메일을 사용하세요.",
|
|
325
328
|
},
|
|
326
329
|
},
|
|
327
330
|
footer: {
|
package/src/locales/nl.ts
CHANGED
|
@@ -306,22 +306,25 @@ export const nl: I18nTranslations = {
|
|
|
306
306
|
oauth: {
|
|
307
307
|
signingIn: "Bezig met inloggen…",
|
|
308
308
|
signingInBody: "Even geduld, we ronden je aanmelding via {provider} af.",
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
309
|
+
notice: {
|
|
310
|
+
linkNotAllowedTitle: "Gebruik de e-mailcode voor dit adres",
|
|
311
|
+
useEmail: "Verder met e-mail",
|
|
312
|
+
retry: "{provider} opnieuw proberen",
|
|
313
|
+
dismiss: "Sluiten",
|
|
314
|
+
},
|
|
312
315
|
error: {
|
|
313
|
-
invalid_state: "
|
|
316
|
+
invalid_state: "De inloglink is verlopen. Probeer het opnieuw.",
|
|
314
317
|
oauth_exchange_failed: "De provider heeft het inloggen niet geaccepteerd. Probeer het opnieuw.",
|
|
315
318
|
invalid_id_token: "We konden je aanmelding niet verifiëren. Probeer het opnieuw.",
|
|
316
319
|
email_missing: "De provider heeft geen e-mailadres gedeeld. Probeer een andere manier om in te loggen.",
|
|
317
320
|
email_not_verified: "De provider heeft je e-mailadres niet geverifieerd. Verifieer het daar of log op een andere manier in.",
|
|
318
321
|
hosted_domain_not_allowed: "Accounts van dit domein kunnen hier niet inloggen.",
|
|
319
322
|
account_inactive: "Dit account is uitgeschakeld. Neem contact op met support.",
|
|
320
|
-
link_not_allowed: "
|
|
323
|
+
link_not_allowed: "Inloggen met {provider} is niet beschikbaar voor dit account. Vraag in plaats daarvan een code per e-mail aan.",
|
|
321
324
|
rate_limited: "Te veel pogingen. Wacht even en probeer het opnieuw.",
|
|
322
325
|
provider_unavailable: "De provider is nu niet beschikbaar. Probeer het zo opnieuw.",
|
|
323
326
|
cancelled: "Inloggen geannuleerd.",
|
|
324
|
-
generic: "Inloggen mislukt. Probeer het opnieuw.",
|
|
327
|
+
generic: "Inloggen mislukt. Probeer het opnieuw of gebruik e-mail.",
|
|
325
328
|
},
|
|
326
329
|
},
|
|
327
330
|
footer: {
|
package/src/locales/no.ts
CHANGED
|
@@ -306,22 +306,25 @@ export const no: I18nTranslations = {
|
|
|
306
306
|
oauth: {
|
|
307
307
|
signingIn: "Logger inn…",
|
|
308
308
|
signingInBody: "Vent litt mens vi fullfører innloggingen via {provider}.",
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
309
|
+
notice: {
|
|
310
|
+
linkNotAllowedTitle: "Bruk e-postkoden for denne adressen",
|
|
311
|
+
useEmail: "Fortsett med e-post",
|
|
312
|
+
retry: "Prøv {provider} igjen",
|
|
313
|
+
dismiss: "Lukk",
|
|
314
|
+
},
|
|
312
315
|
error: {
|
|
313
|
-
invalid_state: "
|
|
316
|
+
invalid_state: "Innloggingslenken har utløpt. Prøv igjen.",
|
|
314
317
|
oauth_exchange_failed: "Leverandøren godtok ikke innloggingen. Prøv igjen.",
|
|
315
318
|
invalid_id_token: "Vi kunne ikke bekrefte innloggingen din. Prøv igjen.",
|
|
316
319
|
email_missing: "Leverandøren delte ingen e-postadresse. Prøv en annen innloggingsmåte.",
|
|
317
320
|
email_not_verified: "Leverandøren har ikke bekreftet e-postadressen din. Bekreft den der, eller bruk en annen innloggingsmåte.",
|
|
318
321
|
hosted_domain_not_allowed: "Kontoer fra dette domenet kan ikke logge inn her.",
|
|
319
322
|
account_inactive: "Denne kontoen er deaktivert. Kontakt kundestøtte.",
|
|
320
|
-
link_not_allowed: "
|
|
323
|
+
link_not_allowed: "Innlogging med {provider} er ikke tilgjengelig for denne kontoen. Få en kode på e-post i stedet.",
|
|
321
324
|
rate_limited: "For mange forsøk. Vent litt og prøv igjen.",
|
|
322
325
|
provider_unavailable: "Leverandøren er utilgjengelig akkurat nå. Prøv igjen om litt.",
|
|
323
326
|
cancelled: "Innloggingen ble avbrutt.",
|
|
324
|
-
generic: "
|
|
327
|
+
generic: "Kunne ikke logge inn. Prøv igjen eller bruk e-post.",
|
|
325
328
|
},
|
|
326
329
|
},
|
|
327
330
|
footer: {
|
package/src/locales/pl.ts
CHANGED
|
@@ -306,22 +306,25 @@ export const pl: I18nTranslations = {
|
|
|
306
306
|
oauth: {
|
|
307
307
|
signingIn: "Logowanie…",
|
|
308
308
|
signingInBody: "Poczekaj, kończymy logowanie przez {provider}.",
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
309
|
+
notice: {
|
|
310
|
+
linkNotAllowedTitle: "Użyj kodu z e-maila dla tego adresu",
|
|
311
|
+
useEmail: "Kontynuuj przez e-mail",
|
|
312
|
+
retry: "Spróbuj ponownie przez {provider}",
|
|
313
|
+
dismiss: "Zamknij",
|
|
314
|
+
},
|
|
312
315
|
error: {
|
|
313
|
-
invalid_state: "
|
|
316
|
+
invalid_state: "Link do logowania wygasł. Spróbuj ponownie.",
|
|
314
317
|
oauth_exchange_failed: "Dostawca nie zaakceptował logowania. Spróbuj ponownie.",
|
|
315
318
|
invalid_id_token: "Nie udało się zweryfikować logowania. Spróbuj ponownie.",
|
|
316
319
|
email_missing: "Dostawca nie udostępnił adresu e-mail. Wybierz inny sposób logowania.",
|
|
317
320
|
email_not_verified: "Dostawca nie zweryfikował Twojego adresu e-mail. Zweryfikuj go tam lub wybierz inny sposób logowania.",
|
|
318
321
|
hosted_domain_not_allowed: "Konta z tej domeny nie mogą się tutaj logować.",
|
|
319
322
|
account_inactive: "To konto jest wyłączone. Skontaktuj się z pomocą techniczną.",
|
|
320
|
-
link_not_allowed: "
|
|
323
|
+
link_not_allowed: "Logowanie przez {provider} jest niedostępne dla tego konta. Zamiast tego odbierz kod e-mailem.",
|
|
321
324
|
rate_limited: "Zbyt wiele prób. Poczekaj chwilę i spróbuj ponownie.",
|
|
322
325
|
provider_unavailable: "Dostawca jest teraz niedostępny. Spróbuj ponownie za chwilę.",
|
|
323
326
|
cancelled: "Logowanie anulowano.",
|
|
324
|
-
generic: "
|
|
327
|
+
generic: "Nie udało się zalogować. Spróbuj ponownie lub użyj e-maila.",
|
|
325
328
|
},
|
|
326
329
|
},
|
|
327
330
|
footer: {
|
package/src/locales/pt-BR.ts
CHANGED
|
@@ -306,22 +306,25 @@ export const ptBR: I18nTranslations = {
|
|
|
306
306
|
oauth: {
|
|
307
307
|
signingIn: "Entrando…",
|
|
308
308
|
signingInBody: "Aguarde enquanto concluímos seu login com {provider}.",
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
309
|
+
notice: {
|
|
310
|
+
linkNotAllowedTitle: "Use o código por e-mail para este endereço",
|
|
311
|
+
useEmail: "Continuar com e-mail",
|
|
312
|
+
retry: "Tentar {provider} novamente",
|
|
313
|
+
dismiss: "Fechar",
|
|
314
|
+
},
|
|
312
315
|
error: {
|
|
313
|
-
invalid_state: "
|
|
316
|
+
invalid_state: "O link de login expirou. Tente novamente.",
|
|
314
317
|
oauth_exchange_failed: "O provedor não aceitou o login. Tente novamente.",
|
|
315
318
|
invalid_id_token: "Não foi possível verificar seu login. Tente novamente.",
|
|
316
319
|
email_missing: "O provedor não compartilhou um e-mail. Tente outro método de login.",
|
|
317
320
|
email_not_verified: "O provedor não verificou seu e-mail. Verifique lá ou use outro método de login.",
|
|
318
321
|
hosted_domain_not_allowed: "Contas deste domínio não podem entrar aqui.",
|
|
319
322
|
account_inactive: "Esta conta está desativada. Entre em contato com o suporte.",
|
|
320
|
-
link_not_allowed: "
|
|
323
|
+
link_not_allowed: "O login com {provider} não está disponível para esta conta. Receba um código por e-mail.",
|
|
321
324
|
rate_limited: "Muitas tentativas. Aguarde um momento e tente novamente.",
|
|
322
325
|
provider_unavailable: "O provedor está indisponível no momento. Tente novamente em instantes.",
|
|
323
326
|
cancelled: "Login cancelado.",
|
|
324
|
-
generic: "
|
|
327
|
+
generic: "Não foi possível entrar. Tente novamente ou use o e-mail.",
|
|
325
328
|
},
|
|
326
329
|
},
|
|
327
330
|
footer: {
|
package/src/locales/ru.ts
CHANGED
|
@@ -306,22 +306,25 @@ export const ru: I18nTranslations = {
|
|
|
306
306
|
oauth: {
|
|
307
307
|
signingIn: "Выполняем вход…",
|
|
308
308
|
signingInBody: "Подождите, мы завершаем вход через {provider}.",
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
309
|
+
notice: {
|
|
310
|
+
linkNotAllowedTitle: "Для этого адреса вход по коду из письма",
|
|
311
|
+
useEmail: "Продолжить с почтой",
|
|
312
|
+
retry: "Повторить вход через {provider}",
|
|
313
|
+
dismiss: "Закрыть",
|
|
314
|
+
},
|
|
312
315
|
error: {
|
|
313
|
-
invalid_state: "Ссылка для входа
|
|
316
|
+
invalid_state: "Ссылка для входа устарела. Попробуйте ещё раз.",
|
|
314
317
|
oauth_exchange_failed: "Провайдер не принял вход. Попробуйте ещё раз.",
|
|
315
318
|
invalid_id_token: "Не удалось подтвердить вход. Попробуйте ещё раз.",
|
|
316
319
|
email_missing: "Провайдер не передал адрес почты. Выберите другой способ входа.",
|
|
317
320
|
email_not_verified: "Провайдер не подтвердил вашу почту. Подтвердите её там или войдите другим способом.",
|
|
318
321
|
hosted_domain_not_allowed: "Аккаунты с этим доменом не могут войти здесь.",
|
|
319
322
|
account_inactive: "Аккаунт отключён. Обратитесь в поддержку.",
|
|
320
|
-
link_not_allowed: "
|
|
323
|
+
link_not_allowed: "Вход через {provider} недоступен для этого аккаунта. Получите код по почте.",
|
|
321
324
|
rate_limited: "Слишком много попыток. Подождите немного и повторите.",
|
|
322
325
|
provider_unavailable: "Провайдер сейчас недоступен. Попробуйте чуть позже.",
|
|
323
326
|
cancelled: "Вход отменён.",
|
|
324
|
-
generic: "Не удалось войти. Попробуйте ещё
|
|
327
|
+
generic: "Не удалось войти. Попробуйте ещё раз или войдите по почте.",
|
|
325
328
|
},
|
|
326
329
|
},
|
|
327
330
|
footer: {
|
package/src/locales/sv.ts
CHANGED
|
@@ -306,22 +306,25 @@ export const sv: I18nTranslations = {
|
|
|
306
306
|
oauth: {
|
|
307
307
|
signingIn: "Loggar in…",
|
|
308
308
|
signingInBody: "Vänta medan vi slutför inloggningen via {provider}.",
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
309
|
+
notice: {
|
|
310
|
+
linkNotAllowedTitle: "Använd e-postkoden för den här adressen",
|
|
311
|
+
useEmail: "Fortsätt med e-post",
|
|
312
|
+
retry: "Försök med {provider} igen",
|
|
313
|
+
dismiss: "Stäng",
|
|
314
|
+
},
|
|
312
315
|
error: {
|
|
313
|
-
invalid_state: "
|
|
316
|
+
invalid_state: "Inloggningslänken har gått ut. Försök igen.",
|
|
314
317
|
oauth_exchange_failed: "Leverantören godtog inte inloggningen. Försök igen.",
|
|
315
318
|
invalid_id_token: "Vi kunde inte verifiera din inloggning. Försök igen.",
|
|
316
319
|
email_missing: "Leverantören delade ingen e-postadress. Prova ett annat inloggningssätt.",
|
|
317
320
|
email_not_verified: "Leverantören har inte verifierat din e-postadress. Verifiera den där eller använd ett annat inloggningssätt.",
|
|
318
321
|
hosted_domain_not_allowed: "Konton från den här domänen kan inte logga in här.",
|
|
319
322
|
account_inactive: "Det här kontot är inaktiverat. Kontakta support.",
|
|
320
|
-
link_not_allowed: "
|
|
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.",
|
|
321
324
|
rate_limited: "För många försök. Vänta en stund och försök igen.",
|
|
322
325
|
provider_unavailable: "Leverantören är inte tillgänglig just nu. Försök igen om en stund.",
|
|
323
326
|
cancelled: "Inloggningen avbröts.",
|
|
324
|
-
generic: "
|
|
327
|
+
generic: "Det gick inte att logga in. Försök igen eller använd e-post.",
|
|
325
328
|
},
|
|
326
329
|
},
|
|
327
330
|
footer: {
|
package/src/locales/tr.ts
CHANGED
|
@@ -306,22 +306,25 @@ export const tr: I18nTranslations = {
|
|
|
306
306
|
oauth: {
|
|
307
307
|
signingIn: "Giriş yapılıyor…",
|
|
308
308
|
signingInBody: "Lütfen bekleyin, {provider} ile girişinizi tamamlıyoruz.",
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
309
|
+
notice: {
|
|
310
|
+
linkNotAllowedTitle: "Bu adres için e-posta kodunu kullanın",
|
|
311
|
+
useEmail: "E-posta ile devam et",
|
|
312
|
+
retry: "{provider} ile tekrar dene",
|
|
313
|
+
dismiss: "Kapat",
|
|
314
|
+
},
|
|
312
315
|
error: {
|
|
313
|
-
invalid_state: "
|
|
316
|
+
invalid_state: "Giriş bağlantısının süresi doldu. Tekrar deneyin.",
|
|
314
317
|
oauth_exchange_failed: "Sağlayıcı girişi kabul etmedi. Lütfen tekrar deneyin.",
|
|
315
318
|
invalid_id_token: "Girişiniz doğrulanamadı. Lütfen tekrar deneyin.",
|
|
316
319
|
email_missing: "Sağlayıcı bir e-posta adresi paylaşmadı. Başka bir giriş yöntemi deneyin.",
|
|
317
320
|
email_not_verified: "Sağlayıcı e-posta adresinizi doğrulamamış. Orada doğrulayın veya başka bir giriş yöntemi kullanın.",
|
|
318
321
|
hosted_domain_not_allowed: "Bu alan adındaki hesaplar burada giriş yapamaz.",
|
|
319
322
|
account_inactive: "Bu hesap devre dışı. Lütfen destekle iletişime geçin.",
|
|
320
|
-
link_not_allowed: "Bu
|
|
323
|
+
link_not_allowed: "Bu hesap için {provider} ile giriş kullanılamıyor. Bunun yerine e-postayla kod alın.",
|
|
321
324
|
rate_limited: "Çok fazla deneme. Biraz bekleyip tekrar deneyin.",
|
|
322
325
|
provider_unavailable: "Sağlayıcı şu an kullanılamıyor. Birazdan tekrar deneyin.",
|
|
323
326
|
cancelled: "Giriş iptal edildi.",
|
|
324
|
-
generic: "Giriş
|
|
327
|
+
generic: "Giriş yapılamadı. Tekrar deneyin veya e-postayı kullanın.",
|
|
325
328
|
},
|
|
326
329
|
},
|
|
327
330
|
footer: {
|
package/src/locales/zh.ts
CHANGED
|
@@ -306,22 +306,25 @@ export const zh: I18nTranslations = {
|
|
|
306
306
|
oauth: {
|
|
307
307
|
signingIn: "正在登录…",
|
|
308
308
|
signingInBody: "请稍候,我们正在完成通过 {provider} 的登录。",
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
309
|
+
notice: {
|
|
310
|
+
linkNotAllowedTitle: "此地址请使用邮件验证码",
|
|
311
|
+
useEmail: "使用邮箱继续",
|
|
312
|
+
retry: "重新尝试 {provider}",
|
|
313
|
+
dismiss: "关闭",
|
|
314
|
+
},
|
|
312
315
|
error: {
|
|
313
|
-
invalid_state: "
|
|
316
|
+
invalid_state: "登录链接已过期,请重试。",
|
|
314
317
|
oauth_exchange_failed: "服务提供方未接受此次登录。请重试。",
|
|
315
318
|
invalid_id_token: "无法验证您的登录。请重试。",
|
|
316
319
|
email_missing: "服务提供方未提供电子邮件地址。请尝试其他登录方式。",
|
|
317
320
|
email_not_verified: "服务提供方尚未验证您的电子邮件地址。请在该处验证,或使用其他登录方式。",
|
|
318
321
|
hosted_domain_not_allowed: "此域名下的账户无法在此登录。",
|
|
319
322
|
account_inactive: "此账户已被停用。请联系支持团队。",
|
|
320
|
-
link_not_allowed: "
|
|
323
|
+
link_not_allowed: "此账户无法使用 {provider} 登录,请改用邮件验证码。",
|
|
321
324
|
rate_limited: "尝试次数过多。请稍后再试。",
|
|
322
325
|
provider_unavailable: "服务提供方暂时不可用。请稍后再试。",
|
|
323
326
|
cancelled: "登录已取消。",
|
|
324
|
-
generic: "
|
|
327
|
+
generic: "无法登录。请重试或使用邮箱。",
|
|
325
328
|
},
|
|
326
329
|
},
|
|
327
330
|
footer: {
|
package/src/types.ts
CHANGED
|
@@ -403,10 +403,15 @@ export interface I18nTranslations {
|
|
|
403
403
|
signingIn: string
|
|
404
404
|
/** {provider} is the provider's brand name, e.g. Google */
|
|
405
405
|
signingInBody: string
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
406
|
+
/** The inline notice shown on the sign-in form after a provider round trip failed */
|
|
407
|
+
notice: {
|
|
408
|
+
/** Title of the notice for `link_not_allowed` (staff accounts sign in by email code) */
|
|
409
|
+
linkNotAllowedTitle: string
|
|
410
|
+
useEmail: string
|
|
411
|
+
/** {provider} is the provider's brand name */
|
|
412
|
+
retry: string
|
|
413
|
+
dismiss: string
|
|
414
|
+
}
|
|
410
415
|
error: {
|
|
411
416
|
invalid_state: string
|
|
412
417
|
oauth_exchange_failed: string
|
|
@@ -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":"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","file":"chunk-QWIPEHVK.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 failedTitle: \"Sign-in failed\",\n tryAgain: \"Try again\",\n browserHint: \"If Google refused to open, open this page in your browser.\",\n error: {\n invalid_state: \"This sign-in link expired or was opened in another browser. Please start 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: \"This email belongs to a staff account. Sign in with the email code 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: \"Sign-in failed. Please try again.\",\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"]}
|