Translate extension for MediaWiki
 
Loading...
Searching...
No Matches
FileBasedMessageGroupFactory.php
1<?php
2declare( strict_types = 1 );
3
4namespace MediaWiki\Extension\Translate\MessageGroupConfiguration;
5
6use FileDependency;
7use MainConfigDependency;
8use MediaWiki\Config\ServiceOptions;
10use Wikimedia\Rdbms\IReadableDatabase;
11
19 public const SERVICE_OPTIONS = [ 'TranslateGroupFiles' ];
20
22 private array $groupFiles;
23
24 public function __construct(
25 private readonly MessageGroupConfigurationParser $messageGroupConfigurationParser,
26 private readonly MessageGroupFactory $messageGroupFactory,
27 private readonly string $contentLanguageCode,
28 ServiceOptions $serviceOptions
29 ) {
30 $serviceOptions->assertRequiredOptions( self::SERVICE_OPTIONS );
31 $this->groupFiles = $serviceOptions->get( 'TranslateGroupFiles' );
32 }
33
34 public function getCacheKey(): string {
35 return 'file-based-groups';
36 }
37
38 public function getCacheVersion(): int {
39 return 2;
40 }
41
42 public function getDependencies(): array {
43 $deps = [ new MainConfigDependency( 'TranslateGroupFiles' ) ];
44
45 foreach ( $this->groupFiles as $configFile ) {
46 $deps[] = new FileDependency( realpath( $configFile ) );
47 }
48
49 return $deps;
50 }
51
52 public function getData( IReadableDatabase $db ): array {
53 $autoload = $groups = $value = [];
54 $parser = $this->messageGroupConfigurationParser;
55 foreach ( $this->groupFiles as $configFile ) {
56 $yaml = file_get_contents( $configFile );
57 $parsedData = $parser->getHopefullyValidConfigurations(
58 $yaml,
59 static function ( $index, $config, $error ) use ( $configFile ) {
60 trigger_error( "Document $index in $configFile is invalid: $error", E_USER_WARNING );
61 }
62 );
63
64 foreach ( $parsedData as $id => $conf ) {
65 if ( !empty( $conf['AUTOLOAD'] ) && is_array( $conf['AUTOLOAD'] ) ) {
66 $dir = dirname( $configFile );
67 $additions = array_map( static function ( $file ) use ( $dir ) {
68 return "$dir/$file";
69 }, $conf['AUTOLOAD'] );
70 self::appendAutoloader( $additions, $autoload );
71 }
72
73 $groups[$id] = $conf;
74 }
75 }
76 $value['groups'] = $groups;
77 $value['autoload'] = $autoload;
78
79 return $value;
80 }
81
83 public function createGroups( $data ): array {
84 global $wgAutoloadClasses;
85 self::appendAutoloader( $data['autoload'], $wgAutoloadClasses );
86
87 $groups = [];
88 foreach ( $data['groups'] as $id => $conf ) {
89 $conf['BASIC']['sourcelanguage'] ??= $this->contentLanguageCode;
90 $groups[$id] = $this->messageGroupFactory->createGroup( $conf );
91 }
92
93 return $groups;
94 }
95
102 private static function appendAutoloader( array $additions, array &$to ) {
103 foreach ( $additions as $class => $file ) {
104 if ( isset( $to[$class] ) && $to[$class] !== $file ) {
105 $msg = "Autoload conflict for $class: $to[$class] !== $file";
106 trigger_error( $msg, E_USER_WARNING );
107 continue;
108 }
109
110 $to[$class] = $file;
111 }
112 }
113}
Canonical factory for constructing YAML-configured message groups.