มันดีเสมอไหมที่จะผ่านตัวแปรผ่าน t ()?


13

ฉันมีฟังก์ชั่นตัวช่วยเล็กน้อยสำหรับ hook_schema ของฉัน:

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),
  );
}

จากนั้นฉันก็สามารถใช้สิ่งที่ชอบ:

/**
 * 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)'),
      ...
    ),
  );
}

ฉันรู้ว่าแนวทางจะไม่ส่งผ่านตัวแปรt()แต่ดูเหมือนว่าจะคล้ายกับวิธีที่ระบบเมนูส่งผ่านชื่อการโทรกลับผ่านt()(โดยค่าเริ่มต้น) ความคิดเห็นเกี่ยวกับเรื่องนี้เป็นสไตล์ที่ดีหรือไม่ดี?

คำตอบ:


17

อาร์กิวเมนต์แรกของt()ความต้องการจะเป็นสตริงตัวอักษรซึ่งไม่รวม:

  • ตัวแปรแม้แต่พารามิเตอร์ของฟังก์ชัน: t($description)
  • การรวมกันของสตริง: t('If you want to add a link, click on' . '<a href="http://example.com">this link</a>.')
  • ค่าที่ส่งคืนจากฟังก์ชัน:t(get_menu_description())
  • คงที่: t(MYMODULE_MY_WIDGET_TITLE),t(MyClass::WIDGET_TITLE)

เหตุผลก็คือว่านอกเหนือกี่ตะขอที่เฉพาะเจาะจง (เช่นhook_menu(), hook_perm(), hook_permission()) สตริงในการแปลที่พบจากสคริปต์ที่สแกนรหัสของโมดูลที่กำลังมองหารหัสเช่นt('This is an example.'); เมื่อพบค่าที่ขึ้นอยู่กับรันไทม์เช่นค่าของตัวแปรสคริปต์จะไม่สามารถเข้าใจได้ว่าเป็นสตริงใดที่จำเป็นต้องแปลเนื่องจากตัวแปรอาจมีค่าแตกต่างกันในแต่ละครั้งที่โค้ดถูกเรียกใช้งาน อันที่จริงแล้วhttp://localize.drupal.orgรายงานคำเตือนที่คล้ายกับคำเตือนต่อไปนี้ในกรณีที่อาร์กิวเมนต์สำหรับt()ไม่ใช่ตัวอักษร:

พารามิเตอร์แรกที่t()ควรเป็นสตริงตัวอักษร ไม่ควรมีตัวแปรการต่อข้อมูลคงที่หรือสตริงอื่น ๆ ที่ไม่ใช่ตัวอักษร ที่t($filter['name'])ใน customfilter / customfilter.module ที่บรรทัด 30

หากคุณส่งค่าไดนามิกไปt()สคริปต์ที่แยกสตริงที่จะแปลจะไม่แยกค่าใด ๆ ในกรณีนั้น ผลคืออาร์กิวเมนต์ที่ส่งผ่านไปยังt()จะไม่ถูกแปลซึ่งมีผลเหมือนกันกับการไม่ใช้t()และการใช้เอาต์พุตแบบไดนามิกในส่วนติดต่อผู้ใช้โดยตรง t()เป็นเพียงกรณีที่สายจะถูกแปลเป็นเมื่อสตริงแบบไดนามิกจะเท่ากับสตริงตัวอักษรฟังก์ชั่นผ่านไป ตัวอย่างเช่นสมมติว่าคุณมีห้องสมุดที่ไม่คิด Drupal ซึ่งมีฟังก์ชันที่ส่งคืนชื่อของเดือนปัจจุบัน ด้วยรหัสต่อไปนี้ค่าที่ส่งคืนจากฟังก์ชันนั้นจะถูกแปล

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()ไม่จำเป็นต้องถูกเรียกหรือไม่ต้องคืนค่าใด ๆ เมื่อรหัสของโมดูลจะถูกแยก, การเรียกร้องให้จะพบได้จากรหัสที่รูปลักษณ์สำหรับสตริงตัวอักษรผ่านไปt()t()

การแปลคำอธิบายที่กำหนดไว้สำหรับตารางฐานข้อมูลและเขตข้อมูลนั้นไม่ใช่สิ่งที่คุณควรทำเนื่องจากไม่มีโมดูลหลักของ Drupal ทำเช่นนั้น ตัวอย่างเช่นnode_schema ()มีรหัสต่อไปนี้:

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()จากการใช้งานหลักของ Drupal hook_schema()คือRemove t () จากคำอธิบายสคีมาทั้งหมดซึ่งเปิดโดยwebchick (ผู้ดูแลร่วมของ Drupal 7)

ในเซเกดเรามีการพูดคุยกันอย่างยาวนานเกี่ยวกับt()คำอธิบายสคีมาและมันเป็นความเห็นพ้องของทุกคนที่โต๊ะ (ซึ่งรวมถึง Dries) ที่t()ควรลบออกจากคำอธิบายเหล่านี้ พวกเขาเลอะสิ่งต่าง ๆ เพราะt()ไม่พร้อมที่จะเริ่มต้นและผู้คนกล่าวว่าไม่มีใครจะใช้เวลาในการแปลคำอธิบายทางเทคนิคของสิ่งต่าง ๆ และมันก็ไม่สมเหตุสมผลเพราะเราไม่ได้แปลความคิดเห็นเกี่ยวกับโค้ดด้วย ตัวอย่าง.

บทความเกี่ยวกับการแปลง Drupal 6 โมดูล Drupal 7 มีวรรคทุ่มเท: รายละเอียด Schema มีการแปลไม่


2
ข้อมูลเพิ่มเติมเกี่ยวกับการใช้ t () ในการติดตั้ง / อัพเดท hooks: drupal.org/node/322731
AyeshK

2

t()พวกเขาเป็นสตริงคงที่ดังนั้นจึงเป็นเรื่องดีที่จะผ่านพวกเขาผ่าน มีการยกเครื่องระบบ t () บางอย่างสำหรับสิ่งนี้ แต่ฉันไม่แน่ใจว่ามันจะเกิดขึ้นใน D8

ปัจจุบันมันไม่ดีถ้าคุณผ่านบางสิ่งบางอย่างเช่นt($count . ' books')ที่$countสามารถรับค่าใด ๆ เพราะมันจะสร้างสตริงมากเกินไปสำหรับการแปล


-1

อย่างไรก็ตามมันเป็นไปได้ที่จะใช้ t () รอบ ๆ ตัวแปรและเพื่อให้มันทำงานได้ ฉันทำด้วยชื่อ $ ใน page.tpl.php

แก้ไข: บางทีสตริงไม่ได้รับการแปล แต่พวกเขาสามารถใช้สำหรับการแทนที่สตริง


1
ดูคำตอบของ kiamlaluno สำหรับสาเหตุที่เป็นความคิดที่ไม่ดี
Andy

คำตอบของ kiamlaluno ดูเหมือนว่าจะบอกว่าสตริงจะไม่ถูกแปล แต่การใช้งานอื่นสำหรับ t () คือการเปิดใช้งานการแทนที่สตริง ฉันสามารถยืนยันได้ว่าสามารถทำงานกับตัวแปรได้
naomi

1
@naomi ใช่มันจะทำงาน แต่ถ้าคุณเปิดใช้งานการแปลชื่อหนังสือทั้งหมดที่ส่งผ่าน thro t () จะสิ้นสุดในรายการสตริงการแปล คุณไม่ควรใช้การแทนที่สตริงเพื่อเปลี่ยนชื่อโหนด IMO สร้างฟิลด์และเปลี่ยนชื่อโหนดเป็นค่าของฟิลด์ใน hook_preprocess_node หรือหน้า (นอกจากนี้คุณยังสามารถใช้ hook_node_load หรือ hook ที่เกี่ยวข้องก็ได้)
AyeshK
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.