টি () এর মাধ্যমে কোনও ভেরিয়েবল পাস করা কি সবসময় খারাপ?


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

একটি ডেটাবেস টেবিল এবং এর ক্ষেত্রগুলির জন্য প্রদত্ত বিবরণটি অনুবাদ করা তখন আপনার যা করা উচিত তা নয়, কারণ ড্রুপাল কোর মডিউলগুলির কোনও এটিই করে না; উদাহরণস্বরূপ, নোড_সেমিমা () এ নিম্নলিখিত কোড রয়েছে:

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()কোনও ড্রুপাল কোর বাস্তবায়নের কল কল সরিয়ে দেওয়ার কারণটি সমস্ত স্কিমা বিবরণ থেকে রিমুভ টি ()hook_schema() হ'ল , যা ওয়েবচিক (ড্রুপাল co সহ- রক্ষণকারী) দ্বারা খোলা হয়েছে ।

স্কেজেডে, আমরা t()স্কিমা বিবরণীর চারপাশে একটি দীর্ঘ দীর্ঘ আলোচনা করেছি এবং এটি টেবিলে প্রত্যেকের sensকমত্য ছিল (যিনি ড্রাইস অন্তর্ভুক্ত করেছিলেন) যেগুলি 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
কেন এটি খারাপ ধারণা জন্য কিমলালুনোর উত্তর দেখুন।
অ্যান্ডি

কিমলালুনোর উত্তর বলে মনে হচ্ছে যে স্ট্রিংটি অনুবাদ করা হবে না। তবে টি () এর জন্য আরেকটি ব্যবহার হ'ল স্ট্রিং ওভাররাইডগুলি সক্ষম করা। আমি নিশ্চিত করতে পারি যে এটি ভেরিয়েবলগুলির সাথে কাজ করে।
নাওমি

1
@ নওমি হ্যাঁ এটি কার্যকর হবে। তবে আপনি যদি অনুবাদগুলি সক্ষম করে থাকেন তবে থ্রো টি () দিয়ে পাস করা সমস্ত শিরোনাম অনুবাদ স্ট্রিংয়ের তালিকায় শেষ হবে। নোড শিরোনাম IMO পরিবর্তন করতে আপনার স্ট্রিং ওভাররাইড ব্যবহার করা উচিত নয়। একটি ক্ষেত্র তৈরি করুন এবং একটি হুক_প্রিপ্রসেস_নোড বা পৃষ্ঠায় ক্ষেত্রের মান নোড শিরোনাম পরিবর্তন করুন। (আপনি হুক_নোড_লোড বা কোনও সম্পর্কিত হুকও ব্যবহার করতে পারেন)
আইয়েশেকে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.