fb5 UI-TW: the machine-translation mark — _meta.machineTranslated: true, a new optional manifest field of a language pack (docs/PACKS.md): shared/i18nPacks.js langFields reads it (true or false), shared/packs.js normalizeManifest warns about a value that is not a boolean (read as false; the pack still loads) and packIndexEntry passes it into the index entry like complete (only when true), so the client's registry has it from the index (langMetaOf → registerLangs → langInfo) or from the pack's own _meta without one; 设置 shows a note under the language switch while the CURRENT language's pack has it (ui/lang.js machineTranslationNote, msgid 「当前语言的界面文字为机器翻译,可能不够准确,欢迎在 GitHub 上指正。」 — English in en.json, 目前語言的介面文字為機器翻譯… in zh-TW.json; ja / ko leave it to the integrator); tests: test/i18n-packs.test.js (the field from the manifest through the index to langInfo, the warning, the shipped zh-TW manifest, the note shown / hidden by language), test/ui/i18n.e2e.test.js (the shipped packs' own UI strings read from their files — zh-TW now 開始 — and the 设置 note, none in Chinese); docs/I18N.md says how the zh-TW pack is made (OpenCC twp, the official TW terms, a manual pass; a later msgid the same way) and that the ja / ko strings are machine translations open to corrections (edit public/i18n/<code>.json, node tools/i18n.mjs check <code> --strict)
This commit is contained in:
1 parent
6613c3d0fb
commit
c11ba03da4
11 files changed
+173
-38
No files matched your search
@@ -784,6 +784,7 @@
|
||||
"出售选中干员": "Sell selected Operator",
|
||||
"取消 / 关闭": "Cancel / Close",
|
||||
"语言": "Language",
|
||||
"当前语言的界面文字为机器翻译,可能不够准确,欢迎在 GitHub 上指正。": "The interface text in this language is machine-translated and may be inaccurate. Corrections are welcome on GitHub.",
|
||||
"右键查看详情": "Right-click for details",
|
||||
"刷新商店": "Refresh Shop",
|
||||
"冻结 / 解冻商店": "Freeze / Unfreeze Shop",
|
||||
|
||||
@@ -788,6 +788,7 @@
|
||||
"出售选中干员": "出售選中幹員",
|
||||
"取消 / 关闭": "取消 / 關閉",
|
||||
"语言": "語言",
|
||||
"当前语言的界面文字为机器翻译,可能不够准确,欢迎在 GitHub 上指正。": "目前語言的介面文字為機器翻譯,可能不夠準確,歡迎在 GitHub 上指正。",
|
||||
"右键查看详情": "右鍵查看詳情",
|
||||
"刷新商店": "更新商店",
|
||||
"冻结 / 解冻商店": "凍結 / 解凍商店",
|
||||
|
||||
+14
-1
@@ -15,7 +15,7 @@
|
||||
|
||||
import { useEffect, useState } from '../../vendor/hooks.module.js';
|
||||
import {
|
||||
DEFAULT_LANG, normalizeLang, getLang, setLang, onLangChange, addMessages, setNameResolver, tName, format, translateWire, t,
|
||||
DEFAULT_LANG, normalizeLang, getLang, setLang, onLangChange, addMessages, setNameResolver, tName, format, translateWire, t, N_,
|
||||
registerLangs, getLangs, langInfo, langChain, onLangsChange, setI18nWarn,
|
||||
} from '../../../shared/i18n.js';
|
||||
import { canonicalLang, computeChain, scriptOf } from '../../../shared/i18nPacks.js';
|
||||
@@ -270,6 +270,19 @@ export function langMenuModel(langs, current) {
|
||||
return { kind: items.length > SEGMENTED_MAX ? 'select' : 'buttons', items };
|
||||
}
|
||||
|
||||
/** The note itself (a msgid: each pack words it in its own language). */
|
||||
const MACHINE_TRANSLATION_NOTE = N_('当前语言的界面文字为机器翻译,可能不够准确,欢迎在 GitHub 上指正。');
|
||||
|
||||
/**
|
||||
* The note under the language switch in 设置 (ui/settings.js): while the current language's pack is marked as a machine
|
||||
* translation (`_meta.machineTranslated`, docs/PACKS.md) it says so, in that language; null otherwise (Chinese, English,
|
||||
* a pack translated by hand). Only the current pack counts, not its base or fallbacks.
|
||||
* @returns {string | null}
|
||||
*/
|
||||
export function machineTranslationNote() {
|
||||
return langInfo(getLang())?.machineTranslated === true ? t(MACHINE_TRANSLATION_NOTE) : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* The language menu: 中文 | English | … as buttons, or a list when there are many packs.
|
||||
* @param {{ class?: string }} props
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// Player settings (BGM/SFX/voice volume, mute, damage numbers, render quality, the shortcut keys): a tiny observable
|
||||
// store persisted in localStorage (`sp.pref.settings`), applied to the audio manager on every change, plus
|
||||
// the settings modal — which also holds the language switch (ui/lang.js; kept apart in `sp.pref.lang`) and the 快捷键
|
||||
// the settings modal — which also holds the language switch (ui/lang.js; kept apart in `sp.pref.lang`; under it a note
|
||||
// while the current language's pack is a machine translation, `_meta.machineTranslated`) and the 快捷键
|
||||
// section that rebinds the in-match shortcuts (the key map: ui/gameLogic/shortcuts.js; the community request
|
||||
// 「快捷键可不可以自己设置」, the owner's decision of 2026-10-07).
|
||||
|
||||
@@ -11,7 +12,7 @@ import { sanitizeSettings, HOTKEY_ACTIONS, DEFAULT_HOTKEYS, hotkeyLabel, rebindH
|
||||
import { audio } from '../audio.js';
|
||||
import { openGuide } from './guide.js';
|
||||
import { detectFeatures } from './device.js';
|
||||
import { LangToggle } from './lang.js';
|
||||
import { LangToggle, machineTranslationNote } from './lang.js';
|
||||
import { t, tc, N_ } from '../../../shared/i18n.js';
|
||||
|
||||
const cx = (...p) => p.flat().filter(Boolean).join(' ');
|
||||
@@ -151,6 +152,7 @@ export function SettingsModal({ open, onClose }) {
|
||||
const s = useSettings();
|
||||
const [tested, setTested] = useState(false);
|
||||
const [touchUi] = useState(() => detectFeatures().coarse && !detectFeatures().fine);
|
||||
const mtNote = machineTranslationNote(); // a pack marked as machine translation says so under the switch
|
||||
return html`<${Modal} open=${open} onClose=${onClose} title=${t('设置')} micro="SETTINGS" width="7.4rem"
|
||||
actions=${html`<${Button} variant="secondary" icon="book" class="set-guide" onClick=${() => openGuide(0)}>${t('玩法说明')}<//>
|
||||
<${Button} variant="primary" icon="check" onClick=${onClose}>${t('完成')}<//>`}>
|
||||
@@ -159,6 +161,7 @@ export function SettingsModal({ open, onClose }) {
|
||||
<span class="set-row__label">${t('语言')}<${MicroLabel}>LANGUAGE<//></span>
|
||||
<${LangToggle} class="set-lang" />
|
||||
</div>
|
||||
${mtNote ? html`<p class="set-hint set-lang-note" data-testid="lang-mt-note">${mtNote}</p>` : null}
|
||||
<${Slider} label=${t('背景音乐')} micro="BGM" icon="play" value=${s.bgm} onInput=${(v) => updateSettings({ bgm: v })} />
|
||||
<${Slider} label=${t('干员语音')} micro="VOICE" icon="mic" value=${s.voice} onInput=${(v) => updateSettings({ voice: v })} />
|
||||
<${Slider} label=${t('音效')} micro="SFX" icon="signal" value=${s.sfx}
|
||||
|
||||
Reference in new issue
Block a user