Skip to content

TextAreaField 的字数统计 aria-label 是英文字面量 Character count: {n} of {max},非英文会话的读屏用户听到英文 #3406

Description

@yinlianghui

实施 #3404(PR #3405,给注册路径的 FullscreenFieldEditor 接 i18n)时在同包邻近文件发现,未并入该 PR —— #3404 的文件面裁定只含 FullscreenFieldEditor.tsx,明确不碰 TextAreaField.tsx

现象

packages/fields/src/widgets/TextAreaField.tsx:84(对当前 origin/main7d08c3f 复核):

aria-label={`Character count: ${(value || '').length} of ${maxLength}`}

这是内联 textarea 右下角字数统计块的可访问名。渲染出来的数字本身({(value || '').length}/{maxLength})是纯数字、与语言无关,但它的 aria-label 是硬编码英文句子。

可达性

不是死代码,但比 #3404 窄两层:

  1. 仅当字段元数据声明了 maxLength 时才渲染这个块({maxLength && (...)});
  2. 读屏用户能感知 —— 该元素带 aria-live="polite",所以非英文会话下,每次输入变化都会朗读一句英文。

视觉用户看到的只是数字,不受影响。因此我把它当作比 #3404 严重度低的一条,但它确实运行期有人读(与 #3394 那种设计器 defaultProps、运行期无人读的情况不同)。

#3404 的关系

同族但不重叠:#3404 是「键早已存在、这条路径没消费」;这一条是键根本不存在 —— 十个语言包里没有任何 characterCount / charCount 键(已 grep 确认)。所以修它需要新增一个键并翻译十个包,而 #3404 明确是零新增键。这也是它没有被顺手并进 PR #3405 的实质原因,而不只是文件面裁定。

修的时候要先回答的问题

aria-live="polite" + 每次按键重算的 aria-label 是否本身就该重新设计(每敲一个字就朗读一次完整句子是相当吵的),还是只把句子搬进语言包就行。这决定了新键是一句话(fields.textarea.characterCount,带 {{count}} / {{max}} 插值)还是需要拆分。建议 triage 时一并裁定,别只做机械替换。

FullscreenFieldEditor 的字符计数 footer({draft.length}/{maxLength})没有 aria-label,不在此列。


Generated by Claude Code

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions