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"
)
Друге значення - це переклад застосування модуля . Назва префіксованого модуля взято з конфігураційного вузла 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;
}
Методи у Helpers and Controllers працюють відповідно.
Приклади сценарії пошуку
Для прикладу, скажімо $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)
- Якщо всі попередні пункти не є причиною, повинен бути суперечливий переклад з іншого модуля. (Рішення: див. Нижче)
Рішення конфлікту перекладу модуля
Якщо ви знайшли остаточний випадок, правда, просто додати перекладу вдруге до вашого translate.csv з модулем обсягу модуля , що виконує переклад.
У прикладі, якщо ви завжди хотіли, AAAщоб переклад був перекладений як DDDчерез переклад теми, ви можете зробити це у своєму translate.csv:
"AAA","DDD"
"Mage_Catalog::AAA","DDD"
"Some_Module::AAA","DDD"
На практиці я додаю область модуля до перекладу лише у випадку конфлікту, тобто якщо переклад не працює.
додаткові нотатки
Вбудований переклад
Функція вбудованого перекладу Magento також додає власні переклади до core_translateтаблиці, використовуючи префікс області модуля.
Зворотна сумісність
Пріоритет тематичних перекладів раніше був вище, ніж переклад бази даних до Magento версії 1.3 або більше.
Переклад XML
Magento іноді оцінювати translate=""аргументи на config.xml, system.xmlі компоновках XML для перекладу значень дочірнього вузла.
Клас помічника може бути визначений у цих випадках, використовуючи module=""аргумент, щоб вказати модуль для області перекладу.
Якщо moduleв XML не вказано жодного аргументу, core/dataдля перекладу значень дочірнього вузла використовується помічник.
Детальна інформація
Зізнаюсь, я ознайомився з деякими деталями процесу перекладу Магенто в цій публікації, але тільки тому, що мені не хочеться надто багато інформації.
- Деякі технічні деталі під час створення масиву перекладу
- Можливість використання додаткових файлів перекладу для модулів
- Зберігати область перегляду для
core_translateзаписів
- Плюси і мінуси використання різних методів перекладу
Будь ласка, задайте окреме запитання, якщо потрібна додаткова інформація.