web-gelistirme-sc.com

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

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 t() ile değişkenleri iletmek olmadığını biliyorum, ancak bu menü sisteminin t() (varsayılan olarak) aracılığıyla geri çağrının başlığını geçirmesine çok benziyor. Bu iyi veya kötü tarzı hakkında herhangi bir yorum var mı?

13
Andy

t() öğesinin ilk bağımsız değişkeni, hariç tutulan bir sabit dize olmalıdır:

  • değişkenler, hatta bir işlevin 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)

Bunun nedeni, birkaç özel kanca (örn. hook_menu(), hook_perm(), hook_permission()) dışında, çevrilecek dizenin kodunu tarayan bir komut dosyasından bulunmasıdır. t('This is an example.') gibi kodu arayan bir modül; 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, t() argümanı değişmez bir dize değilse:

t() parametresinin ilk parametresi 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. 30. satırdaki customfilter/customfilter.module içindeki t($filter['name']) konumunda.

t() öğesine dinamik bir değer iletiyorsanız, çevrilecek dizeleri ayıklayan komut dosyası herhangi bir değer çıkarmaz; sonuç, t() öğesine iletilen argümanın çevrilmeyeceğidir; bu, t() kullanmama ve dinamik çıktıyı doğrudan kullanıcı arabiriminde kullanma ile aynı etkiye sahiptir. Dizenin çevrileceği tek durum, dinamik dize değişmez dizeye eşit olduğunda bir işlevin t() öğesine geçmesidir. Ö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() çağrılmaya veya herhangi bir değer döndürmeye gerek yoktur. Modülün kodu ayrıştırılacağı zaman, t() 'e iletilen değişmez dizeleri arayan kodda t() çağrısı bulunur.

Bir veritabanı tablosu ve alanları için verilen açıklamayı çevirmek, yapmanız gereken bir şey değildir, çünkü Drupal çekirdek modüllerin hiçbiri bunu yapmaz; ö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;
}

t() çağrılarının herhangi bir Drupal hook_schema() ana uygulamasından kaldırılmasına neden olan rapor Kaldır t() tüm şema açıklamalarından , webchick (Drupal 7 yardımcı yardımcısı) tarafından açılmıştır.

Szeged'de şema açıklamaları etrafında t() hakkında büyük bir tartışma yaptık ve tablodaki herkesin (Dries'i içeren) t() s'nin bu açıklamalardan kaldırılması gerektiği konusunda fikir birliği vardı. . Bir şeyleri karıştırıyorlar çünkü t() bu kadar erken mevcut değil ve insanlar hiç kimsenin teknik açıklamaları çevirmek için zaman ayırmayacağını tartıştılar ve biz de Örneğin, kod yorumlarını çevirmeyin.

Drupal 6 modülünü Drupal 7) özel bir paragrafa dönüştürmeyle ilgili makalede: Şema açıklamaları artık çevrilmiyor .

17
kiamlaluno

Değişmez dizelerdir, bu yüzden bunları t() üzerinden geçirmek iyidir. Bunun gibi şeyler için t() sistemin bazı revizyonları vardır, ancak bunun D8'de olacağından emin değilim.

Şu anda, sadece t($count . ' books') gibi bir şey iletirseniz kötü olur $count, çeviri için çok fazla dize oluşturacağından herhangi bir değer alabilir.

2
jcisio