Skip to content

Commit b605b7a

Browse files
xuyushun441-syshotlongclaude
authored
fix(marketplace): add missing sample-data i18n keys; surface reseed errors (#1881)
The package-detail "more options" dropdown rendered raw i18n keys (`marketplace.detail.addSampleData`, `…purgeSampleData`, …) because those keys were never added to any locale bundle. `t()` returns the key string on a miss (truthy), so the `t(...) || 'fallback'` pattern never fired — the menu showed `marketplace.detail.addSamp…` instead of "Add sample data". Only `uninstallFromRuntime` (which existed) rendered correctly. - Add the 10 missing `marketplace.detail.*` keys to all 10 locales (en/zh/ja/ko/ar/de/es/fr/pt/ru) with native translations: addSampleData, reseedAgain, purgeSampleData, purgeConfirm, purgeSuccess, purgeNoData, reseedQueued, reseedLocalSuccess, updateAvailable, reseedPartialErrors. - Local reseed: when the server reports rows landed but some errored (partial), show the failure count instead of a plain success toast. Hard failures (server now returns 422 on 0 rows — framework fix/reseed-honest-result) already surface via the existing catch. Co-authored-by: Jack Zhuang <zhuangjianguo@gmail.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 5ab52c0 commit b605b7a

11 files changed

Lines changed: 109 additions & 5 deletions

File tree

packages/app-shell/src/console/marketplace/MarketplacePackagePage.tsx

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -431,11 +431,15 @@ export function MarketplacePackagePage() {
431431
));
432432
const inserted = r.inserted ?? 0;
433433
const updated = r.updated ?? 0;
434-
setSampleDataMsg({
435-
ok: true,
436-
text: t('marketplace.detail.reseedLocalSuccess', { inserted, updated })
437-
|| `Sample data re-seeded (inserted=${inserted}, updated=${updated}).`,
438-
});
434+
const errored = r.errors ?? 0;
435+
const base = t('marketplace.detail.reseedLocalSuccess', { inserted, updated })
436+
|| `Sample data re-seeded (inserted=${inserted}, updated=${updated}).`;
437+
// A reseed can land some rows and fail others (the server only hard-fails
438+
// when ZERO rows write). Don't hide the partial failures behind a green
439+
// success toast — flag them so the user knows the data is incomplete.
440+
setSampleDataMsg(errored > 0
441+
? { ok: false, text: `${base} ${t('marketplace.detail.reseedPartialErrors', { count: errored }) || `(${errored} record(s) failed to write)`}` }
442+
: { ok: true, text: base });
439443
} catch (err: any) {
440444
setSampleDataMsg({ ok: false, text: err?.message || 'Re-seed failed' });
441445
} finally {

packages/i18n/src/locales/ar.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1720,6 +1720,16 @@ const ar = {
17201720
prerelease: "ما قبل الإصدار",
17211721
moreOptions: "مزيد من خيارات التثبيت",
17221722
uninstallFromRuntime: "إلغاء التثبيت من هذا الوقت التشغيل",
1723+
addSampleData: 'إضافة بيانات تجريبية',
1724+
reseedAgain: 'إعادة تحميل البيانات التجريبية',
1725+
purgeSampleData: 'حذف البيانات التجريبية',
1726+
purgeConfirm: 'حذف جميع السجلات التجريبية التي أنشأتها هذه الحزمة؟ لن تتأثر السجلات التي أضافها المستخدم.',
1727+
purgeSuccess: 'تم حذف {{count}} سجل تجريبي.',
1728+
purgeNoData: 'لا توجد سجلات تجريبية للحذف.',
1729+
reseedQueued: 'ستتم إعادة تحميل البيانات التجريبية عند الوصول التالي إلى البيئة.',
1730+
reseedLocalSuccess: 'تمت إعادة تحميل البيانات التجريبية: {{inserted}} مضافة، {{updated}} محدثة.',
1731+
reseedPartialErrors: '(فشل في كتابة {{count}} سجل)',
1732+
updateAvailable: 'يتوفر تحديث',
17231733
},
17241734
action: {
17251735
install: "تثبيت",

packages/i18n/src/locales/de.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1720,6 +1720,16 @@ const de = {
17201720
prerelease: "Vorab",
17211721
moreOptions: "Weitere Installationsoptionen",
17221722
uninstallFromRuntime: "Aus diesem Laufzeitsystem deinstallieren",
1723+
addSampleData: 'Beispieldaten hinzufügen',
1724+
reseedAgain: 'Beispieldaten neu laden',
1725+
purgeSampleData: 'Beispieldaten löschen',
1726+
purgeConfirm: 'Alle von diesem Paket erzeugten Beispieldatensätze löschen? Vom Benutzer hinzugefügte Datensätze bleiben unberührt.',
1727+
purgeSuccess: '{{count}} Beispieldatensatz/-sätze entfernt.',
1728+
purgeNoData: 'Keine Beispieldatensätze zum Löschen gefunden.',
1729+
reseedQueued: 'Beispieldaten werden beim nächsten Zugriff auf die Umgebung neu geladen.',
1730+
reseedLocalSuccess: 'Beispieldaten neu geladen: {{inserted}} hinzugefügt, {{updated}} aktualisiert.',
1731+
reseedPartialErrors: '({{count}} Datensatz/-sätze konnten nicht geschrieben werden)',
1732+
updateAvailable: 'Update verfügbar',
17231733
},
17241734
action: {
17251735
install: "Installieren",

packages/i18n/src/locales/en.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2001,6 +2001,16 @@ const en = {
20012001
prerelease: 'pre',
20022002
moreOptions: 'More install options',
20032003
uninstallFromRuntime: 'Uninstall from this runtime',
2004+
addSampleData: 'Add sample data',
2005+
reseedAgain: 'Re-seed sample data',
2006+
purgeSampleData: 'Purge sample data',
2007+
purgeConfirm: 'Delete all sample records seeded by this package? User-added records will NOT be touched.',
2008+
purgeSuccess: 'Removed {{count}} sample record(s).',
2009+
purgeNoData: 'No sample records found to purge.',
2010+
reseedQueued: 'Sample data will be re-seeded on next environment access.',
2011+
reseedLocalSuccess: 'Re-seeded sample data: {{inserted}} inserted, {{updated}} updated.',
2012+
reseedPartialErrors: '({{count}} record(s) failed to write)',
2013+
updateAvailable: 'Update available',
20042014
},
20052015
action: {
20062016
install: 'Install',

packages/i18n/src/locales/es.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1720,6 +1720,16 @@ const es = {
17201720
prerelease: "Prelanzamiento",
17211721
moreOptions: "Más opciones de instalación",
17221722
uninstallFromRuntime: "Desinstalar de este runtime",
1723+
addSampleData: 'Agregar datos de ejemplo',
1724+
reseedAgain: 'Volver a cargar datos de ejemplo',
1725+
purgeSampleData: 'Eliminar datos de ejemplo',
1726+
purgeConfirm: '¿Eliminar todos los registros de ejemplo creados por este paquete? Los registros añadidos por el usuario NO se verán afectados.',
1727+
purgeSuccess: 'Se eliminaron {{count}} registro(s) de ejemplo.',
1728+
purgeNoData: 'No se encontraron registros de ejemplo para eliminar.',
1729+
reseedQueued: 'Los datos de ejemplo se volverán a cargar en el próximo acceso al entorno.',
1730+
reseedLocalSuccess: 'Datos de ejemplo recargados: {{inserted}} insertados, {{updated}} actualizados.',
1731+
reseedPartialErrors: '({{count}} registro(s) no se pudieron escribir)',
1732+
updateAvailable: 'Actualización disponible',
17231733
},
17241734
action: {
17251735
install: "Instalar",

packages/i18n/src/locales/fr.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1720,6 +1720,16 @@ const fr = {
17201720
prerelease: "Prélancement",
17211721
moreOptions: "Plus d'options d'installation",
17221722
uninstallFromRuntime: "Désinstaller de ce runtime",
1723+
addSampleData: 'Ajouter des données d\'exemple',
1724+
reseedAgain: 'Recharger les données d\'exemple',
1725+
purgeSampleData: 'Supprimer les données d\'exemple',
1726+
purgeConfirm: 'Supprimer tous les enregistrements d\'exemple créés par ce paquet ? Les enregistrements ajoutés par l\'utilisateur ne seront PAS touchés.',
1727+
purgeSuccess: '{{count}} enregistrement(s) d\'exemple supprimé(s).',
1728+
purgeNoData: 'Aucun enregistrement d\'exemple à supprimer.',
1729+
reseedQueued: 'Les données d\'exemple seront rechargées au prochain accès à l\'environnement.',
1730+
reseedLocalSuccess: 'Données d\'exemple rechargées : {{inserted}} ajoutés, {{updated}} mis à jour.',
1731+
reseedPartialErrors: '({{count}} enregistrement(s) n\'ont pas pu être écrits)',
1732+
updateAvailable: 'Mise à jour disponible',
17231733
},
17241734
action: {
17251735
install: "Installer",

packages/i18n/src/locales/ja.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1720,6 +1720,16 @@ const ja = {
17201720
prerelease: "プレ",
17211721
moreOptions: "その他のインストールオプション",
17221722
uninstallFromRuntime: "このランタイムからアンインストール",
1723+
addSampleData: 'サンプルデータを追加',
1724+
reseedAgain: 'サンプルデータを再投入',
1725+
purgeSampleData: 'サンプルデータを削除',
1726+
purgeConfirm: 'このパッケージが投入したサンプルレコードをすべて削除しますか?ユーザーが追加したレコードは削除されません。',
1727+
purgeSuccess: '{{count}} 件のサンプルレコードを削除しました。',
1728+
purgeNoData: '削除するサンプルレコードがありません。',
1729+
reseedQueued: 'サンプルデータは次回の環境アクセス時に再投入されます。',
1730+
reseedLocalSuccess: 'サンプルデータを再投入しました:{{inserted}} 件追加、{{updated}} 件更新。',
1731+
reseedPartialErrors: '({{count}} 件のレコードの書き込みに失敗しました)',
1732+
updateAvailable: 'アップデートあり',
17231733
},
17241734
action: {
17251735
install: "インストール",

packages/i18n/src/locales/ko.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1720,6 +1720,16 @@ const ko = {
17201720
prerelease: "프리릴리즈",
17211721
moreOptions: "추가 설치 옵션",
17221722
uninstallFromRuntime: "이 런타임에서 제거",
1723+
addSampleData: '샘플 데이터 추가',
1724+
reseedAgain: '샘플 데이터 다시 적재',
1725+
purgeSampleData: '샘플 데이터 삭제',
1726+
purgeConfirm: '이 패키지가 생성한 모든 샘플 레코드를 삭제하시겠습니까? 사용자가 추가한 레코드는 삭제되지 않습니다.',
1727+
purgeSuccess: '샘플 레코드 {{count}}개를 삭제했습니다.',
1728+
purgeNoData: '삭제할 샘플 레코드가 없습니다.',
1729+
reseedQueued: '샘플 데이터는 다음 환경 접속 시 다시 적재됩니다.',
1730+
reseedLocalSuccess: '샘플 데이터를 다시 적재했습니다: {{inserted}}개 추가, {{updated}}개 업데이트.',
1731+
reseedPartialErrors: '({{count}}개 레코드 쓰기 실패)',
1732+
updateAvailable: '업데이트 가능',
17231733
},
17241734
action: {
17251735
install: "설치",

packages/i18n/src/locales/pt.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1720,6 +1720,16 @@ const pt = {
17201720
prerelease: "Pré-lançamento",
17211721
moreOptions: "Mais opções de instalação",
17221722
uninstallFromRuntime: "Desinstalar deste runtime",
1723+
addSampleData: 'Adicionar dados de exemplo',
1724+
reseedAgain: 'Recarregar dados de exemplo',
1725+
purgeSampleData: 'Remover dados de exemplo',
1726+
purgeConfirm: 'Excluir todos os registros de exemplo criados por este pacote? Os registros adicionados pelo usuário NÃO serão afetados.',
1727+
purgeSuccess: '{{count}} registro(s) de exemplo removido(s).',
1728+
purgeNoData: 'Nenhum registro de exemplo encontrado para remover.',
1729+
reseedQueued: 'Os dados de exemplo serão recarregados no próximo acesso ao ambiente.',
1730+
reseedLocalSuccess: 'Dados de exemplo recarregados: {{inserted}} inseridos, {{updated}} atualizados.',
1731+
reseedPartialErrors: '({{count}} registro(s) não puderam ser gravados)',
1732+
updateAvailable: 'Atualização disponível',
17231733
},
17241734
action: {
17251735
install: "Instalar",

packages/i18n/src/locales/ru.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1720,6 +1720,16 @@ const ru = {
17201720
prerelease: "Пред-релиз",
17211721
moreOptions: "Другие варианты установки",
17221722
uninstallFromRuntime: "Удалить из рантайма",
1723+
addSampleData: 'Добавить демоданные',
1724+
reseedAgain: 'Перезагрузить демоданные',
1725+
purgeSampleData: 'Удалить демоданные',
1726+
purgeConfirm: 'Удалить все демонстрационные записи, созданные этим пакетом? Записи, добавленные пользователем, НЕ будут затронуты.',
1727+
purgeSuccess: 'Удалено демонстрационных записей: {{count}}.',
1728+
purgeNoData: 'Демонстрационные записи для удаления не найдены.',
1729+
reseedQueued: 'Демоданные будут перезагружены при следующем доступе к среде.',
1730+
reseedLocalSuccess: 'Демоданные перезагружены: добавлено {{inserted}}, обновлено {{updated}}.',
1731+
reseedPartialErrors: '(не удалось записать записей: {{count}})',
1732+
updateAvailable: 'Доступно обновление',
17231733
},
17241734
action: {
17251735
install: "Установить",

0 commit comments

Comments
 (0)