13use Psr\Log\LoggerAwareInterface;
14use Psr\Log\LoggerInterface;
15use Psr\Log\NullLogger;
30 private $resourceloader;
48 $this->resourceloader = $rl;
49 $this->logger =
$logger ?:
new NullLogger();
55 ->getMainWANObjectCache();
75 $blobs = $this->getBlobs( [ $module->
getName() => $module ], $lang );
76 return $blobs[$module->
getName()];
87 public function getBlobs( array $modules, $lang ) {
92 self::makeGlobalPurgeKey( $this->wanCache )
95 foreach ( $modules as $name => $module ) {
96 $cacheKey = $this->makeBlobCacheKey( $name, $lang, $module );
97 $cacheKeys[$name] = $cacheKey;
98 $checkKeys[$cacheKey][] = $this->makeModulePurgeKey( $name );
101 $result = $this->wanCache->getMulti( array_values( $cacheKeys ), $curTTLs, $checkKeys );
104 foreach ( $modules as $name => $module ) {
105 $key = $cacheKeys[$name];
106 if ( !isset( $result[$key] ) || $curTTLs[$key] ===
null || $curTTLs[$key] < 0 ) {
107 $blobs[$name] = $this->recacheMessageBlob( $key, $module, $lang );
110 $blobs[$name] = $result[$key];
120 private static function makeGlobalPurgeKey(
WANObjectCache $cache ) {
121 return $cache->
makeGlobalKey(
'resourceloader-messageblob' );
130 private function makeModulePurgeKey( $name ) {
131 return $this->wanCache->makeKey(
'resourceloader-messageblob', $name );
140 private function makeBlobCacheKey( $name, $lang, Module $module ) {
141 $messages = array_values( array_unique( $module->getMessages() ) );
143 return $this->wanCache->makeKey(
'resourceloader-messageblob',
146 md5( json_encode( $messages ) )
158 $blob = $this->generateMessageBlob( $module, $lang );
159 $cache = $this->wanCache;
161 $cache->
set( $cacheKey, $blob,
163 $cache::TTL_WEEK + mt_rand( 0, $cache::TTL_DAY ),
176 $moduleNames = $this->resourceloader->getModulesByMessage( $key );
177 foreach ( $moduleNames as $moduleName ) {
180 $this->wanCache->touchCheckKey( $this->makeModulePurgeKey( $moduleName ) );
198 $cache->
touchCheckKey( self::makeGlobalPurgeKey( $cache ), $cache::HOLDOFF_TTL_NONE );
208 $message =
wfMessage( $key )->inLanguage( $lang );
209 if ( !$message->exists() ) {
210 $this->logger->warning(
'Failed to find {messageKey} ({lang})', [
211 'messageKey' => $key,
216 $value = $message->plain();
228 private function generateMessageBlob(
Module $module, $lang ) {
231 $value = $this->fetchMessage( $key, $lang );
234 if ( $value !==
null ) {
235 $messages[$key] = $value;
239 $json = FormatJson::encode( (
object)$messages,
false, FormatJson::UTF8_OK );
241 if ( $json ===
false ) {
242 $this->logger->warning(
'Failed to encode message blob for {module} ({lang})', [
243 'module' => $module->
getName(),
wfMessage( $key,... $params)
This is the function for getting translated interface messages.