it-swarm.asia

هل من السيء دائمًا تمرير متغير عبر t ()؟

لديّ وظيفة مساعدة صغيرة للخطاف:

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() (افتراضيًا). أي تعليقات على هذا الأسلوب الجيد أو السيئ؟

13
Andy

يجب أن تكون الوسيطة الأولى لـ 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() هو إزالة t() من جميع أوصاف المخطط ، الذي تم فتحه بواسطة webchick (مساعد دروبال 7).

في Szeged ، أجرينا مناقشة طويلة كبيرة حول t() حول أوصاف المخطط وكان إجماع الجميع على الطاولة (من تضمن Dries) أنه يجب إزالة t() s من هذه الأوصاف. إنهم يفسدون الأمور لأن t() ليس متاحًا في وقت مبكر ، وناقش الناس أنه لن يستغرق أحد وقتًا لترجمة الأوصاف الفنية للأشياء ، ولن يكون ذلك منطقيًا حقًا لأننا لا نقوم بذلك أيضًا ر يترجم تعليقات الكود ، على سبيل المثال.

تحتوي المقالة حول تحويل وحدة Drupal 6 إلى Drupal 7 ، على فقرة مخصصة: لم تعد أوصاف المخطط مترجمة .

17
kiamlaluno

إنها سلاسل ثابتة ، لذا من الجيد تمريرها من خلال t(). هناك بعض إصلاح نظام t() لأشياء من هذا القبيل ، لكنني لست متأكدًا من أنه سيحدث في D8.

في الوقت الحالي ، سيئ فقط إذا مررت بشيء مثل t($count . ' books') حيث $count يمكن أن تأخذ أي قيمة ، لأنها ستولد سلسلة كثيرة جدًا للترجمة.

2
jcisio