टी () के माध्यम से एक चर पास करना हमेशा बुरा होता है?


13

मेरे पास मेरे हुक_केमे के लिए थोड़ा सहायक कार्य है:

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'])लाइन 30 पर customfilter / customfilter.module में।

यदि आप एक डायनेमिक मान पास कर रहे हैं t(), तो स्क्रिप्ट जो अनुवाद करने के लिए स्ट्रिंग्स निकालती है, उस मामले में कोई मूल्य नहीं निकालेगी; प्रभाव वह तर्क है t()जिसका अनुवाद नहीं किया जा सकता है, जिसका t()सीधा प्रभाव यूजर इंटरफेस में डायनामिक आउटपुट का उपयोग न करने और उपयोग करने पर पड़ता है । एक ही केस जिसके लिए स्ट्रिंग का अनुवाद किया जाएगा, जब डायनामिक स्ट्रिंग एक शाब्दिक स्ट्रिंग के बराबर है जिसे एक फ़ंक्शन पास करता है t()। उदाहरण के लिए, मान लीजिए कि आपके पास ड्रुपल के लिए एक पुस्तकालय नहीं है, जिसमें एक फ़ंक्शन है जिसमें वर्तमान महीने का नाम वापस आ रहा है। निम्नलिखित कोड के साथ, उस फ़ंक्शन से लौटाए गए मूल्य का अनुवाद किया जाएगा।

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()

डेटाबेस तालिका और उसके क्षेत्रों के लिए दिए गए विवरण का अनुवाद करना कुछ ऐसा नहीं है जो आपको करना चाहिए, क्योंकि कोई भी ड्रुपल कोर मॉड्यूल ऐसा नहीं करता है; उदाहरण के लिए, 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()है सभी स्कीमा विवरण से निकालें टी () , जिसके द्वारा खुला कर दिया गया है webchick (Drupal 7 सह मेंटेनर)।

Szeged में, t()स्कीमा विवरणों के बारे में हमारे बीच एक बड़ी लंबी चर्चा हुई और यह मेज पर सभी की सहमति थी (जिन्होंने ड्रिसेस को शामिल किया) t()को इन विवरणों से हटा दिया जाना चाहिए। वे चीजों को गड़बड़ करते हैं क्योंकि t()यह जल्दी उपलब्ध नहीं है, और लोगों ने चर्चा की कि कोई भी सामान के तकनीकी विवरणों का अनुवाद करने के लिए समय नहीं ले रहा है, और यह वास्तव में कोई मतलब नहीं है क्योंकि हम कोड टिप्पणियों का अनुवाद नहीं करते हैं, क्योंकि उदाहरण।

Drupal 7 में Drupal 6 मॉड्यूल को परिवर्तित करने के बारे में लेख, एक समर्पित पैराग्राफ है: स्कीमा विवरण अब अनुवादित नहीं हैं


2
T () इनस्टॉल / अपडेट हुक में: drupal.org/node/322731
AyeshK

2

वे अमूर्त तार हैं, इसलिए उन्हें पास करना अच्छा है t()। इस तरह की चीजों के लिए टी () सिस्टम के कुछ ओवरहाल हैं, लेकिन मुझे यकीन नहीं है कि यह डी 8 में होगा।

वर्तमान में, यह केवल तभी बुरा है जब आप कुछ पास करते हैं जैसे t($count . ' books')कि $countकोई भी मूल्य ले सकता है, क्योंकि यह अनुवाद के लिए बहुत अधिक स्ट्रिंग उत्पन्न करेगा।


-1

हालांकि, यह एक चर के आसपास टी () का उपयोग करना संभव है, और इसके लिए काम करना है। मैंने इसे page.tpl.php में $ शीर्षक के साथ किया है।

संपादित करें: शायद स्ट्रिंग का अनुवाद नहीं किया जाता है, लेकिन उनका उपयोग स्ट्रिंग ओवरराइड के लिए किया जा सकता है।


1
क्यों यह एक बुरा विचार है के लिए kiamlaluno का जवाब देखें।
एंडी

kiamlaluno का उत्तर यह बताता है कि स्ट्रिंग का अनुवाद नहीं किया जाएगा। लेकिन t () के लिए एक और उपयोग स्ट्रिंग ओवरराइड को सक्षम करने के लिए है। मैं पुष्टि कर सकता हूं कि यह चर के साथ काम करता है।
नाओमी

1
@naomi हाँ यह काम करेगा। लेकिन अगर आपके पास अनुवाद सक्षम हैं, तो सभी शीर्षक थ्रो टी () पास हो जाएंगे और अनुवाद स्ट्रिंग सूची में समाप्त हो जाएंगे। आपको नोड शीर्षक IMO बदलने के लिए स्ट्रिंग ओवरराइड का उपयोग नहीं करना चाहिए। एक फ़ील्ड बनाएं, और नोड शीर्षक को एक हुक_प्रोप्रोसेस_नोड या पृष्ठ में फ़ील्ड के मान में बदलें। (आप हुक_नोड_लोड या किसी भी संबंधित हुक का भी उपयोग कर सकते हैं)
अयेश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.