feat(plugin-market): align recommendation carousel with Space (pause + countdown ring)

Port the Space marketplace recommendation carousel UX into the in-app
add-extension page: a 10s auto-advance driven by a smooth countdown ring
that doubles as a pause/resume toggle, and manual prev/next now reset the
countdown. Adds market.recommendation.{pause,resume} across 8 locales.
This commit is contained in:
RockChinQ
2026-06-21 11:48:39 -04:00
parent 42a2c70b14
commit 9daf22d661
9 changed files with 154 additions and 11 deletions
+4
View File
@@ -674,6 +674,10 @@ const enUS = {
installFailed: 'Installation failed, please try again later',
loadFailed: 'Failed to get plugin list, please try again later',
noDescription: 'No description available',
recommendation: {
pause: 'Pause auto-rotation',
resume: 'Resume auto-rotation',
},
notFound: 'Plugin information not found',
sortBy: 'Sort by',
sort: {
+4
View File
@@ -687,6 +687,10 @@ const esES = {
loadFailed:
'Error al obtener la lista de plugins, por favor inténtalo más tarde',
noDescription: 'No hay descripción disponible',
recommendation: {
pause: 'Pausar rotación automática',
resume: 'Reanudar rotación automática',
},
notFound: 'No se encontró la información del plugin',
sortBy: 'Ordenar por',
sort: {
+6 -1
View File
@@ -680,6 +680,10 @@ const jaJP = {
loadFailed:
'プラグインリストの取得に失敗しました。後でもう一度お試しください',
noDescription: '説明がありません',
recommendation: {
pause: '自動ローテーションを一時停止',
resume: '自動ローテーションを再開',
},
notFound: 'プラグイン情報が見つかりません',
sortBy: '並び順',
sort: {
@@ -761,7 +765,8 @@ const jaJP = {
http: 'HTTPモード',
local: 'ローカル(Stdio',
remote: 'リモート',
localModeDescription: 'Box サンドボックス内でサブプロセスとして MCP サーバーをローカル実行します。',
localModeDescription:
'Box サンドボックス内でサブプロセスとして MCP サーバーをローカル実行します。',
remoteModeDescription:
'URL でリモート MCP サーバーに接続します。トランスポート(Streamable HTTP または SSE)は自動検出されます。',
remoteUrlPlaceholder: 'https://example.com/mcp',
+4
View File
@@ -685,6 +685,10 @@ const ruRU = {
installFailed: 'Ошибка установки, попробуйте позже',
loadFailed: 'Не удалось получить список плагинов, попробуйте позже',
noDescription: 'Описание отсутствует',
recommendation: {
pause: 'Приостановить авто-прокрутку',
resume: 'Возобновить авто-прокрутку',
},
notFound: 'Информация о плагине не найдена',
sortBy: 'Сортировать по',
sort: {
+4
View File
@@ -664,6 +664,10 @@ const thTH = {
installFailed: 'ติดตั้งล้มเหลว กรุณาลองใหม่ภายหลัง',
loadFailed: 'ไม่สามารถดึงรายการปลั๊กอินได้ กรุณาลองใหม่ภายหลัง',
noDescription: 'ไม่มีคำอธิบาย',
recommendation: {
pause: 'หยุดการหมุนอัตโนมัติชั่วคราว',
resume: 'เล่นการหมุนอัตโนมัติต่อ',
},
notFound: 'ไม่พบข้อมูลปลั๊กอิน',
sortBy: 'เรียงตาม',
sort: {
+4
View File
@@ -679,6 +679,10 @@ const viVN = {
installFailed: 'Cài đặt thất bại, vui lòng thử lại sau',
loadFailed: 'Lấy danh sách plugin thất bại, vui lòng thử lại sau',
noDescription: 'Không có mô tả',
recommendation: {
pause: 'Tạm dừng tự động xoay',
resume: 'Tiếp tục tự động xoay',
},
notFound: 'Không tìm thấy thông tin plugin',
sortBy: 'Sắp xếp theo',
sort: {
+4
View File
@@ -643,6 +643,10 @@ const zhHans = {
installFailed: '安装失败,请稍后重试',
loadFailed: '获取插件列表失败,请稍后重试',
noDescription: '暂无描述',
recommendation: {
pause: '暂停自动轮播',
resume: '继续自动轮播',
},
notFound: '插件信息未找到',
sortBy: '排序方式',
sort: {
+4
View File
@@ -643,6 +643,10 @@ const zhHant = {
installFailed: '安裝失敗,請稍後重試',
loadFailed: '取得插件列表失敗,請稍後重試',
noDescription: '暫無描述',
recommendation: {
pause: '暫停自動輪播',
resume: '繼續自動輪播',
},
notFound: '插件資訊未找到',
sortBy: '排序方式',
sort: {