Accessibility and internationalization
Accessibility and internationalization are not finishing touches. They affect how the runtime describes the interface, how text is selected, how layout adapts, and how platform shells expose the app to operating-system services.
In Fission, both concerns start in the shared app model. Widgets produce semantic information as part of the normal tree. Text can come from translation keys. Locale and translation bundles live in Env. Shells then bridge the resolved result to the host platform.
Accessibility contract
Fission widgets can carry semantic metadata. That metadata is used by tests, diagnostics, and platform shells.
| | |
|---|
| | Buttons, inputs, links, headings, dialogs, and status messages should expose the right role. |
| Describes what the user should hear or discover | Icon-only controls need explicit labels because visual icons are not enough. |
| Describes current value or state | Use for controls such as sliders, progress indicators, selected rows, or toggles. |
| Determines keyboard and assistive navigation | Keep focus order close to visual order unless there is a strong reason not to. |
| Communicates that an action is unavailable | Pair disabled state with visible explanation when the reason is not obvious. |
Accessibility should be visible in tests. A test that finds a button by semantic label is usually stronger than a test that depends on an internal node path.
Current shell support
The winit shell exposes Fission semantics through AccessKit on supported native targets. The bridge is built from the same CoreIR and layout snapshot used for rendering, so the accessibility tree follows the rendered widget tree instead of being maintained as a separate app-specific model.
The bridge currently exports:
| |
|---|
| Buttons, labels, text inputs, password inputs, multiline inputs, email/number/phone/URL inputs, images, checkboxes, switches, dialogs, sliders, lists, and list items. |
| Explicit semantic labels, descendant text labels, text input values, numeric values, and toggle state. |
| Layout bounds converted into platform accessibility coordinates. |
| Runtime focus is mirrored into the accessibility tree. Focus and blur actions update Fission focus. |
| Replace selected text, set value, and set text selection dispatch through Fission's text input pipeline. |
| Click/default action, increment/decrement, set numeric value, and scroll actions dispatch through semantics and runtime state. |
Android is intentionally excluded from this AccessKit bridge for now because the current accesskit_winit Android adapter requires winit's GameActivity path, while Fission's Android shell uses NativeActivity. Web, Static site, SSR, and Terminal targets do not use the winit AccessKit bridge; they need target-specific accessibility output appropriate to those hosts.
The native bridge is best understood as a shell integration. App code should still use normal Fission widgets and semantics. The shell translates those semantics into the host accessibility tree.
Internationalization contract
Internationalization, often shortened to i18n, means making the app capable of supporting multiple languages and locale-sensitive behavior. Localization means providing the actual translated content for a locale.
Fission uses these core types:
| |
|---|
| Active language and region identifier. |
| Key-value messages for one locale. |
| Registry of available bundles. |
| Text that should be resolved from the active registry. |
| Text that should render exactly as provided. |
Locale-sensitive text can affect more than visible strings. It can change semantic labels, text width, wrapping, line height pressure, truncation, and layout decisions. That is why the locale belongs in Env and should be part of testing.
The shared runtime should produce meaningful semantics and translated text. The shell should expose those results to the host platform where the host provides an accessibility or language integration path.
| |
|---|
| Keyboard focus, labels, roles, text scaling, screen-reader exposure, menus, dialogs, and high-contrast expectations. |
| Semantic HTML output where applicable, focus order, keyboard access, browser accessibility tree, language metadata, and translated page content. |
| TalkBack labels, touch target sizes, system font scale, locale changes, permission prompts, and text input behavior. |
| VoiceOver labels, Dynamic Type expectations, safe-area layout, locale changes, and input method behavior. |
| Keyboard navigation, visible focus, readable contrast, screen-reader terminal behavior, and non-color-only status. |
| Semantic HTML headings, links, tables, language metadata, alternate language routing, and crawlable translated content. |
No shell should invent product meaning that the widget tree did not provide. The shell bridges semantics; it does not decide that a random rectangle is a button.
Common mistakes
Do not rely on placeholder text as a label for text inputs. Placeholders disappear once the user types and can be hard for assistive technology to treat as a durable name.
Do not use color as the only indicator of status. Pair color with text, iconography, semantic state, or structure.
Do not build translated strings by concatenating fragments in the widget. Different languages have different word order. Prefer whole translation keys with parameters handled by the app's translation layer.
Do not treat English text length as the layout truth. Test longer translated strings, right-to-left languages if your product supports them, and mobile widths.
Related pages
Read Theming and internationalization for a step-by-step translation setup, Environment, input, and input method editor for the Env contract, and Testing and diagnostics for accessibility-oriented testing practice.