왜 클래스가 $ this 대신 도우미를 번역에 사용합니까?


27

핵심 모듈과 때로는 템플릿에서 헬퍼 클래스가 번역에 사용되는 것을 볼 수 있습니다.

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

왜 이것이 다음보다 선호됩니까?

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

안녕 브렌든,이 질문은 예외적으로 훌륭합니다. 노력해 주셔서 감사합니다. +1입니다. 그러나 Alanstorm은 질문에 대한 올바른 답변을 제공합니다. 따라서 사용 가능한 답변에서 답변을 수락하는 것이 좋습니다. 감사합니다 :-)
Rajeev K Tomy 1

당신에게 더 많은 힘 형제 :-)
Rajeev K Tomy

답변:


24

그냥 이론화하지만 전화 할 때

$this->__('Foo')

템플릿에서 Magento가 Foo를 번역하는 데 사용할 모듈의 CSV 번역 파일은 무엇입니까?

Magento가 어떤 모듈의 번역 헬퍼가 궁극적으로 문자열 / 키를 번역하기 위해 호출 할 것인지는 명확하지 않습니다. Magento를 사용하면 서로 다른 문자열에 대해 서로 다른 모듈에서 동일한 키를 사용할 수 있으므로 사용중인 모듈의 변환 데이터를 아는 것이 중요합니다. 실제로, 여러 모듈 $this->__()에서 템플릿을 사용하는 경우 레이아웃 시스템이 템플릿을 사용한 블록 컨텍스트에 따라 다른 값을 반환하므로 "유해한 것으로 간주"될 수 있습니다.

내 생각에는 편의 도우미가 미리 추가되었지만 개발자가 템플릿을 빠르게 작성하여 인스턴스화 도움말을 시작하면 어떤 모듈의 변환 파일이 문자열을 변환하고 해당 패턴이 프레임 워크의 테스트로 확산되는지 알 수 있습니다. 이 코드 줄 자체는 모호합니다.

$this->__('Foo');

그러나이 코드 줄에서 Mage_Catalog현지화 정보를 사용할 수 있습니다 .

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

흠, 나는 그 논리를 얻는다. 실제로 액티브 테마의 프론트 엔드 패키지 내에서 / locale / {xyz} /translate.csv (모듈 별 아님)로 작성된 CSV 만 보았습니다. "문자열이 다른 모듈에 존재하고 다른 번역이 필요합니다"라는 문제가 있었지만 "이 문자열에는이 모듈에 여러 인스턴스가 있으며 다른 번역이 필요합니다."라는 도우미가 해결하지 못했습니다. 일반적으로 테마 당 $ this와 하나의 CSV를 사용할 수 있습니다.
Brendan Falkowski

@BrendanFalkowski 네, "테마 개발자"대 "모듈 개발자"같은 것 같습니다. 내장 된 도우미를 사용한다고 생각합니다.
Alan Storm

@AlanStorm은 확실히 당신에게 찬성입니다.
MTM

20

명시 적 모듈을 사용하려고하기 때문입니다.

$this->__()블록 컨텍스트에서 사용 하는 경우 블록의 모듈이 변환에 사용됩니다. 따라서 특별한 모듈을 사용하려면Mage::helper('mymodule')->__()


1
모든 경우에 번역은 특정 모듈에 연결됩니다. $ this 만 호출하면 현재 모듈을 참조하고 긴 Mage :: helper ( 'mymodule')-> __ () 호출하면 모듈 대신 CSV에서와 같이 해당 모듈로 단어를 번역합니다. 기본 CSV
mbalparda

옳은. 도우미를 사용하면 명시 적으로 만듭니다.
Fabian Blechschmidt

1
그래도 명시적인 장점은 무엇입니까? 번역 CSV는 모듈을 구별하지 않습니까? 그들에 대한 계층 / 상속 대체에 대해 들어 보지 못했습니다.
Brendan Falkowski

아니요, 모든 CSV가 병합되지만 Mage_Checkout::My Cart구문 으로 인해 서로 다른 두 위치를 가질 수 있습니다 . 그리고 어떤 모듈이 번역에 사용되는지가 중요합니다
Fabian Blechschmidt

1
Aha는 프론트 엔드 패키지에서보다 모듈에 대해 훨씬 더 의미가 있습니다.
Brendan Falkowski

9

기본적으로 나는 다른 사람들이 말한 것과 같은 것을 말할 것입니다.
사용 Mage::helper(...)하는 경우 특정 도우미가 번역에 사용되는지 확인하십시오.

예를 들어 Mage_Adminhtml_Block_Catalog_Product_Grid블록을 보자 .

열 헤더의 경우 다음과 같습니다 'header'=> Mage::helper('catalog')->__('Name'),.. 카탈로그 헬퍼 대신에 $this->__텍스트를 Mage_Adminhtml모듈을 사용하여 번역 한 것 입니다.

그러나 이것은 명명 된 헬퍼를 사용하는 논리가 의미가있는 경우입니다.

$this->__('..')도우미 접근법 대신 사용 하면 문제가 발생할 수 있는 경우를 보여주고 싶었습니다 . 나는 경험에서 말합니다.

블록을 보자 Mage_Catalog_Block_Breadcrumbs. 다음과 같은 줄이 Mage::helper('catalog')->__('Home')있습니다.

당신은 당신이 대신 catalog사용할 수 있도록 모듈 에 있다고 생각할 것입니다 $this. 그러나 블록이라는 블록으로 블록을 무시하면 Namespace_Module_Block_Breadcrumbs어떻게 될까요?

경우 $this다음 사용 된 변환에 사용되는 모듈은 것이다 Namespace_Module당신은 아마 싶지 않아요.

이를 피하기위한 두 가지 옵션이 있습니다. 이미 대부분의 코어 블록에서 발생하는 명명 된 도우미를 사용합니다.

또는 개발자로서 이것을 블록 클래스에 추가 할 수 있습니다.

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

그런 다음 $this->__블록에서 사용하는 모든 텍스트 (블록을 포함하는 템플릿도 포함)가 카탈로그 모듈을 사용하여 번역 될 것입니다.


좋은. Breadcrumb 이론은 대단했습니다. :-) +1
Rajeev K Tomy 1

2

헬퍼를 사용할 때 Mage::helper('catalog')카탈로그 파일에서 문장을 찾는 것처럼 번역 파일에 대해 더 구체적으로 설명하는 반면, 사용 $this하면 모든 번역 파일에서 무작위로 검색합니다. 그것이 내가 생각하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.