From 0450a3e2c7cba00ab44e5de2eaec0d89e9355153 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 20 Sep 2023 10:48:58 -0400 Subject: [PATCH 1/2] misc: Add new LanguageManager class Right now language changes aren't reflected until log out. This is hard to fix completely, but we can at least refresh the main UI elements without too much fuss. This commit adds a language manager class to listen for when a user's language configuration changes to then emit a 'language-changed' signal that bits of the UI can listen for to recreate themselves. Future commits will handle actually listening for the signal. --- js/js-resources.gresource.xml | 1 + js/misc/languageManager.js | 34 ++++++++++++++++++++++++++++++++++ js/ui/main.js | 4 ++++ 3 files changed, 39 insertions(+) create mode 100644 js/misc/languageManager.js diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml index ee4b7635e..8485b52f1 100644 --- a/js/js-resources.gresource.xml +++ b/js/js-resources.gresource.xml @@ -28,6 +28,7 @@ misc/introspect.js misc/jsParse.js misc/keyboardManager.js + misc/languageManager.js misc/loginManager.js misc/modemManager.js misc/objectManager.js diff --git a/js/misc/languageManager.js b/js/misc/languageManager.js new file mode 100644 index 000000000..a8c7ca4e3 --- /dev/null +++ b/js/misc/languageManager.js @@ -0,0 +1,34 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +import AccountsService from 'gi://AccountsService'; +import Gio from 'gi://Gio'; +import GLib from 'gi://GLib'; +import * as Signals from './signals.js'; +import * as Gettext from 'gettext'; + +export class LanguageManager extends Signals.EventEmitter { + constructor() { + super(); + + this._userManager = AccountsService.UserManager.get_default(); + this._user = this._userManager.get_user(GLib.get_user_name()); + + this._user.connectObject('changed', this._onLanguageUpdated.bind(this)); + } + + _onLanguageUpdated() { + if (this.language === this._user.language) + return; + + this.language = this._user.language; + this.emit('language-changed', this._user.language); + } + + get language() { + return Gettext.setlocale(Gettext.LocaleCategory.ALL, null); + } + + set language(newLanguage) { + Gettext.setlocale(Gettext.LocaleCategory.ALL, newLanguage) + } +} diff --git a/js/ui/main.js b/js/ui/main.js index 9e14bc141..d15e49e15 100644 --- a/js/ui/main.js +++ b/js/ui/main.js @@ -18,6 +18,7 @@ import * as ExtensionSystem from './extensionSystem.js'; import * as ExtensionDownloader from './extensionDownloader.js'; import * as InputMethod from '../misc/inputMethod.js'; import * as Introspect from '../misc/introspect.js'; +import * as LanguageManager from '../misc/languageManager.js'; import * as Keyboard from './keyboard.js'; import * as MessageTray from './messageTray.js'; import * as ModalDialog from './modalDialog.js'; @@ -57,6 +58,7 @@ const GNOMESHELL_STARTED_MESSAGE_ID = 'f3ea493c22934e26811cd62abe8e203a'; export let componentManager = null; export let extensionManager = null; +export let languageManager = null; export let panel = null; export let overview = null; export let runDialog = null; @@ -152,6 +154,8 @@ export async function start() { if (!currentDesktop || !currentDesktop.split(':').includes('GNOME')) Gio.DesktopAppInfo.set_desktop_env('GNOME'); + languageManager = new LanguageManager.LanguageManager(); + sessionMode = new SessionMode.SessionMode(); sessionMode.connect('updated', _sessionUpdated); From 26a027a02a47d0cd6c94f8b41d754ee6c1695dcb Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 20 Sep 2023 10:51:17 -0400 Subject: [PATCH 2/2] panel: React to new 'language-changed' signal This commit makes the panel sets up a connection to the new language-changed signal and react by rebuilding its components. --- js/ui/panel.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/js/ui/panel.js b/js/ui/panel.js index 6fa493b69..2289b6588 100644 --- a/js/ui/panel.js +++ b/js/ui/panel.js @@ -682,6 +682,8 @@ class Panel extends St.Widget { _('Top Bar'), 'focus-top-bar-symbolic', {sortGroup: CtrlAltTab.SortGroup.TOP}); + Main.languageManager.connect('language-changed', this._updateLanguage.bind(this)); + Main.sessionMode.connect('updated', this._updatePanel.bind(this)); global.display.connect('workareas-changed', () => this.queue_relayout()); @@ -854,6 +856,13 @@ class Panel extends St.Widget { return this._leftBox.opacity; } + _updateLanguage() { + this._leftBox.destroy_all_children(); + this._centerBox.destroy_all_children(); + this._rightBox.destroy_all_children(); + this._updatePanel(); + } + _updatePanel() { let panel = Main.sessionMode.panel; this._hideIndicators();