diff --git a/module/VuFind/src/VuFind/I18n/Translator/Loader/ExtendedIni.php b/module/VuFind/src/VuFind/I18n/Translator/Loader/ExtendedIni.php index bd5c631eb92a553a8a06b74103b355556a1ef4fb..4c6f922b7ccdd5ba39878adefe06a4e9b78afff0 100644 --- a/module/VuFind/src/VuFind/I18n/Translator/Loader/ExtendedIni.php +++ b/module/VuFind/src/VuFind/I18n/Translator/Loader/ExtendedIni.php @@ -159,7 +159,26 @@ class ExtendedIni implements FileLoaderInterface if ($data === false) { throw new InvalidArgumentException("Ini file '{$filename}' not found"); } - return $data; + + // Load parent data, if necessary: + return $this->loadParentData($data); + } + + /** + * Support method for loadLanguageFile: retrieve parent data. + * + * @param TextDomain $data TextDomain to populate with parent information. + * + * @return TextDomain + */ + protected function loadParentData($data) + { + if (!isset($data['@parent_ini'])) { + return $data; + } + $parent = $this->loadLanguageFile($data['@parent_ini']); + $parent->merge($data); + return $parent; } /** diff --git a/module/VuFind/tests/fixtures/language/base/child1.ini b/module/VuFind/tests/fixtures/language/base/child1.ini new file mode 100644 index 0000000000000000000000000000000000000000..9ec420aee08e7f00ef1b446ff5e0c0970e9ff11f --- /dev/null +++ b/module/VuFind/tests/fixtures/language/base/child1.ini @@ -0,0 +1,2 @@ +@parent_ini = "fake.ini" +test2 = "test 2" \ No newline at end of file diff --git a/module/VuFind/tests/fixtures/language/base/child2.ini b/module/VuFind/tests/fixtures/language/base/child2.ini new file mode 100644 index 0000000000000000000000000000000000000000..07c807983149ef623ceede2ed8f8b7583c410ba2 --- /dev/null +++ b/module/VuFind/tests/fixtures/language/base/child2.ini @@ -0,0 +1,2 @@ +@parent_ini = "child1.ini" +test1 = "test 1" \ No newline at end of file diff --git a/module/VuFind/tests/fixtures/language/base/self-parent.ini b/module/VuFind/tests/fixtures/language/base/self-parent.ini new file mode 100644 index 0000000000000000000000000000000000000000..2babc6e38cf5547ee8c1c597010c9f6e833fd6aa --- /dev/null +++ b/module/VuFind/tests/fixtures/language/base/self-parent.ini @@ -0,0 +1,2 @@ +@parent_ini = "self-parent.ini" +string = "bad" \ No newline at end of file diff --git a/module/VuFind/tests/unit-tests/src/VuFindTest/I18n/Translator/Loader/ExtendedIniTest.php b/module/VuFind/tests/unit-tests/src/VuFindTest/I18n/Translator/Loader/ExtendedIniTest.php index c229eb245253abd4a54e995cc85baef5f50cf71c..3ea6e2ec610f1cf354d0912cb596f0b2be6fbde8 100644 --- a/module/VuFind/tests/unit-tests/src/VuFindTest/I18n/Translator/Loader/ExtendedIniTest.php +++ b/module/VuFind/tests/unit-tests/src/VuFindTest/I18n/Translator/Loader/ExtendedIniTest.php @@ -108,6 +108,50 @@ class ExtendedIniTest extends \VuFindTest\Unit\TestCase ); } + /** + * Test file with self as parent. + * + * @return void + */ + public function testSelfAsParent() + { + $pathStack = array( + realpath(__DIR__ . '/../../../../../../fixtures/language/base'), + ); + $loader = new ExtendedIni($pathStack); + $result = $loader->load('self-parent', null); + $this->assertEquals( + array( + '@parent_ini' => 'self-parent.ini', + 'string' => 'bad', + ), + (array)$result + ); + } + + /** + * Test file with a chain of parents. + * + * @return void + */ + public function testParentChain() + { + $pathStack = array( + realpath(__DIR__ . '/../../../../../../fixtures/language/base'), + ); + $loader = new ExtendedIni($pathStack); + $result = $loader->load('child2', null); + $this->assertEquals( + array( + '@parent_ini' => 'child1.ini', + 'test1' => 'test 1', + 'test2' => 'test 2', + 'test3' => 'test three', + ), + (array)$result + ); + } + /** * Test missing path stack. *