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;
9use MediaWiki\Hook\EditFilterMergedContentHook;
10use MediaWiki\Logger\LoggerFactory;
11use MediaWiki\MediaWikiServices;
12use MediaWiki\Revision\SlotRecord;
13use MediaWiki\Storage\Hook\PageSaveCompleteHook;
15use Psr\Log\LoggerInterface;
16use Status;
17use Title;
18use User;
19use WANObjectCache;
20use Wikimedia\Rdbms\ILoadBalancer;
21
27class Hooks implements EditFilterMergedContentHook, PageSaveCompleteHook {
28 public const CONSTRUCTOR_OPTIONS = [
29 'TranslateEnableMessageBundleIntegration',
30 ];
31
33 private static $instance;
35 private $logger;
37 private $loadBalancer;
39 private $messageBundleStore;
41 private $WANObjectCache;
43 private $enableIntegration;
44
45 public function __construct(
46 LoggerInterface $logger,
47 ILoadBalancer $loadBalancer,
48 WANObjectCache $WANObjectCache,
49 MessageBundleStore $messageBundleStore,
50 bool $enableIntegration
51 ) {
52 $this->logger = $logger;
53 $this->loadBalancer = $loadBalancer;
54 $this->WANObjectCache = $WANObjectCache;
55 $this->messageBundleStore = $messageBundleStore;
56 $this->enableIntegration = $enableIntegration;
57 }
58
59 public static function getInstance(): self {
60 $services = MediaWikiServices::getInstance();
61 self::$instance = self::$instance ??
62 new self(
63 LoggerFactory::getInstance( 'Translate.MessageBundle' ),
64 $services->getDBLoadBalancer(),
65 $services->getMainWANObjectCache(),
66 $services->get( 'Translate:MessageBundleStore' ),
67 $services->getMainConfig()->get( 'TranslateEnableMessageBundleIntegration' )
68 );
69 return self::$instance;
70 }
71
74 IContextSource $context,
75 Content $content,
76 Status $status,
77 $summary,
78 User $user,
79 $minoredit
80 ): void {
81 if ( $content instanceof MessageBundleContent ) {
82 try {
83 // Validation is performed in the store because injecting services into the
84 // Content class is not straightforward
85 $this->messageBundleStore->validate( $context->getTitle(), $content );
86 } catch ( MalformedBundle $e ) {
87 // MalformedBundle implements MessageSpecifier, but for unknown reason it gets
88 // cast to a string if we don't convert it to a proper message.
89 $status->fatal( 'translate-messagebundle-validation-error', $context->msg( $e ) );
90 }
91 }
92 }
93
95 public function onPageSaveComplete(
96 $wikiPage,
97 $user,
98 $summary,
99 $flags,
100 $revisionRecord,
101 $editResult
102 ): void {
103 if ( !$this->enableIntegration ) {
104 return;
105 }
106
107 $method = __METHOD__;
108 $content = $revisionRecord->getContent( SlotRecord::MAIN );
109 $pageTitle = $wikiPage->getTitle();
110
111 if ( $content === null ) {
112 $this->logger->debug( "Unable to access content of page {pageName} in $method", [
113 'pageName' => $pageTitle->getPrefixedText()
114 ] );
115 return;
116 }
117
118 if ( !$content instanceof MessageBundleContent ) {
119 return;
120 }
121
122 try {
123 $this->messageBundleStore->save( $pageTitle, $revisionRecord, $content );
124 } catch ( MalformedBundle $e ) {
125 // This should not happen, as it should not be possible to save a page with invalid content
126 $this->logger->warning( "Page {pageName} is not a valid message bundle in $method", [
127 'pageName' => $pageTitle->getPrefixedText(),
128 'exception' => $e,
129 ] );
130 return;
131 }
132 }
133
135 public static function onTranslateInitGroupLoaders( array &$groupLoader ): void {
136 self::getInstance()->onTranslateInitGroupLoadersImpl( $groupLoader );
137 }
138
140 public static function onCodeEditorGetPageLanguage( Title $title, ?string &$lang, string $model ) {
141 if ( $model === MessageBundleContent::CONTENT_MODEL_ID ) {
142 $lang = 'json';
143 }
144 }
145
146 public function onTranslateInitGroupLoadersImpl( array &$groupLoader ): void {
147 if ( !$this->enableIntegration ) {
148 return;
149 }
150
151 $groupLoader[] = new MessageBundleMessageGroupLoader(
152 Utilities::getSafeReadDB(),
153 new MessageGroupWANCache( $this->WANObjectCache )
154 );
155 }
156}
static onCodeEditorGetPageLanguage(Title $title, ?string &$lang, string $model)
Hook: CodeEditorGetPageLanguage.
Definition Hooks.php:140
static onTranslateInitGroupLoaders(array &$groupLoader)
Hook: TranslateInitGroupLoaders.
Definition Hooks.php:135
onPageSaveComplete( $wikiPage, $user, $summary, $flags, $revisionRecord, $editResult)
@inheritDoc
Definition Hooks.php:95
onEditFilterMergedContent(IContextSource $context, Content $content, Status $status, $summary, User $user, $minoredit)
@inheritDoc
Definition Hooks.php:73
Essentially random collection of helper functions, similar to GlobalFunctions.php.
Definition Utilities.php:30
Wrapper around WANObjectCache providing a simpler interface for MessageGroups to use the cache.