Dizeleri Drupal.locale.strings dizinine nasıl çevirebilirim?


9

Bu yüzden bazı özel Javascript kodumda (temamda) Drupal.t () işlevini kullanmaya çalışıyorum.

Drupal.locale.strings nesnesinde doldurmam gereken dizeleri nasıl alabilirim? Orada bazı dizeleri görüyorum, ama elbette tüm veritabanı yüklenemiyor. Eklemenin en iyi yolu nedir? Eklenen dizeleri Çevir arabiriminde düzenlenebilir böylece PHP t () işlevini kullanmak istiyorum.

Yanıtlar:


8

Drupal, gerekli dizeleri javascript nesnesine yerleştirir. Tüm dizeler koleksiyonunun her sayfada yüklü olmaması gibi, JavaScript'e yalnızca gerekli dizeler eklenir.

Bunun, sayfaya gerçekten eklenmeden önce komut dosyaları arasında gezinebileceğine inanıyorum.

Dolayısıyla Drupal.t('Some string');, JavaScript kodunuza eklerseniz , bunu çevirme arayüzünde çevirebilmeniz gerekir.


Peki o zaman olmuyor. (Drupal.t () çağrılarını bulmak için komut dosyasının geçişi). Komut dosyasını temanın .info dosyası aracılığıyla ekliyorum (scriptler [] = scriptler / script.js). Belki drupal_add_js () ile eklemek zorundayım?
JonMcL

Haklısın. Tamamen bir anlayış elde etmek için izlemem gerekiyordu, ama gerçekten otomajik olarak oluyor. Drupal 7'de fonksiyon locale_js_alter () şeklindedir (locale.module içinde). Javascript dosyalarının tam listesini kullanır ve her birini _locale_parse_js_file () içinde ayrıştırır. File_get_contents () öğesinin JS dosyanızı sağlanan yolla yükleyebildiğinden emin olun (yani, tema klasörünüzde ise a / ile yolunuza başlamayın). Temanızın .info dosyasında drupal_add_js veya komut dosyaları [] ayarını kullanabilirsiniz. Elbette, önbellekleri temizlediğinizden ve dizeyi çevirdiğinizden emin olun! :)
JonMcL

6

Bugün de aynı sorunla karşılaştık ve biraz daha araştırdık. Yukarıdaki Chris'in iyi bir yorumu var, ama sonuçta yanlış. Çalışması için Drupal.behaviors komutunu kullanmanız gerekmez.

JonMcL tarafından son yorumunda belirtildiği gibi, locale.inc'deki _locale_parse_js_file işlevi, 1493 satırından (Drupal 7.22'de) Drupal.t ("somestring") desenlerinin ayrıştırılmasından sorumludur:

preg_match_all('~
[^\w]Drupal\s*\.\s*t\s*                       # match "Drupal.t" with whitespace
\(\s*                                         # match "(" argument list start
(' . LOCALE_JS_STRING . ')\s*                 # capture string argument
(?:,\s*' . LOCALE_JS_OBJECT . '\s*            # optionally capture str args
  (?:,\s*' . LOCALE_JS_OBJECT_CONTEXT . '\s*) # optionally capture context
?)?                                           # close optional args
[,\)]                                         # match ")" or "," to finish
~sx', $file, $t_matches);

Anlambilimi umursamayan ve sadece aldığı herhangi bir dosyada Drupal.t ("bir şey") tüm örneklerini bulan "aptal" ayrıştırma işlevidir.

Ne ortak bir gotcha olabilir Drupal.t ("translateme") formunda kaynak kodunda tüm dize olması gerekir, çünkü (açıkçası) hiçbir dosya php dosya_get_contents aracılığıyla açıldığında herhangi bir javascript yürütülmez. Bu, Drupal.t'yi (çok değişken) asla yapamayacağınız ve Drupal'ın Drupal.t'ye attığınız tüm dize içeren javascript değişkenlerini yakalayacağını umduğunuz anlamına gelir.

Bir grafik için "kadınları" çevirmek ve dizeye bir bağlam vermek istiyorsanız, sözdizimi şöyle olur:

Drupal.t("women", {}, {context: "charts"}

Ayrıca, drush yüklediyseniz, js dosyanızın komutla ayrıştırıldığını doğrulayın;

drush vget javascript_parsed

Ardından önbelleğinizi

drush cc all

... ve önceden ayrıştırılmış dosyaların listesinin boş olduğunu doğrulamak için yukarıdaki vget komutunu tekrarlayın. Bu şekilde dosyanız bir sonraki çalıştırmada onarılır (bunu da doğrulayın).


1
İçin teşekkürler drush vget javascript_parsed! Çeviri komut dosyalarını yeniden oluşturmanın daha hızlı bir yolu, yalnızca CSS ve JS dosyalarını kullanarak kaldırmaktır drush @sitealias cc css-js.
lmeurs

0

Drupal 7'de çok dilli JS uygularken karşılaştığım çift var:

  1. İlk olarak, JS dosyanızın satır içine eklenmediğinden emin olun . Drupal 7.22'den itibaren, Drupal'da JavaScript dosyalarını satırlaştırıyorsanızDrupal.locale.strings otomatik olarak kendini güncellemiyor gibi görünüyor . Çeviri arayüzü hala dizeyi seçti ve karışıklığımı arttırdı.

  2. İkinci olarak, JS'nizi sayfaya eklemek için Drupal.behaviors kullandığınızdan emin olun . Düzenli JS kapanmaları, Drupal.t()Drupal'ın çağrıların "sihirli" ayrıştırmasını tetiklemez . Bu teknik olarak yine de yapmanız gereken bir şeydir;)

Oradan gerçekten acısız. Çevrilmesini Drupal.t()istediğiniz metni kullanın , dosyayı her güncellediğinizde önbelleğinizi temizleyin ve çevirmenlerinizin arayüzündeki yeni dizeyi görmesi gerekir /admin/config/regional/translate/translate. Çalıştırdıktan sonra oldukça güzel.

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.