У меня есть настройка дизайна пакета, например, так:
design/frontend/package_name/theme_name/locale/
под которым у меня есть
de_DE
и en_GB
т.д., под которым у меня есть соответствующие translate.csv
файлы с различными строками:"Key", "Translation"
Я пытаюсь реализовать различные строки в моей теме, используя echo $this->__('Text')
Тем не менее, это не похоже на работу (я вижу только строку внутри ('Text')
отображаемого). Я думаю, что мне не хватает фундаментального понимания того, когда Magento извлекает строки из CSV для перевода. Может кто-нибудь объяснить, как заставить эти CSV-файлы работать?
Ответы:
TL; DR
Если вас не интересуют подробности того, как работает перевод, перейдите к разделу «
Что проверить, если ваш перевод не работает » ниже, особенно в подразделе «
Решение для конфликтов при переводе модуля» .
Обзор перевода на Magento
Magento определяет приоритеты источников переводов (от высшего к низшему):
core_translate
таблица)translate.csv
Файл темыapp/locale/*/*.csv
файлыКак строится массив перевода?
Модульные переводы
Сначала анализируются все файлы, на
app/locale/*/*.csv
которые есть ссылки изetc/config.xml
файлов активных модулей . Вот пошаговое руководство процесса:предположим, что Magento находит следующий
config.xml
раздел:И в этом файле следующий перевод указан для локали, настроенной для текущего представления хранилища:
При этих обстоятельствах Magento создает следующие записи в массиве перевода:
Второе значение - это трансляция модуля . Имя модуля с префиксом берется из узла config XML, содержащего объявление файла перевода.
Если же перевод снова устанавливаются с помощью второго файла модуля , например , в
Some_Module.csv
переводе есть"AAA","CCC"
, это будет не перезаписывать на"AAA"
установку. Вместо этого он только добавит новую запись со вторым именем модуля"Some_Module::AAA" => "CCC"
.Если режим разработчика включен, он будет даже сбросить на
"AAA"
запись , если он находит вторую запись с тем же ключом в другом модуле переводе. Это облегчает выявление конфликтов перевода модулей во время разработки.Тематические переводы
Во-вторых, переводы, загруженные из первого
translate.csv
файла в резервной теме для текущей локали, просто заменяют существующие записи в массиве переводов.Таким образом, продолжая предыдущий пример,
translate.csv
запись"AAA","DDD"
приведет к следующим данным перевода:Конечно, записи
translate.csv
с новыми ключами перевода просто добавляются в массив.Переводы базы данных
Переводы из
core_translate
таблицы в основном объединяются в массив переводов так же, как переводы темы.Существующие ключи из модуля или переводы тем перезаписываются записями базы данных, добавляются новые.
Поиск перевода
Когда
__()
метод вызывается, Magento сначала ищет перевод в массиве, соответствующий текущему модулю.Текущий модуль определяется именем класса, для которого
__()
вызывается класс. Например, в блоках ответственный метод выглядит так:Методы в помощниках и контроллерах работают соответственно.
Примеры сценариев поиска
Например, допустим, что он
$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
:На практике я добавляю область действия модуля к переводу только в случае конфликта, то есть, если перевод не работает.
Дополнительные замечания
Встроенный перевод
Функция встроенного перевода в Magento также добавляет пользовательские переводы в
core_translate
таблицу, используя префикс области видимости модуля.Обратная совместимость
Приоритет переводов тем был выше, чем переводы базы данных до версии 1.3 или около того.
Перевод XML
Magento иногда оценивать
translate=""
аргументы вconfig.xml
,system.xml
и компоновках XML для перевода значений дочернего узла.В этих случаях можно указать вспомогательный класс, используя
module=""
аргумент, чтобы указать модуль для области перевода.Если
module
в XML не указан аргумент,core/data
помощник используется для перевода значений дочерних узлов.Дальнейшая информация
Признаюсь, что в этом посте я замалчивал некоторые детали процесса перевода Magento, но только потому, что не хочу слишком много информации.
core_translate
записейПожалуйста, задайте отдельный вопрос, если требуется дополнительная информация.
источник
__()
работает эта функция.Источники перевода
Переводы объединяются из разных источников: переводы модулей из соответствующих файлов XML, переводы тем
translate.csv
из текущей темы и встроенные переводы из базы данных.Переводы могут быть строго специфичными для модуля (действительны только внутри модуля), это всегда имеет место для встроенных переводов и, необязательно, для тематических переводов. Для этого вы должны определить их с префиксом модуля в translate.csv:
Переводы из модулей (например
Mage_Catalog.csv
) являются строго специфичными для модуля, если включен РЕЖИМ РАЗВИТИЯ. В противном случае перевод первого загруженного модуля используется глобально для всех модулей, у которых нет собственного перевода текста.Я собрал блок-схему, которая показывает, как каждый текст из разных источников объединяется в массиве перевода:
data
это массив переводаДело злого края
Если переведенная строка равна непереведенной строке, перевод игнорируется. На первый взгляд это звучит как полезная оптимизация, но таким образом вы не можете легко перевести строку, неизменную в одном модуле и измененную в другом модуле, потому что измененный перевод будет единственным и станет глобальным.
Поиск перевода
Для какого модуля ищется перевод, зависит от модуля класса, для которого
__()
был вызван метод . Затем поиск в массиве перевода выглядит следующим образом:data
это массив переводаОпределение области
Есть возможность поменять модуль для одного класса, что особенно полезно для блоков и помощников. Рекомендуется всегда явно указывать имя модуля при переписывании базового класса. Как это работает, зависит от помощников, блоков и контроллеров (по состоянию на Magento CE 1.9.1)
Пример для блока:
Для блоков вы также можете установить
module_name
параметр в макете XML:Пример для помощника:
Для контроллеров внешнего интерфейса вы можете установить свойство
_realModuleName
для контроллеров администратора_usedModuleName
(да, для согласованности)Другие методы перевода
В файлах XML (config.xml, system.xml, layout) вы можете указать, следует ли преобразовывать узлы с помощью
translate
атрибута. Вы также должны добавитьmodule
атрибут, чтобы указать область, но здесь значение должно быть псевдонимом помощника , а не именем модуля, как указано выше.В JavaScript вы можете использовать
Translator
глобально доступный объект:но вы должны сделать переводы, которые вы хотите использовать в JavaScript, доступными для объекта-переводчика. Это делается через
jstranslator.xml
файлы вetc
каталогах модулей.loading
может быть любой строкой, но должна быть глобально уникальной.translate
Иmodule
атрибуты используются как в других файлах XML. Значениеmessage
и его перевод добавляются в объект JS Translator.Поиск проблемы
Даже если вы знаете все сложные правила, иногда трудно понять, почему какой-то перевод работает как есть (или не работает). Чтобы сделать это проще, я разработал модуль «Советы по переводу», который показывает, откуда переводы:
На основе моих сообщений в блоге и слайдов по теме:
источник
Вы очистили свой кеш?
Установлена ли в вашей системе локаль файла, который вы тестируете?
Может ли Magento найти файл, который ищет, когда загружает перевод темы (какой-то временный
var_dump
; выход; операторы должны помочь.Может ли
_getTranslatedString
метод найти то, что он ищет в массиве данных?источник
translate.csv
переводится правильно в,/app/design/frontend/package_name/default/template/catalog/product/view.phtml
но не в/app/design/frontend/package_name/default/template/page/html/topmenu.phtml