Far-Beyond-Pulsar/Pulsar-Native
View on GitHubPlugin vendor crates lack any translation support (~300+ hardcoded English strings)
Open
#480 opened on Jul 29, 2026
difficulty: easyenhancementgood first issuehelp wantedpriority: high
Repository metrics
- Stars
- (348 stars)
- PR merge metrics
- (PR metrics pending)
Description
Summary
All 6 plugin vendor crates have zero translation support — no rust-i18n dependency, no t!() calls, no locale files. Collectively they contain ~300+ hardcoded English UI strings that cannot be localized.
This was previously tracked in #63 ("We need a way for plugin UI to support localization") which was closed, but the underlying gap remains.
Affected crates and estimated hardcoded strings
| Crate | Est. Strings | Key examples |
|---|---|---|
blueprint_editor |
~100+ | Toolbar (Save, Compile, Debug), palette search, properties panel, overlay zoom/debug, prefab/event/macro panels |
shader_editor |
~50+ | Toolbar (Save, Compile, Reload), panel titles, palette, properties, compilation messages, overlay zoom |
matter_editor |
~25+ | Toolbar (Paint, Eraser, Fill, Eyedropper), layers panel, color panel, properties |
code_editor |
~25+ | Toolbar (New File, Save, Find, Run), file explorer, status bar (Ln/Col, encoding), welcome screen |
asset_viewer |
~20+ | Properties sections (File, Info, Transform, View), mesh stats, viewport labels |
table_editor |
~30+ | Query editor toolbar (Execute, Clear, Export CSV/JSON), row actions (Add, Duplicate, Delete) |
Common patterns
All crates hardcode strings via these patterns:
.child("English text")— text nodes.tooltip("English text")— button tooltips.label("English text")— button labels.placeholder("English text")— input placeholders.title(...)returning"English text"— panel titlesformat!("English text {}", value)— dynamic strings (zoom %, counts, etc.)PluginMetadata/FileTypeDefinitionfields — plugin names, descriptions, categories
Additionally, "Editor not available" is a shared fallback string duplicated across multiple plugins.
Suggested approach
- Establish a plugin i18n pattern — either each plugin crate vendors its own
locales/+rust_i18n::i18n!(), or a shared mechanism via a plugin SDK crate - Add
rust-i18ndependency to each plugin crate'sCargo.toml - Create
locales/en.ymlfor each crate with all keys - Replace all hardcoded strings with
t!("Key.Name")calls - Add locale files for other supported languages