feat: add one-click Google merchant search for card expenses#93739
Conversation
|
Hey, I noticed you changed If you want to automatically generate translations for other locales, an Expensify employee will have to:
Alternatively, if you are an external contributor, you can run the translation script locally with your own OpenAI API key. To learn more, try running: npx ts-node ./scripts/generateTranslations.ts --helpTypically, you'd want to translate only what you changed by running |
|
@gijoe0295 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] |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e99da25c09
ℹ️ 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".
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
|
Running translations for you. |
🦜 Polyglot Parrot! 🦜Squawk! Looks like you added some shiny new English strings. Allow me to parrot them back to you in other tongues: View the translation diffdiff --git a/src/languages/de.ts b/src/languages/de.ts
index 4408a5b2abe..e6e0d613993 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -315,7 +315,7 @@ const translations: TranslationDeepObject<typeof en> = {
plusMore: ({count}: {count: number}) => `+${count} weitere`,
merchant: 'Händler',
googleThisMerchant: ({merchant}: {merchant: string}) => `Google ${merchant}`,
- searchOnGoogle: ({merchant}: {merchant: string}) => `${merchant} bei Google suchen`,
+ searchOnGoogle: ({merchant}: {merchant: string}) => `Suchen Sie ${merchant} auf Google`,
change: 'Ändern',
category: 'Kategorie',
vendor: 'Anbieter',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index d5c7ce89af8..90f65537567 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -270,7 +270,7 @@ const translations: TranslationDeepObject<typeof en> = {
plusMore: ({count}: {count: number}) => `+${count} más`,
merchant: 'Comerciante',
googleThisMerchant: ({merchant}: {merchant: string}) => `Google ${merchant}`,
- searchOnGoogle: ({merchant}: {merchant: string}) => `Buscar ${merchant} en Google`,
+ searchOnGoogle: ({merchant}: {merchant: string}) => `Busca ${merchant} en Google`,
change: 'Cambio',
category: 'Categoría',
vendor: 'Proveedor',
@@ -1755,7 +1755,6 @@ const translations: TranslationDeepObject<typeof en> = {
}
},
[CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_MARK_AS_DONE]: (actor, actorType, _eta, _etaType) => {
- // eslint-disable-next-line default-case
switch (actorType) {
case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER:
return `Esperando a que <strong>tú</strong> lo marques como listo.`;
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index e981b58c513..917b5a3325f 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -1,6 +1,7 @@
/**
* _____ __ __
* / ___/__ ___ ___ _______ _/ /____ ___/ /
+ * / (_ / -_) _ \/ -_) __/ _ \`/ __/ -_) _ /
* \___/\__/_//_/\__/_/ \_,_/\__/\__/\_,_/
*
* This file was automatically generated. Please consider these alternatives before manually editing it:
@@ -864,7 +865,7 @@ const translations: TranslationDeepObject<typeof en> = {
beginningOfChatHistory: (users: string) => `Cette discussion est avec ${users}.`,
beginningOfChatHistoryPolicyExpenseChat: (workspaceName: string, submitterDisplayName: string) =>
`C’est ici que <strong>${submitterDisplayName}</strong> soumettra des dépenses à <strong>${workspaceName}</strong>. Utilisez simplement le bouton +.`,
- beginningOfChatHistoryPolicyExpenseChatTrack: 'C\u2019est ici que vous suivrez vos dépenses',
+ beginningOfChatHistoryPolicyExpenseChatTrack: 'C’est ici que vous suivrez vos dépenses',
beginningOfChatHistorySelfDM: 'Ceci est votre espace personnel. Utilisez-le pour vos notes, tâches, brouillons et rappels.',
beginningOfChatHistorySystemDM: 'Bienvenue ! Procédons à la configuration.',
chatWithAccountManager: 'Discutez avec votre gestionnaire de compte ici',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 8dfa965c6a8..c6493f22b81 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -315,7 +315,7 @@ const translations: TranslationDeepObject<typeof en> = {
plusMore: ({count}: {count: number}) => `+${count}件`,
merchant: '加盟店',
googleThisMerchant: ({merchant}: {merchant: string}) => `Google ${merchant}`,
- searchOnGoogle: ({merchant}: {merchant: string}) => `Googleで${merchant}を検索`,
+ searchOnGoogle: ({merchant}: {merchant: string}) => `Google で ${merchant} を検索します`,
change: '変更',
category: 'カテゴリ',
vendor: 'ベンダー',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 0e376bf17c4..ef90451f923 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -314,7 +314,7 @@ const translations: TranslationDeepObject<typeof en> = {
showLess: 'Pokaż mniej',
plusMore: ({count}: {count: number}) => `+${count} więcej`,
merchant: 'Sprzedawca',
- googleThisMerchant: ({merchant}: {merchant: string}) => `Google ${merchant}`,
+ googleThisMerchant: ({merchant}: {merchant: string}) => `Wyszukaj w Google: ${merchant}`,
searchOnGoogle: ({merchant}: {merchant: string}) => `Wyszukaj ${merchant} w Google`,
change: 'Zmień',
category: 'Kategoria',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 2fc9ce39a61..95a11d5ad3f 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -315,7 +315,7 @@ const translations: TranslationDeepObject<typeof en> = {
plusMore: ({count}: {count: number}) => `+${count} mais`,
merchant: 'Estabelecimento',
googleThisMerchant: ({merchant}: {merchant: string}) => `Google ${merchant}`,
- searchOnGoogle: ({merchant}: {merchant: string}) => `Pesquisar ${merchant} no Google`,
+ searchOnGoogle: ({merchant}: {merchant: string}) => `Pesquise ${merchant} no Google`,
change: 'Alterar',
category: 'Categoria',
vendor: 'Fornecedor',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 14130787ffd..454321becbb 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -315,7 +315,7 @@ const translations: TranslationDeepObject<typeof en> = {
plusMore: ({count}: {count: number}) => `+${count}个`,
merchant: '商户',
googleThisMerchant: ({merchant}: {merchant: string}) => `Google ${merchant}`,
- searchOnGoogle: ({merchant}: {merchant: string}) => `在 Google 上搜索${merchant}`,
+ searchOnGoogle: ({merchant}: {merchant: string}) => `在 Google 上搜索 ${merchant}`,
change: '更改',
category: '类别',
vendor: '供应商',
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
|
Thank a lot @trjExpensify, I'll update the translations shortly. |
|
@gijoe0295 - can you jump on the review of this today? We had another customer request for it today. |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppScreen.Recording.2026-06-23.at.01.31.08.movAndroid: mWeb ChromeScreen.Recording.2026-06-23.at.01.28.44.moviOS: HybridAppScreen.Recording.2026-06-23.at.01.20.55.moviOS: mWeb SafariScreen.Recording.2026-06-23.at.01.23.36.movMacOS: Chrome / SafariScreen.Recording.2026-06-23.at.01.18.29.mov |
I think this step is hard to reproduce for QA team so please remove it |
|
@gijoe0295 All yours. |
|
🚧 @arosiclair has triggered a test Expensify/App build. You can view the workflow run here. |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/arosiclair in version: 9.4.18-0 🚀
Bundle Size Analysis (Sentry): |
|
🤖 Help site review complete — docs update needed. This PR adds a user-facing Google [merchant name] link below the Merchant field on card-imported expenses (company card, imported personal card, or Expensify Card), which opens a Google search for the merchant in a new window. That behavior wasn't documented anywhere in What I changed: Added a concise FAQ entry to the Edit Expenses article ( Draft help site PR: #94379 (labeled
@samranahm, please review the linked help site PR and confirm it reflects the current behavior. Then mark the linked help site PR |
|
🚀 Deployed to production by https://github.com/blimpich in version: 9.4.18-2 🚀
|
Explanation of Change
Add a “Google [merchant name]” link below the merchant field on card-imported expenses in
MoneyRequestView, to match Expensify Classic behavior. The link uses the originaltransaction.merchantrecapitalized viaStr.recapitalizeand opens Google search. It's hidden for non-card expenses and while SmartScan is in progress.Fixed Issues
$ #78486
PROPOSAL: #78486 (comment)
Tests
Offline tests
Same as test
QA Steps
Same as test
// TODO: These must be filled out, or the issue title must include "[No QA]."
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)src/languages/*files and using the translation methodSTYLE.md) were followedAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.ScrollViewcomponent to make it scrollable when more elements are added to the page.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
Android.Native.mp4
Android: mWeb Chrome
Android.mWeb.Chrome.mp4
iOS: Native
IOS.Native.mp4
iOS: mWeb Safari
IOS.mWeb.Safari.mp4
MacOS: Chrome / Safari
macOS.Chrome.mp4