Tại sao các lớp sử dụng một trình trợ giúp để dịch thay vì $ this?


27

Trong các mô-đun cốt lõi và đôi khi các mẫu, tôi thấy các lớp của trình trợ giúp đang được sử dụng để dịch:

Mage::helper('someModule')->__('translate me');

Tại sao điều này thích hợp hơn:

$this->__('translate me');

Này Brendan, câu hỏi này đặc biệt tốt và tôi đánh giá cao nỗ lực của bạn. +1 cho điều đó. Tuy nhiên Alanstorm cung cấp cho bạn một câu trả lời hợp lệ cho câu hỏi của bạn. Vì vậy, sẽ tốt đẹp khi chấp nhận một câu trả lời từ các câu trả lời có sẵn. Cảm ơn :-)
Rajeev K Tomy

Thêm sức mạnh cho anh em :-)
Rajeev K Tomy

Câu trả lời:


24

Chỉ là lý thuyết, nhưng khi bạn gọi

$this->__('Foo')

trong một mẫu, tệp dịch thuật CSV của mô-đun nào Magento sẽ sử dụng để dịch Foo?

Không phải lúc nào cũng rõ người trợ giúp dịch thuật của mô-đun Magento cuối cùng sẽ gọi để dịch chuỗi / khóa. Vì Magento cho phép bạn sử dụng cùng một khóa trong các mô-đun khác nhau cho các chuỗi khác nhau, điều quan trọng là phải biết dữ liệu dịch thuật của mô-đun nào bạn đang sử dụng. Trong thực tế, nếu một mẫu được sử dụng trên nhiều mô-đun, việc sử dụng $this->__()có thể bị "coi là có hại", vì nó sẽ trả về các giá trị khác nhau tùy thuộc vào ngữ cảnh khối mà hệ thống bố trí đã sử dụng mẫu trong đó.

Tôi đoán là các trình trợ giúp tiện lợi đã được thêm vào trước, nhưng các nhà phát triển xây dựng các mẫu nhanh chóng bắt đầu giúp đỡ để họ biết tệp dịch của mô-đun nào sẽ dịch một chuỗi và mô hình đó lan truyền đến kiểm tra khung. Dòng mã này, tự nó, là mơ hồ.

$this->__('Foo');

Nhưng bạn có thể chắc chắn dòng mã này sẽ sử dụng Mage_Catalogthông tin bản địa hóa.

Mage::helper('catalog')->__('Foo')

Hmm, tôi có logic đó. Trong thực tế, tôi chỉ thấy các CSV được tạo trong gói frontend cho chủ đề đang hoạt động là /locale / nbxyz Bolog / translate.csv (không phải trên mỗi mô-đun). Tôi đã gặp vấn đề "chuỗi tồn tại trong các mô-đun khác nhau và cần các bản dịch khác nhau", nhưng cũng "chuỗi này có nhiều phiên bản trong mô-đun này và cần các bản dịch khác nhau" mà người trợ giúp không giải quyết. Nói chung, tôi có thể có thể gắn bó với $ this và một CSV cho mỗi chủ đề.
Brendan Falkowski

@BrendanFalkowski Vâng, có vẻ như là một thứ "nhà phát triển mô-đun" so với "nhà phát triển chủ đề". Tôi muốn nói rằng bạn tìm thấy bằng cách sử dụng các trợ giúp tích hợp.
Alan Storm

@AlanStorm chắc chắn là một upvote cho bạn.
MTM

20

Bởi vì bạn muốn sử dụng một mô-đun rõ ràng.

Nếu bạn sử dụng $this->__()trong ngữ cảnh khối, mô-đun của khối được sử dụng để dịch. Vì vậy, nếu bạn muốn sử dụng một mô-đun đặc biệt, thì bạn phải sử dụngMage::helper('mymodule')->__()


1
Trong mọi trường hợp, bản dịch được gắn với một mô-đun nhất định. Khi chỉ gọi $ this, bạn đang đề cập đến mô-đun hiện tại và khi gọi Mage :: helper dài ('mymodule') -> __ () bạn đang dịch từ với mô-đun đó, giống như CSV từ mô-đun thay vì CSV mặc định.
mbalparda

Chính xác. Nếu bạn sử dụng một người trợ giúp, bạn làm cho nó rõ ràng.
Fabian Blechschmidt

1
Lợi thế của việc rõ ràng là gì? CSV dịch thuật không phân biệt giữa các mô-đun, hoặc họ? Không nghe thấy bất kỳ phân cấp dự phòng / kế thừa cho họ.
Brendan Falkowski

Không, tất cả các CSV được hợp nhất, nhưng bạn có thể có hai vị trí khác nhau, do Mage_Checkout::My Cartcú pháp. Và điều quan trọng là mô-đun nào được sử dụng để dịch
Fabian Blechschmidt

1
Aha, vì vậy những người trợ giúp có ý nghĩa hơn đối với các mô-đun so với những gì họ làm trong các gói frontend, chỉ có CSV của họ ghi đè lên lõi để tranh luận.
Brendan Falkowski

9

Về cơ bản tôi sẽ nói điều tương tự như những người khác đã nói.
Nếu bạn sử dụng, Mage::helper(...)bạn chắc chắn rằng một người trợ giúp cụ thể được sử dụng để dịch.

Ví dụ: hãy lấy Mage_Adminhtml_Block_Catalog_Product_Gridkhối.

Đối với các tiêu đề cột có điều này : 'header'=> Mage::helper('catalog')->__('Name'),. nếu thay vì trình trợ giúp danh mục $this->__sẽ được sử dụng, văn bản sẽ được dịch bằng Mage_Adminhtmlmô-đun.

Nhưng đây là trường hợp logic đằng sau việc sử dụng các trình trợ giúp có tên có ý nghĩa.

Tôi chỉ muốn chỉ ra một trường hợp sử dụng $this->__('..')thay vì cách tiếp cận của người trợ giúp có thể dẫn đến các vấn đề. Tôi nói từ kinh nghiệm.

Hãy lấy khối Mage_Catalog_Block_Breadcrumbs. Có một dòng trông như thế này : Mage::helper('catalog')->__('Home').

Bạn sẽ nghĩ rằng bạn đang ở trong catalogmô-đun để bạn có thể sử dụng $thisthay thế. Nhưng nếu bạn ghi đè khối bằng khối của bạn được gọi Namespace_Module_Block_Breadcrumbsthì sao?

Nếu $thisđược sử dụng thì mô-đun được sử dụng để dịch sẽ là Namespace_Modulevà bạn có thể không muốn điều đó.

Có hai lựa chọn để tránh điều này. Hoặc sử dụng một trình trợ giúp có tên như đã xảy ra đối với hầu hết các khối cốt lõi.

Hoặc bạn là nhà phát triển có thể thêm phần này vào lớp khối:

public function getModuleName() {
    return 'Mage_Catalog';
}

Sau đó, bạn chắc chắn rằng tất cả các văn bản sử dụng $this->__từ khối của bạn (các mẫu kết xuất khối cũng được bao gồm) sẽ được dịch bằng mô-đun danh mục.


Tốt đẹp. Lý thuyết Breadcrumb thật tuyệt vời. Tôi thích nó. +1 cho điều đó :-)
Rajeev K Tomy

2

Một lý do (chỉ là nhận thức của tôi), khi bạn sử dụng trợ giúp, bạn sẽ cụ thể hơn về tệp dịch, giống như Mage::helper('catalog')nó sẽ tìm thấy câu trong tệp danh mục, trong khi khi bạn sử dụng, $thisnó sẽ tìm kiếm ngẫu nhiên trong tất cả các tệp dịch. Tôi nghĩ vậy đó.

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.