magento 핵심 템플릿이 내 모듈의 번역 파일을 사용하도록 설정


15

작업중 인 확장에서 모듈의 config.xml을 통해 레이아웃 XML이 추가되었습니다. 이 레이아웃에는 프런트 엔드가 일부 수정되었습니다. 그러나 이러한 블록 중 일부는 Magento 코어 모듈에 속합니다. 템플릿이 모두 예상대로 올바르게 표시됩니다.

모듈 자체와 함께 패키지 된 템플릿은 내 모듈의 번역 파일을 사용하고 있습니다. Magento 코어와 함께 패키지 된 템플릿은 번역되지 않은 것으로 표시됩니다. 각 핵심 모듈에 대한 번역 파일을 추가하면 해당 번역 파일이 사용되며 템플릿은 번역 된 것으로 표시됩니다.

Magento가 Magento 핵심 모듈에 대한 번역 파일을 찾을 수없는 경우 내 모듈의 번역 파일을 사용하도록하는 방법이 있습니까? 내가 여기서 할 수있는 다른 일이 있습니까?


현재 테마 번역 파일에 번역을 추가하거나 백엔드에서 인라인 번역 인터페이스를 사용할 수 있습니다.
Dmytro Zavalkin

확장 프로그램 자체로 번역을 패키징하고 싶었습니다. 위의 내용은 설치하는 사람을위한 지침을 추가해야합니다. 코드에서 할 수있는 옵션이 있습니까?
Mridul Aggarwal

4
번역에서 tempalte $this->__()또는 어떻게 사용되는지에 따라 다릅니다 Mage::helper('...')->__(). 첫 번째 경우 블록을 강제로 번역 도우미를 사용하도록 할 수 있습니다. 그러나 일반적인 경우 유일한 옵션은 core_translate테이블의 데이터 업그레이드입니다 . 여기 국제화 qestions이 상세하게 설명되어 있습니다 blog.belvg.com/...를 .
Dmytro Zavalkin

뿐만 아니라 참조 블록 덮어 쓰기 할 때 번역의 피 손실이 쉽게 손에 솔루션을.
hakre

답변:


20

어떻게 접근하든, 문제를 해결하려면 "창의적인"솔루션이 필요하며, 이후 개발자 / 관리자가 사용할 수있는 개발자 노트가 필요합니다. 먼저, 어떤 배경과 메모가 뒤 따르고 쉬우 며 끝에 <--tl; dr 의 합리적인 해결책이라고 생각 합니다.

Zyava가 지적했듯이 번역은 번역을 수행하는 모듈의 영향을받습니다. 템플릿은 블록 인스턴스로 렌더링되며 블록 인스턴스에는 module_name변환을 호출 할 때 사용되는 속성이 있습니다. 심판 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);
}

module_name속성은 (일반적으로) 요청시 클래스 이름 (참조 ::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;
}

따라서 module_name속성이 이미 설정되어 있으면 해당 모듈 변환이 적용됩니다. 코어 레이아웃에서 존재하는 기존 블록의 경우이 속성은 레이아웃 XML을 통해 설정할 수 있습니다. 예를 들면 다음과 같습니다.

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

oil! 모듈 CSV는 해당 인스턴스에 대한 번역을 소유합니다. 이것은 접근 방법 이 될 수 있습니다. 물론, 블록 인스턴스 (물론 템플릿 파일 포함)에서 모듈 별 도우미를 통해 다른 모듈의 변환이 적용되는 문제가 여전히 남아 있으며 레이아웃 XML 변환의 경우 항상 그렇습니다. 또한이 접근 방식은 module_nameparam 을 사용하는 Disable Modules Output 동작을 중단시킵니다 .

해결책

결과적 으로 모듈에 대해 여러 개의 번역 파일 을 지정할 있습니다. 코어에서 수행되지는 않지만 (각 모듈은 하나의 .csv 파일 만 선언 ) 기능은 다음과 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;
}

파일 내용이 병합되었으므로 (테스트 한) 사용자 지정 CSV에서 재정의하려는 문자열 만 지정할 수 있습니다. 예를 들어, 제품 페이지에서 모듈에 의해 번역 된 추가 정보 문자열 을 번역하려는 경우 Mage_Catalog다음이 작동합니다.

app / locale / Custom.csv :

"Additional Information","More Info, Dude"

모듈의 설정에서 -한다 <depends />Mage_Catalog다음이 발생합니다 - 보장 내용은 후 병합 Custom.csv의 : 원래의 상단에 병합에 번역 쌍을

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

이 방법의 좋은 점은 재정의하는 핵심 번역을 하나의 파일로 수집 할 수 있다는 것입니다.


@Francesco 그것은해야합니다. 번역 캐시를 지우시겠습니까? 작동하지 않는 것 같으면이 질문을 새로운 질문으로 게시하십시오 (후속을 위해 여기 링크).
benmarks

나는 $ this> _와 도우미와 함께 작동한다는 것을 확인했다. 당신이 바로, 내 잘못은 (나는 이전의 잘못된 의견을 제거한)하고있다
훌라
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.