TL; DR
Если вас не интересуют подробности того, как работает перевод, перейдите к разделу «
Что проверить, если ваш перевод не работает » ниже, особенно в подразделе «
Решение для конфликтов при переводе модуля» .
Обзор перевода на Magento
Magento определяет приоритеты источников переводов (от высшего к низшему):
- БД (
core_translate
таблица)
translate.csv
Файл темы
- Эти
app/locale/*/*.csv
файлы
Как строится массив перевода?
Модульные переводы
Сначала анализируются все файлы, на app/locale/*/*.csv
которые есть ссылки из etc/config.xml
файлов активных модулей . Вот пошаговое руководство процесса:
предположим, что Magento находит следующий config.xml
раздел:
<!-- excerpt from Mage/Catalog/etc/config.xml -->
<frontend>
<translate>
<modules>
<Mage_Catalog>
<files>
<default>Mage_Catalog.csv</default>
</files>
</Mage_Catalog>
</modules>
</translate>
</frontend>
И в этом файле следующий перевод указан для локали, настроенной для текущего представления хранилища:
"AAA","BBB"
При этих обстоятельствах Magento создает следующие записи в массиве перевода:
array(
"AAA" => "BBB",
"Mage_Catalog::AAA" => "BBB"
)
Второе значение - это трансляция модуля . Имя модуля с префиксом берется из узла config XML, содержащего объявление файла перевода.
Если же перевод снова устанавливаются с помощью второго файла модуля , например , в Some_Module.csv
переводе есть "AAA","CCC"
, это будет не перезаписывать на "AAA"
установку. Вместо этого он только добавит новую запись со вторым именем модуля "Some_Module::AAA" => "CCC"
.
Если режим разработчика включен, он будет даже сбросить на "AAA"
запись , если он находит вторую запись с тем же ключом в другом модуле переводе. Это облегчает выявление конфликтов перевода модулей во время разработки.
Тематические переводы
Во-вторых, переводы, загруженные из первого translate.csv
файла в резервной теме для текущей локали, просто заменяют существующие записи в массиве переводов.
Таким образом, продолжая предыдущий пример, translate.csv
запись "AAA","DDD"
приведет к следующим данным перевода:
array(
"AAA" => "DDD", // This is overwritten by the translate.csv file
"Mage_Catalog::AAA" => "BBB",
"Some_Module::AAA" => "CCC"
)
Конечно, записи translate.csv
с новыми ключами перевода просто добавляются в массив.
Переводы базы данных
Переводы из core_translate
таблицы в основном объединяются в массив переводов так же, как переводы темы.
Существующие ключи из модуля или переводы тем перезаписываются записями базы данных, добавляются новые.
Поиск перевода
Когда __()
метод вызывается, Magento сначала ищет перевод в массиве, соответствующий текущему модулю.
Текущий модуль определяется именем класса, для которого __()
вызывается класс. Например, в блоках ответственный метод выглядит так:
// Excerpt from Mage/Core/Block/Abstract.php
public function getModuleName()
{
$module = $this->getData('module_name');
if (is_null($module)) {
$class = get_class($this);
$module = substr($class, 0, strpos($class, '_Block'));
$this->setData('module_name', $module);
}
return $module;
}
Методы в помощниках и контроллерах работают соответственно.
Примеры сценариев поиска
Например, допустим, что он $this->__('AAA')
вызывается в файле шаблона. Если связанный блок имеет тип Mage_Core_Block_Template
, Magento сначала проверит Mage_Core::AAA
запись. Если он не найдет его, он вернется к переводу ключа AAA
.
В примере сценария это приведет к переводу DDD
(из translate.csv
файла).
В другом сценарии связанный блок может быть Mage_Catalog_Block_Product_View
. В этом случае Magento сначала проверит запись перевода Mage_Catalog::AAA
и найдет перевод AAA
.
Таким образом, в действительности трансляции области модуля имеют более высокий приоритет, чем любые общие переводы. Какой перевод используется, зависит от того, какой модуль принадлежит классу при вызове __()
метода.
Что проверить, если ваш перевод не работает
Если ваш перевод из translate.csv
файла не используется, следуйте этому контрольному списку:
- Кэш перевода отключен / обновлен? (Решение: очистить кеш)
- Действительно ли
translate.csv
файл находится в резервной теме для текущего магазина? (Решение: исправить настройку темы)
- Есть ли в
core_translate
таблице противоречивая запись для перевода ? (Решение: удалите конфликтующую запись из core_translate
)
- Если все предыдущие пункты не являются причиной, должен быть конфликтующий перевод из другого модуля. (Решение: см. Ниже)
Решение для конфликтных ситуаций модуля Scope
Если вы обнаружите, что окончательный вариант верен, просто добавьте перевод во второй раз translate.csv
с помощью области модуля модуля, выполняющего перевод.
В этом примере, если вы всегда хотели AAA
переводить как с DDD
помощью перевода темы, вы можете сделать это в вашем translate.csv
:
"AAA","DDD"
"Mage_Catalog::AAA","DDD"
"Some_Module::AAA","DDD"
На практике я добавляю область действия модуля к переводу только в случае конфликта, то есть, если перевод не работает.
Дополнительные замечания
Встроенный перевод
Функция встроенного перевода в Magento также добавляет пользовательские переводы в core_translate
таблицу, используя префикс области видимости модуля.
Обратная совместимость
Приоритет переводов тем был выше, чем переводы базы данных до версии 1.3 или около того.
Перевод XML
Magento иногда оценивать translate=""
аргументы в config.xml
, system.xml
и компоновках XML для перевода значений дочернего узла.
В этих случаях можно указать вспомогательный класс, используя module=""
аргумент, чтобы указать модуль для области перевода.
Если module
в XML не указан аргумент, core/data
помощник используется для перевода значений дочерних узлов.
Дальнейшая информация
Признаюсь, что в этом посте я замалчивал некоторые детали процесса перевода Magento, но только потому, что не хочу слишком много информации.
- Некоторые технические детали при построении массива перевода
- Возможность использования дополнительных файлов перевода для модулей
- Сохранить область просмотра для
core_translate
записей
- Плюсы и минусы с использованием разных методов перевода
Пожалуйста, задайте отдельный вопрос, если требуется дополнительная информация.