Skip to content

fix: 修复管理后台多处交互失效与布局问题#4703

Open
hamwong233 wants to merge 10 commits intoQuantumNous:mainfrom
hamwong233:main
Open

fix: 修复管理后台多处交互失效与布局问题#4703
hamwong233 wants to merge 10 commits intoQuantumNous:mainfrom
hamwong233:main

Conversation

@hamwong233
Copy link
Copy Markdown

@hamwong233 hamwong233 commented May 8, 2026

⚠️ 提交说明 / PR Notice

Important

  • 请提供人工撰写的简洁摘要,避免直接粘贴未经整理的 AI 输出。

📝 变更描述 / Description

本 PR 修复了默认前端管理后台中多处点击无响应、保存无效和布局显示异常的问题。

主要变更包括:

  • 修复渠道复制成功后弹窗不关闭、列表不刷新的问题。
  • 修复模型定价页“保存模型价格”按钮未正确触发保存逻辑的问题。
  • 修复渠道管理页单个渠道删除按钮点击无响应的问题。
  • 修复左侧“聊天”下拉项名称过长时换行溢出的问题,改为单行截断显示。
  • 将订阅套餐编辑中的“总额度”调整为“到账金额”,减少管理员手动换算成本。
  • 修复 API 密钥编辑页点击“保存更改”无响应的问题,确保表单提交能正确触发更新请求。
  • 优化订阅套餐表单布局,对齐实付金额、到账金额、启用状态、排序、升级分组、有效期单位、重置周期等控件。
  • 修复用户列表“管理绑定 / 管理订阅”菜单点击无响应的问题。原因是当前菜单组件基于 Base UI,菜单项应使用 onClick,原实现使用了不
    匹配的 onSelect
  • 补充用户订阅管理抽屉主体区域 padding,避免内容贴边。

这些修改主要集中在管理后台交互入口、表单提交绑定和表单布局样式上,不改变核心业务模型。

🚀 变更类型 / Type of change

  • 🐛 Bug 修复 (Bug fix) - 请关联对应 Issue,避免将设计取舍、理解偏差或预期不一致直接归类为 bug
  • ✨ 新功能 (New feature) - 重大特性建议先通过 Issue 沟通
  • ⚡ 性能优化 / 重构 (Refactor)
  • 📝 文档更新 (Documentation)

🔗 关联任务 / Related Issue

  • Closes # (如有)

✅ 提交前检查项 / Checklist

  • 人工确认: 我已亲自整理并撰写此描述,没有直接粘贴未经处理的 AI 输出。
  • 非重复提交: 我已搜索现有的 Issues 与 [PRs](https://github.com/
    QuantumNous/new-api/pulls),确认不是重复提交。
  • Bug fix 说明: 若此 PR 标记为 Bug fix,我已提交或关联对应 Issue,且不会将设计取舍、预期不一致或理解偏差直接归类为
    bug。
  • 变更理解: 我已理解这些更改的工作原理及可能影响。
  • 范围聚焦: 本 PR 未包含任何与当前任务无关的代码改动。
  • 本地验证: 已在本地运行并通过测试或手动验证,维护者可以据此复核结果。
  • 安全合规: 代码中无敏感凭据,且符合项目代码规范。

📸 运行证明 / Proof of Work

已在本地对相关前端修改运行检查:

bunx prettier --check ...
bunx tsc -p tsconfig.json --noEmit
git diff --check

关键交互已按问题路径完成修复验证:

渠道复制:复制成功后关闭弹窗并刷新列表
渠道删除:单个渠道删除按钮可触发删除确认/请求
模型定价:保存按钮已绑定提交逻辑
API 密钥编辑:保存更改可触发表单提交
用户列表更多菜单:管理绑定/管理订阅可打开对应弹窗
订阅管理:到账金额展示与编辑、表单布局和抽屉 padding 已调整
聊天菜单:长名称单行截断,不再换行溢出

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

* **New Features**
* Return cloned channel ID after copy and initialize channel cache.
* Added credited-amount handling with quota/dollar conversions.

* **Bug Fixes**
* More explicit success/error handling for channel copy and API key flows.
* Prevent state updates after unmount during API key edits.

* **Improvements**
* Deletion progress indicators and improved confirm dialogs.
* Better menu item layout/truncation and dialog click behavior.
* Visual/save UX tweaks for model ratios and subscription forms.

* **Localization**
* Added/updated translations ( Credited Amount, Copying..., Payment, reset email, search hints, billing text ).
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 8, 2026

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 35a06aae-fa63-4929-8454-4738668b0ef3

📥 Commits

Reviewing files that changed from the base of the PR and between c967344 and 0ae01fa.

📒 Files selected for processing (9)
  • web/default/src/features/auth/forgot-password/components/forgot-password-form.tsx
  • web/default/src/features/channels/components/dialogs/copy-channel-dialog.tsx
  • web/default/src/features/wallet/components/dialogs/billing-history-dialog.tsx
  • web/default/src/i18n/locales/en.json
  • web/default/src/i18n/locales/fr.json
  • web/default/src/i18n/locales/ja.json
  • web/default/src/i18n/locales/ru.json
  • web/default/src/i18n/locales/vi.json
  • web/default/src/i18n/locales/zh.json
✅ Files skipped from review due to trivial changes (6)
  • web/default/src/features/channels/components/dialogs/copy-channel-dialog.tsx
  • web/default/src/i18n/locales/en.json
  • web/default/src/i18n/locales/fr.json
  • web/default/src/i18n/locales/ja.json
  • web/default/src/i18n/locales/zh.json
  • web/default/src/i18n/locales/vi.json
🚧 Files skipped from review as they are similar to previous changes (1)
  • web/default/src/i18n/locales/ru.json

Walkthrough

Refactors channel copy persistence, adds quota↔dollar conversions and credited-amount UI, standardizes form/dialog interaction patterns, tightens layout/truncation, and adds related i18n strings across multiple locales.

Changes

Multi-faceted System Updates: Subscriptions, Forms, and Backend Improvements

Layer / File(s) Summary
Backend Persistence
controller/channel.go
Channel copy now uses direct clone.Insert() and initializes channel cache; response returns cloned channel ID via common.ApiSuccess.
Data Transformations
web/default/src/features/subscriptions/lib/plan-form.ts, web/default/src/features/subscriptions/components/subscriptions-columns.tsx
Plan form converts total_amount between quota units and formatted dollars; subscription columns render credited amount via formatQuota.
Subscription Form UI
web/default/src/features/subscriptions/components/subscriptions-mutate-drawer.tsx
Currency-aware credited-amount input with dynamic step/placeholder, computed "Raw Quota" helper, enabled-status layout change, and select trigger width fixes.
Layout Refinements
web/default/src/components/layout/components/chat-presets-item.tsx, web/default/src/features/subscriptions/components/dialogs/user-subscriptions-dialog.tsx, web/default/src/features/system-settings/models/ratio-settings-card.tsx
Chat preset names wrapped in truncating flex spans; dialog spacing adjusted to space-y-4 px-4 pb-4; ratio save short-circuits when no changes.
Form & Dialog Interactions
web/default/src/features/keys/components/api-keys-mutate-drawer.tsx, web/default/src/features/channels/components/data-table-row-actions.tsx, web/default/src/features/users/components/data-table-row-actions.tsx, web/default/src/features/system-settings/models/model-ratio-form.tsx
API keys form adds onInvalidSubmit and cancellation-safe loading; menu entries switched from onSelect to onClick; delete confirm tracks isDeleting; visual-mode Save uses explicit handler.
Client Handlers
web/default/src/features/channels/lib/channel-actions.ts
handleCopyChannel treats success by response.success, shows toast, invalidates queries, and calls onSuccess(response.data?.id ?? 0); non-success shows error toast with response.message.
Internationalization
web/default/src/i18n/locales/*.json
Added translation keys (e.g., Copying..., Credited Amount, Payment, Send reset email, Try adjusting your search, Your transaction history will appear here) across en/fr/ja/ru/vi/zh locales and routed several dialog strings through i18n.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • seefs001
  • creamlike1024

Poem

🐰 A rabbit copies channels with care,
tweaks forms so quotas show fair,
clicks now open dialogs with grace,
truncating labels stay in place,
in six tongues the UI finds its pace.

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 28.57% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title is in Chinese and describes multiple unrelated fixes across UI, layout, and interaction issues, making it difficult to identify a single primary change. Consider using English and focusing the title on one primary change, or use a more structured prefix (e.g., 'fix: multiple UI and interaction fixes' with details in the description).
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (4)
web/default/src/components/layout/components/chat-presets-item.tsx (1)

64-66: 💤 Low value

whitespace-nowrap is redundant alongside truncate

Tailwind's truncate utility already compiles to overflow: hidden; text-overflow: ellipsis; white-space: nowrap, so the explicit whitespace-nowrap class on all four <span> wrappers is a no-op.

♻️ Proposed cleanup (same pattern applies to all four spans)
-<span className='min-w-0 flex-1 truncate whitespace-nowrap'>
+<span className='min-w-0 flex-1 truncate'>

Also applies to: 82-84, 113-115, 128-130

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/default/src/components/layout/components/chat-presets-item.tsx` around
lines 64 - 66, In the ChatPresetsItem component remove redundant Tailwind
classes: delete the explicit "whitespace-nowrap" on the span wrappers (the one
wrapping {preset.name} and the other three spans referenced in the review)
because "truncate" already sets white-space: nowrap; update the JSX in
chat-presets-item.tsx to keep "min-w-0 flex-1 truncate" (and similarly remove
"whitespace-nowrap" from the spans at the other locations mentioned) so the UI
behavior is unchanged but the class list is cleaned up.
web/default/src/i18n/locales/vi.json (1)

1005-1005: 🏗️ Heavy lift

Use a hierarchical i18n key instead of a raw UI string key

Line 1005 introduces a literal key ("Credited Amount"). Please switch to a semantic hierarchical key (for example, subscriptions.plan.creditedAmount) and keep it aligned across locale files/usages.

As per coding guidelines, "Use hierarchical and semantically clear translation key names such as dashboard.overview.title and maintain naming consistency".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/default/src/i18n/locales/vi.json` at line 1005, Replace the literal
translation key "Credited Amount" with a hierarchical semantic key (for example
subscriptions.plan.creditedAmount) in this vi.json entry and update all
corresponding locale files and UI usages to reference that new key instead of
the raw UI string; ensure the new key is added to other locale JSONs with the
same structure and that components or code using "Credited Amount" (search for
the string or exact key) are changed to use subscriptions.plan.creditedAmount so
translations stay consistent.
web/default/src/i18n/locales/ru.json (1)

1005-1005: 🏗️ Heavy lift

Use a hierarchical i18n key for this new entry

Line 1005 adds a flat text key ("Credited Amount"), which breaks the required hierarchical key convention for this directory. Please rename it to a semantic key (for example, subscriptions.plan.creditedAmount) and update call sites/locales consistently.

As per coding guidelines: web/default/src/i18n/**/*.{ts,tsx,json}: Use hierarchical and semantically clear translation key names such as dashboard.overview.title and maintain naming consistency.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/default/src/i18n/locales/ru.json` at line 1005, The JSON added a flat
translation key "Credited Amount" which violates the hierarchical i18n key
convention; rename the key to a semantic hierarchical key (for example
subscriptions.plan.creditedAmount), replace the "Credited Amount" entry in this
locale with subscriptions.plan.creditedAmount: "Зачисляемая сумма", and update
all call sites that reference "Credited Amount" to use the new key (e.g.,
t('subscriptions.plan.creditedAmount')); also propagate the same hierarchical
key and value to other locale files to keep locales consistent.
web/default/src/features/channels/lib/channel-actions.ts (1)

238-248: 💤 Low value

Consider extracting the duplicate error string into ERROR_MESSAGES.

'Failed to copy channel' appears literally on both lines 243 and 246, while every other handler in this file delegates to a constant (e.g., ERROR_MESSAGES.DELETE_FAILED, ERROR_MESSAGES.UPDATE_FAILED). Adding a COPY_FAILED key keeps the error strings manageable in one place and consistent with i18n key tracking.

♻️ Proposed refactor

In ../constants (or wherever ERROR_MESSAGES is defined):

 export const ERROR_MESSAGES = {
+  COPY_FAILED: 'Failed to copy channel',
   DELETE_FAILED: '...',
   // ...
 }

Then in handleCopyChannel:

-    } else {
-      toast.error(response.message || i18next.t('Failed to copy channel'))
-    }
+    } else {
+      toast.error(response.message || i18next.t(ERROR_MESSAGES.COPY_FAILED))
+    }
   } catch (_error) {
-    toast.error(i18next.t('Failed to copy channel'))
+    toast.error(i18next.t(ERROR_MESSAGES.COPY_FAILED))
   }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/default/src/features/channels/lib/channel-actions.ts` around lines 238 -
248, The duplicated literal i18n key 'Failed to copy channel' in
handleCopyChannel should be moved into the shared ERROR_MESSAGES constant (add
ERROR_MESSAGES.COPY_FAILED) and then replace both literal usages in
handleCopyChannel with toast.error(i18next.t(ERROR_MESSAGES.COPY_FAILED)) (and
use ERROR_MESSAGES.COPY_FAILED for the fallback in the catch). Update imports if
necessary so handleCopyChannel references ERROR_MESSAGES; keep
SUCCESS_MESSAGES.COPIED and queryClient logic unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@web/default/src/features/subscriptions/components/subscriptions-mutate-drawer.tsx`:
- Around line 199-206: The per-keystroke numeric coercion using parseFloat(... )
|| 0 in the Input onChange is dropping intermediate decimal states (e.g.
"1.")—replace field.onChange(parseFloat(e.target.value) || 0) with
field.onChange(e.target.value) (pass the raw string) so the input can represent
intermediate values; perform parsing/validation to a Number only on blur or form
submit (or in the form controller's value-to-model transform) so components like
Input and the form field’s onBlur/submit handler convert the string to a float
once instead of coercing every keystroke; apply the same change to the other
occurrence that uses parseFloat in this component.

In `@web/default/src/i18n/locales/zh.json`:
- Line 1005: Replace the flat English key "Credited Amount" in the zh.json
locale with a semantic hierarchical key like "subscriptions.plan.creditedAmount"
(keeping the value "到账金额"), then update all call sites that currently reference
the literal key "Credited Amount" to use the new key
"subscriptions.plan.creditedAmount" (search for usages in code that call i18n.t
or similar helpers), and mirror the same key change across other locale files so
all locales remain consistent.

---

Nitpick comments:
In `@web/default/src/components/layout/components/chat-presets-item.tsx`:
- Around line 64-66: In the ChatPresetsItem component remove redundant Tailwind
classes: delete the explicit "whitespace-nowrap" on the span wrappers (the one
wrapping {preset.name} and the other three spans referenced in the review)
because "truncate" already sets white-space: nowrap; update the JSX in
chat-presets-item.tsx to keep "min-w-0 flex-1 truncate" (and similarly remove
"whitespace-nowrap" from the spans at the other locations mentioned) so the UI
behavior is unchanged but the class list is cleaned up.

In `@web/default/src/features/channels/lib/channel-actions.ts`:
- Around line 238-248: The duplicated literal i18n key 'Failed to copy channel'
in handleCopyChannel should be moved into the shared ERROR_MESSAGES constant
(add ERROR_MESSAGES.COPY_FAILED) and then replace both literal usages in
handleCopyChannel with toast.error(i18next.t(ERROR_MESSAGES.COPY_FAILED)) (and
use ERROR_MESSAGES.COPY_FAILED for the fallback in the catch). Update imports if
necessary so handleCopyChannel references ERROR_MESSAGES; keep
SUCCESS_MESSAGES.COPIED and queryClient logic unchanged.

In `@web/default/src/i18n/locales/ru.json`:
- Line 1005: The JSON added a flat translation key "Credited Amount" which
violates the hierarchical i18n key convention; rename the key to a semantic
hierarchical key (for example subscriptions.plan.creditedAmount), replace the
"Credited Amount" entry in this locale with subscriptions.plan.creditedAmount:
"Зачисляемая сумма", and update all call sites that reference "Credited Amount"
to use the new key (e.g., t('subscriptions.plan.creditedAmount')); also
propagate the same hierarchical key and value to other locale files to keep
locales consistent.

In `@web/default/src/i18n/locales/vi.json`:
- Line 1005: Replace the literal translation key "Credited Amount" with a
hierarchical semantic key (for example subscriptions.plan.creditedAmount) in
this vi.json entry and update all corresponding locale files and UI usages to
reference that new key instead of the raw UI string; ensure the new key is added
to other locale JSONs with the same structure and that components or code using
"Credited Amount" (search for the string or exact key) are changed to use
subscriptions.plan.creditedAmount so translations stay consistent.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a6de7143-d109-4a5f-ab36-d69e82d11ca3

📥 Commits

Reviewing files that changed from the base of the PR and between 560ba57 and c967344.

📒 Files selected for processing (18)
  • controller/channel.go
  • web/default/src/components/layout/components/chat-presets-item.tsx
  • web/default/src/features/channels/components/data-table-row-actions.tsx
  • web/default/src/features/channels/lib/channel-actions.ts
  • web/default/src/features/keys/components/api-keys-mutate-drawer.tsx
  • web/default/src/features/subscriptions/components/dialogs/user-subscriptions-dialog.tsx
  • web/default/src/features/subscriptions/components/subscriptions-columns.tsx
  • web/default/src/features/subscriptions/components/subscriptions-mutate-drawer.tsx
  • web/default/src/features/subscriptions/lib/plan-form.ts
  • web/default/src/features/system-settings/models/model-ratio-form.tsx
  • web/default/src/features/system-settings/models/ratio-settings-card.tsx
  • web/default/src/features/users/components/data-table-row-actions.tsx
  • web/default/src/i18n/locales/en.json
  • web/default/src/i18n/locales/fr.json
  • web/default/src/i18n/locales/ja.json
  • web/default/src/i18n/locales/ru.json
  • web/default/src/i18n/locales/vi.json
  • web/default/src/i18n/locales/zh.json

Comment on lines +199 to +206
<Input
{...field}
type='number'
step='0.01'
min={0}
onChange={(e) =>
field.onChange(parseFloat(e.target.value) || 0)
}
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.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Decimal entry is broken by per-keystroke numeric coercion.

At Line 205 and Line 239, converting input text with parseFloat(... ) || 0 on every change drops intermediate states (like 1.), making decimal typing unreliable for money fields.

💡 Suggested fix
                           <Input
                             {...field}
                             type='number'
                             step='0.01'
                             min={0}
-                            onChange={(e) =>
-                              field.onChange(parseFloat(e.target.value) || 0)
-                            }
                           />
                           <Input
                             {...field}
                             type='number'
                             step={tokensOnly ? 1 : 0.01}
                             min={0}
                             placeholder={
                               tokensOnly
                                 ? t('Enter quota in tokens')
                                 : t('Enter quota in {{currency}}', {
                                     currency: currencyLabel,
                                   })
                             }
-                            onChange={(e) =>
-                              field.onChange(parseFloat(e.target.value) || 0)
-                            }
                           />

Also applies to: 226-240

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@web/default/src/features/subscriptions/components/subscriptions-mutate-drawer.tsx`
around lines 199 - 206, The per-keystroke numeric coercion using parseFloat(...
) || 0 in the Input onChange is dropping intermediate decimal states (e.g.
"1.")—replace field.onChange(parseFloat(e.target.value) || 0) with
field.onChange(e.target.value) (pass the raw string) so the input can represent
intermediate values; perform parsing/validation to a Number only on blur or form
submit (or in the form controller's value-to-model transform) so components like
Input and the form field’s onBlur/submit handler convert the string to a float
once instead of coercing every keystroke; apply the same change to the other
occurrence that uses parseFloat in this component.

"Create, revoke, and audit API tokens.": "创建、撤销和审计 API 令牌。",
"Created": "创建时间",
"Created At": "创建时间",
"Credited Amount": "到账金额",
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.

🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick win

Use a semantic i18n key instead of an English sentence key.

Please switch this new key to a hierarchical identifier (for example, subscriptions.plan.creditedAmount) and update its call sites accordingly to keep keys stable across locales.

As per coding guidelines, web/default/src/i18n/**/*.{ts,tsx,json} should use hierarchical and semantically clear translation key names and keep naming consistency.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/default/src/i18n/locales/zh.json` at line 1005, Replace the flat English
key "Credited Amount" in the zh.json locale with a semantic hierarchical key
like "subscriptions.plan.creditedAmount" (keeping the value "到账金额"), then update
all call sites that currently reference the literal key "Credited Amount" to use
the new key "subscriptions.plan.creditedAmount" (search for usages in code that
call i18n.t or similar helpers), and mirror the same key change across other
locale files so all locales remain consistent.

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.

1 participant