Tasarım şablonu paketindeki CSV'lerde çeviriler nasıl uygulanır? Echo $ this -> __ ('Text') nasıl çalışır?


29

Bunun gibi bir tasarım paketi kurulumum var:

design/frontend/package_name/theme_name/locale/

sahip olduğum

de_DE, en_GBvb. altında translate.csvçeşitli stringlerle ilgili dosyalara sahibim :"Key", "Translation"

Temamda çeşitli dizeler kullanmaya çalışıyorum echo $this->__('Text')

Ancak, iş gibi görünmüyor (sadece ('Text')görüntülenen içinde dize görüyorum ). Magento'nun çevrilmek üzere CSV'den ne zaman ip çektigine dair temel bir anlayışı özlüyorum. Birisi lütfen bu csv dosyalarının nasıl çalışacağını açıklayabilir mi?


Magento'nun hangi sürümünü kullanıyorsunuz?
philwinkle,

Magento kullanıyorum v: 1.7.0.2
waffl

Bunu normal bir magento şablon dosyasının dışında mı çağırıyorsunuz? Belki yardımcı sınıfı aramanız ve <? Php echo Mage :: helper ('core') -> __ ('Text'); ?> Ayrıca, Frontend'de "Satır
İçi

Yanıtlar:


84

TL; DR

Tercümenin nasıl çalıştığıyla ilgili ayrıntılara ilgi duymuyorsanız, içeriği Tercümenizin işe yarayıp yaramadığını
kontrol etmek için içeriğe atlayın , özellikle de
Modül Kapsamında Çeviri çatışması alt bölümü .

Magento Tercüme Genel Bakış

Magento, çeviri kaynaklarına öncelik verir (en yüksekten en düşüğe):

  1. DB ( core_translatetablo)
  2. Tema translate.csvdosyası
  3. app/locale/*/*.csvdosyalar

Çeviri dizisi nasıl oluşturulur?

Modül Çevirileri

Öncelikle app/locale/*/*.csvondan bütün aktif etc/config.xmldosyalardan referans alınan dosyalar ayrıştırılır. İşte sürecin bir özeti:
Magento aşağıdaki config.xmlbölümü bulduğunu varsayalım :

<!-- excerpt from Mage/Catalog/etc/config.xml -->
<frontend>
    <translate>
        <modules>
            <Mage_Catalog>
                <files>
                    <default>Mage_Catalog.csv</default>
                </files>
            </Mage_Catalog>
        </modules>
    </translate>
</frontend>

Ve bu dosyada, geçerli mağaza görünümü için yapılandırılmış yerel ayar için aşağıdaki çeviri belirtildi:

"AAA","BBB"

Bu koşullar altında, Magento, çeviri dizisinde aşağıdaki kayıtları oluşturur:

array(
    "AAA" => "BBB",
    "Mage_Catalog::AAA" => "BBB"
)

İkinci değer, Modül Kapsam Çevirisidir . Ön ekli modül adı, çeviri dosyası bildirimini içeren config XML düğümünden alınmıştır.

Aynı çeviri bir tarafından tekrar belirtilirse ikinci modül dosyası içinde, örneğin Some_Module.csvçevirisidir "AAA","CCC", bu olacak OVERWRİTE DEĞİL"AAA" ayarı. Bunun yerine, yalnızca ikinci modül adıyla yeni bir kayıt ekleyecektir "Some_Module::AAA" => "CCC".

Geliştirici modu etkinse, başka bir modül çevirisinde aynı anahtarla ikinci bir kayıt bulursa , kaydı bile ayarlayamaz"AAA" . Bu, geliştirme sırasında modül çeviri çakışmalarını tespit etmeyi kolaylaştırır.

Tema Çevirileri

İkincisi, translate.csvgeçerli yerel ayar için temanın geri dönüşüne ilk dosyadan yüklenen çeviriler, çeviri dizisindeki varolan kayıtları değiştirir.
Bu nedenle önceki örneğe devam etmek gerekirse, bir translate.csvkayıt "AAA","DDD"aşağıdaki çeviri verilerine yol açacaktır:

array(
    "AAA" => "DDD", // This is overwritten by the translate.csv file
    "Mage_Catalog::AAA" => "BBB",
    "Some_Module::AAA" => "CCC"
)

Tabii ki translate.csvyeni çeviri tuşları ile kayıtlar sadece diziye eklenir.

Veritabanı Çevirileri

Çeviriler core_translatemasaya temelde sadece tema çeviriler gibi tercüme diziye birleştirilir.
Modül veya tema çevirilerindeki mevcut anahtarların üzerine veritabanı kayıtları yazılır, yenileri eklenir.

Çeviri Araması

Tüm __()yöntemi denir Magento birinci akım modülü eşleşen dizideki bir çeviri arar.
Geçerli modül, __()sınıfın çağrıldığı sınıf adına göre belirlenir . Örneğin, bloklarda sorumlu yöntem şöyle görünür:

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

Yardımcı ve Denetleyicilerdeki yöntemler buna göre çalışır.

Örnek Arama Senaryoları

Örneğin, $this->__('AAA')bir şablon dosyasında çağrıldığını söyleyelim . İlişkili bloğun türü varsa Mage_Core_Block_Template, Magento ilk önce bir Mage_Core::AAAkaydı kontrol edecektir . Bulamazsa, anahtarın çevirisine geri döner AAA.
Örnek senaryoda bu, çeviriden kaynaklanır DDD( translate.csvdosyadan).

Farklı bir senaryoda, ilişkili blok olabilir Mage_Catalog_Block_Product_View. Bu durumda, Magento önce bir çeviri kaydını kontrol Mage_Catalog::AAAeder ve çeviriyi bulurdu AAA.

Dolayısıyla, modül kapsam çevirileri genel çevirilerden daha yüksek önceliğe sahiptir . Hangi çevirinin kullanılacağı, sınıfın __()yöntemi çağırmasından hangi modülün kullanıldığına bağlıdır .

Çevirinizin işe yarayıp yaramadığını kontrol etmek için ne

Bir translate.csvdosyadan çeviriniz kullanılmıyorsa, bu kontrol listesini izleyin:

  1. Çeviri önbelleği kapatıldı / yenilendi mi? (Çözüm: önbelleği temizleyin)
  2. translate.csvdosyası geçerli mağaza için tema yedeği gerçekten? (Çözüm: tema yapılandırmasını düzeltin)
  3. core_translateTablodaki çeviri için çelişkili bir kayıt var mı ? (Çözüm: çakışan kaydı listeden kaldırın core_translate)
  4. Tüm önceki noktalar neden değilse, farklı bir modülden çakışan bir çeviri yapılmalıdır. (Çözüm: aşağıya bakın)

Module Scope Translation çakışmaları için çözüm

Son durumu doğru bulursanız, çeviriyi yapan modülün modül kapsamı translate.csv ile çeviriyi ikinci kez eklemeniz yeterlidir .
Örneğin, her zaman isteseydi AAAolarak çevrilecek DDDtema çeviri yoluyla aşağıdaki konularda bu yapabilirdi translate.csv:

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

Uygulamada, modül kapsamını yalnızca çeviriye bir çelişki varsa, yani çeviri çalışmıyorsa eklerim.

ek Notlar

Satır İçi Çeviri

Magento'nun satır içi çevirme özelliği core_translate, modül kapsamı önekini kullanarak özel çevirileri tabloya ekler .

Geriye dönük uyumluluk

Tema çevirilerinin önceliği, Magento versiyon 1.3 ya da öylesine daha önceki veritabanı çevirilerinden daha yüksekti.

XML Çevirisi

Magento bazen değerlendirmek translate=""bağımsız değişkenleri config.xml, system.xmlçocuk düğüm değerlerini çevirmek ve düzen XML. Çeviri kapsamı için modül belirtmek üzere argüman
kullanılarak bu durumlarda bir yardımcı sınıf belirtilebilir module="".
Hayır ise moduleargüman XML belirtilmişse, core/datayardımcı çocuk düğüm değerlerini çevirmek için kullanılır.

Daha fazla bilgi

Bu yazıda Magento çeviri işleminin bazı ayrıntılarını anladığımı itiraf ediyorum, ancak yalnızca çok fazla bilgi istemediğim için.

  • Çeviri dizisi oluşturulurken bazı teknik detaylar
  • Modüller için ek çeviri dosyaları kullanma imkanı
  • core_translateKayıtlar için mağaza görünümü kapsamı
  • Farklı çeviri yöntemlerini kullanarak lehte ve aleyhte olanlar

Daha fazla bilgi gerekirse lütfen ayrı bir soru sorun.


1
Tamam, herkese inanılmaz derecede üzgünüm, ama başkası bana söylemeden önbellekleri açtı ... Muhtemelen şu an çeviriler üzerinde çalışmaya başladım. İç çekmek. Bu bilgi, Magento'daki çeviri sürecini anladığım için inanılmaz derecede yardımcı oldu. Çok teşekkürler, bu kesinlikle __()işlevin nasıl çalıştığıyla ilgili tüm soruları yanıtlıyor .
waffl

Magento'nun çeviri mimarisine ilişkin güzel bir genel bakış burada da bulunabilir: gist.github.com/antonmakarenko/7538216
thdoan

@Vinai, mükemmel cevap. Gerçekten ben bir soru haberi bir çeviri sorunu çözmek için bana yardımcı oldu burada . Şaşırtıcı bir şekilde Mage_Tax, Magento'nun çevirileri öncelikli hale getirme biçimine aykırı görünen temamın çevirileriyle çelişiyordu
Holly

14

Çeviri Kaynakları

: Çeviriler farklı kaynaklardan birleştirilir Modül çeviriler ilgili XML dosyalarından, tema çevirileri gelen translate.csvakım tema ve satır içi çeviri veritabanından.

Tercümeler kesinlikle modüle özel olabilir (sadece bir modül içinde geçerlidir), bu her zaman satır içi çeviriler ve isteğe bağlı olarak tema çevirileri için geçerlidir. Bunu başarmak için, onları translate.csv'deki modül ön ekiyle tanımlamanız gerekir:

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

Modüllerden yapılan çeviriler (gibi Mage_Catalog.csv) yalnızca GELİŞTİRİCİ MODU açıksa kesinlikle modüle özgüdür. Aksi halde, ilk yüklenen modülün çevirisi metin için kendi çevirisine sahip olmayan tüm modüllerde global olarak kullanılır.

Farklı kaynaklardan gelen her metnin çeviri dizisinde nasıl birleştirildiğini gösteren bir akış şeması hazırladım:

Çeviri Birleştirme data çeviri dizisi

Kötülük Kenar Çantası

Tercüme edilmiş dize tercüme edilmemiş dize eşitse, çeviri yoksayılır. Kulağa ilk bakışta yararlı bir optimizasyon gibi geliyor, ancak bu yolla bir modüldeki değişmeyen bir diziyi kolayca çeviremezsiniz ve başka bir modülden değiştiremezsiniz, çünkü değiştirilen çeviri tek olan ve global hale gelecektir.

Çeviri Araması

Çevirinin hangi modüle bakılacağı, yöntemin __()çağrıldığı sınıfın modülüne bağlıdır . Ardından, çeviri dizisindeki arama aşağıdaki gibidir:

Çeviri Araması data çeviri dizisi

Kapsam tanımı

Modülü bir sınıf için değiştirme olasılıkları vardır, bu özellikle bloklar ve yardımcılar için faydalıdır. En iyi uygulama, bir çekirdek sınıfını yeniden yazarken modül adını her zaman açıkça ayarlamaktır. Nasıl çalışır, Helpers, Blocks ve Contollers arasında değişir (Magento CE 1.9.1'den itibaren)

Bir Blok İçin Örnek:

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

Bloklar için module_nameparametreyi pafta XML olarak da ayarlayabilirsiniz :

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

Bir Yardımcı İçin Örnek:

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

Ön denetleyiciler için özelliği _realModuleName, yönetici denetleyicileri için ayarlayabilirsiniz _usedModuleName(tutarlılık için yay)

Diğer Çeviri Yöntemleri

XML dosyalarında (config.xml, system.xml, layout), düğümlerin translateöznitelikle çevrilmesi gerekip gerekmediğini belirleyebilirsiniz . Ayrıca modulekapsamı belirtmek için bir özellik eklemelisiniz , ancak burada değer yukarıdaki gibi modül adı değil, yardımcı takma ad olmalıdır .

<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’te Translatorglobal olarak mevcut olan nesneyi kullanabilirsiniz:

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

ancak, JavaScript’te kullanmak istediğiniz çevirileri çevirmen nesnesine uygun hale getirmeniz gerekir. Bu, modül dizinlerindeki jstranslator.xmldosyalardan yapılır etc.

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

loadingherhangi bir dize olabilir ancak genel olarak benzersiz olması gerekir. translateVe modulenitelikleri diğer XML dosyalarında olarak kullanılır. Değeri messageve çevirisi JS Translator nesnesine eklenir.

Sorun giderme

Tüm karmaşık kuralları bilseniz bile, bazı çevirilerin neden çalıştığı (ya da çalışmadığı) çalıştığını anlamak zor olabilir. Bunu kolaylaştırmak için, çevirilerin nereden geldiğini gösteren bir "Çeviri İpuçları" modülü geliştirdim:

Buradan alın: https://github.com/schmengler/TranslationHints

Ekran görüntüsü: Çeviri İpuçları


Blog yazılarıma ve konuyla ilgili slaytlara göre:


2
Umarım ücretsiz Yireo EmailOverride modülümün özel CSV modül dosyalarının da temaya alınmasına izin vereceğini söyleyerek spam göndermiyorum. Sadece tercüme etmeyin.
Jisse Reitsma 11:30 '

6

Önbelleğini temizledin mi?

Sisteminiz test ettiğiniz dosyanın yerel ayarına mı ayarlanmış?

Magento tema çevirisini yüklediğinde aradığı dosyayı bulabilir mi (bazı geçici var_dump; çıkış; ifadeler yardımcı olmalıdır).

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

Can _getTranslatedStringyöntem veri dizisinde aradığını bulmak?

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

Önbelleklerin hiçbiri etkin değil, sistemimin yerel ayarlara ayarlanmış olup olmadığından emin değilim, ancak çeviriler belirli şablon dosyalarında buna göre çalışır (dükkan değiştirerek). Örneğin, benim bir dize translate.csvdüzgün bir şekilde çevirir - /app/design/frontend/package_name/default/template/catalog/product/view.phtmlama değil/app/design/frontend/package_name/default/template/page/html/topmenu.phtml
waffl

Haklıydın, biri bana söylemeden önbelleği açtı. Üzgünüz, özür dilerim ve bilgi için teşekkür ederim!
waffl

3
@waffl Özür dilemeye gerek yok - Sanırım her Magento geliştiricisi bunu en az haftada bir kez yapıyor.
Alan Storm,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.