[Home Page] Add Concierge prompt box to home For You section - #98336
[Home Page] Add Concierge prompt box to home For You section#98336adamgrzybowski wants to merge 2 commits into
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 |
|
@shawnborton @mananjadhav One of you needs to 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] |
|
This PR needs the polyglot parrot run 🙏 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e10317285d
ℹ️ 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".
🦜 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 9de8a623856..ec36eaf9543 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -1092,6 +1092,13 @@ const translations: TranslationDeepObject<typeof en> = {
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'},
+ conciergePrompt: {
+ goodMorning: ({name}: {name?: string}) => (name ? `Guten Morgen, ${name}.` : 'Guten Morgen.'),
+ goodAfternoon: ({name}: {name?: string}) => (name ? `Guten Tag, ${name}.` : 'Guten Tag.'),
+ goodEvening: ({name}: {name?: string}) => (name ? `Guten Abend, ${name}.` : 'Guten Abend.'),
+ inputPlaceholder: 'Bitten Sie Concierge, Ihre Ausgaben zu analysieren oder Unterstützung zu erhalten',
+ inputPlaceholderMobile: 'Stellen Sie Concierge eine Frage',
+ },
},
allSettingsScreen: {
subscription: 'Abonnement',
diff --git a/src/languages/el.ts b/src/languages/el.ts
index 81d3aeb0899..01905002e70 100644
--- a/src/languages/el.ts
+++ b/src/languages/el.ts
@@ -320,7 +320,6 @@ const translations: TranslationDeepObject<typeof en> = {
automatic: 'Αυτόματο',
showing: 'Εμφανίζονται',
of: 'του',
- // @context Carousel pagination counter showing the current item's position out of the total (e.g. "3 of 50").
currentOfTotal: ({current, total}: {current: number; total: number}) => `${current} από ${total}`,
default: 'Προεπιλογή',
update: 'Ενημέρωση',
@@ -1138,6 +1137,13 @@ const translations: TranslationDeepObject<typeof en> = {
today: 'Σήμερα',
},
insightsSection: {chartUnavailable: 'Το γράφημα δεν είναι διαθέσιμο', notEnoughData: 'Δεν έχουμε ακόμη αρκετά δεδομένα για να συμπληρώσουμε αυτό το γράφημα'},
+ conciergePrompt: {
+ goodMorning: ({name}: {name?: string}) => (name ? `Καλημέρα, ${name}.` : 'Καλημέρα.'),
+ goodAfternoon: ({name}: {name?: string}) => (name ? `Καλησπέρα σας, ${name}.` : 'Καλό απόγευμα.'),
+ goodEvening: ({name}: {name?: string}) => (name ? `Καλησπέρα, ${name}.` : 'Καλησπέρα.'),
+ inputPlaceholder: 'Ζητήστε από το Concierge να αναλύσει τα έξοδά σας ή να λάβετε υποστήριξη',
+ inputPlaceholderMobile: 'Ρωτήστε το Concierge οτιδήποτε',
+ },
},
allSettingsScreen: {
subscription: 'Συνδρομή',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index d0af721f645..94cdfc2e044 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -1087,6 +1087,13 @@ const translations: TranslationDeepObject<typeof en> = {
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'},
+ conciergePrompt: {
+ goodMorning: ({name}: {name?: string}) => (name ? `Buenos días, ${name}.` : 'Buenos días.'),
+ goodAfternoon: ({name}: {name?: string}) => (name ? `Buenas tardes, ${name}.` : 'Buenas tardes.'),
+ goodEvening: ({name}: {name?: string}) => (name ? `Buenas noches, ${name}.` : 'Buenas noches.'),
+ inputPlaceholder: 'Pídele a Concierge que analice tus gastos o que te ayude',
+ inputPlaceholderMobile: 'Pregunta a Concierge cualquier cosa',
+ },
},
allSettingsScreen: {
subscription: 'Suscripcion',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 42787610f42..fce34d5383e 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -1095,6 +1095,13 @@ const translations: TranslationDeepObject<typeof en> = {
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'},
+ conciergePrompt: {
+ goodMorning: ({name}: {name?: string}) => (name ? `Bonjour, ${name}.` : 'Bonjour.'),
+ goodAfternoon: ({name}: {name?: string}) => (name ? `Bonjour, ${name}.` : 'Bon après-midi.'),
+ goodEvening: ({name}: {name?: string}) => (name ? `Bonsoir, ${name}.` : 'Bonsoir.'),
+ inputPlaceholder: 'Demander à Concierge d’analyser vos dépenses ou d’obtenir de l’aide',
+ inputPlaceholderMobile: 'Demander n’importe quoi à Concierge',
+ },
},
allSettingsScreen: {
subscription: 'Abonnement',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 6a362596b50..d92b66d5984 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -1093,6 +1093,13 @@ const translations: TranslationDeepObject<typeof en> = {
emptyStateMessage: 'Creane una o trascina qui una ricevuta',
},
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.'),
+ goodEvening: ({name}: {name?: string}) => (name ? `Buonasera, ${name}.` : 'Buona sera.'),
+ inputPlaceholder: 'Chiedi a Concierge di analizzare le tue spese o chiedi supporto',
+ inputPlaceholderMobile: 'Chiedi qualsiasi cosa a Concierge',
+ },
},
allSettingsScreen: {
subscription: 'Abbonamento',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 9a5267c3cef..f097d883b0e 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -1076,6 +1076,13 @@ const translations: TranslationDeepObject<typeof en> = {
emptyStateMessage: '新規作成するか、レシートをここにドラッグしてください',
},
insightsSection: {chartUnavailable: 'グラフを表示できません', notEnoughData: 'このチャートを表示するためのデータがまだ十分にありません'},
+ conciergePrompt: {
+ goodMorning: ({name}: {name?: string}) => (name ? `${name}さん、おはようございます。` : 'おはようございます。'),
+ goodAfternoon: ({name}: {name?: string}) => (name ? `${name}さん、こんにちは。` : 'こんにちは。'),
+ goodEvening: ({name}: {name?: string}) => (name ? `${name}さん、こんばんは。` : 'こんばんは。'),
+ inputPlaceholder: 'Concierge に経費の分析を依頼するか、サポートを受けます',
+ inputPlaceholderMobile: 'Concierge に何でも聞いてください',
+ },
},
allSettingsScreen: {
subscription: 'サブスクリプション',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 3cd6ee5a386..64b216cef51 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -1091,6 +1091,13 @@ const translations: TranslationDeepObject<typeof en> = {
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'},
+ conciergePrompt: {
+ goodMorning: ({name}: {name?: string}) => (name ? `Goedemorgen, ${name}.` : 'Goedemorgen.'),
+ goodAfternoon: ({name}: {name?: string}) => (name ? `Goedemiddag, ${name}.` : 'Goedemiddag.'),
+ goodEvening: ({name}: {name?: string}) => (name ? `Goedenavond, ${name}.` : 'Goedenavond.'),
+ inputPlaceholder: 'Vraag Concierge om je uitgaven te analyseren of om hulp te krijgen',
+ inputPlaceholderMobile: 'Stel Concierge alles gerust een vraag',
+ },
},
allSettingsScreen: {
subscription: 'Abonnement',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 303b2c3eb23..9a31c0d0b5f 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -1089,6 +1089,13 @@ const translations: TranslationDeepObject<typeof en> = {
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'},
+ conciergePrompt: {
+ goodMorning: ({name}: {name?: string}) => (name ? `Dzień dobry, ${name}.` : 'Dzień dobry.'),
+ goodAfternoon: ({name}: {name?: string}) => (name ? `Dzień dobry, ${name}.` : 'Dzień dobry.'),
+ goodEvening: ({name}: {name?: string}) => (name ? `Dobry wieczór, ${name}.` : 'Dobry wieczór.'),
+ inputPlaceholder: 'Poproś Concierge o przeanalizowanie swoich wydatków lub uzyskaj pomoc',
+ inputPlaceholderMobile: 'Zapytaj Concierge o cokolwiek',
+ },
},
allSettingsScreen: {
subscription: 'Subskrypcja',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 8f41bd76602..6712ef26e79 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -1091,6 +1091,13 @@ const translations: TranslationDeepObject<typeof en> = {
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'},
+ conciergePrompt: {
+ goodMorning: ({name}: {name?: string}) => (name ? `Bom dia, ${name}.` : 'Bom dia.'),
+ goodAfternoon: ({name}: {name?: string}) => (name ? `Boa tarde, ${name}.` : 'Boa tarde.'),
+ goodEvening: ({name}: {name?: string}) => (name ? `Boa noite, ${name}.` : 'Boa noite.'),
+ inputPlaceholder: 'Peça ao Concierge para analisar suas despesas ou obter suporte',
+ inputPlaceholderMobile: 'Pergunte qualquer coisa ao Concierge',
+ },
},
allSettingsScreen: {
subscription: 'Assinatura',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index e09675eb46e..7d20a7f71c7 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -1047,6 +1047,13 @@ const translations: TranslationDeepObject<typeof en> = {
seeMore: ({count}: {count: number}) => `再查看 ${count} 个`,
recentlyAddedSection: {title: '最近添加', viewAll: '查看所有报销费用', emptyStateTitle: '最近没有报销记录', emptyStateMessage: '创建一个或将收据拖到这里'},
insightsSection: {chartUnavailable: '图表不可用', notEnoughData: '我们目前没有足够的数据来填充此图表'},
+ conciergePrompt: {
+ goodMorning: ({name}: {name?: string}) => (name ? `早上好,${name}。` : '早上好。'),
+ goodAfternoon: ({name}: {name?: string}) => (name ? `下午好,${name}。` : '下午好。'),
+ goodEvening: ({name}: {name?: string}) => (name ? `晚上好,${name}。` : '晚上好。'),
+ inputPlaceholder: '向 Concierge 请求分析你的报销或获取支持',
+ inputPlaceholderMobile: '向 Concierge 提问任何问题',
+ },
},
allSettingsScreen: {
subscription: '订阅',
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
|
🚧 dubielzyk-expensify has triggered a test Expensify/App build. You can view the workflow run here. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|

Explanation of Change
Fixed Issues
$ #94497
PROPOSAL:
Tests
Offline tests
QA Steps
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectionAvatar, 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.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: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari
Screen.Recording.2026-08-11.at.19.05.17.mov