2declare( strict_types = 1 );
4namespace MediaWiki\Extension\Translate\MessageBundleTranslation;
8use MediaWiki\Hook\EditFilterMergedContentHook;
9use MediaWiki\Logger\LoggerFactory;
10use MediaWiki\MediaWikiServices;
11use MediaWiki\Revision\SlotRecord;
12use MediaWiki\Status\Status;
13use MediaWiki\Storage\Hook\PageSaveCompleteHook;
14use MediaWiki\Title\Title;
15use MediaWiki\User\User;
16use Psr\Log\LoggerInterface;
24class Hooks implements EditFilterMergedContentHook, PageSaveCompleteHook {
25 public const CONSTRUCTOR_OPTIONS = [
26 'TranslateEnableMessageBundleIntegration',
29 private static self $instance;
30 private LoggerInterface $logger;
32 private WANObjectCache $WANObjectCache;
33 private bool $enableIntegration;
35 public function __construct(
36 LoggerInterface $logger,
37 WANObjectCache $WANObjectCache,
39 bool $enableIntegration
41 $this->logger = $logger;
42 $this->WANObjectCache = $WANObjectCache;
43 $this->messageBundleStore = $messageBundleStore;
44 $this->enableIntegration = $enableIntegration;
47 public static function getInstance():
self {
48 $services = MediaWikiServices::getInstance();
49 self::$instance ??=
new self(
50 LoggerFactory::getInstance(
'Translate.MessageBundle' ),
51 $services->getMainWANObjectCache(),
52 $services->get(
'Translate:MessageBundleStore' ),
53 $services->getMainConfig()->get(
'TranslateEnableMessageBundleIntegration' )
55 return self::$instance;
60 IContextSource $context,
71 $this->messageBundleStore->validate( $context->getTitle(), $content );
75 $status->fatal(
'translate-messagebundle-validation-error', $context->msg( $e ) );
89 if ( !$this->enableIntegration ) {
94 $content = $revisionRecord->getContent( SlotRecord::MAIN );
95 $pageTitle = $wikiPage->getTitle();
97 if ( $content ===
null ) {
98 $this->logger->debug(
"Unable to access content of page {pageName} in $method", [
99 'pageName' => $pageTitle->getPrefixedText()
104 if ( !$content instanceof MessageBundleContent ) {
109 $this->messageBundleStore->save( $pageTitle, $revisionRecord, $content );
110 }
catch ( MalformedBundle $e ) {
112 $this->logger->warning(
"Page {pageName} is not a valid message bundle in $method", [
113 'pageName' => $pageTitle->getPrefixedText(),
122 if ( $model === MessageBundleContent::CONTENT_MODEL_ID ) {