2declare( strict_types = 1 );
4namespace MediaWiki\Extension\Translate\MessageBundleTranslation;
9use MediaWiki\Hook\EditFilterMergedContentHook;
10use MediaWiki\Logger\LoggerFactory;
11use MediaWiki\MediaWikiServices;
12use MediaWiki\Revision\SlotRecord;
13use MediaWiki\Storage\Hook\PageSaveCompleteHook;
15use Psr\Log\LoggerInterface;
26class Hooks implements EditFilterMergedContentHook, PageSaveCompleteHook {
27 public const CONSTRUCTOR_OPTIONS = [
28 'TranslateEnableMessageBundleIntegration',
31 private static self $instance;
32 private LoggerInterface $logger;
34 private WANObjectCache $WANObjectCache;
35 private bool $enableIntegration;
37 public function __construct(
38 LoggerInterface $logger,
39 WANObjectCache $WANObjectCache,
41 bool $enableIntegration
43 $this->logger = $logger;
44 $this->WANObjectCache = $WANObjectCache;
45 $this->messageBundleStore = $messageBundleStore;
46 $this->enableIntegration = $enableIntegration;
49 public static function getInstance():
self {
50 $services = MediaWikiServices::getInstance();
51 self::$instance ??=
new self(
52 LoggerFactory::getInstance(
'Translate.MessageBundle' ),
53 $services->getMainWANObjectCache(),
54 $services->get(
'Translate:MessageBundleStore' ),
55 $services->getMainConfig()->get(
'TranslateEnableMessageBundleIntegration' )
57 return self::$instance;
62 IContextSource $context,
73 $this->messageBundleStore->validate( $context->getTitle(), $content );
77 $status->fatal(
'translate-messagebundle-validation-error', $context->msg( $e ) );
91 if ( !$this->enableIntegration ) {
96 $content = $revisionRecord->getContent( SlotRecord::MAIN );
97 $pageTitle = $wikiPage->getTitle();
99 if ( $content ===
null ) {
100 $this->logger->debug(
"Unable to access content of page {pageName} in $method", [
101 'pageName' => $pageTitle->getPrefixedText()
106 if ( !$content instanceof MessageBundleContent ) {
111 $this->messageBundleStore->save( $pageTitle, $revisionRecord, $content );
112 }
catch ( MalformedBundle $e ) {
114 $this->logger->warning(
"Page {pageName} is not a valid message bundle in $method", [
115 'pageName' => $pageTitle->getPrefixedText(),
124 self::getInstance()->onTranslateInitGroupLoadersImpl( $groupLoader );
129 if ( $model === MessageBundleContent::CONTENT_MODEL_ID ) {
134 public function onTranslateInitGroupLoadersImpl( array &$groupLoader ): void {
135 if ( !$this->enableIntegration ) {
139 $groupLoader[] =
new MessageBundleMessageGroupLoader(
140 Utilities::getSafeReadDB(),
Wrapper around WANObjectCache providing a simpler interface for MessageGroups to use the cache.