diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 59f9a6dd758f..cedb427f0fe5 100644 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -2271,6 +2271,7 @@ const CONST = { UNASSIGN_COMPANY_CARD: 'POLICYCHANGELOG_UNASSIGN_COMPANY_CARD', UPDATE_CARD_FEED_LIABILITY: 'POLICYCHANGELOG_UPDATE_CARD_FEED_LIABILITY', UPDATE_CARD_FEED_STATEMENT_PERIOD: 'POLICYCHANGELOG_UPDATE_CARD_FEED_STATEMENT_PERIOD', + UPDATE_CARD_FEED_REIMBURSABLE: 'POLICYCHANGELOG_UPDATE_CARD_FEED_REIMBURSABLE', LEAVE_POLICY: 'POLICYCHANGELOG_LEAVE_POLICY', CORPORATE_UPGRADE: 'POLICYCHANGELOG_CORPORATE_UPGRADE', CORPORATE_FORCE_UPGRADE: 'POLICYCHANGELOG_CORPORATE_FORCE_UPGRADE', @@ -5925,6 +5926,13 @@ const CONST = { LAST_BUSINESS_DAY_OF_MONTH: 'LAST_BUSINESS_DAY_OF_MONTH', CUSTOM_DAY_OF_MONTH: 'CUSTOM_DAY_OF_MONTH', }, + FEED_REIMBURSABLE: { + FORCE_YES: 'force_yes', + FORCE_NO: 'force_no', + DEFAULT_YES: 'default_yes', + DEFAULT_NO: 'default_no', + }, + FEED_REIMBURSABLE_LEGACY_NONE: 'none', CARD_NAME: { CASH: '__CASH__', }, diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 7100763e297f..c97ee113acd9 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -4089,6 +4089,10 @@ const ROUTES = { route: 'workspaces/:policyID/company-cards/settings/statement-close-date', getRoute: (policyID: string) => `workspaces/${policyID}/company-cards/settings/statement-close-date` as const, }, + WORKSPACE_COMPANY_CARDS_SETTINGS_REIMBURSABLE: { + route: 'workspaces/:policyID/company-cards/settings/reimbursable', + getRoute: (policyID: string) => `workspaces/${policyID}/company-cards/settings/reimbursable` as const, + }, WORKSPACE_RULES: { route: 'workspaces/:policyID/rules', /** @param tab preselects a Rules tab. The page otherwise restores the last one used. */ diff --git a/src/SCREENS.ts b/src/SCREENS.ts index c1da1aad7140..a0929683daa2 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -828,6 +828,7 @@ const SCREENS = { COMPANY_CARDS_SETTINGS: 'Workspace_CompanyCards_Settings', COMPANY_CARDS_SETTINGS_FEED_NAME: 'Workspace_CompanyCards_Settings_Feed_Name', COMPANY_CARDS_SETTINGS_STATEMENT_CLOSE_DATE: 'Workspace_CompanyCards_Settings_Statement_Close_Date', + COMPANY_CARDS_SETTINGS_REIMBURSABLE: 'Workspace_CompanyCards_Settings_Reimbursable', DYNAMIC_COMPANY_CARD_DETAILS: 'Dynamic_Workspace_CompanyCard_Details', COMPANY_CARD_EDIT_CARD_NAME: 'Workspace_CompanyCard_Edit_Card_Name', COMPANY_CARD_ADD_WORK_EMAIL: 'Workspace_CompanyCard_Add_Work_Email', diff --git a/src/components/CategoryPicker/index.tsx b/src/components/CategoryPicker/index.tsx index 6c0ea6db13b2..9fa73c606d7d 100644 --- a/src/components/CategoryPicker/index.tsx +++ b/src/components/CategoryPicker/index.tsx @@ -118,16 +118,14 @@ function CategoryPicker({ }); const noneOption: OptionTree[] = shouldShowNoneOption - ? getNoneOption(debouncedSearchValue, !selectedCategory, translate).map( - (option): OptionTree => ({ - text: option.text, - keyForList: option.keyForList, - searchText: '', - tooltipText: option.text, - isDisabled: false, - isSelected: option.isSelected, - }), - ) + ? getNoneOption(debouncedSearchValue, !selectedCategory, translate).map((option): OptionTree => ({ + text: option.text, + keyForList: option.keyForList, + searchText: '', + tooltipText: option.text, + isDisabled: false, + isSelected: option.isSelected, + })) : []; const noneOptionSection = { title: '', diff --git a/src/languages/IntlStore.ts b/src/languages/IntlStore.ts index 72f136fd8e54..0432bc004aba 100644 --- a/src/languages/IntlStore.ts +++ b/src/languages/IntlStore.ts @@ -265,7 +265,9 @@ class IntlStore { }) .catch((error: unknown) => { if (localeSpan) { - endSpanWithAttributes(CONST.TELEMETRY.SPAN_LOCALE.TRANSLATIONS_LOAD, {[CONST.TELEMETRY.ATTRIBUTE_FAILED]: true}); + endSpanWithAttributes(CONST.TELEMETRY.SPAN_LOCALE.TRANSLATIONS_LOAD, { + [CONST.TELEMETRY.ATTRIBUTE_FAILED]: true, + }); } // Recovery is exhausted: the locale never resolves and the boot splash intentionally stays up — diff --git a/src/languages/de.ts b/src/languages/de.ts index 6cac84e85b3d..0e31756ea79a 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -510,7 +510,10 @@ const translations: TranslationDeepObject = { quarter: 'Quartal', vacationDelegate: 'Urlaubsvertretung', expensifyLogo: 'Expensify-Logo', - concierge: {greeting: 'Hallo, wie kann ich helfen?', showHistory: 'Verlauf anzeigen'}, + concierge: { + greeting: 'Hallo, wie kann ich helfen?', + showHistory: 'Verlauf anzeigen', + }, duplicateReport: 'Duplizierten Bericht', approver: 'Genehmiger', goToConcierge: 'Zu Concierge', @@ -549,8 +552,16 @@ const translations: TranslationDeepObject = { hasAnAnswer: 'Concierge hat eine Antwort!', collapseReasoning: 'Begründung einklappen', expandReasoning: 'Begründung erweitern', - enableNotifications: {prompt: 'Möchten Sie benachrichtigt werden, wenn Concierge antwortet?', cta: 'Benachrichtigen'}, - feedback: {prompt: 'War diese Antwort hilfreich?', useful: 'Hilfreiche Antwort', notUseful: 'Nicht hilfreiche Antwort', thanks: 'Danke für Ihr Feedback!'}, + enableNotifications: { + prompt: 'Möchten Sie benachrichtigt werden, wenn Concierge antwortet?', + cta: 'Benachrichtigen', + }, + feedback: { + prompt: 'War diese Antwort hilfreich?', + useful: 'Hilfreiche Antwort', + notUseful: 'Nicht hilfreiche Antwort', + thanks: 'Danke für Ihr Feedback!', + }, }, supportalNoAccess: { title: 'Nicht so schnell', @@ -692,7 +703,10 @@ const translations: TranslationDeepObject = { statusNeverRegistered: 'Nie registriert', statusNotRegistered: 'Nicht registriert', statusRegisteredThisDevice: 'Registriert', - statusRegisteredOtherDevice: () => ({one: 'Anderes Gerät registriert', other: 'Andere Geräte registriert'}), + statusRegisteredOtherDevice: () => ({ + one: 'Anderes Gerät registriert', + other: 'Andere Geräte registriert', + }), }, pleaseEnableInSystemSettings: { start: 'Bitte aktiviere die Gesichts-/Fingerabdrucküberprüfung oder richte einen Gerätecode auf deinem Gerät ein', @@ -705,7 +719,10 @@ const translations: TranslationDeepObject = { letsVerifyItsYou: 'Lass uns bestätigen, dass du es bist', nowLetsAuthenticateYou: 'Lassen Sie uns Sie jetzt authentifizieren …', letsAuthenticateYou: 'Lass uns dich authentifizieren …', - verifyYourself: {biometrics: 'Bestätige dich mit deinem Gesicht oder Fingerabdruck', passkeys: 'Bestätigen Sie sich mit einem Passkey'}, + verifyYourself: { + biometrics: 'Bestätige dich mit deinem Gesicht oder Fingerabdruck', + passkeys: 'Bestätigen Sie sich mit einem Passkey', + }, enableQuickVerification: { biometrics: 'Aktiviere eine schnelle, sichere Verifizierung mit deinem Gesicht oder Fingerabdruck. Keine Passwörter oder Codes erforderlich.', passkeys: 'Aktivieren Sie eine schnelle, sichere Verifizierung mit einem Passkey. Keine Passwörter oder Codes erforderlich.', @@ -740,10 +757,18 @@ const translations: TranslationDeepObject = { pleaseUseWebApp: `Diese Aktion wird auf deinem Gerät nicht unterstützt. Bitte verwende die Expensify-Webanwendung und versuche es erneut.`, }, verificationFailed: 'Überprüfung fehlgeschlagen', - setPin: {didNotShipCard: 'Wir haben Ihre Karte nicht versendet. Bitte versuchen Sie es erneut.'}, - revealPin: {couldNotReveal: 'Wir konnten Ihre PIN nicht anzeigen. Bitte versuchen Sie es erneut.'}, - changePin: {didNotChange: 'Wir haben Ihre PIN nicht geändert. Bitte versuchen Sie es erneut.'}, - revealCardDetail: {couldNotReveal: 'Wir konnten Ihre Kartendaten nicht anzeigen. Bitte versuchen Sie es noch einmal.'}, + setPin: { + didNotShipCard: 'Wir haben Ihre Karte nicht versendet. Bitte versuchen Sie es erneut.', + }, + revealPin: { + couldNotReveal: 'Wir konnten Ihre PIN nicht anzeigen. Bitte versuchen Sie es erneut.', + }, + changePin: { + didNotChange: 'Wir haben Ihre PIN nicht geändert. Bitte versuchen Sie es erneut.', + }, + revealCardDetail: { + couldNotReveal: 'Wir konnten Ihre Kartendaten nicht anzeigen. Bitte versuchen Sie es noch einmal.', + }, }, validateCodeModal: { successfulSignInTitle: Str.dedent(` @@ -983,11 +1008,27 @@ const translations: TranslationDeepObject = { toDos: 'Aufgaben', timeSensitiveSection: { title: 'Zeitkritisch', - addShippingAddress: {title: 'Wir benötigen deine Versandadresse', subtitle: 'Geben Sie eine Adresse an, um Ihre Expensify Karte zu erhalten.', cta: 'Hinzufügen'}, - addPaymentCard: {title: 'Fügen Sie eine Zahlungskarte hinzu, um Expensify weiter zu nutzen', subtitle: 'Konto > Abonnement', cta: 'Hinzufügen'}, - addBankAccount: {title: 'Fügen Sie ein Bankkonto hinzu, um eine Erstattung zu erhalten'}, - addDepositAccount: {title: 'Fügen Sie ein Bankkonto hinzu, um Zahlungen zu erhalten'}, - activateCard: {title: 'Aktivieren Sie Ihre Expensify Karte', subtitle: 'Validieren Sie Ihre Karte und beginnen Sie mit dem Ausgeben.', cta: 'Aktivieren'}, + addShippingAddress: { + title: 'Wir benötigen deine Versandadresse', + subtitle: 'Geben Sie eine Adresse an, um Ihre Expensify Karte zu erhalten.', + cta: 'Hinzufügen', + }, + addPaymentCard: { + title: 'Fügen Sie eine Zahlungskarte hinzu, um Expensify weiter zu nutzen', + subtitle: 'Konto > Abonnement', + cta: 'Hinzufügen', + }, + addBankAccount: { + title: 'Fügen Sie ein Bankkonto hinzu, um eine Erstattung zu erhalten', + }, + addDepositAccount: { + title: 'Fügen Sie ein Bankkonto hinzu, um Zahlungen zu erhalten', + }, + activateCard: { + title: 'Aktivieren Sie Ihre Expensify Karte', + subtitle: 'Validieren Sie Ihre Karte und beginnen Sie mit dem Ausgeben.', + cta: 'Aktivieren', + }, confirmDigitalWalletAddition: { subtitle: 'Expensify Karte', }, @@ -1012,16 +1053,30 @@ const translations: TranslationDeepObject = { title: ({cardName}: {cardName?: string}) => (cardName ? `Verbindung der persönlichen Karte ${cardName} reparieren` : 'Verbindung der persönlichen Karte reparieren'), subtitle: 'Wallet', }, - addHomeAddress: {title: 'Fügen Sie Ihre Privatadresse zur Entfernungserfassung hinzu', subtitle: 'Konto', cta: 'Hinzufügen'}, - fixFailedBilling: {title: 'Wir konnten Ihre hinterlegte Karte nicht belasten', subtitle: 'Abonnement'}, + addHomeAddress: { + title: 'Fügen Sie Ihre Privatadresse zur Entfernungserfassung hinzu', + subtitle: 'Konto', + cta: 'Hinzufügen', + }, + fixFailedBilling: { + title: 'Wir konnten Ihre hinterlegte Karte nicht belasten', + subtitle: 'Abonnement', + }, unlockBankAccount: { workspaceTitle: 'Ihr Geschäftskonto wurde gesperrt', personalTitle: 'Ihr Bankkonto wurde gesperrt', workspaceSubtitle: ({policyName}: {policyName: string}) => policyName, personalSubtitle: 'Geldbörse', }, - addVirtualCardPersonalDetails: {title: 'Fügen Sie Ihre Daten hinzu, um Ihre Expensify Karte anzuzeigen und zu verwenden.', subtitle: 'Expensify Karte', cta: 'Hinzufügen'}, - enterSignerInfo: {title: 'Unterzeichnerdaten erforderlich', subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Bankkonto ${bankAccountLastFour}`}, + addVirtualCardPersonalDetails: { + title: 'Fügen Sie Ihre Daten hinzu, um Ihre Expensify Karte anzuzeigen und zu verwenden.', + subtitle: 'Expensify Karte', + cta: 'Hinzufügen', + }, + enterSignerInfo: { + title: 'Unterzeichnerdaten erforderlich', + subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Bankkonto ${bankAccountLastFour}`, + }, payOverdueInvoice: { cta: 'Prüfen', dueSoonTitle: ({date}: {date: string}) => `Bezahlen Sie Ihre Rechnung bis zum ${date}, um eine Unterbrechung des Dienstes zu vermeiden`, @@ -1032,8 +1087,13 @@ const translations: TranslationDeepObject = { subtitle: ({date}: {date: string}) => `Abonnement endet am ${date}`, cta: 'Verwalten', }, - emailDeliveryFailure: {title: 'Wir können Ihnen keine E-Mail-Benachrichtigungen senden', subtitle: 'Konto'}, - upgradeNetSuiteConnection: {title: 'Aktualisieren Sie Ihre NetSuite-Verbindung'}, + emailDeliveryFailure: { + title: 'Wir können Ihnen keine E-Mail-Benachrichtigungen senden', + subtitle: 'Konto', + }, + upgradeNetSuiteConnection: { + title: 'Aktualisieren Sie Ihre NetSuite-Verbindung', + }, }, forYouSection: { submit: ({count}: {count: number}) => ({ @@ -1101,7 +1161,10 @@ const translations: TranslationDeepObject = { hotelIn: ({destination}: {destination: string}) => `Hotel in ${destination}`, carRentalIn: ({destination}: {destination: string}) => `Mietwagen in ${destination}`, inOneWeek: 'In 1 Woche', - inDays: () => ({one: 'In 1 Tag', other: (count: number) => `In ${count} Tagen`}), + inDays: () => ({ + one: 'In 1 Tag', + other: (count: number) => `In ${count} Tagen`, + }), today: 'Heute', }, gettingStartedSection: { @@ -1168,7 +1231,10 @@ const translations: TranslationDeepObject = { emptyStateTitle: 'Keine aktuellen Ausgaben', emptyStateMessage: 'Erstellen Sie eine oder ziehen Sie eine Quittung hierher', }, - insightsSection: {chartUnavailable: 'Diagramm nicht verfügbar', notEnoughData: 'Wir haben noch nicht genügend Daten, um dieses Diagramm auszufüllen'}, + insightsSection: { + chartUnavailable: 'Diagramm nicht verfügbar', + notEnoughData: 'Wir haben noch nicht genügend Daten, um dieses Diagramm auszufüllen', + }, conciergePrompt: { goodMorning: ({name}: {name?: string}) => (name ? `Guten Morgen, ${name}.` : 'Guten Morgen.'), goodAfternoon: ({name}: {name?: string}) => (name ? `Guten Tag, ${name}.` : 'Guten Tag.'), @@ -1179,8 +1245,14 @@ const translations: TranslationDeepObject = { }, insightsPage: { viewOnSpend: 'In Ausgaben anzeigen', - emptyState: {title: 'Nichts anzuzeigen', subtitle: 'Versuchen Sie, Ihre Kriterien oben anzupassen'}, - noExpensesState: {title: 'Sehen Sie, wohin Ihr Geld fließt', subtitle: 'Sobald Sie Ausgaben haben, finden Sie Ausgabentrends, Top-Händler und mehr.'}, + emptyState: { + title: 'Nichts anzuzeigen', + subtitle: 'Versuchen Sie, Ihre Kriterien oben anzupassen', + }, + noExpensesState: { + title: 'Sehen Sie, wohin Ihr Geld fließt', + subtitle: 'Sobald Sie Ausgaben haben, finden Sie Ausgabentrends, Top-Händler und mehr.', + }, compare: { label: 'Vergleichen', previousPeriod: 'Vorheriger Zeitraum', @@ -2282,7 +2354,11 @@ const translations: TranslationDeepObject = { saved: 'Gespeichert', }, }, - securityPage: {title: 'Sicherheit', subtitle: 'Schützen Sie Ihr Konto.', goToSecurity: 'Zur Sicherheitsseite zurückkehren'}, + securityPage: { + title: 'Sicherheit', + subtitle: 'Schützen Sie Ihr Konto.', + goToSecurity: 'Zur Sicherheitsseite zurückkehren', + }, shareCodePage: { title: 'Ihr Code', subtitle: 'Lade Mitglieder zu Expensify ein, indem du deinen persönlichen QR-Code oder Empfehlungslink teilst.', @@ -2396,8 +2472,14 @@ const translations: TranslationDeepObject = { testingPreferences: 'Testeinstellungen', server: 'Server', servers: { - production: {label: 'Produktion', description: 'Die Live-Umgebung, die echte Nutzer sehen'}, - staging: {label: 'Staging', description: 'Spiegel der Produktion. Wird für die endgültige Validierung verwendet'}, + production: { + label: 'Produktion', + description: 'Die Live-Umgebung, die echte Nutzer sehen', + }, + staging: { + label: 'Staging', + description: 'Spiegel der Produktion. Wird für die endgültige Validierung verwendet', + }, qa: {label: 'QA', description: 'Experimentelle Umgebung für Tests'}, }, serverPinnedDescription: 'Dieser Build kommuniziert immer mit einem Server, daher kann er hier nicht geändert werden.', @@ -2861,7 +2943,10 @@ const translations: TranslationDeepObject = { getStarted: "Los geht's", headerTitle: 'Globale Erstattungen', }, - wiseGlobalReimbursementsBanner: {title: 'Weltweit bezahlen', subtitle: 'Aktivieren Sie globale Erstattungen auf Ihrem USD-Konto.'}, + wiseGlobalReimbursementsBanner: { + title: 'Weltweit bezahlen', + subtitle: 'Aktivieren Sie globale Erstattungen auf Ihrem USD-Konto.', + }, }, addCardToDigitalWallet: { title: ({walletName}: {walletName: string}) => `Karte zu ${walletName} hinzufügen`, @@ -3271,11 +3356,19 @@ ${amount} für ${merchant} – ${date}`, }, editAgentAvatarPage: {title: 'Avatar bearbeiten'}, editAgentNamePage: {title: 'Name der Agentin/des Agenten'}, - editAgentPromptPage: {title: 'Eigene Anweisungen schreiben', error: {emptyPrompt: 'Bitte geben Sie Anweisungen für Ihre:n Agent:in ein.'}}, + editAgentPromptPage: { + title: 'Eigene Anweisungen schreiben', + error: { + emptyPrompt: 'Bitte geben Sie Anweisungen für Ihre:n Agent:in ein.', + }, + }, expenseRulesPage: { title: 'Ausgabenregeln', findRule: 'Regel finden', - emptyRules: {title: 'Noch keine Regeln', subtitle: 'Füge eine Regel hinzu, um die Spesenabrechnung zu automatisieren.'}, + emptyRules: { + title: 'Noch keine Regeln', + subtitle: 'Füge eine Regel hinzu, um die Spesenabrechnung zu automatisieren.', + }, changes: { billableUpdate: (value: boolean) => `Ausgabe ${value ? 'verrechenbar' : 'nicht abrechenbar'} aktualisieren`, categoryUpdate: (value: string) => `Kategorie auf „${value}“ aktualisieren`, @@ -3934,7 +4027,11 @@ ${amount} für ${merchant} – ${date}`, detailsPage: { localTime: 'Ortszeit', }, - newChatPage: {startGroup: 'Gruppe starten', addToGroup: 'Zur Gruppe hinzufügen', addUserToGroup: (username: string) => `${username} zur Gruppe hinzufügen`}, + newChatPage: { + startGroup: 'Gruppe starten', + addToGroup: 'Zur Gruppe hinzufügen', + addUserToGroup: (username: string) => `${username} zur Gruppe hinzufügen`, + }, yearPickerPage: { year: 'Jahr', selectYear: 'Bitte ein Jahr auswählen', @@ -4843,7 +4940,9 @@ ${amount} für ${merchant} – ${date}`, title: 'Steuer-ID', subtitle: 'Geben Sie die Steuer-ID Ihrer juristischen Person ein, damit wir die Reisekostenabrechnung in Ihrer Landeswährung einrichten können.', inputLabel: 'Steuer-ID der juristischen Person', - error: {required: 'Bitte geben Sie die Steuernummer Ihrer juristischen Person ein.'}, + error: { + required: 'Bitte geben Sie die Steuernummer Ihrer juristischen Person ein.', + }, }, nudge: { airfareManual: @@ -5637,10 +5736,16 @@ ${amount} für ${merchant} – ${date}`, label: 'Erstattungsfähige Ausgaben exportieren als', helperText: 'Als erstattungsfähig markierte Ausgaben werden als Verbindlichkeitsrechnungen auf den*die Mitarbeitende*n exportiert.', }, - exportNonReimbursable: {label: 'Nicht erstattungsfähige Ausgaben exportieren als'}, + exportNonReimbursable: { + label: 'Nicht erstattungsfähige Ausgaben exportieren als', + }, expenseReports: 'Spesenabrechnungen', - exportReimbursableExpenseReports: {helperText: 'Als erstattungsfähig markierte Ausgaben werden als Spesenabrechnungen für Mitarbeitende exportiert.'}, - exportNonReimbursableExpenseReports: {helperText: 'Als nicht erstattungsfähig markierte Ausgaben werden als Spesenabrechnungen für Mitarbeitende exportiert.'}, + exportReimbursableExpenseReports: { + helperText: 'Als erstattungsfähig markierte Ausgaben werden als Spesenabrechnungen für Mitarbeitende exportiert.', + }, + exportNonReimbursableExpenseReports: { + helperText: 'Als nicht erstattungsfähig markierte Ausgaben werden als Spesenabrechnungen für Mitarbeitende exportiert.', + }, noVendorsFound: 'Keine Anbieter gefunden', noVendorsFoundDescription: 'Bitte synchronisieren Sie die Verbindung erneut, nachdem Lieferanten in Certinia hinzugefügt wurden.', noCompaniesFound: 'Keine Unternehmen gefunden', @@ -5670,7 +5775,12 @@ ${amount} für ${merchant} – ${date}`, chartOfAccounts: 'Kontenplan', chartOfAccountsDescription: 'Der Kontenplan wird als Kategorien in Expensify importiert.', dimensionMapping: ({n}: {n: number}) => `Dimension ${n}`, - dimensions: {dimension1: 'Dimension 1', dimension2: 'Dimension 2', dimension3: 'Dimension 3', dimension4: 'Dimension 4'}, + dimensions: { + dimension1: 'Dimension 1', + dimension2: 'Dimension 2', + dimension3: 'Dimension 3', + dimension4: 'Dimension 4', + }, doNotMap: 'Nicht zuordnen', doNotMapSubtitle: 'Mitarbeiterressource standardmäßig verwenden', mappingTypes: { @@ -6135,7 +6245,14 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU noAccountsFound: 'Keine Konten gefunden', noAccountsFoundDescription: 'Bitte fügen Sie Konten in Rillet hinzu und synchronisieren Sie die Verbindung erneut', exportDescription: 'Konfigurieren Sie, wie Expensify-Daten nach Rillet exportiert werden.', - exportReimbursable: {label: 'Erstattungsfähige Ausgaben exportieren als', values: {[CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: {label: 'Lieferantenrechnungen'}}}, + exportReimbursable: { + label: 'Erstattungsfähige Ausgaben exportieren als', + values: { + [CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: { + label: 'Lieferantenrechnungen', + }, + }, + }, exportDate: { label: 'Rechnungsdatum des Lieferanten', description: 'Verwenden Sie dieses Datum beim Exportieren von Berichten nach Rillet.', @@ -6154,12 +6271,22 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU }, }, }, - exportNonReimbursable: {label: 'Firmenkartenausgaben exportieren als', values: {[CONST.RILLET_EXPORT_NON_REIMBURSABLE.CREDIT_CARD_CHARGE]: {label: 'Kreditkarten'}}}, + exportNonReimbursable: { + label: 'Firmenkartenausgaben exportieren als', + values: { + [CONST.RILLET_EXPORT_NON_REIMBURSABLE.CREDIT_CARD_CHARGE]: { + label: 'Kreditkarten', + }, + }, + }, defaultCompanyCardVendor: { label: 'Standardanbieter für Firmenkarten', description: 'Wählen Sie einen standardmäßigen Rillet-Anbieter für Ausgaben, die nicht automatisch zugeordnet werden.', }, - companyCardAccount: {label: 'Firmenkartenkonto', description: 'Wählen Sie aus, wohin die Firmenkartentransaktionen exportiert werden sollen.'}, + companyCardAccount: { + label: 'Firmenkartenkonto', + description: 'Wählen Sie aus, wohin die Firmenkartentransaktionen exportiert werden sollen.', + }, noBankAccountsFound: 'Keine Bankkonten gefunden', noBankAccountsFoundDescription: 'Bitte fügen Sie Bankkonten in Rillet hinzu und synchronisieren Sie die Verbindung erneut', autoSyncDescription: 'Synchronisieren Sie Rillet und Expensify automatisch – jeden Tag. Berichte werden in Echtzeit synchronisiert.', @@ -6177,9 +6304,15 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU }, syncReimbursedReports: 'Erstattete Berichte synchronisieren', syncReimbursedReportsDescription: 'Wenn ein Bericht per ACH bezahlt wird, wird in diesem Konto eine Rechnungszahlung erzeugt.', - billPaymentAccount: {label: 'Rechnungskonto', description: 'Wählen Sie aus, von wo Sie Rechnungen bezahlen möchten, und wir erstellen die Zahlung in Rillet.'}, + billPaymentAccount: { + label: 'Rechnungskonto', + description: 'Wählen Sie aus, von wo Sie Rechnungen bezahlen möchten, und wir erstellen die Zahlung in Rillet.', + }, syncExpensifyCardSettlements: 'Expensify Kartenabrechnungen synchronisieren', - settlementAccount: {label: 'Verrechnungskonto für Expensify Karte', description: 'Wählen Sie Ihr Abrechnungskonto, und wir erstellen die Zahlung in Rillet.'}, + settlementAccount: { + label: 'Verrechnungskonto für Expensify Karte', + description: 'Wählen Sie Ihr Abrechnungskonto, und wir erstellen die Zahlung in Rillet.', + }, syncTravelInvoicingSettlements: 'Abgerechnete konsolidierte Reisekosten synchronisieren', travelInvoicingSettlementAccount: { label: 'Konsolidiertes Abrechnungs­konto für Geschäftsreisen', @@ -6335,13 +6468,18 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU 'Wenn Ihr Unternehmen die Währungumrechnungskosten für eine im Ausland getätigte Zahlung übernimmt, buchen wir diese Kosten in DualEntry auf dieses Konto als Buchungssatz.', }, syncExpensifyCardSettlements: 'Expensify Karten-Abrechnungen synchronisieren', - settlementAccount: {label: 'Expensify Karte Verrechnungskonto', description: 'Wählen Sie Ihr Verrechnungskonto, und wir erstellen die Zahlung in DualEntry.'}, + settlementAccount: { + label: 'Expensify Karte Verrechnungskonto', + description: 'Wählen Sie Ihr Verrechnungskonto, und wir erstellen die Zahlung in DualEntry.', + }, syncTravelInvoicingSettlements: 'Abgerechnete konsolidierte Reisekosten synchronisieren', travelInvoicingSettlementAccount: { label: 'Abrechnungskonto für konsolidierte Reiseabrechnung', description: 'Wählen Sie Ihr Verrechnungskonto, und wir erstellen die Zahlung in DualEntry.', }, - travelInvoicingPayableAccount: {label: 'Verbindlichkeitskonto für konsolidierte Reisekostenabrechnung'}, + travelInvoicingPayableAccount: { + label: 'Verbindlichkeitskonto für konsolidierte Reisekostenabrechnung', + }, }, type: { free: 'Kostenlos', @@ -6489,13 +6627,28 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU cardIdentityColumn: 'Bitte ordnen Sie eine Kartennummer oder einen Kartennamen zu, damit Transaktionen einer Karte zugeordnet werden können.', }, fileImportDescription: 'Eine manuelle Option, falls Ihre Bank keinen Feed senden kann.', - duplicateFeedModal: {title: 'Karten-Feed bereits verbunden', prompt: 'Sie können denselben Kartenfeed nicht zweimal zu demselben Workspace hinzufügen.'}, + duplicateFeedModal: { + title: 'Karten-Feed bereits verbunden', + prompt: 'Sie können denselben Kartenfeed nicht zweimal zu demselben Workspace hinzufügen.', + }, }, statementCloseDate: { [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Letzter Tag des Monats', [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Letzter Geschäftstag des Monats', [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Benutzerdefinierter Tag des Monats', }, + reimbursable: { + title: 'Erstattungsfähig', + description: 'Lege fest, wie Kartentransaktionen erstellt werden sollen. Neue Transaktionen folgen diesen Regeln.', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES]: 'Immer erstattungsfähig', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES}Description`]: 'Wird Mitarbeitenden immer erstattet', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO]: 'Immer nicht erstattungsfähig', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO}Description`]: 'Wird Mitarbeitenden nie erstattet', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES]: 'Erstattungsfähig', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES}Description`]: 'Wird Mitarbeitenden meistens erstattet', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO]: 'Nicht erstattungsfähig', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO}Description`]: 'Wird Mitarbeitenden gelegentlich erstattet', + }, assign: 'Zuweisen', assignCard: 'Karte zuweisen', findCompanyCard: 'Firmenkarte finden', @@ -6543,7 +6696,10 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU importButton: 'Transaktionen importieren', }, deletedCard: 'Gelöschte Karte', - assignNewCards: {title: 'Neue Karten zuweisen', description: 'Holen Sie die neuesten Karten zum Zuweisen von Ihrer Bank'}, + assignNewCards: { + title: 'Neue Karten zuweisen', + description: 'Holen Sie die neuesten Karten zum Zuweisen von Ihrer Bank', + }, }, expensifyCard: { issueAndManageCards: 'Geben Sie Expensify Karten aus und verwalten Sie sie', @@ -6736,9 +6892,16 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU subtitle: 'Wir prüfen derzeit deine Anfrage zur Aktivierung von Expensify Travel. Keine Sorge, wir sagen dir Bescheid, sobald alles bereit ist.', ctaText: 'Anfrage gesendet', }, - bookOrManageYourTrip: {title: 'Reisebuchung', subtitle: 'Glückwunsch! Du kannst in diesem Arbeitsbereich jetzt Reisen buchen und verwalten.', ctaText: 'Reisen verwalten'}, + bookOrManageYourTrip: { + title: 'Reisebuchung', + subtitle: 'Glückwunsch! Du kannst in diesem Arbeitsbereich jetzt Reisen buchen und verwalten.', + ctaText: 'Reisen verwalten', + }, settings: { - autoAddTripName: {title: 'Reisenamen zu Ausgaben hinzufügen', subtitle: 'Reisenamen für in Expensify gebuchte Reisen automatisch zu Spesenbeschreibungen hinzufügen.'}, + autoAddTripName: { + title: 'Reisenamen zu Ausgaben hinzufügen', + subtitle: 'Reisenamen für in Expensify gebuchte Reisen automatisch zu Spesenbeschreibungen hinzufügen.', + }, codingSync: { title: 'Codierung mit Expensify Travel synchronisieren', subtitle: 'Kategorien, Tags und Berichtsfelder dieses Arbeitsbereichs an Expensify Travel übertragen, damit Reisende sie beim Buchen beantworten.', @@ -6971,7 +7134,9 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU subtitle: 'Legen Sie einen abrechnungsfähigen Stundensatz für die Zeiterfassung fest.', defaultHourlyRate: 'Standardstundensatz', }, - hrWarningModal: {disconnectText: ({integration}: {integration: string}) => `Um HR zu deaktivieren, trennen Sie bitte zuerst ${integration} von diesem Workspace.`}, + hrWarningModal: { + disconnectText: ({integration}: {integration: string}) => `Um HR zu deaktivieren, trennen Sie bitte zuerst ${integration} von diesem Workspace.`, + }, vendors: { title: 'Lieferanten', subtitle: 'Ordnen Sie Kartenausgaben den aus Ihrer Buchhaltungssoftware importierten Lieferanten zu.', @@ -7002,7 +7167,10 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU findReportField: 'Berichtsfeld suchen', deleteConfirmation: 'Sind Sie sicher, dass Sie dieses Berichts­feld löschen möchten?', deleteFieldsConfirmation: 'Möchten Sie diese Berichtsfelder wirklich löschen?', - emptyReportFields: {title: 'Noch keine Berichtsfelder', subtitle: 'Füge ein benutzerdefiniertes Feld (Text, Datum oder Dropdown) hinzu, das in Berichten erscheint.'}, + emptyReportFields: { + title: 'Noch keine Berichtsfelder', + subtitle: 'Füge ein benutzerdefiniertes Feld (Text, Datum oder Dropdown) hinzu, das in Berichten erscheint.', + }, subtitle: 'Berichtsfelder gelten für alle Ausgaben und können hilfreich sein, wenn du nach zusätzlichen Informationen fragen möchtest.', disableReportFields: 'Berichtsfelder deaktivieren', disableReportFieldsConfirmation: 'Bist du sicher? Text- und Datumsfelder werden gelöscht und Listen werden deaktiviert.', @@ -7027,7 +7195,10 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU disableValues: 'Werte deaktivieren', enableValue: 'Wert aktivieren', enableValues: 'Werte aktivieren', - emptyReportFieldsValues: {title: 'Noch keine Listeneinträge', subtitle: 'Füge benutzerdefinierte Werte hinzu, die in Berichten erscheinen.'}, + emptyReportFieldsValues: { + title: 'Noch keine Listeneinträge', + subtitle: 'Füge benutzerdefinierte Werte hinzu, die in Berichten erscheinen.', + }, deleteValuePrompt: 'Sind Sie sicher, dass Sie diesen Listenwert löschen möchten?', deleteValuesPrompt: 'Bist du sicher, dass du diese Listenwerte löschen möchtest?', listValueRequiredError: 'Bitte gib einen Namen für den Listeneintrag ein', @@ -7369,10 +7540,16 @@ Der Control-Tarif beginnt bei 9 $ pro aktivem Mitglied und Monat.`, auditors: 'Prüfer', guests: 'Gäste', editors: 'Bearbeiter', - emptyRoleFilter: {title: 'Keine Mitglieder entsprechen diesem Filter', subtitle: 'Laden Sie ein Mitglied ein oder ändern Sie den Filter oben.'}, + emptyRoleFilter: { + title: 'Keine Mitglieder entsprechen diesem Filter', + subtitle: 'Laden Sie ein Mitglied ein oder ändern Sie den Filter oben.', + }, configureHRSync: (providerName: string) => `Synchronisierung mit ${providerName} einrichten.`, syncWithHR: (providerName: string) => `Mit ${providerName} synchronisieren`, - makeCardAdmin: () => ({one: 'Zum Karten-Admin machen', other: 'Karten-Admins festlegen'}), + makeCardAdmin: () => ({ + one: 'Zum Karten-Admin machen', + other: 'Karten-Admins festlegen', + }), cardAdmins: 'Karten-Admins', peopleAdmins: 'Personaladministratoren', paymentsAdmins: 'Zahlungsadmins', @@ -7888,7 +8065,10 @@ Der Control-Tarif beginnt bei 9 $ pro aktivem Mitglied und Monat.`, }, distance: 'Entfernung', centrallyManage: 'Tarife zentral verwalten, in Meilen oder Kilometern nachverfolgen und eine Standardkategorie festlegen.', - emptyRates: {title: 'Noch keine Entfernungssätze', subtitle: 'Fügen Sie einen Satz hinzu, um Kilometer mit individuellen Sätzen zu erstatten.'}, + emptyRates: { + title: 'Noch keine Entfernungssätze', + subtitle: 'Fügen Sie einen Satz hinzu, um Kilometer mit individuellen Sätzen zu erstatten.', + }, rate: 'Bewerten', addRate: 'Satz hinzufügen', findRate: 'Kurs finden', @@ -8882,7 +9062,12 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc emptyAmountError: 'Geben Sie vor dem Speichern einen gültigen Betrag ein', receiptAmountGreaterThanItemizedError: 'Der erforderliche Belegbetrag darf nicht höher sein als der erforderliche Betrag für den Einzelbeleg.', }, - requireFields: {title: 'Felder für alle Ausgaben erforderlich machen', category: 'Kategorie', tag: 'Tag', save: 'Regel speichern'}, + requireFields: { + title: 'Felder für alle Ausgaben erforderlich machen', + category: 'Kategorie', + tag: 'Tag', + save: 'Regel speichern', + }, newRule: { title: 'Neue Regel', subtitle: 'Was möchten Sie tun?', @@ -8930,7 +9115,11 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc merchantTypeIs: (merchantType: string) => `Händlertyp ist „${merchantType}"`, categoryIs: (category: string) => `Kategorie ist „${category}“`, }, - merchantTypeRule: {merchantType: 'Händlerart', saveRule: 'Regel speichern', confirmErrorCategory: 'Bitte wählen Sie eine Kategorie aus.'}, + merchantTypeRule: { + merchantType: 'Händlerart', + saveRule: 'Regel speichern', + confirmErrorCategory: 'Bitte wählen Sie eine Kategorie aus.', + }, requireFieldsTable: { tableColumnType: 'Typ', tableColumnCondition: 'Bedingung', @@ -8997,7 +9186,10 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc subtitle: 'Erstellen Sie eine Regel, um Ihre Arbeitsbereichsrichtlinien zu automatisieren.', cta: 'KI-Regel hinzufügen', }, - categoriesDisabledEmptyState: {title: 'Kategorien sind nicht aktiviert', subtitle: 'Aktivieren Sie Kategorien, um Ihre Ausgaben besser zu kontrollieren.'}, + categoriesDisabledEmptyState: { + title: 'Kategorien sind nicht aktiviert', + subtitle: 'Aktivieren Sie Kategorien, um Ihre Ausgaben besser zu kontrollieren.', + }, expenseDefaultType: { title: 'Standardspesen übernehmen', subtitle: 'Worauf soll diese Regel angewendet werden?', @@ -9113,7 +9305,11 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc dontSeeYourATS: `Sie sehen Ihr ATS hier nicht? Fragen Sie Concierge, und wir können es hinzufügen.`, importSettings: 'Import-Einstellungen', defaultApprover: 'Standardgenehmiger', - approverFields: {recruiter: 'Personalvermittler', recruitingCoordinator: 'Recruiting-Koordinator', hiringManager: 'Einstellungsmanager'}, + approverFields: { + recruiter: 'Personalvermittler', + recruitingCoordinator: 'Recruiting-Koordinator', + hiringManager: 'Einstellungsmanager', + }, filters: { description: (providerName: string) => `Wählen Sie aus, welche Mitglieder aus ${providerName} importiert werden. Sie können nach Jobphasen, Tags und Büros auswählen.`, stages: { @@ -9191,7 +9387,10 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc approvalModeWarningConfirm: 'Genehmigungsmodus ändern', syncingModalTitle: 'Ihre Verbindung wird synchronisiert', syncingModalDescription: 'Die erste Verbindung kann einige Zeit dauern. Sie werden über alle Fehler benachrichtigt.', - syncLimitReached: {title: 'Versuchen Sie es morgen noch einmal', prompt: 'Sie haben Ihr Synchronisierungslimit für heute erreicht.'}, + syncLimitReached: { + title: 'Versuchen Sie es morgen noch einmal', + prompt: 'Sie haben Ihr Synchronisierungslimit für heute erreicht.', + }, syncResults: { title: (provider: string) => `${provider}-Synchronisierung abgeschlossen`, successTitle: (provider: string) => `Ihre ${provider}-Verbindung wurde erfolgreich synchronisiert!`, @@ -9221,22 +9420,40 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc enableNewAccountsDescription: 'Neue Campfire-Konten werden als Kategorien verfügbar sein.', dimensionsImport: 'Alle Campfire-Dimensionen werden als Tags importiert', exportDescription: 'Konfigurieren Sie, wie Expensify-Daten nach Campfire exportiert werden.', - exportReimbursable: {label: 'Erstattungsfähige Ausgaben exportieren als', values: {VENDOR_BILL: {label: 'Lieferantenrechnungen'}}}, + exportReimbursable: { + label: 'Erstattungsfähige Ausgaben exportieren als', + values: {VENDOR_BILL: {label: 'Lieferantenrechnungen'}}, + }, exportDate: { label: 'Rechnungsdatum des Lieferanten', description: 'Verwenden Sie dieses Datum beim Exportieren von Berichten nach Campfire.', values: { - LAST_EXPENSE: {label: 'Datum der letzten Ausgabe', description: 'Datum der jüngsten Ausgabe im Bericht.'}, - REPORT_EXPORTED: {label: 'Exportdatum', description: 'Datum, an dem der Bericht nach Campfire exportiert wurde.'}, - REPORT_SUBMITTED: {label: 'Eingereichtes Datum', description: 'Datum, an dem der Bericht zur Genehmigung eingereicht wurde.'}, + LAST_EXPENSE: { + label: 'Datum der letzten Ausgabe', + description: 'Datum der jüngsten Ausgabe im Bericht.', + }, + REPORT_EXPORTED: { + label: 'Exportdatum', + description: 'Datum, an dem der Bericht nach Campfire exportiert wurde.', + }, + REPORT_SUBMITTED: { + label: 'Eingereichtes Datum', + description: 'Datum, an dem der Bericht zur Genehmigung eingereicht wurde.', + }, }, }, - exportNonReimbursable: {label: 'Firmenkarten-Ausgaben exportieren als', values: {JOURNAL_ENTRY: {label: 'Buchungsbelege'}}}, + exportNonReimbursable: { + label: 'Firmenkarten-Ausgaben exportieren als', + values: {JOURNAL_ENTRY: {label: 'Buchungsbelege'}}, + }, defaultCompanyCardVendor: { label: 'Standardanbieter für alle Firmenkarten', description: 'Wählen Sie einen Standard-Campfire-Anbieter für Ausgaben, die nicht automatisch zugeordnet werden.', }, - companyCardAccount: {label: 'Firmenkartenkonto', description: 'Wählen Sie aus, wohin Unternehmenskartentransaktionen exportiert werden sollen.'}, + companyCardAccount: { + label: 'Firmenkartenkonto', + description: 'Wählen Sie aus, wohin Unternehmenskartentransaktionen exportiert werden sollen.', + }, noAccountsFound: 'Keine Konten gefunden', noAccountsFoundDescription: 'Bitte fügen Sie Konten in Campfire hinzu und synchronisieren Sie die Verbindung erneut', autoSyncDescription: 'Campfire und Expensify automatisch jeden Tag synchronisieren. Berichte werden in Echtzeit synchronisiert.', @@ -9254,15 +9471,23 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc }, syncReimbursedReports: 'Erstattete Berichte synchronisieren', syncReimbursedReportsDescription: 'Wenn ein Bericht per ACH bezahlt wird, wird in diesem Konto eine Rechnungszahlung erstellt.', - billPaymentAccount: {label: 'Rechnungskonto', description: 'Wählen Sie das Verrechnungskonto „Campfire-Guthaben“, wenn Expensify eine Rechnung als bezahlt markiert.'}, + billPaymentAccount: { + label: 'Rechnungskonto', + description: 'Wählen Sie das Verrechnungskonto „Campfire-Guthaben“, wenn Expensify eine Rechnung als bezahlt markiert.', + }, syncExpensifyCardSettlements: 'Expensify Karte-Abrechnungen synchronisieren', - settlementAccount: {label: 'Verrechnungskonto der Expensify Karte', description: 'Wählen Sie Ihr Verrechnungskonto aus, und wir erstellen die Zahlung in Campfire.'}, + settlementAccount: { + label: 'Verrechnungskonto der Expensify Karte', + description: 'Wählen Sie Ihr Verrechnungskonto aus, und wir erstellen die Zahlung in Campfire.', + }, syncTravelInvoicingSettlements: 'Abgerechnete konsolidierte Reisekosten synchronisieren', travelInvoicingSettlementAccount: { label: 'Abrechnungskonto für konsolidierte Reiseabrechnung', description: 'Wählen Sie Ihr Verrechnungskonto aus, und wir erstellen die Zahlung in Campfire.', }, - travelInvoicingPayableAccount: {label: 'Verbindlichkeitskonto für konsolidierte Reisekostenabrechnung'}, + travelInvoicingPayableAccount: { + label: 'Verbindlichkeitskonto für konsolidierte Reisekostenabrechnung', + }, exportToMultipleAccounts: 'Export in mehrere Konten konfigurieren', cardProgramAccount: { label: 'Kartenprogramm-Konto', @@ -9907,7 +10132,11 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc commuterExclusions: { changedToFixedDistance: ({previousMethod}: {previousMethod: string}) => `Ausschluss von Arbeitswegen in eine feste Entfernung pro Abrechnung geändert (zuvor ${previousMethod})`, changedToHomeAndOffice: ({previousMethod}: {previousMethod: string}) => `Ausschluss von Pendelstrecken geändert, um nach Wohnort und Büro zu berechnen (zuvor ${previousMethod})`, - previousMethod: {disabled: 'Arbeitswege nicht ausschließen', fixedDistance: 'Feste Entfernung pro Antrag', homeAndOffice: 'Zuhause und Büro'}, + previousMethod: { + disabled: 'Arbeitswege nicht ausschließen', + fixedDistance: 'Feste Entfernung pro Antrag', + homeAndOffice: 'Zuhause und Büro', + }, setFixedDistance: ({formattedDistance}: {formattedDistance: string}) => `feste Entfernungsausschlussgrenze von ${formattedDistance} pro Abrechnung festlegen`, changedFixedDistance: ({formattedOldDistance, formattedNewDistance}: {formattedOldDistance: string; formattedNewDistance: string}) => `Feste Streckenausschlussgrenze auf ${formattedNewDistance} pro Antrag geändert (zuvor ${formattedOldDistance})`, @@ -9962,6 +10191,8 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc updatedMccGroupCategory: ({mccGroupName, oldCategory, newCategory}: {mccGroupName: string; oldCategory: string; newCategory: string}) => `hat die Standardausgabenkategorie für „${mccGroupName}“ in „${newCategory}“ geändert (zuvor „${oldCategory}“)`, updatedRequireCompanyCards: ({enabled}: {enabled: boolean}) => `${enabled ? 'aktiviert' : 'deaktiviert'} die Anforderung für Firmenkartenkäufe`, + updatedCardFeedReimbursable: (feedName: string, newValue?: string, previousValue?: string) => + `hat die Einstellung „Erstattungsfähig“ des Kartenfeeds "${feedName}"${newValue ? ` zu "${newValue}"` : ''}${previousValue ? ` (zuvor "${previousValue}")` : ''}`, agentRule: { added: ({title, prompt}: {title: string; prompt: string}) => (title ? `hat die Agentenregel „${title}“ hinzugefügt: ${prompt}` : `hat eine Agentenregel hinzugefügt: ${prompt}`), updated: ({title, prompt}: {title: string; prompt: string}) => @@ -9996,7 +10227,13 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc one: 'Ausgaberegel auf 1 weitere Karte angewendet', other: `Ausgaberegel auf ${count} weitere Karten angewendet`, }), - phraseVerb: {added: 'hinzugefügt', removed: 'entfernt', changed: 'geändert', set: 'festlegen', applied: 'Angewendet'}, + phraseVerb: { + added: 'hinzugefügt', + removed: 'entfernt', + changed: 'geändert', + set: 'festlegen', + applied: 'Angewendet', + }, bodyMerchant: ({adjective, value}: {adjective: string; value: string}) => (adjective !== '' ? `${adjective} Händler: „${value}“` : `Händler: „${value}“`), bodyMerchantValueOnly: ({value}: {value: string}) => `„${value}“`, bodyMerchantChange: ({adjective, oldValue, newValue}: {adjective: string; oldValue: string; newValue: string}) => @@ -10234,7 +10471,11 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc subtitleCannotSendWithTestDrive: 'Du benötigst einen Arbeitsbereich mit aktiviertem Invoices, um Rechnungen zu senden. Mache eine Probefahrt mit Expensify, um mehr zu erfahren.', }, - emptyTripResults: {title: 'Noch keine Reisen', subtitle: 'Beginne, indem du unten deine erste Reise buchst.', buttonText: 'Reise buchen'}, + emptyTripResults: { + title: 'Noch keine Reisen', + subtitle: 'Beginne, indem du unten deine erste Reise buchst.', + buttonText: 'Reise buchen', + }, emptySubmitResults: { title: 'Keine Ausgaben zum Einreichen', subtitle: 'Alles erledigt. Dreh eine Ehrenrunde!', @@ -10263,7 +10504,11 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc title: 'Keine Ausgaben zum Genehmigen', subtitle: 'Null Ausgaben. Maximale Entspannung. Gut gemacht!', }, - staleResults: {title: 'Aktualisierung erforderlich', subtitle: 'Diese Seite ist veraltet, aktualisieren Sie sie, um die neuesten Inhalte zu sehen', buttonText: 'Aktualisieren'}, + staleResults: { + title: 'Aktualisierung erforderlich', + subtitle: 'Diese Seite ist veraltet, aktualisieren Sie sie, um die neuesten Inhalte zu sehen', + buttonText: 'Aktualisieren', + }, }, columns: 'Spalten', editColumns: 'Spalten bearbeiten', @@ -10360,8 +10605,15 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc cardFeedNameCSV: ({cardFeedLabel}: {cardFeedLabel?: string}) => `Alle importierten CSV-Karten${cardFeedLabel ? ` - ${cardFeedLabel}` : ''}`, travelInvoicing: 'Konsolidierte Reiseabrechnung', }, - bankAccount: {banks: 'Bankkonten', closedBankAccounts: 'Geschlossene Bankkonten'}, - workspace: {active: 'Aktiv', archived: 'Archiviert', selectAll: 'Alle auswählen'}, + bankAccount: { + banks: 'Bankkonten', + closedBankAccounts: 'Geschlossene Bankkonten', + }, + workspace: { + active: 'Aktiv', + archived: 'Archiviert', + selectAll: 'Alle auswählen', + }, reportField: (name: string, value: string) => `${name} ist ${value}`, current: 'Aktuell', past: 'Vergangenes', @@ -10404,14 +10656,21 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc [CONST.SEARCH.WITHDRAWAL_TYPE.TRAVEL_BILLING]: 'Konsolidierte Reiseabrechnung', }, is: 'Ist', - has: {submittedViolation: 'Eingereichter Verstoß', approvedViolation: 'Genehmigter Verstoß'}, + has: { + submittedViolation: 'Eingereichter Verstoß', + approvedViolation: 'Genehmigter Verstoß', + }, action: { [CONST.SEARCH.ACTION_FILTERS.SUBMIT]: 'Senden', [CONST.SEARCH.ACTION_FILTERS.APPROVE]: 'Genehmigen', [CONST.SEARCH.ACTION_FILTERS.PAY]: 'Bezahlen', [CONST.SEARCH.ACTION_FILTERS.EXPORT]: 'Export', }, - filterType: {label: 'Filtertyp', has: {positive: 'hat', negative: 'hat nicht'}, is: {positive: 'ist', negative: 'ist nicht'}}, + filterType: { + label: 'Filtertyp', + has: {positive: 'hat', negative: 'hat nicht'}, + is: {positive: 'ist', negative: 'ist nicht'}, + }, merchant: { matchType: 'Übereinstimmungstyp', contains: (merchant?: string) => (merchant ? `Enthält "${merchant}"` : 'Enthält'), @@ -10454,7 +10713,10 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc [CONST.SEARCH.GROUP_BY.YEAR]: 'Jahre', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Quartale', }, - moneyRequestReport: {emptyStateTitle: 'Noch keine Ausgaben', accessPlaceHolder: 'Für Details öffnen'}, + moneyRequestReport: { + emptyStateTitle: 'Noch keine Ausgaben', + accessPlaceHolder: 'Für Details öffnen', + }, noCategory: 'Keine Kategorie', noMerchant: 'Kein Händler', noTag: 'Kein Tag', @@ -10523,7 +10785,10 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc mergeReports: { title: 'Berichte zusammenführen', description: 'Wählen Sie den Bericht aus, der beibehalten werden soll. Alle Ausgaben werden in ihn verschoben und die anderen Berichte werden gelöscht.', - listPage: {noEligibleReportsFound: 'Keine berechtigten Berichte gefunden', noEligibleReportsFoundSubtitle: 'Sie haben keine Berichte, die zusammengeführt werden können.'}, + listPage: { + noEligibleReportsFound: 'Keine berechtigten Berichte gefunden', + noEligibleReportsFoundSubtitle: 'Sie haben keine Berichte, die zusammengeführt werden können.', + }, }, periodSoFar: ({period}: {period: string}) => `${period} bisher`, weekOf: ({date}: {date: string}) => `Woche vom ${date}`, @@ -10560,11 +10825,21 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc }, }, settlement: { - status: {pending: 'Ausstehend', cleared: 'Ausgeglichen', failed: 'Fehlgeschlagen', never: 'Nie', cashBack: 'Cashback'}, + status: { + pending: 'Ausstehend', + cleared: 'Ausgeglichen', + failed: 'Fehlgeschlagen', + never: 'Nie', + cashBack: 'Cashback', + }, failedError: ({link}: {link: string}) => `Wir versuchen diese Abrechnung erneut, sobald du dein Konto entsperrst.`, withdrawalInfo: ({date, withdrawalID}: {date: string; withdrawalID: number}) => `${date} • Auszahlungs-ID: ${withdrawalID}`, }, - paidStatus: {markedAsPaid: 'Als bezahlt markiert', withdrawing: 'Wird abgehoben', confirmed: 'Bestätigt'}, + paidStatus: { + markedAsPaid: 'Als bezahlt markiert', + withdrawing: 'Wird abgehoben', + confirmed: 'Bestätigt', + }, reportLayout: { reportLayout: 'Berichts-Layout', groupByLabel: 'Gruppieren nach:', @@ -11020,7 +11295,12 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc prompt: 'Bitte erlaube den Standortzugriff in den Einstellungen deines Geräts, um die GPS‑Streckenverfolgung zu starten.', }, gpsFloatingPillText: 'GPS-Verfolgung läuft...', - liveActivity: {subtitle: 'Entfernungserfassung', button: 'Fortschritt anzeigen', lockScreenBadgeText: 'Entfernung', lockScreenTrackingText: 'Verfolge …'}, + liveActivity: { + subtitle: 'Entfernungserfassung', + button: 'Fortschritt anzeigen', + lockScreenBadgeText: 'Entfernung', + lockScreenTrackingText: 'Verfolge …', + }, }, reportCardLostOrDamaged: { screenTitle: 'Zeugnis verloren oder beschädigt', @@ -11223,7 +11503,11 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc markAsCashToIgnore: 'Als Barzahlung markieren, um sie zu ignorieren und Zahlung anzufordern.', smartscanFailed: ({canEdit = true, missingFields = []}: {canEdit?: boolean; missingFields?: string[]}) => { if (missingFields.length > 0) { - const fieldNames: Record = {merchant: 'Händler', date: 'Datum', amount: 'Betrag'}; + const fieldNames: Record = { + merchant: 'Händler', + date: 'Datum', + amount: 'Betrag', + }; const translated = missingFields.map((f) => fieldNames[f] ?? f); const fieldList = translated.join(translated.length > 2 ? ', ' : ' und '); const verb = translated.length === 1 ? 'fehlt' : 'fehlen'; @@ -11312,7 +11596,10 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc perDiem: 'Tagespauschale', notExpenseType: (expenseType: string) => `kein(e) ${expenseType}`, billable: {enabled: 'Abrechenbar', disabled: 'Nicht verrechenbar'}, - reimbursable: {enabled: 'Erstattungsfähig', disabled: 'Nicht erstattungsfähig'}, + reimbursable: { + enabled: 'Erstattungsfähig', + disabled: 'Nicht erstattungsfähig', + }, withoutCategory: 'ohne Kategorie', fromMerchant: (merchant: string) => `von ${merchant}`, notFromMerchant: (merchant: string) => `nicht von ${merchant}`, @@ -11504,7 +11791,10 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc title: 'Ihre Reiserechnung ist überfällig', subtitle: (date: string) => `Bezahlen Sie Ihre Reise-Rechnung bis zum ${date}, um weiterhin Reisen buchen zu können.`, }, - travelInvoiceOverdueLocked: {title: 'Reisebuchung ist pausiert', subtitle: 'Ihre Reiseabrechnung ist überfällig. Bezahlen Sie sie, um wieder Reisen buchen zu können.'}, + travelInvoiceOverdueLocked: { + title: 'Reisebuchung ist pausiert', + subtitle: 'Ihre Reiseabrechnung ist überfällig. Bezahlen Sie sie, um wieder Reisen buchen zu können.', + }, }, cardSection: { title: 'Zahlung', @@ -11633,7 +11923,14 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc one: '1 aktiver Benutzer', other: `${count} aktive Benutzer`, }), - state: {paid: 'Bezahlt', cleared: 'Ausgeglichen', failed: 'Fehlgeschlagen', refunded: 'Erstattet', disputed: 'Angefochten', balanceTransfer: 'Saldoübertrag'}, + state: { + paid: 'Bezahlt', + cleared: 'Ausgeglichen', + failed: 'Fehlgeschlagen', + refunded: 'Erstattet', + disputed: 'Angefochten', + balanceTransfer: 'Saldoübertrag', + }, details: 'Zahlungsdetails', badge: { balanceTransferTo: ({email}: {email: string}) => `Saldoübertrag an ${email}`, @@ -12104,7 +12401,10 @@ Hier ist ein *Testbeleg*, um dir zu zeigen, wie es funktioniert:`, other: 'Konten schließen', }), closeAccountPrompt: 'Bist du sicher? Diese Aktion ist dauerhaft.', - forceCloseAccount: () => ({one: 'Konto zwangsweise schließen', other: 'Konten zwangsweise schließen'}), + forceCloseAccount: () => ({ + one: 'Konto zwangsweise schließen', + other: 'Konten zwangsweise schließen', + }), safeCloseAccount: () => ({ one: 'Konto sicher schließen', other: 'Konten sicher schließen', @@ -12125,7 +12425,10 @@ Hier ist ein *Testbeleg*, um dir zu zeigen, wie es funktioniert:`, `Bist du sicher? Dadurch wird das Konto von ${email} gesperrt.

Unser Team wird das Konto anschließend überprüfen und unbefugten Zugriff entfernen. Um den Zugriff wiederherzustellen, muss die Person mit Concierge zusammenarbeiten.`, reportSuspiciousActivityConfirmationPrompt: 'Wir überprüfen das Konto, um sicherzustellen, dass es sicher entsperrt werden kann, und melden uns bei Fragen über Concierge.', cannotSetVacationDelegateForMember: (email: string) => `Du kannst keine Urlaubsvertretung für ${email} festlegen, weil sie derzeit die Vertretung für folgende Mitglieder sind:`, - emptyMembers: {title: 'Keine Mitglieder in dieser Gruppe', subtitle: 'Fügen Sie ein Mitglied hinzu oder versuchen Sie, den Filter oben zu ändern.'}, + emptyMembers: { + title: 'Keine Mitglieder in dieser Gruppe', + subtitle: 'Fügen Sie ein Mitglied hinzu oder versuchen Sie, den Filter oben zu ändern.', + }, moveToGroup: 'In Gruppe verschieben', chooseWhereToMove: ({count}: {count: number}) => ({ one: 'Wählen Sie aus, wohin Sie 1 Mitglied verschieben möchten.', @@ -12154,7 +12457,10 @@ Hier ist ein *Testbeleg*, um dir zu zeigen, wie es funktioniert:`, }, groups: { title: 'Gruppen', - memberCount: () => ({one: '1 Mitglied', other: (count: number) => `${count} Mitglieder`}), + memberCount: () => ({ + one: '1 Mitglied', + other: (count: number) => `${count} Mitglieder`, + }), defaultGroup: 'Standardgruppe für neue Mitglieder', defaultGroupPrompt: (currentName: string, newName: string) => `Möchtest du ${newName} wirklich zur Standardgruppe machen? Neue Mitglieder werden zu dieser Gruppe anstelle der bisherigen Standardgruppe (${currentName}) eingeladen. `, @@ -12205,7 +12511,10 @@ Hier ist ein *Testbeleg*, um dir zu zeigen, wie es funktioniert:`, closeButton: 'Schließen', addPaymentCardButton: 'Zahlungskarte hinzufügen', }, - monthPickerPage: {month: 'Monat', selectMonth: 'Bitte wählen Sie einen Monat aus'}, + monthPickerPage: { + month: 'Monat', + selectMonth: 'Bitte wählen Sie einen Monat aus', + }, emailIssuePage: { title: 'E-Mail-Problem', intro: (login: string) => `Unser E-Mail-Anbieter hat das Senden an ${login} aufgrund von Zustellproblemen pausiert. Um dieses Problem zu beheben:`, @@ -12247,6 +12556,10 @@ Hier ist ein *Testbeleg*, um dir zu zeigen, wie es funktioniert:`, mobileRenewPrompt: 'Besuchen Sie Expensify in Ihrem Webbrowser, um vorzeitig zu verlängern.', mobileClaimPrompt: 'Besuchen Sie Expensify in Ihrem Webbrowser, um Ihren Verlängerungsrabatt zu erhalten.', }, - bulkActionBar: {label: 'Sammelaktionen', clearSelection: 'Auswahl aufheben', loadingSelection: 'Auswahl wird geladen'}, + bulkActionBar: { + label: 'Sammelaktionen', + clearSelection: 'Auswahl aufheben', + loadingSelection: 'Auswahl wird geladen', + }, }; export default translations; diff --git a/src/languages/el.ts b/src/languages/el.ts index 52df4e2a35c7..9e3cfa75a954 100644 --- a/src/languages/el.ts +++ b/src/languages/el.ts @@ -553,7 +553,12 @@ const translations: TranslationDeepObject = { prompt: 'Θέλετε να ειδοποιείστε όταν απαντά ο Concierge;', cta: 'Ειδοποίηση', }, - feedback: {prompt: 'Ήταν χρήσιμη αυτή η απάντηση;', useful: 'Χρήσιμη απάντηση', notUseful: 'Μη χρήσιμη απάντηση', thanks: 'Ευχαριστούμε για τα σχόλιά σας!'}, + feedback: { + prompt: 'Ήταν χρήσιμη αυτή η απάντηση;', + useful: 'Χρήσιμη απάντηση', + notUseful: 'Μη χρήσιμη απάντηση', + thanks: 'Ευχαριστούμε για τα σχόλιά σας!', + }, }, supportalNoAccess: { title: 'Όχι τόσο γρήγορα', @@ -1017,7 +1022,11 @@ const translations: TranslationDeepObject = { defaultSubtitle: 'Χώρος εργασίας', subtitle: ({policyName}: {policyName: string}) => policyName, }, - addShippingAddress: {title: 'Χρειαζόμαστε τη διεύθυνση αποστολής σας', subtitle: 'Δώστε μια διεύθυνση για να λάβετε την Κάρτα Expensify.', cta: 'Προσθήκη'}, + addShippingAddress: { + title: 'Χρειαζόμαστε τη διεύθυνση αποστολής σας', + subtitle: 'Δώστε μια διεύθυνση για να λάβετε την Κάρτα Expensify.', + cta: 'Προσθήκη', + }, addVirtualCardPersonalDetails: { title: 'Προσθέστε τα στοιχεία σας για να δείτε και να αρχίσετε να χρησιμοποιείτε την Κάρτα Expensify.', subtitle: 'Κάρτα Expensify', @@ -1048,7 +1057,11 @@ const translations: TranslationDeepObject = { subtitle: 'Κάρτα Expensify', cta: 'Ανασκόπηση', }, - addHomeAddress: {title: 'Προσθέστε τη διεύθυνση κατοικίας σας για παρακολούθηση αποστάσεων', subtitle: 'Λογαριασμός', cta: 'Προσθήκη'}, + addHomeAddress: { + title: 'Προσθέστε τη διεύθυνση κατοικίας σας για παρακολούθηση αποστάσεων', + subtitle: 'Λογαριασμός', + cta: 'Προσθήκη', + }, fixFailedBilling: { title: 'Δεν μπορέσαμε να χρεώσουμε την αποθηκευμένη κάρτα σας', subtitle: 'Συνδρομή', @@ -1073,8 +1086,13 @@ const translations: TranslationDeepObject = { subtitle: ({date}: {date: string}) => `Η συνδρομή λήγει στις ${date}`, cta: 'Διαχείριση', }, - emailDeliveryFailure: {title: 'Δεν μπορούμε να σας στέλνουμε ειδοποιήσεις μέσω email', subtitle: 'Λογαρια​σμός'}, - upgradeNetSuiteConnection: {title: 'Αναβαθμίστε τη σύνδεσή σας με το NetSuite'}, + emailDeliveryFailure: { + title: 'Δεν μπορούμε να σας στέλνουμε ειδοποιήσεις μέσω email', + subtitle: 'Λογαρια​σμός', + }, + upgradeNetSuiteConnection: { + title: 'Αναβαθμίστε τη σύνδεσή σας με το NetSuite', + }, }, freeTrialSection: { title: ({count}: {count: number}) => ({ @@ -1226,8 +1244,14 @@ const translations: TranslationDeepObject = { }, insightsPage: { viewOnSpend: 'Προβολή στο Spend', - emptyState: {title: 'Τίποτα προς εμφάνιση', subtitle: 'Δοκιμάστε να προσαρμόσετε τα κριτήριά σας παραπάνω'}, - noExpensesState: {title: 'Δείτε πού πηγαίνουν τα χρήματά σας', subtitle: 'Μόλις έχετε δαπάνες, θα βλέπετε τάσεις δαπανών, κορυφαίους εμπόρους και άλλα.'}, + emptyState: { + title: 'Τίποτα προς εμφάνιση', + subtitle: 'Δοκιμάστε να προσαρμόσετε τα κριτήριά σας παραπάνω', + }, + noExpensesState: { + title: 'Δείτε πού πηγαίνουν τα χρήματά σας', + subtitle: 'Μόλις έχετε δαπάνες, θα βλέπετε τάσεις δαπανών, κορυφαίους εμπόρους και άλλα.', + }, compare: { label: 'Σύγκριση', previousPeriod: 'Προηγούμενη περίοδος', @@ -2447,9 +2471,18 @@ const translations: TranslationDeepObject = { testingPreferences: 'Προτιμήσεις δοκιμών', server: 'Διακομιστής', servers: { - production: {label: 'Παραγωγή', description: 'Το ζωντανό περιβάλλον που βλέπουν οι πραγματικοί χρήστες'}, - staging: {label: 'Staging', description: 'Αντίγραφο της παραγωγής. Χρησιμοποιείται για τον τελικό έλεγχο'}, - qa: {label: 'QA', description: 'Πειραματικό περιβάλλον που χρησιμοποιείται για δοκιμές'}, + production: { + label: 'Παραγωγή', + description: 'Το ζωντανό περιβάλλον που βλέπουν οι πραγματικοί χρήστες', + }, + staging: { + label: 'Staging', + description: 'Αντίγραφο της παραγωγής. Χρησιμοποιείται για τον τελικό έλεγχο', + }, + qa: { + label: 'QA', + description: 'Πειραματικό περιβάλλον που χρησιμοποιείται για δοκιμές', + }, }, serverPinnedDescription: 'Αυτή η έκδοση επικοινωνεί πάντα με έναν διακομιστή, οπότε δεν μπορεί να αλλάξει εδώ.', forceOffline: 'Εξαναγκασμός εκτός σύνδεσης', @@ -2917,7 +2950,10 @@ const translations: TranslationDeepObject = { getStarted: 'Ξεκινήστε', headerTitle: 'Παγκόσμιες αποζημιώσεις', }, - wiseGlobalReimbursementsBanner: {title: 'Πληρώστε ανθρώπους παγκοσμίως', subtitle: 'Ενεργοποιήστε τις παγκόσμιες αποζημιώσεις στον λογαριασμό USD σας.'}, + wiseGlobalReimbursementsBanner: { + title: 'Πληρώστε ανθρώπους παγκοσμίως', + subtitle: 'Ενεργοποιήστε τις παγκόσμιες αποζημιώσεις στον λογαριασμό USD σας.', + }, }, addCardToDigitalWallet: { title: ({walletName}: {walletName: string}) => `Προσθήκη κάρτας στο ${walletName}`, @@ -6431,20 +6467,28 @@ _Για πιο αναλυτικές οδηγίες, [επισκεφθείτε τ }, syncReimbursedReports: 'Συγχρονισμός εξοφλημένων αναφορών', syncReimbursedReportsDescription: 'Όταν μια αναφορά πληρώνεται μέσω ACH, θα δημιουργηθεί πληρωμή λογαριασμού σε αυτόν τον λογαριασμό.', - billPaymentAccount: {label: 'Λογαριασμός πληρωμής λογαριασμών', description: 'Επιλέξτε από πού θα πληρώνετε λογαριασμούς και θα δημιουργήσουμε την πληρωμή στο DualEntry.'}, + billPaymentAccount: { + label: 'Λογαριασμός πληρωμής λογαριασμών', + description: 'Επιλέξτε από πού θα πληρώνετε λογαριασμούς και θα δημιουργήσουμε την πληρωμή στο DualEntry.', + }, fxExpenseAccount: { label: 'Λογαριασμός προμήθειας μετατροπής νομίσματος DualEntry', description: 'Όταν η εταιρεία σας καλύπτει το κόστος μετατροπής νομίσματος για μια πληρωμή στο εξωτερικό, θα καταχωρούμε αυτό το κόστος σε αυτόν τον λογαριασμό στο DualEntry ως λογιστική εγγραφή.', }, syncExpensifyCardSettlements: 'Συγχρονισμός διακανονισμών κάρτας Expensify', - settlementAccount: {label: 'λογαριασμός διακανονισμού κάρτας Expensify', description: 'Επιλέξτε τον λογαριασμό εκκαθάρισης και θα δημιουργήσουμε την πληρωμή στο DualEntry.'}, + settlementAccount: { + label: 'λογαριασμός διακανονισμού κάρτας Expensify', + description: 'Επιλέξτε τον λογαριασμό εκκαθάρισης και θα δημιουργήσουμε την πληρωμή στο DualEntry.', + }, syncTravelInvoicingSettlements: 'Συγχρονισμός διακανονισμών ενοποιημένης χρέωσης ταξιδιών', travelInvoicingSettlementAccount: { label: 'λογαριασμός εκκαθάρισης συγκεντρωτικής χρέωσης ταξιδιών', description: 'Επιλέξτε τον λογαριασμό εκκαθάρισης και θα δημιουργήσουμε την πληρωμή στο DualEntry.', }, - travelInvoicingPayableAccount: {label: 'Λογαριασμός πληρωτέων ενοποιημένης χρέωσης ταξιδιών'}, + travelInvoicingPayableAccount: { + label: 'Λογαριασμός πληρωτέων ενοποιημένης χρέωσης ταξιδιών', + }, }, type: { free: 'Δωρεάν', @@ -6589,6 +6633,18 @@ _Για πιο αναλυτικές οδηγίες, [επισκεφθείτε τ [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Τελευταία εργάσιμη ημέρα του μήνα', [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Προσαρμοσμένη ημέρα μήνα', }, + reimbursable: { + title: 'Επιστρεπτέο', + description: 'Επιλέξτε πώς θα δημιουργούνται οι συναλλαγές κάρτας. Οι νέες συναλλαγές θα ακολουθούν αυτούς τους κανόνες.', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES]: 'Πάντα επιστρεπτέο', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES}Description`]: 'Επιστρέφεται πάντα στους υπαλλήλους', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO]: 'Πάντα μη επιστρεπτέο', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO}Description`]: 'Δεν επιστρέφεται ποτέ στους υπαλλήλους', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES]: 'Επιστρεπτέο', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES}Description`]: 'Επιστρέφεται συνήθως στους υπαλλήλους', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO]: 'Μη επιστρεπτέο', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO}Description`]: 'Επιστρέφεται περιστασιακά στους υπαλλήλους', + }, assign: 'Ανάθεση', assignCard: 'Ανάθεση κάρτας', findCompanyCard: 'Εντοπίστε εταιρική κάρτα', @@ -8003,7 +8059,11 @@ _Για πιο αναλυτικές οδηγίες, [επισκεφθείτε τ dontSeeYourATS: `Δεν βλέπετε εδώ το ATS σας; Ρωτήστε το Concierge και μπορούμε να το προσθέσουμε.`, importSettings: 'Ρυθμίσεις εισαγωγής', defaultApprover: 'Προεπιλεγμένος εγκρίνων', - approverFields: {recruiter: 'Στρατολογητής', recruitingCoordinator: 'Συντονιστής προσλήψεων', hiringManager: 'Υπεύθυνος προσλήψεων'}, + approverFields: { + recruiter: 'Στρατολογητής', + recruitingCoordinator: 'Συντονιστής προσλήψεων', + hiringManager: 'Υπεύθυνος προσλήψεων', + }, filters: { description: (providerName: string) => `Επιλέξτε ποια μέλη θα εισαχθούν από το ${providerName}. Μπορείτε να επιλέξετε από στάδια εργασίας, ετικέτες και γραφεία.`, stages: { @@ -9382,22 +9442,40 @@ ${reportName}`, enableNewAccountsDescription: 'Οι νέοι λογαριασμοί Campfire θα είναι διαθέσιμοι ως κατηγορίες.', dimensionsImport: 'Όλες οι διαστάσεις Campfire εισάγονται ως ετικέτες', exportDescription: 'Ρυθμίστε τον τρόπο με τον οποίο τα δεδομένα του Expensify εξάγονται στο Campfire.', - exportReimbursable: {label: 'Εξαγωγή αποζημιώσιμων εξόδων ως', values: {VENDOR_BILL: {label: 'Τιμολόγια προμηθευτών'}}}, + exportReimbursable: { + label: 'Εξαγωγή αποζημιώσιμων εξόδων ως', + values: {VENDOR_BILL: {label: 'Τιμολόγια προμηθευτών'}}, + }, exportDate: { label: 'Ημερομηνία τιμολογίου προμηθευτή', description: 'Χρησιμοποιήστε αυτήν την ημερομηνία κατά την εξαγωγή αναφορών στο Campfire.', values: { - LAST_EXPENSE: {label: 'Ημερομηνία τελευταίας δαπάνης', description: 'Ημερομηνία της πιο πρόσφατης δαπάνης στην αναφορά.'}, - REPORT_EXPORTED: {label: 'Ημερομηνία εξαγωγής', description: 'Ημερομηνία εξαγωγής της αναφοράς στο Campfire.'}, - REPORT_SUBMITTED: {label: 'Ημερομηνία υποβολής', description: 'Ημερομηνία που η αναφορά υποβλήθηκε για έγκριση.'}, + LAST_EXPENSE: { + label: 'Ημερομηνία τελευταίας δαπάνης', + description: 'Ημερομηνία της πιο πρόσφατης δαπάνης στην αναφορά.', + }, + REPORT_EXPORTED: { + label: 'Ημερομηνία εξαγωγής', + description: 'Ημερομηνία εξαγωγής της αναφοράς στο Campfire.', + }, + REPORT_SUBMITTED: { + label: 'Ημερομηνία υποβολής', + description: 'Ημερομηνία που η αναφορά υποβλήθηκε για έγκριση.', + }, }, }, - exportNonReimbursable: {label: 'Εξαγωγή εταιρικών εξόδων κάρτας ως', values: {JOURNAL_ENTRY: {label: 'Λογιστικές εγγραφές'}}}, + exportNonReimbursable: { + label: 'Εξαγωγή εταιρικών εξόδων κάρτας ως', + values: {JOURNAL_ENTRY: {label: 'Λογιστικές εγγραφές'}}, + }, defaultCompanyCardVendor: { label: 'Προεπιλεγμένος προμηθευτής για όλες τις εταιρικές κάρτες', description: 'Επιλέξτε έναν προεπιλεγμένο προμηθευτή Campfire για δαπάνες που δεν αντιστοιχίζονται αυτόματα.', }, - companyCardAccount: {label: 'Λογαριασμός εταιρικής κάρτας', description: 'Επιλέξτε πού θα εξαχθούν οι συναλλαγές εταιρικής κάρτας.'}, + companyCardAccount: { + label: 'Λογαριασμός εταιρικής κάρτας', + description: 'Επιλέξτε πού θα εξαχθούν οι συναλλαγές εταιρικής κάρτας.', + }, noAccountsFound: 'Δεν βρέθηκαν λογαριασμοί', noAccountsFoundDescription: 'Παρακαλούμε προσθέστε λογαριασμούς στο Campfire και συγχρονίστε ξανά τη σύνδεση', autoSyncDescription: 'Συγχρονίστε αυτόματα το Campfire και το Expensify, κάθε μέρα. Οι αναφορές συγχρονίζονται σε πραγματικό χρόνο.', @@ -9420,13 +9498,18 @@ ${reportName}`, description: 'Επιλέξτε τον λογαριασμό εκκαθάρισης για τις πιστώσεις Campfire όταν το Expensify σημειώνει έναν λογαριασμό ως πληρωμένο.', }, syncExpensifyCardSettlements: 'Συγχρονισμός διακανονισμών Κάρτας Expensify', - settlementAccount: {label: 'λογαριασμός εκκαθάρισης Κάρτας Expensify', description: 'Επιλέξτε τον λογαριασμό διακανονισμού σας και θα δημιουργήσουμε την πληρωμή στο Campfire.'}, + settlementAccount: { + label: 'λογαριασμός εκκαθάρισης Κάρτας Expensify', + description: 'Επιλέξτε τον λογαριασμό διακανονισμού σας και θα δημιουργήσουμε την πληρωμή στο Campfire.', + }, syncTravelInvoicingSettlements: 'Συγχρονισμός διακανονισμών ενοποιημένης χρέωσης ταξιδιών', travelInvoicingSettlementAccount: { label: 'λογαριασμός εκκαθάρισης συγκεντρωτικής χρέωσης ταξιδιών', description: 'Επιλέξτε τον λογαριασμό διακανονισμού σας και θα δημιουργήσουμε την πληρωμή στο Campfire.', }, - travelInvoicingPayableAccount: {label: 'Λογαριασμός πληρωτέων ενοποιημένης χρέωσης ταξιδιών'}, + travelInvoicingPayableAccount: { + label: 'Λογαριασμός πληρωτέων ενοποιημένης χρέωσης ταξιδιών', + }, exportToMultipleAccounts: 'Ρύθμιση εξαγωγής σε πολλούς λογαριασμούς', cardProgramAccount: { label: 'Λογαριασμός προγράμματος κάρτας', @@ -9812,6 +9895,8 @@ ${reportName}`, `${enabled ? 'ενεργοποιημένο' : 'απενεργοποιημένο'} κατόχοι κάρτας να διαγράψουν συναλλαγές κάρτας για την τροφοδοσία κάρτας «${feedName}»`, updatedCardFeedStatementPeriod: (feedName: string, newValue?: string, previousValue?: string) => `άλλαξε την ημέρα λήξης της περιόδου εκκαθάρισης της ροής κάρτας «${feedName}»${newValue ? `σε "${newValue}"` : ''}${previousValue ? `(προηγουμένως "${previousValue}")` : ''}`, + updatedCardFeedReimbursable: (feedName: string, newValue?: string, previousValue?: string) => + `άλλαξε τη ρύθμιση επιστρεπτέου του καναλιού κάρτας "${feedName}"${newValue ? ` σε "${newValue}"` : ''}${previousValue ? ` (προηγουμένως "${previousValue}")` : ''}`, agentRule: { added: ({title, prompt}: {title: string; prompt: string}) => (title ? `προσέθεσε τον κανόνα πράκτορα «${title}»: ${prompt}` : `προσέθεσε έναν κανόνα πράκτορα: ${prompt}`), updated: ({title, prompt}: {title: string; prompt: string}) => @@ -10034,7 +10119,11 @@ ${reportName}`, `αλλάχθηκε ο αποκλεισμός μετακινήσεων από/προς εργασία σε σταθερή απόσταση ανά αίτημα (προηγουμένως ${previousMethod})`, changedToHomeAndOffice: ({previousMethod}: {previousMethod: string}) => `άλλαξε τον αποκλεισμό μετακινήσεων ώστε να υπολογίζεται από το σπίτι και το γραφείο (προηγουμένως ${previousMethod})`, - previousMethod: {disabled: 'να μην αποκλείονται οι μετακινήσεις από και προς την εργασία', fixedDistance: 'σταθερή απόσταση ανά αίτημα', homeAndOffice: 'σπίτι και γραφείο'}, + previousMethod: { + disabled: 'να μην αποκλείονται οι μετακινήσεις από και προς την εργασία', + fixedDistance: 'σταθερή απόσταση ανά αίτημα', + homeAndOffice: 'σπίτι και γραφείο', + }, setFixedDistance: ({formattedDistance}: {formattedDistance: string}) => `ορίστε σταθερό αποκλεισμό απόστασης σε ${formattedDistance} ανά αίτημα`, changedFixedDistance: ({formattedOldDistance, formattedNewDistance}: {formattedOldDistance: string; formattedNewDistance: string}) => `άλλαξε τον αποκλεισμό σταθερής απόστασης σε ${formattedNewDistance} ανά αίτημα (προηγουμένως ${formattedOldDistance})`, @@ -10470,7 +10559,11 @@ ${reportName}`, emptyViolationSnapshotResults: { subtitle: (formattedDate) => `Οι παραβάσεις παρακολουθούνται μόνο από ${formattedDate} και μετά. Δοκιμάστε να προσαρμόσετε τα φίλτρα ημερομηνίας σας.`, }, - staleResults: {title: 'Απαιτείται ανανέωση', subtitle: 'Αυτή η σελίδα είναι παρωχημένη, κάντε ανανέωση για να δείτε τα πιο πρόσφατα', buttonText: 'Ανανέωση'}, + staleResults: { + title: 'Απαιτείται ανανέωση', + subtitle: 'Αυτή η σελίδα είναι παρωχημένη, κάντε ανανέωση για να δείτε τα πιο πρόσφατα', + buttonText: 'Ανανέωση', + }, }, columns: 'Στήλες', editColumns: 'Επεξεργασία στηλών', @@ -10567,7 +10660,11 @@ ${reportName}`, banks: 'Τραπεζικοί λογαριασμοί', closedBankAccounts: 'Κλειστοί τραπεζικοί λογαριασμοί', }, - workspace: {active: 'Ενεργός', archived: 'Αρχειοθετημένο', selectAll: 'Επιλογή όλων'}, + workspace: { + active: 'Ενεργός', + archived: 'Αρχειοθετημένο', + selectAll: 'Επιλογή όλων', + }, reportField: (name: string, value: string) => `${name} είναι ${value}`, current: 'Τρέχον', past: 'Παρελθόν', @@ -10616,7 +10713,10 @@ ${reportName}`, [CONST.SEARCH.ACTION_FILTERS.PAY]: 'Πληρωμή', [CONST.SEARCH.ACTION_FILTERS.EXPORT]: 'Εξαγωγή', }, - has: {submittedViolation: 'Υποβληθείσα παράβαση', approvedViolation: 'Εγκεκριμένη παράβαση'}, + has: { + submittedViolation: 'Υποβληθείσα παράβαση', + approvedViolation: 'Εγκεκριμένη παράβαση', + }, filterType: { label: 'Τύπος φίλτρου', has: {positive: 'έχει', negative: 'δεν έχει'}, @@ -10713,7 +10813,10 @@ ${reportName}`, mergeReports: { title: 'Συγχώνευση αναφορών', description: 'Επιλέξτε την αναφορά που θέλετε να κρατήσετε. Όλες οι δαπάνες θα μετακινηθούν σε αυτήν και οι άλλες αναφορές θα διαγραφούν.', - listPage: {noEligibleReportsFound: 'Δεν βρέθηκαν κατάλληλες αναφορές', noEligibleReportsFoundSubtitle: 'Δεν έχετε καμία αναφορά που να μπορεί να συγχωνευθεί.'}, + listPage: { + noEligibleReportsFound: 'Δεν βρέθηκαν κατάλληλες αναφορές', + noEligibleReportsFoundSubtitle: 'Δεν έχετε καμία αναφορά που να μπορεί να συγχωνευθεί.', + }, }, goTo: ({destination}: {destination: string}) => `Μετάβαση στο ${destination}`, mySavedSearch: 'Οι δαπάνες μου', @@ -10756,7 +10859,13 @@ ${reportName}`, }, }, settlement: { - status: {pending: 'Σε εκκρεμότητα', cleared: 'Εκκαθαρισμένο', failed: 'Απέτυχε', never: 'Ποτέ', cashBack: 'Επιστροφή μετρητών'}, + status: { + pending: 'Σε εκκρεμότητα', + cleared: 'Εκκαθαρισμένο', + failed: 'Απέτυχε', + never: 'Ποτέ', + cashBack: 'Επιστροφή μετρητών', + }, failedError: ({link}: {link: string}) => `Θα προσπαθήσουμε ξανά για αυτόν τον διακανονισμό όταν ξεκλειδώσετε τον λογαριασμό σας.`, withdrawalInfo: ({date, withdrawalID}: {date: string; withdrawalID: number}) => `${date} • Αναγνωριστικό ανάληψης: ${withdrawalID}`, }, @@ -11849,7 +11958,14 @@ ${reportName}`, one: '1 ενεργός χρήστης', other: `${count} ενεργοί χρήστες`, }), - state: {paid: 'Πληρωμένο', cleared: 'Εκκαθαρισμένο', failed: 'Απέτυχε', refunded: 'Επιστράφηκε', disputed: 'Αμφισβητούμενη', balanceTransfer: 'Μεταφορά υπολοίπου'}, + state: { + paid: 'Πληρωμένο', + cleared: 'Εκκαθαρισμένο', + failed: 'Απέτυχε', + refunded: 'Επιστράφηκε', + disputed: 'Αμφισβητούμενη', + balanceTransfer: 'Μεταφορά υπολοίπου', + }, details: 'Στοιχεία πληρωμής', badge: { balanceTransferTo: ({email}: {email: string}) => `Μεταφορά υπολοίπου σε ${email}`, @@ -12486,6 +12602,10 @@ ${reportName}`, mobileRenewPrompt: 'Επισκεφθείτε το Expensify στον περιηγητή ιστού σας για να ανανεώσετε νωρίτερα.', mobileClaimPrompt: 'Επισκεφθείτε το Expensify στον φυλλομετρητή σας για να διεκδικήσετε την έκπτωση ανανέωσης.', }, - bulkActionBar: {label: 'Μαζικές ενέργειες', clearSelection: 'Καθαρισμός επιλογής', loadingSelection: 'Φόρτωση επιλογής'}, + bulkActionBar: { + label: 'Μαζικές ενέργειες', + clearSelection: 'Καθαρισμός επιλογής', + loadingSelection: 'Φόρτωση επιλογής', + }, }; export default translations; diff --git a/src/languages/en.ts b/src/languages/en.ts index f8b224aaa791..4e1e6dddb617 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -766,7 +766,10 @@ const translations = { troubleshootBiometricsStatus: ({status}: {status?: string}) => `Biometrics (${status})`, statusNeverRegistered: 'Never registered', statusNotRegistered: 'Not registered', - statusRegisteredOtherDevice: () => ({one: 'Another device registered', other: 'Other devices registered'}), + statusRegisteredOtherDevice: () => ({ + one: 'Another device registered', + other: 'Other devices registered', + }), statusRegisteredThisDevice: 'Registered', yourAttemptWasUnsuccessful: 'Your authentication attempt was unsuccessful.', youCouldNotBeAuthenticated: 'You couldn’t be authenticated', @@ -2555,9 +2558,18 @@ const translations = { testingPreferences: 'Testing preferences', server: 'Server', servers: { - production: {label: 'Production', description: 'The live environment real users see'}, - staging: {label: 'Staging', description: 'Mirror of production. Used for final validation'}, - qa: {label: 'QA', description: 'Experimental environment used for testing'}, + production: { + label: 'Production', + description: 'The live environment real users see', + }, + staging: { + label: 'Staging', + description: 'Mirror of production. Used for final validation', + }, + qa: { + label: 'QA', + description: 'Experimental environment used for testing', + }, }, serverPinnedDescription: 'This build always talks to one server, so it cannot be changed here.', qaAuth: 'QA auth (Cloudflare)', @@ -6888,6 +6900,18 @@ const translations = { [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Last business day of the month', [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Custom day of month', }, + reimbursable: { + title: 'Reimbursable', + description: 'Choose how card transactions should be created. New transactions will follow these rules.', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES]: 'Always reimbursable', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES}Description`]: 'Always paid back to employees', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO]: 'Always non-reimbursable', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO}Description`]: 'Never paid back to employees', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES]: 'Reimbursable', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES}Description`]: 'Most often paid back to employees', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO]: 'Non-reimbursable', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO}Description`]: 'Occasionally paid back to employees', + }, assign: 'Assign', assignCard: 'Assign card', findCompanyCard: 'Find company card', @@ -9834,6 +9858,8 @@ const translations = { updatedCardFeedLiability: (feedName: string, enabled: boolean) => `${enabled ? 'enabled' : 'disabled'} cardholders to delete card transactions for card feed "${feedName}"`, updatedCardFeedStatementPeriod: (feedName: string, newValue?: string, previousValue?: string) => `changed card feed "${feedName}" statement period end day${newValue ? ` to "${newValue}"` : ''}${previousValue ? ` (previously "${previousValue}")` : ''}`, + updatedCardFeedReimbursable: (feedName: string, newValue?: string, previousValue?: string) => + `changed card feed "${feedName}" reimbursable setting${newValue ? ` to "${newValue}"` : ''}${previousValue ? ` (previously "${previousValue}")` : ''}`, agentRule: { added: ({title, prompt}: {title: string; prompt: string}) => (title ? `added the agent rule "${title}": ${prompt}` : `added an agent rule: ${prompt}`), updated: ({title, prompt}: {title: string; prompt: string}) => (title ? `updated the agent rule "${title}" to: ${prompt}` : `updated an agent rule to: ${prompt}`), @@ -11517,7 +11543,11 @@ const translations = { markAsCashToIgnore: 'Mark as cash to ignore and request payment.', smartscanFailed: ({canEdit = true, missingFields = []}: {canEdit?: boolean; missingFields?: string[]}) => { if (missingFields.length > 0) { - const fieldNames: Record = {merchant: 'merchant', date: 'date', amount: 'amount'}; + const fieldNames: Record = { + merchant: 'merchant', + date: 'date', + amount: 'amount', + }; const translated = missingFields.map((f) => fieldNames[f] ?? f); let fieldList = ''; if (translated.length === 1) { diff --git a/src/languages/es.ts b/src/languages/es.ts index 73cd968041b1..11763d005c46 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -540,7 +540,12 @@ const translations: TranslationDeepObject = { prompt: '¿Quieres que te avisemos cuando Concierge responda?', cta: 'Notificar', }, - feedback: {prompt: '¿Te ha sido útil esta respuesta?', useful: 'Respuesta útil', notUseful: 'Respuesta poco útil', thanks: '¡Gracias por tus comentarios!'}, + feedback: { + prompt: '¿Te ha sido útil esta respuesta?', + useful: 'Respuesta útil', + notUseful: 'Respuesta poco útil', + thanks: '¡Gracias por tus comentarios!', + }, }, supportalNoAccess: { title: 'No tan rápido', @@ -670,7 +675,10 @@ const translations: TranslationDeepObject = { statusNeverRegistered: 'Nunca registrado', statusNotRegistered: 'No registrado', statusRegisteredThisDevice: 'Registrado', - statusRegisteredOtherDevice: () => ({one: 'Otro dispositivo registrado', other: 'Otros dispositivos registrados'}), + statusRegisteredOtherDevice: () => ({ + one: 'Otro dispositivo registrado', + other: 'Otros dispositivos registrados', + }), yourAttemptWasUnsuccessful: 'Tu intento de autenticación fue fallido.', youCouldNotBeAuthenticated: 'No se pudo autenticar', areYouSureToReject: '¿Estás seguro? El intento de autenticación será rechazado si cierras esta pantalla.', @@ -700,7 +708,10 @@ const translations: TranslationDeepObject = { letsVerifyItsYou: 'Verifiquemos que eres tú', nowLetsAuthenticateYou: 'Vamos a validarte...', letsAuthenticateYou: 'Validando...', - verifyYourself: {biometrics: 'Verifícate con tu rostro o huella dactilar', passkeys: 'Verifícate con una passkey'}, + verifyYourself: { + biometrics: 'Verifícate con tu rostro o huella dactilar', + passkeys: 'Verifícate con una passkey', + }, enableQuickVerification: { biometrics: 'Activa la verificación rápida y segura usando tu rostro o huella dactilar. No se requieren contraseñas ni códigos.', passkeys: 'Habilita una verificación rápida y segura usando una passkey. No se requieren contraseñas ni códigos.', @@ -739,7 +750,9 @@ const translations: TranslationDeepObject = { changePin: { didNotChange: 'No pudimos cambiar tu PIN. Por favor, inténtalo de nuevo.', }, - revealCardDetail: {couldNotReveal: 'No hemos podido mostrar los datos de tu tarjeta. Por favor, inténtalo de nuevo.'}, + revealCardDetail: { + couldNotReveal: 'No hemos podido mostrar los datos de tu tarjeta. Por favor, inténtalo de nuevo.', + }, }, validateCodeModal: { successfulSignInTitle: 'Abracadabra,\n¡sesión iniciada!', @@ -979,15 +992,27 @@ const translations: TranslationDeepObject = { defaultSubtitle: 'Espacio de trabajo', subtitle: ({policyName}: {policyName: string}) => policyName, }, - addShippingAddress: {title: 'Necesitamos tu dirección de envío', subtitle: 'Proporciona una dirección para recibir tu Tarjeta Expensify.', cta: 'Añade'}, - addVirtualCardPersonalDetails: {title: 'Añade tus datos para ver y empezar a usar tu Tarjeta Expensify.', subtitle: 'Tarjeta Expensify', cta: 'Añade'}, + addShippingAddress: { + title: 'Necesitamos tu dirección de envío', + subtitle: 'Proporciona una dirección para recibir tu Tarjeta Expensify.', + cta: 'Añade', + }, + addVirtualCardPersonalDetails: { + title: 'Añade tus datos para ver y empezar a usar tu Tarjeta Expensify.', + subtitle: 'Tarjeta Expensify', + cta: 'Añade', + }, addPaymentCard: { title: 'Añade una tarjeta de pago para seguir usando Expensify', subtitle: 'Cuenta > Suscripción', cta: 'Añadir', }, - addBankAccount: {title: 'Añade una cuenta bancaria para recibir el reembolso'}, - addDepositAccount: {title: 'Añade una cuenta bancaria para recibir pagos'}, + addBankAccount: { + title: 'Añade una cuenta bancaria para recibir el reembolso', + }, + addDepositAccount: { + title: 'Añade una cuenta bancaria para recibir pagos', + }, activateCard: { title: 'Activa tu Tarjeta Expensify', subtitle: 'Valida tu tarjeta y empieza a gastar.', @@ -1002,7 +1027,11 @@ const translations: TranslationDeepObject = { subtitle: 'Tarjeta Expensify', cta: 'Revisar', }, - addHomeAddress: {title: 'Añade tu dirección de casa para el seguimiento de distancia', subtitle: 'Cuenta', cta: 'Añade'}, + addHomeAddress: { + title: 'Añade tu dirección de casa para el seguimiento de distancia', + subtitle: 'Cuenta', + cta: 'Añade', + }, fixFailedBilling: { title: 'No pudimos cobrar a la tarjeta registrada.', subtitle: 'Suscripción', @@ -1013,7 +1042,10 @@ const translations: TranslationDeepObject = { workspaceSubtitle: ({policyName}: {policyName: string}) => policyName, personalSubtitle: 'Billetera', }, - enterSignerInfo: {title: 'Se necesita la información del firmante', subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Cuenta bancaria ${bankAccountLastFour}`}, + enterSignerInfo: { + title: 'Se necesita la información del firmante', + subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Cuenta bancaria ${bankAccountLastFour}`, + }, payOverdueInvoice: { cta: 'Revisar', dueSoonTitle: ({date}: {date: string}) => `Paga tu factura antes del ${date} para evitar la interrupción del servicio`, @@ -1024,7 +1056,10 @@ const translations: TranslationDeepObject = { subtitle: ({date}: {date: string}) => `La suscripción termina el ${date}`, cta: 'Gestionar', }, - emailDeliveryFailure: {title: 'No podemos enviarte notificaciones por correo electrónico', subtitle: 'Cuenta'}, + emailDeliveryFailure: { + title: 'No podemos enviarte notificaciones por correo electrónico', + subtitle: 'Cuenta', + }, upgradeNetSuiteConnection: {title: 'Mejora tu conexión con NetSuite'}, }, freeTrialSection: { @@ -1163,7 +1198,10 @@ const translations: TranslationDeepObject = { emptyStateTitle: 'No hay gastos recientes', emptyStateMessage: 'Crea uno o arrastra un recibo aquí', }, - insightsSection: {chartUnavailable: 'Gráfico no disponible', notEnoughData: 'Todavía no tenemos suficientes datos para completar este gráfico'}, + insightsSection: { + chartUnavailable: 'Gráfico no disponible', + notEnoughData: 'Todavía no tenemos suficientes datos para completar este gráfico', + }, conciergePrompt: { goodMorning: ({name}: {name?: string}) => (name ? `Buenos días, ${name}.` : 'Buenos días.'), goodAfternoon: ({name}: {name?: string}) => (name ? `Buenas tardes, ${name}.` : 'Buenas tardes.'), @@ -1174,8 +1212,14 @@ const translations: TranslationDeepObject = { }, insightsPage: { viewOnSpend: 'Ver en Gastos', - emptyState: {title: 'Nada que mostrar', subtitle: 'Prueba a ajustar tus criterios de arriba'}, - noExpensesState: {title: 'Ve adónde va tu dinero', subtitle: 'Una vez que tengas gastos, encontrarás tendencias de gasto, principales comercios y mucho más.'}, + emptyState: { + title: 'Nada que mostrar', + subtitle: 'Prueba a ajustar tus criterios de arriba', + }, + noExpensesState: { + title: 'Ve adónde va tu dinero', + subtitle: 'Una vez que tengas gastos, encontrarás tendencias de gasto, principales comercios y mucho más.', + }, compare: { label: 'Comparar', previousPeriod: 'Periodo anterior', @@ -2188,7 +2232,11 @@ const translations: TranslationDeepObject = { saved: 'Guardado', }, }, - securityPage: {title: 'Seguridad', subtitle: 'Mantén tu cuenta segura.', goToSecurity: 'Volver a la página de seguridad'}, + securityPage: { + title: 'Seguridad', + subtitle: 'Mantén tu cuenta segura.', + goToSecurity: 'Volver a la página de seguridad', + }, shareCodePage: { title: 'Tu código', subtitle: 'Invita a miembros a Expensify compartiendo tu código QR personal o enlace de invitación.', @@ -2302,9 +2350,18 @@ const translations: TranslationDeepObject = { testingPreferences: 'Preferencias para Tests', server: 'Servidor', servers: { - production: {label: 'Producción', description: 'El entorno en vivo que ven los usuarios reales'}, - staging: {label: 'Staging', description: 'Réplica de producción. Se usa para la validación final'}, - qa: {label: 'QA', description: 'Entorno experimental usado para pruebas'}, + production: { + label: 'Producción', + description: 'El entorno en vivo que ven los usuarios reales', + }, + staging: { + label: 'Staging', + description: 'Réplica de producción. Se usa para la validación final', + }, + qa: { + label: 'QA', + description: 'Entorno experimental usado para pruebas', + }, }, serverPinnedDescription: 'Esta versión siempre se conecta a un solo servidor, por lo que no se puede cambiar aquí.', forceOffline: 'Forzar desconexión', @@ -2766,7 +2823,10 @@ const translations: TranslationDeepObject = { getStarted: 'Empieza', headerTitle: 'Reembolsos globales', }, - wiseGlobalReimbursementsBanner: {title: 'Paga a personas de todo el mundo', subtitle: 'Habilita los reembolsos globales en tu cuenta en USD.'}, + wiseGlobalReimbursementsBanner: { + title: 'Paga a personas de todo el mundo', + subtitle: 'Habilita los reembolsos globales en tu cuenta en USD.', + }, }, addCardToDigitalWallet: { title: ({walletName}: {walletName: string}) => `Añadir tarjeta a ${walletName}`, @@ -3160,12 +3220,20 @@ ${amount} para ${merchant} - ${date}`, }, editAgentAvatarPage: {title: 'Editar avatar'}, editAgentNamePage: {title: 'Nombre del agente'}, - editAgentPromptPage: {title: 'Escribir instrucciones personalizadas', error: {emptyPrompt: 'Por favor, introduce instrucciones para tu agente.'}}, + editAgentPromptPage: { + title: 'Escribir instrucciones personalizadas', + error: { + emptyPrompt: 'Por favor, introduce instrucciones para tu agente.', + }, + }, expenseRulesPage: { title: 'Reglas de gastos', subtitle: 'Estas reglas se aplicarán a tus gastos.', findRule: 'Encontrar regla', - emptyRules: {title: 'Aún no hay reglas', subtitle: 'Añade una regla para automatizar los informes de gastos.'}, + emptyRules: { + title: 'Aún no hay reglas', + subtitle: 'Añade una regla para automatizar los informes de gastos.', + }, changes: { billableUpdate: (value: boolean) => `Actualiza el gasto a ${value ? 'facturable' : 'no facturable'}`, categoryUpdate: (value: string) => `Actualiza la categoría a "${value}"`, @@ -4681,7 +4749,12 @@ ${amount} para ${merchant} - ${date}`, departs: 'Sale', errorMessage: 'Ha ocurrido un error. Por favor, inténtalo mas tarde.', phoneError: (phoneErrorMethodsRoute) => `Para reservar viajes, añade una dirección de correo electrónico de trabajo.`, - domainSelector: {headline: '¿Qué dominio quieres configurar?', title: 'Dominio', subtitle: 'Elige un dominio para configurar Expensify Travel.', recommended: 'Recomendado'}, + domainSelector: { + headline: '¿Qué dominio quieres configurar?', + title: 'Dominio', + subtitle: 'Elige un dominio para configurar Expensify Travel.', + recommended: 'Recomendado', + }, workspaceAddress: {headline: '¿Cuál es la dirección de tu empresa?'}, taxID: { headline: '¿Cuál es el número de identificación fiscal de tu empresa?', @@ -5554,8 +5627,12 @@ ${amount} para ${merchant} - ${date}`, }, exportNonReimbursable: {label: 'Exportar gastos no reembolsables como'}, expenseReports: 'Informes de gastos', - exportReimbursableExpenseReports: {helperText: 'Los gastos marcados como reembolsables se exportarán como informes de gastos emitidos al empleado.'}, - exportNonReimbursableExpenseReports: {helperText: 'Los gastos marcados como no reembolsables se exportarán como informes de gastos emitidos al empleado.'}, + exportReimbursableExpenseReports: { + helperText: 'Los gastos marcados como reembolsables se exportarán como informes de gastos emitidos al empleado.', + }, + exportNonReimbursableExpenseReports: { + helperText: 'Los gastos marcados como no reembolsables se exportarán como informes de gastos emitidos al empleado.', + }, noVendorsFound: 'No se encontraron proveedores', noVendorsFoundDescription: 'Vuelve a sincronizar la conexión después de añadir los proveedores en Certinia.', noCompaniesFound: 'No se encontraron empresas', @@ -5585,7 +5662,12 @@ ${amount} para ${merchant} - ${date}`, chartOfAccounts: 'Plan de cuentas', chartOfAccountsDescription: 'El plan de cuentas se importa en Expensify como categorías.', dimensionMapping: ({n}: {n: number}) => `Dimensión ${n}`, - dimensions: {dimension1: 'Dimensión 1', dimension2: 'Dimensión 2', dimension3: 'Dimensión 3', dimension4: 'Dimensión 4'}, + dimensions: { + dimension1: 'Dimensión 1', + dimension2: 'Dimensión 2', + dimension3: 'Dimensión 3', + dimension4: 'Dimensión 4', + }, doNotMap: 'No asignar', doNotMapSubtitle: 'Usar recurso de empleado por defecto', mappingTypes: { @@ -6007,7 +6089,14 @@ ${amount} para ${merchant} - ${date}`, noAccountsFound: 'No se encontraron cuentas', noAccountsFoundDescription: 'Por favor, añade cuentas en Rillet y sincroniza la conexión de nuevo', exportDescription: 'Configura cómo se exportan los datos de Expensify a Rillet.', - exportReimbursable: {label: 'Exportar gastos reembolsables como', values: {[CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: {label: 'Facturas de proveedor'}}}, + exportReimbursable: { + label: 'Exportar gastos reembolsables como', + values: { + [CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: { + label: 'Facturas de proveedor', + }, + }, + }, exportDate: { label: 'Fecha de factura del proveedor', description: 'Usa esta fecha al exportar informes a Rillet.', @@ -6028,13 +6117,20 @@ ${amount} para ${merchant} - ${date}`, }, exportNonReimbursable: { label: 'Exportar gastos de tarjetas de empresa como', - values: {[CONST.RILLET_EXPORT_NON_REIMBURSABLE.CREDIT_CARD_CHARGE]: {label: 'Tarjetas de crédito'}}, + values: { + [CONST.RILLET_EXPORT_NON_REIMBURSABLE.CREDIT_CARD_CHARGE]: { + label: 'Tarjetas de crédito', + }, + }, }, defaultCompanyCardVendor: { label: 'Proveedor predeterminado de la tarjeta de empresa', description: 'Elige un proveedor Rillet predeterminado para los gastos que no se asignen automáticamente.', }, - companyCardAccount: {label: 'Cuenta de tarjeta de empresa', description: 'Elige dónde exportar las transacciones de las tarjetas de la empresa.'}, + companyCardAccount: { + label: 'Cuenta de tarjeta de empresa', + description: 'Elige dónde exportar las transacciones de las tarjetas de la empresa.', + }, noBankAccountsFound: 'No se encontraron cuentas bancarias', noBankAccountsFoundDescription: 'Por favor, añade cuentas bancarias en Rillet y sincroniza la conexión de nuevo', autoSyncDescription: 'Sincroniza Rillet y Expensify automáticamente, todos los días. Los informes se sincronizan en tiempo real.', @@ -6052,9 +6148,15 @@ ${amount} para ${merchant} - ${date}`, }, syncReimbursedReports: 'Sincronizar informes reembolsados', syncReimbursedReportsDescription: 'Cuando se pague un informe mediante ACH, se generará un pago de factura en esta cuenta.', - billPaymentAccount: {label: 'Cuenta de pago de facturas', description: 'Elige desde dónde pagar las facturas y crearemos el pago en Rillet.'}, + billPaymentAccount: { + label: 'Cuenta de pago de facturas', + description: 'Elige desde dónde pagar las facturas y crearemos el pago en Rillet.', + }, syncExpensifyCardSettlements: 'Sincronizar liquidaciones de la Tarjeta Expensify', - settlementAccount: {label: 'Cuenta de liquidación de la Tarjeta Expensify', description: 'Elige tu cuenta de liquidación y crearemos el pago en Rillet.'}, + settlementAccount: { + label: 'Cuenta de liquidación de la Tarjeta Expensify', + description: 'Elige tu cuenta de liquidación y crearemos el pago en Rillet.', + }, syncTravelInvoicingSettlements: 'Sincronizar liquidaciones de facturación de viajes consolidadas', travelInvoicingSettlementAccount: { label: 'Cuenta de liquidación de facturación consolidada de viajes', @@ -6200,20 +6302,28 @@ ${amount} para ${merchant} - ${date}`, }, syncReimbursedReports: 'Sincronizar informes reembolsados', syncReimbursedReportsDescription: 'Cuando un informe se pague mediante ACH, se generará un pago de factura en esta cuenta.', - billPaymentAccount: {label: 'Cuenta de pago de facturas', description: 'Elige desde dónde pagar las facturas y crearemos el pago en DualEntry.'}, + billPaymentAccount: { + label: 'Cuenta de pago de facturas', + description: 'Elige desde dónde pagar las facturas y crearemos el pago en DualEntry.', + }, fxExpenseAccount: { label: 'Cuenta de comisión por conversión de divisa de DualEntry', description: 'Cuando tu empresa cubra el coste de conversión de divisa en un pago realizado en el extranjero, registraremos ese coste en esta cuenta en DualEntry como un asiento contable.', }, syncExpensifyCardSettlements: 'Sincronizar liquidaciones de la Tarjeta Expensify', - settlementAccount: {label: 'Cuenta de liquidación de la Tarjeta Expensify', description: 'Elige tu cuenta de liquidación y crearemos el pago en DualEntry.'}, + settlementAccount: { + label: 'Cuenta de liquidación de la Tarjeta Expensify', + description: 'Elige tu cuenta de liquidación y crearemos el pago en DualEntry.', + }, syncTravelInvoicingSettlements: 'Sincronizar liquidaciones de facturación de viajes consolidadas', travelInvoicingSettlementAccount: { label: 'Cuenta de liquidación de facturación de viajes consolidada', description: 'Elige tu cuenta de liquidación y crearemos el pago en DualEntry.', }, - travelInvoicingPayableAccount: {label: 'Cuenta por pagar de facturación consolidada de viajes'}, + travelInvoicingPayableAccount: { + label: 'Cuenta por pagar de facturación consolidada de viajes', + }, }, type: { free: 'Gratis', @@ -6340,13 +6450,28 @@ ${amount} para ${merchant} - ${date}`, duplicateColumns: (duplicateColumn: string) => `¡Ups! Has asignado un solo campo ("${duplicateColumn}") a múltiples columnas. Por favor, revisa y vuelve a intentarlo.`, cardIdentityColumn: 'Asocia un número de tarjeta o un nombre de tarjeta para que las transacciones puedan vincularse a una tarjeta.', }, - duplicateFeedModal: {title: 'Feed de tarjeta ya conectado', prompt: 'No puedes añadir el mismo flujo de tarjeta al mismo espacio de trabajo dos veces.'}, + duplicateFeedModal: { + title: 'Feed de tarjeta ya conectado', + prompt: 'No puedes añadir el mismo flujo de tarjeta al mismo espacio de trabajo dos veces.', + }, }, statementCloseDate: { [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Último día del mes', [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Último día hábil del mes', [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Día personalizado del mes', }, + reimbursable: { + title: 'Reembolsable', + description: 'Elige cómo se deben crear las transacciones de tarjeta. Las nuevas transacciones seguirán estas reglas.', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES]: 'Siempre reembolsable', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES}Description`]: 'Siempre se reembolsa a los empleados', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO]: 'Siempre no reembolsable', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO}Description`]: 'Nunca se reembolsa a los empleados', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES]: 'Reembolsable', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES}Description`]: 'Se reembolsa a los empleados con más frecuencia', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO]: 'No reembolsable', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO}Description`]: 'Se reembolsa a los empleados de forma ocasional', + }, assign: 'Asignar', assignCard: 'Asignar tarjeta', findCompanyCard: 'Encontrar tarjeta de empresa', @@ -6822,7 +6947,9 @@ ${amount} para ${merchant} - ${date}`, description: '¿Está seguro de que desea desconectar esta integración?', confirmText: 'Entendido', }, - hrWarningModal: {disconnectText: ({integration}: {integration: string}) => `Para deshabilitar RR. HH., primero desconecta ${integration} de este espacio de trabajo.`}, + hrWarningModal: { + disconnectText: ({integration}: {integration: string}) => `Para deshabilitar RR. HH., primero desconecta ${integration} de este espacio de trabajo.`, + }, workflowWarningModal: { featureEnabledTitle: 'No tan rápido...', featureEnabledText: @@ -6838,7 +6965,9 @@ ${amount} para ${merchant} - ${date}`, subtitle: 'Establecer una tarifa por hora facturable para el seguimiento de tiempo.', defaultHourlyRate: 'Tarifa por hora predeterminada', }, - recruitingWarningModal: {disconnectText: ({integration}: {integration: string}) => `Para desactivar Recruiting, primero desconecta ${integration} de este espacio de trabajo.`}, + recruitingWarningModal: { + disconnectText: ({integration}: {integration: string}) => `Para desactivar Recruiting, primero desconecta ${integration} de este espacio de trabajo.`, + }, }, reports: { reportsCustomTitleExamples: 'Ejemplos:', @@ -6860,7 +6989,10 @@ ${amount} para ${merchant} - ${date}`, findReportField: 'Encontrar campo del informe', deleteConfirmation: '¿Está seguro de que desea eliminar este campo del informe?', deleteFieldsConfirmation: '¿Está seguro de que desea eliminar estos campos del informe?', - emptyReportFields: {title: 'Aún no hay campos de informe', subtitle: 'Añade un campo personalizado (texto, fecha o desplegable) que aparezca en los informes.'}, + emptyReportFields: { + title: 'Aún no hay campos de informe', + subtitle: 'Añade un campo personalizado (texto, fecha o desplegable) que aparezca en los informes.', + }, subtitle: 'Los campos de informe se aplican a todos los gastos y pueden ser útiles cuando quieras solicitar información adicional.', disableReportFields: 'Desactivar campos de informe', disableReportFieldsConfirmation: 'Estás seguro? Se eliminarán los campos de texto y fecha y se desactivarán las listas.', @@ -6885,7 +7017,10 @@ ${amount} para ${merchant} - ${date}`, disableValues: 'Desactivar valores', enableValue: 'Habilitar valor', enableValues: 'Habilitar valores', - emptyReportFieldsValues: {title: 'Aún no hay valores en la lista', subtitle: 'Añade valores personalizados para que aparezcan en los informes.'}, + emptyReportFieldsValues: { + title: 'Aún no hay valores en la lista', + subtitle: 'Añade valores personalizados para que aparezcan en los informes.', + }, deleteValuePrompt: '¿Estás seguro de que quieres eliminar este valor de la lista?', deleteValuesPrompt: '¿Estás seguro de que quieres eliminar estos valores de la lista?', listValueRequiredError: 'Ingresa un nombre para el valor de la lista', @@ -7233,7 +7368,10 @@ El plan Controlar empieza en 9 $ por miembro activo al mes.`, `${memberName} tiene un informe en proceso pendiente de acción. Pídele que complete la acción requerida antes de eliminarlo del espacio de trabajo.`, configureHRSync: (providerName: string) => `Configura la sincronización de ${providerName}.`, syncWithHR: (providerName: string) => `Sincronizar con ${providerName}`, - makeCardAdmin: () => ({one: 'Hacer administrador de tarjetas', other: 'Hacer administradores de tarjetas'}), + makeCardAdmin: () => ({ + one: 'Hacer administrador de tarjetas', + other: 'Hacer administradores de tarjetas', + }), cardAdmins: 'Administradores de tarjetas', peopleAdmins: 'Administradores de personas', paymentsAdmins: 'Administradores de pagos', @@ -7735,7 +7873,11 @@ El plan Controlar empieza en 9 $ por miembro activo al mes.`, dontSeeYourATS: `¿No ves tu ATS aquí? Pregunta a Concierge y podremos añadirlo.`, importSettings: 'Importar ajustes', defaultApprover: 'Aprobador predeterminado', - approverFields: {recruiter: 'Reclutador', recruitingCoordinator: 'Coordinador de selección', hiringManager: 'responsable de contratación'}, + approverFields: { + recruiter: 'Reclutador', + recruitingCoordinator: 'Coordinador de selección', + hiringManager: 'responsable de contratación', + }, filters: { description: (providerName: string) => `Selecciona qué miembros se importan desde ${providerName}. Puedes elegir entre etapas de trabajo, etiquetas y oficinas.`, stages: { @@ -7813,7 +7955,10 @@ El plan Controlar empieza en 9 $ por miembro activo al mes.`, approvalModeWarningConfirm: 'Cambiar modo de aprobación', syncingModalTitle: 'Tu conexión se está sincronizando', syncingModalDescription: 'La primera conexión puede tardar un poco. Se te notificará de cualquier error.', - syncLimitReached: {title: 'Inténtalo de nuevo mañana', prompt: 'Has alcanzado tu límite de sincronización de hoy.'}, + syncLimitReached: { + title: 'Inténtalo de nuevo mañana', + prompt: 'Has alcanzado tu límite de sincronización de hoy.', + }, syncResults: { title: (provider: string) => `Sincronización de ${provider} completada`, successTitle: (provider: string) => `¡Se ha sincronizado correctamente tu conexión con ${provider}!`, @@ -7913,7 +8058,10 @@ El plan Controlar empieza en 9 $ por miembro activo al mes.`, }, distance: 'Distancia', centrallyManage: 'Gestiona centralizadamente las tasas, elige si contabilizar en millas o kilómetros, y define una categoría por defecto', - emptyRates: {title: 'Aún no hay tasas de distancia', subtitle: 'Añade una tasa para reembolsar kilometraje con tasas personalizadas.'}, + emptyRates: { + title: 'Aún no hay tasas de distancia', + subtitle: 'Añade una tasa para reembolsar kilometraje con tasas personalizadas.', + }, rate: 'Tasa', addRate: 'Agregar tasa', findRate: 'Encontrar tasa', @@ -8890,7 +9038,12 @@ ${reportName}`, emptyAmountError: 'Introduce una cantidad válida antes de guardar', receiptAmountGreaterThanItemizedError: 'El importe para solicitar recibo no puede ser mayor que el importe para solicitar recibo desglosado.', }, - requireFields: {title: 'Exigir campos para todos los gastos', category: 'Categoría', tag: 'Etiqueta', save: 'Guardar regla'}, + requireFields: { + title: 'Exigir campos para todos los gastos', + category: 'Categoría', + tag: 'Etiqueta', + save: 'Guardar regla', + }, newRule: { title: 'Nueva regla', subtitle: '¿Qué quieres hacer?', @@ -8938,7 +9091,11 @@ ${reportName}`, merchantTypeIs: (merchantType: string) => `El tipo de comercio es "${merchantType}"`, categoryIs: (category: string) => `La categoría es «${category}»`, }, - merchantTypeRule: {merchantType: 'Tipo de comercio', saveRule: 'Guardar regla', confirmErrorCategory: 'Por favor, selecciona una categoría.'}, + merchantTypeRule: { + merchantType: 'Tipo de comercio', + saveRule: 'Guardar regla', + confirmErrorCategory: 'Por favor, selecciona una categoría.', + }, requireFieldsTable: { tableColumnType: 'Tipo', tableColumnCondition: 'Condición', @@ -9005,7 +9162,10 @@ ${reportName}`, subtitle: 'Crea una regla para automatizar las políticas de tu espacio de trabajo.', cta: 'Añadir regla de IA', }, - categoriesDisabledEmptyState: {title: 'Las categorías no están habilitadas', subtitle: 'Habilita las categorías para tener más control sobre tus gastos.'}, + categoriesDisabledEmptyState: { + title: 'Las categorías no están habilitadas', + subtitle: 'Habilita las categorías para tener más control sobre tus gastos.', + }, expenseDefaultType: { title: 'Aplicar valores predeterminados de gastos', subtitle: '¿Con qué debería coincidir esta regla?', @@ -9041,22 +9201,40 @@ ${reportName}`, enableNewAccountsDescription: 'Las nuevas cuentas de Campfire estarán disponibles como categorías.', dimensionsImport: 'Todas las dimensiones de Campfire se importan como etiquetas', exportDescription: 'Configura cómo se exportan los datos de Expensify a Campfire.', - exportReimbursable: {label: 'Exportar gastos reembolsables como', values: {VENDOR_BILL: {label: 'Facturas de proveedor'}}}, + exportReimbursable: { + label: 'Exportar gastos reembolsables como', + values: {VENDOR_BILL: {label: 'Facturas de proveedor'}}, + }, exportDate: { label: 'Fecha de factura del proveedor', description: 'Usa esta fecha al exportar informes a Campfire.', values: { - LAST_EXPENSE: {label: 'Fecha del último gasto', description: 'Fecha del gasto más reciente en el informe.'}, - REPORT_EXPORTED: {label: 'Fecha de exportación', description: 'Fecha en que el informe se exportó a Campfire.'}, - REPORT_SUBMITTED: {label: 'Fecha de envío', description: 'Fecha en que se envió el informe para aprobación.'}, + LAST_EXPENSE: { + label: 'Fecha del último gasto', + description: 'Fecha del gasto más reciente en el informe.', + }, + REPORT_EXPORTED: { + label: 'Fecha de exportación', + description: 'Fecha en que el informe se exportó a Campfire.', + }, + REPORT_SUBMITTED: { + label: 'Fecha de envío', + description: 'Fecha en que se envió el informe para aprobación.', + }, }, }, - exportNonReimbursable: {label: 'Exportar gastos de tarjetas de la empresa como', values: {JOURNAL_ENTRY: {label: 'Asientos contables'}}}, + exportNonReimbursable: { + label: 'Exportar gastos de tarjetas de la empresa como', + values: {JOURNAL_ENTRY: {label: 'Asientos contables'}}, + }, defaultCompanyCardVendor: { label: 'Proveedor predeterminado para todas las tarjetas de la empresa', description: 'Elige un proveedor de Campfire predeterminado para los gastos que no se asignen automáticamente.', }, - companyCardAccount: {label: 'Cuenta de tarjeta de empresa', description: 'Elige dónde exportar las transacciones de tarjetas de empresa.'}, + companyCardAccount: { + label: 'Cuenta de tarjeta de empresa', + description: 'Elige dónde exportar las transacciones de tarjetas de empresa.', + }, noAccountsFound: 'No se encontraron cuentas', noAccountsFoundDescription: 'Añade cuentas en Campfire y sincroniza la conexión de nuevo', autoSyncDescription: 'Sincroniza Campfire y Expensify automáticamente, todos los días. Los informes se sincronizan en tiempo real.', @@ -9074,15 +9252,23 @@ ${reportName}`, }, syncReimbursedReports: 'Sincronizar informes reembolsados', syncReimbursedReportsDescription: 'Cuando un informe se paga mediante ACH, se generará un pago de factura en esta cuenta.', - billPaymentAccount: {label: 'Cuenta de pago de facturas', description: 'Elige la cuenta de liquidación Campfire credits cuando Expensify marque una factura como pagada.'}, + billPaymentAccount: { + label: 'Cuenta de pago de facturas', + description: 'Elige la cuenta de liquidación Campfire credits cuando Expensify marque una factura como pagada.', + }, syncExpensifyCardSettlements: 'Sincronizar liquidaciones de la Tarjeta Expensify', - settlementAccount: {label: 'Cuenta de liquidación de la Tarjeta Expensify', description: 'Elige tu cuenta de liquidación y crearemos el pago en Campfire.'}, + settlementAccount: { + label: 'Cuenta de liquidación de la Tarjeta Expensify', + description: 'Elige tu cuenta de liquidación y crearemos el pago en Campfire.', + }, syncTravelInvoicingSettlements: 'Sincronizar liquidaciones de facturación de viajes consolidadas', travelInvoicingSettlementAccount: { label: 'Cuenta de liquidación de facturación de viajes consolidada', description: 'Elige tu cuenta de liquidación y crearemos el pago en Campfire.', }, - travelInvoicingPayableAccount: {label: 'Cuenta por pagar de facturación consolidada de viajes'}, + travelInvoicingPayableAccount: { + label: 'Cuenta por pagar de facturación consolidada de viajes', + }, exportToMultipleAccounts: 'Configura la exportación a varias cuentas', cardProgramAccount: { label: 'Cuenta del programa de tarjetas', @@ -9210,7 +9396,10 @@ ${reportName}`, exportToNextOpenPeriodDescription: 'Cuando la fecha de un informe cae en un período cerrado de Dynamics 365 Business Central, se exporta al siguiente período abierto.', syncReimbursedReports: 'Sincronizar informes reembolsados', syncReimbursedReportsDescription: 'Cuando un informe se pague mediante ACH, se generará un asiento de diario general en esta cuenta.', - reimbursementBankAccount: {label: 'Cuenta bancaria de pago', description: 'Elige desde dónde pagar las facturas y crearemos el pago en Dynamics 365 Business Central.'}, + reimbursementBankAccount: { + label: 'Cuenta bancaria de pago', + description: 'Elige desde dónde pagar las facturas y crearemos el pago en Dynamics 365 Business Central.', + }, syncExpensifyCardSettlements: 'Sincronizar liquidaciones de la Tarjeta Expensify', settlementsBankAccount: { label: 'Cuenta de liquidación de la Tarjeta Expensify', @@ -9448,6 +9637,8 @@ ${reportName}`, `${enabled ? 'habilitó' : 'deshabilitó'} que los titulares de tarjetas eliminen transacciones de la fuente de tarjetas "${feedName}"`, updatedCardFeedStatementPeriod: (feedName: string, newValue?: string, previousValue?: string) => `cambió el día de cierre del período de estado de cuenta de la fuente de tarjetas "${feedName}"${newValue ? ` a "${newValue}"` : ''}${previousValue ? ` (previamente "${previousValue}")` : ''}`, + updatedCardFeedReimbursable: (feedName: string, newValue?: string, previousValue?: string) => + `cambió la configuración de reembolsable del feed de tarjetas "${feedName}"${newValue ? ` a "${newValue}"` : ''}${previousValue ? ` (antes "${previousValue}")` : ''}`, agentRule: { added: ({title, prompt}: {title: string; prompt: string}) => (title ? `añadió la regla de agente «${title}»: ${prompt}` : `añadió una regla de agente: ${prompt}`), updated: ({title, prompt}: {title: string; prompt: string}) => (title ? `actualizó la regla de agente «${title}» a: ${prompt}` : `actualizó una regla de agente a: ${prompt}`), @@ -9481,7 +9672,13 @@ ${reportName}`, one: 'aplicó la regla de gasto a 1 tarjeta adicional', other: `aplicó la regla de gasto a ${count} tarjetas adicionales`, }), - phraseVerb: {added: 'añadido', removed: 'eliminado', changed: 'cambió', set: 'establecer', applied: 'aplicado'}, + phraseVerb: { + added: 'añadido', + removed: 'eliminado', + changed: 'cambió', + set: 'establecer', + applied: 'aplicado', + }, bodyMerchant: ({adjective, value}: {adjective: string; value: string}) => (adjective !== '' ? `${adjective} comercio «${value}»` : `comercio «${value}»`), bodyMerchantValueOnly: ({value}: {value: string}) => `«${value}»`, bodyMerchantChange: ({adjective, oldValue, newValue}: {adjective: string; oldValue: string; newValue: string}) => @@ -9674,7 +9871,11 @@ ${reportName}`, commuterExclusions: { changedToFixedDistance: ({previousMethod}: {previousMethod: string}) => `cambió “excluir desplazamientos” a una distancia fija por solicitud (previamente ${previousMethod})`, changedToHomeAndOffice: ({previousMethod}: {previousMethod: string}) => `cambió la exclusión de desplazamientos para calcular por casa y oficina (previamente ${previousMethod})`, - previousMethod: {disabled: 'no excluyas los desplazamientos al trabajo', fixedDistance: 'distancia fija por reclamación', homeAndOffice: 'casa y oficina'}, + previousMethod: { + disabled: 'no excluyas los desplazamientos al trabajo', + fixedDistance: 'distancia fija por reclamación', + homeAndOffice: 'casa y oficina', + }, setFixedDistance: ({formattedDistance}: {formattedDistance: string}) => `establecer exclusión de distancia fija en ${formattedDistance} por reclamación`, changedFixedDistance: ({formattedOldDistance, formattedNewDistance}: {formattedOldDistance: string; formattedNewDistance: string}) => `cambió la exclusión de distancia fija a ${formattedNewDistance} por reclamación (previamente ${formattedOldDistance})`, @@ -10071,7 +10272,11 @@ ${reportName}`, subtitleCannotSend: 'Necesitas un espacio de trabajo con Invoices habilitado para enviar facturas.', subtitleCannotSendWithTestDrive: 'Necesitas un espacio de trabajo con Invoices habilitado para enviar facturas. Haz una prueba por Expensify para aprender más.', }, - emptyTripResults: {title: 'Aún no hay viajes', subtitle: 'Reserva tu primer viaje a continuación.', buttonText: 'Reserva un viaje'}, + emptyTripResults: { + title: 'Aún no hay viajes', + subtitle: 'Reserva tu primer viaje a continuación.', + buttonText: 'Reserva un viaje', + }, emptySubmitResults: { title: 'No hay gastos para enviar', subtitle: 'Todo despejado. ¡Date una vuelta de victoria!', @@ -10100,7 +10305,11 @@ ${reportName}`, title: 'No hay gastos para aprobar', subtitle: 'Cero gastos. Máxima relajación. ¡Bien hecho!', }, - staleResults: {title: 'Es necesario actualizar', subtitle: 'Esta página está desactualizada, actualiza para ver lo más reciente', buttonText: 'Actualizar'}, + staleResults: { + title: 'Es necesario actualizar', + subtitle: 'Esta página está desactualizada, actualiza para ver lo más reciente', + buttonText: 'Actualizar', + }, }, columns: 'Columnas', editColumns: 'Editar columnas', @@ -10115,7 +10324,13 @@ ${reportName}`, limitResults: 'Limitar resultados', }, has: 'Tiene', - view: {label: 'Ver', table: 'Tabla', bar: 'Barra', line: 'Línea', pie: 'Circular'}, + view: { + label: 'Ver', + table: 'Tabla', + bar: 'Barra', + line: 'Línea', + pie: 'Circular', + }, saveView: 'Guardar vista', savedSearchesMenuItemTitle: 'Guardadas', mySavedSearch: 'Mis gastos', @@ -10195,8 +10410,15 @@ ${reportName}`, cardFeedName: ({cardFeedBankName, cardFeedLabel}) => `Todo ${cardFeedBankName}${cardFeedLabel ? ` - ${cardFeedLabel}` : ''}`, cardFeedNameCSV: ({cardFeedLabel}) => `Todas las Tarjetas Importadas desde CSV${cardFeedLabel ? ` - ${cardFeedLabel}` : ''}`, }, - bankAccount: {banks: 'Cuentas bancarias', closedBankAccounts: 'Cuentas bancarias cerradas'}, - workspace: {active: 'Activo', archived: 'Archivado', selectAll: 'Seleccionar todo'}, + bankAccount: { + banks: 'Cuentas bancarias', + closedBankAccounts: 'Cuentas bancarias cerradas', + }, + workspace: { + active: 'Activo', + archived: 'Archivado', + selectAll: 'Seleccionar todo', + }, amount: { lessThan: (amount) => `Menos de ${amount ?? ''}`, greaterThan: (amount) => `Más que ${amount ?? ''}`, @@ -10249,7 +10471,10 @@ ${reportName}`, [CONST.SEARCH.WITHDRAWAL_TYPE.TRAVEL_BILLING]: 'Facturación consolidada de viajes', }, is: 'Es', - has: {submittedViolation: 'Infracción enviada', approvedViolation: 'Infracción aprobada'}, + has: { + submittedViolation: 'Infracción enviada', + approvedViolation: 'Infracción aprobada', + }, action: { [CONST.SEARCH.ACTION_FILTERS.SUBMIT]: 'Enviar', [CONST.SEARCH.ACTION_FILTERS.APPROVE]: 'Aprobar', @@ -10257,7 +10482,11 @@ ${reportName}`, [CONST.SEARCH.ACTION_FILTERS.EXPORT]: 'Exportar', }, reportField: (name, value) => `${name} es ${value}`, - filterType: {label: 'Tipo de filtro', has: {positive: 'tiene', negative: 'no tiene'}, is: {positive: 'es', negative: 'no es'}}, + filterType: { + label: 'Tipo de filtro', + has: {positive: 'tiene', negative: 'no tiene'}, + is: {positive: 'es', negative: 'no es'}, + }, merchant: { matchType: 'Tipo de coincidencia', contains: (merchant) => (merchant ? `Contiene "${merchant}"` : 'Contiene'), @@ -10285,7 +10514,10 @@ ${reportName}`, [CONST.SEARCH.GROUP_BY.YEAR]: 'Años', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Trimestres', }, - moneyRequestReport: {emptyStateTitle: 'Aún no hay gastos', accessPlaceHolder: 'Abrir para ver detalles'}, + moneyRequestReport: { + emptyStateTitle: 'Aún no hay gastos', + accessPlaceHolder: 'Abrir para ver detalles', + }, noCategory: 'Sin categoría', noMerchant: 'Sin comerciante', noTag: 'Sin etiqueta', @@ -10332,7 +10564,10 @@ ${reportName}`, mergeReports: { title: 'Combinar informes', description: 'Selecciona el informe que quieres conservar. Todos los gastos se moverán a él y los demás informes se eliminarán.', - listPage: {noEligibleReportsFound: 'No se encontraron informes aptos', noEligibleReportsFoundSubtitle: 'No tienes ningún informe que se pueda combinar.'}, + listPage: { + noEligibleReportsFound: 'No se encontraron informes aptos', + noEligibleReportsFoundSubtitle: 'No tienes ningún informe que se pueda combinar.', + }, }, periodSoFar: ({period}: {period: string}) => `${period} hasta ahora`, weekOf: ({date}: {date: string}) => `Semana del ${date}`, @@ -10369,11 +10604,21 @@ ${reportName}`, }, }, settlement: { - status: {pending: 'Pendiente', cleared: 'Liquidado', failed: 'Fallido', never: 'Nunca', cashBack: 'Devolución de dinero'}, + status: { + pending: 'Pendiente', + cleared: 'Liquidado', + failed: 'Fallido', + never: 'Nunca', + cashBack: 'Devolución de dinero', + }, failedError: ({link}: {link: string}) => `Reintentaremos esta liquidación cuando desbloquees tu cuenta.`, withdrawalInfo: ({date, withdrawalID}: {date: string; withdrawalID: number}) => `${date} • ID de retiro: ${withdrawalID}`, }, - paidStatus: {markedAsPaid: 'Marcado como pagado', withdrawing: 'Retirando', confirmed: 'Confirmado'}, + paidStatus: { + markedAsPaid: 'Marcado como pagado', + withdrawing: 'Retirando', + confirmed: 'Confirmado', + }, reportLayout: { reportLayout: 'Diseño del informe', groupByLabel: 'Agrupar por:', @@ -11415,7 +11660,11 @@ ${reportName}`, markAsCashToIgnore: 'Márcalo como efectivo para ignorar y solicitar el pago.', smartscanFailed: ({canEdit = true, missingFields = []}: {canEdit?: boolean; missingFields?: string[]}) => { if (missingFields.length > 0) { - const fieldNames: Record = {merchant: 'comerciante', date: 'fecha', amount: 'importe'}; + const fieldNames: Record = { + merchant: 'comerciante', + date: 'fecha', + amount: 'importe', + }; const translated = missingFields.map((f) => fieldNames[f] ?? f); const fieldList = translated.join(translated.length > 2 ? ', ' : ' y '); const verb = translated.length === 1 ? 'falta' : 'faltan'; @@ -11689,8 +11938,14 @@ ${reportName}`, onboardingChatTitle: (discountType) => `Oferta por tiempo limitado: ¡${discountType}% de descuento en tu primer año!`, subtitle: (days, hours, minutes, seconds) => `Solicítala en ${days > 0 ? `${days}d : ` : ''}${hours}h : ${minutes}m : ${seconds}s`, }, - travelInvoiceOverdue: {title: 'Tu factura de viaje está vencida', subtitle: (date: string) => `Paga tu factura de viaje antes del ${date} para seguir reservando viajes.`}, - travelInvoiceOverdueLocked: {title: 'La reserva de viajes está en pausa', subtitle: 'Tu factura de viaje está vencida. Págala para volver a reservar viajes.'}, + travelInvoiceOverdue: { + title: 'Tu factura de viaje está vencida', + subtitle: (date: string) => `Paga tu factura de viaje antes del ${date} para seguir reservando viajes.`, + }, + travelInvoiceOverdueLocked: { + title: 'La reserva de viajes está en pausa', + subtitle: 'Tu factura de viaje está vencida. Págala para volver a reservar viajes.', + }, }, cardSection: { title: 'Pago', @@ -11819,7 +12074,14 @@ ${reportName}`, one: '1 usuario activo', other: `${count} usuarios activos`, }), - state: {paid: 'Pagado', cleared: 'Borrado', failed: 'Error', refunded: 'Reembolsado', disputed: 'En disputa', balanceTransfer: 'Transferencia de saldo'}, + state: { + paid: 'Pagado', + cleared: 'Borrado', + failed: 'Error', + refunded: 'Reembolsado', + disputed: 'En disputa', + balanceTransfer: 'Transferencia de saldo', + }, details: 'Detalles del pago', badge: { balanceTransferTo: ({email}: {email: string}) => `Transferencia de saldo a ${email}`, @@ -12508,6 +12770,10 @@ ${reportName}`, mobileRenewPrompt: 'Visita Expensify en tu navegador web para renovar antes.', mobileClaimPrompt: 'Visita Expensify en tu navegador web para obtener tu descuento de renovación.', }, - bulkActionBar: {label: 'Acciones en bloque', clearSelection: 'Borrar selección', loadingSelection: 'Cargando selección'}, + bulkActionBar: { + label: 'Acciones en bloque', + clearSelection: 'Borrar selección', + loadingSelection: 'Cargando selección', + }, }; export default translations; diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 6b4e962aacc0..09b2ef8e306e 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -509,7 +509,10 @@ const translations: TranslationDeepObject = { quarter: 'Trimestre', vacationDelegate: 'Délégué de vacances', expensifyLogo: 'Logo Expensify', - concierge: {greeting: 'Bonjour, comment puis-je vous aider ?', showHistory: 'Afficher l’historique'}, + concierge: { + greeting: 'Bonjour, comment puis-je vous aider ?', + showHistory: 'Afficher l’historique', + }, duplicateReport: 'Note de frais en double', approver: 'Approbateur', goToConcierge: 'Aller à Concierge', @@ -548,8 +551,16 @@ const translations: TranslationDeepObject = { hasAnAnswer: 'Concierge a une réponse !', collapseReasoning: 'Réduire le raisonnement', expandReasoning: 'Développer le raisonnement', - enableNotifications: {prompt: 'Vous souhaitez être averti lorsque Concierge répond ?', cta: 'Notifier'}, - feedback: {prompt: 'Cette réponse était-elle utile ?', useful: 'Réponse utile', notUseful: 'Réponse inutile', thanks: 'Merci pour votre retour !'}, + enableNotifications: { + prompt: 'Vous souhaitez être averti lorsque Concierge répond ?', + cta: 'Notifier', + }, + feedback: { + prompt: 'Cette réponse était-elle utile ?', + useful: 'Réponse utile', + notUseful: 'Réponse inutile', + thanks: 'Merci pour votre retour !', + }, }, supportalNoAccess: { title: 'Pas si vite', @@ -691,7 +702,10 @@ const translations: TranslationDeepObject = { statusNeverRegistered: 'Jamais enregistré', statusNotRegistered: 'Non enregistré', statusRegisteredThisDevice: 'Enregistré', - statusRegisteredOtherDevice: () => ({one: 'Un autre appareil enregistré', other: 'Autres appareils enregistrés'}), + statusRegisteredOtherDevice: () => ({ + one: 'Un autre appareil enregistré', + other: 'Autres appareils enregistrés', + }), }, pleaseEnableInSystemSettings: { start: 'Veuillez activer la vérification par reconnaissance faciale/empreinte digitale ou définir un code d’accès à l’appareil dans vos', @@ -704,7 +718,10 @@ const translations: TranslationDeepObject = { letsVerifyItsYou: 'Vérifions qu’il s’agit bien de vous', nowLetsAuthenticateYou: 'Maintenant, procédons à votre authentification…', letsAuthenticateYou: 'Authentifions votre identité…', - verifyYourself: {biometrics: 'Vérifiez votre identité avec votre visage ou votre empreinte digitale', passkeys: 'Vérifiez votre identité avec une clé d’accès'}, + verifyYourself: { + biometrics: 'Vérifiez votre identité avec votre visage ou votre empreinte digitale', + passkeys: 'Vérifiez votre identité avec une clé d’accès', + }, enableQuickVerification: { biometrics: 'Activez une vérification rapide et sécurisée à l’aide de votre visage ou de votre empreinte digitale. Aucun mot de passe ni code requis.', passkeys: 'Activez une vérification rapide et sécurisée à l’aide d’une clé d’accès. Aucun mot de passe ni code requis.', @@ -740,10 +757,18 @@ const translations: TranslationDeepObject = { pleaseUseWebApp: `Cette action n'est pas prise en charge sur votre appareil. Veuillez utiliser l'application web Expensify et réessayer.`, }, verificationFailed: 'Échec de la vérification', - setPin: {didNotShipCard: 'Nous n’avons pas envoyé votre carte. Veuillez réessayer.'}, - revealPin: {couldNotReveal: "Nous n'avons pas pu afficher votre code PIN. Veuillez réessayer."}, - changePin: {didNotChange: "Nous n'avons pas modifié votre code PIN. Veuillez réessayer."}, - revealCardDetail: {couldNotReveal: 'Nous n’avons pas pu afficher les détails de votre carte. Veuillez réessayer.'}, + setPin: { + didNotShipCard: 'Nous n’avons pas envoyé votre carte. Veuillez réessayer.', + }, + revealPin: { + couldNotReveal: "Nous n'avons pas pu afficher votre code PIN. Veuillez réessayer.", + }, + changePin: { + didNotChange: "Nous n'avons pas modifié votre code PIN. Veuillez réessayer.", + }, + revealCardDetail: { + couldNotReveal: 'Nous n’avons pas pu afficher les détails de votre carte. Veuillez réessayer.', + }, }, validateCodeModal: { successfulSignInTitle: Str.dedent(` @@ -984,11 +1009,27 @@ const translations: TranslationDeepObject = { toDos: 'Tâches', timeSensitiveSection: { title: 'Urgent', - addShippingAddress: {title: 'Nous avons besoin de votre adresse de livraison', subtitle: 'Indiquez une adresse pour recevoir votre Carte Expensify.', cta: 'Ajouter'}, - addPaymentCard: {title: 'Ajoutez une carte de paiement pour continuer à utiliser Expensify', subtitle: 'Compte > Abonnement', cta: 'Ajouter'}, - addBankAccount: {title: 'Ajoutez un compte bancaire pour être remboursé'}, - addDepositAccount: {title: 'Ajoutez un compte bancaire pour recevoir des paiements'}, - activateCard: {title: 'Activer votre Carte Expensify', subtitle: 'Validez votre carte et commencez à dépenser.', cta: 'Activer'}, + addShippingAddress: { + title: 'Nous avons besoin de votre adresse de livraison', + subtitle: 'Indiquez une adresse pour recevoir votre Carte Expensify.', + cta: 'Ajouter', + }, + addPaymentCard: { + title: 'Ajoutez une carte de paiement pour continuer à utiliser Expensify', + subtitle: 'Compte > Abonnement', + cta: 'Ajouter', + }, + addBankAccount: { + title: 'Ajoutez un compte bancaire pour être remboursé', + }, + addDepositAccount: { + title: 'Ajoutez un compte bancaire pour recevoir des paiements', + }, + activateCard: { + title: 'Activer votre Carte Expensify', + subtitle: 'Validez votre carte et commencez à dépenser.', + cta: 'Activer', + }, confirmDigitalWalletAddition: { subtitle: 'Carte Expensify', }, @@ -1013,16 +1054,30 @@ const translations: TranslationDeepObject = { title: ({cardName}: {cardName?: string}) => (cardName ? `Réparer la connexion de la carte personnelle ${cardName}` : 'Corriger la connexion de la carte personnelle'), subtitle: 'Portefeuille', }, - addHomeAddress: {title: 'Ajoutez votre adresse personnelle pour le suivi des distances', subtitle: 'Compte', cta: 'Ajouter'}, - fixFailedBilling: {title: 'Nous n’avons pas pu débiter votre carte enregistrée', subtitle: 'Abonnement'}, + addHomeAddress: { + title: 'Ajoutez votre adresse personnelle pour le suivi des distances', + subtitle: 'Compte', + cta: 'Ajouter', + }, + fixFailedBilling: { + title: 'Nous n’avons pas pu débiter votre carte enregistrée', + subtitle: 'Abonnement', + }, unlockBankAccount: { workspaceTitle: 'Votre compte bancaire professionnel a été verrouillé', personalTitle: 'Votre compte bancaire a été verrouillé', workspaceSubtitle: ({policyName}: {policyName: string}) => policyName, personalSubtitle: 'Portefeuille', }, - addVirtualCardPersonalDetails: {title: 'Ajoutez vos informations pour voir et commencer à utiliser votre Carte Expensify.', subtitle: 'Carte Expensify', cta: 'Ajouter'}, - enterSignerInfo: {title: 'Informations du signataire requises', subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Compte bancaire ${bankAccountLastFour}`}, + addVirtualCardPersonalDetails: { + title: 'Ajoutez vos informations pour voir et commencer à utiliser votre Carte Expensify.', + subtitle: 'Carte Expensify', + cta: 'Ajouter', + }, + enterSignerInfo: { + title: 'Informations du signataire requises', + subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Compte bancaire ${bankAccountLastFour}`, + }, payOverdueInvoice: { cta: 'Examiner', dueSoonTitle: ({date}: {date: string}) => `Payez votre facture avant le ${date} pour éviter une interruption de service`, @@ -1033,8 +1088,13 @@ const translations: TranslationDeepObject = { subtitle: ({date}: {date: string}) => `L’abonnement prend fin le ${date}`, cta: 'Gérer', }, - emailDeliveryFailure: {title: 'Nous ne pouvons pas vous envoyer de notifications par e-mail', subtitle: 'Compte'}, - upgradeNetSuiteConnection: {title: 'Mettre à niveau votre connexion NetSuite'}, + emailDeliveryFailure: { + title: 'Nous ne pouvons pas vous envoyer de notifications par e-mail', + subtitle: 'Compte', + }, + upgradeNetSuiteConnection: { + title: 'Mettre à niveau votre connexion NetSuite', + }, }, forYouSection: { submit: ({count}: {count: number}) => ({ @@ -1102,7 +1162,10 @@ const translations: TranslationDeepObject = { hotelIn: ({destination}: {destination: string}) => `Hôtel à ${destination}`, carRentalIn: ({destination}: {destination: string}) => `Location de voiture à ${destination}`, inOneWeek: 'Dans 1 semaine', - inDays: () => ({one: 'Dans 1 jour', other: (count: number) => `Dans ${count} jours`}), + inDays: () => ({ + one: 'Dans 1 jour', + other: (count: number) => `Dans ${count} jours`, + }), today: 'Aujourd’hui', }, freeTrialSection: { @@ -1169,7 +1232,10 @@ const translations: TranslationDeepObject = { emptyStateTitle: 'Aucune dépense récente', emptyStateMessage: 'Créez-en un ou faites glisser un reçu ici', }, - insightsSection: {chartUnavailable: 'Graphique indisponible', notEnoughData: 'Nous n’avons pas encore suffisamment de données pour remplir ce graphique'}, + insightsSection: { + chartUnavailable: 'Graphique indisponible', + notEnoughData: 'Nous n’avons pas encore suffisamment de données pour remplir ce graphique', + }, conciergePrompt: { goodMorning: ({name}: {name?: string}) => (name ? `Bonjour, ${name}.` : 'Bonjour.'), goodAfternoon: ({name}: {name?: string}) => (name ? `Bonjour, ${name}.` : 'Bon après-midi.'), @@ -1180,7 +1246,10 @@ const translations: TranslationDeepObject = { }, insightsPage: { viewOnSpend: 'Voir dans Dépenses', - emptyState: {title: 'Rien à afficher', subtitle: 'Essayez de modifier vos critères ci-dessus'}, + emptyState: { + title: 'Rien à afficher', + subtitle: 'Essayez de modifier vos critères ci-dessus', + }, noExpensesState: { title: 'Voyez où va votre argent', subtitle: 'Une fois que vous aurez des dépenses, vous verrez des tendances de dépenses, les principaux marchands et plus encore.', @@ -2287,7 +2356,11 @@ const translations: TranslationDeepObject = { saved: 'Enregistré', }, }, - securityPage: {title: 'Sécurité', subtitle: 'Protégez votre compte.', goToSecurity: 'Revenir à la page de sécurité'}, + securityPage: { + title: 'Sécurité', + subtitle: 'Protégez votre compte.', + goToSecurity: 'Revenir à la page de sécurité', + }, shareCodePage: { title: 'Votre code', subtitle: 'Invitez des membres sur Expensify en partageant votre code QR personnel ou votre lien de parrainage.', @@ -2401,9 +2474,18 @@ const translations: TranslationDeepObject = { testingPreferences: 'Préférences de test', server: 'Serveur', servers: { - production: {label: 'Production', description: "L'environnement en direct que voient les vrais utilisateurs"}, - staging: {label: 'Préproduction', description: 'Copie de la production. Utilisée pour la validation finale'}, - qa: {label: 'QA', description: 'Environnement expérimental utilisé pour les tests'}, + production: { + label: 'Production', + description: "L'environnement en direct que voient les vrais utilisateurs", + }, + staging: { + label: 'Préproduction', + description: 'Copie de la production. Utilisée pour la validation finale', + }, + qa: { + label: 'QA', + description: 'Environnement expérimental utilisé pour les tests', + }, }, serverPinnedDescription: 'Cette version communique toujours avec un seul serveur, il est donc impossible de le changer ici.', forceOffline: 'Forcer le mode hors ligne', @@ -2866,7 +2948,10 @@ const translations: TranslationDeepObject = { getStarted: 'Commencer', headerTitle: 'Remboursements globaux', }, - wiseGlobalReimbursementsBanner: {title: 'Payer des personnes dans le monde entier', subtitle: 'Activez les remboursements globaux sur votre compte en USD.'}, + wiseGlobalReimbursementsBanner: { + title: 'Payer des personnes dans le monde entier', + subtitle: 'Activez les remboursements globaux sur votre compte en USD.', + }, }, addCardToDigitalWallet: { title: ({walletName}: {walletName: string}) => `Ajouter la carte à ${walletName}`, @@ -3277,11 +3362,19 @@ ${amount} pour ${merchant} - ${date}`, }, editAgentAvatarPage: {title: 'Modifier l’avatar'}, editAgentNamePage: {title: 'Nom de l’agent'}, - editAgentPromptPage: {title: 'Écrire des instructions personnalisées', error: {emptyPrompt: 'Veuillez saisir des instructions pour votre agent.'}}, + editAgentPromptPage: { + title: 'Écrire des instructions personnalisées', + error: { + emptyPrompt: 'Veuillez saisir des instructions pour votre agent.', + }, + }, expenseRulesPage: { title: 'Règles de dépenses', findRule: 'Rechercher une règle', - emptyRules: {title: 'Aucune règle pour le moment', subtitle: 'Ajoutez une règle pour automatiser la création de notes de frais.'}, + emptyRules: { + title: 'Aucune règle pour le moment', + subtitle: 'Ajoutez une règle pour automatiser la création de notes de frais.', + }, changes: { billableUpdate: (value: boolean) => `Mettre à jour la dépense ${value ? 'facturable' : 'non refacturable'}`, categoryUpdate: (value: string) => `Mettre à jour la catégorie sur « ${value} »`, @@ -4791,7 +4884,9 @@ ${amount} pour ${merchant} - ${date}`, subtitle: 'Choisissez un domaine pour la configuration d’Expensify Travel.', recommended: 'Recommandé', }, - workspaceAddress: {headline: 'Quelle est l’adresse de votre entreprise ?'}, + workspaceAddress: { + headline: 'Quelle est l’adresse de votre entreprise ?', + }, domainPermissionInfo: { title: 'Domaine', restriction: (domain: string) => @@ -4850,7 +4945,9 @@ ${amount} pour ${merchant} - ${date}`, title: 'Identifiant fiscal', subtitle: 'Saisissez l’identifiant fiscal de votre entité légale afin que nous puissions configurer la facturation des déplacements dans votre devise locale.', inputLabel: 'Identifiant fiscal de l’entité juridique', - error: {required: 'Veuillez saisir l’identifiant fiscal de votre entité légale.'}, + error: { + required: 'Veuillez saisir l’identifiant fiscal de votre entité légale.', + }, }, nudge: { airfareManual: @@ -5643,10 +5740,16 @@ ${amount} pour ${merchant} - ${date}`, label: 'Exporter les dépenses remboursables en tant que', helperText: 'Les dépenses marquées comme remboursables seront exportées en tant que factures à payer établies au nom de l’employé.', }, - exportNonReimbursable: {label: 'Exporter les dépenses non remboursables en tant que'}, + exportNonReimbursable: { + label: 'Exporter les dépenses non remboursables en tant que', + }, expenseReports: 'Notes de frais', - exportReimbursableExpenseReports: {helperText: 'Les dépenses marquées comme remboursables seront exportées en tant que notes de frais établies au nom de l’employé.'}, - exportNonReimbursableExpenseReports: {helperText: 'Les dépenses marquées comme non remboursables seront exportées en tant que notes de frais établies au nom de l’employé.'}, + exportReimbursableExpenseReports: { + helperText: 'Les dépenses marquées comme remboursables seront exportées en tant que notes de frais établies au nom de l’employé.', + }, + exportNonReimbursableExpenseReports: { + helperText: 'Les dépenses marquées comme non remboursables seront exportées en tant que notes de frais établies au nom de l’employé.', + }, noVendorsFound: 'Aucun fournisseur trouvé', noVendorsFoundDescription: 'Veuillez synchroniser à nouveau la connexion après l’ajout des fournisseurs dans Certinia.', noCompaniesFound: 'Aucune entreprise trouvée', @@ -5676,7 +5779,12 @@ ${amount} pour ${merchant} - ${date}`, chartOfAccounts: 'Plan comptable', chartOfAccountsDescription: 'Le plan comptable est importé dans Expensify en tant que catégories.', dimensionMapping: ({n}: {n: number}) => `Dimension ${n}`, - dimensions: {dimension1: 'Dimension 1', dimension2: 'Dimension 2', dimension3: 'Dimension 3', dimension4: 'Dimension 4'}, + dimensions: { + dimension1: 'Dimension 1', + dimension2: 'Dimension 2', + dimension3: 'Dimension 3', + dimension4: 'Dimension 4', + }, doNotMap: 'Ne pas mapper', doNotMapSubtitle: 'Utiliser la ressource employé par défaut', mappingTypes: { @@ -6140,7 +6248,14 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST. noAccountsFound: 'Aucun compte trouvé', noAccountsFoundDescription: 'Veuillez ajouter des comptes dans Rillet et synchroniser à nouveau la connexion', exportDescription: 'Configurez comment les données Expensify sont exportées vers Rillet.', - exportReimbursable: {label: 'Exporter les dépenses remboursables en tant que', values: {[CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: {label: 'Factures fournisseurs'}}}, + exportReimbursable: { + label: 'Exporter les dépenses remboursables en tant que', + values: { + [CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: { + label: 'Factures fournisseurs', + }, + }, + }, exportDate: { label: 'Date de la facture fournisseur', description: 'Utiliser cette date lors de l’exportation des notes de frais vers Rillet.', @@ -6161,13 +6276,20 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST. }, exportNonReimbursable: { label: 'Exporter les dépenses de carte d’entreprise en tant que', - values: {[CONST.RILLET_EXPORT_NON_REIMBURSABLE.CREDIT_CARD_CHARGE]: {label: 'Cartes de crédit'}}, + values: { + [CONST.RILLET_EXPORT_NON_REIMBURSABLE.CREDIT_CARD_CHARGE]: { + label: 'Cartes de crédit', + }, + }, }, defaultCompanyCardVendor: { label: 'Fournisseur de carte entreprise par défaut', description: 'Choisissez un fournisseur Rillet par défaut pour les dépenses qui ne correspondent pas automatiquement.', }, - companyCardAccount: {label: 'Compte de carte d’entreprise', description: 'Choisissez où exporter les transactions de carte d’entreprise.'}, + companyCardAccount: { + label: 'Compte de carte d’entreprise', + description: 'Choisissez où exporter les transactions de carte d’entreprise.', + }, noBankAccountsFound: 'Aucun compte bancaire trouvé', noBankAccountsFoundDescription: 'Veuillez ajouter des comptes bancaires dans Rillet et synchroniser à nouveau la connexion', autoSyncDescription: 'Synchronisez Rillet et Expensify automatiquement, chaque jour. Les notes de frais se synchronisent en temps réel.', @@ -6185,9 +6307,15 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST. }, syncReimbursedReports: 'Synchroniser les notes de frais remboursées', syncReimbursedReportsDescription: 'Lorsqu’une note de frais est payée par virement ACH, un règlement de facture est généré sur ce compte.', - billPaymentAccount: {label: 'Compte de paiement des factures', description: 'Choisissez d’où payer les factures et nous créerons le paiement dans Rillet.'}, + billPaymentAccount: { + label: 'Compte de paiement des factures', + description: 'Choisissez d’où payer les factures et nous créerons le paiement dans Rillet.', + }, syncExpensifyCardSettlements: 'Synchroniser les règlements de Carte Expensify', - settlementAccount: {label: 'Compte de règlement de la Carte Expensify', description: 'Choisissez votre compte de règlement et nous créerons le paiement dans Rillet.'}, + settlementAccount: { + label: 'Compte de règlement de la Carte Expensify', + description: 'Choisissez votre compte de règlement et nous créerons le paiement dans Rillet.', + }, syncTravelInvoicingSettlements: 'Synchroniser les règlements de facturation de voyage consolidée', travelInvoicingSettlementAccount: { label: 'Compte de règlement de facturation de voyage consolidée', @@ -6333,20 +6461,28 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST. }, syncReimbursedReports: 'Synchroniser les notes de frais remboursées', syncReimbursedReportsDescription: 'Lorsqu’une note de frais est payée par ACH, un paiement de facture sera généré dans ce compte.', - billPaymentAccount: {label: 'Compte de paiement des factures', description: 'Choisissez d’où payer les factures et nous créerons le paiement dans DualEntry.'}, + billPaymentAccount: { + label: 'Compte de paiement des factures', + description: 'Choisissez d’où payer les factures et nous créerons le paiement dans DualEntry.', + }, fxExpenseAccount: { label: 'Compte de frais de conversion de devise DualEntry', description: 'Lorsque votre entreprise prend en charge les frais de conversion de devise sur un paiement effectué à l’étranger, nous comptabiliserons ces frais sur ce compte dans DualEntry sous forme d’écriture de journal.', }, syncExpensifyCardSettlements: 'Synchroniser les règlements de Carte Expensify', - settlementAccount: {label: 'Compte de règlement de la Carte Expensify', description: 'Choisissez votre compte de règlement et nous créerons le paiement dans DualEntry.'}, + settlementAccount: { + label: 'Compte de règlement de la Carte Expensify', + description: 'Choisissez votre compte de règlement et nous créerons le paiement dans DualEntry.', + }, syncTravelInvoicingSettlements: 'Synchroniser les règlements de facturation de voyage consolidés', travelInvoicingSettlementAccount: { label: 'Compte de règlement de facturation de voyage consolidée', description: 'Choisissez votre compte de règlement et nous créerons le paiement dans DualEntry.', }, - travelInvoicingPayableAccount: {label: 'Compte fournisseur de facturation de voyage consolidée'}, + travelInvoicingPayableAccount: { + label: 'Compte fournisseur de facturation de voyage consolidée', + }, }, type: { free: 'Gratuit', @@ -6493,13 +6629,28 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST. cardIdentityColumn: 'Veuillez associer un numéro de carte ou un nom de carte afin que les transactions puissent être rapprochées d’une carte.', }, fileImportDescription: 'Une option manuelle si votre banque ne peut pas envoyer de flux.', - duplicateFeedModal: {title: 'Flux de carte déjà connecté', prompt: 'Vous ne pouvez pas ajouter deux fois le même flux de carte au même espace de travail.'}, + duplicateFeedModal: { + title: 'Flux de carte déjà connecté', + prompt: 'Vous ne pouvez pas ajouter deux fois le même flux de carte au même espace de travail.', + }, }, statementCloseDate: { [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Dernier jour du mois', [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Dernier jour ouvrable du mois', [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Jour du mois personnalisé', }, + reimbursable: { + title: 'Remboursable', + description: 'Choisissez comment les transactions par carte doivent être créées. Les nouvelles transactions suivront ces règles.', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES]: 'Toujours remboursable', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES}Description`]: 'Toujours remboursé aux employés', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO]: 'Toujours non remboursable', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO}Description`]: 'Jamais remboursé aux employés', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES]: 'Remboursable', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES}Description`]: 'Le plus souvent remboursé aux employés', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO]: 'Non remboursable', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO}Description`]: 'Parfois remboursé aux employés', + }, assign: 'Assigner', assignCard: 'Assigner une carte', findCompanyCard: 'Trouver une carte d’entreprise', @@ -6548,7 +6699,10 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST. importButton: 'Importer des transactions', }, deletedCard: 'Carte supprimée', - assignNewCards: {title: 'Assigner de nouvelles cartes', description: 'Obtenez les dernières cartes à assigner depuis votre banque'}, + assignNewCards: { + title: 'Assigner de nouvelles cartes', + description: 'Obtenez les dernières cartes à assigner depuis votre banque', + }, }, expensifyCard: { issueAndManageCards: 'Émettre et gérer vos Cartes Expensify', @@ -6988,7 +7142,9 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST. subtitle: 'Définissez un taux horaire facturable pour le suivi du temps.', defaultHourlyRate: 'Taux horaire par défaut', }, - hrWarningModal: {disconnectText: ({integration}: {integration: string}) => `Pour désactiver les RH, veuillez d'abord déconnecter ${integration} de cet espace de travail.`}, + hrWarningModal: { + disconnectText: ({integration}: {integration: string}) => `Pour désactiver les RH, veuillez d'abord déconnecter ${integration} de cet espace de travail.`, + }, vendors: { title: 'Fournisseurs', subtitle: 'Faites correspondre les dépenses de carte aux fournisseurs importés depuis votre logiciel de comptabilité.', @@ -7047,7 +7203,10 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST. disableValues: 'Désactiver les valeurs', enableValue: 'Activer la valeur', enableValues: 'Activer les valeurs', - emptyReportFieldsValues: {title: 'Pas encore de valeurs de liste', subtitle: 'Ajoutez des valeurs personnalisées à faire apparaître sur les notes de frais.'}, + emptyReportFieldsValues: { + title: 'Pas encore de valeurs de liste', + subtitle: 'Ajoutez des valeurs personnalisées à faire apparaître sur les notes de frais.', + }, deleteValuePrompt: 'Voulez-vous vraiment supprimer cette valeur de liste ?', deleteValuesPrompt: 'Voulez-vous vraiment supprimer ces valeurs de liste ?', listValueRequiredError: 'Veuillez saisir un nom de valeur de liste', @@ -7388,10 +7547,16 @@ Le forfait Control commence à 9 $ par Membre actif et par mois.`, auditors: 'Auditeurs', guests: 'Invités', editors: 'Éditeurs', - emptyRoleFilter: {title: 'Aucun membre ne correspond à ce filtre', subtitle: 'Invitez un membre ou modifiez le filtre ci-dessus.'}, + emptyRoleFilter: { + title: 'Aucun membre ne correspond à ce filtre', + subtitle: 'Invitez un membre ou modifiez le filtre ci-dessus.', + }, configureHRSync: (providerName: string) => `Configurer la synchronisation ${providerName}.`, syncWithHR: (providerName: string) => `Synchroniser avec ${providerName}`, - makeCardAdmin: () => ({one: 'Nommer administrateur de carte', other: 'Nommer des administrateurs de carte'}), + makeCardAdmin: () => ({ + one: 'Nommer administrateur de carte', + other: 'Nommer des administrateurs de carte', + }), cardAdmins: 'Administrateurs de cartes', peopleAdmins: 'Administrateurs des personnes', paymentsAdmins: 'Administrateurs des paiements', @@ -7910,7 +8075,10 @@ Le forfait Control commence à 9 $ par Membre actif et par mois.`, }, distance: 'Distance', centrallyManage: 'Gérez les taux de manière centralisée, suivez en miles ou en kilomètres et définissez une catégorie par défaut.', - emptyRates: {title: 'Aucun taux de distance pour l’instant', subtitle: 'Ajoutez un taux pour rembourser le kilométrage à des taux personnalisés.'}, + emptyRates: { + title: 'Aucun taux de distance pour l’instant', + subtitle: 'Ajoutez un taux pour rembourser le kilométrage à des taux personnalisés.', + }, rate: 'Taux', addRate: 'Ajouter un taux', findRate: 'Trouver le taux', @@ -8905,7 +9073,12 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e emptyAmountError: 'Saisissez un montant valide avant d’enregistrer', receiptAmountGreaterThanItemizedError: 'Le montant du reçu requis ne peut pas être supérieur au montant du reçu détaillé requis.', }, - requireFields: {title: 'Rendre les champs obligatoires pour toutes les dépenses', category: 'Catégorie', tag: 'Tag', save: 'Enregistrer la règle'}, + requireFields: { + title: 'Rendre les champs obligatoires pour toutes les dépenses', + category: 'Catégorie', + tag: 'Tag', + save: 'Enregistrer la règle', + }, newRule: { title: 'Nouvelle règle', subtitle: 'Que voulez-vous faire ?', @@ -8953,7 +9126,11 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e merchantTypeIs: (merchantType: string) => `Le type de commerçant est « ${merchantType} »`, categoryIs: (category: string) => `La catégorie est « ${category} »`, }, - merchantTypeRule: {merchantType: 'Type de marchand', saveRule: 'Enregistrer la règle', confirmErrorCategory: 'Veuillez sélectionner une catégorie.'}, + merchantTypeRule: { + merchantType: 'Type de marchand', + saveRule: 'Enregistrer la règle', + confirmErrorCategory: 'Veuillez sélectionner une catégorie.', + }, requireFieldsTable: { tableColumnType: 'Type', tableColumnCondition: 'Condition', @@ -9020,7 +9197,10 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e subtitle: 'Créez une règle pour automatiser les politiques de votre espace de travail.', cta: 'Ajouter une règle IA', }, - categoriesDisabledEmptyState: {title: 'Les catégories ne sont pas activées', subtitle: 'Activez les catégories pour mieux contrôler vos dépenses.'}, + categoriesDisabledEmptyState: { + title: 'Les catégories ne sont pas activées', + subtitle: 'Activez les catégories pour mieux contrôler vos dépenses.', + }, expenseDefaultType: { title: 'Appliquer les valeurs de dépense par défaut', subtitle: 'Sur quoi cette règle doit-elle faire correspondre ?', @@ -9029,7 +9209,11 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e category: 'Catégorie', categoryDescription: 'Définir un taux de taxe par défaut pour une catégorie spécifique', }, - taxesDisabledEmptyState: {title: 'Les taxes ne sont pas activées', subtitle: 'Activez les taxes pour documenter et récupérer les taxes admissibles.', cta: 'Activer les taxes'}, + taxesDisabledEmptyState: { + title: 'Les taxes ne sont pas activées', + subtitle: 'Activez les taxes pour documenter et récupérer les taxes admissibles.', + cta: 'Activer les taxes', + }, }, planTypePage: { planTypes: { @@ -9132,7 +9316,11 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e dontSeeYourATS: `Vous ne voyez pas votre ATS ici ? Demandez à Concierge et nous pourrons l’ajouter.`, importSettings: 'Paramètres d’importation', defaultApprover: 'Approbateur par défaut', - approverFields: {recruiter: 'Recruteur', recruitingCoordinator: 'Coordinateur recrutement', hiringManager: 'Responsable du recrutement'}, + approverFields: { + recruiter: 'Recruteur', + recruitingCoordinator: 'Coordinateur recrutement', + hiringManager: 'Responsable du recrutement', + }, filters: { description: (providerName: string) => `Sélectionnez quels membres sont importés depuis ${providerName}. Vous pouvez choisir selon les étapes de poste, les tags et les bureaux.`, @@ -9211,7 +9399,10 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e approvalModeWarningConfirm: 'Modifier le mode d’approbation', syncingModalTitle: 'Votre connexion est en cours de synchronisation', syncingModalDescription: 'La première connexion peut prendre un certain temps. Vous serez informé de toute erreur.', - syncLimitReached: {title: 'Réessayez demain', prompt: "Vous avez atteint votre limite de synchronisation pour aujourd'hui."}, + syncLimitReached: { + title: 'Réessayez demain', + prompt: "Vous avez atteint votre limite de synchronisation pour aujourd'hui.", + }, syncResults: { title: (provider: string) => `Synchronisation ${provider} terminée`, successTitle: (provider: string) => `Connexion à ${provider} synchronisée avec succès !`, @@ -9241,22 +9432,40 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e enableNewAccountsDescription: 'Les nouveaux comptes Campfire seront disponibles en tant que catégories.', dimensionsImport: 'Toutes les dimensions Campfire sont importées en tant que tags', exportDescription: 'Configurer l’exportation des données Expensify vers Campfire.', - exportReimbursable: {label: 'Exporter les dépenses remboursables au format', values: {VENDOR_BILL: {label: 'Factures fournisseurs'}}}, + exportReimbursable: { + label: 'Exporter les dépenses remboursables au format', + values: {VENDOR_BILL: {label: 'Factures fournisseurs'}}, + }, exportDate: { label: 'Date de la facture fournisseur', description: 'Utiliser cette date lors de l’export des notes de frais vers Campfire.', values: { - LAST_EXPENSE: {label: 'Date de la dernière dépense', description: 'Date de la dépense la plus récente sur la note de frais.'}, - REPORT_EXPORTED: {label: 'Date d’exportation', description: 'Date à laquelle la note de frais a été exportée vers Campfire.'}, - REPORT_SUBMITTED: {label: 'Date de soumission', description: 'Date à laquelle la note de frais a été soumise pour approbation.'}, + LAST_EXPENSE: { + label: 'Date de la dernière dépense', + description: 'Date de la dépense la plus récente sur la note de frais.', + }, + REPORT_EXPORTED: { + label: 'Date d’exportation', + description: 'Date à laquelle la note de frais a été exportée vers Campfire.', + }, + REPORT_SUBMITTED: { + label: 'Date de soumission', + description: 'Date à laquelle la note de frais a été soumise pour approbation.', + }, }, }, - exportNonReimbursable: {label: 'Exporter les dépenses de carte de société en', values: {JOURNAL_ENTRY: {label: 'Écritures comptables'}}}, + exportNonReimbursable: { + label: 'Exporter les dépenses de carte de société en', + values: {JOURNAL_ENTRY: {label: 'Écritures comptables'}}, + }, defaultCompanyCardVendor: { label: 'Fournisseur par défaut pour toutes les cartes de l’entreprise', description: 'Choisissez un fournisseur Campfire par défaut pour les dépenses qui ne correspondent pas automatiquement.', }, - companyCardAccount: {label: 'Compte de carte d’entreprise', description: 'Choisissez où exporter les transactions de carte d’entreprise.'}, + companyCardAccount: { + label: 'Compte de carte d’entreprise', + description: 'Choisissez où exporter les transactions de carte d’entreprise.', + }, noAccountsFound: 'Aucun compte trouvé', noAccountsFoundDescription: 'Veuillez ajouter des comptes dans Campfire et synchroniser à nouveau la connexion', autoSyncDescription: 'Synchronisez Campfire et Expensify automatiquement, chaque jour. Les notes de frais se synchronisent en temps réel.', @@ -9279,13 +9488,18 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e description: 'Choisissez le compte de compensation des crédits Campfire lorsque Expensify marque une facture comme payée.', }, syncExpensifyCardSettlements: 'Synchroniser les règlements de Carte Expensify', - settlementAccount: {label: 'Compte de règlement de la Carte Expensify', description: 'Choisissez votre compte de règlement et nous créerons le paiement dans Campfire.'}, + settlementAccount: { + label: 'Compte de règlement de la Carte Expensify', + description: 'Choisissez votre compte de règlement et nous créerons le paiement dans Campfire.', + }, syncTravelInvoicingSettlements: 'Synchroniser les règlements de facturation de voyage consolidés', travelInvoicingSettlementAccount: { label: 'Compte de règlement de facturation de voyage consolidée', description: 'Choisissez votre compte de règlement et nous créerons le paiement dans Campfire.', }, - travelInvoicingPayableAccount: {label: 'Compte fournisseur de facturation de voyage consolidée'}, + travelInvoicingPayableAccount: { + label: 'Compte fournisseur de facturation de voyage consolidée', + }, exportToMultipleAccounts: 'Configurer l’exportation vers plusieurs comptes', cardProgramAccount: { label: 'Compte du programme de carte', @@ -9932,7 +10146,11 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e `modification de l’exclusion des trajets domicile-travail en une distance fixe par demande (auparavant ${previousMethod})`, changedToHomeAndOffice: ({previousMethod}: {previousMethod: string}) => `a modifié l’exclusion des trajets domicile-travail pour calculer à partir du domicile et du bureau (auparavant ${previousMethod})`, - previousMethod: {disabled: 'ne pas exclure les trajets domicile-travail', fixedDistance: 'distance fixe par demande', homeAndOffice: 'domicile et bureau'}, + previousMethod: { + disabled: 'ne pas exclure les trajets domicile-travail', + fixedDistance: 'distance fixe par demande', + homeAndOffice: 'domicile et bureau', + }, setFixedDistance: ({formattedDistance}: {formattedDistance: string}) => `définir l’exclusion de distance fixe à ${formattedDistance} par demande`, changedFixedDistance: ({formattedOldDistance, formattedNewDistance}: {formattedOldDistance: string; formattedNewDistance: string}) => `a modifié l'exclusion de distance fixe à ${formattedNewDistance} par demande (auparavant ${formattedOldDistance})`, @@ -9987,6 +10205,8 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e updatedMccGroupCategory: ({mccGroupName, oldCategory, newCategory}: {mccGroupName: string; oldCategory: string; newCategory: string}) => `a modifié la catégorie de dépense par défaut pour « ${mccGroupName} » en « ${newCategory} » (auparavant « ${oldCategory} »)`, updatedRequireCompanyCards: ({enabled}: {enabled: boolean}) => `${enabled ? 'activé' : 'désactivé'} l’exigence d’achats par carte d’entreprise`, + updatedCardFeedReimbursable: (feedName: string, newValue?: string, previousValue?: string) => + `a modifié le paramètre de remboursement du flux de cartes "${feedName}"${newValue ? ` en "${newValue}"` : ''}${previousValue ? ` (auparavant "${previousValue}")` : ''}`, agentRule: { added: ({title, prompt}: {title: string; prompt: string}) => (title ? `a ajouté la règle d’agent « ${title} » : ${prompt}` : `a ajouté une règle d’agent : ${prompt}`), updated: ({title, prompt}: {title: string; prompt: string}) => @@ -10022,7 +10242,13 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e one: 'règle de dépense appliquée à 1 carte supplémentaire', other: `règle de dépense appliquée à ${count} cartes supplémentaires`, }), - phraseVerb: {added: 'ajouté', removed: 'supprimé', changed: 'modifié', set: 'définir', applied: 'appliqué'}, + phraseVerb: { + added: 'ajouté', + removed: 'supprimé', + changed: 'modifié', + set: 'définir', + applied: 'appliqué', + }, bodyMerchant: ({adjective, value}: {adjective: string; value: string}) => (adjective !== '' ? `${adjective} commerçant « ${value} »` : `commerçant « ${value} »`), bodyMerchantValueOnly: ({value}: {value: string}) => `« ${value} »`, bodyMerchantChange: ({adjective, oldValue, newValue}: {adjective: string; oldValue: string; newValue: string}) => @@ -10260,7 +10486,11 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e subtitleCannotSend: "Vous avez besoin d'un espace de travail avec Invoices activé pour envoyer des factures.", subtitleCannotSendWithTestDrive: "Vous avez besoin d'un espace de travail avec Invoices activé pour envoyer des factures. Faites un essai d'Expensify pour en savoir plus.", }, - emptyTripResults: {title: 'Aucun voyage pour le moment', subtitle: 'Commencez en réservant votre premier voyage ci-dessous.', buttonText: 'Réserver un voyage'}, + emptyTripResults: { + title: 'Aucun voyage pour le moment', + subtitle: 'Commencez en réservant votre premier voyage ci-dessous.', + buttonText: 'Réserver un voyage', + }, emptySubmitResults: { title: 'Aucune dépense à soumettre', subtitle: 'Tout est bon. Faites un tour d’honneur !', @@ -10289,7 +10519,11 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e title: 'Aucune dépense à approuver', subtitle: 'Zéro dépense. Détente maximale. Bien joué !', }, - staleResults: {title: 'Actualisation requise', subtitle: 'Cette page n’est plus à jour, actualisez-la pour voir les dernières informations', buttonText: 'Actualiser'}, + staleResults: { + title: 'Actualisation requise', + subtitle: 'Cette page n’est plus à jour, actualisez-la pour voir les dernières informations', + buttonText: 'Actualiser', + }, }, columns: 'Colonnes', editColumns: 'Modifier les colonnes', @@ -10386,8 +10620,15 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e cardFeedNameCSV: ({cardFeedLabel}: {cardFeedLabel?: string}) => `Toutes les cartes CSV importées${cardFeedLabel ? ` - ${cardFeedLabel}` : ''}`, travelInvoicing: 'Facturation de voyages consolidée', }, - bankAccount: {banks: 'Comptes bancaires', closedBankAccounts: 'Comptes bancaires fermés'}, - workspace: {active: 'Actif', archived: 'Archivé', selectAll: 'Tout sélectionner'}, + bankAccount: { + banks: 'Comptes bancaires', + closedBankAccounts: 'Comptes bancaires fermés', + }, + workspace: { + active: 'Actif', + archived: 'Archivé', + selectAll: 'Tout sélectionner', + }, reportField: (name: string, value: string) => `${name} est ${value}`, current: 'Actuel', past: 'Passé', @@ -10430,14 +10671,21 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e [CONST.SEARCH.WITHDRAWAL_TYPE.TRAVEL_BILLING]: 'Facturation de voyages consolidée', }, is: 'Est', - has: {submittedViolation: 'Infraction soumise', approvedViolation: 'Violation approuvée'}, + has: { + submittedViolation: 'Infraction soumise', + approvedViolation: 'Violation approuvée', + }, action: { [CONST.SEARCH.ACTION_FILTERS.SUBMIT]: 'Soumettre', [CONST.SEARCH.ACTION_FILTERS.APPROVE]: 'Approuver', [CONST.SEARCH.ACTION_FILTERS.PAY]: 'Payer', [CONST.SEARCH.ACTION_FILTERS.EXPORT]: 'Exporter', }, - filterType: {label: 'Type de filtre', has: {positive: 'a', negative: 'n’a pas'}, is: {positive: 'est', negative: 'n’est pas'}}, + filterType: { + label: 'Type de filtre', + has: {positive: 'a', negative: 'n’a pas'}, + is: {positive: 'est', negative: 'n’est pas'}, + }, merchant: { matchType: 'Type de correspondance', contains: (merchant?: string) => (merchant ? `Contient "${merchant}"` : 'Contient'), @@ -10480,7 +10728,10 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e [CONST.SEARCH.GROUP_BY.YEAR]: 'Années', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Trimestres', }, - moneyRequestReport: {emptyStateTitle: 'Aucune dépense pour l’instant', accessPlaceHolder: 'Ouvrir pour plus de détails'}, + moneyRequestReport: { + emptyStateTitle: 'Aucune dépense pour l’instant', + accessPlaceHolder: 'Ouvrir pour plus de détails', + }, noCategory: 'Aucune catégorie', noMerchant: 'Aucun commerçant', noTag: 'Aucun tag', @@ -10549,7 +10800,10 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e mergeReports: { title: 'Fusionner des notes de frais', description: 'Sélectionnez la note de frais à conserver. Toutes les dépenses y seront déplacées et les autres notes de frais seront supprimées.', - listPage: {noEligibleReportsFound: 'Aucune note de frais éligible trouvée', noEligibleReportsFoundSubtitle: 'Vous n’avez aucune note de frais pouvant être fusionnée.'}, + listPage: { + noEligibleReportsFound: 'Aucune note de frais éligible trouvée', + noEligibleReportsFoundSubtitle: 'Vous n’avez aucune note de frais pouvant être fusionnée.', + }, }, periodSoFar: ({period}: {period: string}) => `${period} jusqu’à présent`, weekOf: ({date}: {date: string}) => `Semaine du ${date}`, @@ -10586,11 +10840,21 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e }, }, settlement: { - status: {pending: 'En attente', cleared: 'Compensé', failed: 'Échec', never: 'Jamais', cashBack: 'Cashback'}, + status: { + pending: 'En attente', + cleared: 'Compensé', + failed: 'Échec', + never: 'Jamais', + cashBack: 'Cashback', + }, failedError: ({link}: {link: string}) => `Nous réessaierons ce règlement lorsque vous déverrouillerez votre compte.`, withdrawalInfo: ({date, withdrawalID}: {date: string; withdrawalID: number}) => `${date} • ID de retrait : ${withdrawalID}`, }, - paidStatus: {markedAsPaid: 'Marqué comme payé', withdrawing: 'Retrait en cours', confirmed: 'Confirmé'}, + paidStatus: { + markedAsPaid: 'Marqué comme payé', + withdrawing: 'Retrait en cours', + confirmed: 'Confirmé', + }, reportLayout: { reportLayout: 'Mise en page de la note de frais', groupByLabel: 'Regrouper par :', @@ -11047,7 +11311,12 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e prompt: 'Veuillez autoriser l’accès à la localisation dans les réglages de votre appareil pour commencer le suivi de distance GPS.', }, gpsFloatingPillText: 'Suivi GPS en cours...', - liveActivity: {subtitle: 'Suivi de la distance', button: 'Voir la progression', lockScreenBadgeText: 'Distance', lockScreenTrackingText: 'Suivi...'}, + liveActivity: { + subtitle: 'Suivi de la distance', + button: 'Voir la progression', + lockScreenBadgeText: 'Distance', + lockScreenTrackingText: 'Suivi...', + }, }, reportCardLostOrDamaged: { screenTitle: 'relevé de notes perdu ou endommagé', @@ -11249,7 +11518,11 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e markAsCashToIgnore: 'Marquer comme paiement en espèces pour l’ignorer et demander un paiement.', smartscanFailed: ({canEdit = true, missingFields = []}: {canEdit?: boolean; missingFields?: string[]}) => { if (missingFields.length > 0) { - const fieldNames: Record = {merchant: 'commerçant', date: 'date', amount: 'montant'}; + const fieldNames: Record = { + merchant: 'commerçant', + date: 'date', + amount: 'montant', + }; const translated = missingFields.map((f) => fieldNames[f] ?? f); const fieldList = translated.join(translated.length > 2 ? ', ' : ' et '); return `L’analyse du reçu a échoué — champ(s) manquant(s) : ${fieldList}.${canEdit ? ' Saisir les détails manuellement.' : ''}`; @@ -11659,7 +11932,14 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e one: '1 utilisateur actif', other: `${count} utilisateurs actifs`, }), - state: {paid: 'Payé', cleared: 'Compensé', failed: 'Échec', refunded: 'Remboursé', disputed: 'Contesté', balanceTransfer: 'Virement de solde'}, + state: { + paid: 'Payé', + cleared: 'Compensé', + failed: 'Échec', + refunded: 'Remboursé', + disputed: 'Contesté', + balanceTransfer: 'Virement de solde', + }, details: 'Détails du paiement', badge: { balanceTransferTo: ({email}: {email: string}) => `Virement de solde à ${email}`, @@ -12130,7 +12410,10 @@ Voici un *reçu test* pour vous montrer comment ça fonctionne :`, other: 'Fermer les comptes', }), closeAccountPrompt: 'Êtes-vous sûr(e) ? Cette action est définitive.', - forceCloseAccount: () => ({one: 'Forcer la fermeture du compte', other: 'Forcer la fermeture des comptes'}), + forceCloseAccount: () => ({ + one: 'Forcer la fermeture du compte', + other: 'Forcer la fermeture des comptes', + }), safeCloseAccount: () => ({ one: 'Fermer le compte en toute sécurité', other: 'Fermer les comptes en toute sécurité', @@ -12153,7 +12436,10 @@ Voici un *reçu test* pour vous montrer comment ça fonctionne :`, `Voulez-vous continuer ? Cela va verrouiller le compte de ${email}.

Notre équipe examinera ensuite le compte et supprimera tout accès non autorisé. Pour retrouver l’accès, il faudra collaborer avec Concierge.`, reportSuspiciousActivityConfirmationPrompt: 'Nous examinerons le compte pour vérifier qu’il est sûr de le déverrouiller et nous vous contacterons via Concierge si nous avons des questions.', - emptyMembers: {title: 'Aucun membre dans ce groupe', subtitle: 'Ajoutez un membre ou essayez de modifier le filtre ci-dessus.'}, + emptyMembers: { + title: 'Aucun membre dans ce groupe', + subtitle: 'Ajoutez un membre ou essayez de modifier le filtre ci-dessus.', + }, moveToGroup: 'Déplacer vers le groupe', chooseWhereToMove: ({count}: {count: number}) => ({ one: `Choisissez où déplacer ${count} membre.`, @@ -12182,7 +12468,10 @@ Voici un *reçu test* pour vous montrer comment ça fonctionne :`, }, groups: { title: 'Groupes', - memberCount: () => ({one: '1 membre', other: (count: number) => `${count} membres`}), + memberCount: () => ({ + one: '1 membre', + other: (count: number) => `${count} membres`, + }), defaultGroup: 'Groupe par défaut pour les nouveaux membres', defaultGroupPrompt: (currentName: string, newName: string) => `Êtes-vous sûr de vouloir faire de ${newName} le groupe par défaut ? Les nouveaux membres seront invités à ce groupe au lieu du groupe par défaut précédent (${currentName}). `, @@ -12235,7 +12524,10 @@ Voici un *reçu test* pour vous montrer comment ça fonctionne :`, closeButton: 'Fermer', addPaymentCardButton: 'Ajouter une carte de paiement', }, - monthPickerPage: {month: 'Mois', selectMonth: 'Veuillez sélectionner un mois'}, + monthPickerPage: { + month: 'Mois', + selectMonth: 'Veuillez sélectionner un mois', + }, emailIssuePage: { title: 'Problème d’e-mail', intro: (login: string) => `Notre fournisseur d’e-mails a interrompu l’envoi vers ${login} en raison de problèmes de distribution. Pour résoudre ce problème :`, @@ -12276,6 +12568,10 @@ Voici un *reçu test* pour vous montrer comment ça fonctionne :`, mobileRenewPrompt: 'Visitez Expensify dans votre navigateur web pour renouveler en avance.', mobileClaimPrompt: 'Visitez Expensify dans votre navigateur web pour bénéficier de votre réduction de renouvellement.', }, - bulkActionBar: {label: 'Actions groupées', clearSelection: 'Effacer la sélection', loadingSelection: 'Chargement de la sélection'}, + bulkActionBar: { + label: 'Actions groupées', + clearSelection: 'Effacer la sélection', + loadingSelection: 'Chargement de la sélection', + }, }; export default translations; diff --git a/src/languages/it.ts b/src/languages/it.ts index 1de03c49f542..256c54421eb0 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -509,7 +509,10 @@ const translations: TranslationDeepObject = { quarter: 'Trimestre', vacationDelegate: 'Delega ferie', expensifyLogo: 'Logo Expensify', - concierge: {greeting: 'Ciao, come posso aiutarti?', showHistory: 'Mostra cronologia'}, + concierge: { + greeting: 'Ciao, come posso aiutarti?', + showHistory: 'Mostra cronologia', + }, duplicateReport: 'Report duplicato', approver: 'Approvante', goToConcierge: 'Vai a Concierge', @@ -548,8 +551,16 @@ const translations: TranslationDeepObject = { hasAnAnswer: 'Concierge ha una risposta!', collapseReasoning: 'Comprimi ragionamento', expandReasoning: 'Espandi ragionamento', - enableNotifications: {prompt: 'Vuoi ricevere una notifica quando Concierge risponde?', cta: 'Notifica'}, - feedback: {prompt: 'Questa risposta è stata utile?', useful: 'Risposta utile', notUseful: 'Risposta non utile', thanks: 'Grazie per il tuo feedback!'}, + enableNotifications: { + prompt: 'Vuoi ricevere una notifica quando Concierge risponde?', + cta: 'Notifica', + }, + feedback: { + prompt: 'Questa risposta è stata utile?', + useful: 'Risposta utile', + notUseful: 'Risposta non utile', + thanks: 'Grazie per il tuo feedback!', + }, }, supportalNoAccess: { title: 'Non così in fretta', @@ -691,7 +702,10 @@ const translations: TranslationDeepObject = { statusNeverRegistered: 'Mai registrato', statusNotRegistered: 'Non registrato', statusRegisteredThisDevice: 'Registrato', - statusRegisteredOtherDevice: () => ({one: 'Un altro dispositivo registrato', other: 'Altri dispositivi registrati'}), + statusRegisteredOtherDevice: () => ({ + one: 'Un altro dispositivo registrato', + other: 'Altri dispositivi registrati', + }), }, pleaseEnableInSystemSettings: { start: 'Abilita la verifica tramite volto/impronta digitale oppure imposta un codice di sblocco del dispositivo nel tuo', @@ -704,7 +718,10 @@ const translations: TranslationDeepObject = { letsVerifyItsYou: 'Verifichiamo che sia tu', nowLetsAuthenticateYou: 'Ora procediamo con l’autenticazione...', letsAuthenticateYou: 'Autentichiamo la tua identità...', - verifyYourself: {biometrics: 'Verificati con il volto o l’impronta digitale', passkeys: 'Verificati con una passkey'}, + verifyYourself: { + biometrics: 'Verificati con il volto o l’impronta digitale', + passkeys: 'Verificati con una passkey', + }, enableQuickVerification: { biometrics: 'Attiva una verifica rapida e sicura utilizzando il volto o l’impronta digitale. Nessuna password o codice richiesto.', passkeys: 'Abilita una verifica rapida e sicura usando una passkey. Nessuna password o codice richiesto.', @@ -741,9 +758,13 @@ const translations: TranslationDeepObject = { }, verificationFailed: 'Verifica non riuscita', setPin: {didNotShipCard: 'Non abbiamo spedito la tua carta. Riprova.'}, - revealPin: {couldNotReveal: 'Non siamo riusciti a mostrare il tuo PIN. Riprova.'}, + revealPin: { + couldNotReveal: 'Non siamo riusciti a mostrare il tuo PIN. Riprova.', + }, changePin: {didNotChange: 'Non abbiamo modificato il tuo PIN. Riprova.'}, - revealCardDetail: {couldNotReveal: 'Non siamo riusciti a mostrare i dettagli della tua carta. Riprova.'}, + revealCardDetail: { + couldNotReveal: 'Non siamo riusciti a mostrare i dettagli della tua carta. Riprova.', + }, }, validateCodeModal: { successfulSignInTitle: Str.dedent(` @@ -983,11 +1004,27 @@ const translations: TranslationDeepObject = { toDos: 'Attività da fare', timeSensitiveSection: { title: 'Sensibile al tempo', - addShippingAddress: {title: 'Ci serve il tuo indirizzo di spedizione', subtitle: 'Fornisci un indirizzo per ricevere la tua Carta Expensify.', cta: 'Aggiungi'}, - addPaymentCard: {title: 'Aggiungi una carta di pagamento per continuare a usare Expensify', subtitle: 'Account > Abbonamento', cta: 'Aggiungi'}, - addBankAccount: {title: 'Aggiungi un conto bancario per ricevere il rimborso'}, - addDepositAccount: {title: 'Aggiungi un conto bancario per ricevere pagamenti'}, - activateCard: {title: 'Attiva la tua Carta Expensify', subtitle: 'Convalida la tua carta e inizia a spendere.', cta: 'Attiva'}, + addShippingAddress: { + title: 'Ci serve il tuo indirizzo di spedizione', + subtitle: 'Fornisci un indirizzo per ricevere la tua Carta Expensify.', + cta: 'Aggiungi', + }, + addPaymentCard: { + title: 'Aggiungi una carta di pagamento per continuare a usare Expensify', + subtitle: 'Account > Abbonamento', + cta: 'Aggiungi', + }, + addBankAccount: { + title: 'Aggiungi un conto bancario per ricevere il rimborso', + }, + addDepositAccount: { + title: 'Aggiungi un conto bancario per ricevere pagamenti', + }, + activateCard: { + title: 'Attiva la tua Carta Expensify', + subtitle: 'Convalida la tua carta e inizia a spendere.', + cta: 'Attiva', + }, confirmDigitalWalletAddition: { subtitle: 'Carta Expensify', }, @@ -1012,16 +1049,30 @@ const translations: TranslationDeepObject = { title: ({cardName}: {cardName?: string}) => (cardName ? `Correggi la connessione della carta personale ${cardName}` : 'Correggi connessione carta personale'), subtitle: 'Portafoglio', }, - addHomeAddress: {title: 'Aggiungi il tuo indirizzo di casa per il tracciamento delle distanze', subtitle: 'Account', cta: 'Aggiungi'}, - fixFailedBilling: {title: 'Non abbiamo potuto addebitare la carta salvata nel profilo', subtitle: 'Abbonamento'}, + addHomeAddress: { + title: 'Aggiungi il tuo indirizzo di casa per il tracciamento delle distanze', + subtitle: 'Account', + cta: 'Aggiungi', + }, + fixFailedBilling: { + title: 'Non abbiamo potuto addebitare la carta salvata nel profilo', + subtitle: 'Abbonamento', + }, unlockBankAccount: { workspaceTitle: 'Il conto bancario della tua azienda è stato bloccato', personalTitle: 'Il tuo conto bancario è stato bloccato', workspaceSubtitle: ({policyName}: {policyName: string}) => policyName, personalSubtitle: 'Portafoglio', }, - addVirtualCardPersonalDetails: {title: 'Aggiungi i tuoi dati per visualizzare e iniziare a usare la tua Carta Expensify.', subtitle: 'Carta Expensify', cta: 'Aggiungi'}, - enterSignerInfo: {title: 'Informazioni del firmatario necessarie', subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Conto bancario ${bankAccountLastFour}`}, + addVirtualCardPersonalDetails: { + title: 'Aggiungi i tuoi dati per visualizzare e iniziare a usare la tua Carta Expensify.', + subtitle: 'Carta Expensify', + cta: 'Aggiungi', + }, + enterSignerInfo: { + title: 'Informazioni del firmatario necessarie', + subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Conto bancario ${bankAccountLastFour}`, + }, payOverdueInvoice: { cta: 'Rivedi', dueSoonTitle: ({date}: {date: string}) => `Paga la tua fattura entro il ${date} per evitare l’interruzione del servizio`, @@ -1032,8 +1083,13 @@ const translations: TranslationDeepObject = { subtitle: ({date}: {date: string}) => `L’abbonamento termina il ${date}`, cta: 'Gestisci', }, - emailDeliveryFailure: {title: 'Non possiamo inviarti notifiche via email', subtitle: 'Account'}, - upgradeNetSuiteConnection: {title: 'Aggiorna la connessione a NetSuite'}, + emailDeliveryFailure: { + title: 'Non possiamo inviarti notifiche via email', + subtitle: 'Account', + }, + upgradeNetSuiteConnection: { + title: 'Aggiorna la connessione a NetSuite', + }, }, forYouSection: { submit: ({count}: {count: number}) => ({ @@ -1101,7 +1157,10 @@ const translations: TranslationDeepObject = { hotelIn: ({destination}: {destination: string}) => `Hotel a ${destination}`, carRentalIn: ({destination}: {destination: string}) => `Noleggio auto a ${destination}`, inOneWeek: 'Tra 1 settimana', - inDays: () => ({one: 'Tra 1 giorno', other: (count: number) => `Tra ${count} giorni`}), + inDays: () => ({ + one: 'Tra 1 giorno', + other: (count: number) => `Tra ${count} giorni`, + }), today: 'Oggi', }, freeTrialSection: { @@ -1168,7 +1227,10 @@ const translations: TranslationDeepObject = { emptyStateTitle: 'Nessuna spesa recente', emptyStateMessage: 'Creane una o trascina qui una ricevuta', }, - insightsSection: {chartUnavailable: 'Grafico non disponibile', notEnoughData: 'Non abbiamo ancora abbastanza dati per compilare questo grafico'}, + insightsSection: { + chartUnavailable: 'Grafico non disponibile', + notEnoughData: 'Non abbiamo ancora abbastanza dati per compilare questo grafico', + }, conciergePrompt: { goodMorning: ({name}: {name?: string}) => (name ? `Buongiorno, ${name}.` : 'Buongiorno.'), goodAfternoon: ({name}: {name?: string}) => (name ? `Buon pomeriggio, ${name}.` : 'Buon pomeriggio.'), @@ -1179,8 +1241,14 @@ const translations: TranslationDeepObject = { }, insightsPage: { viewOnSpend: 'Visualizza in Spese', - emptyState: {title: 'Niente da mostrare', subtitle: 'Prova a modificare i criteri qui sopra'}, - noExpensesState: {title: 'Scopri dove va il tuo denaro', subtitle: 'Una volta che avrai delle spese, troverai tendenze di spesa, principali esercenti e altro ancora.'}, + emptyState: { + title: 'Niente da mostrare', + subtitle: 'Prova a modificare i criteri qui sopra', + }, + noExpensesState: { + title: 'Scopri dove va il tuo denaro', + subtitle: 'Una volta che avrai delle spese, troverai tendenze di spesa, principali esercenti e altro ancora.', + }, compare: { label: 'Confronta', previousPeriod: 'Periodo precedente', @@ -2275,7 +2343,11 @@ const translations: TranslationDeepObject = { saved: 'Salvato', }, }, - securityPage: {title: 'Sicurezza', subtitle: 'Tieni al sicuro il tuo account.', goToSecurity: 'Torna alla pagina di sicurezza'}, + securityPage: { + title: 'Sicurezza', + subtitle: 'Tieni al sicuro il tuo account.', + goToSecurity: 'Torna alla pagina di sicurezza', + }, shareCodePage: { title: 'Il tuo codice', subtitle: 'Invita membri su Expensify condividendo il tuo codice QR personale o il tuo link di riferimento.', @@ -2389,9 +2461,18 @@ const translations: TranslationDeepObject = { testingPreferences: 'Preferenze di test', server: 'Server', servers: { - production: {label: 'Produzione', description: "L'ambiente live che vedono gli utenti reali"}, - staging: {label: 'Staging', description: 'Copia della produzione. Usata per la validazione finale'}, - qa: {label: 'QA', description: 'Ambiente sperimentale usato per i test'}, + production: { + label: 'Produzione', + description: "L'ambiente live che vedono gli utenti reali", + }, + staging: { + label: 'Staging', + description: 'Copia della produzione. Usata per la validazione finale', + }, + qa: { + label: 'QA', + description: 'Ambiente sperimentale usato per i test', + }, }, serverPinnedDescription: 'Questa build comunica sempre con un solo server, quindi non può essere modificato qui.', forceOffline: 'Forza offline', @@ -2507,7 +2588,10 @@ const translations: TranslationDeepObject = { confirmMerge: 'Sei sicuro di voler unire gli account?', lossOfUnsubmittedData: (login: string) => `L’unione dei tuoi account è irreversibile e comporterà la perdita di tutte le spese non inviate per ${login}.`, enterSecurityCode: (login: string) => `Per continuare, inserisci il codice di sicurezza inviato a ${login}.`, - errors: {incorrectSecurityCode: 'Codice di sicurezza errato o non valido. Riprova oppure richiedi un nuovo codice.', fallback: 'Si è verificato un errore. Riprova più tardi.'}, + errors: { + incorrectSecurityCode: 'Codice di sicurezza errato o non valido. Riprova oppure richiedi un nuovo codice.', + fallback: 'Si è verificato un errore. Riprova più tardi.', + }, }, mergeSuccess: { accountsMerged: 'Account uniti!', @@ -2850,7 +2934,10 @@ const translations: TranslationDeepObject = { getStarted: 'Inizia', headerTitle: 'Rimborsi globali', }, - wiseGlobalReimbursementsBanner: {title: 'Paga persone in tutto il mondo', subtitle: 'Abilita i rimborsi globali sul tuo conto in USD.'}, + wiseGlobalReimbursementsBanner: { + title: 'Paga persone in tutto il mondo', + subtitle: 'Abilita i rimborsi globali sul tuo conto in USD.', + }, }, addCardToDigitalWallet: { title: ({walletName}: {walletName: string}) => `Aggiungi carta a ${walletName}`, @@ -3257,11 +3344,17 @@ ${amount} per ${merchant} - ${date}`, }, editAgentAvatarPage: {title: 'Modifica avatar'}, editAgentNamePage: {title: 'Nome agente'}, - editAgentPromptPage: {title: 'Scrivi istruzioni personalizzate', error: {emptyPrompt: 'Inserisci le istruzioni per il tuo agente.'}}, + editAgentPromptPage: { + title: 'Scrivi istruzioni personalizzate', + error: {emptyPrompt: 'Inserisci le istruzioni per il tuo agente.'}, + }, expenseRulesPage: { title: 'Regole spese', findRule: 'Trova regola', - emptyRules: {title: 'Ancuna nessuna regola', subtitle: 'Aggiungi una regola per automatizzare la rendicontazione delle spese.'}, + emptyRules: { + title: 'Ancuna nessuna regola', + subtitle: 'Aggiungi una regola per automatizzare la rendicontazione delle spese.', + }, changes: { billableUpdate: (value: boolean) => `Aggiorna spesa ${value ? 'fatturabile' : 'non fatturabile'}`, categoryUpdate: (value: string) => `Aggiorna categoria in “${value}”`, @@ -3914,7 +4007,11 @@ ${amount} per ${merchant} - ${date}`, detailsPage: { localTime: 'Ora locale', }, - newChatPage: {startGroup: 'Avvia gruppo', addToGroup: 'Aggiungi al gruppo', addUserToGroup: (username: string) => `Aggiungi ${username} al gruppo`}, + newChatPage: { + startGroup: 'Avvia gruppo', + addToGroup: 'Aggiungi al gruppo', + addUserToGroup: (username: string) => `Aggiungi ${username} al gruppo`, + }, yearPickerPage: { year: 'Anno', selectYear: 'Seleziona un anno', @@ -4752,7 +4849,12 @@ ${amount} per ${merchant} - ${date}`, departs: 'Partenza', errorMessage: 'Si è verificato un errore. Riprova più tardi.', phoneError: (phoneErrorMethodsRoute: string) => `Per prenotare viaggi, aggiungi un’email di lavoro come login principale.`, - domainSelector: {headline: 'Quale dominio vuoi configurare?', title: 'Dominio', subtitle: 'Scegli un dominio per la configurazione di Expensify Travel.', recommended: 'Consigliato'}, + domainSelector: { + headline: 'Quale dominio vuoi configurare?', + title: 'Dominio', + subtitle: 'Scegli un dominio per la configurazione di Expensify Travel.', + recommended: 'Consigliato', + }, workspaceAddress: {headline: 'Qual è l’indirizzo della tua azienda?'}, domainPermissionInfo: { title: 'Dominio', @@ -4812,7 +4914,9 @@ ${amount} per ${merchant} - ${date}`, title: 'Codice fiscale', subtitle: 'Inserisci il codice fiscale della tua entità legale così possiamo configurare la fatturazione dei viaggi nella tua valuta locale.', inputLabel: 'Partita IVA dell’entità legale', - error: {required: 'Inserisci il codice fiscale/partita IVA della tua entità legale.'}, + error: { + required: 'Inserisci il codice fiscale/partita IVA della tua entità legale.', + }, }, nudge: { airfareManual: @@ -5009,7 +5113,10 @@ ${amount} per ${merchant} - ${date}`, }, budgetFrequency: {monthly: 'mensile', yearly: 'annuale'}, budgetFrequencyUnit: {monthly: 'mese', yearly: 'anno'}, - budgetTypeForNotificationMessage: {tag: 'etichetta', category: 'categoria'}, + budgetTypeForNotificationMessage: { + tag: 'etichetta', + category: 'categoria', + }, deepDiveExpensifyCard: `Le transazioni della Carta Expensify verranno esportate automaticamente in un "Conto Passivo Carta Expensify" creato con la nostra integrazione.`, travelInvoicing: 'Esporta le spese di fatturazione viaggio consolidate come', travelInvoicingVendor: 'Fornitore di viaggi', @@ -5600,10 +5707,16 @@ ${amount} per ${merchant} - ${date}`, label: 'Esporta le spese rimborsabili come', helperText: 'Le spese contrassegnate come rimborsabili verranno esportate come fatture passive intestate al dipendente.', }, - exportNonReimbursable: {label: 'Esporta le spese non rimborsabili come'}, + exportNonReimbursable: { + label: 'Esporta le spese non rimborsabili come', + }, expenseReports: 'Note spese', - exportReimbursableExpenseReports: {helperText: 'Le spese contrassegnate come rimborsabili verranno esportate come note spese intestate al dipendente.'}, - exportNonReimbursableExpenseReports: {helperText: 'Le spese contrassegnate come non rimborsabili verranno esportate come note spese intestate al dipendente.'}, + exportReimbursableExpenseReports: { + helperText: 'Le spese contrassegnate come rimborsabili verranno esportate come note spese intestate al dipendente.', + }, + exportNonReimbursableExpenseReports: { + helperText: 'Le spese contrassegnate come non rimborsabili verranno esportate come note spese intestate al dipendente.', + }, noVendorsFound: 'Nessun fornitore trovato', noVendorsFoundDescription: 'Sincronizza di nuovo la connessione dopo che i fornitori sono stati aggiunti in Certinia.', noCompaniesFound: 'Nessuna azienda trovata', @@ -5633,7 +5746,12 @@ ${amount} per ${merchant} - ${date}`, chartOfAccounts: 'Piano dei conti', chartOfAccountsDescription: 'Il piano dei conti viene importato in Expensify come categorie.', dimensionMapping: ({n}: {n: number}) => `Dimensione ${n}`, - dimensions: {dimension1: 'Dimensione 1', dimension2: 'Dimensione 2', dimension3: 'Dimensione 3', dimension4: 'Dimensione 4'}, + dimensions: { + dimension1: 'Dimensione 1', + dimension2: 'Dimensione 2', + dimension3: 'Dimensione 3', + dimension4: 'Dimensione 4', + }, doNotMap: 'Non mappare', doNotMapSubtitle: 'Usa come predefinita la risorsa dipendente', mappingTypes: { @@ -6095,7 +6213,14 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST. noAccountsFound: 'Nessun conto trovato', noAccountsFoundDescription: 'Aggiungi degli account in Rillet e sincronizza di nuovo la connessione', exportDescription: 'Configura come i dati di Expensify vengono esportati in Rillet.', - exportReimbursable: {label: 'Esporta le spese rimborsabili come', values: {[CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: {label: 'Fatture fornitori'}}}, + exportReimbursable: { + label: 'Esporta le spese rimborsabili come', + values: { + [CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: { + label: 'Fatture fornitori', + }, + }, + }, exportDate: { label: 'Data fattura fornitore', description: 'Usa questa data quando esporti i report su Rillet.', @@ -6114,12 +6239,22 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST. }, }, }, - exportNonReimbursable: {label: 'Esporta le spese della carta aziendale come', values: {[CONST.RILLET_EXPORT_NON_REIMBURSABLE.CREDIT_CARD_CHARGE]: {label: 'Carte di credito'}}}, + exportNonReimbursable: { + label: 'Esporta le spese della carta aziendale come', + values: { + [CONST.RILLET_EXPORT_NON_REIMBURSABLE.CREDIT_CARD_CHARGE]: { + label: 'Carte di credito', + }, + }, + }, defaultCompanyCardVendor: { label: 'Fornitore predefinito della carta aziendale', description: 'Scegli un fornitore Rillet predefinito per le spese che non vengono abbinate automaticamente.', }, - companyCardAccount: {label: 'Conto carta aziendale', description: 'Scegli dove esportare le transazioni delle carte aziendali.'}, + companyCardAccount: { + label: 'Conto carta aziendale', + description: 'Scegli dove esportare le transazioni delle carte aziendali.', + }, noBankAccountsFound: 'Nessun conto bancario trovato', noBankAccountsFoundDescription: 'Aggiungi i conti bancari in Rillet e sincronizza di nuovo la connessione', autoSyncDescription: 'Sincronizza automaticamente Rillet ed Expensify ogni giorno. I report si sincronizzano in tempo reale.', @@ -6137,9 +6272,15 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST. }, syncReimbursedReports: 'Sincronizza i report rimborsati', syncReimbursedReportsDescription: 'Quando un report viene pagato tramite ACH, verrà generato un pagamento fattura in questo conto.', - billPaymentAccount: {label: 'Conto per il pagamento delle bollette', description: 'Scegli da dove pagare le fatture e creeremo il pagamento in Rillet.'}, + billPaymentAccount: { + label: 'Conto per il pagamento delle bollette', + description: 'Scegli da dove pagare le fatture e creeremo il pagamento in Rillet.', + }, syncExpensifyCardSettlements: 'Sincronizza le liquidazioni della Carta Expensify', - settlementAccount: {label: 'Conto di regolamento Carta Expensify', description: 'Scegli il tuo conto di regolamento e creeremo il pagamento in Rillet.'}, + settlementAccount: { + label: 'Conto di regolamento Carta Expensify', + description: 'Scegli il tuo conto di regolamento e creeremo il pagamento in Rillet.', + }, syncTravelInvoicingSettlements: 'Sincronizza i pagamenti di fatturazione di viaggio consolidati', travelInvoicingSettlementAccount: { label: 'Conto di regolamento fatturazione viaggi consolidata', @@ -6285,20 +6426,28 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST. }, syncReimbursedReports: 'Sincronizza i report rimborsati', syncReimbursedReportsDescription: 'Quando un report viene pagato tramite ACH, in questo conto verrà generato un pagamento di una fattura.', - billPaymentAccount: {label: 'Conto per il pagamento delle fatture', description: 'Scegli da dove pagare le fatture e creeremo il pagamento in DualEntry.'}, + billPaymentAccount: { + label: 'Conto per il pagamento delle fatture', + description: 'Scegli da dove pagare le fatture e creeremo il pagamento in DualEntry.', + }, fxExpenseAccount: { label: 'Conto commissioni conversione valuta DualEntry', description: 'Quando la tua azienda copre il costo di conversione valutaria su un pagamento effettuato all’estero, registreremo tale costo su questo conto in DualEntry come registrazione contabile.', }, syncExpensifyCardSettlements: 'Sincronizza le liquidazioni della Carta Expensify', - settlementAccount: {label: 'Conto di regolamento Carta Expensify', description: 'Scegli il tuo conto di regolamento e creeremo il pagamento in DualEntry.'}, + settlementAccount: { + label: 'Conto di regolamento Carta Expensify', + description: 'Scegli il tuo conto di regolamento e creeremo il pagamento in DualEntry.', + }, syncTravelInvoicingSettlements: 'Sincronizza le liquidazioni della fatturazione di viaggio consolidata', travelInvoicingSettlementAccount: { label: 'Conto di regolamento per la fatturazione di viaggio consolidata', description: 'Scegli il tuo conto di regolamento e creeremo il pagamento in DualEntry.', }, - travelInvoicingPayableAccount: {label: 'Conto debiti per fatturazione viaggi consolidata'}, + travelInvoicingPayableAccount: { + label: 'Conto debiti per fatturazione viaggi consolidata', + }, }, type: { free: 'Gratis', @@ -6443,13 +6592,28 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST. cardIdentityColumn: 'Abbina un numero di carta o un nome della carta così le transazioni potranno essere associate a una carta.', }, fileImportDescription: "Un'opzione manuale se la tua banca non può inviare un feed.", - duplicateFeedModal: {title: 'Feed carta già collegato', prompt: 'Non puoi aggiungere due volte lo stesso feed della carta allo stesso spazio di lavoro.'}, + duplicateFeedModal: { + title: 'Feed carta già collegato', + prompt: 'Non puoi aggiungere due volte lo stesso feed della carta allo stesso spazio di lavoro.', + }, }, statementCloseDate: { [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Ultimo giorno del mese', [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Ultimo giorno lavorativo del mese', [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Giorno personalizzato del mese', }, + reimbursable: { + title: 'Rimborsabile', + description: 'Scegli come devono essere create le transazioni con carta. Le nuove transazioni seguiranno queste regole.', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES]: 'Sempre rimborsabile', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES}Description`]: 'Sempre rimborsato ai dipendenti', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO]: 'Sempre non rimborsabile', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO}Description`]: 'Mai rimborsato ai dipendenti', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES]: 'Rimborsabile', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES}Description`]: 'Più spesso rimborsato ai dipendenti', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO]: 'Non rimborsabile', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO}Description`]: 'Occasionalmente rimborsato ai dipendenti', + }, assign: 'Assegna', assignCard: 'Assegna carta', findCompanyCard: 'Trova carta aziendale', @@ -6496,7 +6660,10 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST. importButton: 'Importa transazioni', }, deletedCard: 'Carta eliminata', - assignNewCards: {title: 'Assegna nuove carte', description: 'Ottieni le ultime carte da assegnare dalla tua banca'}, + assignNewCards: { + title: 'Assegna nuove carte', + description: 'Ottieni le ultime carte da assegnare dalla tua banca', + }, }, expensifyCard: { issueAndManageCards: 'Emetti e gestisci le tue Carte Expensify', @@ -6935,14 +7102,18 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST. subtitle: 'Imposta una tariffa oraria fatturabile per il rilevamento del tempo.', defaultHourlyRate: 'Tariffa oraria predefinita', }, - hrWarningModal: {disconnectText: ({integration}: {integration: string}) => `Per disattivare HR, scollega prima ${integration} da questo workspace.`}, + hrWarningModal: { + disconnectText: ({integration}: {integration: string}) => `Per disattivare HR, scollega prima ${integration} da questo workspace.`, + }, vendors: { title: 'Fornitori', subtitle: 'Abbina le spese della carta ai fornitori importati dal tuo software di contabilità.', disabledTitle: 'Non così in fretta...', disabledMessage: 'Per abilitare o disabilitare questa funzione, dovrai modificare le impostazioni di importazione della contabilità.', }, - recruitingWarningModal: {disconnectText: ({integration}: {integration: string}) => `Per disattivare Recruiting, scollega prima ${integration} da questo spazio di lavoro.`}, + recruitingWarningModal: { + disconnectText: ({integration}: {integration: string}) => `Per disattivare Recruiting, scollega prima ${integration} da questo spazio di lavoro.`, + }, }, reports: { reportsCustomTitleExamples: 'Esempi:', @@ -6964,7 +7135,10 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST. findReportField: 'Trova campo report', deleteConfirmation: 'Sei sicuro di voler eliminare questo campo del report?', deleteFieldsConfirmation: 'Sei sicuro di voler eliminare questi campi del resoconto?', - emptyReportFields: {title: 'Nessun campo di report ancora', subtitle: 'Aggiungi un campo personalizzato (testo, data o menu a discesa) che appare nei report.'}, + emptyReportFields: { + title: 'Nessun campo di report ancora', + subtitle: 'Aggiungi un campo personalizzato (testo, data o menu a discesa) che appare nei report.', + }, subtitle: 'I campi del report si applicano a tutte le spese e possono essere utili quando desideri richiedere informazioni aggiuntive.', disableReportFields: 'Disattiva campi del report', disableReportFieldsConfirmation: 'Sei sicuro? I campi di testo e data verranno eliminati e gli elenchi verranno disattivati.', @@ -6989,7 +7163,10 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST. disableValues: 'Disabilita valori', enableValue: 'Abilita valore', enableValues: 'Abilita valori', - emptyReportFieldsValues: {title: 'Nessun valore in elenco ancora', subtitle: 'Aggiungi valori personalizzati da visualizzare nei report.'}, + emptyReportFieldsValues: { + title: 'Nessun valore in elenco ancora', + subtitle: 'Aggiungi valori personalizzati da visualizzare nei report.', + }, deleteValuePrompt: "Sei sicuro di voler eliminare questo valore dell'elenco?", deleteValuesPrompt: "Sei sicuro di voler eliminare questi valori dell'elenco?", listValueRequiredError: 'Inserisci il nome di un valore dell’elenco', @@ -7329,10 +7506,16 @@ Il piano Control parte da 9 $ al mese per ogni membro attivo.`, auditors: 'Revisori', guests: 'Ospiti', editors: 'Editori', - emptyRoleFilter: {title: 'Nessun membro corrisponde a questo filtro', subtitle: 'Invita un membro o modifica il filtro qui sopra.'}, + emptyRoleFilter: { + title: 'Nessun membro corrisponde a questo filtro', + subtitle: 'Invita un membro o modifica il filtro qui sopra.', + }, configureHRSync: (providerName: string) => `Configura la sincronizzazione di ${providerName}.`, syncWithHR: (providerName: string) => `Sincronizza con ${providerName}`, - makeCardAdmin: () => ({one: 'Rendi amministratore carta', other: 'Rendi amministratori carta'}), + makeCardAdmin: () => ({ + one: 'Rendi amministratore carta', + other: 'Rendi amministratori carta', + }), cardAdmins: 'Amministratori carta', peopleAdmins: 'Amministratori persone', paymentsAdmins: 'Amministratori pagamenti', @@ -7846,7 +8029,10 @@ Il piano Control parte da 9 $ al mese per ogni membro attivo.`, }, distance: 'Distanza', centrallyManage: 'Gestisci centralmente le tariffe, monitora in miglia o chilometri e imposta una categoria predefinita.', - emptyRates: {title: 'Ancuna nessuna tariffa distanza', subtitle: 'Aggiungi una tariffa per rimborsare il chilometraggio a tariffe personalizzate.'}, + emptyRates: { + title: 'Ancuna nessuna tariffa distanza', + subtitle: 'Aggiungi una tariffa per rimborsare il chilometraggio a tariffe personalizzate.', + }, rate: 'Valuta', addRate: 'Aggiungi tariffa', findRate: 'Trova tariffa', @@ -8836,7 +9022,12 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, emptyAmountError: 'Inserisci un importo valido prima di salvare', receiptAmountGreaterThanItemizedError: 'L’importo della ricevuta richiesta non può essere superiore all’importo della ricevuta analitica richiesta.', }, - requireFields: {title: 'Rendi obbligatori i campi per tutte le spese', category: 'Categoria', tag: 'Etichetta', save: 'Salva regola'}, + requireFields: { + title: 'Rendi obbligatori i campi per tutte le spese', + category: 'Categoria', + tag: 'Etichetta', + save: 'Salva regola', + }, newRule: { title: 'Nuova regola', subtitle: 'Che cosa vuoi fare?', @@ -8884,7 +9075,11 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, merchantTypeIs: (merchantType: string) => `Il tipo di esercente è "${merchantType}"`, categoryIs: (category: string) => `La categoria è "${category}"`, }, - merchantTypeRule: {merchantType: 'Tipo di esercente', saveRule: 'Salva regola', confirmErrorCategory: 'Seleziona una categoria.'}, + merchantTypeRule: { + merchantType: 'Tipo di esercente', + saveRule: 'Salva regola', + confirmErrorCategory: 'Seleziona una categoria.', + }, requireFieldsTable: { tableColumnType: 'Tipo', tableColumnCondition: 'Condizione', @@ -8946,8 +9141,15 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, flagTypeWarning: 'Avviso', flagTypeWarningDescription: 'Al segnalante verrà mostrato un avviso, ma potrà comunque inviare la spesa', }, - agentRulesEmptyState: {title: 'Nessuna regola agente aggiunta', subtitle: 'Crea una regola per automatizzare le policy del tuo workspace.', cta: 'Aggiungi regola IA'}, - categoriesDisabledEmptyState: {title: 'Le categorie non sono abilitate', subtitle: 'Attiva le categorie per avere un maggiore controllo sulle tue spese.'}, + agentRulesEmptyState: { + title: 'Nessuna regola agente aggiunta', + subtitle: 'Crea una regola per automatizzare le policy del tuo workspace.', + cta: 'Aggiungi regola IA', + }, + categoriesDisabledEmptyState: { + title: 'Le categorie non sono abilitate', + subtitle: 'Attiva le categorie per avere un maggiore controllo sulle tue spese.', + }, expenseDefaultType: { title: 'Applica impostazioni predefinite spesa', subtitle: 'Su cosa dovrebbe corrispondere questa regola?', @@ -8956,7 +9158,11 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, category: 'Categoria', categoryDescription: "Imposta un'aliquota fiscale predefinita per una categoria specifica", }, - taxesDisabledEmptyState: {title: 'Le imposte non sono abilitate', subtitle: 'Abilita le imposte per documentare e recuperare quelle ammissibili.', cta: 'Abilita imposte'}, + taxesDisabledEmptyState: { + title: 'Le imposte non sono abilitate', + subtitle: 'Abilita le imposte per documentare e recuperare quelle ammissibili.', + cta: 'Abilita imposte', + }, }, planTypePage: { planTypes: { @@ -9059,7 +9265,11 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, dontSeeYourATS: `Non vedi il tuo ATS qui? Chiedi a Concierge e possiamo aggiungerlo.`, importSettings: 'Impostazioni di importazione', defaultApprover: 'Approvatore predefinito', - approverFields: {recruiter: 'Recruiter', recruitingCoordinator: 'Coordinatore recruiting', hiringManager: 'Responsabile delle assunzioni'}, + approverFields: { + recruiter: 'Recruiter', + recruitingCoordinator: 'Coordinatore recruiting', + hiringManager: 'Responsabile delle assunzioni', + }, filters: { description: (providerName: string) => `Seleziona quali membri importare da ${providerName}. Puoi scegliere in base alle fasi lavorative, ai tag e alle sedi.`, stages: { @@ -9137,7 +9347,10 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, approvalModeWarningConfirm: 'Cambia modalità di approvazione', syncingModalTitle: 'La tua connessione è in sincronizzazione', syncingModalDescription: "La prima connessione può richiedere un po' di tempo. Ti verrà notificato qualsiasi errore.", - syncLimitReached: {title: 'Riprova domani', prompt: 'Hai raggiunto il limite di sincronizzazioni per oggi.'}, + syncLimitReached: { + title: 'Riprova domani', + prompt: 'Hai raggiunto il limite di sincronizzazioni per oggi.', + }, syncResults: { title: (provider: string) => `Sincronizzazione ${provider} completata`, successTitle: (provider: string) => `Connessione ${provider} sincronizzata correttamente!`, @@ -9167,22 +9380,40 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, enableNewAccountsDescription: 'I nuovi account Campfire saranno disponibili come categorie.', dimensionsImport: 'Tutte le dimensioni Campfire vengono importate come tag', exportDescription: 'Configura come i dati di Expensify vengono esportati in Campfire.', - exportReimbursable: {label: 'Esporta le spese rimborsabili come', values: {VENDOR_BILL: {label: 'Fatture fornitori'}}}, + exportReimbursable: { + label: 'Esporta le spese rimborsabili come', + values: {VENDOR_BILL: {label: 'Fatture fornitori'}}, + }, exportDate: { label: 'Data fattura fornitore', description: 'Usa questa data quando esporti i report in Campfire.', values: { - LAST_EXPENSE: {label: 'Data dell’ultima spesa', description: 'Data della spesa più recente nel report.'}, - REPORT_EXPORTED: {label: 'Data di esportazione', description: 'Data in cui il report è stato esportato su Campfire.'}, - REPORT_SUBMITTED: {label: 'Data di invio', description: "Data in cui il report è stato inviato per l'approvazione."}, + LAST_EXPENSE: { + label: 'Data dell’ultima spesa', + description: 'Data della spesa più recente nel report.', + }, + REPORT_EXPORTED: { + label: 'Data di esportazione', + description: 'Data in cui il report è stato esportato su Campfire.', + }, + REPORT_SUBMITTED: { + label: 'Data di invio', + description: "Data in cui il report è stato inviato per l'approvazione.", + }, }, }, - exportNonReimbursable: {label: 'Esporta le spese con carta aziendale come', values: {JOURNAL_ENTRY: {label: 'Scritture contabili'}}}, + exportNonReimbursable: { + label: 'Esporta le spese con carta aziendale come', + values: {JOURNAL_ENTRY: {label: 'Scritture contabili'}}, + }, defaultCompanyCardVendor: { label: 'Fornitore predefinito per tutte le carte aziendali', description: 'Scegli un fornitore Campfire predefinito per le spese che non vengono abbinate automaticamente.', }, - companyCardAccount: {label: 'Conto carta aziendale', description: 'Scegli dove esportare le transazioni della carta aziendale.'}, + companyCardAccount: { + label: 'Conto carta aziendale', + description: 'Scegli dove esportare le transazioni della carta aziendale.', + }, noAccountsFound: 'Nessun account trovato', noAccountsFoundDescription: 'Aggiungi degli account in Campfire e sincronizza di nuovo la connessione', autoSyncDescription: 'Sincronizza Campfire ed Expensify automaticamente, ogni giorno. I report si sincronizzano in tempo reale.', @@ -9205,13 +9436,18 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, description: 'Scegli il conto di compensazione Campfire credits quando Expensify contrassegna una fattura come pagata.', }, syncExpensifyCardSettlements: 'Sincronizza le liquidazioni della Carta Expensify', - settlementAccount: {label: 'Conto di regolamento Carta Expensify', description: 'Scegli il tuo conto di regolamento e creeremo il pagamento in Campfire.'}, + settlementAccount: { + label: 'Conto di regolamento Carta Expensify', + description: 'Scegli il tuo conto di regolamento e creeremo il pagamento in Campfire.', + }, syncTravelInvoicingSettlements: 'Sincronizza le liquidazioni della fatturazione di viaggio consolidata', travelInvoicingSettlementAccount: { label: 'Conto di regolamento per la fatturazione di viaggio consolidata', description: 'Scegli il tuo conto di regolamento e creeremo il pagamento in Campfire.', }, - travelInvoicingPayableAccount: {label: 'Conto debiti per fatturazione viaggi consolidata'}, + travelInvoicingPayableAccount: { + label: 'Conto debiti per fatturazione viaggi consolidata', + }, exportToMultipleAccounts: 'Configura l’esportazione su più conti', cardProgramAccount: { label: 'Conto del programma carta', @@ -9339,7 +9575,10 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, exportToNextOpenPeriodDescription: 'Quando un report ha una data in un periodo chiuso di Dynamics 365 Business Central, viene esportato nel periodo aperto successivo.', syncReimbursedReports: 'Sincronizza i report rimborsati', syncReimbursedReportsDescription: 'Quando un report viene pagato tramite ACH, in questo conto verrà generata una riga di prima nota generale.', - reimbursementBankAccount: {label: 'Conto bancario di pagamento', description: 'Scegli da dove pagare le fatture e creeremo il pagamento in Dynamics 365 Business Central.'}, + reimbursementBankAccount: { + label: 'Conto bancario di pagamento', + description: 'Scegli da dove pagare le fatture e creeremo il pagamento in Dynamics 365 Business Central.', + }, syncExpensifyCardSettlements: 'Sincronizza le liquidazioni della Carta Expensify', settlementsBankAccount: { label: 'Conto di regolamento Carta Expensify', @@ -9858,7 +10097,11 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, `ha modificato l’esclusione tragitti casa-lavoro a una distanza fissa per richiesta (in precedenza ${previousMethod})`, changedToHomeAndOffice: ({previousMethod}: {previousMethod: string}) => `ha cambiato “escludi tragitti casa-lavoro” per calcolare in base a casa e ufficio (in precedenza ${previousMethod})`, - previousMethod: {disabled: 'non escludere i tragitti casa-lavoro', fixedDistance: 'distanza fissa per richiesta', homeAndOffice: 'casa e ufficio'}, + previousMethod: { + disabled: 'non escludere i tragitti casa-lavoro', + fixedDistance: 'distanza fissa per richiesta', + homeAndOffice: 'casa e ufficio', + }, setFixedDistance: ({formattedDistance}: {formattedDistance: string}) => `imposta un'esclusione fissa di distanza di ${formattedDistance} per richiesta`, changedFixedDistance: ({formattedOldDistance, formattedNewDistance}: {formattedOldDistance: string; formattedNewDistance: string}) => `ha modificato l’esclusione a distanza fissa a ${formattedNewDistance} per richiesta (in precedenza ${formattedOldDistance})`, @@ -9913,6 +10156,8 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, updatedMccGroupCategory: ({mccGroupName, oldCategory, newCategory}: {mccGroupName: string; oldCategory: string; newCategory: string}) => `ha modificato la categoria di spesa predefinita per "${mccGroupName}" in "${newCategory}" (precedentemente "${oldCategory}")`, updatedRequireCompanyCards: ({enabled}: {enabled: boolean}) => `${enabled ? 'abilitato' : 'disabilitato'} il requisito per gli acquisti con carta aziendale`, + updatedCardFeedReimbursable: (feedName: string, newValue?: string, previousValue?: string) => + `ha modificato l'impostazione di rimborsabilità del feed carte "${feedName}"${newValue ? ` in "${newValue}"` : ''}${previousValue ? ` (in precedenza "${previousValue}")` : ''}`, agentRule: { added: ({title, prompt}: {title: string; prompt: string}) => title ? `ha aggiunto la regola dell’agente "${title}": ${prompt}` : `ha aggiunto una regola dell’agente: ${prompt}`, @@ -9949,7 +10194,13 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, one: 'ha applicato la regola di spesa a 1 altra carta', other: `ha applicato la regola di spesa ad altre ${count} carte`, }), - phraseVerb: {added: 'aggiunto', removed: 'rimosso', changed: 'modificato', set: 'imposta', applied: 'applicata'}, + phraseVerb: { + added: 'aggiunto', + removed: 'rimosso', + changed: 'modificato', + set: 'imposta', + applied: 'applicata', + }, bodyMerchant: ({adjective, value}: {adjective: string; value: string}) => (adjective !== '' ? `${adjective} esercente '${value}'` : `esercente '${value}'`), bodyMerchantValueOnly: ({value}: {value: string}) => `'${value}'`, bodyMerchantChange: ({adjective, oldValue, newValue}: {adjective: string; oldValue: string; newValue: string}) => @@ -10188,7 +10439,11 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, subtitleCannotSend: 'Hai bisogno di uno spazio di lavoro con Invoices abilitato per inviare fatture.', subtitleCannotSendWithTestDrive: 'Hai bisogno di uno spazio di lavoro con Invoices abilitato per inviare fatture. Fai un giro di prova con Expensify per saperne di più.', }, - emptyTripResults: {title: 'Ancun viaggio ancora', subtitle: 'Inizia prenotando il tuo primo viaggio qui sotto.', buttonText: 'Prenota un viaggio'}, + emptyTripResults: { + title: 'Ancun viaggio ancora', + subtitle: 'Inizia prenotando il tuo primo viaggio qui sotto.', + buttonText: 'Prenota un viaggio', + }, emptySubmitResults: { title: 'Nessuna spesa da inviare', subtitle: 'Tutto a posto. Goditi il tuo giro d’onore!', @@ -10217,7 +10472,11 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, title: 'Nessuna spesa da approvare', subtitle: 'Zero spese. Massimo relax. Ben fatto!', }, - staleResults: {title: 'Aggiornamento necessario', subtitle: 'Questa pagina non è aggiornata, ricarica per vedere le ultime novità', buttonText: 'Aggiorna'}, + staleResults: { + title: 'Aggiornamento necessario', + subtitle: 'Questa pagina non è aggiornata, ricarica per vedere le ultime novità', + buttonText: 'Aggiorna', + }, }, columns: 'Colonne', editColumns: 'Modifica colonne', @@ -10314,8 +10573,15 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, cardFeedNameCSV: ({cardFeedLabel}: {cardFeedLabel?: string}) => `Tutte le carte CSV importate${cardFeedLabel ? ` - ${cardFeedLabel}` : ''}`, travelInvoicing: 'Fatturazione viaggio consolidata', }, - bankAccount: {banks: 'Conti bancari', closedBankAccounts: 'Conti bancari chiusi'}, - workspace: {active: 'Attivo', archived: 'Archiviato', selectAll: 'Seleziona tutto'}, + bankAccount: { + banks: 'Conti bancari', + closedBankAccounts: 'Conti bancari chiusi', + }, + workspace: { + active: 'Attivo', + archived: 'Archiviato', + selectAll: 'Seleziona tutto', + }, reportField: (name: string, value: string) => `${name} è ${value}`, current: 'Attuale', past: 'Passato', @@ -10358,14 +10624,21 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, [CONST.SEARCH.WITHDRAWAL_TYPE.TRAVEL_BILLING]: 'Fatturazione viaggio consolidata', }, is: 'È', - has: {submittedViolation: 'Violazione inviata', approvedViolation: 'Violazione approvata'}, + has: { + submittedViolation: 'Violazione inviata', + approvedViolation: 'Violazione approvata', + }, action: { [CONST.SEARCH.ACTION_FILTERS.SUBMIT]: 'Invia', [CONST.SEARCH.ACTION_FILTERS.APPROVE]: 'Approva', [CONST.SEARCH.ACTION_FILTERS.PAY]: 'Paga', [CONST.SEARCH.ACTION_FILTERS.EXPORT]: 'Esporta', }, - filterType: {label: 'Tipo di filtro', has: {positive: 'ha', negative: 'non ha'}, is: {positive: 'è', negative: 'non è'}}, + filterType: { + label: 'Tipo di filtro', + has: {positive: 'ha', negative: 'non ha'}, + is: {positive: 'è', negative: 'non è'}, + }, merchant: { matchType: 'Tipo di corrispondenza', contains: (merchant?: string) => (merchant ? `Contiene "${merchant}"` : 'Contiene'), @@ -10408,7 +10681,10 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, [CONST.SEARCH.GROUP_BY.YEAR]: 'Anni', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Trimestri', }, - moneyRequestReport: {emptyStateTitle: 'Nessuna spesa ancora', accessPlaceHolder: 'Apri per i dettagli'}, + moneyRequestReport: { + emptyStateTitle: 'Nessuna spesa ancora', + accessPlaceHolder: 'Apri per i dettagli', + }, noCategory: 'Nessuna categoria', noMerchant: 'Nessun esercente', noTag: 'Nessun tag', @@ -10477,7 +10753,10 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, mergeReports: { title: 'Unisci report', description: 'Seleziona il report da mantenere. Tutte le spese verranno spostate al suo interno e gli altri report verranno eliminati.', - listPage: {noEligibleReportsFound: 'Nessun report idoneo trovato', noEligibleReportsFoundSubtitle: 'Non hai nessun report che possa essere unito.'}, + listPage: { + noEligibleReportsFound: 'Nessun report idoneo trovato', + noEligibleReportsFoundSubtitle: 'Non hai nessun report che possa essere unito.', + }, }, periodSoFar: ({period}: {period: string}) => `${period} finora`, weekOf: ({date}: {date: string}) => `Settimana del ${date}`, @@ -10514,11 +10793,21 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, }, }, settlement: { - status: {pending: 'In sospeso', cleared: 'Compensato', failed: 'Non riuscito', never: 'Mai', cashBack: 'Cashback'}, + status: { + pending: 'In sospeso', + cleared: 'Compensato', + failed: 'Non riuscito', + never: 'Mai', + cashBack: 'Cashback', + }, failedError: ({link}: {link: string}) => `Riproveremo a effettuare questa liquidazione quando sblocchi il tuo conto.`, withdrawalInfo: ({date, withdrawalID}: {date: string; withdrawalID: number}) => `${date} • ID prelievo: ${withdrawalID}`, }, - paidStatus: {markedAsPaid: 'Contrassegnato come pagato', withdrawing: 'Prelievo', confirmed: 'Confermato'}, + paidStatus: { + markedAsPaid: 'Contrassegnato come pagato', + withdrawing: 'Prelievo', + confirmed: 'Confermato', + }, reportLayout: { reportLayout: 'Layout del report', groupByLabel: 'Raggruppa per:', @@ -10974,7 +11263,12 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, prompt: 'Consenti l’accesso alla posizione nelle impostazioni del dispositivo per iniziare il tracciamento della distanza GPS.', }, gpsFloatingPillText: 'Tracciamento GPS in corso...', - liveActivity: {subtitle: 'Rilevamento distanza', button: 'Visualizza avanzamento', lockScreenBadgeText: 'Distanza', lockScreenTrackingText: 'Tracciamento in corso...'}, + liveActivity: { + subtitle: 'Rilevamento distanza', + button: 'Visualizza avanzamento', + lockScreenBadgeText: 'Distanza', + lockScreenTrackingText: 'Tracciamento in corso...', + }, }, reportCardLostOrDamaged: { screenTitle: 'Pagella smarrita o danneggiata', @@ -11177,7 +11471,11 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, markAsCashToIgnore: 'Segna come contante da ignorare e richiedi il pagamento.', smartscanFailed: ({canEdit = true, missingFields = []}: {canEdit?: boolean; missingFields?: string[]}) => { if (missingFields.length > 0) { - const fieldNames: Record = {merchant: 'esercente', date: 'data', amount: 'importo'}; + const fieldNames: Record = { + merchant: 'esercente', + date: 'data', + amount: 'importo', + }; const translated = missingFields.map((f) => fieldNames[f] ?? f); const fieldList = translated.join(translated.length > 2 ? ', ' : ' e '); const verb = translated.length === 1 ? 'mancante' : 'mancanti'; @@ -11456,7 +11754,10 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, title: 'La tua fattura di viaggio è scaduta', subtitle: (date: string) => `Paga la tua fattura di viaggio entro il ${date} per continuare a prenotare viaggi.`, }, - travelInvoiceOverdueLocked: {title: 'La prenotazione dei viaggi è in pausa', subtitle: 'La tua fattura di viaggio è scaduta. Pagala per poter ricominciare a prenotare viaggi.'}, + travelInvoiceOverdueLocked: { + title: 'La prenotazione dei viaggi è in pausa', + subtitle: 'La tua fattura di viaggio è scaduta. Pagala per poter ricominciare a prenotare viaggi.', + }, }, cardSection: { title: 'Pagamento', @@ -11585,7 +11886,14 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, one: '1 utente attivo', other: `${count} utenti attivi`, }), - state: {paid: 'Pagato', cleared: 'Compensato', failed: 'Non riuscito', refunded: 'Rimborsato', disputed: 'Contestata', balanceTransfer: 'Trasferimento di saldo'}, + state: { + paid: 'Pagato', + cleared: 'Compensato', + failed: 'Non riuscito', + refunded: 'Rimborsato', + disputed: 'Contestata', + balanceTransfer: 'Trasferimento di saldo', + }, details: 'Dettagli del pagamento', badge: { balanceTransferTo: ({email}: {email: string}) => `Trasferimento di saldo a ${email}`, @@ -12080,7 +12388,10 @@ Ecco una *ricevuta di prova* per mostrarti come funziona:`, reportSuspiciousActivityPrompt: (email: string) => `Sei sicuro? Questo bloccherà l’account di ${email}.

Il nostro team esaminerà quindi l’account e rimuoverà qualsiasi accesso non autorizzato. Per riottenere l’accesso, dovranno collaborare con Concierge.`, reportSuspiciousActivityConfirmationPrompt: 'Esamineremo l’account per verificare che sia sicuro sbloccarlo e ti contatteremo tramite Concierge per qualsiasi domanda.', - emptyMembers: {title: 'Nessun membro in questo gruppo', subtitle: 'Aggiungi un membro o prova a cambiare il filtro qui sopra.'}, + emptyMembers: { + title: 'Nessun membro in questo gruppo', + subtitle: 'Aggiungi un membro o prova a cambiare il filtro qui sopra.', + }, moveToGroup: 'Sposta nel gruppo', chooseWhereToMove: ({count}: {count: number}) => ({ one: 'Scegli dove spostare 1 membro.', @@ -12109,7 +12420,10 @@ Ecco una *ricevuta di prova* per mostrarti come funziona:`, }, groups: { title: 'Gruppi', - memberCount: () => ({one: '1 membro', other: (count: number) => `${count} membri`}), + memberCount: () => ({ + one: '1 membro', + other: (count: number) => `${count} membri`, + }), defaultGroup: 'Gruppo predefinito per i nuovi membri', defaultGroupPrompt: (currentName: string, newName: string) => `Sei sicuro di voler impostare ${newName} come gruppo predefinito? I nuovi membri verranno invitati a questo gruppo invece del precedente gruppo predefinito (${currentName}). `, @@ -12201,6 +12515,10 @@ Ecco una *ricevuta di prova* per mostrarti come funziona:`, mobileRenewPrompt: 'Visita Expensify nel browser web per rinnovare in anticipo.', mobileClaimPrompt: 'Visita Expensify nel tuo browser web per richiedere lo sconto di rinnovo.', }, - bulkActionBar: {label: 'Azioni collettive', clearSelection: 'Cancella selezione', loadingSelection: 'Caricamento selezione'}, + bulkActionBar: { + label: 'Azioni collettive', + clearSelection: 'Cancella selezione', + loadingSelection: 'Caricamento selezione', + }, }; export default translations; diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 84c2cc557cdf..5dafe7dfcfb5 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -508,7 +508,10 @@ const translations: TranslationDeepObject = { quarter: '四半期', vacationDelegate: '休暇代理人', expensifyLogo: 'Expensifyロゴ', - concierge: {greeting: 'こんにちは、どのようにお手伝いできますか?', showHistory: '履歴を表示'}, + concierge: { + greeting: 'こんにちは、どのようにお手伝いできますか?', + showHistory: '履歴を表示', + }, duplicateReport: 'レポートを複製', approver: '承認者', goToConcierge: 'Conciergeへ移動', @@ -551,7 +554,12 @@ const translations: TranslationDeepObject = { prompt: 'Conciergeから返信があったときに通知を受け取りますか?', cta: '通知', }, - feedback: {prompt: 'この回答は役に立ちましたか?', useful: '役に立つ返信', notUseful: '役に立たない返信', thanks: 'フィードバックをありがとうございます!'}, + feedback: { + prompt: 'この回答は役に立ちましたか?', + useful: '役に立つ返信', + notUseful: '役に立たない返信', + thanks: 'フィードバックをありがとうございます!', + }, }, supportalNoAccess: { title: 'ちょっと待ってください', @@ -680,11 +688,23 @@ const translations: TranslationDeepObject = { rejectAuthentication: '認証を拒否', test: 'テスト', biometricsAuthentication: '生体認証', - authType: {unknown: '不明', none: 'なし', credentials: '資格情報', biometrics: '生体認証', faceId: 'Face ID', touchId: 'Touch ID', opticId: 'Optic ID', passkey: 'Passkey'}, + authType: { + unknown: '不明', + none: 'なし', + credentials: '資格情報', + biometrics: '生体認証', + faceId: 'Face ID', + touchId: 'Touch ID', + opticId: 'Optic ID', + passkey: 'Passkey', + }, statusNeverRegistered: '未登録', statusNotRegistered: '未登録', statusRegisteredThisDevice: '登録済み', - statusRegisteredOtherDevice: () => ({one: '別のデバイスが登録されました', other: '登録済みの他のデバイス'}), + statusRegisteredOtherDevice: () => ({ + one: '別のデバイスが登録されました', + other: '登録済みの他のデバイス', + }), }, pleaseEnableInSystemSettings: { start: '顔認証/指紋認証を有効にするか、デバイスのパスコードを設定してください', @@ -697,7 +717,10 @@ const translations: TranslationDeepObject = { letsVerifyItsYou: 'ご本人確認を行いましょう', nowLetsAuthenticateYou: 'では、ご本人確認を行いましょう…', letsAuthenticateYou: '認証を行っています…', - verifyYourself: {biometrics: '顔または指紋で本人確認を行ってください', passkeys: 'パスキーで本人確認を行います'}, + verifyYourself: { + biometrics: '顔または指紋で本人確認を行ってください', + passkeys: 'パスキーで本人確認を行います', + }, enableQuickVerification: { biometrics: '顔や指紋を使って、素早く安全に認証できます。パスワードやコードは不要です。', passkeys: 'パスキーを使って、素早く安全に認証できるようにします。パスワードやコードは不要です。', @@ -731,10 +754,18 @@ const translations: TranslationDeepObject = { pleaseUseWebApp: `この操作はお使いのデバイスではサポートされていません。Expensifyウェブアプリをご利用のうえ、もう一度お試しください。`, }, verificationFailed: '認証に失敗しました', - setPin: {didNotShipCard: 'カードを発送できませんでした。もう一度お試しください。'}, - revealPin: {couldNotReveal: 'PIN を表示できませんでした。もう一度お試しください。'}, - changePin: {didNotChange: 'お客様の暗証番号は変更されていません。もう一度お試しください。'}, - revealCardDetail: {couldNotReveal: 'カード情報を表示できませんでした。もう一度お試しください。'}, + setPin: { + didNotShipCard: 'カードを発送できませんでした。もう一度お試しください。', + }, + revealPin: { + couldNotReveal: 'PIN を表示できませんでした。もう一度お試しください。', + }, + changePin: { + didNotChange: 'お客様の暗証番号は変更されていません。もう一度お試しください。', + }, + revealCardDetail: { + couldNotReveal: 'カード情報を表示できませんでした。もう一度お試しください。', + }, }, validateCodeModal: { successfulSignInTitle: Str.dedent(` @@ -974,11 +1005,25 @@ const translations: TranslationDeepObject = { toDos: 'To-do リスト', timeSensitiveSection: { title: '時間に敏感', - addShippingAddress: {title: '配送先住所が必要です', subtitle: 'Expensify カードを受け取る住所を入力してください。', cta: '追加'}, - addPaymentCard: {title: 'Expensify を引き続きご利用いただくには、支払いカードを追加してください', subtitle: 'アカウント > サブスクリプション', cta: '追加'}, + addShippingAddress: { + title: '配送先住所が必要です', + subtitle: 'Expensify カードを受け取る住所を入力してください。', + cta: '追加', + }, + addPaymentCard: { + title: 'Expensify を引き続きご利用いただくには、支払いカードを追加してください', + subtitle: 'アカウント > サブスクリプション', + cta: '追加', + }, addBankAccount: {title: '銀行口座を追加して払い戻しを受け取りましょう'}, - addDepositAccount: {title: '銀行口座を追加して支払いを受け取りましょう'}, - activateCard: {title: 'Expensify カードを有効化する', subtitle: 'カードを認証して支出を始めましょう。', cta: '有効化'}, + addDepositAccount: { + title: '銀行口座を追加して支払いを受け取りましょう', + }, + activateCard: { + title: 'Expensify カードを有効化する', + subtitle: 'カードを認証して支出を始めましょう。', + cta: '有効化', + }, confirmDigitalWalletAddition: { subtitle: 'Expensify カード', }, @@ -999,17 +1044,34 @@ const translations: TranslationDeepObject = { defaultSubtitle: 'ワークスペース', subtitle: ({policyName}: {policyName: string}) => `${policyName} > 会計`, }, - fixPersonalCardConnection: {title: ({cardName}: {cardName?: string}) => (cardName ? `${cardName}個人カードの接続を修正` : '個人カードの連携を修正'), subtitle: 'ウォレット'}, - addHomeAddress: {title: '距離の追跡用に自宅住所を追加してください', subtitle: 'アカウント', cta: '追加'}, - fixFailedBilling: {title: '登録されているカードから請求できませんでした', subtitle: 'サブスクリプション'}, + fixPersonalCardConnection: { + title: ({cardName}: {cardName?: string}) => (cardName ? `${cardName}個人カードの接続を修正` : '個人カードの連携を修正'), + subtitle: 'ウォレット', + }, + addHomeAddress: { + title: '距離の追跡用に自宅住所を追加してください', + subtitle: 'アカウント', + cta: '追加', + }, + fixFailedBilling: { + title: '登録されているカードから請求できませんでした', + subtitle: 'サブスクリプション', + }, unlockBankAccount: { workspaceTitle: 'ビジネス用銀行口座がロックされました', personalTitle: 'あなたの銀行口座はロックされています', workspaceSubtitle: ({policyName}: {policyName: string}) => policyName, personalSubtitle: 'ウォレット', }, - addVirtualCardPersonalDetails: {title: 'Expensify カードを表示して利用を開始するには、ご自身の情報を追加してください。', subtitle: 'Expensify カード', cta: '追加'}, - enterSignerInfo: {title: '署名者情報が必要です', subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `銀行口座 ${bankAccountLastFour}`}, + addVirtualCardPersonalDetails: { + title: 'Expensify カードを表示して利用を開始するには、ご自身の情報を追加してください。', + subtitle: 'Expensify カード', + cta: '追加', + }, + enterSignerInfo: { + title: '署名者情報が必要です', + subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `銀行口座 ${bankAccountLastFour}`, + }, payOverdueInvoice: { cta: 'レビュー', dueSoonTitle: ({date}: {date: string}) => `サービス中断を防ぐため、${date}までに請求書をお支払いください`, @@ -1020,7 +1082,10 @@ const translations: TranslationDeepObject = { subtitle: ({date}: {date: string}) => `サブスクリプションは${date}に終了`, cta: '管理', }, - emailDeliveryFailure: {title: 'メール通知をお送りできません', subtitle: 'アカウント'}, + emailDeliveryFailure: { + title: 'メール通知をお送りできません', + subtitle: 'アカウント', + }, upgradeNetSuiteConnection: {title: 'NetSuite 接続をアップグレードする'}, }, forYouSection: { @@ -1089,7 +1154,10 @@ const translations: TranslationDeepObject = { hotelIn: ({destination}: {destination: string}) => `${destination}のホテル`, carRentalIn: ({destination}: {destination: string}) => `${destination}でのレンタカー`, inOneWeek: '1週間後', - inDays: () => ({one: '1日後', other: (count: number) => `${count}日後`}), + inDays: () => ({ + one: '1日後', + other: (count: number) => `${count}日後`, + }), today: '今日', }, freeTrialSection: { @@ -1156,7 +1224,10 @@ const translations: TranslationDeepObject = { emptyStateTitle: '最近の経費はありません', emptyStateMessage: '新規作成するか、レシートをここにドラッグしてください', }, - insightsSection: {chartUnavailable: 'グラフを表示できません', notEnoughData: 'このチャートを表示するためのデータがまだ十分にありません'}, + insightsSection: { + chartUnavailable: 'グラフを表示できません', + notEnoughData: 'このチャートを表示するためのデータがまだ十分にありません', + }, conciergePrompt: { goodMorning: ({name}: {name?: string}) => (name ? `${name}さん、おはようございます。` : 'おはようございます。'), goodAfternoon: ({name}: {name?: string}) => (name ? `${name}さん、こんにちは。` : 'こんにちは。'), @@ -1167,8 +1238,14 @@ const translations: TranslationDeepObject = { }, insightsPage: { viewOnSpend: '支出で表示', - emptyState: {title: '表示するものはありません', subtitle: '上の条件を調整してみてください'}, - noExpensesState: {title: 'お金の使い道を確認する', subtitle: '経費が登録されると、支出の傾向や上位の加盟店など、さまざまな情報を確認できるようになります。'}, + emptyState: { + title: '表示するものはありません', + subtitle: '上の条件を調整してみてください', + }, + noExpensesState: { + title: 'お金の使い道を確認する', + subtitle: '経費が登録されると、支出の傾向や上位の加盟店など、さまざまな情報を確認できるようになります。', + }, compare: { label: '比較', previousPeriod: '前の期間', @@ -2257,7 +2334,11 @@ const translations: TranslationDeepObject = { saved: '保存しました', }, }, - securityPage: {title: 'セキュリティ', subtitle: 'アカウントを安全に保ちます。', goToSecurity: 'セキュリティページに戻る'}, + securityPage: { + title: 'セキュリティ', + subtitle: 'アカウントを安全に保ちます。', + goToSecurity: 'セキュリティページに戻る', + }, shareCodePage: { title: 'あなたのコード', subtitle: '自分のQRコードや紹介リンクを共有して、メンバーをExpensifyに招待しましょう。', @@ -2370,8 +2451,14 @@ const translations: TranslationDeepObject = { testingPreferences: 'テスト設定', server: 'サーバー', servers: { - production: {label: '本番', description: '実際のユーザーが利用している環境'}, - staging: {label: 'ステージング', description: '本番のミラー。最終確認に使用します'}, + production: { + label: '本番', + description: '実際のユーザーが利用している環境', + }, + staging: { + label: 'ステージング', + description: '本番のミラー。最終確認に使用します', + }, qa: {label: 'QA', description: 'テストに使用する実験的な環境'}, }, serverPinnedDescription: 'このビルドは常に単一のサーバーに接続するため、ここでは変更できません。', @@ -2769,7 +2856,10 @@ const translations: TranslationDeepObject = { cardInactive: '非アクティブ', assignedCards: 'カード', assignedCardsDescription: '割り当てられたカードの取引は自動的に同期されます。', - addVirtualCardPersonalDetails: {subtitle: 'カードのご利用を開始するには、個人情報を入力してください', cta: '詳細を追加'}, + addVirtualCardPersonalDetails: { + subtitle: 'カードのご利用を開始するには、個人情報を入力してください', + cta: '詳細を追加', + }, expensifyCard: 'Expensify カード', walletActivationPending: 'お客様の情報を確認しています。数分後にもう一度ご確認ください。', walletActivationFailed: '申し訳ありませんが、現在はウォレットを有効にできません。詳しいサポートについてはConciergeにチャットでお問い合わせください。', @@ -2829,7 +2919,10 @@ const translations: TranslationDeepObject = { getStarted: '使い始める', headerTitle: 'グローバル払い戻し', }, - wiseGlobalReimbursementsBanner: {title: '世界中の人に支払いましょう', subtitle: 'USD アカウントでグローバル払い戻しを有効にします。'}, + wiseGlobalReimbursementsBanner: { + title: '世界中の人に支払いましょう', + subtitle: 'USD アカウントでグローバル払い戻しを有効にします。', + }, }, addCardToDigitalWallet: { title: ({walletName}: {walletName: string}) => `${walletName} にカードを追加`, @@ -3229,11 +3322,17 @@ ${date} の ${merchant} への ${amount}`, }, editAgentAvatarPage: {title: 'アバターを編集'}, editAgentNamePage: {title: '担当者名'}, - editAgentPromptPage: {title: 'カスタム手順を作成', error: {emptyPrompt: 'エージェントへの指示を入力してください。'}}, + editAgentPromptPage: { + title: 'カスタム手順を作成', + error: {emptyPrompt: 'エージェントへの指示を入力してください。'}, + }, expenseRulesPage: { title: '経費ルール', findRule: 'ルールを検索', - emptyRules: {title: 'まだルールがありません', subtitle: '経費レポートを自動化するルールを追加する'}, + emptyRules: { + title: 'まだルールがありません', + subtitle: '経費レポートを自動化するルールを追加する', + }, changes: { billableUpdate: (value: boolean) => `経費 ${value ? '請求可能' : '請求対象外'} を更新`, categoryUpdate: (value: string) => `カテゴリを「${value}」に更新`, @@ -3883,7 +3982,11 @@ ${integrationName === CONST.ONBOARDING_ACCOUNTING_MAPPING.other ? 'あなたの' detailsPage: { localTime: '現地時間', }, - newChatPage: {startGroup: 'グループを開始', addToGroup: 'グループに追加', addUserToGroup: (username: string) => `${username} をグループに追加`}, + newChatPage: { + startGroup: 'グループを開始', + addToGroup: 'グループに追加', + addUserToGroup: (username: string) => `${username} をグループに追加`, + }, yearPickerPage: { year: '年', selectYear: '年を選択してください', @@ -4717,7 +4820,12 @@ ${integrationName === CONST.ONBOARDING_ACCOUNTING_MAPPING.other ? 'あなたの' departs: '出発日時', errorMessage: '問題が発生しました。後でもう一度お試しください。', phoneError: (phoneErrorMethodsRoute: string) => `出張を予約するには、勤務先メールアドレスを主なログインとして追加してください。`, - domainSelector: {headline: 'どのドメインを設定しますか?', title: 'ドメイン', subtitle: 'Expensify Travel のセットアップ用ドメインを選択してください。', recommended: 'おすすめ'}, + domainSelector: { + headline: 'どのドメインを設定しますか?', + title: 'ドメイン', + subtitle: 'Expensify Travel のセットアップ用ドメインを選択してください。', + recommended: 'おすすめ', + }, workspaceAddress: {headline: '会社の住所は何ですか?'}, domainPermissionInfo: { title: 'ドメイン', @@ -5546,11 +5654,20 @@ ${integrationName === CONST.ONBOARDING_ACCOUNTING_MAPPING.other ? 'あなたの' [CONST.CERTINIA_EXPORT_DATE.REPORT_EXPORTED]: 'エクスポート日', }, }, - exportReimbursable: {label: '精算対象経費の書き出し形式', helperText: '払い戻し対象としてマークされた経費は、従業員宛ての未払請求書としてエクスポートされます。'}, - exportNonReimbursable: {label: '未払い精算の対象外経費を次の形式でエクスポートする'}, + exportReimbursable: { + label: '精算対象経費の書き出し形式', + helperText: '払い戻し対象としてマークされた経費は、従業員宛ての未払請求書としてエクスポートされます。', + }, + exportNonReimbursable: { + label: '未払い精算の対象外経費を次の形式でエクスポートする', + }, expenseReports: '経費レポート', - exportReimbursableExpenseReports: {helperText: '払い戻し対象としてマークされた経費は、従業員宛ての経費レポートとしてエクスポートされます。'}, - exportNonReimbursableExpenseReports: {helperText: '払い戻し対象外としてマークされた経費は、従業員宛ての経費レポートとしてエクスポートされます。'}, + exportReimbursableExpenseReports: { + helperText: '払い戻し対象としてマークされた経費は、従業員宛ての経費レポートとしてエクスポートされます。', + }, + exportNonReimbursableExpenseReports: { + helperText: '払い戻し対象外としてマークされた経費は、従業員宛ての経費レポートとしてエクスポートされます。', + }, noVendorsFound: 'ベンダーが見つかりませんでした', noVendorsFoundDescription: 'Certinia にベンダーを追加した後に、もう一度接続の同期を行ってください。', noCompaniesFound: '会社が見つかりませんでした', @@ -5580,7 +5697,12 @@ ${integrationName === CONST.ONBOARDING_ACCOUNTING_MAPPING.other ? 'あなたの' chartOfAccounts: '勘定科目表', chartOfAccountsDescription: '勘定科目表は、カテゴリとして Expensify にインポートされます。', dimensionMapping: ({n}: {n: number}) => `ディメンション ${n}`, - dimensions: {dimension1: 'ディメンション 1', dimension2: 'ディメンション 2', dimension3: 'ディメンション 3', dimension4: 'ディメンション4'}, + dimensions: { + dimension1: 'ディメンション 1', + dimension2: 'ディメンション 2', + dimension3: 'ディメンション 3', + dimension4: 'ディメンション4', + }, doNotMap: 'マッピングしない', doNotMapSubtitle: '従業員リソースをデフォルトで使用する', mappingTypes: { @@ -6036,7 +6158,14 @@ _詳しい手順については、[ヘルプサイトをご覧ください](${CO noAccountsFound: 'アカウントが見つかりません', noAccountsFoundDescription: 'Rillet で口座を追加して、もう一度同期してください', exportDescription: 'Expensify のデータを Rillet にエクスポートする方法を設定します。', - exportReimbursable: {label: '返金対象経費の書き出し形式', values: {[CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: {label: '仕入先請求書'}}}, + exportReimbursable: { + label: '返金対象経費の書き出し形式', + values: { + [CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: { + label: '仕入先請求書', + }, + }, + }, exportDate: { label: '仕入先の請求書日', description: 'レポートを Rillet にエクスポートするときは、この日付を使用します。', @@ -6055,9 +6184,22 @@ _詳しい手順については、[ヘルプサイトをご覧ください](${CO }, }, }, - exportNonReimbursable: {label: '会社カード経費のエクスポート形式', values: {[CONST.RILLET_EXPORT_NON_REIMBURSABLE.CREDIT_CARD_CHARGE]: {label: 'クレジットカード'}}}, - defaultCompanyCardVendor: {label: 'デフォルトの会社カードベンダー', description: '自動的に一致しない経費に使用する既定の Rillet ベンダーを選択してください。'}, - companyCardAccount: {label: '会社カード口座', description: '会社カード取引のエクスポート先を選択してください。'}, + exportNonReimbursable: { + label: '会社カード経費のエクスポート形式', + values: { + [CONST.RILLET_EXPORT_NON_REIMBURSABLE.CREDIT_CARD_CHARGE]: { + label: 'クレジットカード', + }, + }, + }, + defaultCompanyCardVendor: { + label: 'デフォルトの会社カードベンダー', + description: '自動的に一致しない経費に使用する既定の Rillet ベンダーを選択してください。', + }, + companyCardAccount: { + label: '会社カード口座', + description: '会社カード取引のエクスポート先を選択してください。', + }, noBankAccountsFound: '銀行口座が見つかりません', noBankAccountsFoundDescription: 'Rillet に銀行口座を追加して、もう一度接続を同期してください', autoSyncDescription: 'Rillet と Expensify を毎日自動で同期します。レポートはリアルタイムで同期されます。', @@ -6075,11 +6217,20 @@ _詳しい手順については、[ヘルプサイトをご覧ください](${CO }, syncReimbursedReports: '精算済みレポートを同期', syncReimbursedReportsDescription: 'レポートがACHで支払われると、この勘定科目に買掛金支払が生成されます。', - billPaymentAccount: {label: '請求支払用口座', description: '請求書の支払い元を選択すると、Rillet 内に支払いを作成します。'}, + billPaymentAccount: { + label: '請求支払用口座', + description: '請求書の支払い元を選択すると、Rillet 内に支払いを作成します。', + }, syncExpensifyCardSettlements: 'Expensify カードの清算を同期する', - settlementAccount: {label: 'Expensify カードの決済口座', description: '精算用の口座を選択すると、Rillet で支払いを作成します。'}, + settlementAccount: { + label: 'Expensify カードの決済口座', + description: '精算用の口座を選択すると、Rillet で支払いを作成します。', + }, syncTravelInvoicingSettlements: '統合トラベル請求の精算を同期', - travelInvoicingSettlementAccount: {label: 'コンソリデーテッド・トラベル・ビリングの決済口座', description: '精算用の口座を選択すると、Rillet で支払いを作成します。'}, + travelInvoicingSettlementAccount: { + label: 'コンソリデーテッド・トラベル・ビリングの決済口座', + description: '精算用の口座を選択すると、Rillet で支払いを作成します。', + }, exportToMultipleAccounts: '複数アカウントへのエクスポートを設定', cardProgramAccount: { label: 'カードプログラム口座', @@ -6219,15 +6370,24 @@ _詳しい手順については、[ヘルプサイトをご覧ください](${CO }, syncReimbursedReports: '精算済みレポートを同期', syncReimbursedReportsDescription: 'レポートが ACH 経由で支払われると、この勘定科目で支払伝票が作成されます。', - billPaymentAccount: {label: '請求支払口座', description: '請求書の支払元を選択すると、DualEntry 内に支払いを作成します。'}, + billPaymentAccount: { + label: '請求支払口座', + description: '請求書の支払元を選択すると、DualEntry 内に支払いを作成します。', + }, fxExpenseAccount: { label: 'DualEntry 通貨換算手数料勘定', description: '海外で行われた支払いについて、会社が為替換算コストを負担する場合、そのコストは仕訳として DualEntry のこの勘定科目に計上します。', }, syncExpensifyCardSettlements: 'Expensify カードの清算を同期', - settlementAccount: {label: 'Expensify カードの決済口座', description: '精算口座を選択すると、DualEntry で支払いを作成します。'}, + settlementAccount: { + label: 'Expensify カードの決済口座', + description: '精算口座を選択すると、DualEntry で支払いを作成します。', + }, syncTravelInvoicingSettlements: '一括旅行請求の精算を同期', - travelInvoicingSettlementAccount: {label: '統合トラベル請求の決済口座', description: '精算口座を選択すると、DualEntry で支払いを作成します。'}, + travelInvoicingSettlementAccount: { + label: '統合トラベル請求の決済口座', + description: '精算口座を選択すると、DualEntry で支払いを作成します。', + }, travelInvoicingPayableAccount: {label: '統合トラベル請求買掛金勘定'}, }, type: { @@ -6369,13 +6529,28 @@ _詳しい手順については、[ヘルプサイトをご覧ください](${CO cardIdentityColumn: '取引をカードに照合できるように、カード番号またはカード名を対応付けてください。', }, fileImportDescription: '銀行からフィードを送信できない場合の手動オプションです。', - duplicateFeedModal: {title: 'カードフィードはすでに接続されています', prompt: '同じカードフィードを同じワークスペースに二重に追加することはできません。'}, + duplicateFeedModal: { + title: 'カードフィードはすでに接続されています', + prompt: '同じカードフィードを同じワークスペースに二重に追加することはできません。', + }, }, statementCloseDate: { [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: '月末最終日', [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: '月末最終営業日', [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'カスタム日付(毎月)', }, + reimbursable: { + title: '精算対象', + description: 'カード取引の作成方法を選択してください。新しい取引にはこのルールが適用されます。', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES]: '常に精算対象', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES}Description`]: '常に従業員に払い戻されます', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO]: '常に精算対象外', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO}Description`]: '従業員に払い戻されることはありません', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES]: '精算対象', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES}Description`]: '多くの場合、従業員に払い戻されます', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO]: '精算対象外', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO}Description`]: 'まれに従業員に払い戻されます', + }, assign: '割り当て', assignCard: 'カードを割り当てる', findCompanyCard: '会社カードを探す', @@ -6422,7 +6597,10 @@ _詳しい手順については、[ヘルプサイトをご覧ください](${CO importButton: '取引をインポート', }, deletedCard: '削除されたカード', - assignNewCards: {title: '新しいカードを割り当てる', description: '銀行から割り当て可能な最新のカードを取得します'}, + assignNewCards: { + title: '新しいカードを割り当てる', + description: '銀行から割り当て可能な最新のカードを取得します', + }, }, expensifyCard: { issueAndManageCards: 'Expensify カードを発行して管理する', @@ -6612,9 +6790,16 @@ _詳しい手順については、[ヘルプサイトをご覧ください](${CO subtitle: '現在、Expensify Travel の有効化リクエストを確認中です。準備が整い次第、お知らせしますのでご安心ください。', ctaText: 'リクエストを送信しました', }, - bookOrManageYourTrip: {title: '出張予約', subtitle: 'おめでとうございます!このワークスペースで旅行の予約と管理を行う準備が整いました。', ctaText: '出張を管理'}, + bookOrManageYourTrip: { + title: '出張予約', + subtitle: 'おめでとうございます!このワークスペースで旅行の予約と管理を行う準備が整いました。', + ctaText: '出張を管理', + }, settings: { - autoAddTripName: {title: '経費に出張名を追加', subtitle: 'Expensifyで予約した出張について、経費の説明に出張名を自動的に追加します。'}, + autoAddTripName: { + title: '経費に出張名を追加', + subtitle: 'Expensifyで予約した出張について、経費の説明に出張名を自動的に追加します。', + }, codingSync: { title: 'コーディングを Expensify Travel と同期する', subtitle: 'このワークスペースのカテゴリ、タグ、レポートフィールドを Expensify Travel にプッシュして、出張者が予約時にそれらに回答できるようにします。', @@ -6658,7 +6843,11 @@ _詳しい手順については、[ヘルプサイトをご覧ください](${CO body: '今後のホテルおよびレンタカーの予約は、キャンセルを避けるために別のお支払い方法で再予約する必要がある場合があります。', confirm: 'オフにする', }, - outstandingBalanceModal: {title: '統合トラベル請求をオフにできません', body: '未清算の出張残高があります。先に残高を精算してください。', confirm: '了解しました'}, + outstandingBalanceModal: { + title: '統合トラベル請求をオフにできません', + body: '未清算の出張残高があります。先に残高を精算してください。', + confirm: '了解しました', + }, payBalanceModal: { title: (amount: string) => `残高 ${amount} を支払いますか?`, body: '支払いはキューに追加され、その後まもなく処理されます。この操作は一度開始すると元に戻すことはできません。', @@ -6841,7 +7030,9 @@ _詳しい手順については、[ヘルプサイトをご覧ください](${CO subtitle: '時間追跡用の請求可能な時間単価を設定します。', defaultHourlyRate: 'デフォルトの時給率', }, - hrWarningModal: {disconnectText: ({integration}: {integration: string}) => `HR を無効にするには、まずこのワークスペースから ${integration} を切断してください。`}, + hrWarningModal: { + disconnectText: ({integration}: {integration: string}) => `HR を無効にするには、まずこのワークスペースから ${integration} を切断してください。`, + }, vendors: { title: 'ベンダー', subtitle: '会計ソフトからインポートした取引先にカード経費を照合します。', @@ -6872,7 +7063,10 @@ _詳しい手順については、[ヘルプサイトをご覧ください](${CO findReportField: 'レポート項目を検索', deleteConfirmation: 'このレポートフィールドを削除してもよろしいですか?', deleteFieldsConfirmation: 'これらのレポートフィールドを削除してもよろしいですか?', - emptyReportFields: {title: 'レポート項目はまだありません', subtitle: 'レポートに表示されるカスタムフィールド(テキスト、日付、またはドロップダウン)を追加する。'}, + emptyReportFields: { + title: 'レポート項目はまだありません', + subtitle: 'レポートに表示されるカスタムフィールド(テキスト、日付、またはドロップダウン)を追加する。', + }, subtitle: 'レポートフィールドはすべての支出に適用され、追加情報の入力を促したい場合に便利です。', disableReportFields: 'レポート項目を無効にする', disableReportFieldsConfirmation: '本当に実行しますか?テキストと日付フィールドは削除され、リストは無効になります。', @@ -6897,7 +7091,10 @@ _詳しい手順については、[ヘルプサイトをご覧ください](${CO disableValues: '値を無効にする', enableValue: '値を有効にする', enableValues: '値を有効化', - emptyReportFieldsValues: {title: 'まだリストの値がありません', subtitle: 'レポートに表示するカスタム値を追加します。'}, + emptyReportFieldsValues: { + title: 'まだリストの値がありません', + subtitle: 'レポートに表示するカスタム値を追加します。', + }, deleteValuePrompt: 'このリスト値を削除してもよろしいですか?', deleteValuesPrompt: 'これらのリスト値を削除してもよろしいですか?', listValueRequiredError: 'リスト値の名前を入力してください', @@ -7236,10 +7433,16 @@ Control プランは、アクティブメンバー1人あたり月額 $9 から auditors: '監査担当者', guests: 'ゲスト', editors: '編集者', - emptyRoleFilter: {title: 'このフィルターに一致するメンバーはいません', subtitle: 'メンバーを招待するか、上のフィルターを変更してください。'}, + emptyRoleFilter: { + title: 'このフィルターに一致するメンバーはいません', + subtitle: 'メンバーを招待するか、上のフィルターを変更してください。', + }, configureHRSync: (providerName: string) => `${providerName} の同期を設定します。`, syncWithHR: (providerName: string) => `${providerName}と同期`, - makeCardAdmin: () => ({one: 'カード管理者にする', other: 'カード管理者に設定'}), + makeCardAdmin: () => ({ + one: 'カード管理者にする', + other: 'カード管理者に設定', + }), cardAdmins: 'カード管理者', peopleAdmins: 'People 管理者', paymentsAdmins: '支払い管理者', @@ -7730,7 +7933,11 @@ Control プランは、アクティブメンバー1人あたり月額 $9 から promptEnd: 'でオフィスの住所を追加してください。', cta: '了解です', }, - errors: {distanceMustBePositive: '距離は正の整数で入力してください。', invalidAddress: '有効な住所を入力してください', distanceTooLarge: '距離が大きすぎます。'}, + errors: { + distanceMustBePositive: '距離は正の整数で入力してください。', + invalidAddress: '有効な住所を入力してください', + distanceTooLarge: '距離が大きすぎます。', + }, workArrangement: { title: 'デフォルトの勤務形態', officeBasedTitle: 'オフィス勤務', @@ -7748,7 +7955,10 @@ Control プランは、アクティブメンバー1人あたり月額 $9 から }, distance: '距離', centrallyManage: '料金を一元管理し、マイルまたはキロメートルで追跡し、デフォルトのカテゴリを設定できます。', - emptyRates: {title: '距離レートはまだありません', subtitle: 'カスタムレートで走行距離を精算するためのレートを追加します。'}, + emptyRates: { + title: '距離レートはまだありません', + subtitle: 'カスタムレートで走行距離を精算するためのレートを追加します。', + }, rate: '評価', addRate: 'レートを追加', findRate: 'レートを検索', @@ -8722,7 +8932,12 @@ ${reportName}`, emptyAmountError: '保存する前に有効な金額を入力してください', receiptAmountGreaterThanItemizedError: '領収書の必須金額は、明細付き領収書の必須金額を超えることはできません。', }, - requireFields: {title: 'すべての経費に必須項目を設定する', category: 'カテゴリ', tag: 'タグ', save: 'ルールを保存'}, + requireFields: { + title: 'すべての経費に必須項目を設定する', + category: 'カテゴリ', + tag: 'タグ', + save: 'ルールを保存', + }, newRule: { title: '新しいルール', subtitle: '何をしたいですか?', @@ -8770,7 +8985,11 @@ ${reportName}`, merchantTypeIs: (merchantType: string) => `加盟店タイプ: 「${merchantType}」`, categoryIs: (category: string) => `カテゴリは「${category}」です`, }, - merchantTypeRule: {merchantType: '加盟店種別', saveRule: 'ルールを保存', confirmErrorCategory: 'カテゴリを選択してください。'}, + merchantTypeRule: { + merchantType: '加盟店種別', + saveRule: 'ルールを保存', + confirmErrorCategory: 'カテゴリを選択してください。', + }, requireFieldsTable: { tableColumnType: '種類', tableColumnCondition: '条件', @@ -8832,8 +9051,15 @@ ${reportName}`, flagTypeWarning: '警告', flagTypeWarningDescription: '申請者には警告されますが、経費を提出することは可能です', }, - agentRulesEmptyState: {title: 'エージェントルールが追加されていません', subtitle: 'ワークスペースのポリシーを自動化するルールを作成します。', cta: 'AIルールを追加'}, - categoriesDisabledEmptyState: {title: 'カテゴリが有効になっていません', subtitle: 'カテゴリを有効にして、支出をより細かく管理しましょう。'}, + agentRulesEmptyState: { + title: 'エージェントルールが追加されていません', + subtitle: 'ワークスペースのポリシーを自動化するルールを作成します。', + cta: 'AIルールを追加', + }, + categoriesDisabledEmptyState: { + title: 'カテゴリが有効になっていません', + subtitle: 'カテゴリを有効にして、支出をより細かく管理しましょう。', + }, expenseDefaultType: { title: '経費のデフォルトを適用', subtitle: 'このルールは何に一致させますか?', @@ -8842,7 +9068,11 @@ ${reportName}`, category: 'カテゴリ', categoryDescription: '特定のカテゴリにデフォルトの税率を設定する', }, - taxesDisabledEmptyState: {title: '税金は有効になっていません', subtitle: '税金を有効にして、対象となる税金を記録し還付請求できるようにします。', cta: '税金を有効にする'}, + taxesDisabledEmptyState: { + title: '税金は有効になっていません', + subtitle: '税金を有効にして、対象となる税金を記録し還付請求できるようにします。', + cta: '税金を有効にする', + }, }, planTypePage: { planTypes: { @@ -8942,7 +9172,11 @@ ${reportName}`, dontSeeYourATS: `ご利用のATSが見つかりませんか?Concierge にお問い合わせいただければ、追加できます。`, importSettings: 'インポート設定', defaultApprover: 'デフォルト承認者', - approverFields: {recruiter: '採用担当者', recruitingCoordinator: '採用コーディネーター', hiringManager: '採用マネージャー'}, + approverFields: { + recruiter: '採用担当者', + recruitingCoordinator: '採用コーディネーター', + hiringManager: '採用マネージャー', + }, filters: { description: (providerName: string) => `${providerName} からインポートするメンバーを選択してください。採用ステージ、タグ、オフィスから選択できます。`, stages: { @@ -8957,7 +9191,12 @@ ${reportName}`, toggleTitle: 'タグ', allSelected: 'すべてのタグ', }, - offices: {title: 'オフィス', description: 'このワークスペースと同期したい候補者のオフィスを選択してください', toggleTitle: 'オフィス', allSelected: 'すべてのオフィス'}, + offices: { + title: 'オフィス', + description: 'このワークスペースと同期したい候補者のオフィスを選択してください', + toggleTitle: 'オフィス', + allSelected: 'すべてのオフィス', + }, enableJobStagesOrTags: '続行するには、少なくとも 1 つのジョブのステージまたはタグを選択してください', }, subtitle: '採用ツールを連携して、候補者の承認を常に同期させます。', @@ -9015,7 +9254,10 @@ ${reportName}`, approvalModeWarningConfirm: '承認モードを変更', syncingModalTitle: '接続を同期しています', syncingModalDescription: '最初の接続には時間がかかる場合があります。エラーが発生した場合は通知されます。', - syncLimitReached: {title: '明日もう一度お試しください', prompt: '本日の同期上限に達しました。'}, + syncLimitReached: { + title: '明日もう一度お試しください', + prompt: '本日の同期上限に達しました。', + }, syncResults: { title: (provider: string) => `${provider} の同期が完了しました`, successTitle: (provider: string) => `${provider} の接続が正常に同期されました!`, @@ -9045,19 +9287,40 @@ ${reportName}`, enableNewAccountsDescription: '新しい Campfire アカウントは、カテゴリーとして利用できるようになります。', dimensionsImport: 'すべての Campfire ディメンションがタグとしてインポートされます', exportDescription: 'Expensify のデータを Campfire へエクスポートする方法を設定します。', - exportReimbursable: {label: '精算対象の経費を書き出す形式', values: {VENDOR_BILL: {label: '仕入先請求書'}}}, + exportReimbursable: { + label: '精算対象の経費を書き出す形式', + values: {VENDOR_BILL: {label: '仕入先請求書'}}, + }, exportDate: { label: '仕入先請求書の日付', description: 'Campfire にレポートをエクスポートするときは、この日付を使用します。', values: { - LAST_EXPENSE: {label: '最終経費日', description: 'レポート内の最新経費の日付です。'}, - REPORT_EXPORTED: {label: 'エクスポート日', description: 'レポートが Campfire にエクスポートされた日付です。'}, - REPORT_SUBMITTED: {label: '提出日', description: 'レポートが承認申請に提出された日付です。'}, + LAST_EXPENSE: { + label: '最終経費日', + description: 'レポート内の最新経費の日付です。', + }, + REPORT_EXPORTED: { + label: 'エクスポート日', + description: 'レポートが Campfire にエクスポートされた日付です。', + }, + REPORT_SUBMITTED: { + label: '提出日', + description: 'レポートが承認申請に提出された日付です。', + }, }, }, - exportNonReimbursable: {label: '会社カード経費のエクスポート形式', values: {JOURNAL_ENTRY: {label: '仕訳伝票'}}}, - defaultCompanyCardVendor: {label: '全社カードのデフォルトベンダー', description: '自動で一致しない経費に使用するデフォルトの Campfire ベンダーを選択してください。'}, - companyCardAccount: {label: '法人カード口座', description: '会社カード取引のエクスポート先を選択します。'}, + exportNonReimbursable: { + label: '会社カード経費のエクスポート形式', + values: {JOURNAL_ENTRY: {label: '仕訳伝票'}}, + }, + defaultCompanyCardVendor: { + label: '全社カードのデフォルトベンダー', + description: '自動で一致しない経費に使用するデフォルトの Campfire ベンダーを選択してください。', + }, + companyCardAccount: { + label: '法人カード口座', + description: '会社カード取引のエクスポート先を選択します。', + }, noAccountsFound: 'アカウントが見つかりません', noAccountsFoundDescription: 'Campfire に口座を追加して、もう一度同期してください', autoSyncDescription: 'Campfire と Expensify を毎日自動で同期します。レポートはリアルタイムで同期されます。', @@ -9075,11 +9338,20 @@ ${reportName}`, }, syncReimbursedReports: '精算済みレポートを同期', syncReimbursedReportsDescription: 'レポートが ACH で支払われると、この口座に支払伝票が作成されます。', - billPaymentAccount: {label: '支払口座', description: 'Expensify が請求書を支払済みとしてマークしたときに、Campfire クレジット用のクリアリング勘定科目を選択します。'}, + billPaymentAccount: { + label: '支払口座', + description: 'Expensify が請求書を支払済みとしてマークしたときに、Campfire クレジット用のクリアリング勘定科目を選択します。', + }, syncExpensifyCardSettlements: 'Expensify カード清算を同期する', - settlementAccount: {label: 'Expensify カードの決済口座', description: '精算に使う口座を選択してください。選択された口座で、Campfire に支払いを作成します。'}, + settlementAccount: { + label: 'Expensify カードの決済口座', + description: '精算に使う口座を選択してください。選択された口座で、Campfire に支払いを作成します。', + }, syncTravelInvoicingSettlements: '一括旅行請求の精算を同期', - travelInvoicingSettlementAccount: {label: '統合トラベル請求の決済口座', description: '精算に使う口座を選択してください。選択された口座で、Campfire に支払いを作成します。'}, + travelInvoicingSettlementAccount: { + label: '統合トラベル請求の決済口座', + description: '精算に使う口座を選択してください。選択された口座で、Campfire に支払いを作成します。', + }, travelInvoicingPayableAccount: {label: '統合トラベル請求買掛金勘定'}, exportToMultipleAccounts: '複数の勘定科目へのエクスポートを設定する', cardProgramAccount: { @@ -9208,7 +9480,10 @@ ${reportName}`, exportToNextOpenPeriodDescription: 'レポートの日付が Dynamics 365 Business Central の締め済み期間にある場合、次の未締め期間にエクスポートします。', syncReimbursedReports: '精算済みレポートを同期', syncReimbursedReportsDescription: 'レポートが ACH で支払われると、この勘定科目に総勘定元帳の仕訳行が作成されます。', - reimbursementBankAccount: {label: '支払用銀行口座', description: '請求書の支払い元を選択すると、Dynamics 365 Business Central 内に支払いを作成します。'}, + reimbursementBankAccount: { + label: '支払用銀行口座', + description: '請求書の支払い元を選択すると、Dynamics 365 Business Central 内に支払いを作成します。', + }, syncExpensifyCardSettlements: 'Expensify カード清算を同期する', settlementsBankAccount: { label: 'Expensify カードの決済口座', @@ -9714,7 +9989,11 @@ ${reportName}`, commuterExclusions: { changedToFixedDistance: ({previousMethod}: {previousMethod: string}) => `通勤分の除外方法を、申請ごとの固定距離に変更しました(以前は${previousMethod})。`, changedToHomeAndOffice: ({previousMethod}: {previousMethod: string}) => `「通勤を除外」の計算方法を自宅とオフィスに基づいて行うよう変更しました(以前の方法:${previousMethod})`, - previousMethod: {disabled: '通勤を除外しないでください', fixedDistance: '申請ごとの固定距離', homeAndOffice: '自宅とオフィス'}, + previousMethod: { + disabled: '通勤を除外しないでください', + fixedDistance: '申請ごとの固定距離', + homeAndOffice: '自宅とオフィス', + }, setFixedDistance: ({formattedDistance}: {formattedDistance: string}) => `請求ごとに固定距離の除外を ${formattedDistance} に設定します`, changedFixedDistance: ({formattedOldDistance, formattedNewDistance}: {formattedOldDistance: string; formattedNewDistance: string}) => `1件あたりの固定距離控除を${formattedNewDistance}に変更しました(以前は${formattedOldDistance})`, @@ -9766,6 +10045,8 @@ ${reportName}`, updatedMccGroupCategory: ({mccGroupName, oldCategory, newCategory}: {mccGroupName: string; oldCategory: string; newCategory: string}) => `「${mccGroupName}」のデフォルト支出カテゴリーを「${newCategory}」に変更しました(以前は「${oldCategory}」)`, updatedRequireCompanyCards: ({enabled}: {enabled: boolean}) => `${enabled ? '有効' : '無効'} の法人カード購入要件`, + updatedCardFeedReimbursable: (feedName: string, newValue?: string, previousValue?: string) => + `カードフィードの精算設定を変更しました "${feedName}"${newValue ? ` 変更後 "${newValue}"` : ''}${previousValue ? ` (変更前 "${previousValue}")` : ''}`, agentRule: { added: ({title, prompt}: {title: string; prompt: string}) => (title ? `エージェントルール「${title}」を追加しました:${prompt}` : `エージェントルールを追加しました:${prompt}`), updated: ({title, prompt}: {title: string; prompt: string}) => @@ -9803,7 +10084,13 @@ ${reportName}`, one: '追加で 1 枚のカードに支出ルールを適用しました', other: `追加で ${count} 枚のカードに支出ルールを適用しました`, }), - phraseVerb: {added: '追加しました', removed: '削除済み', changed: '変更しました', set: '設定', applied: '適用済み'}, + phraseVerb: { + added: '追加しました', + removed: '削除済み', + changed: '変更しました', + set: '設定', + applied: '適用済み', + }, bodyMerchant: ({adjective, value}: {adjective: string; value: string}) => (adjective !== '' ? `${adjective}なマーチャント「${value}」` : `加盟店「${value}」`), bodyMerchantValueOnly: ({value}: {value: string}) => `「${value}」`, bodyMerchantChange: ({adjective, oldValue, newValue}: {adjective: string; oldValue: string; newValue: string}) => @@ -10039,7 +10326,11 @@ ${reportName}`, subtitleCannotSend: '請求書を送信するには、Invoicesが有効なワークスペースが必要です。', subtitleCannotSendWithTestDrive: '請求書を送信するには、Invoicesが有効なワークスペースが必要です。Expensify を試用してさらに詳しく知りましょう。', }, - emptyTripResults: {title: 'まだ出張はありません', subtitle: 'まずは、下から最初の出張を予約しましょう。', buttonText: '出張を予約'}, + emptyTripResults: { + title: 'まだ出張はありません', + subtitle: 'まずは、下から最初の出張を予約しましょう。', + buttonText: '出張を予約', + }, emptySubmitResults: { title: '提出できる経費はありません', subtitle: 'すべて完了しました。勝利の一周をしてきましょう!', @@ -10068,7 +10359,11 @@ ${reportName}`, title: '承認する経費はありません', subtitle: '経費はゼロ。リラックス度マックス。お見事です!', }, - staleResults: {title: '再読み込みが必要です', subtitle: 'このページは古くなっています。最新の情報を見るには再読み込みしてください。', buttonText: '更新'}, + staleResults: { + title: '再読み込みが必要です', + subtitle: 'このページは古くなっています。最新の情報を見るには再読み込みしてください。', + buttonText: '更新', + }, }, columns: '列', editColumns: '列の編集', @@ -10165,8 +10460,15 @@ ${reportName}`, cardFeedNameCSV: ({cardFeedLabel}: {cardFeedLabel?: string}) => `すべてのCSVインポート済みカード${cardFeedLabel ? ` - ${cardFeedLabel}` : ''}`, travelInvoicing: '出張費の一括請求', }, - bankAccount: {banks: '銀行口座', closedBankAccounts: '解約済み銀行口座'}, - workspace: {active: 'アクティブ', archived: 'アーカイブ済み', selectAll: 'すべて選択'}, + bankAccount: { + banks: '銀行口座', + closedBankAccounts: '解約済み銀行口座', + }, + workspace: { + active: 'アクティブ', + archived: 'アーカイブ済み', + selectAll: 'すべて選択', + }, reportField: (name: string, value: string) => `${name} は ${value} です`, current: '現在', past: '過去', @@ -10209,14 +10511,21 @@ ${reportName}`, [CONST.SEARCH.WITHDRAWAL_TYPE.TRAVEL_BILLING]: '出張費の一括請求', }, is: 'は', - has: {submittedViolation: '違反を送信しました', approvedViolation: '承認済みの違反'}, + has: { + submittedViolation: '違反を送信しました', + approvedViolation: '承認済みの違反', + }, action: { [CONST.SEARCH.ACTION_FILTERS.SUBMIT]: '送信', [CONST.SEARCH.ACTION_FILTERS.APPROVE]: '承認', [CONST.SEARCH.ACTION_FILTERS.PAY]: '支払う', [CONST.SEARCH.ACTION_FILTERS.EXPORT]: 'エクスポート', }, - filterType: {label: 'フィルタータイプ', has: {positive: '持っています', negative: '持っていません'}, is: {positive: 'は', negative: 'ではありません'}}, + filterType: { + label: 'フィルタータイプ', + has: {positive: '持っています', negative: '持っていません'}, + is: {positive: 'は', negative: 'ではありません'}, + }, merchant: { matchType: 'マッチタイプ', contains: (merchant?: string) => (merchant ? `"${merchant}"を含む` : '含む'), @@ -10239,7 +10548,13 @@ ${reportName}`, limitResults: '結果の絞り込み', }, has: '持っている', - view: {label: '表示', table: 'テーブル', bar: 'バー', line: '折れ線', pie: '円グラフ'}, + view: { + label: '表示', + table: 'テーブル', + bar: 'バー', + line: '折れ線', + pie: '円グラフ', + }, chartTitles: { [CONST.SEARCH.GROUP_BY.FROM]: '差出人', [CONST.SEARCH.GROUP_BY.CARD]: 'カード', @@ -10253,7 +10568,10 @@ ${reportName}`, [CONST.SEARCH.GROUP_BY.YEAR]: '年数', [CONST.SEARCH.GROUP_BY.QUARTER]: '四半期', }, - moneyRequestReport: {emptyStateTitle: 'まだ経費がありません', accessPlaceHolder: '詳細を開く'}, + moneyRequestReport: { + emptyStateTitle: 'まだ経費がありません', + accessPlaceHolder: '詳細を開く', + }, noCategory: 'カテゴリなし', noMerchant: '店舗なし', noTag: 'タグなし', @@ -10289,7 +10607,11 @@ ${reportName}`, description: 'おっと、アイテムがたくさんありますね!まとめて整理して、間もなくConciergeからファイルをお送りします。', }, exportedTo: 'エクスポート先', - exportAll: {selectAllMatchingItems: '一致する項目をすべて選択', allMatchingItemsSelected: '一致する項目をすべて選択済み', selectAllOnThisPage: 'このページのすべてを選択'}, + exportAll: { + selectAllMatchingItems: '一致する項目をすべて選択', + allMatchingItemsSelected: '一致する項目をすべて選択済み', + selectAllOnThisPage: 'このページのすべてを選択', + }, errors: { pleaseSelectDatesForBothFromAndTo: '開始日と終了日の両方を選択してください', }, @@ -10318,7 +10640,10 @@ ${reportName}`, mergeReports: { title: 'レポートをマージする', description: '保持するレポートを選択してください。すべての経費はそのレポートに移動され、他のレポートは削除されます。', - listPage: {noEligibleReportsFound: '対象となるレポートが見つかりませんでした', noEligibleReportsFoundSubtitle: 'マージできるレポートがありません。'}, + listPage: { + noEligibleReportsFound: '対象となるレポートが見つかりませんでした', + noEligibleReportsFoundSubtitle: 'マージできるレポートがありません。', + }, }, periodSoFar: ({period}: {period: string}) => `これまでの${period}`, weekOf: ({date}: {date: string}) => `${date} の週`, @@ -10355,11 +10680,21 @@ ${reportName}`, }, }, settlement: { - status: {pending: '保留中', cleared: '支払済み', failed: '失敗しました', never: 'なし', cashBack: 'キャッシュバック'}, + status: { + pending: '保留中', + cleared: '支払済み', + failed: '失敗しました', + never: 'なし', + cashBack: 'キャッシュバック', + }, failedError: ({link}: {link: string}) => `アカウントのロックを解除すると、この精算を再試行します。`, withdrawalInfo: ({date, withdrawalID}: {date: string; withdrawalID: number}) => `${date}・出金 ID:${withdrawalID}`, }, - paidStatus: {markedAsPaid: '支払い済みにマークしました', withdrawing: '出金中', confirmed: '確認済み'}, + paidStatus: { + markedAsPaid: '支払い済みにマークしました', + withdrawing: '出金中', + confirmed: '確認済み', + }, reportLayout: { reportLayout: 'レポートレイアウト', groupByLabel: 'グループ化基準:', @@ -10802,14 +11137,23 @@ ${reportName}`, prompt: 'GPS追跡を停止して、Expensify Classic に切り替えてもよろしいですか?', confirm: '停止して切り替える', }, - switchAccountWarningTripInProgress: {title: 'GPS トラッキングを実行中です', prompt: 'GPS 追跡を停止してアカウントを切り替えてもよろしいですか?', confirm: '停止して切り替える'}, + switchAccountWarningTripInProgress: { + title: 'GPS トラッキングを実行中です', + prompt: 'GPS 追跡を停止してアカウントを切り替えてもよろしいですか?', + confirm: '停止して切り替える', + }, locationServicesRequiredModal: { title: '位置情報へのアクセスが必要です', confirm: '設定を開く', prompt: 'GPSで距離の追跡を開始するには、端末の設定で位置情報へのアクセスを許可してください。', }, gpsFloatingPillText: 'GPS 追跡を実行中です…', - liveActivity: {subtitle: '距離の記録', button: '進捗を表示', lockScreenBadgeText: '距離', lockScreenTrackingText: '追跡中…'}, + liveActivity: { + subtitle: '距離の記録', + button: '進捗を表示', + lockScreenBadgeText: '距離', + lockScreenTrackingText: '追跡中…', + }, }, reportCardLostOrDamaged: { screenTitle: '成績表の紛失または破損', @@ -11010,7 +11354,11 @@ ${reportName}`, markAsCashToIgnore: '現金としてマークして無視し、支払いをリクエストします。', smartscanFailed: ({canEdit = true, missingFields = []}: {canEdit?: boolean; missingFields?: string[]}) => { if (missingFields.length > 0) { - const fieldNames: Record = {merchant: '加盟店', date: '日付', amount: '金額'}; + const fieldNames: Record = { + merchant: '加盟店', + date: '日付', + amount: '金額', + }; const translated = missingFields.map((f) => fieldNames[f] ?? f); const fieldList = translated.join('、'); return `レシートのスキャンに失敗しました — ${fieldList}が見つかりません。${canEdit ? '詳細を手動で入力してください。' : ''}`; @@ -11280,7 +11628,10 @@ ${reportName}`, onboardingChatTitle: (discountType: number) => `期間限定オファー:初年度が${discountType}%オフ!`, subtitle: (days: number, hours: number, minutes: number, seconds: number) => `${days > 0 ? `${days}日:` : ''}${hours}時間以内に請求:${minutes}分:${seconds}秒`, }, - travelInvoiceOverdue: {title: '出張請求書のお支払い期限が過ぎています', subtitle: (date: string) => `${date}までに旅行の請求書を支払って、旅行の予約を続けてください。`}, + travelInvoiceOverdue: { + title: '出張請求書のお支払い期限が過ぎています', + subtitle: (date: string) => `${date}までに旅行の請求書を支払って、旅行の予約を続けてください。`, + }, travelInvoiceOverdueLocked: { title: '出張予約は一時停止されています', subtitle: '旅行の請求書のお支払い期限が過ぎています。お支払いを完了して、再度旅行の予約を開始してください。', @@ -11413,7 +11764,14 @@ ${reportName}`, one: 'アクティブユーザー 1 人', other: `アクティブユーザー ${count} 名`, }), - state: {paid: '支払い済み', cleared: '決済済み', failed: '失敗しました', refunded: '返金済み', disputed: '異議あり', balanceTransfer: '残高振替'}, + state: { + paid: '支払い済み', + cleared: '決済済み', + failed: '失敗しました', + refunded: '返金済み', + disputed: '異議あり', + balanceTransfer: '残高振替', + }, details: '支払いの詳細', badge: { balanceTransferTo: ({email}: {email: string}) => `${email} への残高振替`, @@ -11880,7 +12238,10 @@ ${reportName}`, other: 'アカウントを閉じる', }), closeAccountPrompt: '本当によろしいですか?この操作は元に戻せません。', - forceCloseAccount: () => ({one: 'アカウントを強制的に閉鎖', other: 'アカウントを強制的に閉鎖'}), + forceCloseAccount: () => ({ + one: 'アカウントを強制的に閉鎖', + other: 'アカウントを強制的に閉鎖', + }), safeCloseAccount: () => ({ one: 'アカウントを安全に閉じる', other: 'アカウントを安全に閉じる', @@ -11901,7 +12262,10 @@ ${reportName}`, reportSuspiciousActivityPrompt: (email: string) => `本当によろしいですか?これにより、${email} さんのアカウントがロックされます。

その後、当社のチームがアカウントを確認し、不正アクセスを削除します。アクセスを回復するには、Concierge と連携して対応してもらう必要があります。`, reportSuspiciousActivityConfirmationPrompt: 'アカウントが安全にロック解除できることを確認するために審査し、質問がある場合はConciergeを通じてご連絡します。', - emptyMembers: {title: 'このグループにはメンバーがいません', subtitle: 'メンバーを追加するか、上のフィルターを変更してみてください。'}, + emptyMembers: { + title: 'このグループにはメンバーがいません', + subtitle: 'メンバーを追加するか、上のフィルターを変更してみてください。', + }, moveToGroup: 'グループへ移動', chooseWhereToMove: ({count}: {count: number}) => ({ one: `${count} 人のメンバーを移動する先を選択してください。`, @@ -11930,7 +12294,10 @@ ${reportName}`, }, groups: { title: 'グループ', - memberCount: () => ({one: 'メンバー 1 人', other: (count: number) => `${count}名のメンバー`}), + memberCount: () => ({ + one: 'メンバー 1 人', + other: (count: number) => `${count}名のメンバー`, + }), defaultGroup: '新しいメンバーのデフォルトグループ', defaultGroupPrompt: (currentName: string, newName: string) => `本当に ${newName} をデフォルトグループに設定しますか?新しいメンバーは、以前のデフォルトグループ (${currentName}) ではなく、このグループに招待されます。`, @@ -12021,6 +12388,10 @@ ${reportName}`, mobileRenewPrompt: '早期に更新するには、ウェブブラウザで Expensify にアクセスしてください。', mobileClaimPrompt: '更新割引を受け取るには、Web ブラウザで Expensify にアクセスしてください。', }, - bulkActionBar: {label: '一括操作', clearSelection: '選択をクリア', loadingSelection: '選択内容を読み込み中'}, + bulkActionBar: { + label: '一括操作', + clearSelection: '選択をクリア', + loadingSelection: '選択内容を読み込み中', + }, }; export default translations; diff --git a/src/languages/localeOrdinalMap.ts b/src/languages/localeOrdinalMap.ts index 4eecc665dd7c..9e5741353022 100644 --- a/src/languages/localeOrdinalMap.ts +++ b/src/languages/localeOrdinalMap.ts @@ -21,7 +21,9 @@ type OrdinalRenderer = (count: number) => string; * `other` is required because it is the fallback for any category a locale does not declare, which * keeps a missing entry from producing an empty string. */ -type LocaleOrdinals = Partial> & {other: OrdinalRenderer}; +type LocaleOrdinals = Partial> & { + other: OrdinalRenderer; +}; const localeOrdinalMap: Record = { /** Categories: one, two, few, other. The only locale here needing all four. */ diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 906008ef2daf..6814fd75f4ee 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -509,7 +509,10 @@ const translations: TranslationDeepObject = { quarter: 'Kwartaal', vacationDelegate: 'Vertegenwoordiger tijdens vakantie', expensifyLogo: 'Expensify-logo', - concierge: {greeting: 'Hoi, waarmee kan ik je helpen?', showHistory: 'Geschiedenis weergeven'}, + concierge: { + greeting: 'Hoi, waarmee kan ik je helpen?', + showHistory: 'Geschiedenis weergeven', + }, duplicateReport: 'Dubbel rapport', approver: 'Fiatteur', goToConcierge: 'Ga naar Concierge', @@ -548,8 +551,16 @@ const translations: TranslationDeepObject = { hasAnAnswer: 'Concierge heeft een antwoord!', collapseReasoning: 'Redenering inklappen', expandReasoning: 'Redenering uitklappen', - enableNotifications: {prompt: 'Wil je een melding krijgen wanneer Concierge reageert?', cta: 'Melden'}, - feedback: {prompt: 'Was dit antwoord nuttig?', useful: 'Nuttig antwoord', notUseful: 'Niet nuttig antwoord', thanks: 'Bedankt voor je feedback!'}, + enableNotifications: { + prompt: 'Wil je een melding krijgen wanneer Concierge reageert?', + cta: 'Melden', + }, + feedback: { + prompt: 'Was dit antwoord nuttig?', + useful: 'Nuttig antwoord', + notUseful: 'Niet nuttig antwoord', + thanks: 'Bedankt voor je feedback!', + }, }, supportalNoAccess: { title: 'Niet zo snel', @@ -691,7 +702,10 @@ const translations: TranslationDeepObject = { statusNeverRegistered: 'Nooit geregistreerd', statusNotRegistered: 'Niet geregistreerd', statusRegisteredThisDevice: 'Geregistreerd', - statusRegisteredOtherDevice: () => ({one: 'Ander apparaat geregistreerd', other: 'Andere geregistreerde apparaten'}), + statusRegisteredOtherDevice: () => ({ + one: 'Ander apparaat geregistreerd', + other: 'Andere geregistreerde apparaten', + }), }, pleaseEnableInSystemSettings: { start: 'Schakel gezichts-/vingerafdrukverificatie in of stel een toesteltoegangscode in op uw', @@ -704,7 +718,10 @@ const translations: TranslationDeepObject = { letsVerifyItsYou: 'Laten we controleren of jij het bent', nowLetsAuthenticateYou: 'Laten we je nu verifiëren...', letsAuthenticateYou: 'We gaan je authenticeren...', - verifyYourself: {biometrics: 'Verifieer jezelf met je gezicht of vingerafdruk', passkeys: 'Verifieer jezelf met een toegangssleutel'}, + verifyYourself: { + biometrics: 'Verifieer jezelf met je gezicht of vingerafdruk', + passkeys: 'Verifieer jezelf met een toegangssleutel', + }, enableQuickVerification: { biometrics: 'Schakel snelle, veilige verificatie in met je gezicht of vingerafdruk. Geen wachtwoorden of codes nodig.', passkeys: 'Schakel snelle, veilige verificatie in met een passkey. Geen wachtwoorden of codes nodig.', @@ -739,10 +756,18 @@ const translations: TranslationDeepObject = { pleaseUseWebApp: `Deze actie wordt niet ondersteund op jouw apparaat. Gebruik de Expensify-webapp en probeer het opnieuw.`, }, verificationFailed: 'Verificatie mislukt', - setPin: {didNotShipCard: 'We hebben je kaart niet verzonden. Probeer het opnieuw.'}, - revealPin: {couldNotReveal: 'We konden je pincode niet tonen. Probeer het opnieuw.'}, - changePin: {didNotChange: 'We hebben je pincode niet gewijzigd. Probeer het opnieuw.'}, - revealCardDetail: {couldNotReveal: 'We konden je kaartgegevens niet weergeven. Probeer het opnieuw.'}, + setPin: { + didNotShipCard: 'We hebben je kaart niet verzonden. Probeer het opnieuw.', + }, + revealPin: { + couldNotReveal: 'We konden je pincode niet tonen. Probeer het opnieuw.', + }, + changePin: { + didNotChange: 'We hebben je pincode niet gewijzigd. Probeer het opnieuw.', + }, + revealCardDetail: { + couldNotReveal: 'We konden je kaartgegevens niet weergeven. Probeer het opnieuw.', + }, }, validateCodeModal: { successfulSignInTitle: Str.dedent(` @@ -982,11 +1007,27 @@ const translations: TranslationDeepObject = { toDos: 'To-do’s', timeSensitiveSection: { title: 'Tijdgevoelig', - addShippingAddress: {title: 'We hebben je verzendadres nodig', subtitle: 'Geef een adres op om je Expensify Kaart te ontvangen.', cta: 'Toevoegen'}, - addPaymentCard: {title: 'Voeg een betaalkaart toe om Expensify te blijven gebruiken', subtitle: 'Account > Abonnement', cta: 'Toevoegen'}, - addBankAccount: {title: 'Voeg een bankrekening toe om je terugbetaling te ontvangen'}, - addDepositAccount: {title: 'Voeg een bankrekening toe om betalingen te ontvangen'}, - activateCard: {title: 'Activeer je Expensify Kaart', subtitle: 'Valideer je kaart en begin met uitgeven.', cta: 'Activeren'}, + addShippingAddress: { + title: 'We hebben je verzendadres nodig', + subtitle: 'Geef een adres op om je Expensify Kaart te ontvangen.', + cta: 'Toevoegen', + }, + addPaymentCard: { + title: 'Voeg een betaalkaart toe om Expensify te blijven gebruiken', + subtitle: 'Account > Abonnement', + cta: 'Toevoegen', + }, + addBankAccount: { + title: 'Voeg een bankrekening toe om je terugbetaling te ontvangen', + }, + addDepositAccount: { + title: 'Voeg een bankrekening toe om betalingen te ontvangen', + }, + activateCard: { + title: 'Activeer je Expensify Kaart', + subtitle: 'Valideer je kaart en begin met uitgeven.', + cta: 'Activeren', + }, confirmDigitalWalletAddition: { subtitle: 'Expensify Kaart', }, @@ -1011,16 +1052,30 @@ const translations: TranslationDeepObject = { title: ({cardName}: {cardName?: string}) => (cardName ? `Verbinding van persoonlijke kaart ${cardName} herstellen` : 'Verbinding persoonlijke kaart herstellen'), subtitle: 'Portemonnee', }, - addHomeAddress: {title: 'Voeg je thuisadres toe voor afstandsregistratie', subtitle: 'Account', cta: 'Toevoegen'}, - fixFailedBilling: {title: 'We konden je kaart in ons bestand niet belasten', subtitle: 'Abonnement'}, + addHomeAddress: { + title: 'Voeg je thuisadres toe voor afstandsregistratie', + subtitle: 'Account', + cta: 'Toevoegen', + }, + fixFailedBilling: { + title: 'We konden je kaart in ons bestand niet belasten', + subtitle: 'Abonnement', + }, unlockBankAccount: { workspaceTitle: 'Je zakelijke bankrekening is geblokkeerd', personalTitle: 'Je bankrekening is vergrendeld', workspaceSubtitle: ({policyName}: {policyName: string}) => policyName, personalSubtitle: 'Portemonnee', }, - addVirtualCardPersonalDetails: {title: 'Voeg je gegevens toe om je Expensify Kaart te bekijken en te gebruiken.', subtitle: 'Expensify Kaart', cta: 'Toevoegen'}, - enterSignerInfo: {title: 'Ondertekenaargegevens vereist', subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Bankrekening ${bankAccountLastFour}`}, + addVirtualCardPersonalDetails: { + title: 'Voeg je gegevens toe om je Expensify Kaart te bekijken en te gebruiken.', + subtitle: 'Expensify Kaart', + cta: 'Toevoegen', + }, + enterSignerInfo: { + title: 'Ondertekenaargegevens vereist', + subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Bankrekening ${bankAccountLastFour}`, + }, payOverdueInvoice: { cta: 'Beoordelen', dueSoonTitle: ({date}: {date: string}) => `Betaal je factuur vóór ${date} om onderbreking van de service te voorkomen`, @@ -1031,7 +1086,10 @@ const translations: TranslationDeepObject = { subtitle: ({date}: {date: string}) => `Abonnement eindigt op ${date}`, cta: 'Beheren', }, - emailDeliveryFailure: {title: 'We kunnen je geen e-mailmeldingen sturen', subtitle: 'Account'}, + emailDeliveryFailure: { + title: 'We kunnen je geen e-mailmeldingen sturen', + subtitle: 'Account', + }, upgradeNetSuiteConnection: {title: 'Upgrade je NetSuite-verbinding'}, }, forYouSection: { @@ -1100,7 +1158,10 @@ const translations: TranslationDeepObject = { hotelIn: ({destination}: {destination: string}) => `Hotel in ${destination}`, carRentalIn: ({destination}: {destination: string}) => `Autoverhuur in ${destination}`, inOneWeek: 'Over 1 week', - inDays: () => ({one: 'Over 1 dag', other: (count: number) => `Over ${count} dagen`}), + inDays: () => ({ + one: 'Over 1 dag', + other: (count: number) => `Over ${count} dagen`, + }), today: 'Vandaag', }, freeTrialSection: { @@ -1167,7 +1228,10 @@ const translations: TranslationDeepObject = { emptyStateTitle: 'Geen recente uitgaven', emptyStateMessage: 'Maak er een aan of sleep hier een bonnetje naartoe', }, - insightsSection: {chartUnavailable: 'Diagram niet beschikbaar', notEnoughData: 'We hebben nog niet genoeg gegevens om deze grafiek te vullen'}, + insightsSection: { + chartUnavailable: 'Diagram niet beschikbaar', + notEnoughData: 'We hebben nog niet genoeg gegevens om deze grafiek te vullen', + }, conciergePrompt: { goodMorning: ({name}: {name?: string}) => (name ? `Goedemorgen, ${name}.` : 'Goedemorgen.'), goodAfternoon: ({name}: {name?: string}) => (name ? `Goedemiddag, ${name}.` : 'Goedemiddag.'), @@ -1178,8 +1242,14 @@ const translations: TranslationDeepObject = { }, insightsPage: { viewOnSpend: 'Bekijken in Uitgaven', - emptyState: {title: 'Niets om weer te geven', subtitle: 'Probeer je criteria hierboven aan te passen'}, - noExpensesState: {title: 'Zie waar je geld naartoe gaat', subtitle: 'Zodra je uitgaven hebt, zie je bestedingspatronen, topverkopers en meer.'}, + emptyState: { + title: 'Niets om weer te geven', + subtitle: 'Probeer je criteria hierboven aan te passen', + }, + noExpensesState: { + title: 'Zie waar je geld naartoe gaat', + subtitle: 'Zodra je uitgaven hebt, zie je bestedingspatronen, topverkopers en meer.', + }, compare: { label: 'Vergelijken', previousPeriod: 'Vorige periode', @@ -2273,7 +2343,11 @@ const translations: TranslationDeepObject = { saved: 'Opgeslagen', }, }, - securityPage: {title: 'Beveiliging', subtitle: 'Houd je account veilig.', goToSecurity: 'Ga terug naar de beveiligingspagina'}, + securityPage: { + title: 'Beveiliging', + subtitle: 'Houd je account veilig.', + goToSecurity: 'Ga terug naar de beveiligingspagina', + }, shareCodePage: { title: 'Uw code', subtitle: 'Nodig leden uit voor Expensify door je persoonlijke QR-code of verwijzingslink te delen.', @@ -2387,8 +2461,14 @@ const translations: TranslationDeepObject = { testingPreferences: 'Testvoorkeuren', server: 'Server', servers: { - production: {label: 'Productie', description: 'De live-omgeving die echte gebruikers zien'}, - staging: {label: 'Staging', description: 'Kopie van productie. Wordt gebruikt voor de eindvalidatie'}, + production: { + label: 'Productie', + description: 'De live-omgeving die echte gebruikers zien', + }, + staging: { + label: 'Staging', + description: 'Kopie van productie. Wordt gebruikt voor de eindvalidatie', + }, qa: {label: 'QA', description: 'Experimentele omgeving voor tests'}, }, serverPinnedDescription: 'Deze build communiceert altijd met één server, dus dit kan hier niet worden gewijzigd.', @@ -2854,7 +2934,10 @@ const translations: TranslationDeepObject = { getStarted: 'Aan de slag', headerTitle: 'Wereldwijde terugbetalingen', }, - wiseGlobalReimbursementsBanner: {title: 'Betaal mensen wereldwijd', subtitle: 'Schakel wereldwijde terugbetalingen in op je USD-rekening.'}, + wiseGlobalReimbursementsBanner: { + title: 'Betaal mensen wereldwijd', + subtitle: 'Schakel wereldwijde terugbetalingen in op je USD-rekening.', + }, }, addCardToDigitalWallet: { title: ({walletName}: {walletName: string}) => `Kaart toevoegen aan ${walletName}`, @@ -3261,11 +3344,17 @@ ${amount} voor ${merchant} - ${date}`, }, editAgentAvatarPage: {title: 'Avatar bewerken'}, editAgentNamePage: {title: 'Naam medewerker'}, - editAgentPromptPage: {title: 'Aangepaste instructies schrijven', error: {emptyPrompt: 'Voer instructies in voor je medewerker.'}}, + editAgentPromptPage: { + title: 'Aangepaste instructies schrijven', + error: {emptyPrompt: 'Voer instructies in voor je medewerker.'}, + }, expenseRulesPage: { title: 'Declaratieregels', findRule: 'Regel zoeken', - emptyRules: {title: 'Nog geen regels', subtitle: 'Voeg een regel toe om onkostendeclaraties te automatiseren.'}, + emptyRules: { + title: 'Nog geen regels', + subtitle: 'Voeg een regel toe om onkostendeclaraties te automatiseren.', + }, changes: { billableUpdate: (value: boolean) => `Declaratie ${value ? 'factureerbaar' : 'niet-factureerbaar'} bijwerken`, categoryUpdate: (value: string) => `Categorie bijwerken naar ‘${value}’`, @@ -3916,7 +4005,11 @@ ${amount} voor ${merchant} - ${date}`, detailsPage: { localTime: 'Lokale tijd', }, - newChatPage: {startGroup: 'Groep starten', addToGroup: 'Aan groep toevoegen', addUserToGroup: (username: string) => `${username} aan groep toevoegen`}, + newChatPage: { + startGroup: 'Groep starten', + addToGroup: 'Aan groep toevoegen', + addUserToGroup: (username: string) => `${username} aan groep toevoegen`, + }, yearPickerPage: { year: 'Jaar', selectYear: 'Selecteer een jaar', @@ -4753,7 +4846,12 @@ ${amount} voor ${merchant} - ${date}`, departs: 'Vertrekt', errorMessage: 'Er is iets misgegaan. Probeer het later opnieuw.', phoneError: (phoneErrorMethodsRoute: string) => `Voeg een werkmail toe als je primaire login om reizen te boeken.`, - domainSelector: {headline: 'Welke domeinnaam wil je instellen?', title: 'Domein', subtitle: 'Kies een domein voor de Expensify Travel-configuratie.', recommended: 'Aanbevolen'}, + domainSelector: { + headline: 'Welke domeinnaam wil je instellen?', + title: 'Domein', + subtitle: 'Kies een domein voor de Expensify Travel-configuratie.', + recommended: 'Aanbevolen', + }, workspaceAddress: {headline: 'Wat is je zakelijke adres?'}, domainPermissionInfo: { title: 'Domein', @@ -4813,7 +4911,9 @@ ${amount} voor ${merchant} - ${date}`, title: 'Belastingnummer', subtitle: 'Voer het fiscale nummer van je rechtspersoon in zodat we reisfacturatie in je lokale valuta kunnen instellen.', inputLabel: 'Belastingnummer rechtspersoon', - error: {required: 'Vul het fiscale identificatienummer van je rechtspersoon in.'}, + error: { + required: 'Vul het fiscale identificatienummer van je rechtspersoon in.', + }, }, nudge: { airfareManual: @@ -5599,10 +5699,16 @@ ${amount} voor ${merchant} - ${date}`, label: 'Terugbetaalbare declaraties exporteren als', helperText: 'Declarabele uitgaven worden geëxporteerd als te betalen facturen op naam van de werknemer.', }, - exportNonReimbursable: {label: 'Niet-declarabele uitgaven exporteren als'}, + exportNonReimbursable: { + label: 'Niet-declarabele uitgaven exporteren als', + }, expenseReports: 'Declaraties', - exportReimbursableExpenseReports: {helperText: 'Declarabele uitgaven worden geëxporteerd als declaraties op naam van de werknemer.'}, - exportNonReimbursableExpenseReports: {helperText: 'Niet-declarabele uitgaven worden geëxporteerd als declaraties op naam van de werknemer.'}, + exportReimbursableExpenseReports: { + helperText: 'Declarabele uitgaven worden geëxporteerd als declaraties op naam van de werknemer.', + }, + exportNonReimbursableExpenseReports: { + helperText: 'Niet-declarabele uitgaven worden geëxporteerd als declaraties op naam van de werknemer.', + }, noVendorsFound: 'Geen leveranciers gevonden', noVendorsFoundDescription: 'Synchroniseer de verbinding opnieuw nadat leveranciers zijn toegevoegd in Certinia.', noCompaniesFound: 'Geen bedrijven gevonden', @@ -5632,7 +5738,12 @@ ${amount} voor ${merchant} - ${date}`, chartOfAccounts: 'Rekeningschema', chartOfAccountsDescription: 'Het grootboekschema wordt in Expensify geïmporteerd als categorieën.', dimensionMapping: ({n}: {n: number}) => `Dimensie ${n}`, - dimensions: {dimension1: 'Dimensie 1', dimension2: 'Dimensie 2', dimension3: 'Dimensie 3', dimension4: 'Dimensie 4'}, + dimensions: { + dimension1: 'Dimensie 1', + dimension2: 'Dimensie 2', + dimension3: 'Dimensie 3', + dimension4: 'Dimensie 4', + }, doNotMap: 'Niet toewijzen', doNotMapSubtitle: 'Standaard werknemersbron gebruiken', mappingTypes: { @@ -6094,7 +6205,14 @@ _Voor meer gedetailleerde instructies, [bezoek onze help-site](${CONST.NETSUITE_ noAccountsFound: 'Geen accounts gevonden', noAccountsFoundDescription: 'Voeg alsjeblieft rekeningen toe in Rillet en synchroniseer de verbinding opnieuw', exportDescription: 'Stel in hoe Expensify-gegevens worden geëxporteerd naar Rillet.', - exportReimbursable: {label: 'Vergoedbare uitgaven exporteren als', values: {[CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: {label: 'Leveranciersfacturen'}}}, + exportReimbursable: { + label: 'Vergoedbare uitgaven exporteren als', + values: { + [CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: { + label: 'Leveranciersfacturen', + }, + }, + }, exportDate: { label: 'Factuurdatum leverancier', description: 'Gebruik deze datum bij het exporteren van rapporten naar Rillet.', @@ -6113,9 +6231,22 @@ _Voor meer gedetailleerde instructies, [bezoek onze help-site](${CONST.NETSUITE_ }, }, }, - exportNonReimbursable: {label: 'Bedrijfspaskosten exporteren als', values: {[CONST.RILLET_EXPORT_NON_REIMBURSABLE.CREDIT_CARD_CHARGE]: {label: 'Creditcards'}}}, - defaultCompanyCardVendor: {label: 'Standaard leverancier bedrijfspas', description: 'Kies een standaard Rillet-leverancier voor uitgaven die niet automatisch worden gekoppeld.'}, - companyCardAccount: {label: 'Bedrijfskaartrekening', description: 'Kies waar je transacties van bedrijfskaarten naartoe wilt exporteren.'}, + exportNonReimbursable: { + label: 'Bedrijfspaskosten exporteren als', + values: { + [CONST.RILLET_EXPORT_NON_REIMBURSABLE.CREDIT_CARD_CHARGE]: { + label: 'Creditcards', + }, + }, + }, + defaultCompanyCardVendor: { + label: 'Standaard leverancier bedrijfspas', + description: 'Kies een standaard Rillet-leverancier voor uitgaven die niet automatisch worden gekoppeld.', + }, + companyCardAccount: { + label: 'Bedrijfskaartrekening', + description: 'Kies waar je transacties van bedrijfskaarten naartoe wilt exporteren.', + }, noBankAccountsFound: 'Geen bankrekeningen gevonden', noBankAccountsFoundDescription: 'Voeg bankrekeningen toe in Rillet en synchroniseer de verbinding opnieuw', autoSyncDescription: 'Synchroniseer Rillet en Expensify automatisch, elke dag. Rapporten worden in realtime gesynchroniseerd.', @@ -6133,9 +6264,15 @@ _Voor meer gedetailleerde instructies, [bezoek onze help-site](${CONST.NETSUITE_ }, syncReimbursedReports: 'Vergoede rapporten synchroniseren', syncReimbursedReportsDescription: 'Wanneer een rapport via ACH wordt betaald, wordt er een rekeningbetaling in deze rekening aangemaakt.', - billPaymentAccount: {label: 'Rekening voor het betalen van rekeningen', description: 'Kies van waar je rekeningen wilt betalen en we maken de betaling aan in Rillet.'}, + billPaymentAccount: { + label: 'Rekening voor het betalen van rekeningen', + description: 'Kies van waar je rekeningen wilt betalen en we maken de betaling aan in Rillet.', + }, syncExpensifyCardSettlements: 'Expensify Kaartafrekeningen synchroniseren', - settlementAccount: {label: 'Rekening voor verrekening van Expensify Kaart', description: 'Kies je vereffeningsrekening en we maken de betaling voor je aan in Rillet.'}, + settlementAccount: { + label: 'Rekening voor verrekening van Expensify Kaart', + description: 'Kies je vereffeningsrekening en we maken de betaling voor je aan in Rillet.', + }, syncTravelInvoicingSettlements: 'Geconsolideerde Travel Billing-afrekeningen synchroniseren', travelInvoicingSettlementAccount: { label: 'Afwikkelingsrekening voor geconsolideerde reiskostenfacturatie', @@ -6281,20 +6418,28 @@ _Voor meer gedetailleerde instructies, [bezoek onze help-site](${CONST.NETSUITE_ }, syncReimbursedReports: 'Terugbetaalde rapporten synchroniseren', syncReimbursedReportsDescription: 'Wanneer een rapport via ACH wordt betaald, wordt er een rekeningbetaling in deze rekening gegenereerd.', - billPaymentAccount: {label: 'Rekening voor rekeningbetalingen', description: 'Kies vanwaar je rekeningen wilt betalen en wij maken de betaling aan in DualEntry.'}, + billPaymentAccount: { + label: 'Rekening voor rekeningbetalingen', + description: 'Kies vanwaar je rekeningen wilt betalen en wij maken de betaling aan in DualEntry.', + }, fxExpenseAccount: { label: 'DualEntry-valutaconversiekostenrekening', description: 'Wanneer je bedrijf de kosten voor valutaomrekening dekt voor een betaling in het buitenland, boeken we die kosten in DualEntry op deze rekening als een journaalpost.', }, syncExpensifyCardSettlements: 'Expensify Kaart-afrekeningen synchroniseren', - settlementAccount: {label: 'Rekening voor afwikkeling van Expensify Kaart', description: 'Kies je afwikkelingsrekening en wij maken de betaling aan in DualEntry.'}, + settlementAccount: { + label: 'Rekening voor afwikkeling van Expensify Kaart', + description: 'Kies je afwikkelingsrekening en wij maken de betaling aan in DualEntry.', + }, syncTravelInvoicingSettlements: 'Geconsolideerde reisfactureringsafrekeningen synchroniseren', travelInvoicingSettlementAccount: { label: 'Rekening voor afwikkeling van geconsolideerde reisfacturatie', description: 'Kies je afwikkelingsrekening en wij maken de betaling aan in DualEntry.', }, - travelInvoicingPayableAccount: {label: 'Samengevoegde reisfacturatie te betalen rekening'}, + travelInvoicingPayableAccount: { + label: 'Samengevoegde reisfacturatie te betalen rekening', + }, }, type: { free: 'Gratis', @@ -6437,13 +6582,28 @@ _Voor meer gedetailleerde instructies, [bezoek onze help-site](${CONST.NETSUITE_ cardIdentityColumn: 'Koppel een kaartnummer of een kaartnaam zodat transacties aan een kaart kunnen worden gekoppeld.', }, fileImportDescription: 'Een handmatige optie als je bank geen feed kan versturen.', - duplicateFeedModal: {title: 'Kaartfeed al verbonden', prompt: 'Je kunt dezelfde kaartfeed niet twee keer aan dezelfde workspace toevoegen.'}, + duplicateFeedModal: { + title: 'Kaartfeed al verbonden', + prompt: 'Je kunt dezelfde kaartfeed niet twee keer aan dezelfde workspace toevoegen.', + }, }, statementCloseDate: { [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Laatste dag van de maand', [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Laatste werkdag van de maand', [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Aangepaste dag van de maand', }, + reimbursable: { + title: 'Vergoedbaar', + description: 'Kies hoe kaarttransacties moeten worden aangemaakt. Nieuwe transacties volgen deze regels.', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES]: 'Altijd vergoedbaar', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES}Description`]: 'Wordt altijd aan werknemers terugbetaald', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO]: 'Altijd niet-vergoedbaar', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO}Description`]: 'Wordt nooit aan werknemers terugbetaald', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES]: 'Vergoedbaar', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES}Description`]: 'Wordt meestal aan werknemers terugbetaald', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO]: 'Niet-vergoedbaar', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO}Description`]: 'Wordt af en toe aan werknemers terugbetaald', + }, assign: 'Toewijzen', assignCard: 'Kaart toewijzen', findCompanyCard: 'Bedrijfskaart zoeken', @@ -6491,7 +6651,10 @@ _Voor meer gedetailleerde instructies, [bezoek onze help-site](${CONST.NETSUITE_ importButton: 'Transacties importeren', }, deletedCard: 'Verwijderde kaart', - assignNewCards: {title: 'Nieuwe kaarten toewijzen', description: 'Haal de nieuwste kaarten op om toe te wijzen vanuit je bank'}, + assignNewCards: { + title: 'Nieuwe kaarten toewijzen', + description: 'Haal de nieuwste kaarten op om toe te wijzen vanuit je bank', + }, }, expensifyCard: { issueAndManageCards: 'Geef Expensify Kaarten uit en beheer ze', @@ -6689,7 +6852,10 @@ _Voor meer gedetailleerde instructies, [bezoek onze help-site](${CONST.NETSUITE_ ctaText: 'Reizen beheren', }, settings: { - autoAddTripName: {title: 'Reisnamen aan uitgaven toevoegen', subtitle: 'Voeg automatisch reisnamen toe aan onkostomemo’s voor reizen die in Expensify zijn geboekt.'}, + autoAddTripName: { + title: 'Reisnamen aan uitgaven toevoegen', + subtitle: 'Voeg automatisch reisnamen toe aan onkostomemo’s voor reizen die in Expensify zijn geboekt.', + }, codingSync: { title: 'Synchroniseer codering met Expensify Travel', subtitle: 'Push de categorieën, tags en rapportvelden van deze workspace naar Expensify Travel zodat reizigers ze bij het boeken invullen.', @@ -6919,14 +7085,18 @@ _Voor meer gedetailleerde instructies, [bezoek onze help-site](${CONST.NETSUITE_ subtitle: 'Stel een factureerbaar uurtarief in voor tijdregistratie.', defaultHourlyRate: 'Standaard uurtarief', }, - hrWarningModal: {disconnectText: ({integration}: {integration: string}) => `Om HR uit te schakelen, koppel eerst ${integration} los van deze workspace.`}, + hrWarningModal: { + disconnectText: ({integration}: {integration: string}) => `Om HR uit te schakelen, koppel eerst ${integration} los van deze workspace.`, + }, vendors: { title: 'Leveranciers', subtitle: 'Koppel kaartuitgaven aan leveranciers die zijn geïmporteerd uit je boekhoudsoftware.', disabledTitle: 'Niet zo snel...', disabledMessage: 'Om deze functie in of uit te schakelen, moet je je boekhoudimportinstellingen wijzigen.', }, - recruitingWarningModal: {disconnectText: ({integration}: {integration: string}) => `Om Werving uit te schakelen, koppel ${integration} eerst los van deze workspace.`}, + recruitingWarningModal: { + disconnectText: ({integration}: {integration: string}) => `Om Werving uit te schakelen, koppel ${integration} eerst los van deze workspace.`, + }, }, reports: { reportsCustomTitleExamples: 'Voorbeelden:', @@ -6948,7 +7118,10 @@ _Voor meer gedetailleerde instructies, [bezoek onze help-site](${CONST.NETSUITE_ findReportField: 'Rapportveld zoeken', deleteConfirmation: 'Weet je zeker dat je dit rapportveld wilt verwijderen?', deleteFieldsConfirmation: 'Weet je zeker dat je deze rapportvelden wilt verwijderen?', - emptyReportFields: {title: 'Nog geen rapportvelden', subtitle: 'Voeg een aangepast veld toe (tekst, datum of keuzemenu) dat op rapporten verschijnt.'}, + emptyReportFields: { + title: 'Nog geen rapportvelden', + subtitle: 'Voeg een aangepast veld toe (tekst, datum of keuzemenu) dat op rapporten verschijnt.', + }, subtitle: 'Rapportvelden zijn van toepassing op alle uitgaven en kunnen nuttig zijn wanneer je om extra informatie wilt vragen.', disableReportFields: 'Rapportvelden uitschakelen', disableReportFieldsConfirmation: 'Weet je het zeker? Tekst- en datumvelden worden verwijderd en lijsten worden uitgeschakeld.', @@ -6973,7 +7146,10 @@ _Voor meer gedetailleerde instructies, [bezoek onze help-site](${CONST.NETSUITE_ disableValues: 'Waarden uitschakelen', enableValue: 'Waarde inschakelen', enableValues: 'Waarden inschakelen', - emptyReportFieldsValues: {title: 'Nog geen lijstwaarden', subtitle: 'Voeg aangepaste waarden toe die op rapporten worden weergegeven.'}, + emptyReportFieldsValues: { + title: 'Nog geen lijstwaarden', + subtitle: 'Voeg aangepaste waarden toe die op rapporten worden weergegeven.', + }, deleteValuePrompt: 'Weet je zeker dat je deze lijstwaarde wilt verwijderen?', deleteValuesPrompt: 'Weet je zeker dat je deze lijstwaarden wilt verwijderen?', listValueRequiredError: 'Voer een naam voor de lijstwaarde in', @@ -7313,10 +7489,16 @@ Het Control-abonnement begint bij $9 per actieve deelnemer per maand.`, auditors: 'Accountants', guests: 'Gasten', editors: 'Bewerkers', - emptyRoleFilter: {title: 'Geen leden komen overeen met dit filter', subtitle: 'Nodig een lid uit of wijzig het filter hierboven.'}, + emptyRoleFilter: { + title: 'Geen leden komen overeen met dit filter', + subtitle: 'Nodig een lid uit of wijzig het filter hierboven.', + }, configureHRSync: (providerName: string) => `Stel ${providerName}-synchronisatie in.`, syncWithHR: (providerName: string) => `Synchroniseren met ${providerName}`, - makeCardAdmin: () => ({one: 'Kaartbeheerder maken', other: 'Kaartbeheerders maken'}), + makeCardAdmin: () => ({ + one: 'Kaartbeheerder maken', + other: 'Kaartbeheerders maken', + }), cardAdmins: 'Kaartbeheerders', peopleAdmins: 'People-beheerders', paymentsAdmins: 'Betalingsbeheerders', @@ -7808,7 +7990,11 @@ Het Control-abonnement begint bij $9 per actieve deelnemer per maand.`, promptEnd: '.', cta: 'Begrepen', }, - errors: {distanceMustBePositive: 'Afstand moet een positief geheel getal zijn.', invalidAddress: 'Voer een geldig adres in', distanceTooLarge: 'Afstand is te groot.'}, + errors: { + distanceMustBePositive: 'Afstand moet een positief geheel getal zijn.', + invalidAddress: 'Voer een geldig adres in', + distanceTooLarge: 'Afstand is te groot.', + }, workArrangement: { title: 'Standaard werkafspraak', officeBasedTitle: 'Op kantoor gebaseerd', @@ -7826,7 +8012,10 @@ Het Control-abonnement begint bij $9 per actieve deelnemer per maand.`, }, distance: 'Afstand', centrallyManage: 'Beheer tarieven centraal, volg in mijlen of kilometers en stel een standaardcategorie in.', - emptyRates: {title: 'Nog geen afstandstarieven', subtitle: 'Voeg een tarief toe om kilometers tegen aangepaste tarieven te vergoeden.'}, + emptyRates: { + title: 'Nog geen afstandstarieven', + subtitle: 'Voeg een tarief toe om kilometers tegen aangepaste tarieven te vergoeden.', + }, rate: 'Beoordeling', addRate: 'Tarief toevoegen', findRate: 'Tarief zoeken', @@ -8810,7 +8999,12 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, emptyAmountError: 'Voer een geldig bedrag in voordat je opslaat', receiptAmountGreaterThanItemizedError: 'Het vereiste bonbedrag mag niet hoger zijn dan het vereiste gespecificeerde bonbedrag.', }, - requireFields: {title: 'Velden vereisen voor alle uitgaven', category: 'Categorie', tag: 'Label', save: 'Regel opslaan'}, + requireFields: { + title: 'Velden vereisen voor alle uitgaven', + category: 'Categorie', + tag: 'Label', + save: 'Regel opslaan', + }, newRule: { title: 'Nieuwe regel', subtitle: 'Wat wil je doen?', @@ -8858,7 +9052,11 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, merchantTypeIs: (merchantType: string) => `Type leverancier is "${merchantType}"`, categoryIs: (category: string) => `Categorie is "${category}"`, }, - merchantTypeRule: {merchantType: 'Type handelaar', saveRule: 'Regel opslaan', confirmErrorCategory: 'Selecteer een categorie.'}, + merchantTypeRule: { + merchantType: 'Type handelaar', + saveRule: 'Regel opslaan', + confirmErrorCategory: 'Selecteer een categorie.', + }, requireFieldsTable: { tableColumnType: 'Type', tableColumnCondition: 'Voorwaarde', @@ -8920,8 +9118,15 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, flagTypeWarning: 'Waarschuwing', flagTypeWarningDescription: 'Indiener krijgt een waarschuwing, maar kan de uitgave nog steeds indienen', }, - agentRulesEmptyState: {title: 'Geen agentregels toegevoegd', subtitle: 'Maak een regel om je werkruimtebeleid te automatiseren.', cta: 'AI-regel toevoegen'}, - categoriesDisabledEmptyState: {title: 'Categorieën zijn niet ingeschakeld', subtitle: 'Schakel categorieën in om meer controle te krijgen over je uitgaven.'}, + agentRulesEmptyState: { + title: 'Geen agentregels toegevoegd', + subtitle: 'Maak een regel om je werkruimtebeleid te automatiseren.', + cta: 'AI-regel toevoegen', + }, + categoriesDisabledEmptyState: { + title: 'Categorieën zijn niet ingeschakeld', + subtitle: 'Schakel categorieën in om meer controle te krijgen over je uitgaven.', + }, expenseDefaultType: { title: 'Standaardwaarden voor uitgaven toepassen', subtitle: 'Waar moet deze regel op overeenkomen?', @@ -9037,7 +9242,11 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, dontSeeYourATS: `Zie je je ATS hier niet? Vraag het aan Concierge en we kunnen het toevoegen.`, importSettings: 'Importinstellingen', defaultApprover: 'Standaardgoedkeurder', - approverFields: {recruiter: 'Recruiter', recruitingCoordinator: 'Coördinator werving', hiringManager: 'Wervingsmanager'}, + approverFields: { + recruiter: 'Recruiter', + recruitingCoordinator: 'Coördinator werving', + hiringManager: 'Wervingsmanager', + }, filters: { description: (providerName: string) => `Selecteer welke leden worden geïmporteerd uit ${providerName}. Je kunt kiezen op basis van functieniveaus, tags en kantoren.`, stages: { @@ -9115,7 +9324,10 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, approvalModeWarningConfirm: 'Goedkeuringsmodus wijzigen', syncingModalTitle: 'Je verbinding wordt gesynchroniseerd', syncingModalDescription: 'De eerste verbinding kan even duren. Je krijgt een melding als er fouten optreden.', - syncLimitReached: {title: 'Probeer het morgen opnieuw', prompt: 'Je hebt je synchronisatielimiet voor vandaag bereikt.'}, + syncLimitReached: { + title: 'Probeer het morgen opnieuw', + prompt: 'Je hebt je synchronisatielimiet voor vandaag bereikt.', + }, syncResults: { title: (provider: string) => `Synchronisatie met ${provider} voltooid`, successTitle: (provider: string) => `Je ${provider}-verbinding is succesvol gesynchroniseerd!`, @@ -9124,7 +9336,10 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, skipped: 'Overgeslagen', }, }, - emptyDomain: {title: 'Verbeter je beveiliging met domeinen', subtitle: 'Vereis dat leden op je domein inloggen via single sign-on, beperk het aanmaken van werkruimtes en meer.'}, + emptyDomain: { + title: 'Verbeter je beveiliging met domeinen', + subtitle: 'Vereis dat leden op je domein inloggen via single sign-on, beperk het aanmaken van werkruimtes en meer.', + }, campfire: { campfireSetup: 'Campfire-configuratie', enterCredentials: 'Voer je Campfire API-sleutel in', @@ -9142,22 +9357,40 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, enableNewAccountsDescription: 'Nieuwe Campfire-accounts zijn beschikbaar als categorieën.', dimensionsImport: 'Alle Campfire-dimensies worden als labels geïmporteerd', exportDescription: 'Stel in hoe Expensify-gegevens worden geëxporteerd naar Campfire.', - exportReimbursable: {label: 'Vergoedbare uitgaven exporteren als', values: {VENDOR_BILL: {label: 'Leveranciersfacturen'}}}, + exportReimbursable: { + label: 'Vergoedbare uitgaven exporteren als', + values: {VENDOR_BILL: {label: 'Leveranciersfacturen'}}, + }, exportDate: { label: 'Factuurdatum leverancier', description: 'Gebruik deze datum bij het exporteren van rapporten naar Campfire.', values: { - LAST_EXPENSE: {label: 'Datum van laatste uitgave', description: 'Datum van de meest recente uitgave in het rapport.'}, - REPORT_EXPORTED: {label: 'Exportdatum', description: 'Datum waarop het rapport is geëxporteerd naar Campfire.'}, - REPORT_SUBMITTED: {label: 'Indiendatum', description: 'Datum waarop het rapport ter goedkeuring is ingediend.'}, + LAST_EXPENSE: { + label: 'Datum van laatste uitgave', + description: 'Datum van de meest recente uitgave in het rapport.', + }, + REPORT_EXPORTED: { + label: 'Exportdatum', + description: 'Datum waarop het rapport is geëxporteerd naar Campfire.', + }, + REPORT_SUBMITTED: { + label: 'Indiendatum', + description: 'Datum waarop het rapport ter goedkeuring is ingediend.', + }, }, }, - exportNonReimbursable: {label: 'Bedrijfspaskosten exporteren als', values: {JOURNAL_ENTRY: {label: 'Boekingen'}}}, + exportNonReimbursable: { + label: 'Bedrijfspaskosten exporteren als', + values: {JOURNAL_ENTRY: {label: 'Boekingen'}}, + }, defaultCompanyCardVendor: { label: 'Standaardleverancier voor alle bedrijfskaarten', description: 'Kies een standaard Campfire-leverancier voor uitgaven die niet automatisch worden gekoppeld.', }, - companyCardAccount: {label: 'Bedrijfskaartrekening', description: 'Kies waar je transacties van bedrijfskaarten naartoe wilt exporteren.'}, + companyCardAccount: { + label: 'Bedrijfskaartrekening', + description: 'Kies waar je transacties van bedrijfskaarten naartoe wilt exporteren.', + }, noAccountsFound: 'Geen accounts gevonden', noAccountsFoundDescription: 'Voeg accounts toe in Campfire en synchroniseer de verbinding opnieuw', autoSyncDescription: 'Synchroniseer Campfire en Expensify elke dag automatisch. Rapporten worden in realtime gesynchroniseerd.', @@ -9180,13 +9413,18 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, description: 'Kies de tussenrekening voor Campfire-tegoeden wanneer Expensify een rekening als betaald markeert.', }, syncExpensifyCardSettlements: 'Expensify Kaartafrekeningen synchroniseren', - settlementAccount: {label: 'Expensify Kaart-verrekeningsrekening', description: 'Kies je afrekenrekening en we maken de betaling aan in Campfire.'}, + settlementAccount: { + label: 'Expensify Kaart-verrekeningsrekening', + description: 'Kies je afrekenrekening en we maken de betaling aan in Campfire.', + }, syncTravelInvoicingSettlements: 'Geconsolideerde reisfactureringsafrekeningen synchroniseren', travelInvoicingSettlementAccount: { label: 'Rekening voor afwikkeling van geconsolideerde reisfacturatie', description: 'Kies je afrekenrekening en we maken de betaling aan in Campfire.', }, - travelInvoicingPayableAccount: {label: 'Samengevoegde reisfacturatie te betalen rekening'}, + travelInvoicingPayableAccount: { + label: 'Samengevoegde reisfacturatie te betalen rekening', + }, exportToMultipleAccounts: 'Export naar meerdere rekeningen instellen', cardProgramAccount: { label: 'Kaartprogramma-account', @@ -9833,7 +10071,11 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, changedToFixedDistance: ({previousMethod}: {previousMethod: string}) => `heeft woon-werkverkeer wijzigen in een vaste afstand per declaratie (voorheen ${previousMethod})`, changedToHomeAndOffice: ({previousMethod}: {previousMethod: string}) => `uitsluiten van woon-werkverkeer gewijzigd naar berekenen op basis van huis en kantoor (voorheen ${previousMethod})`, - previousMethod: {disabled: 'woon-werkverkeer niet uitsluiten', fixedDistance: 'vast bedrag per declaratie', homeAndOffice: 'thuis en kantoor'}, + previousMethod: { + disabled: 'woon-werkverkeer niet uitsluiten', + fixedDistance: 'vast bedrag per declaratie', + homeAndOffice: 'thuis en kantoor', + }, setFixedDistance: ({formattedDistance}: {formattedDistance: string}) => `stel vaste afstandsuitsluiting in op ${formattedDistance} per declaratie`, changedFixedDistance: ({formattedOldDistance, formattedNewDistance}: {formattedOldDistance: string; formattedNewDistance: string}) => `vaste afstandsuitsluiting gewijzigd naar ${formattedNewDistance} per declaratie (voorheen ${formattedOldDistance})`, @@ -9887,6 +10129,8 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, updatedMccGroupCategory: ({mccGroupName, oldCategory, newCategory}: {mccGroupName: string; oldCategory: string; newCategory: string}) => `heeft de standaarduitgavencategorie voor ‘${mccGroupName}’ gewijzigd in ‘${newCategory}’ (voorheen ‘${oldCategory}’)`, updatedRequireCompanyCards: ({enabled}: {enabled: boolean}) => `vereiste ${enabled ? 'ingeschakeld' : 'uitgeschakeld'} voor bedrijfskaarttransacties`, + updatedCardFeedReimbursable: (feedName: string, newValue?: string, previousValue?: string) => + `heeft de instelling voor vergoedbaar van kaartfeed "${feedName}"${newValue ? ` naar "${newValue}"` : ''}${previousValue ? ` (eerder "${previousValue}")` : ''}`, agentRule: { added: ({title, prompt}: {title: string; prompt: string}) => (title ? `heeft de agentregel ‘${title}’ toegevoegd: ${prompt}` : `heeft een agentregel toegevoegd: ${prompt}`), updated: ({title, prompt}: {title: string; prompt: string}) => @@ -9922,7 +10166,13 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, one: 'uitgavenregel toegepast op 1 extra kaart', other: `uitgavenregel toegepast op ${count} extra kaarten`, }), - phraseVerb: {added: 'toegevoegd', removed: 'verwijderd', changed: 'gewijzigd', set: 'instellen', applied: 'toegepast'}, + phraseVerb: { + added: 'toegevoegd', + removed: 'verwijderd', + changed: 'gewijzigd', + set: 'instellen', + applied: 'toegepast', + }, bodyMerchant: ({adjective, value}: {adjective: string; value: string}) => (adjective !== '' ? `${adjective} handelaar '${value}'` : `handelaar '${value}'`), bodyMerchantValueOnly: ({value}: {value: string}) => `'${value}'`, bodyMerchantChange: ({adjective, oldValue, newValue}: {adjective: string; oldValue: string; newValue: string}) => @@ -10159,7 +10409,11 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, subtitleCannotSend: 'Je hebt een werkruimte met Invoices ingeschakeld nodig om facturen te versturen.', subtitleCannotSendWithTestDrive: 'Je hebt een werkruimte met Invoices ingeschakeld nodig om facturen te versturen. Maak een testrit met Expensify om meer te weten te komen.', }, - emptyTripResults: {title: 'Nog geen reizen', subtitle: 'Begin met het boeken van je eerste reis hieronder.', buttonText: 'Boek een reis'}, + emptyTripResults: { + title: 'Nog geen reizen', + subtitle: 'Begin met het boeken van je eerste reis hieronder.', + buttonText: 'Boek een reis', + }, emptySubmitResults: { title: 'Geen uitgaven om in te dienen', subtitle: 'Alles is in orde. Maak een ererondje!', @@ -10188,7 +10442,11 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, title: 'Geen declaraties om goed te keuren', subtitle: 'Nul uitgaven. Maximale chill. Goed gedaan!', }, - staleResults: {title: 'Vernieuwen nodig', subtitle: 'Deze pagina is verouderd, vernieuw om de laatste versie te zien', buttonText: 'Verversen'}, + staleResults: { + title: 'Vernieuwen nodig', + subtitle: 'Deze pagina is verouderd, vernieuw om de laatste versie te zien', + buttonText: 'Verversen', + }, }, columns: 'Kolommen', editColumns: 'Kolommen bewerken', @@ -10285,8 +10543,15 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, cardFeedNameCSV: ({cardFeedLabel}: {cardFeedLabel?: string}) => `Alle geïmporteerde CSV-kaarten${cardFeedLabel ? ` - ${cardFeedLabel}` : ''}`, travelInvoicing: 'Geconsolideerde reisfacturatie', }, - bankAccount: {banks: 'Bankrekeningen', closedBankAccounts: 'Gesloten bankrekeningen'}, - workspace: {active: 'Actief', archived: 'Gearchiveerd', selectAll: 'Alles selecteren'}, + bankAccount: { + banks: 'Bankrekeningen', + closedBankAccounts: 'Gesloten bankrekeningen', + }, + workspace: { + active: 'Actief', + archived: 'Gearchiveerd', + selectAll: 'Alles selecteren', + }, reportField: (name: string, value: string) => `${name} is ${value}`, current: 'Huidig', past: 'Verleden', @@ -10329,14 +10594,21 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, [CONST.SEARCH.WITHDRAWAL_TYPE.TRAVEL_BILLING]: 'Geconsolideerde reisfacturatie', }, is: 'Is', - has: {submittedViolation: 'Ingediende overtreding', approvedViolation: 'Goedgekeurde schending'}, + has: { + submittedViolation: 'Ingediende overtreding', + approvedViolation: 'Goedgekeurde schending', + }, action: { [CONST.SEARCH.ACTION_FILTERS.SUBMIT]: 'Verzenden', [CONST.SEARCH.ACTION_FILTERS.APPROVE]: 'Goedkeuren', [CONST.SEARCH.ACTION_FILTERS.PAY]: 'Betalen', [CONST.SEARCH.ACTION_FILTERS.EXPORT]: 'Exporteren', }, - filterType: {label: 'Filtertype', has: {positive: 'heeft', negative: 'heeft niet'}, is: {positive: 'is', negative: 'is niet'}}, + filterType: { + label: 'Filtertype', + has: {positive: 'heeft', negative: 'heeft niet'}, + is: {positive: 'is', negative: 'is niet'}, + }, merchant: { matchType: 'Overeenkomsttype', contains: (merchant?: string) => (merchant ? `Bevat "${merchant}"` : 'Bevat'), @@ -10366,7 +10638,10 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, line: 'Lijn', pie: 'Cirkeldiagram', }, - moneyRequestReport: {emptyStateTitle: 'Nog geen uitgaven', accessPlaceHolder: 'Open voor details'}, + moneyRequestReport: { + emptyStateTitle: 'Nog geen uitgaven', + accessPlaceHolder: 'Open voor details', + }, noCategory: 'Geen categorie', noMerchant: 'Geen handelaar', noTag: 'Geen tag', @@ -10448,7 +10723,10 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, mergeReports: { title: 'Rapporten samenvoegen', description: 'Selecteer het rapport dat je wilt behouden. Alle uitgaven worden daarheen verplaatst en de andere rapporten worden verwijderd.', - listPage: {noEligibleReportsFound: 'Geen in aanmerking komende rapporten gevonden', noEligibleReportsFoundSubtitle: 'Je hebt geen rapporten die kunnen worden samengevoegd.'}, + listPage: { + noEligibleReportsFound: 'Geen in aanmerking komende rapporten gevonden', + noEligibleReportsFoundSubtitle: 'Je hebt geen rapporten die kunnen worden samengevoegd.', + }, }, periodSoFar: ({period}: {period: string}) => `${period} tot nu toe`, weekOf: ({date}: {date: string}) => `Week van ${date}`, @@ -10485,11 +10763,21 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, }, }, settlement: { - status: {pending: 'In behandeling', cleared: 'Verrekend', failed: 'Mislukt', never: 'Nooit', cashBack: 'Cashback'}, + status: { + pending: 'In behandeling', + cleared: 'Verrekend', + failed: 'Mislukt', + never: 'Nooit', + cashBack: 'Cashback', + }, failedError: ({link}: {link: string}) => `We proberen deze afrekening opnieuw zodra je je account ontgrendelt.`, withdrawalInfo: ({date, withdrawalID}: {date: string; withdrawalID: number}) => `${date} • Opname-ID: ${withdrawalID}`, }, - paidStatus: {markedAsPaid: 'Gemarkeerd als betaald', withdrawing: 'Opnemen', confirmed: 'Bevestigd'}, + paidStatus: { + markedAsPaid: 'Gemarkeerd als betaald', + withdrawing: 'Opnemen', + confirmed: 'Bevestigd', + }, reportLayout: { reportLayout: 'Rapportindeling', groupByLabel: 'Groeperen op:', @@ -10945,7 +11233,12 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, prompt: 'Sta locatiestoegang toe in de instellingen van je apparaat om GPS-afstandsregistratie te starten.', }, gpsFloatingPillText: 'GPS-tracking bezig...', - liveActivity: {subtitle: 'Afstand bijhouden', button: 'Voortgang bekijken', lockScreenBadgeText: 'Afstand', lockScreenTrackingText: 'Bezig met bijhouden...'}, + liveActivity: { + subtitle: 'Afstand bijhouden', + button: 'Voortgang bekijken', + lockScreenBadgeText: 'Afstand', + lockScreenTrackingText: 'Bezig met bijhouden...', + }, }, reportCardLostOrDamaged: { screenTitle: 'Rapportkaart kwijt of beschadigd', @@ -11146,7 +11439,11 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, markAsCashToIgnore: 'Markeren als contant om te negeren en betaling aan te vragen.', smartscanFailed: ({canEdit = true, missingFields = []}: {canEdit?: boolean; missingFields?: string[]}) => { if (missingFields.length > 0) { - const fieldNames: Record = {merchant: 'handelaar', date: 'datum', amount: 'bedrag'}; + const fieldNames: Record = { + merchant: 'handelaar', + date: 'datum', + amount: 'bedrag', + }; const translated = missingFields.map((f) => fieldNames[f] ?? f); const fieldList = translated.join(translated.length > 2 ? ', ' : ' en '); const verb = translated.length === 1 ? 'ontbreekt' : 'ontbreken'; @@ -11420,8 +11717,14 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, onboardingChatTitle: (discountType: number) => `Aanbieding voor beperkte tijd: ${discountType}% korting op je eerste jaar!`, subtitle: (days: number, hours: number, minutes: number, seconds: number) => `Dien in binnen ${days > 0 ? `${days}d :` : ''}${hours}u : ${minutes}m : ${seconds}s`, }, - travelInvoiceOverdue: {title: 'Je reisfactuur is verlopen', subtitle: (date: string) => `Betaal je reissfactuur vóór ${date} om reizen te blijven boeken.`}, - travelInvoiceOverdueLocked: {title: 'Reisboeking is gepauzeerd', subtitle: 'Je reisfactuur is verlopen. Betaal deze om weer reizen te kunnen boeken.'}, + travelInvoiceOverdue: { + title: 'Je reisfactuur is verlopen', + subtitle: (date: string) => `Betaal je reissfactuur vóór ${date} om reizen te blijven boeken.`, + }, + travelInvoiceOverdueLocked: { + title: 'Reisboeking is gepauzeerd', + subtitle: 'Je reisfactuur is verlopen. Betaal deze om weer reizen te kunnen boeken.', + }, }, cardSection: { title: 'Betaling', @@ -11550,7 +11853,14 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, one: '1 actieve gebruiker', other: `${count} actieve gebruikers`, }), - state: {paid: 'Betaald', cleared: 'Afgeboekt', failed: 'Mislukt', refunded: 'Terugbetaald', disputed: 'Betwist', balanceTransfer: 'Saldo-overboeking'}, + state: { + paid: 'Betaald', + cleared: 'Afgeboekt', + failed: 'Mislukt', + refunded: 'Terugbetaald', + disputed: 'Betwist', + balanceTransfer: 'Saldo-overboeking', + }, details: 'Betalingsgegevens', badge: { balanceTransferTo: ({email}: {email: string}) => `Saldo-overboeking naar ${email}`, @@ -12022,7 +12332,10 @@ Hier is een *proefbon* om je te laten zien hoe het werkt:`, other: 'Accounts sluiten', }), closeAccountPrompt: 'Weet je het zeker? Deze actie is permanent.', - forceCloseAccount: () => ({one: 'Account geforceerd sluiten', other: 'Accounts geforceerd sluiten'}), + forceCloseAccount: () => ({ + one: 'Account geforceerd sluiten', + other: 'Accounts geforceerd sluiten', + }), safeCloseAccount: () => ({ one: 'Account veilig sluiten', other: 'Accounts veilig sluiten', @@ -12045,7 +12358,10 @@ Hier is een *proefbon* om je te laten zien hoe het werkt:`, `Weet je het zeker? Hiermee wordt het account van ${email} vergrendeld.

Ons team zal het account vervolgens beoordelen en ongeautoriseerde toegang verwijderen. Om weer toegang te krijgen, moeten ze samenwerken met Concierge.`, reportSuspiciousActivityConfirmationPrompt: 'We beoordelen de account om te verifiëren dat het veilig is om deze te ontgrendelen en nemen via Concierge contact op als we vragen hebben.', - emptyMembers: {title: 'Geen leden in deze groep', subtitle: 'Voeg een lid toe of probeer het filter hierboven te wijzigen.'}, + emptyMembers: { + title: 'Geen leden in deze groep', + subtitle: 'Voeg een lid toe of probeer het filter hierboven te wijzigen.', + }, moveToGroup: 'Verplaatsen naar groep', chooseWhereToMove: ({count}: {count: number}) => ({ one: 'Kies waar je 1 lid naartoe wilt verplaatsen.', @@ -12074,7 +12390,10 @@ Hier is een *proefbon* om je te laten zien hoe het werkt:`, }, groups: { title: 'Groepen', - memberCount: () => ({one: '1 lid', other: (count: number) => `${count} leden`}), + memberCount: () => ({ + one: '1 lid', + other: (count: number) => `${count} leden`, + }), defaultGroup: 'Standaardgroep voor nieuwe leden', defaultGroupPrompt: (currentName: string, newName: string) => `Weet je zeker dat je ${newName} de standaardgroep wilt maken? Nieuwe leden worden uitgenodigd voor deze groep in plaats van de vorige standaardgroep (${currentName}). `, @@ -12166,6 +12485,10 @@ Hier is een *proefbon* om je te laten zien hoe het werkt:`, mobileRenewPrompt: 'Bezoek Expensify in je webbrowser om vroegtijdig te verlengen.', mobileClaimPrompt: 'Bezoek Expensify in je webbrowser om je verlengingskorting te claimen.', }, - bulkActionBar: {label: 'Bulkacties', clearSelection: 'Selectie wissen', loadingSelection: 'Selectie laden'}, + bulkActionBar: { + label: 'Bulkacties', + clearSelection: 'Selectie wissen', + loadingSelection: 'Selectie laden', + }, }; export default translations; diff --git a/src/languages/params.ts b/src/languages/params.ts index 4a2546896430..d3b044bae272 100644 --- a/src/languages/params.ts +++ b/src/languages/params.ts @@ -6,11 +6,23 @@ type CompanyCardBalanceParams = { type StepCounterParams = {step: number; total?: number; text?: string}; -type ParentNavigationSummaryParams = {reportName?: string; workspaceName?: string}; +type ParentNavigationSummaryParams = { + reportName?: string; + workspaceName?: string; +}; -type ChangeFieldParams = {oldValue?: string; newValue: string; fieldName: string}; +type ChangeFieldParams = { + oldValue?: string; + newValue: string; + fieldName: string; +}; -type ExportedToIntegrationParams = {label: string; markedManually?: boolean; inProgress?: boolean; lastModified?: string}; +type ExportedToIntegrationParams = { + label: string; + markedManually?: boolean; + inProgress?: boolean; + lastModified?: string; +}; type IntegrationsMessageParams = { label: string; @@ -38,7 +50,10 @@ type ExportAgainModalDescriptionParams = { connectionNameFriendly?: string; }; -type ExportIntegrationSelectedParams = {connectionName: ConnectionName; connectionNameFriendly?: string}; +type ExportIntegrationSelectedParams = { + connectionName: ConnectionName; + connectionNameFriendly?: string; +}; type PaymentDetailsBadgeEmailParams = {email: string}; diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 40a1b1a4aa14..43204b7120a3 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -514,7 +514,10 @@ const translations: TranslationDeepObject = { quarter: 'Kwartał', vacationDelegate: 'Zastępca urlopowy', expensifyLogo: 'Logo Expensify', - concierge: {greeting: 'Cześć, w czym mogę pomóc?', showHistory: 'Pokaż historię'}, + concierge: { + greeting: 'Cześć, w czym mogę pomóc?', + showHistory: 'Pokaż historię', + }, duplicateReport: 'Zduplikowany raport', approver: 'Osoba zatwierdzająca', goToConcierge: 'Przejdź do Concierge', @@ -553,8 +556,16 @@ const translations: TranslationDeepObject = { hasAnAnswer: 'Concierge ma odpowiedź!', collapseReasoning: 'Zwiń rozumowanie', expandReasoning: 'Rozwiń rozumowanie', - enableNotifications: {prompt: 'Chcesz otrzymywać powiadomienia, gdy Concierge odpowie?', cta: 'Powiadom'}, - feedback: {prompt: 'Czy ta odpowiedź była pomocna?', useful: 'Przydatna odpowiedź', notUseful: 'Nieprzydatna odpowiedź', thanks: 'Dzięki za opinię!'}, + enableNotifications: { + prompt: 'Chcesz otrzymywać powiadomienia, gdy Concierge odpowie?', + cta: 'Powiadom', + }, + feedback: { + prompt: 'Czy ta odpowiedź była pomocna?', + useful: 'Przydatna odpowiedź', + notUseful: 'Nieprzydatna odpowiedź', + thanks: 'Dzięki za opinię!', + }, }, supportalNoAccess: { title: 'Nie tak szybko', @@ -696,7 +707,10 @@ const translations: TranslationDeepObject = { statusNeverRegistered: 'Nigdy nie zarejestrowano', statusNotRegistered: 'Nie zarejestrowano', statusRegisteredThisDevice: 'Zarejestrowano', - statusRegisteredOtherDevice: () => ({one: 'Zarejestrowano inne urządzenie', other: 'Inne zarejestrowane urządzenia'}), + statusRegisteredOtherDevice: () => ({ + one: 'Zarejestrowano inne urządzenie', + other: 'Inne zarejestrowane urządzenia', + }), }, pleaseEnableInSystemSettings: { start: 'Włącz weryfikację twarzą/odciskiem palca lub ustaw kod blokady urządzenia w swoim', @@ -709,7 +723,10 @@ const translations: TranslationDeepObject = { letsVerifyItsYou: 'Zweryfikujmy, czy to na pewno Ty', nowLetsAuthenticateYou: 'Teraz Cię uwierzytelnimy…', letsAuthenticateYou: 'Uwierzytelnijmy Cię…', - verifyYourself: {biometrics: 'Zweryfikuj się za pomocą twarzy lub odcisku palca', passkeys: 'Zweryfikuj się za pomocą klucza dostępu'}, + verifyYourself: { + biometrics: 'Zweryfikuj się za pomocą twarzy lub odcisku palca', + passkeys: 'Zweryfikuj się za pomocą klucza dostępu', + }, enableQuickVerification: { biometrics: 'Włącz szybką i bezpieczną weryfikację za pomocą twarzy lub odcisku palca. Bez haseł i kodów.', passkeys: 'Włącz szybką, bezpieczną weryfikację za pomocą klucza dostępu. Nie są wymagane żadne hasła ani kody.', @@ -747,10 +764,18 @@ const translations: TranslationDeepObject = { pleaseUseWebApp: `Ta akcja nie jest obsługiwana na Twoim urządzeniu. Użyj aplikacji webowej Expensify i spróbuj ponownie.`, }, verificationFailed: 'Weryfikacja nie powiodła się', - setPin: {didNotShipCard: 'Nie wysłaliśmy twojej karty. Spróbuj ponownie.'}, - revealPin: {couldNotReveal: 'Nie udało się wyświetlić twojego PIN-u. Spróbuj ponownie.'}, - changePin: {didNotChange: 'Nie zmieniliśmy twojego PIN-u. Spróbuj ponownie.'}, - revealCardDetail: {couldNotReveal: 'Nie udało się wyświetlić szczegółów Twojej karty. Spróbuj ponownie.'}, + setPin: { + didNotShipCard: 'Nie wysłaliśmy twojej karty. Spróbuj ponownie.', + }, + revealPin: { + couldNotReveal: 'Nie udało się wyświetlić twojego PIN-u. Spróbuj ponownie.', + }, + changePin: { + didNotChange: 'Nie zmieniliśmy twojego PIN-u. Spróbuj ponownie.', + }, + revealCardDetail: { + couldNotReveal: 'Nie udało się wyświetlić szczegółów Twojej karty. Spróbuj ponownie.', + }, }, validateCodeModal: { successfulSignInTitle: Str.dedent(` @@ -992,11 +1017,25 @@ const translations: TranslationDeepObject = { toDos: 'Zadania', timeSensitiveSection: { title: 'Wymaga szybkiej reakcji', - addShippingAddress: {title: 'Potrzebujemy Twojego adresu wysyłki', subtitle: 'Podaj adres, na który mamy wysłać twoją Kartę Expensify.', cta: 'Dodaj'}, - addPaymentCard: {title: 'Dodaj kartę płatniczą, żeby dalej korzystać z Expensify', subtitle: 'Konto > Subskrypcja', cta: 'Dodaj'}, + addShippingAddress: { + title: 'Potrzebujemy Twojego adresu wysyłki', + subtitle: 'Podaj adres, na który mamy wysłać twoją Kartę Expensify.', + cta: 'Dodaj', + }, + addPaymentCard: { + title: 'Dodaj kartę płatniczą, żeby dalej korzystać z Expensify', + subtitle: 'Konto > Subskrypcja', + cta: 'Dodaj', + }, addBankAccount: {title: 'Dodaj konto bankowe, aby otrzymać zwrot'}, - addDepositAccount: {title: 'Dodaj konto bankowe, aby otrzymywać płatności'}, - activateCard: {title: 'Aktywuj swoją Kartę Expensify', subtitle: 'Zatwierdź swoją kartę i zacznij wydawać.', cta: 'Aktywuj'}, + addDepositAccount: { + title: 'Dodaj konto bankowe, aby otrzymywać płatności', + }, + activateCard: { + title: 'Aktywuj swoją Kartę Expensify', + subtitle: 'Zatwierdź swoją kartę i zacznij wydawać.', + cta: 'Aktywuj', + }, confirmDigitalWalletAddition: { subtitle: 'Karta Expensify', }, @@ -1021,16 +1060,30 @@ const translations: TranslationDeepObject = { title: ({cardName}: {cardName?: string}) => (cardName ? `Napraw połączenie z prywatną kartą ${cardName}` : 'Napraw połączenie karty prywatnej'), subtitle: 'Portfel', }, - addHomeAddress: {title: 'Dodaj swój adres domowy do śledzenia odległości', subtitle: 'Konto', cta: 'Dodaj'}, - fixFailedBilling: {title: 'Nie mogliśmy obciążyć zapisanej karty', subtitle: 'Subskrypcja'}, + addHomeAddress: { + title: 'Dodaj swój adres domowy do śledzenia odległości', + subtitle: 'Konto', + cta: 'Dodaj', + }, + fixFailedBilling: { + title: 'Nie mogliśmy obciążyć zapisanej karty', + subtitle: 'Subskrypcja', + }, unlockBankAccount: { workspaceTitle: 'Twoje firmowe konto bankowe zostało zablokowane', personalTitle: 'Twoje konto bankowe zostało zablokowane', workspaceSubtitle: ({policyName}: {policyName: string}) => policyName, personalSubtitle: 'Portfel', }, - addVirtualCardPersonalDetails: {title: 'Dodaj swoje dane, aby wyświetlić i zacząć używać swojej Karty Expensify.', subtitle: 'Karta Expensify', cta: 'Dodaj'}, - enterSignerInfo: {title: 'Wymagane dane podpisującego', subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Konto bankowe ${bankAccountLastFour}`}, + addVirtualCardPersonalDetails: { + title: 'Dodaj swoje dane, aby wyświetlić i zacząć używać swojej Karty Expensify.', + subtitle: 'Karta Expensify', + cta: 'Dodaj', + }, + enterSignerInfo: { + title: 'Wymagane dane podpisującego', + subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Konto bankowe ${bankAccountLastFour}`, + }, payOverdueInvoice: { cta: 'Przejrzyj', dueSoonTitle: ({date}: {date: string}) => `Opłać fakturę do ${date}, aby uniknąć przerwy w świadczeniu usługi`, @@ -1041,8 +1094,13 @@ const translations: TranslationDeepObject = { subtitle: ({date}: {date: string}) => `Subskrypcja kończy się ${date}`, cta: 'Zarządzaj', }, - emailDeliveryFailure: {title: 'Nie możemy wysyłać ci powiadomień e-mail', subtitle: 'Konto'}, - upgradeNetSuiteConnection: {title: 'Zaktualizuj swoje połączenie z NetSuite'}, + emailDeliveryFailure: { + title: 'Nie możemy wysyłać ci powiadomień e-mail', + subtitle: 'Konto', + }, + upgradeNetSuiteConnection: { + title: 'Zaktualizuj swoje połączenie z NetSuite', + }, }, forYouSection: { submit: ({count}: {count: number}) => ({ @@ -1122,7 +1180,10 @@ const translations: TranslationDeepObject = { hotelIn: ({destination}: {destination: string}) => `Hotel w ${destination}`, carRentalIn: ({destination}: {destination: string}) => `Wynajem samochodu w ${destination}`, inOneWeek: 'Za 1 tydzień', - inDays: () => ({one: 'Za 1 dzień', other: (count: number) => `Za ${count} dni`}), + inDays: () => ({ + one: 'Za 1 dzień', + other: (count: number) => `Za ${count} dni`, + }), today: 'Dzisiaj', }, freeTrialSection: { @@ -1191,7 +1252,10 @@ const translations: TranslationDeepObject = { emptyStateTitle: 'Brak ostatnich wydatków', emptyStateMessage: 'Utwórz jeden lub przeciągnij tu paragon', }, - insightsSection: {chartUnavailable: 'Wykres niedostępny', notEnoughData: 'Nie mamy jeszcze wystarczającej ilości danych, żeby wypełnić ten wykres'}, + insightsSection: { + chartUnavailable: 'Wykres niedostępny', + notEnoughData: 'Nie mamy jeszcze wystarczającej ilości danych, żeby wypełnić ten wykres', + }, conciergePrompt: { goodMorning: ({name}: {name?: string}) => (name ? `Dzień dobry, ${name}.` : 'Dzień dobry.'), goodAfternoon: ({name}: {name?: string}) => (name ? `Dzień dobry, ${name}.` : 'Dzień dobry.'), @@ -1202,8 +1266,14 @@ const translations: TranslationDeepObject = { }, insightsPage: { viewOnSpend: 'Zobacz w Wydatkach', - emptyState: {title: 'Nic do wyświetlenia', subtitle: 'Spróbuj zmienić kryteria powyżej'}, - noExpensesState: {title: 'Zobacz, na co idą twoje pieniądze', subtitle: 'Gdy będziesz mieć wydatki, zobaczysz trendy w wydawaniu, najważniejszych sprzedawców i więcej.'}, + emptyState: { + title: 'Nic do wyświetlenia', + subtitle: 'Spróbuj zmienić kryteria powyżej', + }, + noExpensesState: { + title: 'Zobacz, na co idą twoje pieniądze', + subtitle: 'Gdy będziesz mieć wydatki, zobaczysz trendy w wydawaniu, najważniejszych sprzedawców i więcej.', + }, compare: { label: 'Porównaj', previousPeriod: 'Poprzedni okres', @@ -2311,7 +2381,11 @@ const translations: TranslationDeepObject = { saved: 'Zapisano', }, }, - securityPage: {title: 'Bezpieczeństwo', subtitle: 'Zadbaj o bezpieczeństwo swojego konta.', goToSecurity: 'Wróć do strony zabezpieczeń'}, + securityPage: { + title: 'Bezpieczeństwo', + subtitle: 'Zadbaj o bezpieczeństwo swojego konta.', + goToSecurity: 'Wróć do strony zabezpieczeń', + }, shareCodePage: { title: 'Twój kod', subtitle: 'Zaproś członków do Expensify, udostępniając swój osobisty kod QR lub link polecający.', @@ -2424,9 +2498,18 @@ const translations: TranslationDeepObject = { testingPreferences: 'Preferencje testowe', server: 'Serwer', servers: { - production: {label: 'Produkcja', description: 'Środowisko produkcyjne, które widzą prawdziwi użytkownicy'}, - staging: {label: 'Staging', description: 'Kopia produkcji. Używana do ostatecznej weryfikacji'}, - qa: {label: 'QA', description: 'Eksperymentalne środowisko używane do testów'}, + production: { + label: 'Produkcja', + description: 'Środowisko produkcyjne, które widzą prawdziwi użytkownicy', + }, + staging: { + label: 'Staging', + description: 'Kopia produkcji. Używana do ostatecznej weryfikacji', + }, + qa: { + label: 'QA', + description: 'Eksperymentalne środowisko używane do testów', + }, }, serverPinnedDescription: 'Ta wersja zawsze łączy się z jednym serwerem, więc nie można tego tutaj zmienić.', forceOffline: 'Wymuś tryb offline', @@ -2830,7 +2913,10 @@ const translations: TranslationDeepObject = { cardInactive: 'Nieaktywne', assignedCards: 'Karty', assignedCardsDescription: 'Transakcje z przypisanych kart synchronizują się automatycznie.', - addVirtualCardPersonalDetails: {subtitle: 'Wprowadź swoje dane osobowe, aby zacząć korzystać z karty', cta: 'Dodaj szczegóły'}, + addVirtualCardPersonalDetails: { + subtitle: 'Wprowadź swoje dane osobowe, aby zacząć korzystać z karty', + cta: 'Dodaj szczegóły', + }, expensifyCard: 'Karta Expensify', walletActivationPending: 'Sprawdzamy Twoje informacje. Sprawdź ponownie za kilka minut!', walletActivationFailed: 'Niestety w tej chwili nie można włączyć Twojego portfela. Skontaktuj się z Concierge, aby uzyskać dalszą pomoc.', @@ -2890,7 +2976,10 @@ const translations: TranslationDeepObject = { getStarted: 'Zacznij', headerTitle: 'Globalne zwroty kosztów', }, - wiseGlobalReimbursementsBanner: {title: 'Płać ludziom na całym świecie', subtitle: 'Włącz globalne zwroty wydatków na swoim koncie w USD.'}, + wiseGlobalReimbursementsBanner: { + title: 'Płać ludziom na całym świecie', + subtitle: 'Włącz globalne zwroty wydatków na swoim koncie w USD.', + }, }, addCardToDigitalWallet: { title: ({walletName}: {walletName: string}) => `Dodaj kartę do ${walletName}`, @@ -3291,11 +3380,17 @@ ${amount} dla ${merchant} - ${date}`, }, editAgentAvatarPage: {title: 'Edytuj awatar'}, editAgentNamePage: {title: 'Nazwa agenta'}, - editAgentPromptPage: {title: 'Napisz własne instrukcje', error: {emptyPrompt: 'Wprowadź instrukcje dla swojego agenta.'}}, + editAgentPromptPage: { + title: 'Napisz własne instrukcje', + error: {emptyPrompt: 'Wprowadź instrukcje dla swojego agenta.'}, + }, expenseRulesPage: { title: 'Reguły wydatków', findRule: 'Znajdź regułę', - emptyRules: {title: 'Nie ma jeszcze żadnych zasad', subtitle: 'Dodaj regułę, aby zautomatyzować raportowanie wydatków.'}, + emptyRules: { + title: 'Nie ma jeszcze żadnych zasad', + subtitle: 'Dodaj regułę, aby zautomatyzować raportowanie wydatków.', + }, changes: { billableUpdate: (value: boolean) => `Zaktualizuj wydatek ${value ? 'rozliczalny' : 'niepodlegające fakturowaniu'}`, categoryUpdate: (value: string) => `Zaktualizuj kategorię na „${value}”`, @@ -3948,7 +4043,11 @@ ${amount} dla ${merchant} - ${date}`, detailsPage: { localTime: 'Czas lokalny', }, - newChatPage: {startGroup: 'Rozpocznij grupę', addToGroup: 'Dodaj do grupy', addUserToGroup: (username: string) => `Dodaj ${username} do grupy`}, + newChatPage: { + startGroup: 'Rozpocznij grupę', + addToGroup: 'Dodaj do grupy', + addUserToGroup: (username: string) => `Dodaj ${username} do grupy`, + }, yearPickerPage: { year: 'Rok', selectYear: 'Wybierz rok', @@ -4787,7 +4886,12 @@ ${amount} dla ${merchant} - ${date}`, departs: 'Odjazd', errorMessage: 'Coś poszło nie tak. Spróbuj ponownie później.', phoneError: (phoneErrorMethodsRoute: string) => `Aby zarezerwować podróż, dodaj służbowy adres e‑mail jako swój główny login.`, - domainSelector: {headline: 'Którą domenę chcesz skonfigurować?', title: 'Domena', subtitle: 'Wybierz domenę do konfiguracji Expensify Travel.', recommended: 'Polecane'}, + domainSelector: { + headline: 'Którą domenę chcesz skonfigurować?', + title: 'Domena', + subtitle: 'Wybierz domenę do konfiguracji Expensify Travel.', + recommended: 'Polecane', + }, workspaceAddress: {headline: 'Jaki jest adres twojej firmy?'}, domainPermissionInfo: { title: 'Domena', @@ -4847,7 +4951,9 @@ ${amount} dla ${merchant} - ${date}`, title: 'NIP', subtitle: 'Podaj swój numer identyfikacji podatkowej podmiotu prawnego, żebyśmy mogli skonfigurować rozliczenia za podróże w twojej lokalnej walucie.', inputLabel: 'NIP podmiotu prawnego', - error: {required: 'Podaj swój identyfikator podatkowy podmiotu prawnego.'}, + error: { + required: 'Podaj swój identyfikator podatkowy podmiotu prawnego.', + }, }, nudge: { airfareManual: @@ -5043,7 +5149,10 @@ ${amount} dla ${merchant} - ${date}`, }, budgetFrequency: {monthly: 'miesięcznie', yearly: 'rocznie'}, budgetFrequencyUnit: {monthly: 'miesiąc', yearly: 'rok'}, - budgetTypeForNotificationMessage: {tag: 'znacznik', category: 'kategoria'}, + budgetTypeForNotificationMessage: { + tag: 'znacznik', + category: 'kategoria', + }, policyExpenseChatName: (displayName: string) => `Wydatki ${displayName}`, deepDiveExpensifyCard: `Transakcje z Karty Expensify będą automatycznie eksportowane do „Konta zobowiązań Karty Expensify” utworzonego dzięki naszej integracji.`, travelInvoicing: 'Eksportuj skonsolidowane wydatki z rozliczeń podróży jako', @@ -5631,10 +5740,16 @@ ${amount} dla ${merchant} - ${date}`, label: 'Eksportuj zwracane wydatki jako', helperText: 'Wydatki oznaczone jako podlegające zwrotowi zostaną wyeksportowane jako faktury do zapłaty wystawione na pracownika.', }, - exportNonReimbursable: {label: 'Eksportuj niewliczane do zwrotu wydatki jako'}, + exportNonReimbursable: { + label: 'Eksportuj niewliczane do zwrotu wydatki jako', + }, expenseReports: 'Raporty wydatków', - exportReimbursableExpenseReports: {helperText: 'Wydatki oznaczone jako podlegające zwrotowi zostaną wyeksportowane jako raporty wydatków wystawione na pracownika.'}, - exportNonReimbursableExpenseReports: {helperText: 'Wydatki oznaczone jako niepodlegające zwrotowi zostaną wyeksportowane jako raporty wydatków wystawione na pracownika.'}, + exportReimbursableExpenseReports: { + helperText: 'Wydatki oznaczone jako podlegające zwrotowi zostaną wyeksportowane jako raporty wydatków wystawione na pracownika.', + }, + exportNonReimbursableExpenseReports: { + helperText: 'Wydatki oznaczone jako niepodlegające zwrotowi zostaną wyeksportowane jako raporty wydatków wystawione na pracownika.', + }, noVendorsFound: 'Nie znaleziono dostawców', noVendorsFoundDescription: 'Po dodaniu dostawców w Certinia zsynchronizuj ponownie to połączenie.', noCompaniesFound: 'Nie znaleziono firm', @@ -5664,7 +5779,12 @@ ${amount} dla ${merchant} - ${date}`, chartOfAccounts: 'Plan kont', chartOfAccountsDescription: 'Plan kont jest importowany do Expensify jako kategorie.', dimensionMapping: ({n}: {n: number}) => `Wymiar ${n}`, - dimensions: {dimension1: 'Wymiar 1', dimension2: 'Wymiar 2', dimension3: 'Wymiar 3', dimension4: 'Wymiar 4'}, + dimensions: { + dimension1: 'Wymiar 1', + dimension2: 'Wymiar 2', + dimension3: 'Wymiar 3', + dimension4: 'Wymiar 4', + }, doNotMap: 'Nie mapuj', doNotMapSubtitle: 'Domyślnie użyj zasobu pracownika', mappingTypes: { @@ -6126,7 +6246,14 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy noAccountsFound: 'Nie znaleziono kont', noAccountsFoundDescription: 'Dodaj proszę konta w Rillet i zsynchronizuj połączenie ponownie', exportDescription: 'Skonfiguruj sposób eksportowania danych Expensify do Rillet.', - exportReimbursable: {label: 'Eksportuj wydatki podlegające zwrotowi jako', values: {[CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: {label: 'Faktury od dostawców'}}}, + exportReimbursable: { + label: 'Eksportuj wydatki podlegające zwrotowi jako', + values: { + [CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: { + label: 'Faktury od dostawców', + }, + }, + }, exportDate: { label: 'Data rachunku od dostawcy', description: 'Użyj tej daty podczas eksportowania raportów do Rillet.', @@ -6145,9 +6272,22 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy }, }, }, - exportNonReimbursable: {label: 'Eksportuj wydatki z firmowej karty jako', values: {[CONST.RILLET_EXPORT_NON_REIMBURSABLE.CREDIT_CARD_CHARGE]: {label: 'Karty kredytowe'}}}, - defaultCompanyCardVendor: {label: 'Domyślny dostawca karty firmowej', description: 'Wybierz domyślnego dostawcę Rillet dla wydatków, które nie dopasują się automatycznie.'}, - companyCardAccount: {label: 'Konto karty firmowej', description: 'Wybierz miejsce eksportu transakcji z kart firmowych.'}, + exportNonReimbursable: { + label: 'Eksportuj wydatki z firmowej karty jako', + values: { + [CONST.RILLET_EXPORT_NON_REIMBURSABLE.CREDIT_CARD_CHARGE]: { + label: 'Karty kredytowe', + }, + }, + }, + defaultCompanyCardVendor: { + label: 'Domyślny dostawca karty firmowej', + description: 'Wybierz domyślnego dostawcę Rillet dla wydatków, które nie dopasują się automatycznie.', + }, + companyCardAccount: { + label: 'Konto karty firmowej', + description: 'Wybierz miejsce eksportu transakcji z kart firmowych.', + }, noBankAccountsFound: 'Nie znaleziono żadnych kont bankowych', noBankAccountsFoundDescription: 'Dodaj proszę konta bankowe w Rillet i zsynchronizuj połączenie ponownie', autoSyncDescription: 'Synchronizuj Rillet i Expensify automatycznie, każdego dnia. Raporty synchronizują się w czasie rzeczywistym.', @@ -6165,9 +6305,15 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy }, syncReimbursedReports: 'Synchronizuj rozliczone raporty', syncReimbursedReportsDescription: 'Gdy raport zostanie opłacony przez ACH, na tym koncie zostanie wygenerowana płatność rachunku.', - billPaymentAccount: {label: 'Konto do opłacania rachunków', description: 'Wybierz, z którego konta chcesz opłacać rachunki, a my utworzymy płatność w Rillet.'}, + billPaymentAccount: { + label: 'Konto do opłacania rachunków', + description: 'Wybierz, z którego konta chcesz opłacać rachunki, a my utworzymy płatność w Rillet.', + }, syncExpensifyCardSettlements: 'Synchronizuj rozliczenia Karty Expensify', - settlementAccount: {label: 'Rachunek rozliczeniowy Karty Expensify', description: 'Wybierz swoje konto rozliczeniowe, a my utworzymy płatność w Rillet.'}, + settlementAccount: { + label: 'Rachunek rozliczeniowy Karty Expensify', + description: 'Wybierz swoje konto rozliczeniowe, a my utworzymy płatność w Rillet.', + }, syncTravelInvoicingSettlements: 'Synchronizuj rozliczenia skonsolidowanego fakturowania podróży', travelInvoicingSettlementAccount: { label: 'Konto rozliczeniowe scentralizowanego rozliczania podróży', @@ -6312,19 +6458,27 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy }, syncReimbursedReports: 'Synchronizuj rozliczone raporty', syncReimbursedReportsDescription: 'Gdy raport zostanie opłacony przez ACH, w tym koncie zostanie wygenerowana płatność rachunku.', - billPaymentAccount: {label: 'Konto do płatności rachunków', description: 'Wybierz, z którego konta chcesz opłacać rachunki, a my utworzymy płatność w DualEntry.'}, + billPaymentAccount: { + label: 'Konto do płatności rachunków', + description: 'Wybierz, z którego konta chcesz opłacać rachunki, a my utworzymy płatność w DualEntry.', + }, fxExpenseAccount: { label: 'Konto opłaty za przewalutowanie DualEntry', description: 'Gdy twoja firma pokrywa koszt przewalutowania przy płatności dokonanej za granicą, zaksięgujemy ten koszt na tym koncie w DualEntry jako zapis w dzienniku.', }, syncExpensifyCardSettlements: 'Synchronizuj rozliczenia Karty Expensify', - settlementAccount: {label: 'Rachunek rozliczeniowy Karty Expensify', description: 'Wybierz swoje konto rozliczeniowe, a my utworzymy płatność w DualEntry.'}, + settlementAccount: { + label: 'Rachunek rozliczeniowy Karty Expensify', + description: 'Wybierz swoje konto rozliczeniowe, a my utworzymy płatność w DualEntry.', + }, syncTravelInvoicingSettlements: 'Synchronizuj rozliczenia Consolidated Travel Billing', travelInvoicingSettlementAccount: { label: 'Konto rozliczeniowe skonsolidowanego rozliczania podróży', description: 'Wybierz swoje konto rozliczeniowe, a my utworzymy płatność w DualEntry.', }, - travelInvoicingPayableAccount: {label: 'Konto zobowiązań skonsolidowanego rozliczania podróży'}, + travelInvoicingPayableAccount: { + label: 'Konto zobowiązań skonsolidowanego rozliczania podróży', + }, }, type: { free: 'Darmowy', @@ -6466,13 +6620,28 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy cardIdentityColumn: 'Przypisz numer karty lub nazwę karty, żeby transakcje mogły być dopasowane do karty.', }, fileImportDescription: 'Ręczna opcja, jeśli Twój bank nie może wysyłać kanału danych.', - duplicateFeedModal: {title: 'Kanał karty jest już połączony', prompt: 'Nie możesz dodać tego samego źródła danych karty do tego samego obszaru roboczego dwa razy.'}, + duplicateFeedModal: { + title: 'Kanał karty jest już połączony', + prompt: 'Nie możesz dodać tego samego źródła danych karty do tego samego obszaru roboczego dwa razy.', + }, }, statementCloseDate: { [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Ostatni dzień miesiąca', [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Ostatni dzień roboczy miesiąca', [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Niestandardowy dzień miesiąca', }, + reimbursable: { + title: 'Podlegające zwrotowi', + description: 'Wybierz, jak mają być tworzone transakcje kartą. Nowe transakcje będą zgodne z tymi zasadami.', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES]: 'Zawsze podlega zwrotowi', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES}Description`]: 'Zawsze zwracane pracownikom', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO]: 'Zawsze nie podlega zwrotowi', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO}Description`]: 'Nigdy nie jest zwracane pracownikom', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES]: 'Podlega zwrotowi', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES}Description`]: 'Najczęściej zwracane pracownikom', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO]: 'Nie podlega zwrotowi', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO}Description`]: 'Czasami zwracane pracownikom', + }, assign: 'Przypisz', assignCard: 'Przypisz kartę', findCompanyCard: 'Znajdź kartę firmową', @@ -6518,7 +6687,10 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy importButton: 'Importuj transakcje', }, deletedCard: 'Usunięta karta', - assignNewCards: {title: 'Przydziel nowe karty', description: 'Pobierz z banku najnowsze karty do przypisania'}, + assignNewCards: { + title: 'Przydziel nowe karty', + description: 'Pobierz z banku najnowsze karty do przypisania', + }, }, expensifyCard: { issueAndManageCards: 'Wydawaj i zarządzaj Kartami Expensify', @@ -6715,7 +6887,10 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy ctaText: 'Zarządzaj podróżami', }, settings: { - autoAddTripName: {title: 'Dodaj nazwy podróży do wydatków', subtitle: 'Automatycznie dodawaj nazwy podróży do opisów wydatków za podróże zarezerwowane w Expensify.'}, + autoAddTripName: { + title: 'Dodaj nazwy podróży do wydatków', + subtitle: 'Automatycznie dodawaj nazwy podróży do opisów wydatków za podróże zarezerwowane w Expensify.', + }, codingSync: { title: 'Synchronizuj kodowanie z Expensify Travel', subtitle: 'Przekaż kategorie, tagi i pola raportu tego workspace’u do Expensify Travel, żeby podróżujący odpowiadali na nie podczas rezerwacji.', @@ -6947,14 +7122,18 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy subtitle: 'Ustaw godzinową stawkę rozliczeniową do śledzenia czasu.', defaultHourlyRate: 'Domyślna stawka godzinowa', }, - hrWarningModal: {disconnectText: ({integration}: {integration: string}) => `Aby wyłączyć HR, najpierw odłącz ${integration} od tego workspace’a.`}, + hrWarningModal: { + disconnectText: ({integration}: {integration: string}) => `Aby wyłączyć HR, najpierw odłącz ${integration} od tego workspace’a.`, + }, vendors: { title: 'Dostawcy', subtitle: 'Dopasuj wydatki z karty do kontrahentów zaimportowanych z twojego oprogramowania księgowego.', disabledTitle: 'Nie tak szybko...', disabledMessage: 'Aby włączyć lub wyłączyć tę funkcję, musisz zmienić ustawienia importu księgowego.', }, - recruitingWarningModal: {disconnectText: ({integration}: {integration: string}) => `Aby wyłączyć Rekrutację, najpierw odłącz ${integration} od tego workspace.`}, + recruitingWarningModal: { + disconnectText: ({integration}: {integration: string}) => `Aby wyłączyć Rekrutację, najpierw odłącz ${integration} od tego workspace.`, + }, }, reports: { reportsCustomTitleExamples: 'Przykłady:', @@ -6976,7 +7155,10 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy findReportField: 'Znajdź pole raportu', deleteConfirmation: 'Czy na pewno chcesz usunąć to pole raportu?', deleteFieldsConfirmation: 'Czy na pewno chcesz usunąć te pola raportu?', - emptyReportFields: {title: 'Brak jeszcze pól raportu', subtitle: 'Dodaj niestandardowe pole (tekstowe, daty lub z listą wyboru), które będzie widoczne w raportach.'}, + emptyReportFields: { + title: 'Brak jeszcze pól raportu', + subtitle: 'Dodaj niestandardowe pole (tekstowe, daty lub z listą wyboru), które będzie widoczne w raportach.', + }, subtitle: 'Pola raportu mają zastosowanie do wszystkich wydatków i mogą być pomocne, gdy chcesz poprosić o dodatkowe informacje.', disableReportFields: 'Wyłącz pola raportu', disableReportFieldsConfirmation: 'Na pewno? Pola tekstowe i daty zostaną usunięte, a listy wyłączone.', @@ -7001,7 +7183,10 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy disableValues: 'Wyłącz wartości', enableValue: 'Włącz wartość', enableValues: 'Włącz wartości', - emptyReportFieldsValues: {title: 'Nie ma jeszcze wartości listy', subtitle: 'Dodaj własne wartości, które będą wyświetlane w raportach.'}, + emptyReportFieldsValues: { + title: 'Nie ma jeszcze wartości listy', + subtitle: 'Dodaj własne wartości, które będą wyświetlane w raportach.', + }, deleteValuePrompt: 'Czy na pewno chcesz usunąć tę wartość listy?', deleteValuesPrompt: 'Czy na pewno chcesz usunąć te wartości listy?', listValueRequiredError: 'Wpisz nazwę wartości listy', @@ -7341,10 +7526,16 @@ Plan Control zaczyna się od 9 USD za aktywnego członka miesięcznie.`, auditors: 'Audytorzy', guests: 'Goście', editors: 'Edytorzy', - emptyRoleFilter: {title: 'Żadni członkowie nie pasują do tego filtra', subtitle: 'Zaproś członka lub zmień filtr powyżej.'}, + emptyRoleFilter: { + title: 'Żadni członkowie nie pasują do tego filtra', + subtitle: 'Zaproś członka lub zmień filtr powyżej.', + }, configureHRSync: (providerName: string) => `Skonfiguruj synchronizację ${providerName}.`, syncWithHR: (providerName: string) => `Synchronizuj z ${providerName}`, - makeCardAdmin: () => ({one: 'Ustaw jako administratora karty', other: 'Ustaw administratorów kart'}), + makeCardAdmin: () => ({ + one: 'Ustaw jako administratora karty', + other: 'Ustaw administratorów kart', + }), cardAdmins: 'Administratorzy kart', peopleAdmins: 'Administratorzy osób', paymentsAdmins: 'Administratorzy płatności', @@ -7834,7 +8025,11 @@ Plan Control zaczyna się od 9 USD za aktywnego członka miesięcznie.`, promptEnd: '.', cta: 'Jasne', }, - errors: {distanceMustBePositive: 'Dystans musi być dodatnią liczbą całkowitą.', invalidAddress: 'Wpisz prawidłowy adres', distanceTooLarge: 'Odległość jest zbyt duża.'}, + errors: { + distanceMustBePositive: 'Dystans musi być dodatnią liczbą całkowitą.', + invalidAddress: 'Wpisz prawidłowy adres', + distanceTooLarge: 'Odległość jest zbyt duża.', + }, workArrangement: { title: 'Domyślny tryb pracy', officeBasedTitle: 'Pracujący z biura', @@ -7852,7 +8047,10 @@ Plan Control zaczyna się od 9 USD za aktywnego członka miesięcznie.`, }, distance: 'Dystans', centrallyManage: 'Centralnie zarządzaj stawkami, śledź w milach lub kilometrach i ustaw domyślną kategorię.', - emptyRates: {title: 'Brak stawek za dystans', subtitle: 'Dodaj stawkę do zwrotu kosztów przejechanych kilometrów według niestandardowych stawek.'}, + emptyRates: { + title: 'Brak stawek za dystans', + subtitle: 'Dodaj stawkę do zwrotu kosztów przejechanych kilometrów według niestandardowych stawek.', + }, rate: 'Oceń', addRate: 'Dodaj stawkę', findRate: 'Znajdź kurs', @@ -8490,7 +8688,11 @@ Wymagaj szczegółów wydatków, takich jak paragony i opisy, ustawiaj limity i preventPayoutNonReimbursableReportsTitle: 'Zapobiegaj oznaczaniu nierozliczanych raportów jako opłaconych', preventPayoutNonReimbursableReportsSubtitle: 'Nie pozwalaj administratorom oznaczać nierozliczanych raportów jako opłacone.', }, - agentsPromoBanner: {title: 'Nie widzisz potrzebnej reguły? Dodaj agenta', subtitle: 'Dodaj złożone reguły i ogranicz ręczne akceptacje dzięki własnym agentom.', cta: 'Wypróbuj'}, + agentsPromoBanner: { + title: 'Nie widzisz potrzebnej reguły? Dodaj agenta', + subtitle: 'Dodaj złożone reguły i ogranicz ręczne akceptacje dzięki własnym agentom.', + cta: 'Wypróbuj', + }, merchantRules: { title: 'Sprzedawca', subtitle: 'Skonfiguruj reguły dla sprzedawców, aby wydatki trafiały z prawidłowym kodowaniem i wymagały mniej poprawek.', @@ -8837,7 +9039,12 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, emptyAmountError: 'Wpisz prawidłową kwotę przed zapisaniem', receiptAmountGreaterThanItemizedError: 'Kwota wymagająca paragonu nie może być większa niż kwota wymagająca zbilansowanego paragonu.', }, - requireFields: {title: 'Wymagaj pól dla wszystkich wydatków', category: 'Kategoria', tag: 'Tag', save: 'Zapisz regułę'}, + requireFields: { + title: 'Wymagaj pól dla wszystkich wydatków', + category: 'Kategoria', + tag: 'Tag', + save: 'Zapisz regułę', + }, newRule: { title: 'Nowa reguła', subtitle: 'Co chcesz zrobić?', @@ -8885,7 +9092,11 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, merchantTypeIs: (merchantType: string) => `Typ sprzedawcy to „${merchantType}"`, categoryIs: (category: string) => `Kategoria to „${category}”`, }, - merchantTypeRule: {merchantType: 'Typ sprzedawcy', saveRule: 'Zapisz regułę', confirmErrorCategory: 'Wybierz kategorię.'}, + merchantTypeRule: { + merchantType: 'Typ sprzedawcy', + saveRule: 'Zapisz regułę', + confirmErrorCategory: 'Wybierz kategorię.', + }, requireFieldsTable: { tableColumnType: 'Typ', tableColumnCondition: 'Warunek', @@ -8947,8 +9158,15 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, flagTypeWarning: 'Ostrzeżenie', flagTypeWarningDescription: 'Zgłaszający zostanie ostrzeżony, ale nadal może przesłać wydatek', }, - agentRulesEmptyState: {title: 'Nie dodano reguł agenta', subtitle: 'Utwórz regułę, żeby zautomatyzować zasady swojego workspace’u.', cta: 'Dodaj regułę AI'}, - categoriesDisabledEmptyState: {title: 'Kategorie nie są włączone', subtitle: 'Włącz kategorie, żeby mieć większą kontrolę nad wydatkami.'}, + agentRulesEmptyState: { + title: 'Nie dodano reguł agenta', + subtitle: 'Utwórz regułę, żeby zautomatyzować zasady swojego workspace’u.', + cta: 'Dodaj regułę AI', + }, + categoriesDisabledEmptyState: { + title: 'Kategorie nie są włączone', + subtitle: 'Włącz kategorie, żeby mieć większą kontrolę nad wydatkami.', + }, expenseDefaultType: { title: 'Zastosuj domyślne ustawienia wydatków', subtitle: 'Do czego ta reguła powinna pasować?', @@ -8957,7 +9175,11 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, category: 'Kategoria', categoryDescription: 'Ustaw domyślną stawkę podatku dla konkretnej kategorii', }, - taxesDisabledEmptyState: {title: 'Podatki nie są włączone', subtitle: 'Włącz podatki, aby udokumentować i odzyskać kwalifikujące się podatki.', cta: 'Włącz podatki'}, + taxesDisabledEmptyState: { + title: 'Podatki nie są włączone', + subtitle: 'Włącz podatki, aby udokumentować i odzyskać kwalifikujące się podatki.', + cta: 'Włącz podatki', + }, }, planTypePage: { planTypes: { @@ -9060,7 +9282,11 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, dontSeeYourATS: `Nie widzisz tutaj swojego ATS? Zapytaj Concierge, a my możemy go dodać.`, importSettings: 'Ustawienia importu', defaultApprover: 'Domyślny zatwierdzający', - approverFields: {recruiter: 'Rekruter', recruitingCoordinator: 'Koordynator rekrutacji', hiringManager: 'Rekruter'}, + approverFields: { + recruiter: 'Rekruter', + recruitingCoordinator: 'Koordynator rekrutacji', + hiringManager: 'Rekruter', + }, filters: { description: (providerName: string) => `Wybierz, którzy członkowie zostaną zaimportowani z ${providerName}. Możesz wybierać spośród etapów rekrutacji, tagów i biur.`, stages: { @@ -9075,7 +9301,12 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, toggleTitle: 'Tagi', allSelected: 'Wszystkie tagi', }, - offices: {title: 'Biuro', description: 'Wybierz biura kandydatów, które chcesz zsynchronizować z tym miejscem pracy', toggleTitle: 'Biura', allSelected: 'Wszystkie biura'}, + offices: { + title: 'Biuro', + description: 'Wybierz biura kandydatów, które chcesz zsynchronizować z tym miejscem pracy', + toggleTitle: 'Biura', + allSelected: 'Wszystkie biura', + }, enableJobStagesOrTags: 'Wybierz co najmniej jeden etap zadania lub znacznik, aby kontynuować', }, subtitle: 'Połącz narzędzia rekrutacyjne i utrzymuj zgody kandydatów w synchronizacji.', @@ -9133,7 +9364,10 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, approvalModeWarningConfirm: 'Zmień tryb zatwierdzania', syncingModalTitle: 'Twoje połączenie jest synchronizowane', syncingModalDescription: 'Pierwsze połączenie może chwilę potrwać. Zostaniesz powiadomiony o wszelkich błędach.', - syncLimitReached: {title: 'Spróbuj ponownie jutro', prompt: 'Osiągnąłeś dzienny limit synchronizacji.'}, + syncLimitReached: { + title: 'Spróbuj ponownie jutro', + prompt: 'Osiągnąłeś dzienny limit synchronizacji.', + }, syncResults: { title: (provider: string) => `Zsynchronizowano z ${provider}`, successTitle: (provider: string) => `Pomyślnie zsynchronizowano twoje połączenie z ${provider}!`, @@ -9163,22 +9397,40 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, enableNewAccountsDescription: 'Nowe konta Campfire będą dostępne jako kategorie.', dimensionsImport: 'Wszystkie wymiary Campfire są importowane jako tagi', exportDescription: 'Skonfiguruj sposób eksportowania danych z Expensify do Campfire.', - exportReimbursable: {label: 'Eksportuj wydatki podlegające zwrotowi jako', values: {VENDOR_BILL: {label: 'Faktury od dostawców'}}}, + exportReimbursable: { + label: 'Eksportuj wydatki podlegające zwrotowi jako', + values: {VENDOR_BILL: {label: 'Faktury od dostawców'}}, + }, exportDate: { label: 'Data faktury od dostawcy', description: 'Użyj tej daty podczas eksportowania raportów do Campfire.', values: { - LAST_EXPENSE: {label: 'Data ostatniego wydatku', description: 'Data ostatniego wydatku w raporcie.'}, - REPORT_EXPORTED: {label: 'Data eksportu', description: 'Data eksportu raportu do Campfire.'}, - REPORT_SUBMITTED: {label: 'Data przesłania', description: 'Data wysłania raportu do zatwierdzenia.'}, + LAST_EXPENSE: { + label: 'Data ostatniego wydatku', + description: 'Data ostatniego wydatku w raporcie.', + }, + REPORT_EXPORTED: { + label: 'Data eksportu', + description: 'Data eksportu raportu do Campfire.', + }, + REPORT_SUBMITTED: { + label: 'Data przesłania', + description: 'Data wysłania raportu do zatwierdzenia.', + }, }, }, - exportNonReimbursable: {label: 'Wyeksportuj wydatki z karty firmowej jako', values: {JOURNAL_ENTRY: {label: 'Zapisy w dzienniku'}}}, + exportNonReimbursable: { + label: 'Wyeksportuj wydatki z karty firmowej jako', + values: {JOURNAL_ENTRY: {label: 'Zapisy w dzienniku'}}, + }, defaultCompanyCardVendor: { label: 'Domyślny dostawca dla wszystkich firmowych kart', description: 'Wybierz domyślnego dostawcę Campfire dla wydatków, które nie dopasowują się automatycznie.', }, - companyCardAccount: {label: 'Konto karty firmowej', description: 'Wybierz miejsce eksportu transakcji z kart firmowych.'}, + companyCardAccount: { + label: 'Konto karty firmowej', + description: 'Wybierz miejsce eksportu transakcji z kart firmowych.', + }, noAccountsFound: 'Nie znaleziono kont', noAccountsFoundDescription: 'Dodaj proszę konta w Campfire i zsynchronizuj połączenie ponownie', autoSyncDescription: 'Synchronizuj Campfire i Expensify automatycznie, każdego dnia. Raporty synchronizują się w czasie rzeczywistym.', @@ -9196,15 +9448,23 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, }, syncReimbursedReports: 'Synchronizuj rozliczone raporty', syncReimbursedReportsDescription: 'Gdy raport zostanie opłacony przez ACH, na tym koncie zostanie wygenerowana płatność rachunku.', - billPaymentAccount: {label: 'Konto do opłacania rachunków', description: 'Wybierz konto rozliczeniowe dla kredytów Campfire, gdy Expensify oznaczy rachunek jako zapłacony.'}, + billPaymentAccount: { + label: 'Konto do opłacania rachunków', + description: 'Wybierz konto rozliczeniowe dla kredytów Campfire, gdy Expensify oznaczy rachunek jako zapłacony.', + }, syncExpensifyCardSettlements: 'Synchronizuj rozliczenia Karty Expensify', - settlementAccount: {label: 'Rachunek rozliczeniowy Karty Expensify', description: 'Wybierz swoje konto rozliczeniowe, a my utworzymy płatność w Campfire.'}, + settlementAccount: { + label: 'Rachunek rozliczeniowy Karty Expensify', + description: 'Wybierz swoje konto rozliczeniowe, a my utworzymy płatność w Campfire.', + }, syncTravelInvoicingSettlements: 'Synchronizuj rozliczenia Consolidated Travel Billing', travelInvoicingSettlementAccount: { label: 'Konto rozliczeniowe skonsolidowanego rozliczania podróży', description: 'Wybierz swoje konto rozliczeniowe, a my utworzymy płatność w Campfire.', }, - travelInvoicingPayableAccount: {label: 'Konto zobowiązań skonsolidowanego rozliczania podróży'}, + travelInvoicingPayableAccount: { + label: 'Konto zobowiązań skonsolidowanego rozliczania podróży', + }, exportToMultipleAccounts: 'Skonfiguruj eksport do wielu kont', cardProgramAccount: { label: 'Konto programu kartowego', @@ -9845,7 +10105,11 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, commuterExclusions: { changedToFixedDistance: ({previousMethod}: {previousMethod: string}) => `zmienił(-a) wykluczanie dojazdów na stałą odległość na zgłoszenie (wcześniej ${previousMethod})`, changedToHomeAndOffice: ({previousMethod}: {previousMethod: string}) => `zmienił(-a) wykluczanie dojazdów na obliczanie według domu i biura (wcześniej ${previousMethod})`, - previousMethod: {disabled: 'nie wykluczaj dojazdów', fixedDistance: 'stała odległość na zgłoszenie', homeAndOffice: 'dom i biuro'}, + previousMethod: { + disabled: 'nie wykluczaj dojazdów', + fixedDistance: 'stała odległość na zgłoszenie', + homeAndOffice: 'dom i biuro', + }, setFixedDistance: ({formattedDistance}: {formattedDistance: string}) => `ustaw stałe wyłączenie dystansu na ${formattedDistance} na zgłoszenie`, changedFixedDistance: ({formattedOldDistance, formattedNewDistance}: {formattedOldDistance: string; formattedNewDistance: string}) => `zmieniono stałe wykluczenie odległości na ${formattedNewDistance} na zgłoszenie (wcześniej ${formattedOldDistance})`, @@ -9900,6 +10164,8 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, updatedMccGroupCategory: ({mccGroupName, oldCategory, newCategory}: {mccGroupName: string; oldCategory: string; newCategory: string}) => `zmieniono domyślną kategorię wydatków dla „${mccGroupName}” na „${newCategory}” (poprzednio „${oldCategory}”)`, updatedRequireCompanyCards: ({enabled}: {enabled: boolean}) => `${enabled ? 'włączone' : 'wyłączone'} wymóg dotyczący zakupów kartą służbową`, + updatedCardFeedReimbursable: (feedName: string, newValue?: string, previousValue?: string) => + `zmienił(a) ustawienie zwrotu dla kanału kart "${feedName}"${newValue ? ` na "${newValue}"` : ''}${previousValue ? ` (wcześniej "${previousValue}")` : ''}`, agentRule: { added: ({title, prompt}: {title: string; prompt: string}) => (title ? `dodał(a) regułę agenta „${title}”: ${prompt}` : `dodano regułę agenta: ${prompt}`), updated: ({title, prompt}: {title: string; prompt: string}) => (title ? `zaktualizował(a) regułę agenta „${title}” na: ${prompt}` : `zaktualizowano regułę agenta na: ${prompt}`), @@ -9933,7 +10199,13 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, one: 'zastosowano regułę wydatków do 1 dodatkowej karty', other: `zastosowano regułę wydatków do ${count} dodatkowych kart`, }), - phraseVerb: {added: 'dodano', removed: 'usunięto', changed: 'zmieniono', set: 'ustaw', applied: 'zastosowano'}, + phraseVerb: { + added: 'dodano', + removed: 'usunięto', + changed: 'zmieniono', + set: 'ustaw', + applied: 'zastosowano', + }, bodyMerchant: ({adjective, value}: {adjective: string; value: string}) => (adjective !== '' ? `${adjective} sprzedawca '${value}'` : `sprzedawca „${value}”`), bodyMerchantValueOnly: ({value}: {value: string}) => `„${value}”`, bodyMerchantChange: ({adjective, oldValue, newValue}: {adjective: string; oldValue: string; newValue: string}) => @@ -10171,7 +10443,11 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, subtitleCannotSend: 'Potrzebujesz przestrzeni roboczej z włączonym Invoices, aby wysyłać faktury.', subtitleCannotSendWithTestDrive: 'Potrzebujesz przestrzeni roboczej z włączonym Invoices, aby wysyłać faktury. Wypróbuj Expensify, aby dowiedzieć się więcej.', }, - emptyTripResults: {title: 'Brak podróży', subtitle: 'Zacznij od zarezerwowania swojej pierwszej podróży poniżej.', buttonText: 'Zarezerwuj podróż'}, + emptyTripResults: { + title: 'Brak podróży', + subtitle: 'Zacznij od zarezerwowania swojej pierwszej podróży poniżej.', + buttonText: 'Zarezerwuj podróż', + }, emptySubmitResults: { title: 'Brak wydatków do przesłania', subtitle: 'Wszystko gotowe. Czas na rundę zwycięstwa!', @@ -10200,7 +10476,11 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, title: 'Brak wydatków do zatwierdzenia', subtitle: 'Zero wydatków. Maksymalny luz. Dobra robota!', }, - staleResults: {title: 'Wymagane odświeżenie', subtitle: 'Ta strona jest nieaktualna, odśwież ją, żeby zobaczyć najnowszą wersję', buttonText: 'Odśwież'}, + staleResults: { + title: 'Wymagane odświeżenie', + subtitle: 'Ta strona jest nieaktualna, odśwież ją, żeby zobaczyć najnowszą wersję', + buttonText: 'Odśwież', + }, }, columns: 'Kolumny', editColumns: 'Edytuj kolumny', @@ -10303,8 +10583,15 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, cardFeedNameCSV: ({cardFeedLabel}: {cardFeedLabel?: string}) => `Wszystkie zaimportowane karty CSV${cardFeedLabel ? ` - ${cardFeedLabel}` : ''}`, travelInvoicing: 'Zbiorcze rozliczanie podróży', }, - bankAccount: {banks: 'Konta bankowe', closedBankAccounts: 'Zamknięte konta bankowe'}, - workspace: {active: 'Aktywne', archived: 'Zarchiwizowane', selectAll: 'Zaznacz wszystko'}, + bankAccount: { + banks: 'Konta bankowe', + closedBankAccounts: 'Zamknięte konta bankowe', + }, + workspace: { + active: 'Aktywne', + archived: 'Zarchiwizowane', + selectAll: 'Zaznacz wszystko', + }, reportField: (name: string, value: string) => `${name} to ${value}`, current: 'Bieżące', past: 'Przeszłe', @@ -10347,14 +10634,21 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, [CONST.SEARCH.WITHDRAWAL_TYPE.TRAVEL_BILLING]: 'Zbiorcze rozliczanie podróży', }, is: 'Jest', - has: {submittedViolation: 'Zgłoszone naruszenie', approvedViolation: 'Zatwierdzone naruszenie'}, + has: { + submittedViolation: 'Zgłoszone naruszenie', + approvedViolation: 'Zatwierdzone naruszenie', + }, action: { [CONST.SEARCH.ACTION_FILTERS.SUBMIT]: 'Wyślij', [CONST.SEARCH.ACTION_FILTERS.APPROVE]: 'Zatwierdź', [CONST.SEARCH.ACTION_FILTERS.PAY]: 'Zapłać', [CONST.SEARCH.ACTION_FILTERS.EXPORT]: 'Eksportuj', }, - filterType: {label: 'Typ filtra', has: {positive: 'ma', negative: 'nie ma'}, is: {positive: 'jest', negative: 'nie jest'}}, + filterType: { + label: 'Typ filtra', + has: {positive: 'ma', negative: 'nie ma'}, + is: {positive: 'jest', negative: 'nie jest'}, + }, merchant: { matchType: 'Typ dopasowania', contains: (merchant?: string) => (merchant ? `Zawiera "${merchant}"` : 'Zawiera'), @@ -10397,7 +10691,10 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, [CONST.SEARCH.GROUP_BY.YEAR]: 'Lata', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Kwartały', }, - moneyRequestReport: {emptyStateTitle: 'Brak wydatków', accessPlaceHolder: 'Otwórz, aby zobaczyć szczegóły'}, + moneyRequestReport: { + emptyStateTitle: 'Brak wydatków', + accessPlaceHolder: 'Otwórz, aby zobaczyć szczegóły', + }, noCategory: 'Brak kategorii', noMerchant: 'Brak sprzedawcy', noTag: 'Brak tagu', @@ -10466,7 +10763,10 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, mergeReports: { title: 'Połącz raporty', description: 'Wybierz raport, który chcesz zachować. Wszystkie wydatki zostaną do niego przeniesione, a pozostałe raporty zostaną usunięte.', - listPage: {noEligibleReportsFound: 'Nie znaleziono kwalifikujących się raportów', noEligibleReportsFoundSubtitle: 'Nie masz żadnych raportów, które można połączyć.'}, + listPage: { + noEligibleReportsFound: 'Nie znaleziono kwalifikujących się raportów', + noEligibleReportsFoundSubtitle: 'Nie masz żadnych raportów, które można połączyć.', + }, }, periodSoFar: ({period}: {period: string}) => `${period} do tej pory`, weekOf: ({date}: {date: string}) => `Tydzień od ${date}`, @@ -10503,11 +10803,21 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, }, }, settlement: { - status: {pending: 'Oczekujące', cleared: 'Wyczyszczono', failed: 'Niepowodzenie', never: 'Nigdy', cashBack: 'Zwrot gotówki'}, + status: { + pending: 'Oczekujące', + cleared: 'Wyczyszczono', + failed: 'Niepowodzenie', + never: 'Nigdy', + cashBack: 'Zwrot gotówki', + }, failedError: ({link}: {link: string}) => `Spróbujemy ponownie rozliczyć tę płatność, gdy odblokujesz swoje konto.`, withdrawalInfo: ({date, withdrawalID}: {date: string; withdrawalID: number}) => `${date} • ID wypłaty: ${withdrawalID}`, }, - paidStatus: {markedAsPaid: 'Oznaczone jako opłacone', withdrawing: 'Wypłata', confirmed: 'Potwierdzone'}, + paidStatus: { + markedAsPaid: 'Oznaczone jako opłacone', + withdrawing: 'Wypłata', + confirmed: 'Potwierdzone', + }, reportLayout: { reportLayout: 'Układ raportu', groupByLabel: 'Grupuj według:', @@ -10953,14 +11263,23 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, prompt: 'Czy na pewno chcesz zatrzymać śledzenie GPS i przełączyć się na Expensify Classic?', confirm: 'Zatrzymaj i przełącz', }, - switchAccountWarningTripInProgress: {title: 'Trwa śledzenie GPS', prompt: 'Na pewno chcesz zatrzymać śledzenie GPS i przełączyć konto?', confirm: 'Zatrzymaj i przełącz'}, + switchAccountWarningTripInProgress: { + title: 'Trwa śledzenie GPS', + prompt: 'Na pewno chcesz zatrzymać śledzenie GPS i przełączyć konto?', + confirm: 'Zatrzymaj i przełącz', + }, locationServicesRequiredModal: { title: 'Wymagany dostęp do lokalizacji', confirm: 'Otwórz ustawienia', prompt: 'Zezwól na dostęp do lokalizacji w ustawieniach urządzenia, aby rozpocząć śledzenie dystansu GPS.', }, gpsFloatingPillText: 'Trwa śledzenie GPS...', - liveActivity: {subtitle: 'Śledzenie dystansu', button: 'Zobacz postęp', lockScreenBadgeText: 'Dystans', lockScreenTrackingText: 'Śledzenie...'}, + liveActivity: { + subtitle: 'Śledzenie dystansu', + button: 'Zobacz postęp', + lockScreenBadgeText: 'Dystans', + lockScreenTrackingText: 'Śledzenie...', + }, }, reportCardLostOrDamaged: { screenTitle: 'Świadectwo zgubione lub uszkodzone', @@ -11161,7 +11480,11 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, markAsCashToIgnore: 'Oznacz jako gotówkę, aby zignorować i poprosić o płatność.', smartscanFailed: ({canEdit = true, missingFields = []}: {canEdit?: boolean; missingFields?: string[]}) => { if (missingFields.length > 0) { - const fieldNames: Record = {merchant: 'sprzedawcy', date: 'daty', amount: 'kwoty'}; + const fieldNames: Record = { + merchant: 'sprzedawcy', + date: 'daty', + amount: 'kwoty', + }; const translated = missingFields.map((f) => fieldNames[f] ?? f); const fieldList = translated.join(translated.length > 2 ? ', ' : ' i '); return `Skanowanie paragonu nie powiodło się — brak ${fieldList}.${canEdit ? ' Wpisz szczegóły ręcznie.' : ''}`; @@ -11249,7 +11572,10 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, perDiem: 'ryczałt dzienny', notExpenseType: (expenseType: string) => `nie jest typem ${expenseType}`, billable: {enabled: 'Do refakturowania', disabled: 'Niefakturowalne'}, - reimbursable: {enabled: 'Podlegające zwrotowi', disabled: 'Nierefundowane'}, + reimbursable: { + enabled: 'Podlegające zwrotowi', + disabled: 'Nierefundowane', + }, withoutCategory: 'bez kategorii', fromMerchant: (merchant: string) => `od ${merchant}`, notFromMerchant: (merchant: string) => `nie od ${merchant}`, @@ -11444,7 +11770,10 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, title: 'Twoja faktura za podróż jest przeterminowana', subtitle: (date: string) => `Opłać fakturę za podróż do ${date}, żeby móc dalej rezerwować podróże.`, }, - travelInvoiceOverdueLocked: {title: 'Rezerwacja podróży jest wstrzymana', subtitle: 'Twoja faktura za podróż jest przeterminowana. Opłać ją, żeby znowu móc rezerwować podróże.'}, + travelInvoiceOverdueLocked: { + title: 'Rezerwacja podróży jest wstrzymana', + subtitle: 'Twoja faktura za podróż jest przeterminowana. Opłać ją, żeby znowu móc rezerwować podróże.', + }, }, cardSection: { title: 'Płatność', @@ -11573,7 +11902,14 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, one: '1 aktywny użytkownik', other: `${count} aktywnych użytkowników`, }), - state: {paid: 'Opłacone', cleared: 'Rozliczono', failed: 'Niepowodzenie', refunded: 'Zwrócono', disputed: 'Kwestionowana', balanceTransfer: 'Przelew salda'}, + state: { + paid: 'Opłacone', + cleared: 'Rozliczono', + failed: 'Niepowodzenie', + refunded: 'Zwrócono', + disputed: 'Kwestionowana', + balanceTransfer: 'Przelew salda', + }, details: 'Szczegóły płatności', badge: { balanceTransferTo: ({email}: {email: string}) => `Przelew salda do ${email}`, @@ -12043,7 +12379,10 @@ Oto *paragon testowy*, żeby pokazać Ci, jak to działa:`, other: 'Zamknij konta', }), closeAccountPrompt: 'Czy na pewno? Ta czynność jest nieodwracalna.', - forceCloseAccount: () => ({one: 'Wymuś zamknięcie konta', other: 'Wymuś zamknięcie kont'}), + forceCloseAccount: () => ({ + one: 'Wymuś zamknięcie konta', + other: 'Wymuś zamknięcie kont', + }), safeCloseAccount: () => ({ one: 'Zamknij konto bezpiecznie', other: 'Zamknij konta bezpiecznie', @@ -12064,7 +12403,10 @@ Oto *paragon testowy*, żeby pokazać Ci, jak to działa:`, reportSuspiciousActivityPrompt: (email: string) => `Czy na pewno? To zablokuje konto użytkownika ${email}.

Nasz zespół następnie przejrzy konto i usunie wszelki nieautoryzowany dostęp. Aby odzyskać dostęp, będą musieli współpracować z Concierge.`, reportSuspiciousActivityConfirmationPrompt: 'Przejrzymy konto, aby potwierdzić, że bezpiecznie je odblokować, i skontaktujemy się przez Concierge w razie pytań.', - emptyMembers: {title: 'Brak członków w tej grupie', subtitle: 'Dodaj członka lub spróbuj zmienić filtr powyżej.'}, + emptyMembers: { + title: 'Brak członków w tej grupie', + subtitle: 'Dodaj członka lub spróbuj zmienić filtr powyżej.', + }, moveToGroup: 'Przenieś do grupy', chooseWhereToMove: ({count}: {count: number}) => ({ one: 'Wybierz, dokąd przenieść 1 członka.', @@ -12095,7 +12437,10 @@ Oto *paragon testowy*, żeby pokazać Ci, jak to działa:`, }, groups: { title: 'Grupy', - memberCount: () => ({one: '1 członek', other: (count: number) => `${count} członków`}), + memberCount: () => ({ + one: '1 członek', + other: (count: number) => `${count} członków`, + }), defaultGroup: 'Domyślna grupa dla nowych członków', defaultGroupPrompt: (currentName: string, newName: string) => `Czy na pewno chcesz ustawić ${newName} jako grupę domyślną? Nowi członkowie będą zapraszani do tej grupy zamiast do poprzedniej grupy domyślnej (${currentName}). `, @@ -12186,6 +12531,10 @@ Oto *paragon testowy*, żeby pokazać Ci, jak to działa:`, mobileRenewPrompt: 'Odwiedź Expensify w przeglądarce internetowej, żeby odnowić wcześniej.', mobileClaimPrompt: 'Odwiedź Expensify w swojej przeglądarce internetowej, aby odebrać zniżkę na odnowienie.', }, - bulkActionBar: {label: 'Akcje zbiorcze', clearSelection: 'Wyczyść wybór', loadingSelection: 'Wczytywanie zaznaczenia'}, + bulkActionBar: { + label: 'Akcje zbiorcze', + clearSelection: 'Wyczyść wybór', + loadingSelection: 'Wczytywanie zaznaczenia', + }, }; export default translations; diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 97386f2c1da7..55243eb5b517 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -508,7 +508,10 @@ const translations: TranslationDeepObject = { quarter: 'Trimestre', vacationDelegate: 'Delegado de férias', expensifyLogo: 'Logo da Expensify', - concierge: {greeting: 'Oi, como posso ajudar?', showHistory: 'Mostrar histórico'}, + concierge: { + greeting: 'Oi, como posso ajudar?', + showHistory: 'Mostrar histórico', + }, duplicateReport: 'Duplicar relatório', approver: 'Aprovador', goToConcierge: 'Ir para o Concierge', @@ -547,8 +550,16 @@ const translations: TranslationDeepObject = { hasAnAnswer: 'O Concierge tem uma resposta!', collapseReasoning: 'Recolher raciocínio', expandReasoning: 'Expandir raciocínio', - enableNotifications: {prompt: 'Quer ser avisado quando o Concierge responder?', cta: 'Notificar'}, - feedback: {prompt: 'Essa resposta foi útil?', useful: 'Resposta útil', notUseful: 'Resposta inútil', thanks: 'Obrigado pelo feedback!'}, + enableNotifications: { + prompt: 'Quer ser avisado quando o Concierge responder?', + cta: 'Notificar', + }, + feedback: { + prompt: 'Essa resposta foi útil?', + useful: 'Resposta útil', + notUseful: 'Resposta inútil', + thanks: 'Obrigado pelo feedback!', + }, }, supportalNoAccess: { title: 'Calma aí', @@ -690,7 +701,10 @@ const translations: TranslationDeepObject = { statusNeverRegistered: 'Nunca registrado', statusNotRegistered: 'Não registrado', statusRegisteredThisDevice: 'Registrado', - statusRegisteredOtherDevice: () => ({one: 'Outro dispositivo registrado', other: 'Outros dispositivos registrados'}), + statusRegisteredOtherDevice: () => ({ + one: 'Outro dispositivo registrado', + other: 'Outros dispositivos registrados', + }), }, pleaseEnableInSystemSettings: { start: 'Ative a verificação por rosto/digital ou defina um código de acesso do dispositivo no seu', @@ -703,7 +717,10 @@ const translations: TranslationDeepObject = { letsVerifyItsYou: 'Vamos verificar se é você', nowLetsAuthenticateYou: 'Agora, vamos autenticar você...', letsAuthenticateYou: 'Vamos autenticar você...', - verifyYourself: {biometrics: 'Verifique sua identidade com seu rosto ou impressão digital', passkeys: 'Verifique sua identidade com uma chave de acesso'}, + verifyYourself: { + biometrics: 'Verifique sua identidade com seu rosto ou impressão digital', + passkeys: 'Verifique sua identidade com uma chave de acesso', + }, enableQuickVerification: { biometrics: 'Ative uma verificação rápida e segura usando seu rosto ou impressão digital. Nenhuma senha ou código é necessário.', passkeys: 'Ative uma verificação rápida e segura usando uma chave de acesso. Nenhuma senha ou código é necessário.', @@ -739,9 +756,13 @@ const translations: TranslationDeepObject = { }, verificationFailed: 'Falha na verificação', setPin: {didNotShipCard: 'Não enviamos seu cartão. Tente novamente.'}, - revealPin: {couldNotReveal: 'Não foi possível revelar seu PIN. Tente novamente.'}, + revealPin: { + couldNotReveal: 'Não foi possível revelar seu PIN. Tente novamente.', + }, changePin: {didNotChange: 'Nós não alteramos seu PIN. Tente novamente.'}, - revealCardDetail: {couldNotReveal: 'Não foi possível exibir os detalhes do seu cartão. Tente novamente.'}, + revealCardDetail: { + couldNotReveal: 'Não foi possível exibir os detalhes do seu cartão. Tente novamente.', + }, }, validateCodeModal: { successfulSignInTitle: Str.dedent(` @@ -982,11 +1003,27 @@ const translations: TranslationDeepObject = { toDos: 'Pendências', timeSensitiveSection: { title: 'Urgente', - addShippingAddress: {title: 'Precisamos do seu endereço de entrega', subtitle: 'Informe um endereço para receber seu Cartão Expensify.', cta: 'Adicionar'}, - addPaymentCard: {title: 'Adicione um cartão de pagamento para continuar usando o Expensify', subtitle: 'Conta > Assinatura', cta: 'Adicionar'}, - addBankAccount: {title: 'Adicione uma conta bancária para ser reembolsado'}, - addDepositAccount: {title: 'Adicione uma conta bancária para receber pagamentos'}, - activateCard: {title: 'Ative seu Cartão Expensify', subtitle: 'Valide seu cartão e comece a gastar.', cta: 'Ativar'}, + addShippingAddress: { + title: 'Precisamos do seu endereço de entrega', + subtitle: 'Informe um endereço para receber seu Cartão Expensify.', + cta: 'Adicionar', + }, + addPaymentCard: { + title: 'Adicione um cartão de pagamento para continuar usando o Expensify', + subtitle: 'Conta > Assinatura', + cta: 'Adicionar', + }, + addBankAccount: { + title: 'Adicione uma conta bancária para ser reembolsado', + }, + addDepositAccount: { + title: 'Adicione uma conta bancária para receber pagamentos', + }, + activateCard: { + title: 'Ative seu Cartão Expensify', + subtitle: 'Valide seu cartão e comece a gastar.', + cta: 'Ativar', + }, confirmDigitalWalletAddition: { subtitle: 'Cartão Expensify', }, @@ -1011,16 +1048,30 @@ const translations: TranslationDeepObject = { title: ({cardName}: {cardName?: string}) => (cardName ? `Corrigir conexão do cartão pessoal ${cardName}` : 'Corrigir conexão do cartão pessoal'), subtitle: 'Carteira', }, - addHomeAddress: {title: 'Adicione seu endereço residencial para rastrear distâncias', subtitle: 'Conta', cta: 'Adicionar'}, - fixFailedBilling: {title: 'Não foi possível cobrar o cartão cadastrado', subtitle: 'Assinatura'}, + addHomeAddress: { + title: 'Adicione seu endereço residencial para rastrear distâncias', + subtitle: 'Conta', + cta: 'Adicionar', + }, + fixFailedBilling: { + title: 'Não foi possível cobrar o cartão cadastrado', + subtitle: 'Assinatura', + }, unlockBankAccount: { workspaceTitle: 'Sua conta bancária comercial foi bloqueada', personalTitle: 'Sua conta bancária foi bloqueada', workspaceSubtitle: ({policyName}: {policyName: string}) => policyName, personalSubtitle: 'Carteira', }, - addVirtualCardPersonalDetails: {title: 'Adicione seus dados para visualizar e começar a usar seu Cartão Expensify.', subtitle: 'Cartão Expensify', cta: 'Adicionar'}, - enterSignerInfo: {title: 'Informações do signatário necessárias', subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Conta bancária ${bankAccountLastFour}`}, + addVirtualCardPersonalDetails: { + title: 'Adicione seus dados para visualizar e começar a usar seu Cartão Expensify.', + subtitle: 'Cartão Expensify', + cta: 'Adicionar', + }, + enterSignerInfo: { + title: 'Informações do signatário necessárias', + subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Conta bancária ${bankAccountLastFour}`, + }, payOverdueInvoice: { cta: 'Revisar', dueSoonTitle: ({date}: {date: string}) => `Pague sua fatura até ${date} para evitar interrupção do serviço`, @@ -1031,8 +1082,13 @@ const translations: TranslationDeepObject = { subtitle: ({date}: {date: string}) => `A assinatura termina em ${date}`, cta: 'Gerenciar', }, - emailDeliveryFailure: {title: 'Não podemos enviar notificações por e-mail para você', subtitle: 'Conta'}, - upgradeNetSuiteConnection: {title: 'Atualize sua conexão com o NetSuite'}, + emailDeliveryFailure: { + title: 'Não podemos enviar notificações por e-mail para você', + subtitle: 'Conta', + }, + upgradeNetSuiteConnection: { + title: 'Atualize sua conexão com o NetSuite', + }, }, forYouSection: { submit: ({count}: {count: number}) => ({ @@ -1100,7 +1156,10 @@ const translations: TranslationDeepObject = { hotelIn: ({destination}: {destination: string}) => `Hotel em ${destination}`, carRentalIn: ({destination}: {destination: string}) => `Aluguel de carro em ${destination}`, inOneWeek: 'Em 1 semana', - inDays: () => ({one: 'Em 1 dia', other: (count: number) => `Em ${count} dias`}), + inDays: () => ({ + one: 'Em 1 dia', + other: (count: number) => `Em ${count} dias`, + }), today: 'Hoje', }, freeTrialSection: { @@ -1167,7 +1226,10 @@ const translations: TranslationDeepObject = { emptyStateTitle: 'Nenhuma despesa recente', emptyStateMessage: 'Crie um ou arraste um recibo aqui', }, - insightsSection: {chartUnavailable: 'Gráfico indisponível', notEnoughData: 'Ainda não temos dados suficientes para preencher este gráfico'}, + insightsSection: { + chartUnavailable: 'Gráfico indisponível', + notEnoughData: 'Ainda não temos dados suficientes para preencher este gráfico', + }, conciergePrompt: { goodMorning: ({name}: {name?: string}) => (name ? `Bom dia, ${name}.` : 'Bom dia.'), goodAfternoon: ({name}: {name?: string}) => (name ? `Boa tarde, ${name}.` : 'Boa tarde.'), @@ -1178,8 +1240,14 @@ const translations: TranslationDeepObject = { }, insightsPage: { viewOnSpend: 'Ver em Gastos', - emptyState: {title: 'Nada para mostrar', subtitle: 'Tente ajustar seus critérios acima'}, - noExpensesState: {title: 'Veja para onde vai o seu dinheiro', subtitle: 'Quando você tiver despesas, vai encontrar tendências de gastos, principais estabelecimentos e muito mais.'}, + emptyState: { + title: 'Nada para mostrar', + subtitle: 'Tente ajustar seus critérios acima', + }, + noExpensesState: { + title: 'Veja para onde vai o seu dinheiro', + subtitle: 'Quando você tiver despesas, vai encontrar tendências de gastos, principais estabelecimentos e muito mais.', + }, compare: { label: 'Comparar', previousPeriod: 'Período anterior', @@ -1946,7 +2014,11 @@ const translations: TranslationDeepObject = { prompt: 'Ative as categorias no workspace para editar os detalhes da despesa ou excluir a categoria desta despesa.', confirmText: 'Excluir categoria', }, - tagDisabledAlert: {title: 'Tag desativada', prompt: 'Ative as tags no workspace para editar os detalhes da despesa ou excluir a tag desta despesa.', confirmText: 'Excluir tag'}, + tagDisabledAlert: { + title: 'Tag desativada', + prompt: 'Ative as tags no workspace para editar os detalhes da despesa ou excluir a tag desta despesa.', + confirmText: 'Excluir tag', + }, undeletedExpense: 'restaurou esta despesa', conciergeAutoSelectedDistanceRates: ({policyName}: {policyName: string}) => `taxas de distância atualizadas para o novo workspace - ${policyName}`, }, @@ -2266,7 +2338,11 @@ const translations: TranslationDeepObject = { saved: 'Salvo', }, }, - securityPage: {title: 'Segurança', subtitle: 'Mantenha sua conta segura.', goToSecurity: 'Voltar para a página de segurança'}, + securityPage: { + title: 'Segurança', + subtitle: 'Mantenha sua conta segura.', + goToSecurity: 'Voltar para a página de segurança', + }, shareCodePage: { title: 'Seu código', subtitle: 'Convide pessoas para o Expensify compartilhando seu código QR pessoal ou link de indicação.', @@ -2379,9 +2455,18 @@ const translations: TranslationDeepObject = { testingPreferences: 'Preferências de teste', server: 'Servidor', servers: { - production: {label: 'Produção', description: 'O ambiente ativo que os usuários reais veem'}, - staging: {label: 'Homologação', description: 'Cópia da produção. Usada para a validação final'}, - qa: {label: 'QA', description: 'Ambiente experimental usado para testes'}, + production: { + label: 'Produção', + description: 'O ambiente ativo que os usuários reais veem', + }, + staging: { + label: 'Homologação', + description: 'Cópia da produção. Usada para a validação final', + }, + qa: { + label: 'QA', + description: 'Ambiente experimental usado para testes', + }, }, serverPinnedDescription: 'Esta versão sempre se conecta a um único servidor, portanto não é possível alterá-lo aqui.', forceOffline: 'Forçar modo offline', @@ -2845,7 +2930,10 @@ const translations: TranslationDeepObject = { getStarted: 'Começar', headerTitle: 'Reembolsos globais', }, - wiseGlobalReimbursementsBanner: {title: 'Pague pessoas no mundo todo', subtitle: 'Ative reembolsos globais na sua conta em USD.'}, + wiseGlobalReimbursementsBanner: { + title: 'Pague pessoas no mundo todo', + subtitle: 'Ative reembolsos globais na sua conta em USD.', + }, }, addCardToDigitalWallet: { title: ({walletName}: {walletName: string}) => `Adicionar cartão à ${walletName}`, @@ -3249,11 +3337,17 @@ ${amount} para ${merchant} - ${date}`, }, editAgentAvatarPage: {title: 'Editar avatar'}, editAgentNamePage: {title: 'Nome do agente'}, - editAgentPromptPage: {title: 'Escrever instruções personalizadas', error: {emptyPrompt: 'Insira as instruções para o seu agente.'}}, + editAgentPromptPage: { + title: 'Escrever instruções personalizadas', + error: {emptyPrompt: 'Insira as instruções para o seu agente.'}, + }, expenseRulesPage: { title: 'Regras de despesas', findRule: 'Encontrar regra', - emptyRules: {title: 'Ainda não há regras', subtitle: 'Adicione uma regra para automatizar o relatório de despesas.'}, + emptyRules: { + title: 'Ainda não há regras', + subtitle: 'Adicione uma regra para automatizar o relatório de despesas.', + }, changes: { billableUpdate: (value: boolean) => `Atualizar despesa ${value ? 'faturável' : 'não faturável'}`, categoryUpdate: (value: string) => `Atualizar categoria para “${value}”`, @@ -3903,7 +3997,11 @@ ${amount} para ${merchant} - ${date}`, detailsPage: { localTime: 'Hora local', }, - newChatPage: {startGroup: 'Iniciar grupo', addToGroup: 'Adicionar ao grupo', addUserToGroup: (username: string) => `Adicionar ${username} ao grupo`}, + newChatPage: { + startGroup: 'Iniciar grupo', + addToGroup: 'Adicionar ao grupo', + addUserToGroup: (username: string) => `Adicionar ${username} ao grupo`, + }, yearPickerPage: { year: 'Ano', selectYear: 'Selecione um ano', @@ -5002,7 +5100,10 @@ ${amount} para ${merchant} - ${date}`, }, budgetFrequency: {monthly: 'mensal', yearly: 'anual'}, budgetFrequencyUnit: {monthly: 'mês', yearly: 'ano'}, - budgetTypeForNotificationMessage: {tag: 'etiqueta', category: 'categoria'}, + budgetTypeForNotificationMessage: { + tag: 'etiqueta', + category: 'categoria', + }, deepDiveExpensifyCard: `As transações do Cartão Expensify serão exportadas automaticamente para uma “Conta de Responsabilidade do Cartão Expensify” criada com nossa integração.`, travelInvoicing: 'Exportar despesas consolidadas de faturamento de viagem como', travelInvoicingVendor: 'Fornecedor de viagem', @@ -5592,10 +5693,16 @@ ${amount} para ${merchant} - ${date}`, label: 'Exportar despesas reembolsáveis como', helperText: 'Despesas marcadas como reembolsáveis serão exportadas como faturas a pagar emitidas em nome do funcionário.', }, - exportNonReimbursable: {label: 'Exportar despesas não reembolsáveis como'}, + exportNonReimbursable: { + label: 'Exportar despesas não reembolsáveis como', + }, expenseReports: 'Relatórios de despesas', - exportReimbursableExpenseReports: {helperText: 'Despesas marcadas como reembolsáveis serão exportadas como relatórios de despesas emitidos em nome do funcionário.'}, - exportNonReimbursableExpenseReports: {helperText: 'Despesas marcadas como não reembolsáveis serão exportadas como relatórios de despesas emitidos em nome do funcionário.'}, + exportReimbursableExpenseReports: { + helperText: 'Despesas marcadas como reembolsáveis serão exportadas como relatórios de despesas emitidos em nome do funcionário.', + }, + exportNonReimbursableExpenseReports: { + helperText: 'Despesas marcadas como não reembolsáveis serão exportadas como relatórios de despesas emitidos em nome do funcionário.', + }, noVendorsFound: 'Nenhum fornecedor encontrado', noVendorsFoundDescription: 'Sincronize a conexão novamente depois que os fornecedores forem adicionados no Certinia.', noCompaniesFound: 'Nenhuma empresa encontrada', @@ -5625,7 +5732,12 @@ ${amount} para ${merchant} - ${date}`, chartOfAccounts: 'Plano de contas', chartOfAccountsDescription: 'O plano de contas é importado para o Expensify como categorias.', dimensionMapping: ({n}: {n: number}) => `Dimensão ${n}`, - dimensions: {dimension1: 'Dimensão 1', dimension2: 'Dimensão 2', dimension3: 'Dimensão 3', dimension4: 'Dimensão 4'}, + dimensions: { + dimension1: 'Dimensão 1', + dimension2: 'Dimensão 2', + dimension3: 'Dimensão 3', + dimension4: 'Dimensão 4', + }, doNotMap: 'Não mapear', doNotMapSubtitle: 'Usar recurso de funcionário por padrão', mappingTypes: { @@ -6086,7 +6198,14 @@ _Para instruções mais detalhadas, [visite nossa central de ajuda](${CONST.NETS noAccountsFound: 'Nenhuma conta encontrada', noAccountsFoundDescription: 'Adicione contas no Rillet e sincronize a conexão novamente', exportDescription: 'Configure como os dados do Expensify são exportados para o Rillet.', - exportReimbursable: {label: 'Exportar despesas reembolsáveis como', values: {[CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: {label: 'Faturas de fornecedores'}}}, + exportReimbursable: { + label: 'Exportar despesas reembolsáveis como', + values: { + [CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: { + label: 'Faturas de fornecedores', + }, + }, + }, exportDate: { label: 'Data da fatura do fornecedor', description: 'Use esta data ao exportar relatórios para o Rillet.', @@ -6107,13 +6226,20 @@ _Para instruções mais detalhadas, [visite nossa central de ajuda](${CONST.NETS }, exportNonReimbursable: { label: 'Exportar despesas de cartão corporativo como', - values: {[CONST.RILLET_EXPORT_NON_REIMBURSABLE.CREDIT_CARD_CHARGE]: {label: 'Cartões de crédito'}}, + values: { + [CONST.RILLET_EXPORT_NON_REIMBURSABLE.CREDIT_CARD_CHARGE]: { + label: 'Cartões de crédito', + }, + }, }, defaultCompanyCardVendor: { label: 'Fornecedor padrão do cartão corporativo', description: 'Escolha um fornecedor Rillet padrão para despesas que não forem correspondidas automaticamente.', }, - companyCardAccount: {label: 'Conta de cartão corporativo', description: 'Escolha para onde exportar as transações do cartão corporativo.'}, + companyCardAccount: { + label: 'Conta de cartão corporativo', + description: 'Escolha para onde exportar as transações do cartão corporativo.', + }, noBankAccountsFound: 'Nenhuma conta bancária encontrada', noBankAccountsFoundDescription: 'Adicione contas bancárias no Rillet e sincronize a conexão novamente', autoSyncDescription: 'Sincronize Rillet e Expensify automaticamente, todos os dias. Relatórios são sincronizados em tempo real.', @@ -6131,9 +6257,15 @@ _Para instruções mais detalhadas, [visite nossa central de ajuda](${CONST.NETS }, syncReimbursedReports: 'Sincronizar relatórios reembolsados', syncReimbursedReportsDescription: 'Quando um relatório for pago via ACH, um pagamento de conta será gerado nesta conta.', - billPaymentAccount: {label: 'Conta de pagamento de contas', description: 'Escolha de onde pagar as contas e nós vamos criar o pagamento no Rillet.'}, + billPaymentAccount: { + label: 'Conta de pagamento de contas', + description: 'Escolha de onde pagar as contas e nós vamos criar o pagamento no Rillet.', + }, syncExpensifyCardSettlements: 'Sincronizar liquidações do Cartão Expensify', - settlementAccount: {label: 'Conta de liquidação do Cartão Expensify', description: 'Escolha sua conta de liquidação e nós criaremos o pagamento no Rillet.'}, + settlementAccount: { + label: 'Conta de liquidação do Cartão Expensify', + description: 'Escolha sua conta de liquidação e nós criaremos o pagamento no Rillet.', + }, syncTravelInvoicingSettlements: 'Sincronizar liquidações de cobrança consolidada de viagens', travelInvoicingSettlementAccount: { label: 'Conta de liquidação de faturamento consolidado de viagens', @@ -6279,20 +6411,28 @@ _Para instruções mais detalhadas, [visite nossa central de ajuda](${CONST.NETS }, syncReimbursedReports: 'Sincronizar relatórios reembolsados', syncReimbursedReportsDescription: 'Quando um relatório for pago via ACH, um pagamento de conta será gerado nesta conta.', - billPaymentAccount: {label: 'Conta de pagamento de faturas', description: 'Escolha de onde deseja pagar as contas e criaremos o pagamento no DualEntry.'}, + billPaymentAccount: { + label: 'Conta de pagamento de faturas', + description: 'Escolha de onde deseja pagar as contas e criaremos o pagamento no DualEntry.', + }, fxExpenseAccount: { label: 'Conta de taxa de conversão de moeda DualEntry', description: 'Quando sua empresa cobrir o custo de conversão de moeda em um pagamento feito no exterior, vamos lançar esse custo nesta conta no DualEntry como um lançamento contábil.', }, syncExpensifyCardSettlements: 'Sincronizar liquidações do Cartão Expensify', - settlementAccount: {label: 'Conta de liquidação do Cartão Expensify', description: 'Escolha sua conta de liquidação e nós criaremos o pagamento no DualEntry.'}, + settlementAccount: { + label: 'Conta de liquidação do Cartão Expensify', + description: 'Escolha sua conta de liquidação e nós criaremos o pagamento no DualEntry.', + }, syncTravelInvoicingSettlements: 'Sincronizar liquidações de Faturamento Consolidado de Viagem', travelInvoicingSettlementAccount: { label: 'Conta de liquidação de faturamento consolidado de viagens', description: 'Escolha sua conta de liquidação e nós criaremos o pagamento no DualEntry.', }, - travelInvoicingPayableAccount: {label: 'Conta a pagar de faturamento consolidado de viagens'}, + travelInvoicingPayableAccount: { + label: 'Conta a pagar de faturamento consolidado de viagens', + }, }, type: { free: 'Grátis', @@ -6434,13 +6574,28 @@ _Para instruções mais detalhadas, [visite nossa central de ajuda](${CONST.NETS cardIdentityColumn: 'Associe um número de cartão ou um nome de cartão para que as transações possam ser vinculadas a um cartão.', }, fileImportDescription: 'Uma opção manual caso seu banco não possa enviar um feed.', - duplicateFeedModal: {title: 'Feed do cartão já conectado', prompt: 'Você não pode adicionar o mesmo feed de cartão ao mesmo workspace duas vezes.'}, + duplicateFeedModal: { + title: 'Feed do cartão já conectado', + prompt: 'Você não pode adicionar o mesmo feed de cartão ao mesmo workspace duas vezes.', + }, }, statementCloseDate: { [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: 'Último dia do mês', [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: 'Último dia útil do mês', [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: 'Dia do mês personalizado', }, + reimbursable: { + title: 'Reembolsável', + description: 'Escolha como as transações de cartão devem ser criadas. Novas transações seguirão estas regras.', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES]: 'Sempre reembolsável', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES}Description`]: 'Sempre reembolsado aos funcionários', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO]: 'Sempre não reembolsável', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO}Description`]: 'Nunca reembolsado aos funcionários', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES]: 'Reembolsável', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES}Description`]: 'Geralmente reembolsado aos funcionários', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO]: 'Não reembolsável', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO}Description`]: 'Ocasionalmente reembolsado aos funcionários', + }, assign: 'Atribuir', assignCard: 'Atribuir cartão', findCompanyCard: 'Encontrar cartão corporativo', @@ -6487,7 +6642,10 @@ _Para instruções mais detalhadas, [visite nossa central de ajuda](${CONST.NETS importButton: 'Importar transações', }, deletedCard: 'Cartão excluído', - assignNewCards: {title: 'Atribuir novos cartões', description: 'Obtenha do seu banco os cartões mais recentes para atribuir'}, + assignNewCards: { + title: 'Atribuir novos cartões', + description: 'Obtenha do seu banco os cartões mais recentes para atribuir', + }, }, expensifyCard: { issueAndManageCards: 'Emita e gerencie seus Cartões Expensify', @@ -6918,14 +7076,18 @@ _Para instruções mais detalhadas, [visite nossa central de ajuda](${CONST.NETS subtitle: 'Defina uma taxa horária faturável para o controle de tempo.', defaultHourlyRate: 'Taxa horária padrão', }, - hrWarningModal: {disconnectText: ({integration}: {integration: string}) => `Para desativar RH, desconecte primeiro a integração ${integration} deste workspace.`}, + hrWarningModal: { + disconnectText: ({integration}: {integration: string}) => `Para desativar RH, desconecte primeiro a integração ${integration} deste workspace.`, + }, vendors: { title: 'Fornecedores', subtitle: 'Combine as despesas do cartão com fornecedores importados do seu software de contabilidade.', disabledTitle: 'Calma lá...', disabledMessage: 'Para ativar ou desativar este recurso, você precisará alterar suas configurações de importação contábil.', }, - recruitingWarningModal: {disconnectText: ({integration}: {integration: string}) => `Para desativar Recrutamento, primeiro desconecte ${integration} deste workspace.`}, + recruitingWarningModal: { + disconnectText: ({integration}: {integration: string}) => `Para desativar Recrutamento, primeiro desconecte ${integration} deste workspace.`, + }, }, reports: { reportsCustomTitleExamples: 'Exemplos:', @@ -6947,7 +7109,10 @@ _Para instruções mais detalhadas, [visite nossa central de ajuda](${CONST.NETS findReportField: 'Encontrar campo de relatório', deleteConfirmation: 'Tem certeza de que deseja excluir este campo de relatório?', deleteFieldsConfirmation: 'Tem certeza de que deseja excluir esses campos de relatório?', - emptyReportFields: {title: 'Ainda não há campos de relatório', subtitle: 'Adicione um campo personalizado (texto, data ou lista suspensa) que apareça nos relatórios.'}, + emptyReportFields: { + title: 'Ainda não há campos de relatório', + subtitle: 'Adicione um campo personalizado (texto, data ou lista suspensa) que apareça nos relatórios.', + }, subtitle: 'Os campos de relatório se aplicam a todos os gastos e podem ser úteis quando você quiser solicitar informações extras.', disableReportFields: 'Desativar campos de relatório', disableReportFieldsConfirmation: 'Tem certeza? Campos de texto e data serão excluídos e listas serão desativadas.', @@ -6972,7 +7137,10 @@ _Para instruções mais detalhadas, [visite nossa central de ajuda](${CONST.NETS disableValues: 'Desativar valores', enableValue: 'Ativar valor', enableValues: 'Ativar valores', - emptyReportFieldsValues: {title: 'Ainda não há valores na lista', subtitle: 'Adicione valores personalizados para aparecerem nos relatórios.'}, + emptyReportFieldsValues: { + title: 'Ainda não há valores na lista', + subtitle: 'Adicione valores personalizados para aparecerem nos relatórios.', + }, deleteValuePrompt: 'Tem certeza de que deseja excluir este valor da lista?', deleteValuesPrompt: 'Tem certeza de que deseja excluir esses valores da lista?', listValueRequiredError: 'Insira um nome de valor de lista', @@ -7312,10 +7480,16 @@ O plano Control começa em US$ 9 por membro ativo por mês.`, auditors: 'Auditores', guests: 'Convidados', editors: 'Editores', - emptyRoleFilter: {title: 'Nenhum membro corresponde a este filtro', subtitle: 'Convide um membro ou altere o filtro acima.'}, + emptyRoleFilter: { + title: 'Nenhum membro corresponde a este filtro', + subtitle: 'Convide um membro ou altere o filtro acima.', + }, configureHRSync: (providerName: string) => `Configurar a sincronização do ${providerName}.`, syncWithHR: (providerName: string) => `Sincronizar com ${providerName}`, - makeCardAdmin: () => ({one: 'Tornar admin do cartão', other: 'Tornar administradores do cartão'}), + makeCardAdmin: () => ({ + one: 'Tornar admin do cartão', + other: 'Tornar administradores do cartão', + }), cardAdmins: 'Administradores de cartões', peopleAdmins: 'Administradores de pessoas', paymentsAdmins: 'Administradores de pagamentos', @@ -7828,7 +8002,10 @@ O plano Control começa em US$ 9 por membro ativo por mês.`, }, distance: 'Distância', centrallyManage: 'Gerencie tarifas centralmente, acompanhe em milhas ou quilômetros e defina uma categoria padrão.', - emptyRates: {title: 'Ainda não há tarifas de distância', subtitle: 'Adicione uma tarifa para reembolsar quilometragem com taxas personalizadas.'}, + emptyRates: { + title: 'Ainda não há tarifas de distância', + subtitle: 'Adicione uma tarifa para reembolsar quilometragem com taxas personalizadas.', + }, rate: 'Avaliar', addRate: 'Adicionar tarifa', findRate: 'Encontrar tarifa', @@ -8814,7 +8991,12 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, emptyAmountError: 'Informe um valor válido antes de salvar', receiptAmountGreaterThanItemizedError: 'O valor exigido de recibo não pode ser maior que o valor exigido de recibo itemizado.', }, - requireFields: {title: 'Exigir campos para todas as despesas', category: 'Categoria', tag: 'Etiqueta', save: 'Salvar regra'}, + requireFields: { + title: 'Exigir campos para todas as despesas', + category: 'Categoria', + tag: 'Etiqueta', + save: 'Salvar regra', + }, newRule: { title: 'Nova regra', subtitle: 'O que você quer fazer?', @@ -8862,7 +9044,11 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, merchantTypeIs: (merchantType: string) => `O tipo de estabelecimento é "${merchantType}"`, categoryIs: (category: string) => `A categoria é "${category}"`, }, - merchantTypeRule: {merchantType: 'Tipo de comerciante', saveRule: 'Salvar regra', confirmErrorCategory: 'Selecione uma categoria.'}, + merchantTypeRule: { + merchantType: 'Tipo de comerciante', + saveRule: 'Salvar regra', + confirmErrorCategory: 'Selecione uma categoria.', + }, requireFieldsTable: { tableColumnType: 'Tipo', tableColumnCondition: 'Condição', @@ -8924,8 +9110,15 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, flagTypeWarning: 'Aviso', flagTypeWarningDescription: 'A pessoa que envia será avisada, mas ainda poderá enviar a despesa', }, - agentRulesEmptyState: {title: 'Nenhuma regra de agente adicionada', subtitle: 'Crie uma regra para automatizar as políticas do seu workspace.', cta: 'Adicionar regra de IA'}, - categoriesDisabledEmptyState: {title: 'Categorias não estão ativadas', subtitle: 'Ative categorias para ter mais controle sobre seus gastos.'}, + agentRulesEmptyState: { + title: 'Nenhuma regra de agente adicionada', + subtitle: 'Crie uma regra para automatizar as políticas do seu workspace.', + cta: 'Adicionar regra de IA', + }, + categoriesDisabledEmptyState: { + title: 'Categorias não estão ativadas', + subtitle: 'Ative categorias para ter mais controle sobre seus gastos.', + }, expenseDefaultType: { title: 'Aplicar padrões de despesa', subtitle: 'Com o que esta regra deve corresponder?', @@ -8934,7 +9127,11 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, category: 'Categoria', categoryDescription: 'Definir uma taxa de imposto padrão para uma categoria específica', }, - taxesDisabledEmptyState: {title: 'Impostos não estão ativados', subtitle: 'Ative impostos para documentar e recuperar impostos elegíveis.', cta: 'Ativar impostos'}, + taxesDisabledEmptyState: { + title: 'Impostos não estão ativados', + subtitle: 'Ative impostos para documentar e recuperar impostos elegíveis.', + cta: 'Ativar impostos', + }, }, planTypePage: { planTypes: { @@ -9037,7 +9234,11 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, dontSeeYourATS: `Não está vendo seu ATS aqui? Pergunte ao Concierge e podemos adicioná-lo.`, importSettings: 'Importar configurações', defaultApprover: 'Aprovador padrão', - approverFields: {recruiter: 'Recrutador', recruitingCoordinator: 'Coordenador de recrutamento', hiringManager: 'Gerente de contratação'}, + approverFields: { + recruiter: 'Recrutador', + recruitingCoordinator: 'Coordenador de recrutamento', + hiringManager: 'Gerente de contratação', + }, filters: { description: (providerName: string) => `Selecione quais membros serão importados de ${providerName}. Você pode escolher por etapas do trabalho, tags e escritórios.`, stages: { @@ -9115,7 +9316,10 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, approvalModeWarningConfirm: 'Alterar modo de aprovação', syncingModalTitle: 'Sua conexão está sincronizando', syncingModalDescription: 'A primeira conexão pode levar algum tempo. Você será notificado sobre quaisquer erros.', - syncLimitReached: {title: 'Tente novamente amanhã', prompt: 'Você atingiu o limite de sincronizações de hoje.'}, + syncLimitReached: { + title: 'Tente novamente amanhã', + prompt: 'Você atingiu o limite de sincronizações de hoje.', + }, syncResults: { title: (provider: string) => `Sincronização com ${provider} concluída`, successTitle: (provider: string) => `Conexão com o ${provider} sincronizada com sucesso!`, @@ -9145,22 +9349,40 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, enableNewAccountsDescription: 'Novas contas Campfire estarão disponíveis como categorias.', dimensionsImport: 'Todas as dimensões do Campfire são importadas como etiquetas', exportDescription: 'Configure como os dados do Expensify são exportados para o Campfire.', - exportReimbursable: {label: 'Exportar despesas reembolsáveis como', values: {VENDOR_BILL: {label: 'Contas de fornecedores'}}}, + exportReimbursable: { + label: 'Exportar despesas reembolsáveis como', + values: {VENDOR_BILL: {label: 'Contas de fornecedores'}}, + }, exportDate: { label: 'Data da fatura do fornecedor', description: 'Use esta data ao exportar relatórios para o Campfire.', values: { - LAST_EXPENSE: {label: 'Data da última despesa', description: 'Data da despesa mais recente no relatório.'}, - REPORT_EXPORTED: {label: 'Data de exportação', description: 'Data em que o relatório foi exportado para o Campfire.'}, - REPORT_SUBMITTED: {label: 'Data de envio', description: 'Data em que o relatório foi enviado para aprovação.'}, + LAST_EXPENSE: { + label: 'Data da última despesa', + description: 'Data da despesa mais recente no relatório.', + }, + REPORT_EXPORTED: { + label: 'Data de exportação', + description: 'Data em que o relatório foi exportado para o Campfire.', + }, + REPORT_SUBMITTED: { + label: 'Data de envio', + description: 'Data em que o relatório foi enviado para aprovação.', + }, }, }, - exportNonReimbursable: {label: 'Exportar despesas do cartão da empresa como', values: {JOURNAL_ENTRY: {label: 'Lançamentos contábeis'}}}, + exportNonReimbursable: { + label: 'Exportar despesas do cartão da empresa como', + values: {JOURNAL_ENTRY: {label: 'Lançamentos contábeis'}}, + }, defaultCompanyCardVendor: { label: 'Fornecedor padrão para todos os cartões da empresa', description: 'Escolha um fornecedor padrão do Campfire para despesas que não sejam correspondidas automaticamente.', }, - companyCardAccount: {label: 'Conta de cartão corporativo', description: 'Escolha para onde exportar as transações do cartão corporativo.'}, + companyCardAccount: { + label: 'Conta de cartão corporativo', + description: 'Escolha para onde exportar as transações do cartão corporativo.', + }, noAccountsFound: 'Nenhuma conta encontrada', noAccountsFoundDescription: 'Adicione contas no Campfire e sincronize a conexão novamente', autoSyncDescription: 'Sincronize o Campfire e o Expensify automaticamente, todos os dias. Os relatórios são sincronizados em tempo real.', @@ -9178,15 +9400,23 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, }, syncReimbursedReports: 'Sincronizar relatórios reembolsados', syncReimbursedReportsDescription: 'Quando um relatório for pago via ACH, um pagamento de conta será gerado nesta conta.', - billPaymentAccount: {label: 'Conta de pagamento de contas', description: 'Escolha a conta de compensação dos créditos Campfire quando o Expensify marcar uma conta como paga.'}, + billPaymentAccount: { + label: 'Conta de pagamento de contas', + description: 'Escolha a conta de compensação dos créditos Campfire quando o Expensify marcar uma conta como paga.', + }, syncExpensifyCardSettlements: 'Sincronizar liquidações do Cartão Expensify', - settlementAccount: {label: 'Conta de liquidação do Cartão Expensify', description: 'Escolha sua conta de liquidação e nós vamos criar o pagamento no Campfire.'}, + settlementAccount: { + label: 'Conta de liquidação do Cartão Expensify', + description: 'Escolha sua conta de liquidação e nós vamos criar o pagamento no Campfire.', + }, syncTravelInvoicingSettlements: 'Sincronizar liquidações de Faturamento Consolidado de Viagem', travelInvoicingSettlementAccount: { label: 'Conta de liquidação de faturamento consolidado de viagens', description: 'Escolha sua conta de liquidação e nós vamos criar o pagamento no Campfire.', }, - travelInvoicingPayableAccount: {label: 'Conta a pagar de faturamento consolidado de viagens'}, + travelInvoicingPayableAccount: { + label: 'Conta a pagar de faturamento consolidado de viagens', + }, exportToMultipleAccounts: 'Configurar exportação para várias contas', cardProgramAccount: { label: 'Conta do programa de cartão', @@ -9823,7 +10053,11 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, commuterExclusions: { changedToFixedDistance: ({previousMethod}: {previousMethod: string}) => `alterou “excluir deslocamentos” para uma distância fixa por solicitação (antes ${previousMethod})`, changedToHomeAndOffice: ({previousMethod}: {previousMethod: string}) => `alterou a exclusão de deslocamentos para calcular por casa e escritório (antes ${previousMethod})`, - previousMethod: {disabled: 'não excluir deslocamentos diários', fixedDistance: 'distância fixa por solicitação', homeAndOffice: 'casa e escritório'}, + previousMethod: { + disabled: 'não excluir deslocamentos diários', + fixedDistance: 'distância fixa por solicitação', + homeAndOffice: 'casa e escritório', + }, setFixedDistance: ({formattedDistance}: {formattedDistance: string}) => `definir exclusão de distância fixa para ${formattedDistance} por solicitação`, changedFixedDistance: ({formattedOldDistance, formattedNewDistance}: {formattedOldDistance: string; formattedNewDistance: string}) => `alterou a exclusão de distância fixa para ${formattedNewDistance} por reembolso (antes ${formattedOldDistance})`, @@ -9877,6 +10111,8 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, updatedMccGroupCategory: ({mccGroupName, oldCategory, newCategory}: {mccGroupName: string; oldCategory: string; newCategory: string}) => `alterou a categoria de gasto padrão de "${mccGroupName}" para "${newCategory}" (antes "${oldCategory}")`, updatedRequireCompanyCards: ({enabled}: {enabled: boolean}) => `${enabled ? 'ativado' : 'desativado'} o requisito de compras com cartão corporativo`, + updatedCardFeedReimbursable: (feedName: string, newValue?: string, previousValue?: string) => + `alterou a configuração de reembolsável do feed de cartão "${feedName}"${newValue ? ` para "${newValue}"` : ''}${previousValue ? ` (anteriormente "${previousValue}")` : ''}`, agentRule: { added: ({title, prompt}: {title: string; prompt: string}) => (title ? `adicionou a regra de agente "${title}": ${prompt}` : `adicionou uma regra de agente: ${prompt}`), updated: ({title, prompt}: {title: string; prompt: string}) => @@ -9912,7 +10148,13 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, one: 'regra de gasto aplicada a mais 1 cartão', other: `regra de gasto aplicada a mais ${count} cartões`, }), - phraseVerb: {added: 'adicionado', removed: 'removido', changed: 'alterado', set: 'definir', applied: 'aplicado'}, + phraseVerb: { + added: 'adicionado', + removed: 'removido', + changed: 'alterado', + set: 'definir', + applied: 'aplicado', + }, bodyMerchant: ({adjective, value}: {adjective: string; value: string}) => (adjective !== '' ? `comerciante ${adjective} '${value}'` : `estabelecimento comercial '${value}'`), bodyMerchantValueOnly: ({value}: {value: string}) => `'${value}'`, bodyMerchantChange: ({adjective, oldValue, newValue}: {adjective: string; oldValue: string; newValue: string}) => @@ -10150,7 +10392,11 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, subtitleCannotSend: 'Você precisa de um espaço de trabalho com Invoices habilitado para enviar faturas.', subtitleCannotSendWithTestDrive: 'Você precisa de um espaço de trabalho com Invoices habilitado para enviar faturas. Faça um test drive do Expensify para saber mais.', }, - emptyTripResults: {title: 'Nenhuma viagem ainda', subtitle: 'Comece reservando sua primeira viagem abaixo.', buttonText: 'Reservar uma viagem'}, + emptyTripResults: { + title: 'Nenhuma viagem ainda', + subtitle: 'Comece reservando sua primeira viagem abaixo.', + buttonText: 'Reservar uma viagem', + }, emptySubmitResults: { title: 'Nenhuma despesa para enviar', subtitle: 'Está tudo certo. Pode comemorar!', @@ -10179,7 +10425,11 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, title: 'Nenhuma despesa para aprovar', subtitle: 'Zero despesas. Máximo sossego. Muito bem!', }, - staleResults: {title: 'É preciso atualizar', subtitle: 'Esta página está desatualizada, atualize para ver a versão mais recente', buttonText: 'Atualizar'}, + staleResults: { + title: 'É preciso atualizar', + subtitle: 'Esta página está desatualizada, atualize para ver a versão mais recente', + buttonText: 'Atualizar', + }, }, columns: 'Colunas', editColumns: 'Editar colunas', @@ -10276,8 +10526,15 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, cardFeedNameCSV: ({cardFeedLabel}: {cardFeedLabel?: string}) => `Todos os cartões CSV importados${cardFeedLabel ? ` - ${cardFeedLabel}` : ''}`, travelInvoicing: 'Faturamento de Viagens Consolidado', }, - bankAccount: {banks: 'Contas bancárias', closedBankAccounts: 'Contas bancárias encerradas'}, - workspace: {active: 'Ativo', archived: 'Arquivado', selectAll: 'Selecionar tudo'}, + bankAccount: { + banks: 'Contas bancárias', + closedBankAccounts: 'Contas bancárias encerradas', + }, + workspace: { + active: 'Ativo', + archived: 'Arquivado', + selectAll: 'Selecionar tudo', + }, reportField: (name: string, value: string) => `${name} é ${value}`, current: 'Atual', past: 'Passado', @@ -10320,14 +10577,21 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, [CONST.SEARCH.WITHDRAWAL_TYPE.TRAVEL_BILLING]: 'Faturamento de Viagens Consolidado', }, is: 'É', - has: {submittedViolation: 'Violação enviada', approvedViolation: 'Violação aprovada'}, + has: { + submittedViolation: 'Violação enviada', + approvedViolation: 'Violação aprovada', + }, action: { [CONST.SEARCH.ACTION_FILTERS.SUBMIT]: 'Enviar', [CONST.SEARCH.ACTION_FILTERS.APPROVE]: 'Aprovar', [CONST.SEARCH.ACTION_FILTERS.PAY]: 'Pagar', [CONST.SEARCH.ACTION_FILTERS.EXPORT]: 'Exportar', }, - filterType: {label: 'Tipo de filtro', has: {positive: 'tem', negative: 'não tem'}, is: {positive: 'é', negative: 'não é'}}, + filterType: { + label: 'Tipo de filtro', + has: {positive: 'tem', negative: 'não tem'}, + is: {positive: 'é', negative: 'não é'}, + }, merchant: { matchType: 'Tipo de correspondência', contains: (merchant?: string) => (merchant ? `Contém "${merchant}"` : 'Contém'), @@ -10410,7 +10674,10 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, [CONST.SEARCH.GROUP_BY.YEAR]: 'Anos', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Trimestres', }, - moneyRequestReport: {emptyStateTitle: 'Ainda não há despesas', accessPlaceHolder: 'Abrir para ver detalhes'}, + moneyRequestReport: { + emptyStateTitle: 'Ainda não há despesas', + accessPlaceHolder: 'Abrir para ver detalhes', + }, errors: { pleaseSelectDatesForBothFromAndTo: 'Selecione datas para De e Até', }, @@ -10439,7 +10706,10 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, mergeReports: { title: 'Mesclar relatórios', description: 'Selecione o relatório que você quer manter. Todas as despesas serão movidas para ele e os outros relatórios serão excluídos.', - listPage: {noEligibleReportsFound: 'Nenhum relatório qualificado encontrado', noEligibleReportsFoundSubtitle: 'Você não tem nenhum relatório que possa ser mesclado.'}, + listPage: { + noEligibleReportsFound: 'Nenhum relatório qualificado encontrado', + noEligibleReportsFoundSubtitle: 'Você não tem nenhum relatório que possa ser mesclado.', + }, }, periodSoFar: ({period}: {period: string}) => `${period} até agora`, weekOf: ({date}: {date: string}) => `Semana de ${date}`, @@ -10476,11 +10746,21 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, }, }, settlement: { - status: {pending: 'Pendente', cleared: 'Compensado', failed: 'Falhou', never: 'Nunca', cashBack: 'Cashback'}, + status: { + pending: 'Pendente', + cleared: 'Compensado', + failed: 'Falhou', + never: 'Nunca', + cashBack: 'Cashback', + }, failedError: ({link}: {link: string}) => `Tentaremos processar este acerto novamente quando você desbloquear sua conta.`, withdrawalInfo: ({date, withdrawalID}: {date: string; withdrawalID: number}) => `${date} • ID de saque: ${withdrawalID}`, }, - paidStatus: {markedAsPaid: 'Marcado como pago', withdrawing: 'Sacando', confirmed: 'Confirmado'}, + paidStatus: { + markedAsPaid: 'Marcado como pago', + withdrawing: 'Sacando', + confirmed: 'Confirmado', + }, reportLayout: { reportLayout: 'Layout do relatório', groupByLabel: 'Agrupar por:', @@ -10827,7 +11107,10 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, }, error: { selectSuggestedAddress: 'Selecione um endereço sugerido ou use a localização atual', - mapOrGpsDistanceRequired: {title: 'Exigir GPS ou inserção no mapa', description: 'Este espaço de trabalho exige despesas de distância baseadas em mapa ou rastreadas por GPS.'}, + mapOrGpsDistanceRequired: { + title: 'Exigir GPS ou inserção no mapa', + description: 'Este espaço de trabalho exige despesas de distância baseadas em mapa ou rastreadas por GPS.', + }, }, odometer: { startReading: 'Começar a ler', @@ -10933,7 +11216,12 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, prompt: 'Permita o acesso à localização nas configurações do seu dispositivo para iniciar o rastreamento de distância por GPS.', }, gpsFloatingPillText: 'Rastreamento por GPS em andamento...', - liveActivity: {subtitle: 'Rastreamento de distância', button: 'Ver progresso', lockScreenBadgeText: 'Distância', lockScreenTrackingText: 'Rastreando...'}, + liveActivity: { + subtitle: 'Rastreamento de distância', + button: 'Ver progresso', + lockScreenBadgeText: 'Distância', + lockScreenTrackingText: 'Rastreando...', + }, }, reportCardLostOrDamaged: { screenTitle: 'Boletim perdido ou danificado', @@ -11134,7 +11422,11 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, markAsCashToIgnore: 'Marcar como dinheiro para ignorar e solicitar pagamento.', smartscanFailed: ({canEdit = true, missingFields = []}: {canEdit?: boolean; missingFields?: string[]}) => { if (missingFields.length > 0) { - const fieldNames: Record = {merchant: 'estabelecimento', date: 'data', amount: 'valor'}; + const fieldNames: Record = { + merchant: 'estabelecimento', + date: 'data', + amount: 'valor', + }; const translated = missingFields.map((f) => fieldNames[f] ?? f); const fieldList = translated.join(translated.length > 2 ? ', ' : ' e '); return `A digitalização do recibo falhou — faltando ${fieldList}.${canEdit ? ' Insira os detalhes manualmente.' : ''}`; @@ -11407,8 +11699,14 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, onboardingChatTitle: (discountType: number) => `Oferta por tempo limitado: ${discountType}% de desconto no seu primeiro ano!`, subtitle: (days: number, hours: number, minutes: number, seconds: number) => `Solicite em até ${days > 0 ? `${days}d :` : ''}${hours}h : ${minutes}m : ${seconds}s`, }, - travelInvoiceOverdue: {title: 'Sua fatura de viagem está vencida', subtitle: (date: string) => `Pague sua fatura de viagem até ${date} para continuar reservando viagens.`}, - travelInvoiceOverdueLocked: {title: 'Reserva de viagem está pausada', subtitle: 'Sua fatura de viagem está vencida. Pague-a para voltar a reservar viagens.'}, + travelInvoiceOverdue: { + title: 'Sua fatura de viagem está vencida', + subtitle: (date: string) => `Pague sua fatura de viagem até ${date} para continuar reservando viagens.`, + }, + travelInvoiceOverdueLocked: { + title: 'Reserva de viagem está pausada', + subtitle: 'Sua fatura de viagem está vencida. Pague-a para voltar a reservar viagens.', + }, }, cardSection: { title: 'Pagamento', @@ -11537,7 +11835,14 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, one: '1 usuário ativo', other: `${count} usuários ativos`, }), - state: {paid: 'Pago', cleared: 'Compensado', failed: 'Falhou', refunded: 'Reembolsado', disputed: 'Contestado', balanceTransfer: 'Transferência de saldo'}, + state: { + paid: 'Pago', + cleared: 'Compensado', + failed: 'Falhou', + refunded: 'Reembolsado', + disputed: 'Contestado', + balanceTransfer: 'Transferência de saldo', + }, details: 'Detalhes do pagamento', badge: { balanceTransferTo: ({email}: {email: string}) => `Transferência de saldo para ${email}`, @@ -12008,7 +12313,10 @@ Aqui está um *comprovante de teste* para mostrar como funciona:`, other: 'Encerrar contas', }), closeAccountPrompt: 'Tem certeza? Esta ação é permanente.', - forceCloseAccount: () => ({one: 'Forçar encerramento da conta', other: 'Forçar encerramento das contas'}), + forceCloseAccount: () => ({ + one: 'Forçar encerramento da conta', + other: 'Forçar encerramento das contas', + }), safeCloseAccount: () => ({ one: 'Fechar conta com segurança', other: 'Fechar contas com segurança', @@ -12029,7 +12337,10 @@ Aqui está um *comprovante de teste* para mostrar como funciona:`, reportSuspiciousActivityPrompt: (email: string) => `Tem certeza? Isso irá bloquear a conta de ${email}.

Nossa equipe irá então analisar a conta e remover qualquer acesso não autorizado. Para recuperar o acesso, será necessário que trabalhem com a Concierge.`, reportSuspiciousActivityConfirmationPrompt: 'Vamos revisar a conta para verificar se é seguro desbloqueá-la e entraremos em contato via Concierge caso haja dúvidas.', - emptyMembers: {title: 'Nenhum membro neste grupo', subtitle: 'Adicione um membro ou tente mudar o filtro acima.'}, + emptyMembers: { + title: 'Nenhum membro neste grupo', + subtitle: 'Adicione um membro ou tente mudar o filtro acima.', + }, moveToGroup: 'Mover para grupo', chooseWhereToMove: ({count}: {count: number}) => ({ one: `Escolha para onde mover ${count} membro.`, @@ -12058,7 +12369,10 @@ Aqui está um *comprovante de teste* para mostrar como funciona:`, }, groups: { title: 'Grupos', - memberCount: () => ({one: '1 membro', other: (count: number) => `${count} membros`}), + memberCount: () => ({ + one: '1 membro', + other: (count: number) => `${count} membros`, + }), defaultGroup: 'Grupo padrão para novos membros', defaultGroupPrompt: (currentName: string, newName: string) => `Tem certeza de que deseja tornar ${newName} o grupo padrão? Novos membros serão convidados para este grupo em vez do grupo padrão anterior (${currentName}). `, @@ -12151,6 +12465,10 @@ Aqui está um *comprovante de teste* para mostrar como funciona:`, mobileRenewPrompt: 'Visite o Expensify no seu navegador para renovar antecipadamente.', mobileClaimPrompt: 'Visite o Expensify no seu navegador para resgatar seu desconto de renovação.', }, - bulkActionBar: {label: 'Ações em massa', clearSelection: 'Limpar seleção', loadingSelection: 'Carregando seleção'}, + bulkActionBar: { + label: 'Ações em massa', + clearSelection: 'Limpar seleção', + loadingSelection: 'Carregando seleção', + }, }; export default translations; diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 1c8d93405ab2..dbba2badff57 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -547,7 +547,12 @@ const translations: TranslationDeepObject = { prompt: '希望在Concierge回复时收到通知吗?', cta: '通知', }, - feedback: {prompt: '这个回复有用吗?', useful: '有用回复', notUseful: '无用回复', thanks: '感谢你的反馈!'}, + feedback: { + prompt: '这个回复有用吗?', + useful: '有用回复', + notUseful: '无用回复', + thanks: '感谢你的反馈!', + }, }, supportalNoAccess: { title: '先别急', @@ -673,11 +678,23 @@ const translations: TranslationDeepObject = { rejectAuthentication: '拒绝认证', test: '测试', biometricsAuthentication: '生物识别认证', - authType: {unknown: '未知', none: '无', credentials: '凭据', biometrics: '生物识别', faceId: 'Face ID', touchId: 'Touch ID', opticId: 'Optic ID', passkey: 'Passkey'}, + authType: { + unknown: '未知', + none: '无', + credentials: '凭据', + biometrics: '生物识别', + faceId: 'Face ID', + touchId: 'Touch ID', + opticId: 'Optic ID', + passkey: 'Passkey', + }, statusNeverRegistered: '从未注册', statusNotRegistered: '未注册', statusRegisteredThisDevice: '已注册', - statusRegisteredOtherDevice: () => ({one: '已注册另一台设备', other: '已注册的其他设备'}), + statusRegisteredOtherDevice: () => ({ + one: '已注册另一台设备', + other: '已注册的其他设备', + }), }, pleaseEnableInSystemSettings: { start: '请在您的设备中启用面部/指纹验证或设置设备密码', @@ -690,8 +707,14 @@ const translations: TranslationDeepObject = { letsVerifyItsYou: '让我们验证一下您的身份', nowLetsAuthenticateYou: '现在,让我们为你进行身份验证…', letsAuthenticateYou: '正在验证您的身份…', - verifyYourself: {biometrics: '使用面部或指纹验证您的身份', passkeys: '使用通行密钥验证您的身份'}, - enableQuickVerification: {biometrics: '使用面部或指纹即可进行快速、安全的验证,无需密码或验证码。', passkeys: '启用使用通行密钥进行快速、安全的验证,无需密码或验证码。'}, + verifyYourself: { + biometrics: '使用面部或指纹验证您的身份', + passkeys: '使用通行密钥验证您的身份', + }, + enableQuickVerification: { + biometrics: '使用面部或指纹即可进行快速、安全的验证,无需密码或验证码。', + passkeys: '启用使用通行密钥进行快速、安全的验证,无需密码或验证码。', + }, revoke: { title: '面容/指纹和通行密钥', explanation: '一台或多台设备已启用面部/指纹或通行密钥验证。撤销访问权限后,该设备下次验证时将需要安全验证码。', @@ -931,7 +954,13 @@ const translations: TranslationDeepObject = { admins: '仅限管理员', }, }, - supportalSwitcher: {title: '切换 Supportal 到其他账户', emailLabel: '电子邮箱地址', reasonLabel: '支持登录原因', reasonHint: '未找到此账户的近期工单。', login: '登录'}, + supportalSwitcher: { + title: '切换 Supportal 到其他账户', + emailLabel: '电子邮箱地址', + reasonLabel: '支持登录原因', + reasonHint: '未找到此账户的近期工单。', + login: '登录', + }, sidebarScreen: { buttonFind: '查找内容…', buttonMySettings: '我的设置', @@ -948,11 +977,23 @@ const translations: TranslationDeepObject = { toDos: '待办事项', timeSensitiveSection: { title: '时间敏感', - addShippingAddress: {title: '我们需要您的收货地址', subtitle: '请提供一个地址以接收您的 Expensify 卡。', cta: '添加'}, - addPaymentCard: {title: '添加支付卡以继续使用 Expensify', subtitle: '账户 > 订阅', cta: '添加'}, + addShippingAddress: { + title: '我们需要您的收货地址', + subtitle: '请提供一个地址以接收您的 Expensify 卡。', + cta: '添加', + }, + addPaymentCard: { + title: '添加支付卡以继续使用 Expensify', + subtitle: '账户 > 订阅', + cta: '添加', + }, addBankAccount: {title: '添加银行账户以接收报销'}, addDepositAccount: {title: '添加银行账户以接收付款'}, - activateCard: {title: '激活你的 Expensify 卡', subtitle: '验证您的银行卡并开始消费。', cta: '启用'}, + activateCard: { + title: '激活你的 Expensify 卡', + subtitle: '验证您的银行卡并开始消费。', + cta: '启用', + }, confirmDigitalWalletAddition: { subtitle: 'Expensify 卡', }, @@ -968,22 +1009,39 @@ const translations: TranslationDeepObject = { defaultSubtitle: '工作区', subtitle: ({policyName}: {policyName: string}) => `${policyName} > 公司卡片`, }, - fixPersonalCardConnection: {title: ({cardName}: {cardName?: string}) => (cardName ? `修复 ${cardName} 个人卡连接` : '修复个人银行卡连接'), subtitle: '钱包'}, + fixPersonalCardConnection: { + title: ({cardName}: {cardName?: string}) => (cardName ? `修复 ${cardName} 个人卡连接` : '修复个人银行卡连接'), + subtitle: '钱包', + }, fixPolicyConnection: { title: ({integrationName}: {integrationName: string}) => `修复 ${integrationName} 连接`, defaultSubtitle: '工作区', subtitle: ({policyName}: {policyName: string}) => `${policyName} > 会计`, }, - addHomeAddress: {title: '添加您的家庭住址以进行距离跟踪', subtitle: '账户', cta: '添加'}, - fixFailedBilling: {title: '我们无法向您档案中的银行卡收费', subtitle: '订阅'}, + addHomeAddress: { + title: '添加您的家庭住址以进行距离跟踪', + subtitle: '账户', + cta: '添加', + }, + fixFailedBilling: { + title: '我们无法向您档案中的银行卡收费', + subtitle: '订阅', + }, unlockBankAccount: { workspaceTitle: '您的企业银行账户已被锁定', personalTitle: '您的银行账户已被锁定', workspaceSubtitle: ({policyName}: {policyName: string}) => policyName, personalSubtitle: '钱包', }, - addVirtualCardPersonalDetails: {title: '添加你的详细信息以查看并开始使用 Expensify 卡。', subtitle: 'Expensify 卡', cta: '添加'}, - enterSignerInfo: {title: '需要签署人信息', subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `银行账户 ${bankAccountLastFour}`}, + addVirtualCardPersonalDetails: { + title: '添加你的详细信息以查看并开始使用 Expensify 卡。', + subtitle: 'Expensify 卡', + cta: '添加', + }, + enterSignerInfo: { + title: '需要签署人信息', + subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `银行账户 ${bankAccountLastFour}`, + }, payOverdueInvoice: { cta: '审核', dueSoonTitle: ({date}: {date: string}) => `请在 ${date} 前支付您的发票,以避免服务中断`, @@ -994,7 +1052,10 @@ const translations: TranslationDeepObject = { subtitle: ({date}: {date: string}) => `订阅将于 ${date} 结束`, cta: '管理', }, - emailDeliveryFailure: {title: '我们无法向你发送电子邮件通知', subtitle: '账户'}, + emailDeliveryFailure: { + title: '我们无法向你发送电子邮件通知', + subtitle: '账户', + }, upgradeNetSuiteConnection: {title: '升级您的 NetSuite 连接'}, }, forYouSection: { @@ -1063,7 +1124,10 @@ const translations: TranslationDeepObject = { hotelIn: ({destination}: {destination: string}) => `${destination}的酒店`, carRentalIn: ({destination}: {destination: string}) => `在 ${destination} 租车`, inOneWeek: '1 周后', - inDays: () => ({one: '1 天后', other: (count: number) => `在 ${count} 天后`}), + inDays: () => ({ + one: '1 天后', + other: (count: number) => `在 ${count} 天后`, + }), today: '今天', }, freeTrialSection: { @@ -1118,10 +1182,22 @@ const translations: TranslationDeepObject = { setupTravel: '设置差旅', setupTravelSubText: '配置差旅专用规则', }, - yourSpend: {title: '您的支出', awaitingApproval: '等待审批', repaidLast30Days: '过去30天已偿还'}, + yourSpend: { + title: '您的支出', + awaitingApproval: '等待审批', + repaidLast30Days: '过去30天已偿还', + }, seeMore: ({count}: {count: number}) => `再查看 ${count} 个`, - recentlyAddedSection: {title: '最近添加', viewAll: '查看所有报销费用', emptyStateTitle: '最近没有报销记录', emptyStateMessage: '创建一个或将收据拖到这里'}, - insightsSection: {chartUnavailable: '图表不可用', notEnoughData: '我们目前没有足够的数据来填充此图表'}, + recentlyAddedSection: { + title: '最近添加', + viewAll: '查看所有报销费用', + emptyStateTitle: '最近没有报销记录', + emptyStateMessage: '创建一个或将收据拖到这里', + }, + insightsSection: { + chartUnavailable: '图表不可用', + notEnoughData: '我们目前没有足够的数据来填充此图表', + }, conciergePrompt: { goodMorning: ({name}: {name?: string}) => (name ? `早上好,${name}。` : '早上好。'), goodAfternoon: ({name}: {name?: string}) => (name ? `下午好,${name}。` : '下午好。'), @@ -1133,7 +1209,10 @@ const translations: TranslationDeepObject = { insightsPage: { viewOnSpend: '在支出中查看', emptyState: {title: '没有可显示的内容', subtitle: '请尝试调整上面的条件'}, - noExpensesState: {title: '查看你的资金流向', subtitle: '添加报销后,您就能查看消费趋势、主要商家等更多信息。'}, + noExpensesState: { + title: '查看你的资金流向', + subtitle: '添加报销后,您就能查看消费趋势、主要商家等更多信息。', + }, compare: { label: '比较', previousPeriod: '上一期', @@ -1870,14 +1949,26 @@ const translations: TranslationDeepObject = { failedToAutoApproveViaDEW: (reason: string) => `未能通过工作区规则批准。${reason}`, failedToApproveViaDEW: (reason: string) => `批准失败。${reason}`, cannotDuplicateDistanceExpense: '你无法在不同工作区之间复制里程报销,因为各个工作区的费率可能不同。', - taxDisabledAlert: {title: '税费已禁用', prompt: '请在工作区中启用税费跟踪,以便编辑此报销的详细信息或从该报销中删除税费。', confirmText: '删除税费'}, + taxDisabledAlert: { + title: '税费已禁用', + prompt: '请在工作区中启用税费跟踪,以便编辑此报销的详细信息或从该报销中删除税费。', + confirmText: '删除税费', + }, bulkDuplicateLimit: `您一次最多可以复制 ${CONST.SEARCH.BULK_DUPLICATE_LIMIT} 笔报销。请减少选择的报销数量后重试。`, deleted: '已删除', deletePendingExpense: '删除待处理报销', deleteConfirmationPendingBYOC: '您确定要删除这笔报销吗?它目前处于待处理状态,如果入账后,我们可能会再次导入。', deleteConfirmationSomePendingBYOC: '您确定要删除这些报销吗?其中一些处于待处理状态,如果入账后,我们可能会再次导入。', - categoryDisabledAlert: {title: '类别已禁用', prompt: '在工作区中启用类别,以编辑报销详情或从此报销中删除该类别。', confirmText: '删除类别'}, - tagDisabledAlert: {title: '标签已停用', prompt: '请在工作区中启用标签,以便编辑该报销的详细信息或从此报销中删除该标签。', confirmText: '删除标签'}, + categoryDisabledAlert: { + title: '类别已禁用', + prompt: '在工作区中启用类别,以编辑报销详情或从此报销中删除该类别。', + confirmText: '删除类别', + }, + tagDisabledAlert: { + title: '标签已停用', + prompt: '请在工作区中启用标签,以便编辑该报销的详细信息或从此报销中删除该标签。', + confirmText: '删除标签', + }, undeletedExpense: '恢复了此报销单', conciergeAutoSelectedDistanceRates: ({policyName}: {policyName: string}) => `已为新工作区更新里程报销标准 - ${policyName}`, }, @@ -2197,7 +2288,11 @@ const translations: TranslationDeepObject = { saved: '已保存', }, }, - securityPage: {title: '安全', subtitle: '保障您的账户安全。', goToSecurity: '返回安全页面'}, + securityPage: { + title: '安全', + subtitle: '保障您的账户安全。', + goToSecurity: '返回安全页面', + }, shareCodePage: { title: '你的代码', subtitle: '通过分享你的个人二维码或推荐链接邀请成员加入 Expensify。', @@ -2426,7 +2521,10 @@ const translations: TranslationDeepObject = { confirmMerge: '确定要合并账户吗?', lossOfUnsubmittedData: (login: string) => `合并您的账户后将无法撤销,并且会导致 ${login} 的所有未提交报销被删除。`, enterSecurityCode: (login: string) => `若要继续,请输入发送到 ${login} 的安全码。`, - errors: {incorrectSecurityCode: '安全码不正确或无效。请重试或请求新代码。', fallback: '出现问题。请稍后再试。'}, + errors: { + incorrectSecurityCode: '安全码不正确或无效。请重试或请求新代码。', + fallback: '出现问题。请稍后再试。', + }, }, mergeSuccess: { accountsMerged: '账户已合并!', @@ -2699,7 +2797,10 @@ const translations: TranslationDeepObject = { cardInactive: '未激活', assignedCards: '卡片', assignedCardsDescription: '已分配卡片的交易会自动同步。', - addVirtualCardPersonalDetails: {subtitle: '请输入您的个人信息以开始使用您的卡', cta: '添加详细信息'}, + addVirtualCardPersonalDetails: { + subtitle: '请输入您的个人信息以开始使用您的卡', + cta: '添加详细信息', + }, expensifyCard: 'Expensify 卡', walletActivationPending: '我们正在审核您的信息。请几分钟后再回来查看!', walletActivationFailed: '很遗憾,您的钱包目前无法启用。请与 Concierge 聊天以获取进一步帮助。', @@ -2724,7 +2825,11 @@ const translations: TranslationDeepObject = { unshareBankAccountWarning: ({admin}: {admin?: string | null}) => `${admin} 将失去对此企业银行账户的访问权限。我们仍会完成任何正在处理中的付款。`, reachOutForHelp: '它正在与 Expensify 卡一起使用。如需取消共享,请联系 Concierge。', unshareErrorModalTitle: '无法取消共享银行账户', - travelCVV: {title: '旅行 CVV', subtitle: '预订差旅时使用此选项', description: '使用此卡预订 Expensify Travel 行程。结账时它会显示为“Travel Card”。'}, + travelCVV: { + title: '旅行 CVV', + subtitle: '预订差旅时使用此选项', + description: '使用此卡预订 Expensify Travel 行程。结账时它会显示为“Travel Card”。', + }, chaseAccountNumberDifferent: '为什么我的账户号码不同?', cardLastSynced: (relativeDate: string) => `已同步于 ${relativeDate}`, cardNeverSynced: '从未同步', @@ -2749,8 +2854,16 @@ const translations: TranslationDeepObject = { accountRequiresAttention: '此账户需要处理', unlock: '解锁', }, - wiseGlobalReimbursementsIntro: {title: '设置全球报销?', subtitle: '按当地货币向全球成员付款。', getStarted: '开始使用', headerTitle: '全球报销'}, - wiseGlobalReimbursementsBanner: {title: '向全球付款', subtitle: '在您的美元账户中启用全球报销。'}, + wiseGlobalReimbursementsIntro: { + title: '设置全球报销?', + subtitle: '按当地货币向全球成员付款。', + getStarted: '开始使用', + headerTitle: '全球报销', + }, + wiseGlobalReimbursementsBanner: { + title: '向全球付款', + subtitle: '在您的美元账户中启用全球报销。', + }, }, addCardToDigitalWallet: { title: ({walletName}: {walletName: string}) => `将卡添加到 ${walletName}`, @@ -3144,11 +3257,17 @@ ${amount},商户:${merchant} - 日期:${date}`, }, editAgentAvatarPage: {title: '编辑头像'}, editAgentNamePage: {title: '代理人姓名'}, - editAgentPromptPage: {title: '编写自定义说明', error: {emptyPrompt: '请输入给您代理的指示。'}}, + editAgentPromptPage: { + title: '编写自定义说明', + error: {emptyPrompt: '请输入给您代理的指示。'}, + }, expenseRulesPage: { title: '报销规则', findRule: '查找规则', - emptyRules: {title: '尚未设置规则', subtitle: '添加规则以自动生成报销报告。'}, + emptyRules: { + title: '尚未设置规则', + subtitle: '添加规则以自动生成报销报告。', + }, changes: { billableUpdate: (value: boolean) => `更新报销 ${value ? '可计费' : '不可计费'}`, categoryUpdate: (value: string) => `将类别更新为“${value}”`, @@ -3392,7 +3511,10 @@ ${amount},商户:${merchant} - 日期:${date}`, }, addWorkEmail: '添加工作邮箱', }, - workEmailValidation: {title: '验证你的工作邮箱', securityCodeSent: (workEmail: string | undefined) => `请输入发送到 ${workEmail} 的安全代码。它应该会在一两分钟内到达。`}, + workEmailValidation: { + title: '验证你的工作邮箱', + securityCodeSent: (workEmail: string | undefined) => `请输入发送到 ${workEmail} 的安全代码。它应该会在一两分钟内到达。`, + }, workEmailValidationError: { publicEmail: '请输入来自私有域的有效工作邮箱,例如:mitch@company.com', sameAsSignupEmail: '请输入与注册时不同的邮箱', @@ -3788,7 +3910,11 @@ ${amount},商户:${merchant} - 日期:${date}`, detailsPage: { localTime: '本地时间', }, - newChatPage: {startGroup: '开始群组', addToGroup: '添加到群组', addUserToGroup: (username: string) => `将 ${username} 添加到群组`}, + newChatPage: { + startGroup: '开始群组', + addToGroup: '添加到群组', + addUserToGroup: (username: string) => `将 ${username} 添加到群组`, + }, yearPickerPage: { year: '年份', selectYear: '请选择年份', @@ -4610,7 +4736,12 @@ ${amount},商户:${merchant} - 日期:${date}`, departs: '出发时间', errorMessage: '出现问题。请稍后再试。', phoneError: (phoneErrorMethodsRoute: string) => `请添加一个工作邮箱作为您的主要登录方式以预订差旅。`, - domainSelector: {headline: '你想要设置哪个域名?', title: '域名', subtitle: '为 Expensify Travel 设置选择一个域名。', recommended: '推荐'}, + domainSelector: { + headline: '你想要设置哪个域名?', + title: '域名', + subtitle: '为 Expensify Travel 设置选择一个域名。', + recommended: '推荐', + }, workspaceAddress: {headline: '您的公司地址是什么?'}, domainPermissionInfo: { title: '域名', @@ -4689,7 +4820,10 @@ ${amount},商户:${merchant} - 日期:${date}`, hotelBlockCard: '你知道吗?你可以直接在 Expensify 中预订和管理像这样的团队行程。下次就不用再费心了,试试我们的 Travel Events 工具吧。', }, - defaultWorkspaceTravelDisabled: {title: '差旅功能未启用', message: '如需预订,请在您的默认工作区中启用差旅功能,或将默认工作区切换为已启用差旅功能的工作区。'}, + defaultWorkspaceTravelDisabled: { + title: '差旅功能未启用', + message: '如需预订,请在您的默认工作区中启用差旅功能,或将默认工作区切换为已启用差旅功能的工作区。', + }, }, workspace: { common: { @@ -5409,11 +5543,18 @@ ${amount},商户:${merchant} - 日期:${date}`, [CONST.CERTINIA_EXPORT_DATE.REPORT_EXPORTED]: '导出日期', }, }, - exportReimbursable: {label: '导出可报销费用为', helperText: '标记为可报销的费用将作为应付账单导出,并开具给员工。'}, + exportReimbursable: { + label: '导出可报销费用为', + helperText: '标记为可报销的费用将作为应付账单导出,并开具给员工。', + }, exportNonReimbursable: {label: '将不可报销的报销单导出为'}, expenseReports: '报销报告', - exportReimbursableExpenseReports: {helperText: '标记为可报销的费用将导出为开给员工的报销报告。'}, - exportNonReimbursableExpenseReports: {helperText: '标记为不可报销的费用将导出为开给员工的报销报告。'}, + exportReimbursableExpenseReports: { + helperText: '标记为可报销的费用将导出为开给员工的报销报告。', + }, + exportNonReimbursableExpenseReports: { + helperText: '标记为不可报销的费用将导出为开给员工的报销报告。', + }, noVendorsFound: '未找到供应商', noVendorsFoundDescription: '在 Certinia 中添加供应商后,请再次同步连接。', noCompaniesFound: '未找到公司', @@ -5441,7 +5582,12 @@ ${amount},商户:${merchant} - 日期:${date}`, chartOfAccounts: '会计科目表', chartOfAccountsDescription: '会计科目表会作为类别导入 Expensify。', dimensionMapping: ({n}: {n: number}) => `维度 ${n}`, - dimensions: {dimension1: '维度 1', dimension2: '维度 2', dimension3: '维度 3', dimension4: '维度 4'}, + dimensions: { + dimension1: '维度 1', + dimension2: '维度 2', + dimension3: '维度 3', + dimension4: '维度 4', + }, doNotMap: '不要映射', doNotMapSubtitle: '默认使用员工资源', mappingTypes: { @@ -5893,7 +6039,14 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM noAccountsFound: '未找到账户', noAccountsFoundDescription: '请在 Rillet 中添加账户并重新同步连接', exportDescription: '配置 Expensify 数据导出到 Rillet 的方式。', - exportReimbursable: {label: '将可报销费用导出为', values: {[CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: {label: '供应商账单'}}}, + exportReimbursable: { + label: '将可报销费用导出为', + values: { + [CONST.RILLET_EXPORT_REIMBURSABLE.VENDOR_BILL]: { + label: '供应商账单', + }, + }, + }, exportDate: { label: '供应商账单日期', description: '将报表导出到 Rillet 时使用此日期。', @@ -5912,9 +6065,22 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM }, }, }, - exportNonReimbursable: {label: '导出公司卡费用为', values: {[CONST.RILLET_EXPORT_NON_REIMBURSABLE.CREDIT_CARD_CHARGE]: {label: '信用卡'}}}, - defaultCompanyCardVendor: {label: '默认公司卡供应商', description: '为未自动匹配的报销选择一个默认的 Rillet 供应商。'}, - companyCardAccount: {label: '公司卡账户', description: '选择公司卡交易的导出位置。'}, + exportNonReimbursable: { + label: '导出公司卡费用为', + values: { + [CONST.RILLET_EXPORT_NON_REIMBURSABLE.CREDIT_CARD_CHARGE]: { + label: '信用卡', + }, + }, + }, + defaultCompanyCardVendor: { + label: '默认公司卡供应商', + description: '为未自动匹配的报销选择一个默认的 Rillet 供应商。', + }, + companyCardAccount: { + label: '公司卡账户', + description: '选择公司卡交易的导出位置。', + }, noBankAccountsFound: '未找到银行账户', noBankAccountsFoundDescription: '请在 Rillet 中添加银行账户,然后再次同步连接', autoSyncDescription: '每天自动同步 Rillet 和 Expensify。报表实时同步。', @@ -5932,11 +6098,20 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM }, syncReimbursedReports: '同步已报销报表', syncReimbursedReportsDescription: '当报销单通过 ACH 支付时,将在此账户中生成一笔账单付款。', - billPaymentAccount: {label: '账单支付账户', description: '选择从哪里支付账单,我们会在 Rillet 中创建付款。'}, + billPaymentAccount: { + label: '账单支付账户', + description: '选择从哪里支付账单,我们会在 Rillet 中创建付款。', + }, syncExpensifyCardSettlements: '同步 Expensify 卡结算', - settlementAccount: {label: 'Expensify 卡结算账户', description: '选择您的结算账户,我们会在 Rillet 中创建这笔付款。'}, + settlementAccount: { + label: 'Expensify 卡结算账户', + description: '选择您的结算账户,我们会在 Rillet 中创建这笔付款。', + }, syncTravelInvoicingSettlements: '同步合并差旅结算', - travelInvoicingSettlementAccount: {label: '合并差旅结算账户', description: '选择您的结算账户,我们会在 Rillet 中创建这笔付款。'}, + travelInvoicingSettlementAccount: { + label: '合并差旅结算账户', + description: '选择您的结算账户,我们会在 Rillet 中创建这笔付款。', + }, exportToMultipleAccounts: '配置导出到多个账户', cardProgramAccount: { label: '卡计划账户', @@ -5966,7 +6141,10 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM return `${customAccountsCount} 张带有自定义账户的卡`; }, }, - fxExpenseAccount: {label: 'Rillet 货币转换手续费科目', description: '当您的公司承担一笔境外付款的货币兑换成本时,我们会在 Rillet 中将该成本作为一条日记账分录记入此科目。'}, + fxExpenseAccount: { + label: 'Rillet 货币转换手续费科目', + description: '当您的公司承担一笔境外付款的货币兑换成本时,我们会在 Rillet 中将该成本作为一条日记账分录记入此科目。', + }, }, dualEntry: { dualEntrySetup: 'DualEntry 设置', @@ -6073,12 +6251,24 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM }, syncReimbursedReports: '同步已报销报表', syncReimbursedReportsDescription: '当报表通过 ACH 支付时,将在此账户中生成一笔账单付款。', - billPaymentAccount: {label: '账单付款账户', description: '选择从哪里支付账单,我们会在 DualEntry 中创建该付款。'}, - fxExpenseAccount: {label: 'DualEntry 货币转换手续费科目', description: '当您的公司承担一笔境外付款的货币兑换成本时,我们会在 DualEntry 中将该成本作为一条日记账分录记入此科目。'}, + billPaymentAccount: { + label: '账单付款账户', + description: '选择从哪里支付账单,我们会在 DualEntry 中创建该付款。', + }, + fxExpenseAccount: { + label: 'DualEntry 货币转换手续费科目', + description: '当您的公司承担一笔境外付款的货币兑换成本时,我们会在 DualEntry 中将该成本作为一条日记账分录记入此科目。', + }, syncExpensifyCardSettlements: '同步 Expensify 卡结算', - settlementAccount: {label: 'Expensify 卡结算账户', description: '选择您的结算账户,我们会在 DualEntry 中创建这笔付款。'}, + settlementAccount: { + label: 'Expensify 卡结算账户', + description: '选择您的结算账户,我们会在 DualEntry 中创建这笔付款。', + }, syncTravelInvoicingSettlements: '同步合并差旅结算', - travelInvoicingSettlementAccount: {label: '合并差旅账单结算账户', description: '选择您的结算账户,我们会在 DualEntry 中创建这笔付款。'}, + travelInvoicingSettlementAccount: { + label: '合并差旅账单结算账户', + description: '选择您的结算账户,我们会在 DualEntry 中创建这笔付款。', + }, travelInvoicingPayableAccount: {label: '合并差旅账单应付账户'}, }, type: { @@ -6220,13 +6410,28 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM cardIdentityColumn: '请映射卡号或卡名称,以便将交易匹配到相应的卡片。', }, fileImportDescription: '如果您的银行无法发送数据馈送时的手动选项。', - duplicateFeedModal: {title: '卡片流水已连接', prompt: '您不能将同一张卡片流水两次添加到同一个工作区。'}, + duplicateFeedModal: { + title: '卡片流水已连接', + prompt: '您不能将同一张卡片流水两次添加到同一个工作区。', + }, }, statementCloseDate: { [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_DAY_OF_MONTH]: '月末最后一天', [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.LAST_BUSINESS_DAY_OF_MONTH]: '每月的最后一个工作日', [CONST.COMPANY_CARDS.STATEMENT_CLOSE_DATE.CUSTOM_DAY_OF_MONTH]: '自定义月份日期', }, + reimbursable: { + title: '可报销', + description: '选择如何创建银行卡交易。新交易将遵循这些规则。', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES]: '始终可报销', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES}Description`]: '始终报销给员工', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO]: '始终不可报销', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO}Description`]: '从不报销给员工', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES]: '可报销', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES}Description`]: '通常报销给员工', + [CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO]: '不可报销', + [`${CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO}Description`]: '偶尔报销给员工', + }, assign: '分配', assignCard: '分配卡片', findCompanyCard: '查找公司卡', @@ -6272,7 +6477,10 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM importButton: '导入交易', }, deletedCard: '已删除的卡片', - assignNewCards: {title: '分配新卡', description: '从您的银行获取可分配的最新银行卡'}, + assignNewCards: { + title: '分配新卡', + description: '从您的银行获取可分配的最新银行卡', + }, }, expensifyCard: { issueAndManageCards: '发放并管理您的 Expensify 卡', @@ -6460,10 +6668,20 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM subtitle: '我们正在审核你启用 Expensify Travel 的请求。别担心,准备好后我们会通知你。', ctaText: '请求已发送', }, - bookOrManageYourTrip: {title: '差旅预订', subtitle: '恭喜!您现在可以在此工作区预订和管理差旅了。', ctaText: '管理差旅'}, + bookOrManageYourTrip: { + title: '差旅预订', + subtitle: '恭喜!您现在可以在此工作区预订和管理差旅了。', + ctaText: '管理差旅', + }, settings: { - autoAddTripName: {title: '将行程名称添加到报销单', subtitle: '为在 Expensify 中预订的行程,自动将行程名称添加到报销事由描述中。'}, - codingSync: {title: '将编码同步到 Expensify Travel', subtitle: '将此工作区的类别、标签和报表字段推送到 Expensify Travel,以便出行人能在预订时填写。'}, + autoAddTripName: { + title: '将行程名称添加到报销单', + subtitle: '为在 Expensify 中预订的行程,自动将行程名称添加到报销事由描述中。', + }, + codingSync: { + title: '将编码同步到 Expensify Travel', + subtitle: '将此工作区的类别、标签和报表字段推送到 Expensify Travel,以便出行人能在预订时填写。', + }, }, travelInvoicing: { travelBookingSection: { @@ -6496,16 +6714,30 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM setUpNewFeed: '设置新的差旅数据源', feedSelectorIntro: '您的组织已设置合并差旅账单数据源。请选择该数据源,以将此工作区的差旅支出合并到同一月度账单中。', }, - disableModal: {title: '关闭合并差旅结算?', body: '即将到来的酒店和汽车租赁预订可能需要使用不同的付款方式重新预订,以避免被取消。', confirm: '关闭'}, - outstandingBalanceModal: {title: '无法关闭“合并出行结算”', body: '你仍有未结清的差旅余额。请先支付该余额。', confirm: '明白了'}, - payBalanceModal: {title: (amount: string) => `支付 ${amount} 的余额?`, body: '付款将被加入队列,并会在稍后处理。此操作一旦开始将无法撤销。'}, + disableModal: { + title: '关闭合并差旅结算?', + body: '即将到来的酒店和汽车租赁预订可能需要使用不同的付款方式重新预订,以避免被取消。', + confirm: '关闭', + }, + outstandingBalanceModal: { + title: '无法关闭“合并出行结算”', + body: '你仍有未结清的差旅余额。请先支付该余额。', + confirm: '明白了', + }, + payBalanceModal: { + title: (amount: string) => `支付 ${amount} 的余额?`, + body: '付款将被加入队列,并会在稍后处理。此操作一旦开始将无法撤销。', + }, exportToPDF: '导出为 PDF', exportToCSV: '导出为 CSV', selectDateRangeError: '请选择要导出的日期范围', invalidDateRangeError: '开始日期必须早于结束日期', enabled: '已启用合并差旅账单!', enabledDescription: '此工作区的所有差旅支出现在将统一汇总到一份月度账单中。', - sendInvoiceModal: {title: (amount: string) => `要发送金额为 ${amount} 的发票吗?`, body: '我们会为您当前的差旅支出创建一张发票。发票付清后,您的差旅额度将被释放。'}, + sendInvoiceModal: { + title: (amount: string) => `要发送金额为 ${amount} 的发票吗?`, + body: '我们会为您当前的差旅支出创建一张发票。发票付清后,您的差旅额度将被释放。', + }, }, personalDetailsDescription: '为预订行程,请输入您在政府签发的身份证件上显示的法定姓名。', }, @@ -6671,14 +6903,18 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM subtitle: '为时间跟踪设置可计费的小时费率。', defaultHourlyRate: '默认时薪', }, - hrWarningModal: {disconnectText: ({integration}: {integration: string}) => `若要禁用人力资源功能,请先将此工作区与 ${integration} 断开连接。`}, + hrWarningModal: { + disconnectText: ({integration}: {integration: string}) => `若要禁用人力资源功能,请先将此工作区与 ${integration} 断开连接。`, + }, vendors: { title: '供应商', subtitle: '将卡片报销与从您的会计软件导入的供应商进行匹配。', disabledTitle: '别急...', disabledMessage: '要启用或禁用此功能,您需要更改会计导入设置。', }, - recruitingWarningModal: {disconnectText: ({integration}: {integration: string}) => `若要停用招聘功能,请先将此工作区与 ${integration} 断开连接。`}, + recruitingWarningModal: { + disconnectText: ({integration}: {integration: string}) => `若要停用招聘功能,请先将此工作区与 ${integration} 断开连接。`, + }, }, reports: { reportsCustomTitleExamples: '示例:', @@ -6700,7 +6936,10 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM findReportField: '查找报表字段', deleteConfirmation: '确定要删除此报表字段吗?', deleteFieldsConfirmation: '确定要删除这些报表字段吗?', - emptyReportFields: {title: '尚无报表字段', subtitle: '添加一个自定义字段(文本、日期或下拉菜单),用于显示在报表上。'}, + emptyReportFields: { + title: '尚无报表字段', + subtitle: '添加一个自定义字段(文本、日期或下拉菜单),用于显示在报表上。', + }, subtitle: '报表字段适用于所有支出,当你想提示填写额外信息时会很有帮助。', disableReportFields: '禁用报表字段', disableReportFieldsConfirmation: '确定要这样做吗?文本和日期字段将被删除,列表将被禁用。', @@ -6725,7 +6964,10 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM disableValues: '禁用值', enableValue: '启用值', enableValues: '启用值', - emptyReportFieldsValues: {title: '尚无列表值', subtitle: '添加自定义值以显示在报表中。'}, + emptyReportFieldsValues: { + title: '尚无列表值', + subtitle: '添加自定义值以显示在报表中。', + }, deleteValuePrompt: '确定要删除此列表值吗?', deleteValuesPrompt: '确定要删除这些列表值吗?', listValueRequiredError: '请输入列表值名称', @@ -7056,7 +7298,10 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM auditors: '审计员', guests: '访客', editors: '编辑者', - emptyRoleFilter: {title: '没有成员符合此筛选条件', subtitle: '邀请成员或更改上方的筛选条件。'}, + emptyRoleFilter: { + title: '没有成员符合此筛选条件', + subtitle: '邀请成员或更改上方的筛选条件。', + }, configureHRSync: (providerName: string) => `配置 ${providerName} 同步。`, syncWithHR: (providerName: string) => `与 ${providerName} 同步`, makeCardAdmin: () => ({one: '设为卡片管理员', other: '设为卡管理员'}), @@ -7542,7 +7787,11 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM promptEnd: '中添加办公地点,才能启用“按家庭和办公室计算”设置。', cta: '知道了', }, - errors: {distanceMustBePositive: '距离必须是一个正整数。', invalidAddress: '请输入有效地址', distanceTooLarge: '距离过大。'}, + errors: { + distanceMustBePositive: '距离必须是一个正整数。', + invalidAddress: '请输入有效地址', + distanceTooLarge: '距离过大。', + }, workArrangement: { title: '默认工作安排', officeBasedTitle: '办公室办公', @@ -7560,7 +7809,10 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM }, distance: '距离', centrallyManage: '集中管理费率,以英里或公里跟踪,并设置默认类别。', - emptyRates: {title: '尚未设置里程费率', subtitle: '添加里程报销费率,以自定义报销标准。'}, + emptyRates: { + title: '尚未设置里程费率', + subtitle: '添加里程报销费率,以自定义报销标准。', + }, rate: '评分', addRate: '添加费率', findRate: '查找费率', @@ -8174,7 +8426,11 @@ ${reportName}`, preventPayoutNonReimbursableReportsTitle: '防止将不可报销的报告标记为已支付', preventPayoutNonReimbursableReportsSubtitle: '不允许管理员将不予报销的报表标记为已支付。', }, - agentsPromoBanner: {title: '找不到需要的规则?添加代理人', subtitle: '添加复杂规则,并通过自定义代理减少人工审批。', cta: '试用一下'}, + agentsPromoBanner: { + title: '找不到需要的规则?添加代理人', + subtitle: '添加复杂规则,并通过自定义代理减少人工审批。', + cta: '试用一下', + }, merchantRules: { title: '商户', subtitle: '设置商户规则,使报销费用自动使用正确的编码,并减少后期清理工作。', @@ -8453,7 +8709,14 @@ ${reportName}`, fallbackBanner: '这不是一条标准规则,所以我们将其制定为代理规则。代理规则会在报销或报表发生变更后生效,例如暂扣该报销或驳回该报表。', fallbackBannerWithExplanation: (explanation: string) => `这不是一条标准规则,因此我们将其起草为代理规则。${explanation}`, }, - tabs: {general: '常规', cardRestrictions: '卡片限制', expenseDefaults: '报销默认设置', requireFields: '字段要求', flagForReview: '标记以供审核', agents: '代理人'}, + tabs: { + general: '常规', + cardRestrictions: '卡片限制', + expenseDefaults: '报销默认设置', + requireFields: '字段要求', + flagForReview: '标记以供审核', + agents: '代理人', + }, bulkActions: { deleteMultiple: () => ({ one: '删除规则', @@ -8503,7 +8766,12 @@ ${reportName}`, emptyAmountError: '在保存之前请输入有效金额', receiptAmountGreaterThanItemizedError: '所需收据金额不能大于所需分项收据金额。', }, - requireFields: {title: '对所有报销设置必填字段', category: '类别', tag: '标签', save: '保存规则'}, + requireFields: { + title: '对所有报销设置必填字段', + category: '类别', + tag: '标签', + save: '保存规则', + }, newRule: { title: '新规则', subtitle: '你想要做什么?', @@ -8551,7 +8819,11 @@ ${reportName}`, merchantTypeIs: (merchantType: string) => `商户类型为"${merchantType}"`, categoryIs: (category: string) => `类别为“${category}”`, }, - merchantTypeRule: {merchantType: '商户类型', saveRule: '保存规则', confirmErrorCategory: '请选择一个类别。'}, + merchantTypeRule: { + merchantType: '商户类型', + saveRule: '保存规则', + confirmErrorCategory: '请选择一个类别。', + }, requireFieldsTable: { tableColumnType: '类型', tableColumnCondition: '条件', @@ -8568,7 +8840,11 @@ ${reportName}`, doNotRequireItemizedReceipt: '不要求明细收据', typeLabel: '必填', }, - requireFieldsEmptyState: {title: '提前补全缺失信息', subtitle: '为特定类别设置报销字段为必填或可选。', cta: '创建字段必填规则'}, + requireFieldsEmptyState: { + title: '提前补全缺失信息', + subtitle: '为特定类别设置报销字段为必填或可选。', + cta: '创建字段必填规则', + }, requireFieldsRule: { title: '字段要求', subtitle: '要求填写特定报销字段,或免除其必填限制。', @@ -8592,7 +8868,11 @@ ${reportName}`, conditionCategoryAndDailyAmount: (category: string, amount: string) => `类别为"${category}",且每日类别总额高于 ${amount}`, flagForReview: '标记以供审核', }, - flagForReviewEmptyState: {title: '找出需要进一步查看的报销费用', subtitle: '当特定报销值得额外审核时提醒审批人。', cta: '创建标记规则'}, + flagForReviewEmptyState: { + title: '找出需要进一步查看的报销费用', + subtitle: '当特定报销值得额外审核时提醒审批人。', + cta: '创建标记规则', + }, flagForReviewRule: { title: '标记以供审核', subtitle: '在满足以下条件时通知审批人。', @@ -8605,8 +8885,15 @@ ${reportName}`, flagTypeWarning: '警告', flagTypeWarningDescription: '将警告报销提交人,但仍允许其提交报销', }, - agentRulesEmptyState: {title: '未添加代理规则', subtitle: '创建规则以自动化您的工作区策略。', cta: '添加 AI 规则'}, - categoriesDisabledEmptyState: {title: '类别未启用', subtitle: '启用类别以更好地控制您的支出。'}, + agentRulesEmptyState: { + title: '未添加代理规则', + subtitle: '创建规则以自动化您的工作区策略。', + cta: '添加 AI 规则', + }, + categoriesDisabledEmptyState: { + title: '类别未启用', + subtitle: '启用类别以更好地控制您的支出。', + }, expenseDefaultType: { title: '应用报销默认值', subtitle: '此规则应匹配什么内容?', @@ -8615,7 +8902,11 @@ ${reportName}`, category: '类别', categoryDescription: '为特定类别设置默认税率', }, - taxesDisabledEmptyState: {title: '税费未启用', subtitle: '启用税费以记录并追回符合条件的税款。', cta: '启用税费'}, + taxesDisabledEmptyState: { + title: '税费未启用', + subtitle: '启用税费以记录并追回符合条件的税款。', + cta: '启用税费', + }, }, planTypePage: { planTypes: { @@ -8714,7 +9005,11 @@ ${reportName}`, dontSeeYourATS: `没有看到你的 ATS?询问 Concierge,我们可以帮你添加。`, importSettings: '导入设置', defaultApprover: '默认审批人', - approverFields: {recruiter: '招聘人员', recruitingCoordinator: '招聘协调员', hiringManager: '招聘经理'}, + approverFields: { + recruiter: '招聘人员', + recruitingCoordinator: '招聘协调员', + hiringManager: '招聘经理', + }, filters: { description: (providerName: string) => `选择要从 ${providerName} 导入的成员。您可以按工作阶段、标签和办公室进行选择。`, stages: { @@ -8723,8 +9018,18 @@ ${reportName}`, toggleTitle: '工作阶段', allSelected: '所有职位阶段', }, - tags: {title: '标签', description: '选择要与此工作区同步的候选人标签', toggleTitle: '标签', allSelected: '所有标签'}, - offices: {title: '办公室', description: '选择你想与此工作区同步的候选人办公地点', toggleTitle: '办公室', allSelected: '所有办公室'}, + tags: { + title: '标签', + description: '选择要与此工作区同步的候选人标签', + toggleTitle: '标签', + allSelected: '所有标签', + }, + offices: { + title: '办公室', + description: '选择你想与此工作区同步的候选人办公地点', + toggleTitle: '办公室', + allSelected: '所有办公室', + }, enableJobStagesOrTags: '请选择至少一个工作阶段或标签以继续', }, subtitle: '连接招聘工具并保持候选人审批同步。', @@ -8744,7 +9049,11 @@ ${reportName}`, const fieldList = fieldNames.length > 2 ? `其 ${fieldNames.slice(0, -1).join(', ')} 或 ${lastFieldName}` : `其 ${fieldNames.join('或其')}`; return `为您的候选人选择第一位审批人:在 ${providerName} 中分配的 ${fieldList}。`; }, - approvalModeDescriptions: {basic: '选择单个审批人', advanced: `候选人的招聘人员或协调人将成为其报销审批人`, custom: '在 Expensify 中手动设置审批人'}, + approvalModeDescriptions: { + basic: '选择单个审批人', + advanced: `候选人的招聘人员或协调人将成为其报销审批人`, + custom: '在 Expensify 中手动设置审批人', + }, }, merge: { connections: '连接', @@ -8778,7 +9087,10 @@ ${reportName}`, approvalModeWarningConfirm: '更改审批模式', syncingModalTitle: '您的连接正在同步', syncingModalDescription: '首次连接可能需要一些时间。若发生任何错误,我们会通知你。', - syncLimitReached: {title: '请明天再试', prompt: '您已达到今日的同步上限。'}, + syncLimitReached: { + title: '请明天再试', + prompt: '您已达到今日的同步上限。', + }, syncResults: { title: (provider: string) => `${provider} 同步完成`, successTitle: (provider: string) => `已成功同步您的 ${provider} 连接!`, @@ -8787,7 +9099,10 @@ ${reportName}`, skipped: '已跳过', }, }, - emptyDomain: {title: '通过域名提升安全性', subtitle: '要求您域中的成员通过单点登录登录、限制工作区创建等。'}, + emptyDomain: { + title: '通过域名提升安全性', + subtitle: '要求您域中的成员通过单点登录登录、限制工作区创建等。', + }, campfire: { campfireSetup: '营火设置', enterCredentials: '输入你的 Campfire API 密钥', @@ -8804,19 +9119,40 @@ ${reportName}`, enableNewAccountsDescription: '新的 Campfire 账户将可用作类别。', dimensionsImport: '所有 Campfire 维度都会作为标签导入', exportDescription: '配置 Expensify 数据导出到 Campfire 的方式。', - exportReimbursable: {label: '导出可报销费用为', values: {VENDOR_BILL: {label: '供应商账单'}}}, + exportReimbursable: { + label: '导出可报销费用为', + values: {VENDOR_BILL: {label: '供应商账单'}}, + }, exportDate: { label: '供应商账单日期', description: '导出报表到 Campfire 时使用此日期。', values: { - LAST_EXPENSE: {label: '上次报销日期', description: '报表中最新报销的日期。'}, - REPORT_EXPORTED: {label: '导出日期', description: '报表导出到 Campfire 的日期。'}, - REPORT_SUBMITTED: {label: '提交日期', description: '报表提交审批的日期。'}, + LAST_EXPENSE: { + label: '上次报销日期', + description: '报表中最新报销的日期。', + }, + REPORT_EXPORTED: { + label: '导出日期', + description: '报表导出到 Campfire 的日期。', + }, + REPORT_SUBMITTED: { + label: '提交日期', + description: '报表提交审批的日期。', + }, }, }, - exportNonReimbursable: {label: '导出公司卡消费为', values: {JOURNAL_ENTRY: {label: '日记账分录'}}}, - defaultCompanyCardVendor: {label: '所有公司卡的默认供应商', description: '为未自动匹配的报销选择一个默认的 Campfire 供应商。'}, - companyCardAccount: {label: '公司信用卡账户', description: '选择公司卡交易的导出位置。'}, + exportNonReimbursable: { + label: '导出公司卡消费为', + values: {JOURNAL_ENTRY: {label: '日记账分录'}}, + }, + defaultCompanyCardVendor: { + label: '所有公司卡的默认供应商', + description: '为未自动匹配的报销选择一个默认的 Campfire 供应商。', + }, + companyCardAccount: { + label: '公司信用卡账户', + description: '选择公司卡交易的导出位置。', + }, noAccountsFound: '未找到账户', noAccountsFoundDescription: '请在 Campfire 中添加账户,然后再次同步连接', autoSyncDescription: '每天自动同步 Campfire 和 Expensify。报告实时同步。', @@ -8834,11 +9170,20 @@ ${reportName}`, }, syncReimbursedReports: '同步已报销报表', syncReimbursedReportsDescription: '当报表通过 ACH 支付时,将在此账户中生成一笔账单付款。', - billPaymentAccount: {label: '账单付款账户', description: '当 Expensify 将账单标记为已支付时,选择用于 Campfire 贷记的清算账户。'}, + billPaymentAccount: { + label: '账单付款账户', + description: '当 Expensify 将账单标记为已支付时,选择用于 Campfire 贷记的清算账户。', + }, syncExpensifyCardSettlements: '同步 Expensify 卡结算', - settlementAccount: {label: 'Expensify 卡结算账户', description: '选择您的结算账户,我们会在 Campfire 中创建这笔付款。'}, + settlementAccount: { + label: 'Expensify 卡结算账户', + description: '选择您的结算账户,我们会在 Campfire 中创建这笔付款。', + }, syncTravelInvoicingSettlements: '同步合并差旅结算', - travelInvoicingSettlementAccount: {label: '合并差旅账单结算账户', description: '选择您的结算账户,我们会在 Campfire 中创建这笔付款。'}, + travelInvoicingSettlementAccount: { + label: '合并差旅账单结算账户', + description: '选择您的结算账户,我们会在 Campfire 中创建这笔付款。', + }, travelInvoicingPayableAccount: {label: '合并差旅账单应付账户'}, exportToMultipleAccounts: '配置导出到多个账户', cardProgramAccount: { @@ -8967,7 +9312,10 @@ ${reportName}`, exportToNextOpenPeriodDescription: '当报告日期位于 Dynamics 365 Business Central 的已关闭期间时,将其导出到下一个未关闭期间。', syncReimbursedReports: '同步已报销报表', syncReimbursedReportsDescription: '当报表通过 ACH 支付时,将在此科目中生成一条普通日记账分录。', - reimbursementBankAccount: {label: '付款银行账户', description: '选择从哪里支付账单,我们会在 Dynamics 365 Business Central 中创建付款。'}, + reimbursementBankAccount: { + label: '付款银行账户', + description: '选择从哪里支付账单,我们会在 Dynamics 365 Business Central 中创建付款。', + }, syncExpensifyCardSettlements: '同步 Expensify 卡结算', settlementsBankAccount: { label: 'Expensify 卡结算账户', @@ -9463,7 +9811,11 @@ ${reportName}`, commuterExclusions: { changedToFixedDistance: ({previousMethod}: {previousMethod: string}) => `将排除通勤方式更改为按每次报销的固定距离(先前为 ${previousMethod})`, changedToHomeAndOffice: ({previousMethod}: {previousMethod: string}) => `已将排除通勤的计算方式更改为按家庭和办公室计算(此前为 ${previousMethod})`, - previousMethod: {disabled: '不要排除通勤', fixedDistance: '每次报销的固定距离', homeAndOffice: '家庭和办公'}, + previousMethod: { + disabled: '不要排除通勤', + fixedDistance: '每次报销的固定距离', + homeAndOffice: '家庭和办公', + }, setFixedDistance: ({formattedDistance}: {formattedDistance: string}) => `将每次报销的固定距离排除设置为 ${formattedDistance}`, changedFixedDistance: ({formattedOldDistance, formattedNewDistance}: {formattedOldDistance: string; formattedNewDistance: string}) => `已将固定距离免除调整为每笔报销 ${formattedNewDistance}(之前为 ${formattedOldDistance})`, @@ -9512,6 +9864,8 @@ ${reportName}`, `已将“${mccGroupName}”的默认支出类别更改为“${newCategory}”(此前为“${oldCategory}”)`, addedReportField: (fieldType: string, fieldName?: string, defaultValue?: string) => `已添加 ${fieldType} 报告字段“${fieldName}”${defaultValue ? ` 默认值为“${defaultValue}”` : ''}`, updatedRequireCompanyCards: ({enabled}: {enabled: boolean}) => `${enabled ? '已启用' : '已禁用'} 公司商务卡消费要求`, + updatedCardFeedReimbursable: (feedName: string, newValue?: string, previousValue?: string) => + `更改了银行卡数据源“可报销”设置 "${feedName}"${newValue ? ` 为 "${newValue}"` : ''}${previousValue ? ` (之前 "${previousValue}")` : ''}`, agentRule: { added: ({title, prompt}: {title: string; prompt: string}) => (title ? `已添加代理规则“${title}”:${prompt}` : `已添加代理规则:${prompt}`), updated: ({title, prompt}: {title: string; prompt: string}) => (title ? `已将代理规则“${title}”更新为:${prompt}` : `已将代理规则更新为:${prompt}`), @@ -9545,7 +9899,13 @@ ${reportName}`, one: '已将支出规则应用于另外 1 张卡片', other: `已将支出规则应用于另外 ${count} 张卡片`, }), - phraseVerb: {added: '已添加', removed: '已移除', changed: '已更改', set: '设置', applied: '已应用'}, + phraseVerb: { + added: '已添加', + removed: '已移除', + changed: '已更改', + set: '设置', + applied: '已应用', + }, bodyMerchant: ({adjective, value}: {adjective: string; value: string}) => (adjective !== '' ? `${adjective} 商家“${value}”` : `商户“${value}”`), bodyMerchantValueOnly: ({value}: {value: string}) => `“${value}”`, bodyMerchantChange: ({adjective, oldValue, newValue}: {adjective: string; oldValue: string; newValue: string}) => @@ -9763,8 +10123,16 @@ ${reportName}`, title: '暂无内容', subtitle: `请尝试调整搜索条件,或使用 “+” 按钮创建新项目。`, }, - emptyExpenseResults: {title: '还没有报销费用', subtitle: '创建一笔报销,或试用 Expensify 以了解更多。', subtitleWithOnlyCreateButton: '使用下面的绿色按钮来创建一笔报销。'}, - emptyReportResults: {title: '尚无报表', subtitle: '创建报表或试用 Expensify,了解更多信息。', subtitleWithOnlyCreateButton: '使用下方的绿色按钮创建报表。'}, + emptyExpenseResults: { + title: '还没有报销费用', + subtitle: '创建一笔报销,或试用 Expensify 以了解更多。', + subtitleWithOnlyCreateButton: '使用下面的绿色按钮来创建一笔报销。', + }, + emptyReportResults: { + title: '尚无报表', + subtitle: '创建报表或试用 Expensify,了解更多信息。', + subtitleWithOnlyCreateButton: '使用下方的绿色按钮创建报表。', + }, emptyInvoiceResults: { title: '还没有发票', subtitle: '发送发票或试用 Expensify,了解更多信息。', @@ -9772,7 +10140,11 @@ ${reportName}`, subtitleCannotSend: '您需要一个启用了Invoices的工作区才能发送发票。', subtitleCannotSendWithTestDrive: '您需要一个启用了Invoices的工作区才能发送发票。试用 Expensify,了解更多信息。', }, - emptyTripResults: {title: '暂无行程', subtitle: '从下面开始预订您的第一趟行程。', buttonText: '预订行程'}, + emptyTripResults: { + title: '暂无行程', + subtitle: '从下面开始预订您的第一趟行程。', + buttonText: '预订行程', + }, emptySubmitResults: { title: '没有可提交的报销', subtitle: '一切就绪,庆祝一下你的胜利吧!', @@ -9794,12 +10166,18 @@ ${reportName}`, title: '没有可显示的报销记录', subtitle: '没有结果。请尝试调整筛选条件。', }, - emptyViolationSnapshotResults: {subtitle: (formattedDate: string) => `违规仅从 ${formattedDate} 起开始记录。请尝试调整您的日期筛选条件。`}, + emptyViolationSnapshotResults: { + subtitle: (formattedDate: string) => `违规仅从 ${formattedDate} 起开始记录。请尝试调整您的日期筛选条件。`, + }, emptyUnapprovedResults: { title: '没有报销可审批', subtitle: '零报销,最大轻松。干得好!', }, - staleResults: {title: '需要刷新', subtitle: '此页面已过期,刷新以查看最新内容', buttonText: '刷新'}, + staleResults: { + title: '需要刷新', + subtitle: '此页面已过期,刷新以查看最新内容', + buttonText: '刷新', + }, }, columns: '列', editColumns: '编辑列', @@ -9896,7 +10274,10 @@ ${reportName}`, cardFeedNameCSV: ({cardFeedLabel}: {cardFeedLabel?: string}) => `所有导入的 CSV 卡片${cardFeedLabel ? ` - ${cardFeedLabel}` : ''}`, travelInvoicing: '合并差旅账单', }, - bankAccount: {banks: '银行账户', closedBankAccounts: '已关闭的银行账户'}, + bankAccount: { + banks: '银行账户', + closedBankAccounts: '已关闭的银行账户', + }, workspace: {active: '活跃', archived: '已归档', selectAll: '全选'}, reportField: (name: string, value: string) => `${name} 为 ${value}`, current: '当前', @@ -9940,14 +10321,21 @@ ${reportName}`, [CONST.SEARCH.WITHDRAWAL_TYPE.TRAVEL_BILLING]: '合并差旅账单', }, is: '是', - has: {submittedViolation: '已提交违规', approvedViolation: '已批准违规'}, + has: { + submittedViolation: '已提交违规', + approvedViolation: '已批准违规', + }, action: { [CONST.SEARCH.ACTION_FILTERS.SUBMIT]: '提交', [CONST.SEARCH.ACTION_FILTERS.APPROVE]: '批准', [CONST.SEARCH.ACTION_FILTERS.PAY]: '支付', [CONST.SEARCH.ACTION_FILTERS.EXPORT]: '导出', }, - filterType: {label: '筛选类型', has: {positive: '有', negative: '没有'}, is: {positive: '是', negative: '不是'}}, + filterType: { + label: '筛选类型', + has: {positive: '有', negative: '没有'}, + is: {positive: '是', negative: '不是'}, + }, merchant: { matchType: '匹配类型', contains: (merchant?: string) => (merchant ? `包含 "${merchant}"` : '包含'), @@ -9970,7 +10358,13 @@ ${reportName}`, limitResults: '限制结果', }, has: '有', - view: {label: '查看', table: '表格', bar: '栏', line: '折线', pie: '饼图'}, + view: { + label: '查看', + table: '表格', + bar: '栏', + line: '折线', + pie: '饼图', + }, chartTitles: { [CONST.SEARCH.GROUP_BY.FROM]: '来自', [CONST.SEARCH.GROUP_BY.CARD]: '卡片', @@ -9984,7 +10378,10 @@ ${reportName}`, [CONST.SEARCH.GROUP_BY.YEAR]: '年', [CONST.SEARCH.GROUP_BY.QUARTER]: '季度', }, - moneyRequestReport: {emptyStateTitle: '暂时没有报销费用', accessPlaceHolder: '展开查看详情'}, + moneyRequestReport: { + emptyStateTitle: '暂时没有报销费用', + accessPlaceHolder: '展开查看详情', + }, noCategory: '无类别', noMerchant: '无商家', noTag: '无标签', @@ -10020,7 +10417,11 @@ ${reportName}`, description: '哇,项目真不少!我们会把它们打包好,Concierge 很快就会给你发送一个文件。', }, exportedTo: '已导出到', - exportAll: {selectAllMatchingItems: '选择所有匹配的项目', allMatchingItemsSelected: '已选择所有匹配的项目', selectAllOnThisPage: '选择本页全部内容'}, + exportAll: { + selectAllMatchingItems: '选择所有匹配的项目', + allMatchingItemsSelected: '已选择所有匹配的项目', + selectAllOnThisPage: '选择本页全部内容', + }, errors: { pleaseSelectDatesForBothFromAndTo: '请选择起始和结束日期', }, @@ -10049,11 +10450,19 @@ ${reportName}`, mergeReports: { title: '合并报表', description: '选择要保留的报表。所有费用都将移入该报表,其他报表将被删除。', - listPage: {noEligibleReportsFound: '未找到符合条件的报表', noEligibleReportsFoundSubtitle: '您没有任何可合并的报表。'}, + listPage: { + noEligibleReportsFound: '未找到符合条件的报表', + noEligibleReportsFoundSubtitle: '您没有任何可合并的报表。', + }, }, periodSoFar: ({period}: {period: string}) => `目前 ${period}`, weekOf: ({date}: {date: string}) => `${date} 当周`, - saveEdits: {title: '保存编辑', prompt: ({name}: {name: string}) => `要更新对“${name}”的更改,还是创建一个新项?`, createNew: '新建', updateExisting: '更新现有内容'}, + saveEdits: { + title: '保存编辑', + prompt: ({name}: {name: string}) => `要更新对“${name}”的更改,还是创建一个新项?`, + createNew: '新建', + updateExisting: '更新现有内容', + }, }, genericErrorPage: { title: '哎呀,出错了!', @@ -10080,11 +10489,21 @@ ${reportName}`, }, }, settlement: { - status: {pending: '待处理', cleared: '已入账', failed: '失败', never: '从不', cashBack: '返现'}, + status: { + pending: '待处理', + cleared: '已入账', + failed: '失败', + never: '从不', + cashBack: '返现', + }, failedError: ({link}: {link: string}) => `当你解锁你的账户后,我们会重试此结算。`, withdrawalInfo: ({date, withdrawalID}: {date: string; withdrawalID: number}) => `${date} • 提现 ID:${withdrawalID}`, }, - paidStatus: {markedAsPaid: '标记为已付款', withdrawing: '提现中', confirmed: '已确认'}, + paidStatus: { + markedAsPaid: '标记为已付款', + withdrawing: '提现中', + confirmed: '已确认', + }, reportLayout: { reportLayout: '报表布局', groupByLabel: '分组依据:', @@ -10424,7 +10843,10 @@ ${reportName}`, }, error: { selectSuggestedAddress: '请选择一个推荐地址或使用当前位置', - mapOrGpsDistanceRequired: {title: '需要 GPS 或地图输入', description: '此工作区要求里程报销必须基于地图或通过 GPS 进行轨迹跟踪。'}, + mapOrGpsDistanceRequired: { + title: '需要 GPS 或地图输入', + description: '此工作区要求里程报销必须基于地图或通过 GPS 进行轨迹跟踪。', + }, }, odometer: { startReading: '开始阅读', @@ -10514,15 +10936,28 @@ ${reportName}`, prompt: '确定要放弃此行程并退出登录吗?', confirm: '放弃并退出登录', }, - switchToODWarningTripInProgress: {title: '正在进行 GPS 跟踪', prompt: '您确定要停止 GPS 追踪并切换到 Expensify Classic 吗?', confirm: '停止并切换'}, - switchAccountWarningTripInProgress: {title: '正在进行 GPS 跟踪', prompt: '确定要停止 GPS 追踪并切换账户吗?', confirm: '停止并切换'}, + switchToODWarningTripInProgress: { + title: '正在进行 GPS 跟踪', + prompt: '您确定要停止 GPS 追踪并切换到 Expensify Classic 吗?', + confirm: '停止并切换', + }, + switchAccountWarningTripInProgress: { + title: '正在进行 GPS 跟踪', + prompt: '确定要停止 GPS 追踪并切换账户吗?', + confirm: '停止并切换', + }, locationServicesRequiredModal: { title: '需要访问位置信息', confirm: '打开设置', prompt: '请在设备设置中允许访问位置信息,以开始使用 GPS 距离跟踪。', }, gpsFloatingPillText: '正在进行 GPS 跟踪…', - liveActivity: {subtitle: '跟踪距离', button: '查看进度', lockScreenBadgeText: '距离', lockScreenTrackingText: '正在跟踪…'}, + liveActivity: { + subtitle: '跟踪距离', + button: '查看进度', + lockScreenBadgeText: '距离', + lockScreenTrackingText: '正在跟踪…', + }, }, reportCardLostOrDamaged: { screenTitle: '成绩单遗失或损坏', @@ -10718,7 +11153,11 @@ ${reportName}`, markAsCashToIgnore: '标记为现金以忽略并请求付款。', smartscanFailed: ({canEdit = true, missingFields = []}: {canEdit?: boolean; missingFields?: string[]}) => { if (missingFields.length > 0) { - const fieldNames: Record = {merchant: '商家', date: '日期', amount: '金额'}; + const fieldNames: Record = { + merchant: '商家', + date: '日期', + amount: '金额', + }; const translated = missingFields.map((f) => fieldNames[f] ?? f); let fieldList = ''; if (translated.length === 1) { @@ -10991,8 +11430,14 @@ ${reportName}`, onboardingChatTitle: (discountType: number) => `限时优惠:首年立享 ${discountType}% 折扣!`, subtitle: (days: number, hours: number, minutes: number, seconds: number) => `在 ${days > 0 ? `${days}天:` : ''}${hours} 小时 ${minutes} 分 ${seconds} 秒内认领`, }, - travelInvoiceOverdue: {title: '您的差旅发票已逾期', subtitle: (date: string) => `请在 ${date} 前支付您的差旅发票,以继续预订差旅。`}, - travelInvoiceOverdueLocked: {title: '差旅预订已暂停', subtitle: '您的差旅行程发票已逾期。请支付后再开始预订行程。'}, + travelInvoiceOverdue: { + title: '您的差旅发票已逾期', + subtitle: (date: string) => `请在 ${date} 前支付您的差旅发票,以继续预订差旅。`, + }, + travelInvoiceOverdueLocked: { + title: '差旅预订已暂停', + subtitle: '您的差旅行程发票已逾期。请支付后再开始预订行程。', + }, }, cardSection: { title: '付款', @@ -11120,7 +11565,14 @@ ${reportName}`, one: '1 位活跃用户', other: `${count} 名活跃用户`, }), - state: {paid: '已支付', cleared: '已清算', failed: '失败', refunded: '已退款', disputed: '有争议', balanceTransfer: '余额转账'}, + state: { + paid: '已支付', + cleared: '已清算', + failed: '失败', + refunded: '已退款', + disputed: '有争议', + balanceTransfer: '余额转账', + }, details: '付款详情', badge: { balanceTransferTo: ({email}: {email: string}) => `余额转账至 ${email}`, @@ -11604,7 +12056,10 @@ ${reportName}`, reportSuspiciousActivityPrompt: (email: string) => `你确定要这样做吗?这将锁定 ${email} 的账户。

我们的团队随后会审核该账户并移除任何未经授权的访问。若要重新获得访问权限,他们需要与 Concierge 配合处理。`, reportSuspiciousActivityConfirmationPrompt: '我们会审核账户以确认解锁是否安全,如有任何问题将通过 Concierge 与您联系。', - emptyMembers: {title: '此群组中没有成员', subtitle: '添加成员或尝试更改上方的筛选条件。'}, + emptyMembers: { + title: '此群组中没有成员', + subtitle: '添加成员或尝试更改上方的筛选条件。', + }, moveToGroup: '移至群组', chooseWhereToMove: ({count}: {count: number}) => ({ one: `选择将 ${count} 位成员移动到哪里。`, @@ -11631,7 +12086,10 @@ ${reportName}`, }, groups: { title: '群组', - memberCount: () => ({one: '1 名成员', other: (count: number) => `${count} 名成员`}), + memberCount: () => ({ + one: '1 名成员', + other: (count: number) => `${count} 名成员`, + }), defaultGroup: '新成员的默认群组', defaultGroupPrompt: (currentName: string, newName: string) => `您确定要将 ${newName} 设为默认群组吗?新成员将被邀请加入此群组,而不是之前的默认群组(${currentName})。`, makeDefault: '设为默认', @@ -11660,7 +12118,12 @@ ${reportName}`, findGroup: '查找群组', }, }, - proactiveAppReview: {title: '喜欢全新的 Expensify 吗?', description: '请告诉我们,这样我们就能帮助您让报销体验变得更好。', positiveButton: '太棒了!', negativeButton: '不太是'}, + proactiveAppReview: { + title: '喜欢全新的 Expensify 吗?', + description: '请告诉我们,这样我们就能帮助您让报销体验变得更好。', + positiveButton: '太棒了!', + negativeButton: '不太是', + }, trialPaymentReminder: { title: '提前做好准备', subtitle: '不要等到最后一刻,立即添加您的付款方式,以确保您可以持续访问 Expensify 上的费用。', @@ -11713,6 +12176,10 @@ ${reportName}`, mobileRenewPrompt: '请在网页浏览器中访问 Expensify 以提前续订。', mobileClaimPrompt: '请在网页浏览器中访问 Expensify 以领取您的续订折扣。', }, - bulkActionBar: {label: '批量操作', clearSelection: '清除选择', loadingSelection: '正在加载所选内容'}, + bulkActionBar: { + label: '批量操作', + clearSelection: '清除选择', + loadingSelection: '正在加载所选内容', + }, }; export default translations; diff --git a/src/libs/API/parameters/SetFeedReimbursableParams.ts b/src/libs/API/parameters/SetFeedReimbursableParams.ts new file mode 100644 index 000000000000..04d12925ff83 --- /dev/null +++ b/src/libs/API/parameters/SetFeedReimbursableParams.ts @@ -0,0 +1,10 @@ +import type {SelectableFeedReimbursable} from '@src/types/onyx/CardFeeds'; + +type SetFeedReimbursableParams = { + policyID: string; + bankName: string; + domainAccountID: number; + forceReimbursable: SelectableFeedReimbursable; +}; + +export default SetFeedReimbursableParams; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index 2a50ecba2d99..f52bd4f32473 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -580,6 +580,7 @@ export type {default as DeleteCompanyCardFeed} from './DeleteCompanyCardFeed'; export type {default as SetCompanyCardTransactionLiability} from './SetCompanyCardTransactionLiability'; export type {default as OpenPolicyCompanyCardsFeedParams} from './OpenPolicyCompanyCardsFeedParams'; export type {default as OpenPolicyAddCardFeedPageParams} from './OpenPolicyAddCardFeedPageParams'; +export type {default as SetFeedReimbursableParams} from './SetFeedReimbursableParams'; export type {default as SetFeedStatementPeriodEndDayParams} from './SetFeedStatementPeriodEndDayParams'; export type {default as AssignCompanyCardParams} from './AssignCompanyCardParams'; export type {default as UnassignCardParams} from './UnassignCardParams'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 7719574713a3..bc05820d6516 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -717,6 +717,7 @@ const WRITE_COMMANDS = { SET_COMPANY_CARD_TRANSACTION_LIABILITY: 'SetFeedTransactionLiability', OPEN_POLICY_ADD_CARD_FEED_PAGE: 'OpenPolicyAddCardFeedPage', SET_FEED_STATEMENT_PERIOD_END_DAY: 'SetFeedStatementPeriodEndDay', + SET_FEED_REIMBURSABLE: 'SetFeedReimbursable', ASSIGN_COMPANY_CARD: 'AssignCard', UNASSIGN_CARD: 'UnassignCard', SYNC_CARD: 'SyncCard', @@ -892,6 +893,7 @@ type WriteCommandParameters = { [WRITE_COMMANDS.SET_COMPANY_CARD_TRANSACTION_LIABILITY]: Parameters.SetCompanyCardTransactionLiability; [WRITE_COMMANDS.OPEN_POLICY_ADD_CARD_FEED_PAGE]: Parameters.OpenPolicyAddCardFeedPageParams; [WRITE_COMMANDS.SET_FEED_STATEMENT_PERIOD_END_DAY]: Parameters.SetFeedStatementPeriodEndDayParams; + [WRITE_COMMANDS.SET_FEED_REIMBURSABLE]: Parameters.SetFeedReimbursableParams; [WRITE_COMMANDS.VERIFY_IDENTITY]: Parameters.VerifyIdentityParams; [WRITE_COMMANDS.ACCEPT_WALLET_TERMS]: Parameters.AcceptWalletTermsParams; [WRITE_COMMANDS.ANSWER_QUESTIONS_FOR_WALLET]: Parameters.AnswerQuestionsForWalletParams; diff --git a/src/libs/CardFeedUtils.ts b/src/libs/CardFeedUtils.ts index eba005cd50e8..9c773381ff25 100644 --- a/src/libs/CardFeedUtils.ts +++ b/src/libs/CardFeedUtils.ts @@ -587,9 +587,21 @@ function getCombinedCardFeedsFromAllFeeds( } } + // Use the local reimbursable value during pending or failed saves; the OAuth value may be stale. + const hasLocalReimbursableChange = !!feedSettings?.pendingFields?.forceReimbursable || !!feedSettings?.errorFields?.forceReimbursable; + const reimbursableOverrides: Partial = + oAuthAccountDetails && hasLocalReimbursableChange + ? { + forceReimbursable: feedSettings?.forceReimbursable ?? oAuthAccountDetails.forceReimbursable, + pendingFields: {...oAuthAccountDetails.pendingFields, ...feedSettings?.pendingFields}, + errorFields: {...oAuthAccountDetails.errorFields, ...feedSettings?.errorFields}, + } + : {}; + const combinedCardFeed: CombinedCardFeed = { ...feedSettings, ...oAuthAccountDetails, + ...reimbursableOverrides, customFeedName: customFeedName ?? feedSettings?.uploadLayoutSettings?.layoutName, domainID, feed: feedName, diff --git a/src/libs/CardUtils.ts b/src/libs/CardUtils.ts index 4b2b227ee50b..3f3726709389 100644 --- a/src/libs/CardUtils.ts +++ b/src/libs/CardUtils.ts @@ -39,6 +39,7 @@ import type { CompanyCardFeedWithNumber, CompanyFeeds, NonConnectableBankName, + SelectableFeedReimbursable, } from '@src/types/onyx/CardFeeds'; import type {CardFeedErrors} from '@src/types/onyx/DerivedValues'; import type {Errors} from '@src/types/onyx/OnyxCommon'; @@ -2564,7 +2565,27 @@ function resolveTransactionCardFields(transactions: T[], }); } +function isSelectableFeedReimbursable(value: unknown): value is SelectableFeedReimbursable { + return Object.values(CONST.COMPANY_CARDS.FEED_REIMBURSABLE).some((option) => option === value); +} + +/** + * Normalizes unset and legacy settings so they match the options available to admins. + * Undefined or an empty string means `force_no`, and legacy `none` means `default_no`. + * Unknown server values return undefined to avoid displaying an incorrect setting. + */ +function getEffectiveFeedReimbursable(value: string | undefined): SelectableFeedReimbursable | undefined { + if (!value) { + return CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO; + } + if (value === CONST.COMPANY_CARDS.FEED_REIMBURSABLE_LEGACY_NONE) { + return CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO; + } + return isSelectableFeedReimbursable(value) ? value : undefined; +} + export { + getEffectiveFeedReimbursable, canResolveTransactionCard, getAssignedCardSortKey, getCardFeedBackgroundColor, diff --git a/src/libs/Navigation/AppNavigator/AuthScreensInitHandler.tsx b/src/libs/Navigation/AppNavigator/AuthScreensInitHandler.tsx index b46f91efc8bb..067e69f89324 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreensInitHandler.tsx +++ b/src/libs/Navigation/AppNavigator/AuthScreensInitHandler.tsx @@ -160,7 +160,13 @@ function AuthScreensInitHandler() { return; } // This means sign in in RHP was successful, so we can subscribe to user events - initializePusher(session?.accountID, session?.email, () => topmostOneTransactionThreadReportIDRef.current, formatPhoneNumber, () => reportAttributesRef.current); + initializePusher( + session?.accountID, + session?.email, + () => topmostOneTransactionThreadReportIDRef.current, + formatPhoneNumber, + () => reportAttributesRef.current, + ); // eslint-disable-next-line react-hooks/exhaustive-deps -- This handler should only be re-registered when the session changes. }, [session?.accountID, session?.email]); @@ -189,7 +195,13 @@ function AuthScreensInitHandler() { }); PusherConnectionManager.init(); - initializePusher(session?.accountID, session?.email, () => topmostOneTransactionThreadReportIDRef.current, formatPhoneNumber, () => reportAttributesRef.current).finally(() => { + initializePusher( + session?.accountID, + session?.email, + () => topmostOneTransactionThreadReportIDRef.current, + formatPhoneNumber, + () => reportAttributesRef.current, + ).finally(() => { endSpan(CONST.TELEMETRY.SPAN_NAVIGATION.PUSHER_INIT); }); diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index dd6d600dca96..b16fe1692476 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -1159,6 +1159,7 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../../pages/workspace/companyCards/WorkspaceCompanyCardsSettingsFeedNamePage').default, [SCREENS.WORKSPACE.COMPANY_CARDS_SETTINGS_STATEMENT_CLOSE_DATE]: () => require('../../../../pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage').default, + [SCREENS.WORKSPACE.COMPANY_CARDS_SETTINGS_REIMBURSABLE]: () => require('../../../../pages/workspace/companyCards/WorkspaceCompanyCardReimbursablePage').default, [SCREENS.SETTINGS.SAVE_THE_WORLD]: () => require('../../../../pages/TeachersUnite/SaveTheWorldPage').default, [SCREENS.SETTINGS.SUBSCRIPTION.CHANGE_BILLING_CURRENCY]: () => require('../../../../pages/settings/Subscription/PaymentCard/ChangeBillingCurrency').default, [SCREENS.SETTINGS.SUBSCRIPTION.DYNAMIC_PAYMENT_CARD_CURRENCY_SELECTOR]: () => diff --git a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts index 15ce62c1bd74..16f6444e69bd 100755 --- a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts +++ b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts @@ -451,6 +451,7 @@ const WORKSPACE_TO_RHP: Partial['config'] = { [SCREENS.WORKSPACE.COMPANY_CARDS_SETTINGS_STATEMENT_CLOSE_DATE]: { path: ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS_STATEMENT_CLOSE_DATE.route, }, + [SCREENS.WORKSPACE.COMPANY_CARDS_SETTINGS_REIMBURSABLE]: { + path: ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS_REIMBURSABLE.route, + }, [SCREENS.WORKSPACE.DYNAMIC_EXPENSIFY_CARD_DETAILS]: DYNAMIC_ROUTES.WORKSPACE_EXPENSIFY_CARD_DETAILS.path, [SCREENS.WORKSPACE.DYNAMIC_WORKSPACE_COMPANY_CARDS_ADD_NEW]: DYNAMIC_ROUTES.WORKSPACE_COMPANY_CARDS_ADD_NEW.path, [SCREENS.WORKSPACE.COMPANY_CARDS_IMPORT_SPREADSHEET]: { diff --git a/src/libs/Navigation/paramLists/WorkspaceSettingsParamList.ts b/src/libs/Navigation/paramLists/WorkspaceSettingsParamList.ts index dc38564d79a3..df6be7bb361c 100644 --- a/src/libs/Navigation/paramLists/WorkspaceSettingsParamList.ts +++ b/src/libs/Navigation/paramLists/WorkspaceSettingsParamList.ts @@ -1441,6 +1441,7 @@ type WorkspaceSettingsParamList = { [SCREENS.WORKSPACE.COMPANY_CARDS_SETTINGS_STATEMENT_CLOSE_DATE]: { policyID: string; }; + [SCREENS.WORKSPACE.COMPANY_CARDS_SETTINGS_REIMBURSABLE]: {policyID: string}; [SCREENS.WORKSPACE.DYNAMIC_EXPENSIFY_CARD_DETAILS]: { policyID: string; cardID: string; diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index e47d9ce19b28..04c1ff7746b7 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -56,7 +56,7 @@ import Onyx from 'react-native-onyx'; import type {MessageElementBase, MessageTextElement} from './MessageElement'; import type {OptimisticIOUReportAction, PartialReportAction} from './ReportUtils'; -import {getBankName, isCardPendingActivate} from './CardUtils'; +import {getBankName, getEffectiveFeedReimbursable, isCardPendingActivate} from './CardUtils'; import {getDecodedCategoryName} from './CategoryUtils'; import {convertAmountToDisplayString, convertToBackendAmount, convertToShortDisplayString} from './CurrencyUtils'; import DateUtils from './DateUtils'; @@ -4519,6 +4519,32 @@ function getUpdatedCardFeedStatementPeriodMessage(translate: LocalizedTranslate, return getReportActionText(reportAction); } +function formatFeedReimbursable(translate: LocalizedTranslate, value?: string): string | undefined { + if (!value) { + return undefined; + } + const effectiveValue = getEffectiveFeedReimbursable(value); + return effectiveValue ? translate(`workspace.companyCards.reimbursable.${effectiveValue}`) : undefined; +} + +function getUpdatedCardFeedReimbursableMessage(translate: LocalizedTranslate, reportAction: OnyxEntry): string { + if (!isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_REIMBURSABLE)) { + return ''; + } + const originalMessage = getOriginalMessage(reportAction); + const feedName = originalMessage?.feedName; + const newValue = formatFeedReimbursable(translate, originalMessage?.forceReimbursable); + const rawPreviousValue = originalMessage?.previousForceReimbursable; + const previousValue = formatFeedReimbursable(translate, rawPreviousValue); + + // Keep server text when the available data cannot produce accurate localized labels. + // A missing previous setting does not prevent localizing the new setting. + if (feedName && newValue && (!rawPreviousValue || previousValue)) { + return translate('workspaceActions.updatedCardFeedReimbursable', feedName, newValue, previousValue); + } + return getReportActionText(reportAction); +} + function getRenamedAction(translate: LocalizedTranslate, reportAction: OnyxEntry>, isExpenseReport: boolean, actorName?: string) { const originalMessage = getOriginalMessage(reportAction); return translate('newRoomPage.renamedRoomAction', originalMessage?.oldName ?? '', originalMessage?.newName ?? '', isExpenseReport, actorName); @@ -5747,6 +5773,7 @@ export { getUnassignedCompanyCardMessage, getUpdatedCardFeedLiabilityMessage, getUpdatedCardFeedStatementPeriodMessage, + getUpdatedCardFeedReimbursableMessage, getWorkspaceCustomUnitRateUpdatedMessage, getTagListNameUpdatedMessage, getTagListUpdatedMessage, diff --git a/src/libs/ReportAlternateTextUtils.ts b/src/libs/ReportAlternateTextUtils.ts index 03c34d15809d..05d114b653a3 100644 --- a/src/libs/ReportAlternateTextUtils.ts +++ b/src/libs/ReportAlternateTextUtils.ts @@ -135,6 +135,7 @@ import { getUpdatedBudgetMessage, getUpdatedCardFeedLiabilityMessage, getUpdatedCardFeedStatementPeriodMessage, + getUpdatedCardFeedReimbursableMessage, getUpdatedDefaultTitleMessage, getUpdatedEmployeeOfficeLocationMessage, getUpdatedIndividualBudgetNotificationMessage, @@ -933,6 +934,9 @@ function getLastMessageTextForReport({ if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_STATEMENT_PERIOD)) { lastMessageTextFromReport = getUpdatedCardFeedStatementPeriodMessage(translate, lastReportAction); } + if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_REIMBURSABLE)) { + lastMessageTextFromReport = getUpdatedCardFeedReimbursableMessage(translate, lastReportAction); + } if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_FEATURE_ENABLED)) { lastMessageTextFromReport = getWorkspaceFeatureEnabledMessage(translate, lastReportAction); } @@ -1587,6 +1591,8 @@ function getReportAlternateText({ alternateText = getUpdatedCardFeedLiabilityMessage(translate, lastAction); } else if (isActionOfType(lastAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_STATEMENT_PERIOD)) { alternateText = getUpdatedCardFeedStatementPeriodMessage(translate, lastAction); + } else if (isActionOfType(lastAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_REIMBURSABLE)) { + alternateText = getUpdatedCardFeedReimbursableMessage(translate, lastAction); } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_AUDIT_RATE) { alternateText = getUpdatedAuditRateMessage(translate, lastAction); } else if (lastAction?.actionName === CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.ADD_APPROVER_RULE) { diff --git a/src/libs/ReportNameUtils.ts b/src/libs/ReportNameUtils.ts index baaf46de3ca4..778f70734f46 100644 --- a/src/libs/ReportNameUtils.ts +++ b/src/libs/ReportNameUtils.ts @@ -112,6 +112,7 @@ import { getUpdatedAutoHarvestingMessage, getUpdatedCardFeedLiabilityMessage, getUpdatedCardFeedStatementPeriodMessage, + getUpdatedCardFeedReimbursableMessage, getUpdatedEmployeeOfficeLocationMessage, getUpdatedMemberWorkArrangementMessage, getUpdatedOfficeLocationMessage, @@ -1046,6 +1047,9 @@ function computeReportNameBasedOnReportAction({ if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_STATEMENT_PERIOD)) { return getUpdatedCardFeedStatementPeriodMessage(translate, parentReportAction); } + if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_REIMBURSABLE)) { + return getUpdatedCardFeedReimbursableMessage(translate, parentReportAction); + } if (isActionOfType(parentReportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_REQUIRE_COMPANY_CARDS_ENABLED)) { return getRequireCompanyCardsEnabledMessage(translate, parentReportAction); } diff --git a/src/libs/TransactionUtils/duplicates.ts b/src/libs/TransactionUtils/duplicates.ts index b3ec2c66ea5c..0ee855196e3d 100644 --- a/src/libs/TransactionUtils/duplicates.ts +++ b/src/libs/TransactionUtils/duplicates.ts @@ -396,16 +396,12 @@ function compareDuplicateTransactionFields( } } } else if (fieldName === 'reimbursable') { - // Managed card transactions are always non-reimbursable. The resolved reimbursable value is applied to - // the transaction that is kept, so we only force it to false — and hide the reimbursable review step — - // when that kept transaction is itself a managed card. We gate on the selected (kept) transaction rather - // than the reviewing transaction: the Review* pages recompute this from the thread's transaction (which - // may be the cash expense) while the kept transaction is the managed card, so gating on the reviewing - // transaction would re-add the reimbursable step on back navigation. Gating on any duplicate in the set - // would instead wrongly convert a kept cash expense to non-reimbursable. + // Preserve the imported reimbursable value because company card feeds can be configured as reimbursable. + // Use the kept transaction to avoid restoring the review step when navigating back through a cash expense's thread. + // Checking any managed card in the duplicates could instead overwrite a kept cash expense's value. const selectedTransaction = transactions.find((transactionItem) => transactionItem?.transactionID === selectedTransactionID) ?? firstTransaction; if (isManagedCardTransaction(selectedTransaction)) { - keep[fieldName] = false; + keep[fieldName] = selectedTransaction?.[keys[0]] ?? selectedTransaction?.[keys[1]] ?? false; } else if (areAllFieldsEqualForKey) { keep[fieldName] = firstTransaction?.[keys[0]] ?? firstTransaction?.[keys[1]]; } else { diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts index 2c8630740931..89bd0fbaee47 100644 --- a/src/libs/TransactionUtils/index.ts +++ b/src/libs/TransactionUtils/index.ts @@ -1566,14 +1566,12 @@ function getChildTransactions(transactions: OnyxCollection, origina function createUnreportedExpenses(transactions: Array | undefined>): UnreportedExpenseListItemType[] { return transactions .filter((t): t is Transaction => t !== undefined) - .map( - (transaction): UnreportedExpenseListItemType => ({ - ...transaction, - isDisabled: isTransactionPendingDelete(transaction), - keyForList: transaction.transactionID, - errors: transaction.errors as Errors | undefined, - }), - ); + .map((transaction): UnreportedExpenseListItemType => ({ + ...transaction, + isDisabled: isTransactionPendingDelete(transaction), + keyForList: transaction.transactionID, + errors: transaction.errors as Errors | undefined, + })); } type GetEligibleTransactionsToAddParams = { diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index 0a99e6991617..a712a93d9ce2 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -12,6 +12,7 @@ import type { OpenPolicyExpensifyCardsPageParams, RequestFeedSetupParams, SetCompanyCardExportAccountParams, + SetFeedReimbursableParams, SetFeedStatementPeriodEndDayParams, UpdateCardTransactionStartDateParams, UpdateCompanyCardNameParams, @@ -40,6 +41,8 @@ import type { CompanyCardFeed, CompanyCardFeedWithDomainID, CompanyCardFeedWithNumber, + FeedReimbursable, + SelectableFeedReimbursable, StatementPeriodEnd, StatementPeriodEndDay, } from '@src/types/onyx/CardFeeds'; @@ -1256,6 +1259,89 @@ function setFeedStatementPeriodEndDay( }); } +function setFeedReimbursable( + policyID: string, + bankName: CompanyCardFeedWithNumber, + domainAccountID: number, + newForceReimbursable: SelectableFeedReimbursable, + oldForceReimbursable: FeedReimbursable | undefined, +) { + const optimisticData: Array> = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${domainAccountID}`, + value: { + settings: { + companyCards: { + [bankName]: { + forceReimbursable: newForceReimbursable, + pendingFields: { + forceReimbursable: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + }, + errorFields: { + forceReimbursable: null, + }, + }, + }, + }, + }, + }, + ]; + + const successData: Array> = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${domainAccountID}`, + value: { + settings: { + companyCards: { + [bankName]: { + pendingFields: { + forceReimbursable: null, + }, + }, + }, + }, + }, + }, + ]; + + const failureData: Array> = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${domainAccountID}`, + value: { + settings: { + companyCards: { + [bankName]: { + forceReimbursable: oldForceReimbursable ?? null, + pendingFields: { + forceReimbursable: null, + }, + errorFields: { + forceReimbursable: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage'), + }, + }, + }, + }, + }, + }, + ]; + + const parameters: SetFeedReimbursableParams = { + policyID, + bankName, + domainAccountID, + forceReimbursable: newForceReimbursable, + }; + + API.write(WRITE_COMMANDS.SET_FEED_REIMBURSABLE, parameters, { + optimisticData, + successData, + failureData, + }); +} + function importCSVCompanyCards({ policyID, domainAccountID, @@ -1508,6 +1594,7 @@ export { clearAssignCardStepAndData, openPolicyAddCardFeedPage, setFeedStatementPeriodEndDay, + setFeedReimbursable, importCSVCompanyCards, clearErrorField, clearAssignCardErrors, diff --git a/src/pages/inbox/report/ContextMenu/ContextMenuActions.tsx b/src/pages/inbox/report/ContextMenu/ContextMenuActions.tsx index 54281c8b4210..109160544e43 100644 --- a/src/pages/inbox/report/ContextMenu/ContextMenuActions.tsx +++ b/src/pages/inbox/report/ContextMenu/ContextMenuActions.tsx @@ -118,6 +118,7 @@ import { getUpdatedBudgetMessage, getUpdatedCardFeedLiabilityMessage, getUpdatedCardFeedStatementPeriodMessage, + getUpdatedCardFeedReimbursableMessage, getUpdatedDefaultTitleMessage, getUpdatedEmployeeOfficeLocationMessage, getUpdatedIndividualBudgetNotificationMessage, @@ -1450,6 +1451,8 @@ const ContextMenuActions: ContextMenuAction[] = [ setClipboardMessage(getUpdatedCardFeedLiabilityMessage(translate, reportAction)); } else if (isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_STATEMENT_PERIOD)) { setClipboardMessage(getUpdatedCardFeedStatementPeriodMessage(translate, reportAction)); + } else if (isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_REIMBURSABLE)) { + setClipboardMessage(getUpdatedCardFeedReimbursableMessage(translate, reportAction)); } else if (isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.TRAVEL_UPDATE)) { setClipboardMessage(getTravelUpdateMessage(translate, reportAction)); } else if (isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.CONCIERGE_AUTO_SELECT_DISTANCE_RATE)) { diff --git a/src/pages/inbox/report/ReportActionCompose/ComposerWithSuggestions.tsx b/src/pages/inbox/report/ReportActionCompose/ComposerWithSuggestions.tsx index c274290c2ff1..c883603c1a6d 100644 --- a/src/pages/inbox/report/ReportActionCompose/ComposerWithSuggestions.tsx +++ b/src/pages/inbox/report/ReportActionCompose/ComposerWithSuggestions.tsx @@ -956,18 +956,15 @@ function ComposerWithSuggestions({ // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - useImperativeHandle( - ref, - (): ComposerWithSuggestionsRef => ({ - focus, - replaceSelectionWithText, - getCurrentText, - clearWorklet, - resetHeight, - blur: () => composerRef.current?.blur(), - isFocused: () => composerRef.current?.isFocused() ?? false, - }), - ); + useImperativeHandle(ref, (): ComposerWithSuggestionsRef => ({ + focus, + replaceSelectionWithText, + getCurrentText, + clearWorklet, + resetHeight, + blur: () => composerRef.current?.blur(), + isFocused: () => composerRef.current?.isFocused() ?? false, + })); const onClear = useCallback( (textOnClear: string) => { diff --git a/src/pages/inbox/report/actionContents/PolicyChangeLogContent.tsx b/src/pages/inbox/report/actionContents/PolicyChangeLogContent.tsx index 4ee94cf93cc7..6f883fe2f2f7 100644 --- a/src/pages/inbox/report/actionContents/PolicyChangeLogContent.tsx +++ b/src/pages/inbox/report/actionContents/PolicyChangeLogContent.tsx @@ -66,6 +66,7 @@ import { getUpdatedBudgetMessage, getUpdatedCardFeedLiabilityMessage, getUpdatedCardFeedStatementPeriodMessage, + getUpdatedCardFeedReimbursableMessage, getUpdatedCommuterExclusionsMessage, getUpdatedMemberWorkArrangementMessage, getUpdatedDefaultTitleMessage, @@ -233,6 +234,7 @@ const POLICY_CHANGE_LOG_RESOLVERS: Record = { [CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UNASSIGN_COMPANY_CARD]: (translate, action) => getUnassignedCompanyCardMessage(translate, action), [CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_LIABILITY]: (translate, action) => getUpdatedCardFeedLiabilityMessage(translate, action), [CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_STATEMENT_PERIOD]: (translate, action) => getUpdatedCardFeedStatementPeriodMessage(translate, action), + [CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_REIMBURSABLE]: (translate, action) => getUpdatedCardFeedReimbursableMessage(translate, action), [CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_AUDIT_RATE]: (translate, action) => getUpdatedAuditRateMessage(translate, action), [CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_MANUAL_APPROVAL_THRESHOLD]: (translate, action, policy, convertToDisplayString) => getUpdatedManualApprovalThresholdMessage(translate, action, convertToDisplayString), diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardReimbursablePage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardReimbursablePage.tsx new file mode 100644 index 000000000000..3a0f4c9bbf3e --- /dev/null +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardReimbursablePage.tsx @@ -0,0 +1,134 @@ +import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator'; +import HeaderWithBackButtonAndTitle from '@components/Header/composed/HeaderWithBackButtonAndTitle'; +import OfflineWithFeedback from '@components/OfflineWithFeedback'; +import ScreenWrapper from '@components/ScreenWrapper'; +import SelectionList from '@components/SelectionList'; +import SingleSelectListItem from '@components/SelectionList/ListItem/SingleSelectListItem'; +import Text from '@components/Text'; + +import useCardFeeds from '@hooks/useCardFeeds'; +import useLocalize from '@hooks/useLocalize'; +import useOnyx from '@hooks/useOnyx'; +import useThemeStyles from '@hooks/useThemeStyles'; +import useWorkspaceAccountID from '@hooks/useWorkspaceAccountID'; + +import {clearErrorField, setFeedReimbursable} from '@libs/actions/CompanyCards'; +import {getCompanyCardFeed, getCompanyFeeds, getDomainOrWorkspaceAccountID, getEffectiveFeedReimbursable, getSelectedFeed} from '@libs/CardUtils'; +import Navigation from '@libs/Navigation/Navigation'; +import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; +import type {SettingsNavigatorParamList} from '@libs/Navigation/types'; + +import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper'; + +import CONST from '@src/CONST'; +import ONYXKEYS from '@src/ONYXKEYS'; +import ROUTES from '@src/ROUTES'; +import type SCREENS from '@src/SCREENS'; +import type {SelectableFeedReimbursable} from '@src/types/onyx/CardFeeds'; +import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue'; + +import React, {useState} from 'react'; + +type WorkspaceCompanyCardReimbursablePageProps = PlatformStackScreenProps; + +function WorkspaceCompanyCardReimbursablePage({ + route: { + params: {policyID}, + }, +}: WorkspaceCompanyCardReimbursablePageProps) { + const {translate} = useLocalize(); + const styles = useThemeStyles(); + const [lastSelectedFeed, lastSelectedFeedResult] = useOnyx(`${ONYXKEYS.COLLECTION.LAST_SELECTED_FEED}${policyID}`); + const [cardFeeds, cardFeedsResult] = useCardFeeds(policyID); + const selectedFeed = getSelectedFeed(lastSelectedFeed, cardFeeds); + const feed = selectedFeed ? getCompanyCardFeed(selectedFeed) : undefined; + const workspaceAccountID = useWorkspaceAccountID(policyID); + const companyFeeds = getCompanyFeeds(cardFeeds); + const selectedFeedData = selectedFeed ? companyFeeds[selectedFeed] : undefined; + const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, selectedFeedData); + const storedValue = selectedFeedData?.forceReimbursable; + const currentValue = getEffectiveFeedReimbursable(storedValue); + + const [draftValue, setDraftValue] = useState(); + const selectedValue = draftValue ?? currentValue; + + const options = Object.values(CONST.COMPANY_CARDS.FEED_REIMBURSABLE).map((value) => ({ + text: translate(`workspace.companyCards.reimbursable.${value}`), + alternateText: translate(`workspace.companyCards.reimbursable.${value}Description`), + value, + isSelected: selectedValue === value, + keyForList: value, + })); + + const goBack = () => { + Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS.getRoute(policyID)); + }; + + const saveAndGoBack = () => { + // Comparing effective settings avoids replacing legacy `none` or an unset value when the admin makes no change. + if (feed && selectedValue && selectedValue !== currentValue) { + setFeedReimbursable(policyID, feed, domainOrWorkspaceAccountID, selectedValue, storedValue); + } + goBack(); + }; + + const confirmButtonOptions = { + showButton: true, + text: translate('common.save'), + onConfirm: saveAndGoBack, + }; + + const clearError = () => { + if (!feed) { + return; + } + clearErrorField(feed, domainOrWorkspaceAccountID, 'forceReimbursable'); + }; + + if (isLoadingOnyxValue(cardFeedsResult) || isLoadingOnyxValue(lastSelectedFeedResult)) { + return ; + } + + return ( + + + + {translate('workspace.companyCards.reimbursable.description')} + + setDraftValue(item.value)} + confirmButtonOptions={confirmButtonOptions} + shouldSingleExecuteRowSelect + style={{containerStyle: styles.pt3}} + initiallyFocusedItemKey={currentValue} + addBottomSafeAreaPadding + /> + + + + ); +} + +export default WorkspaceCompanyCardReimbursablePage; diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx index 61dd90efe489..65479efc1220 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx @@ -20,7 +20,16 @@ import useThemeStyles from '@hooks/useThemeStyles'; import useVerifyAccountAndResume from '@hooks/useVerifyAccountAndResume'; import {deleteWorkspaceCompanyCardFeed, setAddNewCompanyCardStepAndData, setWorkspaceCompanyCardTransactionLiability} from '@libs/actions/CompanyCards'; -import {getCompanyCardFeed, getCompanyFeeds, getCustomOrFormattedFeedName, getDomainOrWorkspaceAccountID, getSelectedFeed, isCSVUploadFeed, isDirectFeed} from '@libs/CardUtils'; +import { + getCompanyCardFeed, + getCompanyFeeds, + getCustomOrFormattedFeedName, + getDomainOrWorkspaceAccountID, + getEffectiveFeedReimbursable, + getSelectedFeed, + isCSVUploadFeed, + isDirectFeed, +} from '@libs/CardUtils'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@libs/Navigation/types'; @@ -84,6 +93,9 @@ function WorkspaceCompanyCardsSettingsPage({ return translate(`workspace.companyCards.statementCloseDate.${selectedFeedData.statementPeriodEndDay}`); }, [translate, selectedFeedData?.statementPeriodEndDay]); + const effectiveReimbursable = getEffectiveFeedReimbursable(selectedFeedData?.forceReimbursable); + const reimbursable = effectiveReimbursable ? translate(`workspace.companyCards.reimbursable.${effectiveReimbursable}`) : ''; + const navigateToChangeFeedName = () => { Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS_FEED_NAME.getRoute(policyID)); }; @@ -92,6 +104,10 @@ function WorkspaceCompanyCardsSettingsPage({ Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS_STATEMENT_CLOSE_DATE.getRoute(policyID)); }; + const navigateToChangeReimbursable = () => { + Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS_REIMBURSABLE.getRoute(policyID)); + }; + const deleteCompanyCardFeed = () => { Navigation.goBack(undefined, { afterTransition: () => { @@ -161,6 +177,15 @@ function WorkspaceCompanyCardsSettingsPage({ {!!selectedFeedData?.errorFields?.statementPeriodEndDay && } + + + {!!selectedFeedData?.errorFields?.forceReimbursable && } + + ; + +/** Reimbursable setting of a card feed. `none` is a legacy value that behaves like `default_no` */ +type FeedReimbursable = SelectableFeedReimbursable | typeof CONST.COMPANY_CARDS.FEED_REIMBURSABLE_LEGACY_NONE; + /** Card feed provider */ type CardFeedProvider = | typeof CONST.COMPANY_CARD.FEED_BANK_NAME.MASTER_CARD @@ -82,7 +88,7 @@ type CustomCardFeedData = OnyxCommon.OnyxValueWithOfflineFeedback<{ asrEnabled?: boolean; /** Specifies if the expenses on this card should be force reimbursable */ - forceReimbursable?: string; + forceReimbursable?: FeedReimbursable; /** Defines the type of liability for the card */ liabilityType?: string; @@ -133,7 +139,7 @@ type CustomCardFeedData = OnyxCommon.OnyxValueWithOfflineFeedback<{ }; /** Field-specific error messages */ - errorFields?: OnyxCommon.ErrorFields<'statementPeriodEndDay'>; + errorFields?: Partial>; errors?: OnyxCommon.Errors; }>; @@ -147,6 +153,9 @@ type DirectCardFeedData = OnyxCommon.OnyxValueWithOfflineFeedback<{ /** Defines the type of liability for the card */ liabilityType?: string; + /** Whether transactions from this feed are always reimbursable, always non-reimbursable, or use an editable default */ + forceReimbursable?: FeedReimbursable; + /** The id of the domain the feed relates to */ domainID?: number; @@ -161,7 +170,7 @@ type DirectCardFeedData = OnyxCommon.OnyxValueWithOfflineFeedback<{ plaidAccessToken?: string; /** Field-specific error messages */ - errorFields?: OnyxCommon.ErrorFields<'statementPeriodEndDay'>; + errorFields?: Partial>; errors?: OnyxCommon.Errors; }>; @@ -355,6 +364,8 @@ export type { FundID, StatementPeriodEnd, StatementPeriodEndDay, + FeedReimbursable, + SelectableFeedReimbursable, DomainSettings, CombinedCardFeed, CombinedCardFeeds, diff --git a/src/types/onyx/OriginalMessage.ts b/src/types/onyx/OriginalMessage.ts index 5eafc50f3336..df8e05795ff4 100644 --- a/src/types/onyx/OriginalMessage.ts +++ b/src/types/onyx/OriginalMessage.ts @@ -4,6 +4,7 @@ import type DeepValueOf from '@src/types/utils/DeepValueOf'; import type {ValueOf} from 'type-fest'; import type {CardID} from './Card'; +import type {FeedReimbursable} from './CardFeeds'; import type {PolicyRuleTaxRate} from './ExpenseRule'; import type {Attendee} from './IOU'; import type {OldDotOriginalMessageMap} from './OldDotAction'; @@ -755,6 +756,12 @@ type OriginalMessagePolicyChangeLog = { /** Previous statement period end day for a company card feed */ previousStatementPeriodEndDay?: string; + /** Reimbursable setting of a company card feed */ + forceReimbursable?: FeedReimbursable; + + /** Previous reimbursable setting of a company card feed */ + previousForceReimbursable?: FeedReimbursable; + /** Whether the user joined the workspace via joining link */ didJoinPolicy?: boolean; diff --git a/tests/actions/CompanyCardsReimbursableTest.ts b/tests/actions/CompanyCardsReimbursableTest.ts new file mode 100644 index 000000000000..cd107d821f47 --- /dev/null +++ b/tests/actions/CompanyCardsReimbursableTest.ts @@ -0,0 +1,108 @@ +import {setFeedReimbursable} from '@libs/actions/CompanyCards'; +import {WRITE_COMMANDS} from '@libs/API/types'; + +import CONST from '@src/CONST'; +import OnyxUpdateManager from '@src/libs/actions/OnyxUpdateManager'; +import ONYXKEYS from '@src/ONYXKEYS'; + +import Onyx from 'react-native-onyx'; + +import getOnyxValue from '../utils/getOnyxValue'; +import * as TestHelper from '../utils/TestHelper'; +import waitForBatchedUpdates from '../utils/waitForBatchedUpdates'; + +const POLICY_ID = 'A1B2C3D4E5F60718'; +const DOMAIN_ACCOUNT_ID = 1234567; +const FEED = CONST.COMPANY_CARD.FEED_BANK_NAME.VISA; +const domainMemberKey = `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${DOMAIN_ACCOUNT_ID}` as const; + +async function getFeedSettings() { + const domainMember = await getOnyxValue(domainMemberKey); + return domainMember?.settings?.companyCards?.[FEED]; +} + +OnyxUpdateManager(); +describe('actions/CompanyCards setFeedReimbursable', () => { + beforeAll(() => { + Onyx.init({keys: ONYXKEYS}); + }); + + const mockFetch = TestHelper.setupGlobalFetchMock(); + + beforeEach(async () => { + mockFetch.succeed(); + await Onyx.clear(); + await Onyx.set(domainMemberKey, {settings: {companyCards: {[FEED]: {forceReimbursable: CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES}}}}); + await waitForBatchedUpdates(); + }); + + it('sends the selected value for the feed-owning account', () => { + // Given a mocked API write so feed ownership can be checked independently of Onyx updates + const apiWriteSpy = jest.spyOn(require('@libs/API'), 'write').mockImplementation(() => Promise.resolve()); + + // When default_yes changes to force_yes to exercise a change between distinct rules + setFeedReimbursable(POLICY_ID, FEED, DOMAIN_ACCOUNT_ID, CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES, CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES); + + // Then the request targets the feed-owning account so the correct feed is updated + expect(apiWriteSpy).toHaveBeenCalledWith( + WRITE_COMMANDS.SET_FEED_REIMBURSABLE, + {policyID: POLICY_ID, bankName: FEED, domainAccountID: DOMAIN_ACCOUNT_ID, forceReimbursable: CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES}, + expect.anything(), + ); + apiWriteSpy.mockRestore(); + }); + + it('shows the new value as pending until the request completes', async () => { + // Given a paused request so optimistic state can be checked before the server responds + mockFetch.pause(); + + // When default_yes changes to force_yes to exercise a change between distinct rules + setFeedReimbursable(POLICY_ID, FEED, DOMAIN_ACCOUNT_ID, CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES, CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES); + await waitForBatchedUpdates(); + + // Then the new rule is available before confirmation, with pending feedback for the unsaved change + let feedSettings = await getFeedSettings(); + expect(feedSettings?.forceReimbursable).toBe(CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES); + expect(feedSettings?.pendingFields?.forceReimbursable).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE); + + // When the request resumes successfully to complete the optimistic update + await mockFetch.resume(); + await waitForBatchedUpdates(); + + // Then success preserves the chosen rule without leaving stale pending or error feedback + feedSettings = await getFeedSettings(); + expect(feedSettings?.forceReimbursable).toBe(CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES); + expect(feedSettings?.pendingFields?.forceReimbursable).toBeUndefined(); + expect(feedSettings?.errorFields?.forceReimbursable).toBeUndefined(); + }); + + it('restores the previous value and shows an error when the request fails', async () => { + // Given a failed response to exercise rollback of an existing setting + mockFetch.fail(); + + // When default_yes changes to force_yes to exercise a change between distinct rules + setFeedReimbursable(POLICY_ID, FEED, DOMAIN_ACCOUNT_ID, CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES, CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES); + await waitForBatchedUpdates(); + + // Then failure restores the original rule rather than leaving an unsaved rule active + const feedSettings = await getFeedSettings(); + expect(feedSettings?.forceReimbursable).toBe(CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES); + expect(feedSettings?.pendingFields?.forceReimbursable).toBeUndefined(); + expect(Object.keys(feedSettings?.errorFields?.forceReimbursable ?? {})).toHaveLength(1); + }); + + it('removes the optimistic value when the feed had no previous setting and the request fails', async () => { + // Given an unset rule so rollback must remove the optimistic value rather than restore an explicit rule + await Onyx.set(domainMemberKey, {settings: {companyCards: {[FEED]: {}}}}); + mockFetch.fail(); + + // When saving default_no fails after an optimistic update + setFeedReimbursable(POLICY_ID, FEED, DOMAIN_ACCOUNT_ID, CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO, undefined); + await waitForBatchedUpdates(); + + // Then rollback preserves the absence of a stored rule while retaining failure feedback + const feedSettings = await getFeedSettings(); + expect(feedSettings?.forceReimbursable).toBeUndefined(); + expect(Object.keys(feedSettings?.errorFields?.forceReimbursable ?? {})).toHaveLength(1); + }); +}); diff --git a/tests/ui/WorkspaceCompanyCardReimbursablePageTest.tsx b/tests/ui/WorkspaceCompanyCardReimbursablePageTest.tsx new file mode 100644 index 000000000000..7e412a3db463 --- /dev/null +++ b/tests/ui/WorkspaceCompanyCardReimbursablePageTest.tsx @@ -0,0 +1,139 @@ +import {act, render} from '@testing-library/react-native'; + +import SelectionList from '@components/SelectionList'; + +import {setFeedReimbursable} from '@libs/actions/CompanyCards'; +import type * as CardUtils from '@libs/CardUtils'; +import {getCompanyFeeds} from '@libs/CardUtils'; + +import WorkspaceCompanyCardReimbursablePage from '@pages/workspace/companyCards/WorkspaceCompanyCardReimbursablePage'; + +import CONST from '@src/CONST'; +import type {FeedReimbursable, SelectableFeedReimbursable} from '@src/types/onyx/CardFeeds'; + +import React from 'react'; + +const POLICY_ID = 'policy1'; +const FEED = 'vcf'; +const DOMAIN_ACCOUNT_ID = 1234; + +jest.mock('@components/SelectionList', () => jest.fn(() => null)); +jest.mock( + '@components/ScreenWrapper', + () => + ({children}: {children: React.ReactNode}) => + children, +); +jest.mock('@components/Header/composed/HeaderWithBackButtonAndTitle', () => jest.fn(() => null)); +jest.mock( + '@components/OfflineWithFeedback', + () => + ({children}: {children: React.ReactNode}) => + children, +); +jest.mock( + '@pages/workspace/AccessOrNotFoundWrapper', + () => + ({children}: {children: React.ReactNode}) => + children, +); + +jest.mock('@hooks/useOnyx', () => jest.fn(() => [FEED, {status: 'loaded'}])); +jest.mock('@hooks/useCardFeeds', () => jest.fn(() => [{}, {status: 'loaded'}])); +jest.mock('@hooks/useWorkspaceAccountID', () => jest.fn(() => DOMAIN_ACCOUNT_ID)); +jest.mock('@hooks/useLocalize', () => jest.fn(() => ({translate: (key: string) => key}))); +jest.mock('@libs/actions/CompanyCards', () => ({setFeedReimbursable: jest.fn(), clearErrorField: jest.fn()})); +jest.mock('@libs/Navigation/Navigation', () => ({goBack: jest.fn()})); +jest.mock('@libs/CardUtils', () => { + const actualCardUtils: typeof CardUtils = jest.requireActual('@libs/CardUtils'); + return { + ...actualCardUtils, + getSelectedFeed: jest.fn(() => FEED), + getCompanyCardFeed: jest.fn(() => FEED), + getCompanyFeeds: jest.fn(() => ({})), + getDomainOrWorkspaceAccountID: jest.fn(() => DOMAIN_ACCOUNT_ID), + }; +}); + +type MockListItem = {value: SelectableFeedReimbursable; isSelected: boolean}; +type MockSelectionListProps = { + data: MockListItem[]; + onSelectRow: (item: MockListItem) => void; + confirmButtonOptions: {onConfirm: () => void}; +}; + +function renderPageWithStoredValue(forceReimbursable: FeedReimbursable | undefined) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- test builds only the feed fields this page reads + jest.mocked(getCompanyFeeds).mockReturnValue({[FEED]: {forceReimbursable}} as never); + render( + , + ); +} + +// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- the mock captures only the selection props exercised by these tests +const getListProps = () => jest.mocked(SelectionList).mock.lastCall?.[0] as unknown as MockSelectionListProps; + +const getSelectedValue = () => getListProps().data.find((item) => item.isSelected)?.value; + +describe('WorkspaceCompanyCardReimbursablePage', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('selects Always non-reimbursable when the feed has no stored setting', () => { + // Given an unset rule to check compatibility with feeds that have no explicit setting + renderPageWithStoredValue(undefined); + + // Then force_no preserves the non-reimbursable behavior of an unset rule + expect(getSelectedValue()).toBe(CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO); + }); + + it('does not rewrite a legacy none value when the admin saves without changing it', () => { + // Given legacy none to check compatibility with the current selectable rules + renderPageWithStoredValue(CONST.COMPANY_CARDS.FEED_REIMBURSABLE_LEGACY_NONE); + + // Then default_no represents legacy none without requiring a stored-value migration + expect(getSelectedValue()).toBe(CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO); + + // When saving without a new selection to exercise the legacy no-change case + act(() => getListProps().confirmButtonOptions.onConfirm()); + + // Then no save is requested, preserving the stored none value + expect(setFeedReimbursable).not.toHaveBeenCalled(); + }); + + it('does not save when the admin re-selects the current option', () => { + // Given an unset rule to check compatibility with feeds that have no explicit setting + renderPageWithStoredValue(undefined); + + // When re-selecting force_no to check that an equivalent selection is not treated as a change + act(() => getListProps().onSelectRow({value: CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO, isSelected: true})); + act(() => getListProps().confirmButtonOptions.onConfirm()); + + // Then no save is requested because the effective setting has not changed + expect(setFeedReimbursable).not.toHaveBeenCalled(); + }); + + it('saves the selected value when the admin changes a legacy none value', () => { + // Given legacy none to check compatibility with the current selectable rules + renderPageWithStoredValue(CONST.COMPANY_CARDS.FEED_REIMBURSABLE_LEGACY_NONE); + + // When selecting default_yes to make a real change from the effective legacy rule + act(() => getListProps().onSelectRow({value: CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES, isSelected: false})); + act(() => getListProps().confirmButtonOptions.onConfirm()); + + // Then rollback receives the original none value so a failed save can restore it exactly + expect(setFeedReimbursable).toHaveBeenCalledWith( + POLICY_ID, + FEED, + DOMAIN_ACCOUNT_ID, + CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES, + CONST.COMPANY_CARDS.FEED_REIMBURSABLE_LEGACY_NONE, + ); + }); +}); diff --git a/tests/unit/CardFeedUtilsTest.ts b/tests/unit/CardFeedUtilsTest.ts index ea420f42b784..325437897fb6 100644 --- a/tests/unit/CardFeedUtilsTest.ts +++ b/tests/unit/CardFeedUtilsTest.ts @@ -3,6 +3,7 @@ import { getCardFeedsForDisplay, getCardFeedsForDisplayPerPolicy, getExpensifyCardFeedsForDisplay, + getCombinedCardFeedsFromAllFeeds, getFeedInfo, getPolicyIDsNamedByCardFeeds, getVisibleCompanyCardFeedsForSelector, @@ -12,7 +13,7 @@ import CONST from '@src/CONST'; import IntlStore from '@src/languages/IntlStore'; import ONYXKEYS from '@src/ONYXKEYS'; import type {Card, CardFeeds, CardList, CompanyCardFeed, Domain, Policy} from '@src/types/onyx'; -import type {CardFeedWithNumber, CustomCardFeedData} from '@src/types/onyx/CardFeeds'; +import type {CardFeedWithNumber, CustomCardFeedData, FeedReimbursable} from '@src/types/onyx/CardFeeds'; /* eslint-disable @typescript-eslint/naming-convention */ import type {OnyxCollection} from 'react-native-onyx'; @@ -661,3 +662,45 @@ describe('getPolicyIDsNamedByCardFeeds', () => { expect(getPolicyIDsNamedByCardFeeds([{bank, domainName: '', fundID: undefined}], cardFeeds)).toEqual([]); }); }); + +describe('getCombinedCardFeedsFromAllFeeds forceReimbursable', () => { + const domainID = 1234; + const feed = cardFeedAmericaExpressMock; + const getFeed = (result: ReturnType) => Object.values(result).at(0); + + function buildFeeds(companyCard: Partial, oAuthForceReimbursable?: FeedReimbursable): OnyxCollection { + return { + [`sharedNVP_private_domain_member_${domainID}`]: { + settings: { + companyCards: {[feed]: companyCard}, + oAuthAccountDetails: {[feed]: {accountList: [], credentials: '', expiration: 0, ...(oAuthForceReimbursable ? {forceReimbursable: oAuthForceReimbursable} : {})}}, + }, + }, + }; + } + + it('prefers the pending optimistic value over the stale OAuth value', () => { + const result = getCombinedCardFeedsFromAllFeeds( + buildFeeds({forceReimbursable: 'force_yes', pendingFields: {forceReimbursable: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}}, 'force_no'), + ); + expect(getFeed(result)?.forceReimbursable).toBe('force_yes'); + expect(getFeed(result)?.pendingFields?.forceReimbursable).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE); + }); + + it('shows the rolled-back value and keeps the error after a failure', () => { + const errors = {1: 'error'}; + const result = getCombinedCardFeedsFromAllFeeds(buildFeeds({forceReimbursable: 'force_no', errorFields: {forceReimbursable: errors}}, 'force_no')); + expect(getFeed(result)?.forceReimbursable).toBe('force_no'); + expect(getFeed(result)?.errorFields?.forceReimbursable).toEqual(errors); + }); + + it('keeps the OAuth value when the local rollback cleared the setting', () => { + const result = getCombinedCardFeedsFromAllFeeds(buildFeeds({forceReimbursable: undefined, errorFields: {forceReimbursable: {1: 'error'}}}, 'default_yes')); + expect(getFeed(result)?.forceReimbursable).toBe('default_yes'); + }); + + it('leaves OAuth data untouched when there is no local reimbursable change', () => { + const result = getCombinedCardFeedsFromAllFeeds(buildFeeds({forceReimbursable: 'force_yes'}, 'force_no')); + expect(getFeed(result)?.forceReimbursable).toBe('force_no'); + }); +}); diff --git a/tests/unit/LhnSearchPreviewParityTest.ts b/tests/unit/LhnSearchPreviewParityTest.ts index 965bfbf5ebc6..b1921d4281e5 100644 --- a/tests/unit/LhnSearchPreviewParityTest.ts +++ b/tests/unit/LhnSearchPreviewParityTest.ts @@ -184,6 +184,7 @@ const ORIGINAL_MESSAGE_BY_ACTION: Partial = [ CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UNASSIGN_COMPANY_CARD, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_LIABILITY, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_STATEMENT_PERIOD, + CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_REIMBURSABLE, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_AUDIT_RATE, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.ADD_APPROVER_RULE, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.DELETE_APPROVER_RULE, diff --git a/tests/unit/ReportActionsUtilsTest.ts b/tests/unit/ReportActionsUtilsTest.ts index fe0b4bfa7f8d..1cb4542a8cd4 100644 --- a/tests/unit/ReportActionsUtilsTest.ts +++ b/tests/unit/ReportActionsUtilsTest.ts @@ -76,6 +76,7 @@ import { getUpdatedCommuterExclusionsMessage, getUpdatedMemberWorkArrangementMessage, getUpdatedCardFeedLiabilityMessage, + getUpdatedCardFeedReimbursableMessage, getUpdatedCardFeedStatementPeriodMessage, getUpdatedOfficeLocationMessage, hasNextActionMadeBySameActor, @@ -5379,6 +5380,70 @@ describe('ReportActionsUtils', () => { }); }); + describe('getUpdatedCardFeedReimbursableMessage', () => { + it('should translate force and default values', () => { + const action = { + actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_REIMBURSABLE, + reportActionID: '1', + created: '', + originalMessage: { + feedName: 'Visa Commercial', + forceReimbursable: CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES, + previousForceReimbursable: CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_NO, + }, + } as ReportAction; + const result = getUpdatedCardFeedReimbursableMessage(translateLocal, action); + expect(result).toBe('changed card feed "Visa Commercial" reimbursable setting to "Always reimbursable" (previously "Non-reimbursable")'); + }); + + it('should show legacy none as Non-reimbursable', () => { + const action = { + actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_REIMBURSABLE, + reportActionID: '1', + created: '', + originalMessage: { + feedName: 'Mastercard', + forceReimbursable: CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_NO, + previousForceReimbursable: 'none', + }, + } as ReportAction; + const result = getUpdatedCardFeedReimbursableMessage(translateLocal, action); + expect(result).toBe('changed card feed "Mastercard" reimbursable setting to "Always non-reimbursable" (previously "Non-reimbursable")'); + }); + + it('should show a localized message without the previous value when it is missing', () => { + const action = { + actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_REIMBURSABLE, + reportActionID: '1', + created: '', + originalMessage: { + feedName: 'Visa Commercial', + forceReimbursable: CONST.COMPANY_CARDS.FEED_REIMBURSABLE.DEFAULT_YES, + }, + } as ReportAction; + const result = getUpdatedCardFeedReimbursableMessage(translateLocal, action); + expect(result).toBe('changed card feed "Visa Commercial" reimbursable setting to "Reimbursable"'); + }); + + it('should fall back to the server text when a value is unrecognized', () => { + const originalMessage = { + feedName: 'Visa Commercial', + forceReimbursable: CONST.COMPANY_CARDS.FEED_REIMBURSABLE.FORCE_YES, + }; + // Server data can contain unknown rules despite the static type, so exercise the fallback with an unknown previous rule + Object.assign(originalMessage, {previousForceReimbursable: 'unexpected_value'}); + const action = { + actionName: CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_REIMBURSABLE, + reportActionID: '1', + created: '', + message: [{type: 'COMMENT', html: 'server text', text: 'server text'}], + originalMessage, + } as ReportAction; + const result = getUpdatedCardFeedReimbursableMessage(translateLocal, action); + expect(result).toBe('server text'); + }); + }); + describe('getCompanyAddressUpdateMessage', () => { it('should return "set" message when setting address for first time', () => { const action = buildCompanyAddressUpdateActionFixture({ diff --git a/tests/unit/ReportAlternateTextParityTest.ts b/tests/unit/ReportAlternateTextParityTest.ts index f57cc07add94..7be9310c5cbc 100644 --- a/tests/unit/ReportAlternateTextParityTest.ts +++ b/tests/unit/ReportAlternateTextParityTest.ts @@ -206,6 +206,7 @@ const SIMPLE_CHAIN_ACTIONS: Array = [ CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UNASSIGN_COMPANY_CARD, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_LIABILITY, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_STATEMENT_PERIOD, + CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_CARD_FEED_REIMBURSABLE, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UPDATE_AUDIT_RATE, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.ADD_APPROVER_RULE, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.DELETE_APPROVER_RULE, diff --git a/tests/unit/TransactionUtilsTest.ts b/tests/unit/TransactionUtilsTest.ts index a0a4655bbc11..64fbff5e8fe6 100644 --- a/tests/unit/TransactionUtilsTest.ts +++ b/tests/unit/TransactionUtilsTest.ts @@ -5097,6 +5097,26 @@ describe('TransactionUtils', () => { expect(result.change.reimbursable).toBeUndefined(); }); + it('should preserve an imported reimbursable=true value when the kept transaction is a managed card', () => { + const managedCardTransaction = generateTransaction({reimbursable: true, managedCard: true}); + const duplicates = [generateTransaction({reimbursable: false, managedCard: false})]; + + const result = TransactionUtils.compareDuplicateTransactionFields({}, managedCardTransaction, duplicates, mockReport, undefined, mockPolicy, undefined); + + expect(result.keep.reimbursable).toBe(true); + expect(result.change.reimbursable).toBeUndefined(); + }); + + it('should default reimbursable to false when the kept managed card has no reimbursable value', () => { + const managedCardTransaction = generateTransaction({managedCard: true}); + delete managedCardTransaction.reimbursable; + const duplicates = [generateTransaction({reimbursable: true, managedCard: false})]; + + const result = TransactionUtils.compareDuplicateTransactionFields({}, managedCardTransaction, duplicates, mockReport, undefined, mockPolicy, undefined); + + expect(result.keep.reimbursable).toBe(false); + }); + it('should not force reimbursable to false when the reviewing (kept) transaction is a cash expense, even if a duplicate is a managed card', () => { const cashTransaction = generateTransaction({ reimbursable: true, diff --git a/tests/unit/__snapshots__/ReportAlternateTextParityTest.ts.snap b/tests/unit/__snapshots__/ReportAlternateTextParityTest.ts.snap index 3f82d7559cfd..17ca4f7a9e3c 100644 --- a/tests/unit/__snapshots__/ReportAlternateTextParityTest.ts.snap +++ b/tests/unit/__snapshots__/ReportAlternateTextParityTest.ts.snap @@ -174,6 +174,8 @@ exports[`getOptionData alternateText parity snapshots special-action chain branc exports[`getOptionData alternateText parity snapshots special-action chain branches (policy room) POLICYCHANGELOG_UPDATE_CARD_FEED_LIABILITY 1`] = `"Fixture message html"`; +exports[`getOptionData alternateText parity snapshots special-action chain branches (policy room) POLICYCHANGELOG_UPDATE_CARD_FEED_REIMBURSABLE 1`] = `"Fixture message html"`; + exports[`getOptionData alternateText parity snapshots special-action chain branches (policy room) POLICYCHANGELOG_UPDATE_CARD_FEED_STATEMENT_PERIOD 1`] = `"Fixture message html"`; exports[`getOptionData alternateText parity snapshots special-action chain branches (policy room) POLICYCHANGELOG_UPDATE_CATEGORIES 1`] = `"Fixture message html"`;