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
записів
- Плюси і мінуси використання різних методів перекладу
Будь ласка, задайте окреме запитання, якщо потрібна додаткова інформація.