Конфликт перевода между модулями в пределах одного раздела system_config
-
13-12-2019 - |
Вопрос
Я создал свой собственный раздел (скажем, "Компания") под управлением администратора system_config
<config>
<sections>
<company translate="label">
<label>Company</label>
<tab>service</tab>
<frontend_type>text</frontend_type>
<sort_order>400</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
</company >
</sections>
</config>
Я создал 2 модуля, добавив их собственную группу в разделе "Компания".Эти группы отображаются так, как задумано.Оба модуля хорошо настроены для обработки переводов adminhtml.
Модуль 1 :
<config>
<adminhtml>
<translate>
<modules>
<company>
<files>
<default>Company_Module1.csv</default>
</files>
</company>
</modules>
</translate>
</adminhtml>
</config>
и модуль 2 :
<config>
<adminhtml>
<translate>
<modules>
<company>
<files>
<default>Company_Module2.csv</default>
</files>
</company>
</modules>
</translate>
</adminhtml>
</config>
Итак, вот моя проблема :Я создал модуль 2 перед модулем 1.Пока модуль 2 был один в разделе компании, мои строки были переведены правильно.Как только я создал модуль 1 и добавил его группу в раздел "Компания", были переведены только ярлыки и комментарии модуля 1.
Похоже, что только Company_Module1.csv
используется.Любая строка в Company_Module2.csv
игнорируется.Если я скопирую свой Company_Module2.csv
содержание в Company_Module1.csv
файл, то модуль 2 теперь переведен правильно.Это очень странно, потому что я явно настроил модуль 2 для перевода с Company_Module2.csv
и не от Company_Module1.csv
.
Кто-нибудь может объяснить такое поведение?В конце концов, это поможет мне понять, что я сделал не так, и исправить это.Спасибо!
Решение
Чтобы понять это поведение, вам нужно знать, как Magento считывает свои конфигурационные файлы.
Во-первых, все XML-файлы объединяются в одну большую структуру.Результат выглядит примерно так:
<config>
<adminhtml>
<translate>
<modules>
<company>
<files>
<default>Company_Module1.csv</default>
<default>Company_Module2.csv</default>
</files>
</company>
</modules>
</translate>
</adminhtml>
</config>
Затем доступ к большинству значений осуществляется либо через XPath, либо преобразуется в структуру ассоциативного массива.Эта структура была бы чем-то вроде
'files' => array(
'default' => 'Company_Module1.csv',
'default' => 'Company_Module2.csv',
)
Но массив не может иметь один и тот же ключ дважды, поэтому в итоге он получает только одно значение.
Решение
Всегда используйте уникальный идентификаторы в ваших конфигурационных файлах, где бы вы ни могли выбрать их самостоятельно.
Это должно быть:
<config>
<adminhtml>
<translate>
<modules>
<company_module1>
<files>
<default>Company_Module1.csv</default>
</files>
</company>
</modules>
</translate>
</adminhtml>
</config>
и
<config>
<adminhtml>
<translate>
<modules>
<company_module2>
<files>
<default>Company_Module2.csv</default>
</files>
</company>
</modules>
</translate>
</adminhtml>
</config>
Кроме того, в system.xml вы не указали, какой модуль следует использовать, это может привести к неожиданному поведению при наличии противоречивых переводов.Лучше:
<company translate="label" module="Company_Module1">
Но это не имеет отношения к вашей проблеме