Translate extension for MediaWiki
 
Loading...
Searching...
No Matches
Hooks.php
1<?php
2declare( strict_types = 1 );
3
4namespace MediaWiki\Extension\Translate\MessageBundleTranslation;
5
6use Content;
7use IContextSource;
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;
17use WANObjectCache;
18
24class Hooks implements EditFilterMergedContentHook, PageSaveCompleteHook {
25 public const CONSTRUCTOR_OPTIONS = [
26 'TranslateEnableMessageBundleIntegration',
27 ];
28
29 private static self $instance;
30 private LoggerInterface $logger;
31 private MessageBundleStore $messageBundleStore;
32 private WANObjectCache $WANObjectCache;
33 private bool $enableIntegration;
34
35 public function __construct(
36 LoggerInterface $logger,
37 WANObjectCache $WANObjectCache,
38 MessageBundleStore $messageBundleStore,
39 bool $enableIntegration
40 ) {
41 $this->logger = $logger;
42 $this->WANObjectCache = $WANObjectCache;
43 $this->messageBundleStore = $messageBundleStore;
44 $this->enableIntegration = $enableIntegration;
45 }
46
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' )
54 );
55 return self::$instance;
56 }
57
60 IContextSource $context,
61 Content $content,
62 Status $status,
63 $summary,
64 User $user,
65 $minoredit
66 ): void {
67 if ( $content instanceof MessageBundleContent ) {
68 try {
69 // Validation is performed in the store because injecting services into the
70 // Content class is not straightforward
71 $this->messageBundleStore->validate( $context->getTitle(), $content );
72 } catch ( MalformedBundle $e ) {
73 // MalformedBundle implements MessageSpecifier, but for unknown reason it gets
74 // cast to a string if we don't convert it to a proper message.
75 $status->fatal( 'translate-messagebundle-validation-error', $context->msg( $e ) );
76 }
77 }
78 }
79
81 public function onPageSaveComplete(
82 $wikiPage,
83 $user,
84 $summary,
85 $flags,
86 $revisionRecord,
87 $editResult
88 ): void {
89 if ( !$this->enableIntegration ) {
90 return;
91 }
92
93 $method = __METHOD__;
94 $content = $revisionRecord->getContent( SlotRecord::MAIN );
95 $pageTitle = $wikiPage->getTitle();
96
97 if ( $content === null ) {
98 $this->logger->debug( "Unable to access content of page {pageName} in $method", [
99 'pageName' => $pageTitle->getPrefixedText()
100 ] );
101 return;
102 }
103
104 if ( !$content instanceof MessageBundleContent ) {
105 return;
106 }
107
108 try {
109 $this->messageBundleStore->save( $pageTitle, $revisionRecord, $content );
110 } catch ( MalformedBundle $e ) {
111 // This should not happen, as it should not be possible to save a page with invalid content
112 $this->logger->warning( "Page {pageName} is not a valid message bundle in $method", [
113 'pageName' => $pageTitle->getPrefixedText(),
114 'exception' => $e,
115 ] );
116 return;
117 }
118 }
119
121 public static function onCodeEditorGetPageLanguage( Title $title, ?string &$lang, string $model ) {
122 if ( $model === MessageBundleContent::CONTENT_MODEL_ID ) {
123 $lang = 'json';
124 }
125 }
126}
static onCodeEditorGetPageLanguage(Title $title, ?string &$lang, string $model)
Hook: CodeEditorGetPageLanguage.
Definition Hooks.php:121
onPageSaveComplete( $wikiPage, $user, $summary, $flags, $revisionRecord, $editResult)
@inheritDoc
Definition Hooks.php:81
onEditFilterMergedContent(IContextSource $context, Content $content, Status $status, $summary, User $user, $minoredit)
@inheritDoc
Definition Hooks.php:59