19declare(strict_types=1);
31use PHPUnit\Framework\Attributes\DataProvider;
32use PHPUnit\Framework\TestCase;
43 array $shipped_migrated_modules,
44 array $customized_remarks = [],
45 array $shipped_line_comments = [],
46 array $overlay_only_modules = []
49 $method =
new ReflectionMethod(LanguageInstallationManager::class,
'migratedModuleRemarks');
51 return $method->invoke(
54 $shipped_migrated_modules,
56 $shipped_line_comments,
57 $this->root .
'/client-data',
65 $entry = new \ILIAS\Language\ComponentTranslation\Catalog\TranslationEntry(self::MODULE, $identifier);
66 $entry->translate($value);
67 LocalChangeComments::setRemark($entry, $remark);
68 $catalog->add($entry);
77 $this->shipPo([
'greeting' =>
'Hallo']);
78 $this->seedOverlayWithRemark(
'greeting',
'Hallo',
'Overlay-Bemerkung');
79 $this->collation_rows = [
80 [
'module' => self::MODULE,
'identifier' =>
'greeting',
'remarks' =>
'DB-Bemerkung'],
83 $remarks = $this->callMigratedModuleRemarks(
84 [self::MODULE => [
'greeting' =>
'Hallo']],
85 [self::MODULE => [
'greeting' =>
'Customizing-Bemerkung']]
88 $this->assertSame([
'greeting' =>
'Customizing-Bemerkung'], $remarks[self::MODULE]);
93 $this->shipPo([
'greeting' =>
'Hallo']);
94 $this->seedOverlayWithRemark(
'greeting',
'Hallo',
'Overlay-Bemerkung');
95 $this->collation_rows = [
96 [
'module' => self::MODULE,
'identifier' =>
'greeting',
'remarks' =>
'DB-Bemerkung'],
99 $remarks = $this->callMigratedModuleRemarks([self::MODULE => [
'greeting' =>
'Hallo']]);
101 $this->assertSame([
'greeting' =>
'Overlay-Bemerkung'], $remarks[self::MODULE]);
106 $this->shipPo([
'greeting' =>
'Hallo']);
107 $this->collation_rows = [
108 [
'module' => self::MODULE,
'identifier' =>
'greeting',
'remarks' =>
'DB-Bemerkung'],
111 $remarks = $this->callMigratedModuleRemarks([self::MODULE => [
'greeting' =>
'Hallo']]);
113 $this->assertSame([
'greeting' =>
'DB-Bemerkung'], $remarks[self::MODULE]);
119 $this->shipPo([
'greeting' =>
'Hallo',
'farewell' =>
'Tschüss']);
120 $this->seedOverlayWithRemark(
'greeting',
'Hallo',
'Overlay-Bemerkung');
121 $this->collation_rows = [
122 [
'module' => self::MODULE,
'identifier' =>
'greeting',
'remarks' =>
'DB-Bemerkung'],
123 [
'module' => self::MODULE,
'identifier' =>
'farewell',
'remarks' =>
'DB-Bemerkung 2'],
126 $remarks = $this->callMigratedModuleRemarks(
127 [self::MODULE => [
'greeting' =>
'Hallo',
'farewell' =>
'Tschüss']],
128 [self::MODULE => [
'customized' =>
'Customizing-Bemerkung']],
133 $this->assertSame([
'greeting' =>
'Overlay-Bemerkung',
'customized' =>
'Customizing-Bemerkung'], $remarks[self::MODULE]);
138 $this->shipPo([
'greeting' =>
'Hallo']);
139 $this->collation_rows = [];
141 $remarks = $this->callMigratedModuleRemarks([self::MODULE => [
'greeting' =>
'Hallo']]);
143 $this->assertSame([], $remarks[self::MODULE] ?? []);
151 $this->shipPo([
'greeting' =>
'Hallo']);
152 $this->collation_rows = [
153 [
'module' => self::MODULE,
'identifier' =>
'greeting',
'remarks' =>
'Alter Zeilenkommentar'],
156 $remarks = $this->callMigratedModuleRemarks(
157 [self::MODULE => [
'greeting' =>
'Hallo']],
159 [self::MODULE => [
'greeting' =>
'Alter Zeilenkommentar']]
162 $this->assertArrayNotHasKey(
'greeting', $remarks[self::MODULE] ?? []);
171 $entry = new \ILIAS\Language\ComponentTranslation\Catalog\TranslationEntry(self::MODULE,
'greeting');
172 $entry->translate(
'Hallo');
173 $entry->addExtractedComment(
'PO-Notiz');
174 $catalog->add($entry);
176 $this->collation_rows = [
177 [
'module' => self::MODULE,
'identifier' =>
'greeting',
'remarks' =>
'PO-Notiz'],
180 $remarks = $this->callMigratedModuleRemarks([self::MODULE => [
'greeting' =>
'Hallo']]);
182 $this->assertArrayNotHasKey(
'greeting', $remarks[self::MODULE] ?? []);
189 $entry = new \ILIAS\Language\ComponentTranslation\Catalog\TranslationEntry(self::MODULE,
'greeting');
190 $entry->translate(
'Hallo');
191 $entry->addTranslatorNote(
'Eigene Notiz');
192 $catalog->add($entry);
194 $this->collation_rows = [
195 [
'module' => self::MODULE,
'identifier' =>
'greeting',
'remarks' =>
'Eigene Notiz'],
198 LocalChangeComments::setRemark($overlay->find(self::MODULE,
'greeting'),
' Eigene Notiz ');
201 $remarks = $this->callMigratedModuleRemarks([self::MODULE => [
'greeting' =>
'Hallo']]);
203 $this->assertArrayNotHasKey(
'greeting', $remarks[self::MODULE] ?? []);
213 foreach ([
'greeting' =>
'Merk',
'other' =>
'Notiz'] as $identifier => $note) {
214 $entry = new \ILIAS\Language\ComponentTranslation\Catalog\TranslationEntry(self::MODULE, $identifier);
215 $entry->translate(
'Wert');
216 $entry->addExtractedComment($note);
217 $catalog->add($entry);
221 LocalChangeComments::setRemark($overlay->find(self::MODULE,
'greeting'),
' Merk ');
222 LocalChangeComments::setRemark($overlay->find(self::MODULE,
'other'),
'Eigene Bemerkung');
225 $remarks = $this->callMigratedModuleRemarks([self::MODULE => [
'greeting' =>
'Wert',
'other' =>
'Wert']]);
227 $this->assertSame([
'other' =>
'Eigene Bemerkung'], $remarks[self::MODULE]);
236 $this->shipPo([
'greeting' =>
'Hallo']);
238 MigratedLanguageFileSync::sync($directories, $this->root,
'de', self::MODULE, [
'greeting' =>
'Servus'], $this->root .
'/client-data',
false,
null, [
'greeting' =>
'Merk']);
239 $this->assertSame(
'Merk', MigratedLanguageFileSync::loadRemarks($directories,
'de', self::MODULE, $this->root .
'/client-data', $this->root)[
'greeting'] ??
null,
'precondition');
241 mkdir($this->root .
'/backup');
243 $this->assertSame([], $result[
'skipped'],
'precondition');
245 $this->manager()->insertLanguageForInstallation(
'de');
247 $this->assertFileDoesNotExist($this->overlayBase() .
'.po');
248 $shipped =
MigratedPoFixture::readPo($this->root .
'/components/pilot/lang/pilot_de.po')->find(self::MODULE,
'greeting');
249 $this->assertSame(
'Servus', $shipped?->getTranslation());
250 $this->assertSame([
'Merk'], $shipped->getTranslatorComments());
251 $this->assertSame(
'Servus', $this->lngModules()[self::MODULE][
'greeting']);
252 $this->assertSame(
'Servus', (
new \
ILIAS\Language\ComponentTranslation\TranslationGettextRepository())->getText(self::MODULE,
'de',
'greeting', $this->root .
'/client-data'));
261 $this->shipPo([
'greeting' =>
'Hallo']);
262 $this->collation_rows = [
263 [
'module' => self::MODULE,
'identifier' =>
'greeting',
'remarks' =>
'28 08 2012 new variable'],
266 $remarks = $this->callMigratedModuleRemarks([self::MODULE => [
'greeting' =>
'Hallo']]);
268 $this->assertArrayNotHasKey(
'greeting', $remarks[self::MODULE] ?? []);
276 $this->shipPo([
'greeting' =>
'Hallo']);
277 $this->collation_rows = [
278 [
'module' => self::MODULE,
'identifier' =>
'greeting',
'remarks' =>
'Echte Admin-Bemerkung'],
281 $remarks = $this->callMigratedModuleRemarks(
282 [self::MODULE => [
'greeting' =>
'Hallo']],
284 [self::MODULE => [
'greeting' =>
'Ganz anderer Zeilenkommentar']]
287 $this->assertSame(
'Echte Admin-Bemerkung', $remarks[self::MODULE][
'greeting'] ??
null);
An in-memory gettext catalog (header block plus messages) and the only place of the component that re...
Reads the shipped .po of a migrated module and maintains its per-installation overlay: the ....
static merge(LanguageFileDirectoryManager $language_file_directory_manager, string $ilias_absolute_path, string $lang_key, ?string $client_data_dir, string $backup_directory, ?\Closure $after_module=null)
The module array just written to lng_modules could not be read back - almost always a wrong collation...
Write access to the language installation: installing, flushing and registering languages in the data...
Fixtures of the LanguageInstallationManager tests for modules migrated to PO/MO ("pilot").
manager(?\Closure $client_data_dir_resolver=null, ?\Closure $language_cache_invalidator=null, bool $with_resolver=true, bool $with_logger=true, ?LoggerInterface $logger=null)
static writePair(string $base_path, TranslationCatalog $catalog)
Writes "<base>.po" and, like MigratedLanguageFileSync::sync(), its compiled revision named by current...
static catalog(string $module, array $entries)
static writePo(string $file, TranslationCatalog $catalog)
static readPo(string $file)
static build(LanguageFileDirectoryManager $manager, string $ilias_absolute_path)
Builds the shipped .po files of $manager below $ilias_absolute_path into the artifact directory of re...
A directory of language files with a path and a prefix for them.
Read-only access to the installed languages (database) and the available or valid language files (fil...
Interface Observer \BackgroundTasks Contains several chained tasks and infos about them.