디자인 템플릿 패키지 CSV로 번역을 구현하는 방법은 무엇입니까? echo $ this-> __ ( 'Text')는 어떻게 작동합니까?


29

다음과 같은 디자인 패키지 설정이 있습니다.

design/frontend/package_name/theme_name/locale/

내가 가지고있는

de_DE, en_GB등, 내가 해당하는 한에서 translate.csv다양한 문자열 파일 :"Key", "Translation"

테마를 사용하여 다양한 문자열을 구현하려고합니다. echo $this->__('Text')

그러나 작동하지 않는 것 같습니다 (표시 된 문자열 만 ('Text')나타납니다). Magento가 번역 할 CSV에서 문자열을 가져올 때에 대한 기본적인 이해가 부족하다고 생각합니다. 누군가이 CSV 파일을 작동시키는 방법을 설명해 주시겠습니까?


어떤 버전의 Magento를 실행하고 있습니까?
philwinkle

나는 Magento v를 사용하고 있습니다 : 1.7.0.2
waffl

일반 마 젠토 템플릿 파일 외부에서 이것을 호출하고 있습니까? 어쩌면 도우미 클래스를 호출하여 <? php echo Mage :: helper ( 'core')-> __ ( 'Text'); ?> 또한 시스템> 구성> 개발자
SaveTheMage

답변:


84

TL; DR

번역 작동 방식에 대한 자세한 내용에 관심이없는
경우 아래에서 번역이 작동하지 않는지 확인해야 할 사항 섹션, 특히
모듈 범위 번역 충돌에 대한 하위 섹션 솔루션으로 컨텐츠를 건너 뜁니다 .

마 젠토 번역 개요

마 젠토는 번역 소스의 우선 순위를 정합니다 (최고에서 최하로).

  1. DB ( core_translate테이블)
  2. 테마 translate.csv파일
  3. app/locale/*/*.csv파일

번역 배열은 어떻게 만들어 집니까?

모듈 번역

먼저 app/locale/*/*.csv활성 모듈 etc/config.xml파일 에서 참조 된 모든 파일 이 구문 분석됩니다. 다음 과정의 연습은 다음과 같습니다
젠토는 다음 발견 가정 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.csvtranslation is "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표는 기본적으로 그냥 테마 번역 등 번역 배열로 병합됩니다.
데이터베이스 레코드가 모듈 또는 테마 변환의 기존 키를 겹쳐 쓰고 새 키가 추가됩니다.

번역 조회

__()메소드가 호출되어, 젠토 먼저 현재 매칭 모듈 어레이의 변환을 찾는다.
현재 모듈은 __()클래스가 호출 되는 클래스 이름에 의해 결정됩니다 . 예를 들어, 블록에서 담당 메소드는 다음과 같습니다.

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

헬퍼 및 컨트롤러의 메소드가 그에 따라 작동합니다.

조회 시나리오 예

예를 들어 $this->__('AAA')템플릿 파일에서 say 라고합니다. 연결된 블록이 유형 인 Mage_Core_Block_Template경우 Magento는 먼저 Mage_Core::AAA레코드를 확인합니다 . 찾지 못하면 키의 번역으로 돌아갑니다 AAA.
예제 시나리오 DDD에서는 translate.csv파일 에서 번역이 수행됩니다 .

다른 시나리오에서는 관련 블록이 될 수 있습니다 Mage_Catalog_Block_Product_View. 이 경우 Magento는 먼저 번역 레코드를 확인하고 번역 Mage_Catalog::AAA을 찾습니다 AAA.

사실상, 모듈 범위 변환은 일반 번역 보다 우선 순위가 높습니다 . 어떤 변환이 사용되는지는 클래스가 __()메소드 를 호출 한 모듈에 따라 다릅니다 .

번역이 작동하지 않는 경우 확인해야 할 사항

translate.csv파일 의 번역을 사용하지 않는 경우 다음 점검 목록을 따르십시오.

  1. 번역 캐시가 해제 / 새로 고침됩니까? (해결 방법 : 캐시 지우기)
  2. 는 IS translate.csv파일은 현재 상점에 대한 주제 대체 정말? (솔루션 : 테마 구성 수정)
  3. core_translate표에 번역에 대한 충돌 레코드가 있습니까? (해결 방법 :에서 충돌하는 레코드 제거 core_translate)
  4. 이전의 모든 사항이 원인이 아닌 경우 다른 모듈과 충돌하는 번역이 있어야합니다. (솔루션 : 아래 참조)

모듈 범위 변환 충돌에 대한 솔루션

당신이 마지막 경우에 해당하는 찾아내는 경우에, 단순히로 번역에게 두 번째 시간을 추가 translate.csv 번역을하는 모듈의 모듈 범위.
예를 들어, 항상 테마 번역 AAADDD통해 번역 하려는 경우 다음에서 수행 할 수 있습니다 translate.csv.

"AAA","DDD"
"Mage_Catalog::AAA","DDD"
"Some_Module::AAA","DDD"

실제로는 충돌이있는 경우, 즉 번역이 작동하지 않는 경우에만 모듈 범위를 번역에 추가합니다.

추가 사항

인라인 번역

Magento의 인라인 변환 기능은 core_translate모듈 범위 접두사를 사용하여 테이블에 사용자 지정 변환을 추가합니다 .

하위 호환성

테마 변환의 우선 순위는 데이터베이스가 Magento 버전 1.3 정도까지 변환 된 것보다 높았습니다.

XML 번역

마 젠토는 때때로 평가 translate=""에 인수 config.xml, system.xml자식 노드의 값을 변환하고 레이아웃 XML을.
이러한 경우 module=""에는 번역 범위에 대한 모듈을 지정하기 위해 인수를 사용하여 도우미 클래스를 지정할 수 있습니다 . XML에 인수가 지정
되지 않은 경우 module, core/data헬퍼는 하위 노드 값을 변환하는 데 사용됩니다.

추가 정보

나는이 글에서 Magento 번역 과정에 대한 세부 사항을 고집했지만 너무 많은 정보를 원하지 않기 때문에 고백했습니다.

  • 번역 배열이 구축되는 동안 일부 기술적 세부 사항
  • 모듈에 추가 번역 파일을 사용할 수있는 가능성
  • core_translate레코드에 대한 상점보기 범위
  • 다른 번역 방법을 사용하는 장단점

추가 정보가 필요한 경우 별도의 질문을하십시오.


1
네, 정말 죄송 합니다만, 다른 사람이 나에게 말하지 않고 캐시를 켰습니다. 아마도 번역 작업을 시작한 순간 일 것입니다. 한숨. 이 정보는 Magento의 번역 프로세스를 이해하는 데 매우 도움이되었습니다. 많은 고마워, 이것은 분명히 __()함수가 어떻게 작동 하는지에 대한 모든 질문에 대답 합니다.
waffl

Magento의 번역 아키텍처에 대한 아주 좋은 개요는 여기에서 찾을 수 있습니다 : gist.github.com/antonmakarenko/7538216
thdoan

@Vinai, 훌륭한 답변. 여기에 질문을 올린 번역 문제를 해결하는 데 정말 도움이되었습니다 . 놀랍게도 Mage_Tax는 내 주제의 번역과 충돌하고 있는데, 이는 마 젠토가 번역의 우선 순위를 정하는 방법과 상반되는 것으로 보입니다
Holly

14

번역 소스

: 번역은 서로 다른 소스에서 병합 모듈 번역 각각의 XML 파일에서, 테마 번역 로부터 translate.csv현재의 테마, 그리고 인라인 번역 데이터베이스에서.

번역은 엄격하게 모듈에 따라 다를 수 있으며 (모듈 내에서만 유효), 항상 인라인 번역 및 경우에 따라 테마 번역에 해당됩니다. 이를 위해서는 translate.csv에서 모듈 접두사를 사용하여이를 정의해야합니다.

"Mage_Catalog::Add to cart","In die Einkaufstüte legen"

모듈 (예 Mage_Catalog.csv:)의 변환은 DEVELOPER MODE가 켜져있는 경우에만 모듈에 따라 다릅니다. 그렇지 않으면 첫 번째로로드 된 모듈의 변환은 텍스트에 대한 자체 번역이없는 모든 모듈에 대해 전체적으로 사용됩니다.

다른 소스의 각 텍스트가 변환 배열에 병합되는 방법을 보여주는 순서도를 정리했습니다.

번역 병합 data 번역 배열입니다

이블 에지 케이스

번역 된 문자열이 번역되지 않은 문자열과 같으면 번역이 무시됩니다. 언뜻보기에는 유용한 최적화처럼 들리지만, 이렇게하면 변경된 번역 만 유일하게 전역 화되기 때문에 한 모듈에서 변경되지 않고 다른 모듈에서 변경 된 문자열을 쉽게 번역 할 수 없습니다.

번역 조회

어떤 모듈의 변환이 조회되는지는 메소드 __()가 호출 된 클래스의 모듈에 따라 다릅니다 . 번역 배열의 조회는 다음과 같습니다.

번역 조회 data 번역 배열입니다

범위 정의

한 클래스의 모듈을 변경할 수 있으며 특히 블록과 도우미에 유용합니다. 모범 사례는 코어 클래스를 다시 작성할 때 항상 모듈 이름을 명시 적으로 설정하는 것입니다. 작동 방식, 도우미, 블록 및 제어 자 (Magento CE 1.9.1 기준)

블록의 예 :

class IntegerNet_AwesomeModule_Block_Catalog_Product extends Mage_Catalog_Block_Product
{
    public function getModuleName()
    {
        return 'Mage_Catalog';
    }
}

블록의 경우 module_name레이아웃 XML 에서 매개 변수를 설정할 수도 있습니다 .

<block type="integernet_awesomemodule/catalog_product" name="test" module_name="Mage_Catalog" />

도우미의 예 :

class IntegerNet_AwesomeModule_Helper_Catalog extends Mage_Catalog_Helper_Data
{
    protected $_moduleName = 'Mage_Catalog';
}

프런트 엔드 컨트롤러의 경우 _realModuleName관리자 컨트롤러에 대해 속성을 설정할 수 있습니다 _usedModuleName(일관성에 대해서는 예).

다른 번역 방법

XML 파일 (config.xml, system.xml, layout)에서 노드를 translate속성 으로 변환해야하는지 여부를 지정할 수 있습니다 . module범위를 지정하기 위해 속성을 추가해야 하지만 여기서 값은 위와 같이 모듈 이름이 아닌 도우미 별명 이어야합니다 .

<one_column module="page" translate="label">
    <label>1 column</label>
    <template>page/1column.phtml</template>
    <layout_handle>page_one_column</layout_handle>
    <is_default>1</is_default>
</one_column>

JavaScript에서는 Translator전 세계적으로 사용 가능한 객체를 사용할 수 있습니다.

Translator.translate('Please wait, loading...');

그러나 JavaScript에서 사용하려는 번역을 번역기 객체에서 사용할 수 있도록해야합니다. 이는 모듈 디렉토리의 jstranslator.xml파일을 통해 수행됩니다 etc.

<?xml version="1.0"?>
<jstranslator>
    <loading translate="message" module="core">
        <message>Please wait, loading...</message>
    </loading>
</jstranslator>

loading문자열 일 수 있지만 전역 적으로 고유해야합니다. translatemodule속성은 다른 XML 파일로 사용됩니다. 값 message과 그 변환이 JS Translator 객체에 추가됩니다.

문제 해결

복잡한 규칙을 모두 알고 있더라도 일부 번역이 왜 작동하는지 (또는 작동하지 않는지) 확인하기가 어려운 경우가 있습니다. 이 작업을보다 쉽게하기 위해 번역의 출처를 보여주는 "번역 힌트"모듈을 개발했습니다.

여기에서 얻으십시오 : https://github.com/schmengler/TranslationHints

스크린 샷 : 번역 힌트


주제에 대한 내 블로그 게시물 및 슬라이드를 기반으로합니다.


2
무료 Yireo EmailOverride 모듈을 통해 사용자 정의 CSV 모듈 파일을 테마에 배치 할 수 있다는 점을 언급함으로써 스팸이되지 않기를 바랍니다. translate.csv뿐만 아니라
Jisse Reitsma

6

캐시를 지웠습니까?

시스템이 테스트중인 파일의 로캘로 설정되어 있습니까?

Magento가 테마 변환을로드 할 때 찾고있는 파일을 찾을 수 있습니까 (일부 임시 var_dump; exit; 문이 도움이 됨).

#File: app/code/core/Mage/Core/Model/Translate.php
protected function _loadThemeTranslation($forceReload = false)
{
    $file = Mage::getDesign()->getLocaleFileName('translate.csv');
    $this->_addData($this->_getFileData($file), false, $forceReload);
    return $this;
}

_getTranslatedString메소드가 데이터 배열에서 원하는 것을 찾을 수 있습니까 ?

#File: app/code/core/Mage/Core/Model/Translate.php
protected function _getTranslatedString($text, $code)
{
    $translated = '';
    if (array_key_exists($code, $this->getData())) {
        $translated = $this->_data[$code];
    }
    elseif (array_key_exists($text, $this->getData())) {
        $translated = $this->_data[$text];
    }
    else {
        $translated = $text;
    }
    return $translated;
}

캐시가 활성화되어 있지 않습니다. 시스템이 로케일로 설정되어 있는지 확실하지 않지만, 상점을 변경하여 그에 따라 특정 템플릿 파일에서 번역이 작동합니다. 예를 들어, 내 문자열이 translate.csv제대로 번역되어 /app/design/frontend/package_name/default/template/catalog/product/view.phtml있지만 그렇지 않습니다/app/design/frontend/package_name/default/template/page/html/topmenu.phtml
waffl

네 말이 맞아, 누군가 나에게 말하지 않고 캐시를 켰다. 죄송합니다. 정보를 주셔서 감사합니다.
waffl

3
@waffl 사과 할 필요가 없습니다. 모든 마 젠토 개발자는 적어도 일주일에 한 번 그렇게합니다.
Alan Storm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.