open-standards/wai/quantum-studio/locales/index.js
Transaction Science 97935030d3 wai-quantum-desktop: signed updates, offered in the Studio
A copy installed by its own installer (the macOS app, the AppImage, the
Debian or RPM package, the Windows installer) asks latest.json on the
pre-release wai-quantum-desktop-latest for a newer version as it opens.
The Studio offers it in a bar above the frame (src/update.js, its words
in English and Chinese); nothing installs until the person says so, and
then only an update whose signature verifies with the public key in
tauri.conf.json and names the version announced (requireSignedVersion),
after which the app restarts into it.

- The updater plugin 2.14.0 registered; commands update_check and
  update_install. A copy built from source or unpacked by a package
  manager does not update itself, and the check answers why
  (installed_by / updates_itself).
- verify-update FILE SIG VERSION: the same signature and version check
  from the command line, for the release to run on every update it signs.
- update-status: the installer this copy came from, as JSON, for the
  release to ask of each installer's copy.
- tauri.conf.json: the updater's one https endpoint, an empty public key
  until the owner makes the release key, update artifacts off unless a
  release turns them on, the macOS app signed ad hoc unless a Developer ID
  is given, and the publisher and homepage the packages carry.
- icons/icon.ico and icons/icon.icns, made from icons/icon.png by the
  bundler's icon command: a Windows build needs the .ico for its resource
  file (the app had not been built on Windows before), and the macOS app
  takes the .icns.
- Tests: the published test vectors held to the key and the signed
  version (tampered bytes, another key, another version, no version, no
  key, bad base64 all refused); which copies update themselves; the
  configuration's endpoint and flags; test/update.test.mjs for the bar.
- New crates in the lockfile at versions at least two weeks old, except
  webpki-root-certs at 1.0.10, the first release with RUSTSEC-2026-0383
  fixed.
- The Studio's README and its translation say what the bar does.
- The views page rebuilt (bash wai/wai-quantum-views/build.sh), since it
  is built from the Studio's English words and styles.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 10:23:52 -04:00

69 lines
5.5 KiB
JavaScript

// The Studio's words: one file for each part of the interface in each locale,
// gathered here. English is the source. test/locales.test.mjs holds this list
// to the files on disk, and every locale to every key.
import enAssistant from './en/assistant.json' with { type: 'json' };
import enCircuitSvg from './en/circuit_svg.json' with { type: 'json' };
import enCompileView from './en/compile_view.json' with { type: 'json' };
import enConverge from './en/converge.json' with { type: 'json' };
import enCourse from './en/course.json' with { type: 'json' };
import enCritiqueView from './en/critique_view.json' with { type: 'json' };
import enDebugger from './en/debugger.json' with { type: 'json' };
import enDevice from './en/device.json' with { type: 'json' };
import enDom from './en/dom.json' with { type: 'json' };
import enEstimateView from './en/estimate_view.json' with { type: 'json' };
import enExamples from './en/examples.json' with { type: 'json' };
import enFlags from './en/flags.json' with { type: 'json' };
import enFrame from './en/frame.json' with { type: 'json' };
import enGallery from './en/gallery.json' with { type: 'json' };
import enGenerators from './en/generators.json' with { type: 'json' };
import enHardware from './en/hardware.json' with { type: 'json' };
import enNovelty from './en/novelty.json' with { type: 'json' };
import enPredict from './en/predict.json' with { type: 'json' };
import enRewriteView from './en/rewrite_view.json' with { type: 'json' };
import enRules from './en/rules.json' with { type: 'json' };
import enShortcutsView from './en/shortcuts_view.json' with { type: 'json' };
import enStateViews from './en/state_views.json' with { type: 'json' };
import enStudy from './en/study.json' with { type: 'json' };
import enTaste from './en/taste.json' with { type: 'json' };
import enUpdate from './en/update.json' with { type: 'json' };
import enVerdictView from './en/verdict_view.json' with { type: 'json' };
import enVersions from './en/versions.json' with { type: 'json' };
import enVisualEdit from './en/visual_edit.json' with { type: 'json' };
import enWorkbench from './en/workbench.json' with { type: 'json' };
import zhAssistant from './zh-CN/assistant.json' with { type: 'json' };
import zhCircuitSvg from './zh-CN/circuit_svg.json' with { type: 'json' };
import zhCompileView from './zh-CN/compile_view.json' with { type: 'json' };
import zhConverge from './zh-CN/converge.json' with { type: 'json' };
import zhCourse from './zh-CN/course.json' with { type: 'json' };
import zhCritiqueView from './zh-CN/critique_view.json' with { type: 'json' };
import zhDebugger from './zh-CN/debugger.json' with { type: 'json' };
import zhDevice from './zh-CN/device.json' with { type: 'json' };
import zhDom from './zh-CN/dom.json' with { type: 'json' };
import zhEstimateView from './zh-CN/estimate_view.json' with { type: 'json' };
import zhExamples from './zh-CN/examples.json' with { type: 'json' };
import zhFlags from './zh-CN/flags.json' with { type: 'json' };
import zhFrame from './zh-CN/frame.json' with { type: 'json' };
import zhGallery from './zh-CN/gallery.json' with { type: 'json' };
import zhGenerators from './zh-CN/generators.json' with { type: 'json' };
import zhHardware from './zh-CN/hardware.json' with { type: 'json' };
import zhNovelty from './zh-CN/novelty.json' with { type: 'json' };
import zhPredict from './zh-CN/predict.json' with { type: 'json' };
import zhRewriteView from './zh-CN/rewrite_view.json' with { type: 'json' };
import zhRules from './zh-CN/rules.json' with { type: 'json' };
import zhShortcutsView from './zh-CN/shortcuts_view.json' with { type: 'json' };
import zhStateViews from './zh-CN/state_views.json' with { type: 'json' };
import zhStudy from './zh-CN/study.json' with { type: 'json' };
import zhTaste from './zh-CN/taste.json' with { type: 'json' };
import zhUpdate from './zh-CN/update.json' with { type: 'json' };
import zhVerdictView from './zh-CN/verdict_view.json' with { type: 'json' };
import zhVersions from './zh-CN/versions.json' with { type: 'json' };
import zhVisualEdit from './zh-CN/visual_edit.json' with { type: 'json' };
import zhWorkbench from './zh-CN/workbench.json' with { type: 'json' };
// The parts of the interface, in the order their words are gathered.
export const AREAS = ['assistant', 'circuit_svg', 'compile_view', 'converge', 'course', 'critique_view', 'debugger', 'device', 'dom', 'estimate_view', 'examples', 'flags', 'frame', 'gallery', 'generators', 'hardware', 'novelty', 'predict', 'rewrite_view', 'rules', 'shortcuts_view', 'state_views', 'study', 'taste', 'update', 'verdict_view', 'versions', 'visual_edit', 'workbench'];
export default {
en: { ...enAssistant, ...enCircuitSvg, ...enCompileView, ...enConverge, ...enCourse, ...enCritiqueView, ...enDebugger, ...enDevice, ...enDom, ...enEstimateView, ...enExamples, ...enFlags, ...enFrame, ...enGallery, ...enGenerators, ...enHardware, ...enNovelty, ...enPredict, ...enRewriteView, ...enRules, ...enShortcutsView, ...enStateViews, ...enStudy, ...enTaste, ...enUpdate, ...enVerdictView, ...enVersions, ...enVisualEdit, ...enWorkbench },
'zh-CN': { ...zhAssistant, ...zhCircuitSvg, ...zhCompileView, ...zhConverge, ...zhCourse, ...zhCritiqueView, ...zhDebugger, ...zhDevice, ...zhDom, ...zhEstimateView, ...zhExamples, ...zhFlags, ...zhFrame, ...zhGallery, ...zhGenerators, ...zhHardware, ...zhNovelty, ...zhPredict, ...zhRewriteView, ...zhRules, ...zhShortcutsView, ...zhStateViews, ...zhStudy, ...zhTaste, ...zhUpdate, ...zhVerdictView, ...zhVersions, ...zhVisualEdit, ...zhWorkbench },
};