@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/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
- failedTitle: "Échec de la connexion",
310
- tryAgain: "Réessayer",
311
- browserHint: "Si Google ne s'est pas ouvert, ouvrez cette page dans votre navigateur.",
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: "Ce lien de connexion a expiré ou a été ouvert dans un autre navigateur. Veuillez recommencer.",
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: "Cette adresse appartient à un compte d'équipe. Connectez-vous plutôt avec le code reçu par e-mail.",
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: "La connexion a échoué. Veuillez réessayer.",
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
- failedTitle: "Accesso non riuscito",
310
- tryAgain: "Riprova",
311
- browserHint: "Se Google non si è aperto, apri questa pagina nel tuo browser.",
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: "Questo link di accesso è scaduto o è stato aperto in un altro browser. Ricomincia.",
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: "Questa email appartiene a un account dello staff. Accedi con il codice via email.",
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
- failedTitle: "ログインに失敗しました",
310
- tryAgain: "もう一度試す",
311
- browserHint: "Google が開かない場合は、このページをブラウザで開いてください。",
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
- failedTitle: "로그인하지 못했습니다",
310
- tryAgain: "다시 시도",
311
- browserHint: "Google이 열리지 않으면 이 페이지를 브라우저에서 여세요.",
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
- failedTitle: "Inloggen mislukt",
310
- tryAgain: "Opnieuw proberen",
311
- browserHint: "Als Google niet opende, open deze pagina dan in je browser.",
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: "Deze inloglink is verlopen of in een andere browser geopend. Begin opnieuw.",
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: "Dit e-mailadres hoort bij een medewerkersaccount. Log in met de code uit je e-mail.",
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
- failedTitle: "Innloggingen mislyktes",
310
- tryAgain: "Prøv igjen",
311
- browserHint: "Hvis Google ikke åpnet seg, åpne denne siden i nettleseren din.",
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: "Denne innloggingslenken er utløpt eller ble åpnet i en annen nettleser. Start på nytt.",
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: "Denne e-postadressen tilhører en ansattkonto. Logg inn med e-postkoden i stedet.",
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: "Innloggingen mislyktes. Prøv igjen.",
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
- failedTitle: "Logowanie nie powiodło się",
310
- tryAgain: "Spróbuj ponownie",
311
- browserHint: "Jeśli Google się nie otworzył, otwórz tę stronę w przeglądarce.",
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: "Ten link do logowania wygasł lub otwarto go w innej przeglądarce. Zacznij od nowa.",
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: "Ten adres e-mail należy do konta pracownika. Zaloguj się kodem z e-maila.",
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: "Logowanie nie powiodło się. Spróbuj ponownie.",
327
+ generic: "Nie udało się zalogować. Spróbuj ponownie lub użyj e-maila.",
325
328
  },
326
329
  },
327
330
  footer: {
@@ -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
- failedTitle: "Falha ao entrar",
310
- tryAgain: "Tentar novamente",
311
- browserHint: "Se o Google não abriu, abra esta página no seu navegador.",
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: "Este link de login expirou ou foi aberto em outro navegador. Comece novamente.",
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: "Este e-mail pertence a uma conta da equipe. Entre com o código enviado por e-mail.",
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: "Falha ao entrar. Tente novamente.",
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
- failedTitle: "Не удалось войти",
310
- tryAgain: "Повторить",
311
- browserHint: "Если Google не открылся, откройте эту страницу в обычном браузере.",
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
- failedTitle: "Inloggningen misslyckades",
310
- tryAgain: "Försök igen",
311
- browserHint: "Om Google inte öppnades, öppna den här sidan i din webbläsare.",
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: "Den här inloggningslänken har gått ut eller öppnades i en annan webbläsare. Börja om.",
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: "Den här e-postadressen tillhör ett personalkonto. Logga in med e-postkoden i stället.",
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: "Inloggningen misslyckades. Försök igen.",
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
- failedTitle: "Giriş başarısız",
310
- tryAgain: "Tekrar dene",
311
- browserHint: "Google açılmadıysa bu sayfayı tarayıcınızda açın.",
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: "Bu giriş bağlantısının süresi doldu veya başka bir tarayıcıda açıldı. Lütfen baştan başlayın.",
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 e-posta bir ekip hesabına ait. Bunun yerine e-posta koduyla giriş yapın.",
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ş başarısız. Lütfen tekrar deneyin.",
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
- failedTitle: "登录失败",
310
- tryAgain: "重试",
311
- browserHint: "如果 Google 未能打开,请在浏览器中打开此页面。",
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
- failedTitle: string
407
- tryAgain: string
408
- /** Shown under the failure card for Google when its page refused to open */
409
- browserHint: string
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"]}