Tạo mẫu lõi magento sử dụng tệp dịch của mô-đun của tôi


15

Trong một phần mở rộng mà tôi đang làm việc, tôi có một XML bố trí được thêm vào thông qua cấu hình của mô-đun. Bố cục này có một số sửa đổi cho frontend. Tuy nhiên, một số trong các khối này thuộc về các mô-đun lõi Magento. Các mẫu đều hiển thị chính xác như mong đợi.

Các mẫu tôi đã đóng gói với chính mô-đun đang sử dụng các tệp dịch của mô-đun của riêng tôi. Các mẫu được đóng gói với lõi Magento hiển thị chưa được dịch. Nếu tôi thêm một tệp dịch cho mô-đun lõi tương ứng, thì tệp dịch đó sẽ được sử dụng và mẫu hiển thị đã được dịch.

Có cách nào để Magento sử dụng tệp dịch của mô-đun của tôi không nếu nó không thể tìm thấy bất kỳ tệp dịch nào cho mô-đun lõi Magento? Có điều gì khác tôi có thể làm ở đây?


Bạn có thể thêm bản dịch của mình vào tệp dịch chủ đề hiện tại hoặc sử dụng giao diện dịch nội tuyến trong phần phụ trợ.
Dmytro Zavalkin

Tôi muốn đóng gói các bản dịch với chính phần mở rộng, ở trên sẽ yêu cầu thêm hướng dẫn cho bất kỳ ai cài đặt nó. Có bất kỳ tùy chọn mà tôi có thể làm điều đó từ mã?
Mridul Aggarwal

4
Nó phụ thuộc vào cách dịch được sử dụng trong tempalte, $this->__()hoặc Mage::helper('...')->__(). Trong trường hợp nắm tay, bạn có thể buộc chặn sử dụng trình trợ giúp dịch thuật của mình. Nhưng tôi tin rằng trong trường hợp chung, tùy chọn duy nhất là nâng cấp dữ liệu cho core_translatebảng. Tại đây, các câu hỏi quốc tế hóa được mô tả chi tiết: blog.belvg.com/ .
Dmytro Zavalkin

Cũng xem Tránh tránh mất bản dịch khi ghi đè một khối để có giải pháp thực hành dễ dàng hơn.
hakre

Câu trả lời:


20

Bất kể bạn tiếp cận nó như thế nào, vấn đề của bạn đòi hỏi một giải pháp "sáng tạo", xứng đáng là lưu ý của nhà phát triển cho các nhà phát triển / bảo trì tiếp theo sử dụng. Đầu tiên, một số nền tảng, theo sau là một ghi chú, tiếp theo là một giải pháp dễ dàng và tôi nghĩ rằng ở cuối <--tl; dr .

Như Zyava đã chỉ ra , dịch thuật là đối tượng của mô-đun thực hiện dịch thuật. Các mẫu kết xuất trong các phiên bản khối và các phiên bản khối có một thuộc module_nametính được sử dụng khi gọi dịch; tham chiếu Mage_Core_Block_Abstract::__() :

public function __()
{
    $args = func_get_args();
    $expr = new Mage_Core_Model_Translate_Expr(array_shift($args), $this->getModuleName());
    array_unshift($args, $expr);
    return Mage::app()->getTranslator()->translate($args);
}

Tài module_namesản là (thông thường) có nguồn gốc theo yêu cầu và dựa trên tên lớp (ref. ::getModuleName()):

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;
}

Vì vậy, nếu thuộc module_nametính đã được đặt, bản dịch mô-đun đó sẽ được áp dụng. Đối với các khối còn lại từ bố cục lõi, thuộc tính này có thể được đặt thông qua bố cục XML; ví dụ:

<default>
    <action block="root" method="setModuleName">
        <name>Your_Module</name>
    </action>
</default>

Võngà! Mô-đun CSV của bạn sở hữu bản dịch cho trường hợp đó. Đây có thể là một cách tiếp cận. Tất nhiên, vẫn còn tình trạng khó khăn trong việc dịch các mô-đun khác đang được áp dụng thông qua trình trợ giúp dành riêng cho mô-đun trong các trường hợp khối (tất nhiên bao gồm các tệp mẫu) và điều này luôn đúng với các bản dịch XML bố cục. Ngoài ra, cách tiếp cận này sẽ phá vỡ hành vi Vô hiệu hóa Mô-đun đầu ra, sử dụng module_nameparam.

Giải pháp

Hóa ra, có thể chỉ định nhiều tệp dịch cho một mô-đun. Nó không được thực hiện trong lõi (mỗi mô-đun chỉ khai báo một tệp .csv ), nhưng chức năng có trong Mage_Core_Model_Translate:

public function getModulesConfig()
{
    if (!Mage::getConfig()->getNode($this->getConfig(self::CONFIG_KEY_AREA).'/translate/modules')) {
        return array();
    }

    $config = Mage::getConfig()->getNode($this->getConfig(self::CONFIG_KEY_AREA).'/translate/modules')->children();
    if (!$config) {
        return array();
    }
    return $config;
}

protected function _loadModuleTranslation($moduleName, $files, $forceReload=false)
{
    foreach ($files as $file) {
        $file = $this->_getModuleFilePath($moduleName, $file);
        $this->_addData($this->_getFileData($file), $moduleName, $forceReload);
    }
    return $this;
}

Vì nội dung của các tệp được hợp nhất (tôi đã kiểm tra), nên chỉ có thể chỉ định các chuỗi mà bạn muốn ghi đè trong (các) CSV tùy chỉnh của mình. Ví dụ: nếu bạn muốn dịch chuỗi Thông tin bổ sung trên trang sản phẩm (được dịch bởi Mage_Catalogmô-đun), thì sau đây sẽ hoạt động:

ứng dụng / ngôn ngữ / Custom.csv :

"Additional Information","More Info, Dude"

Trong mô-đun cấu hình của bạn - mà nên <depends />trên Mage_Catalogđể đảm bảo nội dung của nó sáp nhập sau - sau đây sẽ gây ra Custom.csv cặp dịch để merge trên đầu trang của bản gốc:

<frontend>
    <translate>
        <modules>
            <Mage_Catalog>
                <files>
                    <additional>Custom.csv</additional>
                </files>
            </Mage_Catalog>
        </modules>
    </translate>
</frontend>

Điều thú vị về phương pháp này là bạn có thể thu thập các bản dịch cốt lõi ghi đè của mình trong một tệp.


@Francesco Nó nên. Xóa bộ nhớ cache dịch? Nếu nó dường như không hoạt động, xin vui lòng gửi câu hỏi này như một câu hỏi mới (và liên kết ở đây cho hậu thế).
đánh dấu

Tôi xác nhận nó hoạt động cả $ this> _ và với người trợ giúp. bạn nói đúng, đó là lỗi của tôi (tôi đã xóa bình luận sai lầm trước đó)
Fra
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.