Bir değişkeni t () üzerinden geçirmek her zaman kötü mü?


13

Benim hook_schema için küçük bir yardımcı işlevi var:

function _bbcmap_schema_asr_field($description) {
  return array(
    'type' => 'int',
    'unsigned' => TRUE,
    'size' => 'small', // Up to ~66k with MySQL (equivalent up to ~660.00 adjusted)
    'not null' => FALSE,
    'description' => t($description),
  );
}

Ve sonra böyle bir şey kullanabilirim:

/**
 * Implements hook_schema().
 */
function bbcmap_schema() {
  $schema['la_data'] = array(
    'fields' => array(
      ...
      'mort_asr_male' =>    _bbcmap_schema_asr_field('The age standardised mortality amongst men (fixed point with scale factor 1/100)'),
      'mort_asr_female' =>  _bbcmap_schema_asr_field('The age standardised mortality amongst women (fixed point with scale factor 1/100)'),
      'incid_asr_male' =>   _bbcmap_schema_asr_field('The age standardised incidence amongst men (fixed point with scale factor 1/100)'),
      'incid_asr_female' => _bbcmap_schema_asr_field('The age standardised incidence amongst women (fixed point with scale factor 1/100)'),
      ...
    ),
  );
}

Kılavuzun değişkenleri geçmek olmadığını biliyorum, t()ancak bu menü sisteminin t()(varsayılan olarak) geri çağrının başlığını geçmesine çok benzer görünüyor . Bu iyi ya da kötü tarzı hakkında herhangi bir yorum var mı?

Yanıtlar:


17

İlk argüman t(), aşağıdakileri içermeyen gerçek bir dize olmalıdır:

  • değişkenler, hatta bir fonksiyonun parametreleri: t($description)
  • dizelerin birleşimi: t('If you want to add a link, click on' . '<a href="http://example.com">this link</a>.')
  • bir işlevden döndürülen değer:t(get_menu_description())
  • sabit: t(MYMODULE_MY_WIDGET_TITLE),t(MyClass::WIDGET_TITLE)

Nedeni, o ayrı (örneğin belirli birkaç kanca hook_menu(), hook_perm(), hook_permission()), çevirmek dize kod arayan bir modülün kodunu taramak bir komut dosyasından bulunurlar gibi t('This is an example.'); bir değişkenin değeri gibi çalışma süresine bağlı bir değer bulduğunda, komut dosyası, dönüştürülmesi gereken dizenin hangisi olduğunu anlayamaz, çünkü bir değişken kod her çalıştırıldığında farklı bir değer içerebilir. Aslında, http://localize.drupal.org , aşağıdakine benzer bir uyarı bildirir, bunun için argüman t()değişmez bir dize değilse:

İlk parametre t()değişmez bir dize olmalıdır. Burada değişkenler, birleştirme, sabitler veya diğer değişmez dizeler olmamalıdır. At t($filter['name'])hattı 30 CustomFilter / customfilter.module içinde.

Dinamik bir değer t()iletiyorsanız, çevrilecek dizeleri ayıklayan komut dosyası herhangi bir değer çıkarmaz; etki, dinamik çıktıyı doğrudan kullanıcı arayüzünde t()kullanmama t()ve kullanmama ile aynı etkiye sahip olan iletilen argümanın çevrilmeyeceğidir . Dizenin çevrileceği tek durum, dinamik dizenin bir işlevin geçirdiği değişmez dizeye eşit olmasıdır t(). Örneğin, Drupal için düşünülmeyen ve geçerli ayın adını döndüren bir işlev içeren bir kitaplığınız olduğunu varsayalım. Aşağıdaki kodla, bu işlevden döndürülen değer çevrilir.

function mymodule_calendar_page_title() {
  return t(Calendar::getCurrentMonth());
}

function mymodule_calendar_translations() {
  $translations = array(
    t('January'),
    t('February'),
    t('March'),
    t('April'),
    t('May'),
    t('June'),
    t('July'),
    t('August'),
    t('September'),
    t('October'),
    t('November'),
    t('December'),
  );
}

mymodule_calendar_translations()herhangi bir değer döndürmek için çağrılması gerekmez. Modülün kodu ayrıştırılacaksa, çağrı, t()geçirilen değişmez dizeleri arayan koddan bulunacaktır t().

Bir veritabanı tablosu ve alanları için verilen açıklamayı çevirmek, Drupal çekirdek modüllerinin hiçbiri bunu yapmadığı için yapmanız gereken bir şey değildir; örneğin, node_schema () aşağıdaki kodu içerir:

function node_schema() {
  $schema['node'] = array(
    'description' => 'The base table for nodes.', 
    'fields' => array(
      'nid' => array(
        'description' => 'The primary identifier for a node.', 
        'type' => 'serial', 
        'unsigned' => TRUE, 
        'not null' => TRUE,
      ), 
      'vid' => array(
        'description' => 'The current {node_revision}.vid version identifier.', 
        'type' => 'int', 
        'unsigned' => TRUE, 
        'not null' => TRUE, 
        'default' => 0,
      ), 
      // …
    );
    // …
  );

  // …

  return $schema;
}

Çağrıları ayrılmasına neden rapor t()herhangi Drupal çekirdek uygulamalarından hook_schema()olan tüm şema tariflerden Kaldır t () tarafından açık olmuştur webchick (Drupal 7 eş sürdürme).

Szeged'de t()şema açıklamaları hakkında uzun ve uzun bir tartışma yaptık ve masadaki herkesin (Dries'i içeren) t()bu açıklamalardan çıkarılması gereken fikir birliğiydi . Bir şeyleri karıştırıyorlar çünkü t()erken mevcut değil ve insanlar hiç kimsenin teknik açıklamaları çevirmek için zaman ayırmayacağını tartıştılar ve kod yorumlarını da çevirmediğimiz için gerçekten mantıklı değil, çünkü misal.

Bir Drupal 6 modülünü Drupal 7'ye dönüştürmeyle ilgili makalenin özel bir paragrafı vardır: Şema açıklamaları artık çevrilmiyor .


2
Yükleme / güncelleme kancalarında t () kullanımı hakkında daha fazla bilgi: drupal.org/node/322731
AyeshK

2

Değişmez dizelerdir, bu yüzden onları geçmek iyidir t(). Böyle şeyler için t () sisteminin bazı revizyonları var, ancak D8'de olacağından emin değilim.

Eğer böyle bir şey geçirirseniz Şu anda, sadece kötü t($count . ' books')nerede $counto çeviri için çok fazla dize üretecektir gibi herhangi bir değer alabilir.


-1

Bununla birlikte, bir değişkenin etrafında t () kullanmak ve onun çalışması için mümkündür. Ben page.tpl.php $ başlık ile yaptım.

DÜZENLEME: Belki de dizeler çevrilmez, ancak dize geçersiz kılmaları için kullanılabilir.


1
Bunun neden kötü bir fikir olduğuna dair kiamlaluno'nun cevabına bakınız.
Andy

kiamlaluno'nun cevabı ipin çevrilmeyeceğini söylüyor. Ancak t () için başka bir kullanım, dize geçersiz kılmalarını etkinleştirmektir. Bunun değişkenlerle çalıştığını doğrulayabilirim.
naomi

1
@ naomi Evet işe yarayacak. Ancak çevirileri etkinleştirdiyseniz, t () ile iletilen tüm başlıklar çeviri dizeleri listesinde görünecektir. IMO düğüm başlıklarını değiştirmek için dize geçersiz kılmaları kullanmamalısınız. Bir alan oluşturun ve düğüm başlığını bir hook_preprocess_node veya sayfada alanın değeri olarak değiştirin. (Ayrıca hook_node_load veya ilgili herhangi bir kanca da kullanabilirsiniz)
AyeshK
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.