This repository has been archived on 2026-10-11. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
HiNC-2025-win-desktop-Deploy/App/wwwroot/HiAPI-docsite/anatomy/shell/language-selection-submenu.html
T
2026-09-09 18:06:21 +08:00

167 lines
8.3 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Language Selection SubMenu | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Language Selection SubMenu | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="Anatomy-LanguageSelectionSubmenu">
<h1 id="language-selection-submenu">Language Selection SubMenu</h1>
<p>The submenu locates on the <a class="xref" href="preference-menu.html">Preference Menu Dropdown</a>. It is the only
place the application offers for changing the interface language. What that choice sets in motion —
the message bundles, the locale applied before the first frame, the single switch
function and everything that re-renders behind it — is
<a class="xref" href="../platform/i18n.html">Internationalization</a>; this page covers the gesture.</p>
<p>The submenu's model is the application-state store rather than a service handed down by the
parent component: it reads the current code and the available-code list from that store and calls
the store's language action. Both values are hydrated by the store's server-preferences load, which
the shell layout runs on mount — a separate path from the one that decides which locale the first
painted frame uses.</p>
<h2 id="layout">Layout</h2>
<ul>
<li><p>Language Selection SubMenu</p>
<ul>
<li>Language Row — one plain row per code in the store's available-code list, so the rows are
whatever the server reports rather than a fixed set of three. Each carries the language's own
name from a hard-coded label map, falling back to the raw code for anything the map does not
name, with that code beneath it as a caption; the row matching the current language is drawn in
the active state. No row carries a radio button or a checkbox.</li>
</ul>
<p>The parent entry captions the current language, so it reads without opening the submenu.</p>
</li>
</ul>
<p>Choosing a row closes the popup and makes one call, the store's language action.
The store writes the new code optimistically, POSTs it, adopts the current and available lists the
server echoes back, and only then switches the live catalogue — so the interface text flips after
the server has accepted the value, and the confirmation toast already reads in the language just
picked. A rejected write rolls the store back and changes no interface text at all.</p>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a class="xref" href="../index.html">HiNC App Anatomy</a> for git repository links.</p>
<h3 id="web-application">Web Application</h3>
<p>HiNC-2025-webservice (Quasar CLI SPA):</p>
<ul>
<li><code>wwwroot-src/src/components/AppMenuBar.vue</code> — the nested <code>Preference → Language ▸</code> popup: the row
loop over the available codes, the hard-coded self-name map, the active-row marker, and the
handler whose single call is the store's language action.</li>
<li><code>wwwroot-src/src/stores/appState.ts</code> — the current-code and available-code state, the language
action with its optimistic write, its POST-then-apply order and its rollback, and the
server-preferences load the shell layout runs on mount.</li>
<li><code>wwwroot-src/src/api/preference.ts</code> — the typed wrappers over the two language endpoints.</li>
<li><code>Environments/PreferenceController.cs</code> — <code>GET /api/preference/language</code> and its <code>POST</code> twin, both
answering <code>success</code>, <code>current</code> and <code>available</code>; <code>languageCode</code> is the name of a field in the POST
request body only. An unlisted code is rejected with 400, and an accepted one is written to the
persisted <code>UserConfig.LanguageCode</code> and saved.</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../conventions/translation-remarks.html">Translation Remarks</a> — the terminology every translated label is held to</li>
<li><a class="xref" href="preference-menu.html">Preference Menu Dropdown</a> — the dropdown this sub-menu hangs from</li>
<li><a class="xref" href="../platform/i18n.html">Internationalization</a> — the bundles and the switch point this menu drives</li>
</ul>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>