From f88f37c80eef5dd000d332777c2776024c890bf8 Mon Sep 17 00:00:00 2001 From: nbenedek Date: Sat, 11 Mar 2023 00:16:15 +0100 Subject: [PATCH] mediawiki: Allow setting site language code Closes: #2137 Signed-off-by: nbenedek Reviewed-by: James Valleroy --- plinth/modules/mediawiki/__init__.py | 13 ++++++++++++- .../mediawiki/FreedomBoxStaticSettings.php | 3 +++ plinth/modules/mediawiki/forms.py | 19 +++++++++++++++++++ plinth/modules/mediawiki/privileged.py | 15 +++++++++++++++ plinth/modules/mediawiki/views.py | 11 +++++++++-- 5 files changed, 58 insertions(+), 3 deletions(-) diff --git a/plinth/modules/mediawiki/__init__.py b/plinth/modules/mediawiki/__init__.py index 0a9537f8e..e0534c9c1 100644 --- a/plinth/modules/mediawiki/__init__.py +++ b/plinth/modules/mediawiki/__init__.py @@ -14,7 +14,7 @@ from plinth.modules.backups.components import BackupRestore from plinth.modules.firewall.components import Firewall from plinth.package import Packages -from . import manifest, privileged +from . import manifest, privileged, forms _description = [ _('MediaWiki is the wiki engine that powers Wikipedia and other WikiMedia ' @@ -146,3 +146,14 @@ def set_server_url(domain): def get_site_name(): """Return the value of MediaWiki's site name.""" return _get_config_value('$wgSitename') or 'Wiki' + + +def get_default_language(): + """Return the value of MediaWiki's default language""" + default_lang_key = _get_config_value('$wgLanguageCode') + language_choices = forms.get_languages() + for code, name in language_choices: + if code == default_lang_key: + return code + + return None diff --git a/plinth/modules/mediawiki/data/etc/mediawiki/FreedomBoxStaticSettings.php b/plinth/modules/mediawiki/data/etc/mediawiki/FreedomBoxStaticSettings.php index 3b2dfdd8b..331d63290 100644 --- a/plinth/modules/mediawiki/data/etc/mediawiki/FreedomBoxStaticSettings.php +++ b/plinth/modules/mediawiki/data/etc/mediawiki/FreedomBoxStaticSettings.php @@ -45,6 +45,9 @@ $wgServer = "https://freedombox.local"; # Site Name $wgSitename = "Wiki"; +# Default language +$wgLanguageCode = "en"; + # Enable default extensions wfLoadExtension( 'Cite' ); wfLoadExtension( 'Interwiki' ); diff --git a/plinth/modules/mediawiki/forms.py b/plinth/modules/mediawiki/forms.py index eb447d757..f7be188bf 100644 --- a/plinth/modules/mediawiki/forms.py +++ b/plinth/modules/mediawiki/forms.py @@ -4,6 +4,7 @@ FreedomBox app for configuring MediaWiki. """ import pathlib +import re from django import forms from django.core import validators @@ -20,6 +21,17 @@ def get_skins(): if skin.is_dir()] +def get_languages(): + """Return a list of available languages as choice field values.""" + with open('/var/lib/mediawiki/includes/languages/data/Names.php', + 'r') as lang_file: + content = lang_file.read() + matches = re.findall(r"'([a-z_-]+)' => '(.+)', # .+", content) + language_choices = [(code, name) for code, name in matches] + + return language_choices + + class MediaWikiForm(forms.Form): # pylint: disable=W0232 """MediaWiki configuration form.""" password = forms.CharField( @@ -58,3 +70,10 @@ class MediaWikiForm(forms.Form): # pylint: disable=W0232 help_text=_('Choose a default skin for your MediaWiki installation. ' 'Users have the option to select their preferred skin.'), choices=get_skins) + + default_lang = forms.ChoiceField( + label=_('Default Language'), required=False, + help_text=_('Choose a default language for your MediaWiki ' + 'installation. Users have the option to select ' + 'their preferred language.'), + choices=get_languages) diff --git a/plinth/modules/mediawiki/privileged.py b/plinth/modules/mediawiki/privileged.py index d011f37e0..f78eff76c 100644 --- a/plinth/modules/mediawiki/privileged.py +++ b/plinth/modules/mediawiki/privileged.py @@ -205,3 +205,18 @@ def set_server_url(server_url: str): def set_site_name(site_name: str): """Set the value of $wgSitename for this MediaWiki server.""" _update_setting('$wgSitename', f'$wgSitename = "{site_name}";\n') + + +@privileged +def set_default_language(language: str): + """Set the value of $wgLanguageCode for this MediaWiki server.""" + _update_setting('$wgLanguageCode ', f'$wgLanguageCode = "{language}";\n') + # In MediaWiki 1.8 or older, if you change this after installation, you + # should run the maintenance/rebuildmessages.php script to rebuild the + # user interface messages (MediaWiki namespace). Otherwise, you will not + # see the interface in the new language, or a mix of the old and new + # languages. + rebuild_messages_script = os.path.join(MAINTENANCE_SCRIPTS_DIR, + 'rebuildmessages.php') + subprocess.check_call([ + _get_php_command(), rebuild_messages_script]) diff --git a/plinth/modules/mediawiki/views.py b/plinth/modules/mediawiki/views.py index f08b5e789..f2b995e1e 100644 --- a/plinth/modules/mediawiki/views.py +++ b/plinth/modules/mediawiki/views.py @@ -10,7 +10,8 @@ from plinth import app as app_module from plinth import views from plinth.modules import mediawiki -from . import get_default_skin, get_server_url, get_site_name, privileged +from . import (get_default_skin, + get_server_url, get_site_name, get_default_language, privileged) from .forms import MediaWikiForm logger = logging.getLogger(__name__) @@ -36,7 +37,9 @@ class MediaWikiAppView(views.AppView): 'domain': get_server_url(), 'site_name': - get_site_name() + get_site_name(), + 'default_lang': + get_default_language() }) return initial @@ -102,4 +105,8 @@ class MediaWikiAppView(views.AppView): privileged.set_site_name(new_config['site_name']) messages.success(self.request, _('Site name updated')) + if is_changed('default_lang'): + privileged.set_default_language(new_config['default_lang']) + messages.success(self.request, _('Default language changed')) + return super().form_valid(form)