Görünen tüm sayfalarda şablonlardan dizeler çevrilebilir hale nasıl getirilir?


14

t()* .Tpl.php dosyalarında bazı çağrılarım var . Örnek olarak, diyelim ki ürünler ve product.tpl.php dosyası hakkında konuşuyorum.

Şablonlardaki dizeler ilk kez kullanılıncaya kadar tanınmaz. Drupal.org'da bu konuda bir iplik vardı ve bunun doğru olduğunu gördüm. Ne yazık ki, eğer gidersem, diyelim ki, http://example.com/pl/product/200 , bu dize alan olarak ayarlanmış {locales_source}tabloya kaydedilir .location/pl/product/200

Kullanıcılarımın yerelleştirme istemci modülünün yerinde çeviri aracını kullanarak çevirebilmeleri gerekiyor, bu yüzden gerçekten ne anlama geldiğini, uygun bağlamda olduğunu görebiliyorlar. Kaynak konumu olarak ayarlandığında /pl/product/200, 200 numaralı kimliğe sahip ürün, dizenin çevrildiği gösterilen tek üründür. Ve daha da kötüsü, kullanıcıları belirli bir ürün üzerinde çevirmeye zorlayabilirsem, Rusçaya da çevirebilmeleri için onlara ihtiyacım var ve konumu ayarlanmış bir ürün yok /ru/product/PID.

L10n_client aracındaki tüm dillerin tüm ürünlerde, tüm dillerde görünür olmasını sağlamak için veritabanında konum dizesini yeniden biçimlendirmenin bir yolu var mı?

Bunu ayarlamayı denedim:

  • ; sites/default/themes/mytheme/product.tpl.php,
  • sites/default/themes/mytheme/product.tpl.php,
  • sites/default/modules/mymodule/mymodule.module (temalı veri üreten modül)

Ama bu onları sadece çeviri aracı için görünmez yaptı.

Yerelleştirme istemcisinde bir hata olmadığından eminim , bu dizenin oluştuğu söylenen dizeyi gösterir. Ve görünüşe göre Drupal 7 çeviri sistemi için de "çalışma şekli" - zaten tartışıldı ve bildirildi ve hiçbir şey değişmedi. Bu bir hata raporu değil, sadece ne ile çalışmamız gerektiğini soruyorum.


Veri modülü üzerinde çalışacak hiçbir şeyi olmayan metinlerden bahsediyorum . Ürünleri çevirmek istemiyorum, sadece ürünün kendisi ile hiçbir ilgisi olmayan şablon dizeleri, Önceki - Sonraki ürün resim galerisi şablonunda olduğu gibi.

Örneğin, modül 15 küçük resim döndürür ve 5 temasını göstermek bir temanın işidir. Ve önceki / sonraki bağlantıların ihtiyaçları altve titlenitelikleri. Çeviri. Ama modülüm bunu bilmiyor. Ve asla gerekmemelidir.


Ne istediğinizi tam olarak anladığımdan emin değilim, ancak siteyi tüm dillerde taramak yeterli olur mu? Örneğin kullanabilirsiniz. xmlsitemap bağlantılarını birden çok dilde oluşturmak ve sonra wgetya da her neyse kullanın . Hackish, ama buna izin verildiğini söyledin (:
Andy

@Andy Localization Client, kullanıcıların sayfanın alt kısmında bir çubuk açmasına ve o sayfada görünen metinleri gördüklerinde doğrudan çevirmelerine olanak tanır. Tüm metinleri düzgün bir şekilde dışa aktarabilirim, ama asıl mesele bu değil.
Mołot

1
Ben drupal_set_message () ve dpm (), bu mesajlar örneğin page.tpl.php denirse bir sonraki istek için sıraya alınacağını hatırlıyorum. Bunun nedeni, şablonlar iletiler işlendikten sonra genellikle bir isteğin oldukça geç işlenmesidir. Benzer bir şey t () ve yerelleştirme istemcisi için de geçerli olabilir.
donquixote

Güzel soru. Güzel sorun.
amatör barista

Sadece bir öneri ... kullanıcılarınızın tpl t () dizelerinizi diledikleri zaman dilleri çevirebilmelerini istiyorsanız, bu dizeleri Çeviri şablonu çıkarıcısı ( drupal.org/project/potx ) ile çıkarabilir ve orijinal .po, Poedit gibi bir araçla çevirebildiklerini? ( poedit.net ). Bu dizeleri birkaç statik olan olarak sunarken, iş her çevirmen tarafından bir seferde yapılacaktır ...
Kojo

Yanıtlar:


5

Gereksinim:
Sitemin
kimliği doğrulanmış bir kullanıcı olarak birden çok dilde
çalışabilmesi için, sitemin kod tabanında bulunan t () işleviyle yapılan tüm çeviri çağrılarını bir kerede çevirebilmem gerekiyor.

Bu gereksinim açıklaması, istediğiniz şeye yakın mı?


Tarayıcıları

Birinin dediği gibi - bir tarayıcı teorik olarak tüm t () çağrılarının kaydını zorlamak için tüm siteden geçebilir. Ancak 1) tarayıcı, hangi sayfaların taranacağını bilmiyor; 2) bu nedenle taranacak sayfaların listesini tutmak istemiyoruz; 3) tarayıcı kullanmak istemiyoruz, nokta. Iyy. Sadece eww. Sağ?


Sorun

  1. Tüm çeviri dizelerinin bir listesine sahip değiliz.
  2. Drupal / PHP, C'nin aksine derlenen dinamik bir dildir. Bu yüzden gidip örneğin diyemeyiz: bu kod tabanının tamamını derleyin, sonra bana bu işlevin tüm örneklerini bulun t(), sonra bu örnekleri veritabanına kaydedin, sonra kayıtlı tüm bu örnekleri t()tek seferde çevirin. Bizim masamıza bir seçenek olduğunu sanmıyorum.
  3. Statik kod analiz aracı aynı nedenden dolayı tarayıcının çaresiz olacağını düşünürdü. Bunu t()bu dosyada buldum . Harika! Hangi URL'de kullanılıyor? Bağlam nedir?

Sorunu mevcut araçlarla (Drupal ve bazı katkıda bulunan modüller) ve mevcut kısıtlamalarla (gerçek zamanlı tema çağrıları -> şablon dosyaları -> t()çağrılar) güvenmek, burada çıkışsız bir geçit gibi görünüyor. Biraz kutunun dışında düşünmemiz gerekebilir.


İhtiyacımız olan

  1. Hangi güncel çeviri dizelerine sahip olduğumuzu ve bağlamlarının ne olduğunu söyleyen bir veri kaynağına, modele ihtiyacımız var -
  2. Proaktif veri modeli. Mevcut veri modeli reaktiftir (bir çağrı olduğunda model güncellenir t()). Proaktif bir veri modeline ihtiyacımız var - bu, uygulamanın t()müşteri tarafından gerçekten yürütülmeden önce örnekleri aramaya özen gösterdiği bir model .
  3. Bağlama ihtiyacımız var. t()tek başına kesmez - çünkü - 'foo' tercüme ettiğimizi bilmiyoruz, ancak tercüme ettiğimiz hedef dil t()gerçekleştiği yerdeki URL'ye bağlıdır . Hedef dili t()aramaya, örneğin bir sarıcı araması kullanarak kodlayabilirsek bile, sizin amaçlarınız için işe yaramaz.

Onlara sahip olsaydık sorunumuza yardımcı olacak bazı araçlar belirledim. Bu araçlarla veri modeline gidip şunu söyleyebiliriz: henüz doldurulmamış tüm dizeleri verin t(). Şimdi bu çevirileri ekleyin. Teşekkür ederim.

Ve bir dahaki sefere müşteri geldiğinde, çeviriler oradadır.

Bu araçları nasıl inşa ederiz?


Kısıtlamalar

  1. Hedef dil, URL tarafından belirlenen şablonda olamaz. Dizenin herhangi bir dili desteklemesi gerektiğini varsayarsak.
  2. Çevrilen dize şablonda olamaz. Çeviri bir veritabanında bulunacaktır.

Artık sorunu daha fazla düşündüğüm ve bazı zorluklar ve kısıtlamalar belirlediğime göre, orada mevcut olan herhangi bir çözüme bakmayı veya özel çözümler üretmeyi düşünebilirim.

Çözüm beyin fırtınası

"Her şeyi" birbirine bağlayan bir şeye ihtiyacım var. Peki ya bir varlık?

  • Bir işletmenin çevrilmesi gereken ürünü tutabilir.
  • Varlıklar, çevrilmesi gereken ürün ile bağlam arasındaki ilişkiyi (tutkal) sağlayabilir.
  • Varlık, bir alanda örneğin ürünün varsayılan URL konumunu belirtebilir.
  • Jetonlar, ürünün görüneceği alternatif konumları (diller?) Belirtmek için kullanılabilir.
  • İşletmeler bize ihtiyacımız olan proaktif veri modelini ve bağlamını sağlar. Bu da bizim gibi bir şey yapmamıza izin verir: veritabanına git, tüm ürün varlıklarını al ve X, Y ve Z alanları için bir çeviri dizesi yoksa, bu çeviri dizelerini oluşturun.

Daha sonra müşteri yakaladığında /pl/product/200, db'ye bir gezi yapın, 200 ürününe bakın ve mevcut plçeviriyi alın. Bu ürün için de bir başlık ve altyazı alanınız var mı? Çeviriler de orada olmalıdır.

Kullandığınız çeviri modülü açısından burada çok belirsiz ve genel olduğumu unutmayın. Sonunda kendi çeviri modülünüzü kullanabilirsiniz - büyük olasılıkla durum böyledir. Drupal'da şu ana kadar gördüğüm tüm çeviri modelleri (D7 itibariyle, henüz D8'e bakmamış) proaktif değil reaktif.

Kısaca

Teoride, ihtiyacınız olanı inşa etmek için araçlar vardır, varlıklar her şeyi birbirine bağlayacak anahtar bileşendir: - veri (çeviri dizesi), - hedef diller. Ürün dilleri için Varlığın kendisinde, tercihen bir sınıflandırma sözlüğünde olmak zorunda değilsiniz. veya belki de diğer varlıklar için jenerik bir sınıflandırma. - Bağlam. Varlığın göründüğü URL. URL bir jeton içerecek ve jeton da hedef dil sınıflandırmasına atıfta bulunacaktır.

Bu üç bileşenle şunları söyleyebilirsiniz: Tüm productvarlıkları alın , URL aliasalana gidin , sınıflandırma jetonunu alın, tüm olası terim kombinasyonları arasında geçiş yapın, tüm kombinasyonları çok büyük çirkin bir form veya AJAX kullanarak mevcut kullanıcıya sunun ve çok adımlı formlar (bunun gibi bir şey) ve şu anda oturum açmış olan kullanıcı, ürün 200 için çeşitli dilleri çevirdiğinden, bunları bir yere veritabanına kaydedin

Veritabanındaki bir yerde varlıktaki bir Alan API alanı, her bir varlığa ait ayarlar alanı (tam olarak Alan API'sı değil, yine de veri tutabilir) veya bunun için kullandığınız ayrı bir tablo olabilir. Varlık veri kaydetmek hem kod hem de veri daha düzenli ve kolay tutacağını düşünüyorum.


Bina: Olası çözümler

  • D8MI (Drupal 8 Çok Dilli Girişim)
  • Özel kod: Mevcut dizinleri ve ilgili tema kancası uygulamalarını programlı olarak sorgulayarak ve görüntüleyerek şablonlarda t () tarafından sağlanan "dizin" çevirileri.

pseudocode

Varlık foreach (x türünde),
Tüm dilleri bulun (ürünle ilişkili sınıflandırma veya temel dil),
varlığı oluşturun,
- t () çeviri dizelerini algılamak için
- ürün veri modelinin kendisi değil, ürün.

Sonuç:
- Her dilde varlık şablonu oluşturmak için ilk çağrı, her çağrı için varsayılan dil uygulamasını döndürür.
- Şablondaki t () parametreleri artık Drupal'da önbelleğe alındı ​​ve çeviri için hazır (her dil örneği için değil, her ürün örneği için).
- “Tercüman” rolüne sahip kullanıcı artık çeviri arayüzüne gidebilir ve her dil için mevcut tüm t () parametrelerini çevirebilir.
- Site sahibinin, müşterilerinin her ürün sayfasını ziyaret etmesini veya her ürün sayfasını manuel olarak ziyaret etmesini beklemesi gerekmez, çünkü bu onun için programlı olarak yapılır.

Açık sorular:
- Bağlam nedir? Her bir “ürün” varlık paketi için programla bir theme () çağrısı yaparsam, çağrının yapıldığı yeri kaydediyor mu? Düğümün URL'sini kaydediyor mu? “Bağlam” değiştirilebilir mi? Bağlam nerede kaydedilir? "Dinamik" şablonlarınız olduğunda ne olur - yani ürün başına birden fazla şablonunuz olduğunda ve bu varyasyonları nasıl saptamaya devam ederseniz?

Her zaman olduğu gibi, teorileştirme ve sözde kod sadece beyin fırtınası için iyidir. Ancak geliştirmede prototip oluşturmaya başlayana kadar neye karşı olduğumuzu pek bilmiyoruz. Bu yüzden birkaç kısıtlama, olası çözüm ve olası sorun veya soruları hazırladıktan sonra, artık bir kavram veya çalışma prototipi kanıtı uygulamaya devam edebilirim. Yukarıdaki açık soruların bazıları sadece bu şekilde cevaplanabilir ve prototiplediğimiz en erken (başarı veya başarısızlık ne olursa olsun), bu soruların bazılarını yanıtlamaya başlayabilir veya yaklaşımı tamamen değiştirebiliriz. Bizi izlemeye devam edin ~


1
Tüm yazıyı okumadan bile, bu tür bir cevap bir oylamayı hak ediyor
Oleg Videnov

Mesele şu ki - Drupal 7 için ihtiyacım olan şeyi yaptığını iddia eden araç zaten var. Bu sadece Drupal'ın bu dizeleri kötü meta verilerle kaydetmesi ile ilgili bir sorun. Ancak dizeleri toplandıktan sonra db'de adı geçen meta verileri değiştirebilirim, sorun değil. Sadece ne ayarlayacağımı bilmem gerekiyor, böylece araç bunu görebiliyordu. Ya da en azından ihtiyacım olan şey olduğuna inandım. Ve en önemlisi: Ürünleri çevirmek istemiyorum, sadece ürünün kendisi ile hiçbir ilgisi olmayan şablon dizeleri, Önceki - Sonraki gibi ürün resim galerisi şablonunda.
Mołot

2

Tamam, aynı senaryoyu yeniden oluşturmak için Yerelleştirme istemcisi ve varlık çeviri modülü ile biraz daha zaman geçirdim. Bu cevap öncekinden tamamen farklı olduğundan, ayrı bir yorum olarak ekledi:

  1. Bir / birinci düğümdeki bir dil için eklenen çeviri tüm düğümler için kullanılabilir.

    İşte bir örnek:

    • Eğer nid 200 ile aynı tipte yeni bir ürün ekleyip pl çevirisini yeni düğüm ziyaret edersem (diyelim ki pl / product / 204), pl / product / 200 içinde aynı çeviri dizesini görürdüm.

    • Tek fark Yerelleştirme istemcisinde görünmemesidir. Bu özelliği modülün sorun kuyruğunda isteyebiliriz, ancak çeviri geçerli sayfaya özgü olmadığından ve tüm sayfaları (yani hem pl / product / 200 & pl / product / 204) etkileyeceğinden daha fazla karışıklık getirecektir.

    • İki düğüm iki farklı kişi tarafından oluşturulmuşsa ve daha sonra olanı çeviriyi değiştirmek istiyorsa, arayüz çevirisini kullanmaları gerekir.

  2. Dize, aynı düğüm için ziyaret ettiğiniz ilk dil için Yerelleştirme istemcisinde kullanılabilir

    İşte bir örnek:

    • 199 no'lu yeni ürün ekleyip 'pl' dili (nid 200) için çeviri ve 'rs' dili (nid 201) için çeviri oluşturursam, dizeyi 'rs' sayfasında değil, yalnızca 'pl' sayfasında görebilirsiniz. Yine, Yerelleştirme istemci modülünde bir kısıtlama gibi görünüyor.

1

Çeviri dizesini şablon veya modül dosyası düzeyinde ekleme yaklaşımınız arabirim çevirisi kullanıcı arabirimi için işe yarayabilir, ancak Yerelleştirme istemcisi için çalışmayabilir.

Açıkçası 200 ürününün Rusça sürümüne sahip olduğunuzda, örneğin yerelleştirme istemcisini kullanarak çevirebileceğiniz / ru / product / 201 gibi yeni bir düğüm olacaktır.

Sadece bir düşünce: Arayüz çeviri arayüzündeki tüm diller için çevrilebilecek bir dize arayın ve müşteriden gerçekten gerekli olduğunda ürün seviyesini çevirmesini isteyin. İşte bir örnek:

"Bu kategori bar ürün foo"

ve eğer "foo" ve "bar" dan başka yaygın olabileceğinden eminsek,

$vars['product_title'] = t('This is product @product of category @category')

önişlemde.

ve .tpl.php dosyası

<?php t($product_title, array('@product' => t('foo'),  '@category' => t('bar')); ?>

Daha çok titlegörüntü döndürücüdeki oklar için metinler hakkında . Modülüm temanın 15 görüntüyü nasıl görüntüleyeceği ile ilgilenmiyor. Ve tema her seferinde 5 tane görüntüler, "önceki" ve "sonraki" oklara ihtiyaç duyan altve titleçevrilmesi gereken oklar . Modülün ön ucum her değiştiğinde değiştirilmesi mümkündür, ancak kesinlikle gerekli olmamalıdır. Bu dizelerin modülün kendisiyle hiçbir ilgisi yoktur. Son fakat en az değil, ben sadece tema değişti dizeleri farkında olmayabilir. Veya bunları modüle geçirmek için kullanılamaz.
Mołot

IMHO, bu durum Yerelleştirme istemcisi yerine arayüz çeviri kullanıcı arayüzünde ele alınmalıdır.
vijaycs85

Yerelleştirme istemcisi, "sorunları gördüğünüzde sitenizdeki çevirileri düzeltmeye" izin vermeyi amaçlamaktadır . - neden şablon dosyalarına uygulanmamalıdır? Tpl dizeleri herhangi bir şey göründükleri bağlama daha da duyarlıdır.
Mołot

1

Çeviri şablonu çıkarıcı ile AFAIK t()işlevi için tüm çağrıları içinde dize ayıklayabilirsiniz .

Çeviri şablonu çıkarıcı, web tabanlı ve Drupal için bir komut satırı Gettext çeviri şablonu çıkarıcı arabirimi ve çevrilebilir dizeler ve tercüme edilebilirlik hataları aramak için yeniden kullanılabilir bir API sağlar. Bu araç, http://localize.drupal.org/ adresindeki başlık altında ve Drupal.org proje sürümleri için ayrıştırma makinesi olarak kullanılır.

Bunu okuyun Bir modül nasıl çevrilir?

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.