/ app / ui / language-manager.js
language-manager.js
 1  import attachLanguageEventListenersDefault from '../utils/event/attach-language-event-listeners.js';
 2  import bindEventHandlersDefault from '../utils/event/bind-event-handlers.js';
 3  import detachLanguageEventListenersDefault from '../utils/event/detach-language-event-listeners.js';
 4  export class LanguageManager {
 5    constructor(uiManager) {
 6      this.uiManager = uiManager;
 7  
 8      this.languageSelector = this.uiManager.get('languageSelector');
 9  
10      this._initialize();
11    }
12  
13    async _initialize() {
14      await this._initializeLanguageButtons().catch(error => {
15        console.error('Failed to initialize language buttons:', error);
16      });
17  
18      await this._attachEventListeners().catch(error => {
19        console.error('Failed to attach language event listeners:', error);
20      });
21    }
22  
23    async _initializeLanguageButtons() {
24      try {
25        const buttons = queryLanguageButtonsDefault(this.uiManager, this.languageSelector);
26        this.japaneseButton = buttons.japaneseButton;
27        this.chineseButton = buttons.chineseButton;
28  
29        const handlers = {
30          handleChineseClick: () => this.handleLanguageSelection('zh'),
31          handleJapaneseClick: () => this.handleLanguageSelection('ja'),
32        };
33  
34        this.eventHandlers = bindEventHandlersDefault(this, handlers);
35      } catch (error) {
36        console.error('Failed to initialize language buttons:', error);
37      }
38    }
39  
40    async _attachEventListeners() {
41      try {
42        if (!this.eventHandlers) {
43          console.warn('Event handlers not initialized, cannot attach language event listeners');
44          return;
45        }
46  
47        if (!this.japaneseButton && !this.chineseButton) {
48          console.warn('Language buttons not initialized, cannot attach language event listeners');
49          return;
50        }
51  
52        attachLanguageEventListenersDefault(
53          this.japaneseButton,
54          this.chineseButton,
55          this.eventHandlers,
56        );
57      } catch (error) {
58        console.error('Failed to attach language event listeners:', error);
59      }
60    }
61  
62    async _detachEventListeners() {
63      try {
64        if (!this.eventHandlers) {
65          console.warn('Event handlers not initialized, cannot detach language event listeners');
66          return;
67        }
68  
69        if (!this.japaneseButton && !this.chineseButton) {
70          console.warn('Language buttons not initialized, cannot detach language event listeners');
71          return;
72        }
73  
74        detachLanguageEventListenersDefault(
75          this.japaneseButton,
76          this.chineseButton,
77          this.eventHandlers,
78        );
79      } catch (error) {
80        console.error('Failed to detach language event listeners:', error);
81      }
82    }
83  
84    async handleLanguageSelection(language) {
85      try {
86        handleLanguageSelectionDefault(this.uiManager, language);
87      } catch (error) {
88        console.error(`Failed to handle ${language} language selection:`, error);
89      }
90    }
91  
92    cleanup() {
93      this._detachEventListeners().catch(error => {
94        console.error('Error during language manager cleanup:', error);
95      });
96    }
97  }