[SAML Configuration] Domain settings page#73636
Conversation
|
Hey, I noticed you changed Please look at the code and make sure there are no malicious changes before running the workflow. If you have the K2 extension, you can simply click: [this button] |
This comment has been minimized.
This comment has been minimized.
|
Hey, I noticed you changed If you want to automatically generate translations for other locales, an Expensify employee will have to:
Alternatively, if you are an external contributor, you can run the translation script locally with your own OpenAI API key. To learn more, try running: npx ts-node ./scripts/generateTranslations.ts --helpTypically, you'd want to translate only what you changed by running |
Codecov Report❌ Looks like you've decreased code coverage for some files. Please write tests to increase, or at least maintain, the existing level of code coverage. See our documentation here for how to interpret this table.
|
🦜 Polyglot Parrot! 🦜Squawk! Looks like you added some shiny new English strings. Allow me to parrot them back to you in other tongues: View the translation diffdiff --git a/src/languages/de.ts b/src/languages/de.ts
index b4ef886a..d34cdd83 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -1351,9 +1351,9 @@ const translations = {
genericHoldExpenseFailureMessage: 'Unerwarteter Fehler beim Halten dieser Ausgabe. Bitte versuchen Sie es später erneut.',
genericUnholdExpenseFailureMessage: 'Unerwarteter Fehler beim Entfernen dieser Ausgabe von der Warteschleife. Bitte versuchen Sie es später erneut.',
receiptDeleteFailureError: 'Unerwarteter Fehler beim Löschen dieser Quittung. Bitte versuchen Sie es später erneut.',
- receiptFailureMessage: 'Beim Hochladen Ihrer Quittung ist ein Fehler aufgetreten. Bitte',
+ receiptFailureMessage: 'Beim Hochladen deines Belegs ist ein Fehler aufgetreten. Bitte',
receiptFailureMessageShort: 'Beim Hochladen Ihres Belegs ist ein Fehler aufgetreten.',
- tryAgainMessage: 'nochmals versuchen',
+ tryAgainMessage: 'Erneut versuchen',
saveFileMessage: 'Beleg speichern',
uploadLaterMessage: 'später hochladen.',
genericDeleteFailureMessage: 'Unerwarteter Fehler beim Löschen dieser Ausgabe. Bitte versuchen Sie es später erneut.',
@@ -1377,7 +1377,7 @@ const translations = {
enableWallet: 'Wallet aktivieren',
hold: 'Halten',
unhold: 'Halten entfernen',
- holdExpense: 'Ausgabe zurückhalten',
+ holdExpense: 'Ausgabe zurückstellen',
unholdExpense: 'Ausgabe freigeben',
heldExpense: 'diese Ausgabe zurückgehalten',
unheldExpense: 'diese Ausgabe freigegeben',
@@ -7402,7 +7402,7 @@ ${amount} für ${merchant} - ${date}`,
upload: 'Hochladen',
uploadPhoto: 'Foto hochladen',
selectAvatar: 'Avatar auswählen',
- chooseCustomAvatar: 'Oder wählen Sie einen eigenen Avatar',
+ chooseCustomAvatar: 'Oder wähle einen benutzerdefinierten Avatar',
},
openAppFailureModal: {
title: 'Etwas ist schiefgelaufen...',
@@ -7430,6 +7430,16 @@ ${amount} für ${merchant} - ${date}`,
description: ({domainName}: {domainName: string}) =>
`<muted-text><centered-text>Die Domain <strong>${domainName}</strong> wurde erfolgreich verifiziert und Sie können jetzt SAML und andere Sicherheitsfunktionen einrichten.</centered-text></muted-text>`,
},
+ saml: 'SAML',
+ featureList: {
+ title: 'SAML-Einmalanmeldung (SSO)',
+ subtitle: ({domainName}: {domainName: string}) =>
+ `<muted-text><a href="${CONST.SAML_HELP_URL}">SAML SSO</a> ist eine Sicherheitsfunktion, die Ihnen mehr Kontrolle darüber gibt, wie sich Mitglieder mit E-Mail-Adressen unter <strong>${domainName}</strong> bei Expensify anmelden. Um sie zu aktivieren, müssen Sie sich als autorisierte/r Unternehmensadministrator/in verifizieren.</muted-text>`,
+ fasterAndEasierLogin: 'Schnelleres und einfacheres Anmelden',
+ moreSecurityAndControl: 'Mehr Sicherheit und Kontrolle',
+ onePasswordForAnything: 'Ein Passwort für alles',
+ },
+ goToDomain: 'Zur Domain wechseln',
},
};
// IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 207d79a6..33df5878 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -452,7 +452,7 @@ const translations = {
send: 'Envoyer',
na: 'N/A',
noResultsFound: 'Aucun résultat trouvé',
- noResultsFoundMatching: ({searchString}: {searchString: string}) => `Aucun résultat trouvé correspondant à "${searchString}"`,
+ noResultsFoundMatching: ({searchString}: {searchString: string}) => `Aucun résultat trouvé pour "${searchString}"`,
recentDestinations: 'Destinations récentes',
timePrefix: "C'est",
conjunctionFor: 'pour',
@@ -1350,11 +1350,11 @@ const translations = {
genericHoldExpenseFailureMessage: 'Erreur inattendue lors de la mise en attente de cette dépense. Veuillez réessayer plus tard.',
genericUnholdExpenseFailureMessage: 'Erreur inattendue lors de la suppression de la mise en attente de cette dépense. Veuillez réessayer plus tard.',
receiptDeleteFailureError: 'Erreur inattendue lors de la suppression de ce reçu. Veuillez réessayer plus tard.',
- receiptFailureMessage: "Une erreur s'est produite lors du téléchargement de votre reçu. Veuillez",
+ receiptFailureMessage: "Une erreur s'est produite lors du téléversement de votre reçu. Veuillez",
receiptFailureMessageShort: "Une erreur s'est produite lors du téléchargement de votre reçu.",
- tryAgainMessage: 'réessayer',
+ tryAgainMessage: 'Réessayer',
saveFileMessage: 'enregistrer le reçu',
- uploadLaterMessage: 'à télécharger plus tard.',
+ uploadLaterMessage: 'à téléverser plus tard.',
genericDeleteFailureMessage: 'Erreur inattendue lors de la suppression de cette dépense. Veuillez réessayer plus tard.',
genericEditFailureMessage: 'Erreur inattendue lors de la modification de cette dépense. Veuillez réessayer plus tard.',
genericSmartscanFailureMessage: 'La transaction comporte des champs manquants',
@@ -1386,7 +1386,7 @@ const translations = {
emptyStateUnreportedExpenseSubtitle: "Il semble que vous n'ayez aucune dépense non déclarée. Essayez d'en créer une ci-dessous.",
addUnreportedExpenseConfirm: 'Ajouter au rapport',
newReport: 'Nouveau rapport',
- explainHold: 'Expliquez pourquoi vous retenez cette dépense.',
+ explainHold: 'Expliquez pourquoi vous mettez cette dépense en attente.',
retracted: 'retraité',
retract: 'Retirer',
reopened: 'rouvert',
@@ -7398,7 +7398,7 @@ ${amount} pour ${merchant} - ${date}`,
},
avatarPage: {
title: 'Modifier la photo de profil',
- upload: 'Télécharger',
+ upload: 'Téléverser',
uploadPhoto: 'Télécharger une photo',
selectAvatar: 'Sélectionner un avatar',
chooseCustomAvatar: 'Ou choisissez un avatar personnalisé',
@@ -7429,6 +7429,16 @@ ${amount} pour ${merchant} - ${date}`,
description: ({domainName}: {domainName: string}) =>
`<muted-text><centered-text>Le domaine <strong>${domainName}</strong> a été vérifié avec succès et vous pouvez maintenant configurer SAML et d'autres fonctionnalités de sécurité.</centered-text></muted-text>`,
},
+ saml: 'SAML',
+ featureList: {
+ title: 'Authentification unique SAML (SSO)',
+ subtitle: ({domainName}: {domainName: string}) =>
+ `<muted-text><a href="${CONST.SAML_HELP_URL}">SAML SSO</a> est une fonctionnalité de sécurité qui vous donne davantage de contrôle sur la manière dont les membres ayant des adresses e‑mail <strong>${domainName}</strong> se connectent à Expensify. Pour l’activer, vous devrez confirmer que vous êtes un administrateur d’entreprise autorisé.</muted-text>`,
+ fasterAndEasierLogin: 'Connexion plus rapide et plus simple',
+ moreSecurityAndControl: 'Plus de sécurité et de contrôle',
+ onePasswordForAnything: 'Un seul mot de passe pour tout',
+ },
+ goToDomain: 'Accéder au domaine',
},
};
// IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/languages/it.ts b/src/languages/it.ts
index b70b72b8..960a928d 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -1347,7 +1347,7 @@ const translations = {
receiptFailureMessageShort: 'Si è verificato un errore durante il caricamento della tua ricevuta.',
tryAgainMessage: 'riprova',
saveFileMessage: 'salva la ricevuta',
- uploadLaterMessage: 'da caricare più tardi.',
+ uploadLaterMessage: 'da caricare in seguito.',
genericDeleteFailureMessage: "Errore imprevisto nell'eliminazione di questa spesa. Per favore riprova più tardi.",
genericEditFailureMessage: 'Errore imprevisto durante la modifica di questa spesa. Per favore riprova più tardi.',
genericSmartscanFailureMessage: 'La transazione manca di campi',
@@ -1368,7 +1368,7 @@ const translations = {
enableWallet: 'Abilita portafoglio',
hold: 'Attendere',
unhold: 'Rimuovi blocco',
- holdExpense: 'Trattieni spesa',
+ holdExpense: 'Metti in sospeso la spesa',
unholdExpense: 'Sblocca spesa',
heldExpense: 'trattenuto questa spesa',
unheldExpense: 'sblocca questa spesa',
@@ -1379,7 +1379,7 @@ const translations = {
emptyStateUnreportedExpenseSubtitle: 'Sembra che non hai spese non segnalate. Prova a crearne una qui sotto.',
addUnreportedExpenseConfirm: 'Aggiungi al report',
newReport: 'Nuovo rapporto',
- explainHold: 'Spiega perché stai trattenendo questa spesa.',
+ explainHold: 'Spiega perché stai mettendo in sospeso questa spesa.',
retracted: 'retratato',
retract: 'Ritirare',
reopened: 'riaperto',
@@ -4822,7 +4822,6 @@ ${amount} per ${merchant} - ${date}`,
defaultCard: 'Carta predefinita',
downgradeTitle: `Impossibile effettuare il downgrade dello spazio di lavoro`,
downgradeSubTitle: `Questo workspace non può essere declassato perché sono collegati più flussi di carte (escludendo le carte Expensify). Per favore <a href="#">mantieni solo un feed di carte</a> per procedere.`,
-
noAccountsFoundDescription: ({connection}: ConnectionParams) => `Per favore, aggiungi l'account in ${connection} e sincronizza nuovamente la connessione.`,
expensifyCardBannerTitle: 'Ottieni la Expensify Card',
expensifyCardBannerSubtitle:
@@ -7438,6 +7437,16 @@ ${amount} per ${merchant} - ${date}`,
description: ({domainName}: {domainName: string}) =>
`<muted-text><centered-text>Il dominio <strong>${domainName}</strong> è stato verificato con successo e ora puoi configurare SAML e altre funzionalità di sicurezza.</centered-text></muted-text>`,
},
+ saml: 'SAML',
+ featureList: {
+ title: 'SAML Accesso singolo (SSO)',
+ subtitle: ({domainName}: {domainName: string}) =>
+ `<muted-text><a href="${CONST.SAML_HELP_URL}">SAML SSO</a> è una funzionalità di sicurezza che ti offre un maggiore controllo su come i membri con indirizzi email <strong>${domainName}</strong> accedono a Expensify. Per abilitarla, dovrai verificare di essere un amministratore aziendale autorizzato.</muted-text>`,
+ fasterAndEasierLogin: 'Accesso più rapido e semplice',
+ moreSecurityAndControl: 'Maggiore sicurezza e controllo',
+ onePasswordForAnything: 'Un’unica password per tutto',
+ },
+ goToDomain: 'Vai al dominio',
},
};
// IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 5bed328f..cceb9653 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -452,7 +452,7 @@ const translations = {
send: '送信',
na: 'N/A',
noResultsFound: '結果が見つかりませんでした',
- noResultsFoundMatching: ({searchString}: {searchString: string}) => `「${searchString}」に一致する結果は見つかりませんでした。`,
+ noResultsFoundMatching: ({searchString}: {searchString: string}) => `"${searchString}" に一致する結果は見つかりませんでした`,
recentDestinations: '最近の目的地',
timePrefix: 'それは',
conjunctionFor: 'のために',
@@ -1346,9 +1346,9 @@ const translations = {
genericHoldExpenseFailureMessage: 'この経費を保留する際に予期しないエラーが発生しました。後でもう一度お試しください。',
genericUnholdExpenseFailureMessage: 'この経費の保留を解除する際に予期しないエラーが発生しました。後でもう一度お試しください。',
receiptDeleteFailureError: 'この領収書の削除中に予期しないエラーが発生しました。後でもう一度お試しください。',
- receiptFailureMessage: '領収書のアップロード中にエラーが発生しました。どうぞ',
+ receiptFailureMessage: '領収書のアップロード中にエラーが発生しました。以下を実行してください',
receiptFailureMessageShort: '領収書のアップロード中にエラーが発生しました。',
- tryAgainMessage: 'もう一度試してください。',
+ tryAgainMessage: 'もう一度お試しください',
saveFileMessage: '領収書を保存',
uploadLaterMessage: '後でアップロードする。',
genericDeleteFailureMessage: 'この経費を削除中に予期しないエラーが発生しました。後でもう一度お試しください。',
@@ -1381,7 +1381,7 @@ const translations = {
emptyStateUnreportedExpenseSubtitle: '未報告の経費はないようです。以下で新しく作成してみてください。',
addUnreportedExpenseConfirm: 'レポートに追加',
newReport: '新しいレポート',
- explainHold: 'この経費を保留している理由を説明してください。',
+ explainHold: 'この経費を保留にしている理由を説明してください。',
retracted: '撤回されました',
retract: '取り消す',
reopened: '再開されました',
@@ -4780,7 +4780,6 @@ ${date} - ${merchant}に${amount}`,
defaultCard: 'デフォルトカード',
downgradeTitle: `ワークスペースをダウングレードできません`,
downgradeSubTitle: `このワークスペースは、複数のカードフィードが接続されているため(Expensifyカードを除く)、ダウングレードできません。どうぞ <a href="#">カードフィードを1つだけ保持</a> 続行する。`,
-
noAccountsFoundDescription: ({connection}: ConnectionParams) => `${connection}にアカウントを追加し、再度接続を同期してください。`,
expensifyCardBannerTitle: 'Expensifyカードを取得する',
expensifyCardBannerSubtitle: 'すべての米国での購入でキャッシュバックを楽しみ、Expensifyの請求書が最大50%オフ、無制限のバーチャルカードなど、さらに多くの特典があります。',
@@ -7361,6 +7360,16 @@ ${date} - ${merchant}に${amount}`,
description: ({domainName}: {domainName: string}) =>
`<muted-text><centered-text>ドメイン <strong>${domainName}</strong> は正常に検証され、SAML やその他のセキュリティ機能を設定できるようになりました。</centered-text></muted-text>`,
},
+ saml: 'SAML',
+ featureList: {
+ title: 'SAML シングルサインオン (SSO)',
+ subtitle: ({domainName}: {domainName: string}) =>
+ `<muted-text><a href="${CONST.SAML_HELP_URL}">SAML SSO</a> は、<strong>${domainName}</strong> のメールアドレスを持つメンバーのExpensifyへのログイン方法をより細かく管理できるセキュリティ機能です。有効にするには、権限のある会社の管理者であることを確認する必要があります。</muted-text>`,
+ fasterAndEasierLogin: 'より速く、より簡単なログイン',
+ moreSecurityAndControl: 'さらなるセキュリティと管理',
+ onePasswordForAnything: 'すべてを1つのパスワードで',
+ },
+ goToDomain: 'ドメインに移動',
},
};
// IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 4fefcdcf..ab8f786c 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -1345,10 +1345,10 @@ const translations = {
genericHoldExpenseFailureMessage: 'Onverwachte fout bij het vasthouden van deze uitgave. Probeer het later opnieuw.',
genericUnholdExpenseFailureMessage: 'Onverwachte fout bij het van hold halen van deze uitgave. Probeer het later opnieuw.',
receiptDeleteFailureError: 'Onverwachte fout bij het verwijderen van dit ontvangstbewijs. Probeer het later opnieuw.',
- receiptFailureMessage: 'Er is een fout opgetreden bij het uploaden van uw bon. Alstublieft',
+ receiptFailureMessage: 'Er is een fout opgetreden bij het uploaden van je bon. Gelieve',
receiptFailureMessageShort: 'Er is een fout opgetreden bij het uploaden van uw bon.',
- tryAgainMessage: 'probeer het opnieuw',
- saveFileMessage: 'sla de bon op',
+ tryAgainMessage: 'Probeer het opnieuw',
+ saveFileMessage: 'Sla de bon op',
uploadLaterMessage: 'om later te uploaden.',
genericDeleteFailureMessage: 'Onverwachte fout bij het verwijderen van deze uitgave. Probeer het later opnieuw.',
genericEditFailureMessage: 'Onverwachte fout bij het bewerken van deze uitgave. Probeer het later opnieuw.',
@@ -1370,7 +1370,7 @@ const translations = {
enableWallet: 'Portemonnee inschakelen',
hold: 'Vasthouden',
unhold: 'Verwijder blokkering',
- holdExpense: 'Uitgave vasthouden',
+ holdExpense: 'Uitgave in de wacht zetten',
unholdExpense: 'Uitgave deblokkeren',
heldExpense: 'deze uitgave vastgehouden',
unheldExpense: 'deblokkeer deze uitgave',
@@ -1381,7 +1381,7 @@ const translations = {
emptyStateUnreportedExpenseSubtitle: 'Het lijkt erop dat je geen niet-gerapporteerde uitgaven hebt. Probeer er hieronder een aan te maken.',
addUnreportedExpenseConfirm: 'Toevoegen aan rapport',
newReport: 'Nieuw rapport',
- explainHold: 'Leg uit waarom je deze uitgave vasthoudt.',
+ explainHold: 'Leg uit waarom je deze uitgave aanhoudt.',
retracted: 'ingetrokken',
retract: 'Intrekken',
reopened: 'heropend',
@@ -4817,7 +4817,6 @@ ${amount} voor ${merchant} - ${date}`,
defaultCard: 'Standaardkaart',
downgradeTitle: `Kan werkruimte niet downgraden`,
downgradeSubTitle: `Deze werkruimte kan niet worden gedowngraded omdat er meerdere kaartfeeds zijn verbonden (met uitzondering van Expensify Cards). Alstublieft <a href="#">houd slechts één kaartfeed</a> om door te gaan.`,
-
noAccountsFoundDescription: ({connection}: ConnectionParams) => `Voeg het account toe in ${connection} en synchroniseer de verbinding opnieuw.`,
expensifyCardBannerTitle: 'Verkrijg de Expensify Card',
expensifyCardBannerSubtitle: 'Geniet van cashback op elke aankoop in de VS, tot 50% korting op je Expensify-rekening, onbeperkte virtuele kaarten en nog veel meer.',
@@ -7412,6 +7411,16 @@ ${amount} voor ${merchant} - ${date}`,
description: ({domainName}: {domainName: string}) =>
`<muted-text><centered-text>Het domein <strong>${domainName}</strong> is succesvol geverifieerd en je kunt nu SAML en andere beveiligingsfuncties instellen.</centered-text></muted-text>`,
},
+ saml: 'SAML',
+ featureList: {
+ title: 'SAML eenmalige aanmelding (SSO)',
+ subtitle: ({domainName}: {domainName: string}) =>
+ `<muted-text><a href="${CONST.SAML_HELP_URL}">SAML SSO</a> is een beveiligingsfunctie die je meer controle geeft over hoe leden met e-mailadressen van <strong>${domainName}</strong> inloggen bij Expensify. Om dit in te schakelen, moet je bevestigen dat je een geautoriseerde bedrijfsbeheerder bent.</muted-text>`,
+ fasterAndEasierLogin: 'Sneller en makkelijker inloggen',
+ moreSecurityAndControl: 'Meer beveiliging en controle',
+ onePasswordForAnything: 'Eén wachtwoord voor alles',
+ },
+ goToDomain: 'Ga naar het domein',
},
};
// IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index c6c0dd6b..59a0578b 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -452,7 +452,7 @@ const translations = {
send: 'Wyślij',
na: 'N/A',
noResultsFound: 'Nie znaleziono wyników',
- noResultsFoundMatching: ({searchString}: {searchString: string}) => `Nie znaleziono wyników pasujących do "${searchString}"`,
+ noResultsFoundMatching: ({searchString}: {searchString: string}) => `Nie znaleziono wyników pasujących do „${searchString}”`,
recentDestinations: 'Ostatnie miejsca docelowe',
timePrefix: 'To jest',
conjunctionFor: 'dla',
@@ -1343,11 +1343,11 @@ const translations = {
genericHoldExpenseFailureMessage: 'Nieoczekiwany błąd podczas wstrzymywania tego wydatku. Proszę spróbować ponownie później.',
genericUnholdExpenseFailureMessage: 'Nieoczekiwany błąd podczas zdejmowania tego wydatku z blokady. Proszę spróbować ponownie później.',
receiptDeleteFailureError: 'Nieoczekiwany błąd podczas usuwania tego paragonu. Proszę spróbować ponownie później.',
- receiptFailureMessage: 'Wystąpił błąd podczas przesyłania paragonu. Proszę',
+ receiptFailureMessage: 'Wystąpił błąd podczas przesyłania Twojego paragonu. Proszę',
receiptFailureMessageShort: 'Wystąpił błąd podczas przesyłania paragonu.',
tryAgainMessage: 'spróbuj ponownie',
saveFileMessage: 'zapisz paragon',
- uploadLaterMessage: 'do przesłania później.',
+ uploadLaterMessage: 'do późniejszego przesłania.',
genericDeleteFailureMessage: 'Nieoczekiwany błąd podczas usuwania tego wydatku. Proszę spróbować ponownie później.',
genericEditFailureMessage: 'Nieoczekiwany błąd podczas edytowania tego wydatku. Proszę spróbować ponownie później.',
genericSmartscanFailureMessage: 'Transakcja ma brakujące pola',
@@ -4432,7 +4432,6 @@ ${amount} dla ${merchant} - ${date}`,
displayedAsTagDescription: 'Dział będzie można wybrać dla każdego indywidualnego wydatku w raporcie pracownika.',
displayedAsReportFieldDescription: 'Wybór działu będzie dotyczył wszystkich wydatków w raporcie pracownika.',
toggleImportTitle: ({mappingTitle}: ToggleImportTitleParams) => `Wybierz, jak obsługiwać Sage Intacct <strong>${mappingTitle}</strong> w Expensify.`,
-
expenseTypes: 'Typy wydatków',
expenseTypesDescription: 'Twoje typy wydatków Sage Intacct zostaną zaimportowane do Expensify jako kategorie.',
accountTypesDescription: 'Twój plan kont Sage Intacct zostanie zaimportowany do Expensify jako kategorie.',
@@ -4806,7 +4805,6 @@ ${amount} dla ${merchant} - ${date}`,
defaultCard: 'Domyślna karta',
downgradeTitle: `Nie można obniżyć poziomu workspace.`,
downgradeSubTitle: `Tego miejsca pracy nie można obniżyć, ponieważ jest połączonych wiele kanałów kart (z wyłączeniem kart Expensify). Proszę <a href="#">zachowaj tylko jeden kanał kart</a> aby kontynuować.`,
-
noAccountsFoundDescription: ({connection}: ConnectionParams) => `Proszę dodać konto w ${connection} i ponownie zsynchronizować połączenie.`,
expensifyCardBannerTitle: 'Zdobądź kartę Expensify',
expensifyCardBannerSubtitle:
@@ -7400,6 +7398,16 @@ ${amount} dla ${merchant} - ${date}`,
description: ({domainName}: {domainName: string}) =>
`<muted-text><centered-text>Domena <strong>${domainName}</strong> została pomyślnie zweryfikowana i możesz teraz skonfigurować SAML oraz inne funkcje zabezpieczeń.</centered-text></muted-text>`,
},
+ saml: 'SAML',
+ featureList: {
+ title: 'Jednokrotne logowanie SAML (SSO)',
+ subtitle: ({domainName}: {domainName: string}) =>
+ `<muted-text><a href="${CONST.SAML_HELP_URL}">SAML SSO</a> to funkcja bezpieczeństwa, która daje Ci większą kontrolę nad tym, w jaki sposób członkowie z adresami e‑mail w domenie <strong>${domainName}</strong> logują się do Expensify. Aby ją włączyć, musisz potwierdzić, że jesteś uprawnionym administratorem firmy.</muted-text>`,
+ fasterAndEasierLogin: 'Szybsze i łatwiejsze logowanie',
+ moreSecurityAndControl: 'Więcej bezpieczeństwa i kontroli',
+ onePasswordForAnything: 'Jedno hasło do wszystkiego',
+ },
+ goToDomain: 'Przejdź do domeny',
},
};
// IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 31b648b0..03431c60 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -452,7 +452,7 @@ const translations = {
send: 'Enviar',
na: 'N/A',
noResultsFound: 'Nenhum resultado encontrado',
- noResultsFoundMatching: ({searchString}: {searchString: string}) => `Nenhum resultado encontrado correspondente a "${searchString}"`,
+ noResultsFoundMatching: ({searchString}: {searchString: string}) => `Nenhum resultado encontrado para "${searchString}"`,
recentDestinations: 'Destinos recentes',
timePrefix: 'É',
conjunctionFor: 'para',
@@ -1341,9 +1341,9 @@ const translations = {
genericHoldExpenseFailureMessage: 'Erro inesperado ao reter esta despesa. Por favor, tente novamente mais tarde.',
genericUnholdExpenseFailureMessage: 'Erro inesperado ao remover esta despesa da retenção. Por favor, tente novamente mais tarde.',
receiptDeleteFailureError: 'Erro inesperado ao excluir este recibo. Por favor, tente novamente mais tarde.',
- receiptFailureMessage: 'Houve um erro ao enviar seu recibo. Por favor,',
+ receiptFailureMessage: 'Houve um erro ao carregar seu recibo. Por favor',
receiptFailureMessageShort: 'Houve um erro ao enviar seu recibo.',
- tryAgainMessage: 'tente novamente',
+ tryAgainMessage: 'Tentar novamente',
saveFileMessage: 'salvar o recibo',
uploadLaterMessage: 'para enviar mais tarde.',
genericDeleteFailureMessage: 'Erro inesperado ao excluir esta despesa. Por favor, tente novamente mais tarde.',
@@ -4431,7 +4431,6 @@ ${amount} para ${merchant} - ${date}`,
displayedAsTagDescription: 'O departamento será selecionável para cada despesa individual no relatório de um funcionário.',
displayedAsReportFieldDescription: 'A seleção de departamento será aplicada a todas as despesas no relatório de um funcionário.',
toggleImportTitle: ({mappingTitle}: ToggleImportTitleParams) => `Escolha como lidar com o Sage Intacct <strong>${mappingTitle}</strong> in Expensify.`,
-
expenseTypes: 'Tipos de despesas',
expenseTypesDescription: 'Seus tipos de despesas do Sage Intacct serão importados para o Expensify como categorias.',
accountTypesDescription: 'Seu plano de contas do Sage Intacct será importado para o Expensify como categorias.',
@@ -4807,7 +4806,6 @@ ${amount} para ${merchant} - ${date}`,
defaultCard: 'Cartão padrão',
downgradeTitle: `Não é possível rebaixar o espaço de trabalho`,
downgradeSubTitle: `Este espaço de trabalho não pode ser rebaixado porque vários feeds de cartão estão conectados (excluindo os Cartões Expensify). Por favor, <a href="#">manter apenas um feed de cartão</a> para prosseguir.`,
-
noAccountsFoundDescription: ({connection}: ConnectionParams) => `Por favor, adicione a conta em ${connection} e sincronize a conexão novamente.`,
expensifyCardBannerTitle: 'Obtenha o Cartão Expensify',
expensifyCardBannerSubtitle: 'Aproveite o cashback em todas as compras nos EUA, até 50% de desconto na sua fatura do Expensify, cartões virtuais ilimitados e muito mais.',
@@ -7381,10 +7379,9 @@ ${amount} para ${merchant} - ${date}`,
exportInProgress: 'Exportação em andamento',
conciergeWillSend: 'Concierge enviará o arquivo em breve.',
},
-
avatarPage: {
title: 'Editar foto de perfil',
- upload: 'Carregar',
+ upload: 'Fazer upload',
uploadPhoto: 'Carregar foto',
selectAvatar: 'Selecionar avatar',
chooseCustomAvatar: 'Ou escolha um avatar personalizado',
@@ -7415,6 +7412,16 @@ ${amount} para ${merchant} - ${date}`,
description: ({domainName}: {domainName: string}) =>
`<muted-text><centered-text>O domínio <strong>${domainName}</strong> foi verificado com sucesso e agora você pode configurar SAML e outros recursos de segurança.</centered-text></muted-text>`,
},
+ saml: 'SAML',
+ featureList: {
+ title: 'Logon único SAML (SSO)',
+ subtitle: ({domainName}: {domainName: string}) =>
+ `<muted-text><a href="${CONST.SAML_HELP_URL}">SAML SSO</a> é um recurso de segurança que oferece mais controle sobre como os membros com e-mails do domínio <strong>${domainName}</strong> fazem login no Expensify. Para ativá-lo, você precisará confirmar sua identidade como um administrador autorizado da empresa.</muted-text>`,
+ fasterAndEasierLogin: 'Login mais rápido e fácil',
+ moreSecurityAndControl: 'Mais segurança e controle',
+ onePasswordForAnything: 'Uma senha para tudo',
+ },
+ goToDomain: 'Ir para o domínio',
},
};
// IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 31f4e8aa..f69701dc 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -452,7 +452,7 @@ const translations = {
send: '发送',
na: 'N/A',
noResultsFound: '未找到结果',
- noResultsFoundMatching: ({searchString}: {searchString: string}) => `未找到与“${searchString}”匹配的结果`,
+ noResultsFoundMatching: ({searchString}: {searchString: string}) => `未找到与"${searchString}"匹配的结果`,
recentDestinations: '最近的目的地',
timePrefix: '它是',
conjunctionFor: '为',
@@ -1329,9 +1329,9 @@ const translations = {
receiptDeleteFailureError: '删除此收据时发生意外错误。请稍后再试。',
receiptFailureMessage: '上传您的收据时出错。请',
receiptFailureMessageShort: '上传您的收据时出错。',
- tryAgainMessage: '再试一次',
+ tryAgainMessage: '重试',
saveFileMessage: '保存收据',
- uploadLaterMessage: '稍后上传。',
+ uploadLaterMessage: '以便稍后上传。',
genericDeleteFailureMessage: '删除此费用时出现意外错误。请稍后再试。',
genericEditFailureMessage: '编辑此费用时发生意外错误。请稍后再试。',
genericSmartscanFailureMessage: '交易缺少字段',
@@ -1351,7 +1351,7 @@ const translations = {
enableWallet: '启用钱包',
hold: '保持',
unhold: '移除保留',
- holdExpense: '保留费用',
+ holdExpense: '暂挂费用',
unholdExpense: '取消保留费用',
heldExpense: '保留此费用',
unheldExpense: '取消搁置此费用',
@@ -1362,7 +1362,7 @@ const translations = {
emptyStateUnreportedExpenseSubtitle: '看起来您没有未报告的费用。请尝试在下面创建一个。',
addUnreportedExpenseConfirm: '添加到报告',
newReport: '新报告',
- explainHold: '请解释您为何保留此费用。',
+ explainHold: '请说明暂缓处理这笔费用的原因。',
retracted: '撤回',
retract: '撤回',
reopened: '重新打开',
@@ -4717,7 +4717,6 @@ ${merchant}的${amount} - ${date}`,
defaultCard: '默认卡片',
downgradeTitle: `无法降级工作区`,
downgradeSubTitle: `由于连接了多个卡片馈送(不包括Expensify卡),此工作区无法降级。请 <a href="#">仅保留一个卡片信息流</a> 继续。`,
-
noAccountsFoundDescription: ({connection}: ConnectionParams) => `请在${connection}中添加账户并再次同步连接。`,
expensifyCardBannerTitle: '获取Expensify卡',
expensifyCardBannerSubtitle: '享受每笔美国消费的现金返还,Expensify账单最高可享50%折扣,无限虚拟卡等更多优惠。',
@@ -7246,6 +7245,16 @@ ${merchant}的${amount} - ${date}`,
description: ({domainName}: {domainName: string}) =>
`<muted-text><centered-text>域名 <strong>${domainName}</strong> 已成功验证,您现在可以设置 SAML 和其他安全功能。</centered-text></muted-text>`,
},
+ saml: 'SAML',
+ featureList: {
+ title: 'SAML 单点登录 (SSO)',
+ subtitle: ({domainName}: {domainName: string}) =>
+ `<muted-text><a href="${CONST.SAML_HELP_URL}">SAML SSO</a> 是一项安全功能,可让您更好地控制使用 <strong>${domainName}</strong> 邮箱的成员如何登录 Expensify。要启用它,您需要验证自己是授权的公司管理员。</muted-text>`,
+ fasterAndEasierLogin: '更快、更简单的登录',
+ moreSecurityAndControl: '更强的安全性与控制',
+ onePasswordForAnything: '一个密码搞定一切',
+ },
+ goToDomain: '前往域',
},
};
// IMPORTANT: This line is manually replaced in generate translation files by scripts/generateTranslations.ts,
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
…got it" navigation
|
🚧 @mountiny has triggered a test Expensify/App build. You can view the workflow run here. |
|
Thanks! |
|
I also prefer the first option |
| }, [accountID, domain?.validated, doesDomainExist, redirectTo]); | ||
|
|
||
| if (domainMetadata.status === 'loading') { | ||
| if (domainMetadata.status === 'loading' || isAdminMetadata.status === 'loading') { |
There was a problem hiding this comment.
Shouldnt we use isLoadingOnyxValue for this? what is the best practice? I think we should standardize on one of these ways cc @fabioh8010
There was a problem hiding this comment.
oh, I didn't know about this function. I can fix it now or in the next PR
There was a problem hiding this comment.
Yes, isLoadingOnyxValue is designed for these cases 👍 . The equivalent would be:
if (isLoadingOnyxValue(domainMetadata, isAdminMetadata)) {
|
@mountiny |
|
@NikkiWines looks like this was merged without a test passing. Please add a note explaining why this was done and remove the |
|
All non-skipped tests were passing |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🚀 Deployed to staging by https://github.com/NikkiWines in version: 9.2.59-0 🚀
|
|
@NikkiWines @mountiny We are not able to run this PR as most of the domains team had are already verified. |
|
I was able to get an unverified domain set up via this SO post. For some reason the DNS verification isn't working, but I think that's an error on my end, now something with our code. Will try again in the morning but everything else looks good! Screen.Recording.2025-11-17.at.8.59.43.PM.mov |
|
🚀 Deployed to production by https://github.com/grgia in version: 9.2.59-5 🚀
|

Explanation of Change
Creates a dedicated Domain page, similar to the one for a Workspace, containing a SAML configuration page. Sets up navigation patterns for later expansion with more subpages. Clicking on an unverified domain by an admin now navigates to the SAML page with a list of features and an option to verify the domain from there.
Fixed Issues
$ #72603
PROPOSAL: N/A
Tests
also:
Offline tests
N/A
QA Steps
Same as tests.
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectioncanBeMissingparam foruseOnyxtoggleReportand notonIconClick)src/languages/*files and using the translation methodSTYLE.md) were followedAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.ScrollViewcomponent to make it scrollable when more elements are added to the page.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
Nagranie.z.ekranu.2025-11-10.o.17.16.52.mov
Android: mWeb Chrome
Nagranie.z.ekranu.2025-11-10.o.17.08.43.mov
iOS: Native
Simulator.Screen.Recording.-.iPhone.16.Pro.Max.-.2025-11-10.at.14.28.05.mp4
iOS: mWeb Safari
Simulator.Screen.Recording.-.iPhone.16.Pro.Max.-.2025-11-10.at.17.06.31.mp4
MacOS: Chrome / Safari
Nagranie.z.ekranu.2025-11-10.o.14.24.55.mov
MacOS: Desktop
Nagranie.z.ekranu.2025-11-10.o.17.12.04.mov