BUGFIX i18n module load order in i18n::include_by_locale()

The "project" module (normally mysite) is considered with the highest priority. Yet, the project's i18n is loaded first and cannot overwrite existing translations. I've added a array_reverse(), so the iteration keeps the translation of the module with the highest priority.

Old $sortedModules: mysite, (other_modules,) cms, admin, framework.
New $sortedModules: framework, admin, cms, (other_modules,) mysite.
This commit is contained in:
Devlin 2013-08-05 13:17:29 +02:00
parent 9c75fc06e7
commit 1e5679f20f
4 changed files with 14 additions and 3 deletions

View File

@ -2506,7 +2506,8 @@ class i18n extends Object implements TemplateGlobalProvider {
$sortedModules = array();
foreach ($order as $module) {
if (isset($modules[$module])) $sortedModules[$module] = $modules[$module];
}
}
$sortedModules = array_reverse($sortedModules, true);
// Loop in reverse order, meaning the translator with the highest priority goes first
$translators = array_reverse(self::get_translators(), true);

View File

@ -1,3 +1,4 @@
de:
i18nTestModule:
OTHERENTITY: Other Entity (de)
PRIORITYNOTICE: High Module Priority (de)
OTHERENTITY: Other Entity (de)

View File

@ -11,5 +11,6 @@ de:
WITHNAMESPACE: Include Entity with Namespace (de)
LAYOUTTEMPLATE: Layout Template (de)
SPRINTFNAMESPACE: My replacement: %s (de)
PRIORITYNOTICE: Low Module Priority (de)
i18nTestModuleInclude.ss:
SPRINTFINCLUDENAMESPACE: My include replacement: %s (de)
SPRINTFINCLUDENAMESPACE: My include replacement: %s (de)

View File

@ -435,6 +435,9 @@ class i18nTest extends SapphireTest {
$this->assertFalse($adapter->isTranslated('i18nTestModule.ENTITY', 'af'),
'Non-existing unloaded entity not available before call'
);
// set _fakewebroot module priority
Config::inst()->update('i18n', 'module_priority', array('subfolder','i18ntestmodule'));
i18n::include_by_locale('de');
@ -444,6 +447,11 @@ class i18nTest extends SapphireTest {
$this->assertTrue($adapter->isTranslated('i18nTestTheme1.LAYOUTTEMPLATE', null, 'de'), 'Includes theme files');
$this->assertTrue($adapter->isTranslated('i18nTestModule.OTHERENTITY', null, 'de'), 'Includes submodule files');
// check module priority
$this->assertEquals($adapter->translate('i18nTestModule.PRIORITYNOTICE', 'de'),
'High Module Priority (de)'
);
SS_ClassLoader::instance()->popManifest();
}