Skip to content

Remove REIMBURSED from the deprecatedOldReportActions list#80706

Open
deetergp wants to merge 55 commits intomainfrom
scott-showReimbursedReportAction
Open

Remove REIMBURSED from the deprecatedOldReportActions list#80706
deetergp wants to merge 55 commits intomainfrom
scott-showReimbursedReportAction

Conversation

@deetergp
Copy link
Copy Markdown
Contributor

@deetergp deetergp commented Jan 28, 2026

Explanation of Change

When admins pay an expense report in OldDot, a REIMBURSED action is created in the report's history. Previously this action was hidden in NewDot because it was in the deprecatedOldDotReportActions list. When paying in NewDot, an IOU PAY action is already shown, so those should remain hidden.

This PR conditionally shows the REIMBURSED action based on the isNewDot flag the backend sets:

  • OldDot paymentREIMBURSED without isNewDotShown in NewDot with a localized message
  • NewDot paymentREIMBURSED with isNewDot=trueHidden (IOU PAY action is shown instead)

Key changes:

  • Removed REIMBURSED from deprecatedOldDotReportActions; added visibility check to hide it when isNewDot=true
  • Added getReimbursedMessage() in ReportActionsUtils.ts to produce a fully localized message for all payment types (Fast ACH, ACH, Check, StripeConnect) including the submitter-adding-bank-account case
  • Auth stores the payment method as method; the openReport path maps it to paymentMethod, but real-time Pusher events only carry method. getReimbursedMessage reads paymentMethod ?? method so both paths render correctly
  • Added OriginalMessageReimbursed / OriginalMessageMarkedReimbursed types
  • Added translation strings in all 10 supported languages
  • Added copy-to-clipboard support for REIMBURSED in ContextMenuActions

Fixed Issues

$ #79698 (comment)
PROPOSAL: N/A

Tests

  1. Have a workspace with a submitter and a reviewer where the reviewer has an ACH account for reimbursing expenses, and the submitter has a deposit account for accepting ACH payments.
  2. As the submitter, in NewDot, submit a manual expense to the reviewer
  3. As the reviewer, in NewDot, approve the expense and reimburse it with the ACH account.
  4. As the submitter, in NewDot, verify that you see the expected NewDot payment message paid with bank account XXXX
    Screenshot 2026-02-05 at 4 08 44 PM
  5. As the submitter, in NewDot, submit another manual expense to the reviewer
  6. As the reviewer, in OldDot, approve the expense and reimburse it with the ACH account.
  7. As the submitter, in NewDot, verify that you see the OldDot style reimbursed message
    Screenshot 2026-02-05 at 5 38 03 PM
  • Verify that no errors appear in the JS console

Offline tests

N/A

QA Steps

  1. Have a workspace with a submitter and a reviewer where the reviewer has an ACH account for reimbursing expenses, and the submitter has a deposit account for accepting ACH payments.
  2. As the submitter, in NewDot, submit a manual expense to the reviewer
  3. As the reviewer, in NewDot, approve the expense and reimburse it with the ACH account.
  4. As the submitter, in NewDot, verify that you see the expected NewDot payment message (no REIMBURSED action visible)
  5. As the submitter, in NewDot, submit another manual expense to the reviewer
  6. As the reviewer, in OldDot, approve the expense and reimburse it with the ACH account.
  7. As the submitter, in NewDot, verify that you see the OldDot-style reimbursed message translated into the user's language
  • Verify that no errors appear in the JS console

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I verified there are no new alerts related to the canBeMissing param for useOnyx
  • I followed proper code patterns (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method
      • If any non-english text was added/modified, I used JaimeGPT to get English > Spanish translation. I then posted it in #expensify-open-source and it was approved by an internal Expensify engineer. Link to Slack message:
    • I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
    • I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
    • I verified the JSDocs style guidelines (in STYLE.md) were followed
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
  • I verified any variables that can be defined as constants (ie. in CONST.ts or at the top of the file that uses the constant) are defined as such
  • I verified that if a function's arguments changed that all usages have also been updated correctly
  • If any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))
  • If new assets were added or existing ones were modified, I verified that:
    • The assets are optimized and compressed (for SVG files, run npm run compress-svg)
    • The assets load correctly across all supported platforms.
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
  • I added unit tests for any new feature or bug fix in this PR to help automatically prevent regressions in this user flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native

iOS: Native

MacOS: Chrome / Safari

@codecov
Copy link
Copy Markdown

codecov bot commented Feb 4, 2026

Codecov Report

❌ Looks like you've decreased code coverage for some files. Please write tests to increase, or at least maintain, the existing level of code coverage. See our documentation here for how to interpret this table.

Files with missing lines Coverage Δ
src/libs/SidebarUtils.ts 80.61% <ø> (ø)
src/pages/inbox/report/PureReportActionItem.tsx 58.03% <100.00%> (+0.29%) ⬆️
src/libs/OptionsListUtils/index.ts 83.01% <50.00%> (-0.05%) ⬇️
...es/inbox/report/ContextMenu/ContextMenuActions.tsx 44.05% <50.00%> (+0.01%) ⬆️
src/libs/ReportActionsUtils.ts 55.90% <76.59%> (+0.22%) ⬆️
... and 29 files with indirect coverage changes

@deetergp deetergp marked this pull request as ready for review February 6, 2026 23:00
@deetergp deetergp requested review from a team as code owners February 6, 2026 23:00
@melvin-bot melvin-bot bot requested review from Krishna2323 and removed request for a team February 6, 2026 23:00
@melvin-bot
Copy link
Copy Markdown

melvin-bot bot commented Feb 6, 2026

@Krishna2323 Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button]

1 similar comment
@melvin-bot
Copy link
Copy Markdown

melvin-bot bot commented Feb 6, 2026

@Krishna2323 Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button]

@melvin-bot melvin-bot bot requested review from JmillsExpensify and removed request for a team February 6, 2026 23:00
@Krishna2323
Copy link
Copy Markdown
Contributor

Will be reviewing in an hour.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Feb 6, 2026

Code Review Complete

I've completed a comprehensive review of PR #80706. Here's my assessment:

Summary

This PR conditionally displays REIMBURSED report actions based on the isNewDot flag, allowing OldDot payment messages to appear in NewDot while hiding NewDot payment messages (which already have IOU PAY actions).

Files Reviewed

  • src/libs/ReportActionsUtils.ts - Clean implementation
  • src/pages/inbox/report/PureReportActionItem.tsx - Minor performance concern (see inline comment)
  • src/types/onyx/OriginalMessage.ts - Type definitions look good

Overall Assessment

The implementation is solid with proper:

  • Type safety with new TypeScript types
  • Visibility logic properly placed in the filter chain
  • Comprehensive test coverage
  • Clear documentation in code comments

1 inline comment posted with a minor performance optimization suggestion.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Feb 6, 2026

Inline Comment: Performance Optimization

File: src/pages/inbox/report/PureReportActionItem.tsx (line 1408)

Performance concern: The .slice(1).map(...).join('') operations are executed on every render. Consider memoizing this computation:

const reimbursedMessage = useMemo(() => {
    const messageFragments = action.message;
    if (Array.isArray(messageFragments) && messageFragments.length > 1) {
        return messageFragments
            .slice(1)
            .map((fragment) => fragment?.text ?? '')
            .join('')
            .trim();
    }
    return getReportActionMessageText(action);
}, [action.message, action]);

This avoids redundant string operations when the component re-renders.

@Krishna2323
Copy link
Copy Markdown
Contributor

@deetergp is this ready for review again?

@deetergp
Copy link
Copy Markdown
Contributor Author

@Krishna2323 Yes it is 👍

@Krishna2323
Copy link
Copy Markdown
Contributor

Reviewing...

@OSBotify
Copy link
Copy Markdown
Contributor

OSBotify commented Apr 6, 2026

🦜 Polyglot Parrot! 🦜

Squawk! Looks like you added some shiny new English strings. Allow me to parrot them back to you in other tongues:

View the translation diff
diff --git a/src/languages/de.ts b/src/languages/de.ts
index 63319364..59fff828 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -1385,8 +1385,8 @@ const translations: TranslationDeepObject<typeof en> = {
         paidWithExpensify: (payer?: string) => `${payer ? `${payer} ` : ''}mit Wallet bezahlt`,
         automaticallyPaidWithExpensify: (payer?: string) =>
             `${payer ? `${payer} ` : ''}mit Expensify über <a href="${CONST.CONFIGURE_EXPENSE_REPORT_RULES_HELP_URL}">Workspace-Regeln</a> bezahlt`,
-        reimbursedThisReport: 'diesen Bericht erstattet',
-        paidThisBill: 'diese Rechnung bezahlt',
+        reimbursedThisReport: 'hat diesen Bericht erstattet',
+        paidThisBill: 'hat diese Rechnung bezahlt',
         reimbursedOnBehalfOf: (actor: string) => `im Namen von ${actor}`,
         reimbursedFromBankAccount: (debitBankAccount: string) => `vom Bankkonto mit der Endung ${debitBankAccount}`,
         reimbursedSubmitterAddedBankAccount: (submitter: string) =>
@@ -1403,8 +1403,8 @@ const translations: TranslationDeepObject<typeof en> = {
             expectedDate: string;
         }) =>
             isCurrentUser
-                ? `. Das Geld ist auf dem Weg zu Ihrem ${creditBankAccount ? `Bankkonto mit der Endung ${creditBankAccount}` : 'Konto'}. Die Erstattung wird voraussichtlich bis zum ${expectedDate} abgeschlossen.`
-                : `. Das Geld ist auf dem Weg zum Bankkonto von ${submitterLogin}${creditBankAccount ? ` mit der Endung ${creditBankAccount}` : ''}. Die Erstattung wird voraussichtlich am ${expectedDate} abgeschlossen.`,
+                ? `. Geld ist auf dem Weg zu Ihrem${creditBankAccount ? `Bankkonto mit Endziffern ${creditBankAccount}` : 'Konto'}. Die Erstattung wird voraussichtlich am ${expectedDate} abgeschlossen.`
+                : `. Geld ist auf dem Weg zu ${submitterLogin}${creditBankAccount ? `Bankkonto mit Endziffern ${creditBankAccount}` : 'Konto'}. Die Rückerstattung wird voraussichtlich am ${expectedDate} abgeschlossen.`,
         reimbursedWithCheck: 'per Scheck.',
         reimbursedWithStripeConnect: ({
             isCurrentUser,
@@ -1419,11 +1419,11 @@ const translations: TranslationDeepObject<typeof en> = {
         }) => {
             const paymentMethod = isCard ? 'Karte' : 'Bankkonto';
             return isCurrentUser
-                ? `. Das Geld ist auf dem Weg zu Ihrem ${creditBankAccount ? `Bankkonto mit der Endung ${creditBankAccount}` : 'Konto'} (bezahlt über ${paymentMethod}). Dies kann bis zu 10 Werktage dauern.`
-                : `. Das Geld ist auf dem Weg zum Bankkonto von ${submitterLogin}${creditBankAccount ? ` mit der Endung ${creditBankAccount}` : ''} (bezahlt über ${paymentMethod}). Dies kann bis zu 10 Werktage dauern.`;
+                ? `. Geld ist auf dem Weg zu Ihrem${creditBankAccount ? `Bankkonto mit Endziffern ${creditBankAccount}` : 'Konto'} (bezahlt per ${paymentMethod}). Das kann bis zu 10 Werktage dauern.`
+                : `. Geld ist auf dem Weg zu ${submitterLogin}s${creditBankAccount ? `Bankkonto mit Endziffern ${creditBankAccount}` : 'Konto'} (bezahlt über ${paymentMethod}). Dies kann bis zu 10 Werktage dauern.`;
         },
         reimbursedWithACH: ({creditBankAccount, expectedDate}: {creditBankAccount?: string; expectedDate?: string}) =>
-            `mit Direkteinzahlung (ACH)${creditBankAccount ? ` auf das Bankkonto mit der Endziffer ${creditBankAccount}.` : '. '}${expectedDate ? `Die Rückerstattung wird voraussichtlich bis zum ${expectedDate} abgeschlossen sein.` : 'Dies dauert in der Regel 4–5 Werktage.'}`,
+            `mit direkter Einzahlung (ACH)${creditBankAccount ? `auf das Bankkonto mit der Endung ${creditBankAccount}.` : '. '}${expectedDate ? `Die Erstattung wird voraussichtlich bis zum ${expectedDate} abgeschlossen sein.` : 'Dies dauert in der Regel 4–5 Werktage.'}`,
         noReimbursableExpenses: 'Dieser Bericht enthält einen ungültigen Betrag',
         pendingConversionMessage: 'Die Gesamtsumme wird aktualisiert, sobald du wieder online bist',
         changedTheExpense: 'hat die Ausgabe geändert',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 8cdad8ea..d8753cb0 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -1392,7 +1392,7 @@ const translations: TranslationDeepObject<typeof en> = {
         paidThisBill: 'a payé cette facture',
         reimbursedOnBehalfOf: (actor: string) => `au nom de ${actor}`,
         reimbursedFromBankAccount: (debitBankAccount: string) => `à partir du compte bancaire se terminant par ${debitBankAccount}`,
-        reimbursedSubmitterAddedBankAccount: (submitter: string) => `${submitter} a ajouté un compte bancaire, retirant la note de frais de la mise en attente. Le remboursement est lancé`,
+        reimbursedSubmitterAddedBankAccount: (submitter: string) => `${submitter} a ajouté un compte bancaire, la note de frais n’est plus en attente. Le remboursement est lancé`,
         reimbursedWithFastACH: ({
             isCurrentUser,
             submitterLogin,
@@ -1405,8 +1405,8 @@ const translations: TranslationDeepObject<typeof en> = {
             expectedDate: string;
         }) =>
             isCurrentUser
-                ? `. L’argent est en route vers votre ${creditBankAccount ? `compte bancaire se terminant par ${creditBankAccount}` : 'compte'}. Remboursement estimé pour être terminé le ${expectedDate}.`
-                : `. L’argent est en route vers le compte bancaire de ${submitterLogin}${creditBankAccount ? ` se terminant par ${creditBankAccount}` : ''}. Remboursement estimé pour le ${expectedDate}.`,
+                ? `. L’argent est en route vers votre${creditBankAccount ? `compte bancaire se terminant par ${creditBankAccount}` : 'compte'}. Remboursement estimé pour le ${expectedDate}.`
+                : `. L'argent est en route vers le compte de ${submitterLogin}${creditBankAccount ? `compte bancaire se terminant par ${creditBankAccount}` : 'compte'}. Remboursement estimé à la date du ${expectedDate}.`,
         reimbursedWithCheck: 'par chèque.',
         reimbursedWithStripeConnect: ({
             isCurrentUser,
@@ -1421,11 +1421,11 @@ const translations: TranslationDeepObject<typeof en> = {
         }) => {
             const paymentMethod = isCard ? 'carte' : 'compte bancaire';
             return isCurrentUser
-                ? `. L’argent est en route vers votre ${creditBankAccount ? `compte bancaire se terminant par ${creditBankAccount}` : 'compte'} (payé via ${paymentMethod}). Cela peut prendre jusqu’à 10 jours ouvrables.`
-                : `. L’argent est en route vers le compte bancaire de ${submitterLogin}${creditBankAccount ? ` se terminant par ${creditBankAccount}` : ''} (payé via ${paymentMethod}). Cela peut prendre jusqu’à 10 jours ouvrés.`;
+                ? `. L’argent est en route vers votre${creditBankAccount ? `compte bancaire se terminant par ${creditBankAccount}` : 'compte'} (payé via ${paymentMethod}). Cela peut prendre jusqu’à 10 jours ouvrables.`
+                : `. L'argent est en route vers le/la ${submitterLogin} ${creditBankAccount ? `compte bancaire se terminant par ${creditBankAccount}` : 'compte'} (payé via ${paymentMethod}). Cela peut prendre jusqu'à 10 jours ouvrés.`;
         },
         reimbursedWithACH: ({creditBankAccount, expectedDate}: {creditBankAccount?: string; expectedDate?: string}) =>
-            `par dépôt direct (ACH)${creditBankAccount ? ` vers le compte bancaire se terminant par ${creditBankAccount}.` : '. '}${expectedDate ? `Le remboursement devrait être terminé d'ici le ${expectedDate}.` : 'Cela prend généralement 4 à 5 jours ouvrables.'}`,
+            `par dépôt direct (ACH)${creditBankAccount ? `sur le compte bancaire se terminant par ${creditBankAccount}.` : '. '}${expectedDate ? `Le remboursement devrait être effectué d’ici le ${expectedDate}.` : 'Cela prend généralement 4 à 5 jours ouvrables.'}`,
         noReimbursableExpenses: 'Cette note de frais a un montant non valide',
         pendingConversionMessage: 'Le total sera mis à jour quand vous serez de nouveau en ligne',
         changedTheExpense: 'a modifié la dépense',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 3f6c9d32..0ae6af56 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -1096,15 +1096,12 @@ const translations: TranslationDeepObject<typeof en> = {
             if (!added && !updated) {
                 return 'Nessuna categoria è stata aggiunta o aggiornata.';
             }
-
             if (added && updated) {
                 return `${added} ${added === 1 ? 'categoria aggiunta' : 'categorie aggiunte'}, ${updated} ${updated === 1 ? 'categoria aggiornata' : 'categorie aggiornate'}.`;
             }
-
             if (added) {
                 return added === 1 ? 'È stata aggiunta 1 categoria.' : `Sono state aggiunte ${added} categorie.`;
             }
-
             return updated === 1 ? 'È stata aggiornata 1 categoria.' : `Sono state aggiornate ${updated} categorie.`;
         },
         importCompanyCardTransactionsSuccessfulDescription: ({transactions}: {transactions: number}) =>
@@ -1391,7 +1388,7 @@ const translations: TranslationDeepObject<typeof en> = {
         paidThisBill: 'ha pagato questa fattura',
         reimbursedOnBehalfOf: (actor: string) => `per conto di ${actor}`,
         reimbursedFromBankAccount: (debitBankAccount: string) => `dal conto bancario che termina con ${debitBankAccount}`,
-        reimbursedSubmitterAddedBankAccount: (submitter: string) => `${submitter} ha aggiunto un conto bancario, rimuovendo il blocco sul resoconto. Il rimborso è stato avviato`,
+        reimbursedSubmitterAddedBankAccount: (submitter: string) => `${submitter} ha aggiunto un conto bancario, rimuovendo il blocco del report. Il rimborso è stato avviato`,
         reimbursedWithFastACH: ({
             isCurrentUser,
             submitterLogin,
@@ -1404,8 +1401,8 @@ const translations: TranslationDeepObject<typeof en> = {
             expectedDate: string;
         }) =>
             isCurrentUser
-                ? `. Il denaro è in arrivo sul tuo ${creditBankAccount ? `conto bancario che termina con ${creditBankAccount}` : 'conto'}. Rimborso previsto per il ${expectedDate}.`
-                : `. Il denaro è in arrivo sul conto bancario di ${submitterLogin}${creditBankAccount ? ` che termina con ${creditBankAccount}` : ''}. Rimborso previsto per il ${expectedDate}.`,
+                ? `. Il denaro è in viaggio verso il tuo${creditBankAccount ? `conto bancario che termina con ${creditBankAccount}` : 'conto'}. Il rimborso dovrebbe essere completato entro il ${expectedDate}.`
+                : `. Il denaro è in arrivo a ${submitterLogin}${creditBankAccount ? `conto bancario che termina con ${creditBankAccount}` : 'conto'}. Rimborso previsto per il ${expectedDate}.`,
         reimbursedWithCheck: 'tramite assegno.',
         reimbursedWithStripeConnect: ({
             isCurrentUser,
@@ -1420,11 +1417,11 @@ const translations: TranslationDeepObject<typeof en> = {
         }) => {
             const paymentMethod = isCard ? 'carta' : 'conto bancario';
             return isCurrentUser
-                ? `. Il denaro è in arrivo sul tuo ${creditBankAccount ? `conto bancario che termina con ${creditBankAccount}` : 'conto'} (pagato tramite ${paymentMethod}). Questo potrebbe richiedere fino a 10 giorni lavorativi.`
-                : `. Il denaro è in arrivo sul conto bancario di ${submitterLogin}${creditBankAccount ? ` che termina con ${creditBankAccount}` : ''} (pagato tramite ${paymentMethod}). Potrebbero volerci fino a 10 giorni lavorativi.`;
+                ? `. Il denaro è in arrivo sul tuo${creditBankAccount ? `conto bancario che termina con ${creditBankAccount}` : 'conto'} (pagato tramite ${paymentMethod}). Potrebbero essere necessari fino a 10 giorni lavorativi.`
+                : `. Il denaro è in arrivo sul${creditBankAccount ? `conto bancario che termina con ${creditBankAccount}` : 'conto'} di ${submitterLogin} (pagato tramite ${paymentMethod}). Potrebbero volerci fino a 10 giorni lavorativi.`;
         },
         reimbursedWithACH: ({creditBankAccount, expectedDate}: {creditBankAccount?: string; expectedDate?: string}) =>
-            `con accredito diretto (ACH)${creditBankAccount ? ` al conto bancario che termina con ${creditBankAccount}.` : '. '}${expectedDate ? `Il rimborso dovrebbe essere completato entro il ${expectedDate}.` : 'In genere richiede 4-5 giorni lavorativi.'}`,
+            `con deposito diretto (ACH)${creditBankAccount ? `sul conto bancario che termina con ${creditBankAccount}.` : '. '}${expectedDate ? `Il rimborso dovrebbe essere completato entro il ${expectedDate}.` : 'In genere richiede 4-5 giorni lavorativi.'}`,
         noReimbursableExpenses: 'Questo rendiconto contiene un importo non valido',
         pendingConversionMessage: 'Il totale verrà aggiornato quando torni online',
         changedTheExpense: 'ha modificato la spesa',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 147fce6e..3a4a4da6 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -1079,15 +1079,12 @@ const translations: TranslationDeepObject<typeof en> = {
             if (!added && !updated) {
                 return 'カテゴリーは追加も更新もされていません。';
             }
-
             if (added && updated) {
                 return `${added}件のカテゴリーを追加し、${updated}件のカテゴリーを更新しました。`;
             }
-
             if (added) {
                 return added === 1 ? 'カテゴリーを1件追加しました。' : `${added}件のカテゴリーを追加しました。`;
             }
-
             return updated === 1 ? 'カテゴリーを1件更新しました。' : `${updated}件のカテゴリーを更新しました。`;
         },
         importCompanyCardTransactionsSuccessfulDescription: ({transactions}: {transactions: number}) =>
@@ -1371,9 +1368,9 @@ const translations: TranslationDeepObject<typeof en> = {
             `${payer ? `${payer} ` : ''}は<a href="${CONST.CONFIGURE_EXPENSE_REPORT_RULES_HELP_URL}">ワークスペースルール</a>経由でExpensifyにより支払われました`,
         reimbursedThisReport: 'このレポートを精算しました',
         paidThisBill: 'この請求書を支払いました',
-        reimbursedOnBehalfOf: (actor: string) => `${actor}に代わって`,
+        reimbursedOnBehalfOf: (actor: string) => `${actor}の代理で`,
         reimbursedFromBankAccount: (debitBankAccount: string) => `末尾が ${debitBankAccount} の銀行口座から`,
-        reimbursedSubmitterAddedBankAccount: (submitter: string) => `${submitter} さんが銀行口座を追加し、レポートの保留を解除しました。払い戻しを開始しました。`,
+        reimbursedSubmitterAddedBankAccount: (submitter: string) => `${submitter} が銀行口座を追加したため、レポートの保留が解除されました。払い戻しを開始しました`,
         reimbursedWithFastACH: ({
             isCurrentUser,
             submitterLogin,
@@ -1386,8 +1383,8 @@ const translations: TranslationDeepObject<typeof en> = {
             expectedDate: string;
         }) =>
             isCurrentUser
-                ? `. ${creditBankAccount ? `預金口座(末尾番号 ${creditBankAccount})` : 'アカウント'} にお金を送金中です。払い戻しは ${expectedDate} に完了する見込みです。`
-                : `. ${submitterLogin} さんへの${creditBankAccount ? `預金口座(末尾番号 ${creditBankAccount})` : 'アカウント'}への送金中です。払い戻しの完了予定日は ${expectedDate} です。`,
+                ? `. ${creditBankAccount ? `末尾が ${creditBankAccount} の銀行口座` : 'アカウント'}への送金が進行中です。払い戻しは${expectedDate}頃に完了する予定です。`
+                : `. ${submitterLogin}さんの${creditBankAccount ? `末尾が ${creditBankAccount} の銀行口座` : 'アカウント'}に送金中です。払い戻しの完了予定日は${expectedDate}です。`,
         reimbursedWithCheck: '小切手で',
         reimbursedWithStripeConnect: ({
             isCurrentUser,
@@ -1402,11 +1399,11 @@ const translations: TranslationDeepObject<typeof en> = {
         }) => {
             const paymentMethod = isCard ? 'カード' : '銀行口座';
             return isCurrentUser
-                ? `. ${paymentMethod}で支払われた資金が、お客様の${creditBankAccount ? `預金口座(末尾番号 ${creditBankAccount})` : 'アカウント'}に向けて送金中です。最大で10営業日かかる場合があります。`
-                : `. ${submitterLogin} さんの ${creditBankAccount ? `預金口座(末尾番号 ${creditBankAccount})` : 'アカウント'} へ送金中です(${paymentMethod} で支払われます)。最大 10 営業日かかる場合があります。`;
+                ? `. 資金は${paymentMethod}で支払われ、${creditBankAccount ? `末尾が ${creditBankAccount} の銀行口座` : 'アカウント'} に送金中です。完了まで最長で営業日10日かかる場合があります。`
+                : `. ${submitterLogin} さんの ${creditBankAccount ? `末尾が ${creditBankAccount} の銀行口座` : 'アカウント'} への送金を${paymentMethod}で行いました。最大10営業日かかることがあります。`;
         },
         reimbursedWithACH: ({creditBankAccount, expectedDate}: {creditBankAccount?: string; expectedDate?: string}) =>
-            `直接入金(ACH)で${creditBankAccount ? `${creditBankAccount}で終わる銀行口座へ。` : '. '}${expectedDate ? `払戻しは${expectedDate}までに完了する見込みです。` : '通常、営業日で4~5日かかります。'}`,
+            `口座振替入金(ACH)で${creditBankAccount ? `${creditBankAccount}で終わる銀行口座へ。` : '. '}${expectedDate ? `払い戻しは${expectedDate}までに完了する見込みです。` : '通常、4~5営業日かかります。'}`,
         noReimbursableExpenses: 'このレポートには無効な金額が含まれています',
         pendingConversionMessage: 'オンラインに戻ると合計が更新されます',
         changedTheExpense: '経費を変更しました',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 28c74311..74eb2020 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -1095,15 +1095,12 @@ const translations: TranslationDeepObject<typeof en> = {
             if (!added && !updated) {
                 return 'Er zijn geen categorieën toegevoegd of bijgewerkt.';
             }
-
             if (added && updated) {
                 return `${added} ${added === 1 ? 'categorie' : 'categorieën'} toegevoegd, ${updated} ${updated === 1 ? 'categorie' : 'categorieën'} bijgewerkt.`;
             }
-
             if (added) {
                 return added === 1 ? '1 categorie is toegevoegd.' : `${added} categorieën zijn toegevoegd.`;
             }
-
             return updated === 1 ? '1 categorie is bijgewerkt.' : `${updated} categorieën zijn bijgewerkt.`;
         },
         importCompanyCardTransactionsSuccessfulDescription: ({transactions}: {transactions: number}) =>
@@ -1385,11 +1382,12 @@ const translations: TranslationDeepObject<typeof en> = {
         paidWithExpensify: (payer?: string) => `${payer ? `${payer} ` : ''}betaald met wallet`,
         automaticallyPaidWithExpensify: (payer?: string) =>
             `${payer ? `${payer} ` : ''}betaald met Expensify via <a href="${CONST.CONFIGURE_EXPENSE_REPORT_RULES_HELP_URL}">werkruimteregels</a>`,
-        reimbursedThisReport: 'heeft dit rapport terugbetaald',
+        reimbursedThisReport: 'heeft dit rapport vergoed',
         paidThisBill: 'heeft deze rekening betaald',
         reimbursedOnBehalfOf: (actor: string) => `namens ${actor}`,
         reimbursedFromBankAccount: (debitBankAccount: string) => `van de bankrekening die eindigt op ${debitBankAccount}`,
-        reimbursedSubmitterAddedBankAccount: (submitter: string) => `${submitter} heeft een bankrekening toegevoegd en het rapport van de wachtlijst gehaald. Terugbetaling is gestart`,
+        reimbursedSubmitterAddedBankAccount: (submitter: string) =>
+            `${submitter} heeft een bankrekening toegevoegd, waardoor het rapport niet langer in de wacht staat. Terugbetaling is gestart`,
         reimbursedWithFastACH: ({
             isCurrentUser,
             submitterLogin,
@@ -1402,8 +1400,8 @@ const translations: TranslationDeepObject<typeof en> = {
             expectedDate: string;
         }) =>
             isCurrentUser
-                ? `. Geld is onderweg naar je ${creditBankAccount ? `bankrekening eindigend op ${creditBankAccount}` : 'rekening'}. Terugbetaling wordt naar verwachting afgerond op ${expectedDate}.`
-                : `. Geld is onderweg naar de bankrekening van ${submitterLogin}${creditBankAccount ? ` eindigend op ${creditBankAccount}` : ''}. Terugbetaling wordt naar verwachting afgerond op ${expectedDate}.`,
+                ? `. Geld is onderweg naar je${creditBankAccount ? `bankrekening eindigend op ${creditBankAccount}` : 'account'}. Terugbetaling wordt naar verwachting voltooid op ${expectedDate}.`
+                : `. Geld is onderweg naar de rekening van ${submitterLogin}${creditBankAccount ? `bankrekening eindigend op ${creditBankAccount}` : 'account'}. Terugbetaling wordt naar verwachting afgerond op ${expectedDate}.`,
         reimbursedWithCheck: 'via cheque.',
         reimbursedWithStripeConnect: ({
             isCurrentUser,
@@ -1418,11 +1416,11 @@ const translations: TranslationDeepObject<typeof en> = {
         }) => {
             const paymentMethod = isCard ? 'kaart' : 'bankrekening';
             return isCurrentUser
-                ? `. Het geld is onderweg naar je ${creditBankAccount ? `bankrekening eindigend op ${creditBankAccount}` : 'rekening'} (betaald via ${paymentMethod}). Dit kan tot 10 werkdagen duren.`
-                : `. Geld is onderweg naar de bankrekening van ${submitterLogin}${creditBankAccount ? ` eindigend op ${creditBankAccount}` : ''} (betaald via ${paymentMethod}). Dit kan tot 10 werkdagen duren.`;
+                ? `. Geld is onderweg naar je ${creditBankAccount ? `bankrekening eindigend op ${creditBankAccount}` : 'account'} (betaald via ${paymentMethod}). Dit kan tot 10 werkdagen duren.`
+                : `. Geld is onderweg naar de ${creditBankAccount ? `bankrekening eindigend op ${creditBankAccount}` : 'account'} van ${submitterLogin} (betaald via ${paymentMethod}). Dit kan tot 10 werkdagen duren.`;
         },
         reimbursedWithACH: ({creditBankAccount, expectedDate}: {creditBankAccount?: string; expectedDate?: string}) =>
-            `met directe storting (ACH)${creditBankAccount ? ` naar de bankrekening die eindigt op ${creditBankAccount}.` : '. '}${expectedDate ? `De terugbetaling wordt naar verwachting voltooid op ${expectedDate}.` : 'Dit duurt meestal 4-5 werkdagen.'}`,
+            `met directe storting (ACH)${creditBankAccount ? `naar de bankrekening die eindigt op ${creditBankAccount}.` : '. '}${expectedDate ? `De terugbetaling wordt naar schatting afgerond op ${expectedDate}.` : 'Dit duurt meestal 4-5 werkdagen.'}`,
         noReimbursableExpenses: 'Dit rapport bevat een ongeldig bedrag',
         pendingConversionMessage: 'Totaal wordt bijgewerkt zodra je weer online bent',
         changedTheExpense: 'heeft de uitgave gewijzigd',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 5bfd1f37..a58d4e93 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -1096,15 +1096,12 @@ const translations: TranslationDeepObject<typeof en> = {
             if (!added && !updated) {
                 return 'Nie dodano ani nie zaktualizowano żadnych kategorii.';
             }
-
             if (added && updated) {
                 return `Dodano ${added} ${added === 1 ? 'kategorię' : 'kategorie'}, zaktualizowano ${updated} ${updated === 1 ? 'kategorię' : 'kategorie'}.`;
             }
-
             if (added) {
                 return added === 1 ? 'Dodano 1 kategorię.' : `Dodano ${added} kategorie.`;
             }
-
             return updated === 1 ? 'Zaktualizowano 1 kategorię.' : `Zaktualizowano ${updated} kategorie.`;
         },
         importCompanyCardTransactionsSuccessfulDescription: ({transactions}: {transactions: number}) => (transactions > 1 ? `Dodano ${transactions} transakcji.` : 'Dodano 1 transakcję.'),
@@ -1384,11 +1381,11 @@ const translations: TranslationDeepObject<typeof en> = {
         paidWithExpensify: (payer?: string) => `${payer ? `${payer} ` : ''}zapłacono z portfela`,
         automaticallyPaidWithExpensify: (payer?: string) =>
             `${payer ? `${payer} ` : ''}zapłacono przez Expensify za pomocą <a href="${CONST.CONFIGURE_EXPENSE_REPORT_RULES_HELP_URL}">reguł przestrzeni roboczej</a>`,
-        reimbursedThisReport: 'zwrócił(-a) koszty z tego raportu',
-        paidThisBill: 'zapłacił(a) ten rachunek',
+        reimbursedThisReport: 'zwrócił(a) koszty z tego raportu',
+        paidThisBill: 'opłacił ten rachunek',
         reimbursedOnBehalfOf: (actor: string) => `w imieniu ${actor}`,
         reimbursedFromBankAccount: (debitBankAccount: string) => `z konta bankowego kończącego się na ${debitBankAccount}`,
-        reimbursedSubmitterAddedBankAccount: (submitter: string) => `${submitter} dodał konto bankowe, zdejmując raport z wstrzymania. Zwrot został zainicjowany`,
+        reimbursedSubmitterAddedBankAccount: (submitter: string) => `${submitter} dodał konto bankowe i zdjął raport z wstrzymania. Zwrot został zainicjowany`,
         reimbursedWithFastACH: ({
             isCurrentUser,
             submitterLogin,
@@ -1401,8 +1398,8 @@ const translations: TranslationDeepObject<typeof en> = {
             expectedDate: string;
         }) =>
             isCurrentUser
-                ? `. Pieniądze są w drodze na twoje ${creditBankAccount ? `konto bankowe kończące się na ${creditBankAccount}` : 'konto'}. Zwrot kosztów powinien zostać zrealizowany do ${expectedDate}.`
-                : `. Przelew jest w drodze na konto bankowe ${submitterLogin}${creditBankAccount ? ` kończące się na ${creditBankAccount}` : ''}. Zwrot kosztów powinien zostać zrealizowany do ${expectedDate}.`,
+                ? `. Pieniądze są w drodze na twoje${creditBankAccount ? `konto bankowe kończące się na ${creditBankAccount}` : 'konto'}. Szacowany termin zakończenia zwrotu to ${expectedDate}.`
+                : `. Pieniądze są w drodze do ${submitterLogin}${creditBankAccount ? `konto bankowe kończące się na ${creditBankAccount}` : 'konto'}. Zwrot kosztów powinien zostać zrealizowany do ${expectedDate}.`,
         reimbursedWithCheck: 'czekiem.',
         reimbursedWithStripeConnect: ({
             isCurrentUser,
@@ -1417,11 +1414,11 @@ const translations: TranslationDeepObject<typeof en> = {
         }) => {
             const paymentMethod = isCard ? 'karta' : 'konto bankowe';
             return isCurrentUser
-                ? `. Pieniądze są w drodze na twoje ${creditBankAccount ? `konto bankowe kończące się na ${creditBankAccount}` : 'konto'} (zapłacono przez ${paymentMethod}). Może to potrwać do 10 dni roboczych.`
-                : `. Pieniądze są w drodze na konto bankowe ${submitterLogin}${creditBankAccount ? ` kończące się na ${creditBankAccount}` : ''} (zapłacono przez ${paymentMethod}). Może to potrwać do 10 dni roboczych.`;
+                ? `. Pieniądze są w drodze na twoje${creditBankAccount ? `konto bankowe kończące się na ${creditBankAccount}` : 'konto'} (opłacone przez ${paymentMethod}). Może to potrwać do 10 dni roboczych.`
+                : `. Pieniądze są w drodze na konto ${submitterLogin}${creditBankAccount ? `konto bankowe kończące się na ${creditBankAccount}` : 'konto'} (zapłacono przez ${paymentMethod}). Może to potrwać do 10 dni roboczych.`;
         },
         reimbursedWithACH: ({creditBankAccount, expectedDate}: {creditBankAccount?: string; expectedDate?: string}) =>
-            `z wpłatą bezpośrednią (ACH)${creditBankAccount ? ` na konto bankowe kończące się na ${creditBankAccount}.` : '. '}${expectedDate ? `Zwrot kosztów powinien zostać zrealizowany do ${expectedDate}.` : 'To zazwyczaj zajmuje 4–5 dni roboczych.'}`,
+            `z bezpośrednim depozytem (ACH)${creditBankAccount ? `na konto bankowe kończące się na ${creditBankAccount}.` : '. '}${expectedDate ? `Zwrot kosztów powinien zostać zakończony do ${expectedDate}.` : 'Zazwyczaj zajmuje to 4–5 dni roboczych.'}`,
         noReimbursableExpenses: 'Ten raport ma nieprawidłową kwotę',
         pendingConversionMessage: 'Suma zaktualizuje się, gdy wrócisz do trybu online',
         changedTheExpense: 'zmienił(a) wydatek',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 0e7adb05..75230a41 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -1094,15 +1094,12 @@ const translations: TranslationDeepObject<typeof en> = {
             if (!added && !updated) {
                 return 'Nenhuma categoria foi adicionada ou atualizada.';
             }
-
             if (added && updated) {
                 return `${added} ${added === 1 ? 'categoria' : 'categorias'} adicionada${added === 1 ? '' : 's'}, ${updated} ${updated === 1 ? 'categoria' : 'categorias'} atualizada${updated === 1 ? '' : 's'}.`;
             }
-
             if (added) {
                 return added === 1 ? '1 categoria foi adicionada.' : `${added} categorias foram adicionadas.`;
             }
-
             return updated === 1 ? '1 categoria foi atualizada.' : `${updated} categorias foram atualizadas.`;
         },
         importCompanyCardTransactionsSuccessfulDescription: ({transactions}: {transactions: number}) =>
@@ -1387,7 +1384,7 @@ const translations: TranslationDeepObject<typeof en> = {
         paidThisBill: 'pagou esta conta',
         reimbursedOnBehalfOf: (actor: string) => `em nome de ${actor}`,
         reimbursedFromBankAccount: (debitBankAccount: string) => `da conta bancária com final ${debitBankAccount}`,
-        reimbursedSubmitterAddedBankAccount: (submitter: string) => `${submitter} adicionou uma conta bancária, retirando o relatório da suspensão. O reembolso foi iniciado`,
+        reimbursedSubmitterAddedBankAccount: (submitter: string) => `${submitter} adicionou uma conta bancária, tirando o relatório da espera. O reembolso foi iniciado`,
         reimbursedWithFastACH: ({
             isCurrentUser,
             submitterLogin,
@@ -1400,9 +1397,9 @@ const translations: TranslationDeepObject<typeof en> = {
             expectedDate: string;
         }) =>
             isCurrentUser
-                ? `. O dinheiro está a caminho da sua ${creditBankAccount ? `conta bancária terminada em ${creditBankAccount}` : 'conta'}. Reembolso previsto para ser concluído em ${expectedDate}.`
-                : `. O dinheiro está a caminho da conta bancária de ${submitterLogin}${creditBankAccount ? ` terminada em ${creditBankAccount}` : ''}. Reembolso com conclusão estimada em ${expectedDate}.`,
-        reimbursedWithCheck: 'por cheque.',
+                ? `. O dinheiro está a caminho da sua${creditBankAccount ? `conta bancária terminando em ${creditBankAccount}` : 'conta'}. Reembolso com conclusão estimada em ${expectedDate}.`
+                : `. O dinheiro está a caminho da conta de ${submitterLogin}${creditBankAccount ? `conta bancária terminando em ${creditBankAccount}` : 'conta'}. O reembolso deve ser concluído em ${expectedDate}.`,
+        reimbursedWithCheck: 'via cheque.',
         reimbursedWithStripeConnect: ({
             isCurrentUser,
             submitterLogin,
@@ -1416,11 +1413,11 @@ const translations: TranslationDeepObject<typeof en> = {
         }) => {
             const paymentMethod = isCard ? 'cartão' : 'conta bancária';
             return isCurrentUser
-                ? `. O dinheiro está a caminho da sua ${creditBankAccount ? `conta bancária terminada em ${creditBankAccount}` : 'conta'} (pago via ${paymentMethod}). Isso pode levar até 10 dias úteis.`
-                : `. O dinheiro está a caminho da conta bancária de ${submitterLogin}${creditBankAccount ? ` terminada em ${creditBankAccount}` : ''} (pago via ${paymentMethod}). Isso pode levar até 10 dias úteis.`;
+                ? `. O dinheiro está a caminho da sua${creditBankAccount ? `conta bancária terminando em ${creditBankAccount}` : 'conta'} (pago via ${paymentMethod}). Isso pode levar até 10 dias úteis.`
+                : `. O dinheiro está a caminho da${creditBankAccount ? `conta bancária terminando em ${creditBankAccount}` : 'conta'} de ${submitterLogin} (pago via ${paymentMethod}). Isso pode levar até 10 dias úteis.`;
         },
         reimbursedWithACH: ({creditBankAccount, expectedDate}: {creditBankAccount?: string; expectedDate?: string}) =>
-            `com depósito direto (ACH)${creditBankAccount ? ` para a conta bancária terminada em ${creditBankAccount}.` : '. '}${expectedDate ? `O reembolso está previsto para ser concluído até ${expectedDate}.` : 'Geralmente isso leva de 4 a 5 dias úteis.'}`,
+            `com depósito direto (ACH)${creditBankAccount ? `para a conta bancária terminada em ${creditBankAccount}.` : '. '}${expectedDate ? `O reembolso tem previsão de ser concluído até ${expectedDate}.` : 'Isso geralmente leva de 4 a 5 dias úteis.'}`,
         noReimbursableExpenses: 'Este relatório tem um valor inválido',
         pendingConversionMessage: 'O total será atualizado quando você voltar a ficar online',
         changedTheExpense: 'alterou a despesa',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index a4ed4048..6d75eb08 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -1341,9 +1341,9 @@ const translations: TranslationDeepObject<typeof en> = {
         paidWithExpensify: (payer?: string) => `${payer ? `${payer} ` : ''}用钱包支付`,
         automaticallyPaidWithExpensify: (payer?: string) => `${payer ? `${payer} ` : ''}已通过<a href="${CONST.CONFIGURE_EXPENSE_REPORT_RULES_HELP_URL}">工作区规则</a>使用 Expensify 支付`,
         reimbursedThisReport: '已报销此报表',
-        paidThisBill: '已支付此账单',
+        paidThisBill: '支付了此账单',
         reimbursedOnBehalfOf: (actor: string) => `代表 ${actor}`,
-        reimbursedFromBankAccount: (debitBankAccount: string) => `从尾号为 ${debitBankAccount} 的银行账户`,
+        reimbursedFromBankAccount: (debitBankAccount: string) => `来自尾号为 ${debitBankAccount} 的银行账户`,
         reimbursedSubmitterAddedBankAccount: (submitter: string) => `${submitter} 已添加银行账户,报告已解除挂起。已发起报销`,
         reimbursedWithFastACH: ({
             isCurrentUser,
@@ -1357,8 +1357,8 @@ const translations: TranslationDeepObject<typeof en> = {
             expectedDate: string;
         }) =>
             isCurrentUser
-                ? `. 款项正在汇往您的${creditBankAccount ? `尾号为 ${creditBankAccount} 的银行账户` : '账户'}。预计将在 ${expectedDate} 前完成报销。`
-                : `。款项正在汇往 ${submitterLogin} 的${creditBankAccount ? `尾号为 ${creditBankAccount} 的银行账户` : '账户'}。预计于 ${expectedDate} 完成报销。`,
+                ? `. 资金正在转入您的 ${creditBankAccount ? `以 ${creditBankAccount} 结尾的银行账户` : '账户'}。预计将在 ${expectedDate} 前完成报销。`
+                : `. 款项正在汇往 ${submitterLogin} 的 ${creditBankAccount ? `以 ${creditBankAccount} 结尾的银行账户` : '账户'}。预计将在 ${expectedDate} 前完成报销。`,
         reimbursedWithCheck: '通过支票。',
         reimbursedWithStripeConnect: ({
             isCurrentUser,
@@ -1373,11 +1373,11 @@ const translations: TranslationDeepObject<typeof en> = {
         }) => {
             const paymentMethod = isCard ? '卡' : '银行账户';
             return isCurrentUser
-                ? `. 款项正在汇往您的${creditBankAccount ? `尾号为 ${creditBankAccount} 的银行账户` : '账户'}(通过 ${paymentMethod} 支付)。这可能需要最多 10 个工作日。`
-                : `. 资金正在汇往 ${submitterLogin} 的 ${creditBankAccount ? `尾号为 ${creditBankAccount} 的银行账户` : '账户'}(通过 ${paymentMethod} 支付)。这可能需要最多 10 个工作日。`;
+                ? `. 款项正在汇往您的 ${creditBankAccount ? `以 ${creditBankAccount} 结尾的银行账户` : '账户'}(通过 ${paymentMethod} 支付)。这可能需要长达 10 个工作日。`
+                : `. 款项正在汇往 ${submitterLogin} 的 ${creditBankAccount ? `以 ${creditBankAccount} 结尾的银行账户` : '账户'}(通过 ${paymentMethod} 支付)。这可能需要最多 10 个工作日。`;
         },
         reimbursedWithACH: ({creditBankAccount, expectedDate}: {creditBankAccount?: string; expectedDate?: string}) =>
-            `使用直接存款(ACH)${creditBankAccount ? `至尾号为 ${creditBankAccount} 的银行账户。` : '. '}${expectedDate ? `预计将在 ${expectedDate} 前完成报销。` : '这通常需要 4–5 个工作日。'}`,
+            `通过直接存款(ACH)${creditBankAccount ? `至尾号为 ${creditBankAccount} 的银行账户。` : '. '}${expectedDate ? `预计在 ${expectedDate} 前完成报销。` : '这通常需要 4–5 个工作日。'}`,
         noReimbursableExpenses: '此报表的金额无效',
         pendingConversionMessage: '当你重新联网时,总金额会更新',
         changedTheExpense: '更改了报销单',

Note

You can apply these changes to your branch by copying the patch to your clipboard, then running pbpaste | git apply 😉

View workflow run

@Krishna2323
Copy link
Copy Markdown
Contributor

Reviewing...

@Krishna2323
Copy link
Copy Markdown
Contributor

@deetergp It seems like the Auth PR hasn’t been merged or deployed yet—correct? The translation bug is still there.

web_chrome_2.mp4

@deetergp
Copy link
Copy Markdown
Contributor Author

deetergp commented Apr 7, 2026

@Krishna2323 No, the backend PR is still in review. I'll let you know when it's on staging.

Do this whenever paymentMethod is absent
@deetergp
Copy link
Copy Markdown
Contributor Author

deetergp commented Apr 7, 2026

@Krishna2323 Okay this is updated and ready for another look. It's been updated to not require the backend change. I ran through testing steps again and confirmed that it works and translates accordingly.

2026-04-07_15-39-03.mp4

@Krishna2323
Copy link
Copy Markdown
Contributor

@deetergp the report actions view works well but the message is still not translated in LHN:

Monosnap.screencast.2026-04-09.03-34-43.mp4

@deetergp
Copy link
Copy Markdown
Contributor Author

deetergp commented Apr 8, 2026

Nice catch @Krishna2323! Updated.

@Krishna2323
Copy link
Copy Markdown
Contributor

@deetergp the latest commit looks good and works correctly.

One potential issue flagged by AI review: reimbursedWithCheck and reimbursedWithACH might be missing a leading space in DE, FR, IT, NL, PL, and PT-BR. The EN versions start with a space (' via check.', ' with direct deposit...') because getReimbursedMessage concatenates message + paymentSuffix directly (no space added). But the non-EN translations for these two keys don't have the leading space, which could produce something like "diesen Bericht erstattetper Scheck." instead of "diesen Bericht erstattet per Scheck.". Could you please double-check?

@Krishna2323
Copy link
Copy Markdown
Contributor

Reviewer Checklist

  • I have verified the author checklist is complete (all boxes are checked off).
  • I verified the correct issue is linked in the ### Fixed Issues section above
  • I verified testing steps are clear and they cover the changes made in this PR
    • I verified the steps for local testing are in the Tests section
    • I verified the steps for Staging and/or Production testing are in the QA steps section
    • I verified the steps cover any possible failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
  • I checked that screenshots or videos are included for tests on all platforms
  • I included screenshots or videos for tests on all platforms
  • I verified that the composer does not automatically focus or open the keyboard on mobile unless explicitly intended. This includes checking that returning the app from the background does not unexpectedly open the keyboard.
  • I verified tests pass on all platforms & I tested again on:
    • Android: HybridApp
    • Android: mWeb Chrome
    • iOS: HybridApp
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
    • MacOS: Desktop
  • If there are any errors in the console that are unrelated to this PR, I either fixed them (preferred) or linked to where I reported them in Slack
  • I verified there are no new alerts related to the canBeMissing param for useOnyx
  • I verified proper code patterns were followed (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick).
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method
    • I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
    • I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
    • I verified the JSDocs style guidelines (in STYLE.md) were followed
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I verified that this PR follows the guidelines as stated in the Review Guidelines
  • I verified other components that can be impacted by these changes have been tested, and I retested again (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar have been tested & I retested again)
  • I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
  • I verified any variables that can be defined as constants (ie. in CONST.ts or at the top of the file that uses the constant) are defined as such
  • If a new component is created I verified that:
    • A similar component doesn't exist in the codebase
    • All props are defined accurately and each prop has a /** comment above it */
    • The file is named correctly
    • The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
    • The only data being stored in the state is data necessary for rendering and nothing else
    • For Class Components, any internal methods passed to components event handlers are bound to this properly so there are no scoping issues (i.e. for onClick={this.submit} the method this.submit should be bound to this in the constructor)
    • Any internal methods bound to this are necessary to be bound (i.e. avoid this.submit = this.submit.bind(this); if this.submit is never passed to a component event handler like onClick)
    • All JSX used for rendering exists in the render method
    • The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions
  • If any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG)
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
  • For any bug fix or new feature in this PR, I verified that sufficient unit tests are included to prevent regressions in this flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.
  • I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Screenshots/Videos

Android: HybridApp
android_hybrid_1.mp4
android_hybrid_2.mp4
Android: mWeb Chrome
android_chrome_1.mp4
android_chrome_2.mp4
iOS: HybridApp
ios_hybrid_1.mp4
ios_hybrid_2.mp4
iOS: mWeb Safari
ios_safari_1.mp4
ios_safari_2.mp4
MacOS: Chrome / Safari
web_chrome.mp4
web_chrome_2.mp4

@Krishna2323
Copy link
Copy Markdown
Contributor

@deetergp Please check this comment and fix the failing tests. Otherwise, it looks good to me.

@deetergp
Copy link
Copy Markdown
Contributor Author

deetergp commented Apr 9, 2026

@Krishna2323 updated to add spaces. I didn't do anything about the tests, they just passed this run. 🤷‍♂️

@Krishna2323
Copy link
Copy Markdown
Contributor

@codex review

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c1f88f3d79

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

} else if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.MARKED_REIMBURSED)) {
lastMessageTextFromReport = getMarkedReimbursedMessage(translate, lastReportAction);
} else if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.REIMBURSED)) {
lastMessageTextFromReport = getReimbursedMessage(translate, lastReportAction, report, currentUserAccountID ?? CONST.DEFAULT_NUMBER_ID);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Require current user ID for reimbursed message rendering

getReimbursedMessage() uses currentUserAccountID to decide between “your account” and <login>'s account, but this new branch defaults to CONST.DEFAULT_NUMBER_ID when callers omit the ID. In OptionsListUtils, getLastMessageTextForReport() is still called from createOption()/getAlternateText() without currentUserAccountID, so REIMBURSED previews in those paths will systematically render third-person text for the current user (and can show awkward owner-based phrasing). This is a user-visible regression introduced by the new REIMBURSED handling; please thread the real account ID through these call sites (or avoid the 0 fallback here).

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@deetergp 👀 please. I think this is a valid regression.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants