diff --git a/packages/react-ui/src/containers/Panel/Panel.tsx b/packages/react-ui/src/containers/Panel/Panel.tsx index 74251c91..e01f3f70 100644 --- a/packages/react-ui/src/containers/Panel/Panel.tsx +++ b/packages/react-ui/src/containers/Panel/Panel.tsx @@ -94,7 +94,7 @@ const Panel = ({ perc: number }>(null) - const uiHandler = languageUIManager.getUIHandler() + const 語言UI處理程序 = languageUIManager.獲取語言UI處理程序() const [文字片段列表, setFragments] = useState<類型_文字片段列表>({ 列表: [text], @@ -128,7 +128,7 @@ const Panel = ({ const [hasExtraControls, setHasExtraControls] = useState(false) const [isMobile, setIsMobile] = useState(false) const writingArea = useRef(null) - const 語言選項 = _stories.語言選項 ?? uiHandler.取得語言選項() + const 語言選項 = _stories.語言選項 ?? 語言UI處理程序.取得語言選項() const langHandler = languageManager.getCurrentLanguageHandler() @@ -348,6 +348,7 @@ const Panel = ({ }, ) const newFragments: 類型_文字片段列表 = { 列表: [''], 索引: 0 } + 語言UI處理程序.處理清除事件?.(語言UI處理程序) storage.setValue('fragments', JSON.stringify(newFragments)) setShowingPronunciation(true) setShowingEdition(true) @@ -360,9 +361,7 @@ const Panel = ({ updateLanguage(newSelectedLanguage) } - const handleWritingKeyDown = ( - 事件: React.KeyboardEvent, - ) => { + const 處理寫鍵按下 = (事件: React.KeyboardEvent) => { // special key if (事件.key === '`') { 事件.preventDefault() @@ -376,7 +375,7 @@ const Panel = ({ setPractice(`${practiceValue}\n`) } - uiHandler.handleWritingKeyDown({ + 語言UI處理程序.處理寫鍵按下({ getCurrentCharObjFromPractice, originalTextValue, practiceValue, @@ -392,11 +391,11 @@ const Panel = ({ 語言選項, }) - uiHandler.儲存語言選項(語言選項) + 語言UI處理程序.儲存語言選項(語言選項) } const 更改語言選項 = (選項: 類型_語言選項) => { - uiHandler.儲存語言選項(選項) + 語言UI處理程序.儲存語言選項(選項) 觸發重新渲染(Math.random()) } @@ -404,9 +403,9 @@ const Panel = ({ setLastThreeKeys([]) } - const 連結區塊 = uiHandler.取得連結區塊() - const OptionsBlock = uiHandler.getOptionsBlock() - const handleDisplayedCharClick = uiHandler.getDisplayedCharHandler() + const 連結區塊 = 語言UI處理程序.取得連結區塊() + const OptionsBlock = 語言UI處理程序.getOptionsBlock() + const handleDisplayedCharClick = 語言UI處理程序.getDisplayedCharHandler() const saveRecord = () => { setShowingRecordsInitScreen(RecordsScreen.Save) @@ -462,7 +461,7 @@ const Panel = ({ } const 重點字元顏色 = doesPracticeHaveError - ? uiHandler.取得錯誤顏色?.(語言選項, getCurrentCharObjFromPractice()) + ? 語言UI處理程序.取得錯誤顏色?.(語言選項, getCurrentCharObjFromPractice()) : undefined return ( @@ -633,8 +632,8 @@ const Panel = ({ > <文字區 onBlur={() => { - if (uiHandler.onBlur) { - const { newFragmentsList } = uiHandler.onBlur({ + if (語言UI處理程序.onBlur) { + const { newFragmentsList } = 語言UI處理程序.onBlur({ fragmentsList: 文字片段列表.列表, 語言選項, }) @@ -712,7 +711,9 @@ const Panel = ({ {}, } as unknown as React.KeyboardEvent - handleWritingKeyDown(mockEvent) + 處理寫鍵按下(mockEvent) } }} onClick={handleWritingAreaClick} onFocus={() => setWritingBorder('bold')} - onKeyDown={handleWritingKeyDown} + onKeyDown={處理寫鍵按下} placeholder={practiceValue ? '' : '書寫區'} rows={1} setRef={ref => (writingArea.current = ref)} diff --git a/packages/react-ui/src/containers/Panel/__stories__/Panel.stories.tsx b/packages/react-ui/src/containers/Panel/__stories__/Panel.stories.tsx index 4a588bea..d9291422 100644 --- a/packages/react-ui/src/containers/Panel/__stories__/Panel.stories.tsx +++ b/packages/react-ui/src/containers/Panel/__stories__/Panel.stories.tsx @@ -8,12 +8,15 @@ import { } from 'writing-trainer-core' import { dummyServices } from '../../../__stories__/storybookHelpers' -import { uiHandlers } from '../../../languages/handlers' +import { 語言UI處理程序清單 } from '../../../languages/handlers' import { LanguageUIManager } from '../../../languages/languageUIManager' import Panel from '../Panel' const languageManager = new LanguageManager() -const languageUIManager = new LanguageUIManager(languageManager, uiHandlers) +const languageUIManager = new LanguageUIManager( + languageManager, + 語言UI處理程序清單, +) const initialText = '崩比筆,壁必畢.閉編' diff --git a/packages/react-ui/src/index.ts b/packages/react-ui/src/index.ts index c359d667..ef7fbf93 100644 --- a/packages/react-ui/src/index.ts +++ b/packages/react-ui/src/index.ts @@ -2,7 +2,7 @@ import 按鈕 from './components/按鈕/按鈕' import 文字區 from './components/文字區/文字區' import 面板基本 from './components/面板基本/面板基本' import Panel from './containers/Panel/Panel' -import { uiHandlers } from './languages/handlers' +import { 語言UI處理程序清單 } from './languages/handlers' import { LanguageUIManager } from './languages/languageUIManager' import { useBodyOverflowSwitch, @@ -13,11 +13,11 @@ import { export { LanguageUIManager, Panel, - uiHandlers, useBodyOverflowSwitch, useHover, useTextSelection, 按鈕, 文字區, + 語言UI處理程序清單, 面板基本, } diff --git a/packages/react-ui/src/languages/__tests__/languageUIManager.test.tsx b/packages/react-ui/src/languages/__tests__/languageUIManager.test.tsx index 13685b40..64f2340a 100644 --- a/packages/react-ui/src/languages/__tests__/languageUIManager.test.tsx +++ b/packages/react-ui/src/languages/__tests__/languageUIManager.test.tsx @@ -1,6 +1,6 @@ import { LanguageManager } from 'writing-trainer-core' -import { uiHandlers } from '../handlers' +import { 語言UI處理程序清單 } from '../handlers' import { LanguageUIManager } from '../languageUIManager' const languageManager = new LanguageManager() @@ -21,7 +21,7 @@ describe('constructor', () => { expect(languageManager.取得可用語言()).toEqual([]) expect(languageManager.getCurrentLanguageHandler()).toEqual(null) - new LanguageUIManager(languageManager, uiHandlers) + new LanguageUIManager(languageManager, 語言UI處理程序清單) expect((languageManager.clear as any).mock.calls).toEqual([[]]) expect(languageManager.取得可用語言()).not.toEqual([]) @@ -29,22 +29,28 @@ describe('constructor', () => { }) }) -describe('getUIHandler', () => { +describe('獲取語言UI處理程序', () => { it('returns the UI handler with same id as the current language handler', () => { - const languageUIManager = new LanguageUIManager(languageManager, uiHandlers) - - expect(languageUIManager.getUIHandler().languageHandler.getId()).toEqual( - languageManager.getCurrentLanguageHandler()!.getId(), + const languageUIManager = new LanguageUIManager( + languageManager, + 語言UI處理程序清單, ) + + expect( + languageUIManager.獲取語言UI處理程序().languageHandler.getId(), + ).toEqual(languageManager.getCurrentLanguageHandler()!.getId()) }) }) describe('getDefaultLanguage', () => { it('returns the first id of the array', () => { - const languageUIManager = new LanguageUIManager(languageManager, uiHandlers) + const languageUIManager = new LanguageUIManager( + languageManager, + 語言UI處理程序清單, + ) expect(languageUIManager.getDefaultLanguage()).toEqual( - uiHandlers[0].languageHandler.getId(), + 語言UI處理程序清單[0].languageHandler.getId(), ) }) }) diff --git a/packages/react-ui/src/languages/cantonese/cantonese.tsx b/packages/react-ui/src/languages/cantonese/cantonese.tsx index 3b1aabed..4d2684f2 100644 --- a/packages/react-ui/src/languages/cantonese/cantonese.tsx +++ b/packages/react-ui/src/languages/cantonese/cantonese.tsx @@ -5,7 +5,7 @@ import { chineseBlurHandler } from '../common/chineseBlurHandler' import { commonHandleWritingKeyDown } from '../common/commonLanguageUtils' import { 繁體轉簡體 } from '../common/conversion' import { - T_UIHandler, + 類型_語言UI處理程序, 類型_語言選項, T_CharsDisplayClickHandler, } from '../types' @@ -97,7 +97,7 @@ const 解析發音 = (文字: string, 選項: 類型_語言選項) => { return 解析後的文本 } -const handleWritingKeyDown: T_UIHandler['handleWritingKeyDown'] = 參數 => { +const 處理寫鍵按下: 類型_語言UI處理程序['處理寫鍵按下'] = 參數 => { commonHandleWritingKeyDown(參數, { 解析發音, }) @@ -169,16 +169,19 @@ export const handleDisplayedCharClick: T_CharsDisplayClickHandler = ({ } } -const uiHandler: T_UIHandler = { +const 語言UI處理程序: 類型_語言UI處理程序 = { getDisplayedCharHandler: () => handleDisplayedCharClick, getOptionsBlock: () => OptionsBlock, - handleWritingKeyDown, languageHandler: cantoneseHandler, onBlur: chineseBlurHandler, shouldAllCharsHaveSameWidth: false, 儲存語言選項, 取得語言選項, 取得連結區塊: () => 連結區塊, + 處理寫鍵按下, + 處理清除事件: (處理程序: 類型_語言UI處理程序) => { + 處理程序.儲存語言選項({ ...處理程序.取得語言選項(), 錯誤的字符: [] }) + }, } -export default uiHandler +export default 語言UI處理程序 diff --git a/packages/react-ui/src/languages/common/chineseBlurHandler.ts b/packages/react-ui/src/languages/common/chineseBlurHandler.ts index 8b57e38f..9204d928 100644 --- a/packages/react-ui/src/languages/common/chineseBlurHandler.ts +++ b/packages/react-ui/src/languages/common/chineseBlurHandler.ts @@ -1,6 +1,6 @@ -import { T_UIHandler } from '../types' +import { 類型_語言UI處理程序 } from '../types' -export const chineseBlurHandler: T_UIHandler['onBlur'] = ({ +export const chineseBlurHandler: 類型_語言UI處理程序['onBlur'] = ({ fragmentsList, 語言選項, }) => { diff --git a/packages/react-ui/src/languages/common/commonLanguageUtils.tsx b/packages/react-ui/src/languages/common/commonLanguageUtils.tsx index 38c01dea..79091334 100644 --- a/packages/react-ui/src/languages/common/commonLanguageUtils.tsx +++ b/packages/react-ui/src/languages/common/commonLanguageUtils.tsx @@ -1,6 +1,6 @@ import { unknownPronunciation } from 'writing-trainer-core' -import { T_UIHandler, 類型_語言選項 } from '../types' +import { 類型_語言UI處理程序, 類型_語言選項 } from '../types' import { 儲存成功字元, 儲存失敗字元 } from './統計' @@ -8,12 +8,12 @@ type 類型_解析發音 = (文字: string, 語言選項?: 類型_語言選項) type T_OnPracticeBackspaceFormat = (practiceValue: string) => string type T_CommonHandleWritingKeyDown = ( - opts: Parameters[0], + opts: Parameters<類型_語言UI處理程序['處理寫鍵按下']>[0], opts2: { onPracticeBackspaceFormat?: T_OnPracticeBackspaceFormat 解析發音?: 類型_解析發音 }, -) => ReturnType +) => ReturnType<類型_語言UI處理程序['處理寫鍵按下']> const 預設解析發音: 類型_解析發音 = 文字 => 文字.toLowerCase() diff --git a/packages/react-ui/src/languages/english/__tests__/english.test.tsx b/packages/react-ui/src/languages/english/__tests__/english.test.tsx index 4456f743..e1e4c7cf 100644 --- a/packages/react-ui/src/languages/english/__tests__/english.test.tsx +++ b/packages/react-ui/src/languages/english/__tests__/english.test.tsx @@ -24,7 +24,7 @@ describe('取得語言選項', () => { }) }) -describe('handleWritingKeyDown', () => { +describe('處理寫鍵按下', () => { const commonOpts: any = { getCurrentCharObjFromPractice: jest.fn(), practiceValue: 'foo bar baz ', @@ -49,7 +49,7 @@ describe('handleWritingKeyDown', () => { 按鍵事件: { key: 'Backspace' }, } - englishUIHandler.handleWritingKeyDown(opts) + englishUIHandler.處理寫鍵按下(opts) expect(opts.setCurrentDisplayCharIdx.mock.calls).toEqual([['indexValue']]) expect(opts.setPractice.mock.calls).toEqual([['foo bar ']]) @@ -62,7 +62,7 @@ describe('handleWritingKeyDown', () => { getCurrentCharObjFromPractice: () => ({}), } - englishUIHandler.handleWritingKeyDown(opts) + englishUIHandler.處理寫鍵按下(opts) expect(opts.setPracticeHasError.mock.calls).toEqual([[false]]) expect(opts.setWriting.mock.calls).toEqual([]) @@ -78,7 +78,7 @@ describe('handleWritingKeyDown', () => { 按鍵事件: { key: 'c', preventDefault: jest.fn() }, } - englishUIHandler.handleWritingKeyDown(opts) + englishUIHandler.處理寫鍵按下(opts) expect(opts.按鍵事件.preventDefault.mock.calls).toEqual([[]]) expect(opts.setWriting.mock.calls).toEqual([['']]) diff --git a/packages/react-ui/src/languages/english/english.tsx b/packages/react-ui/src/languages/english/english.tsx index 8233f0dc..f89c35a6 100644 --- a/packages/react-ui/src/languages/english/english.tsx +++ b/packages/react-ui/src/languages/english/english.tsx @@ -1,12 +1,12 @@ import { englishHandler } from 'writing-trainer-core' import { commonHandleWritingKeyDown } from '../common/commonLanguageUtils' -import { T_UIHandler, 類型_語言選項 } from '../types' +import { 類型_語言UI處理程序, 類型_語言選項 } from '../types' import OptionsBlock from './OptionsBlock' import 連結區塊 from './連結區塊/連結區塊' -const handleWritingKeyDown: T_UIHandler['handleWritingKeyDown'] = params => { +const 處理寫鍵按下: 類型_語言UI處理程序['處理寫鍵按下'] = params => { commonHandleWritingKeyDown(params, {}) } @@ -16,15 +16,15 @@ const 取得語言選項 = () => 語言選項 const 儲存語言選項 = () => {} -const uiHandler: T_UIHandler = { +const 語言UI處理程序: 類型_語言UI處理程序 = { getDisplayedCharHandler: () => null, getOptionsBlock: () => OptionsBlock, - handleWritingKeyDown, languageHandler: englishHandler, shouldAllCharsHaveSameWidth: false, 儲存語言選項, 取得語言選項, 取得連結區塊: () => 連結區塊, + 處理寫鍵按下, } let _test: @@ -42,4 +42,4 @@ if (__TEST__) { export { _test } -export default uiHandler +export default 語言UI處理程序 diff --git a/packages/react-ui/src/languages/handlers.ts b/packages/react-ui/src/languages/handlers.ts index b9d8819a..1995e00a 100644 --- a/packages/react-ui/src/languages/handlers.ts +++ b/packages/react-ui/src/languages/handlers.ts @@ -3,6 +3,6 @@ import english from './english/english' import japanese from './japanese/japanese' import mandarin from './mandarin/mandarin' -const uiHandlers = [mandarin, japanese, english, cantonese] +const 語言UI處理程序清單 = [mandarin, japanese, english, cantonese] -export { uiHandlers } +export { 語言UI處理程序清單 } diff --git a/packages/react-ui/src/languages/japanese/japanese.tsx b/packages/react-ui/src/languages/japanese/japanese.tsx index 807c0847..6a707730 100644 --- a/packages/react-ui/src/languages/japanese/japanese.tsx +++ b/packages/react-ui/src/languages/japanese/japanese.tsx @@ -1,26 +1,26 @@ import { japaneseHandler } from 'writing-trainer-core' import { commonHandleWritingKeyDown } from '../common/commonLanguageUtils' -import { T_UIHandler, 類型_語言選項 } from '../types' +import { 類型_語言UI處理程序, 類型_語言選項 } from '../types' import OptionsBlock from './OptionsBlock/OptionsBlock' import 連結區塊 from './連結區塊/連結區塊' -const handleWritingKeyDown: T_UIHandler['handleWritingKeyDown'] = params => { +const 處理寫鍵按下: 類型_語言UI處理程序['處理寫鍵按下'] = params => { commonHandleWritingKeyDown(params, {}) } const 語言選項: 類型_語言選項 = {} -const uiHandler: T_UIHandler = { +const 語言UI處理程序: 類型_語言UI處理程序 = { getDisplayedCharHandler: () => null, getOptionsBlock: () => OptionsBlock, - handleWritingKeyDown, languageHandler: japaneseHandler, shouldAllCharsHaveSameWidth: false, 儲存語言選項: () => {}, 取得語言選項: () => 語言選項, 取得連結區塊: () => 連結區塊, + 處理寫鍵按下, } -export default uiHandler +export default 語言UI處理程序 diff --git a/packages/react-ui/src/languages/languageUIManager.tsx b/packages/react-ui/src/languages/languageUIManager.tsx index c23b7345..f7fd14ff 100644 --- a/packages/react-ui/src/languages/languageUIManager.tsx +++ b/packages/react-ui/src/languages/languageUIManager.tsx @@ -1,16 +1,22 @@ import { LanguageManager } from 'writing-trainer-core' -import { uiHandlers as defaultUIHandlers } from './handlers' -import { T_UIHandler } from './types' +import { 語言UI處理程序清單 as 預設語言UI處理程序清單 } from './handlers' +import { 類型_語言UI處理程序 } from './types' class LanguageUIManager { - private readonly handlers: T_UIHandler[] - private readonly idToLanguageUIHandlerMap: { [k: string]: T_UIHandler } = {} + private readonly handlers: 類型_語言UI處理程序[] + private readonly idToLanguageUIHandlerMap: { + [k: string]: 類型_語言UI處理程序 + } = {} + private readonly manager: LanguageManager - public constructor(manager: LanguageManager, handlers?: T_UIHandler[]) { + public constructor( + manager: LanguageManager, + handlers?: 類型_語言UI處理程序[], + ) { this.manager = manager - this.handlers = handlers ?? defaultUIHandlers + this.handlers = handlers ?? 預設語言UI處理程序清單 if (this.handlers.length === 0) { throw new Error('No UI handlers provided') @@ -18,8 +24,8 @@ class LanguageUIManager { this.idToLanguageUIHandlerMap = this.handlers.reduce< LanguageUIManager['idToLanguageUIHandlerMap'] - >((acc, uiHandler) => { - acc[uiHandler.languageHandler.getId()] = uiHandler + >((acc, 語言UI處理程序) => { + acc[語言UI處理程序.languageHandler.getId()] = 語言UI處理程序 return acc }, {}) @@ -31,34 +37,35 @@ class LanguageUIManager { return this.handlers[0]!.languageHandler.getId() } - public getUIHandler() { + public init() { + this.manager.clear() + + this.handlers.forEach(語言UI處理程序 => { + this.manager.registerLanguage(語言UI處理程序.languageHandler) + }) + + const defaultLanguage = this.getDefaultLanguage() + + this.manager.setCurrentLanguageHandler(defaultLanguage) + } + + public 獲取語言UI處理程序() { const languageHandler = this.manager.getCurrentLanguageHandler() if (!languageHandler) { throw new Error('No language handler set') } - const uiHandler = this.idToLanguageUIHandlerMap[languageHandler.getId()] + const 語言UI處理程序 = + this.idToLanguageUIHandlerMap[languageHandler.getId()] - if (!uiHandler as unknown) { + if (!語言UI處理程序 as unknown) { throw new Error( `No UI language handler for language: ${languageHandler.getId()}`, ) } - return uiHandler - } - - public init() { - this.manager.clear() - - this.handlers.forEach(uiHandler => { - this.manager.registerLanguage(uiHandler.languageHandler) - }) - - const defaultLanguage = this.getDefaultLanguage() - - this.manager.setCurrentLanguageHandler(defaultLanguage) + return 語言UI處理程序 } } diff --git a/packages/react-ui/src/languages/mandarin/mandarin.tsx b/packages/react-ui/src/languages/mandarin/mandarin.tsx index 7a2c4dc5..51210b59 100644 --- a/packages/react-ui/src/languages/mandarin/mandarin.tsx +++ b/packages/react-ui/src/languages/mandarin/mandarin.tsx @@ -5,7 +5,7 @@ import { chineseBlurHandler } from '../common/chineseBlurHandler' import { commonHandleWritingKeyDown } from '../common/commonLanguageUtils' import { 繁體轉簡體 } from '../common/conversion' import { - T_UIHandler, + 類型_語言UI處理程序, 類型_語言選項, T_CharsDisplayClickHandler, } from '../types' @@ -68,7 +68,7 @@ const 解析發音 = (文字: string, 選項: 類型_語言選項) => { return 解析後的文本 } -const handleWritingKeyDown: T_UIHandler['handleWritingKeyDown'] = 參數 => { +const 處理寫鍵按下: 類型_語言UI處理程序['處理寫鍵按下'] = 參數 => { commonHandleWritingKeyDown(參數, { 解析發音, }) @@ -184,10 +184,9 @@ const 取得錯誤顏色 = (選項: 類型_語言選項, 字元: CurrentCharObj }[音數] } -const uiHandler: T_UIHandler = { +const 語言UI處理程序: 類型_語言UI處理程序 = { getDisplayedCharHandler: () => handleDisplayedCharClick, getOptionsBlock: () => OptionsBlock, - handleWritingKeyDown, languageHandler: mandarinHandler, onBlur: chineseBlurHandler, shouldAllCharsHaveSameWidth: false, @@ -195,6 +194,10 @@ const uiHandler: T_UIHandler = { 取得語言選項, 取得連結區塊: () => 連結區塊, 取得錯誤顏色, + 處理寫鍵按下, + 處理清除事件: (處理程序: 類型_語言UI處理程序) => { + 處理程序.儲存語言選項({ ...處理程序.取得語言選項(), 錯誤的字符: [] }) + }, } -export default uiHandler +export default 語言UI處理程序 diff --git a/packages/react-ui/src/languages/types.tsx b/packages/react-ui/src/languages/types.tsx index 74f9519b..a2420290 100644 --- a/packages/react-ui/src/languages/types.tsx +++ b/packages/react-ui/src/languages/types.tsx @@ -31,7 +31,7 @@ export type T_getCurrentCharObjFromPractice = ( t?: string, ) => CurrentCharObj | null -type T_handleWritingKeyDown = (opts: { +type T_處理寫鍵按下 = (opts: { getCurrentCharObjFromPractice: T_getCurrentCharObjFromPractice originalTextValue: string practiceValue: string @@ -64,10 +64,9 @@ type T_BlurHandler = (opts: T_BlurHandlerOpts) => { newFragmentsList: string[] | undefined } -export interface T_UIHandler { +export interface 類型_語言UI處理程序 { getDisplayedCharHandler: () => T_CharsDisplayClickHandler getOptionsBlock: () => T_OptionsBlock - handleWritingKeyDown: T_handleWritingKeyDown languageHandler: LanguageHandler onBlur?: T_BlurHandler shouldAllCharsHaveSameWidth: boolean @@ -78,4 +77,6 @@ export interface T_UIHandler { 選項: 類型_語言選項, 字元: CurrentCharObj | null, ) => string | undefined + 處理寫鍵按下: T_處理寫鍵按下 + 處理清除事件?: (處理程序: 類型_語言UI處理程序) => void } diff --git a/packages/web-app/src/utils.ts b/packages/web-app/src/utils.ts index de8378cf..5084595d 100644 --- a/packages/web-app/src/utils.ts +++ b/packages/web-app/src/utils.ts @@ -1,15 +1,15 @@ import { LanguageManager, T_Storage } from 'writing-trainer-core' -import { LanguageUIManager, uiHandlers } from 'writing-trainer-react-ui' +import { LanguageUIManager, 語言UI處理程序清單 } from 'writing-trainer-react-ui' import { siteUrl } from './constants' const usedText = '忘掉種過的花, 重新的出發, 放棄理想吧' // Make sure that the first handler is for mandarin const newUIHandlers = [ - ...uiHandlers.filter( + ...語言UI處理程序清單.filter( handler => handler.languageHandler.getId() === 'mandarin', ), - ...uiHandlers.filter( + ...語言UI處理程序清單.filter( handler => handler.languageHandler.getId() !== 'mandarin', ), ]