Problem med min första modul

We encourage users to post events happening in the community to the community events group on https://www.drupal.org.
fpersson's picture

Jag har skapat en enkel modul, men har stött på ett problem (google har inte hjälp mig). Min output av min data i modulen omges av html-taggen <em>, vilket skapar problem när jag ska generera sökvägar (eller visa bilder). Jag har själv inget i min kod som generar taggen em (har sökt igenom koden) så det måste vara något underligt betende hos drupal.

<?php
function theme_beer_order_info($node) {
 
$output = '<div class="beer_order_info">';
   
$output .= t('<strong>Tillverkare:</strong><a href="%brandurl">%brand</a><br/>', array('%brand' => check_plain($node->brand), '%brandurl' => check_plain($node->brandurl) ) );
  
$output .= t('<strong>Sort: </strong> %sort <br/>', array('%sort' => check_plain($node->sort)));
  
$output .= t('<strong>Ursprungsland:</strong> %origin<br/>', array('%origin' => check_plain($node->origin)));
 
$output .= t('<strong>Vårt betyg:</strong> %rating<br/>', array('%rating' => check_plain($node->rating)));
$output .= t('<strong>Systembolagets kattalog: </strong><a href="%sysurl"/>%sysid</a><br/>', array('%sysurl' => check_plain($node->sysurl), '%sysid' => check_plain($node->sysid)));
$output .= t('Etikett: %label',array('%label' => check_plain($node->label)));
 
$output .= '</div>';
  return
$output;
}
?>

Hur löser jag detta, jag antar att det är jag som har missat något, men vad?

Vill nogon se hela min kod finns den att tillgå på min hemsida med dokumetation på min wiki

//Fredrik

Comments

Spana in dokumentationen

Tack

fpersson's picture

Tack nu funkar det, jag letade svaret på fel ställe hela tiden... typiskt nybörjarfel :(

Det skulle behövas fler och bättre "Kom i gång guider" om hur man skapar drupal moduler.

//Fredrik

Koden

TBarregren's picture

För övriga som inte orkar RTFM :-) kommer koden så som den nu bör se ut:

<?php
function theme_beer_order_info($node) {
 
$output = '<div class="beer_order_info">';
 
$output .= t('<strong>Tillverkare:</strong><a href="@brandurl">@brand</a><br/>', array('@brand' => $node->brand, '@brandurl' => $node->brandurl));
 
$output .= t('<strong>Sort: </strong> @sort <br/>', array('@sort' => $node->sort));
 
$output .= t('<strong>Ursprungsland:</strong> @origin<br/>', array('@origin' => $node->origin));
 
$output .= t('<strong>Vårt betyg:</strong> @rating<br/>', array('@rating' => $node->rating));
 
$output .= t('<strong>Systembolagets katalog: </strong><a href="@sysurl"/>@sysid</a><br/>', array('@sysurl' => $node->sysurl, '@sysid' => $node->sysid));
 
$output .= t('Etikett: @label',array('@label' => $node->label));
 
$output .= '</div>';
  return
$output;
}
?>

Alltså:

Använd @ istället för % och tag bort anropen till check_plain() som t() ombesörjer åt dig när du använder @ eller %.


Thomas BarregrenimBridge

Tänk bara på att man bör

enzipher's picture

Tänk bara på att man bör undvika html-kod i t()-funktionen om möjligt. Det är lite mer pyssel men resultatet blir mer översättningsvänligt.

Citat från dokumentationen:

HTML markup within translation strings is allowed, but should be avoided if possible.

Nu blir jag nyfiken?

fpersson's picture

Hur skulle då en $output-rad se ut?

//Fredrik

Om jag tar första raden som

enzipher's picture

Om jag tar första raden som exempel skulle det bli som följer:

<?php
$output
= '<strong>'.t('Tillverkare').':</strong><a href="@brandurl">'.t('@brand').'</a><br/>', array('@brand' => $node->brand, '@brandurl' => $node->brandurl));
?>

På så sätt kan man översätta ordet "Tillverkare" utan problem, och med lite tur så finns det redan översatt. :)

Engelska

zoo33's picture

Observera att text som skrivs i t()-funktioner i allmänhet förväntas vara på engelska. Det är kanske inte hugget i sten, men om du får för dig att dela din kod med en internationell publik så får du problem. Och i kombination med resten av Drupal som använder engelska som standard blir det hela förmodligen rätt struligt.

/ Hannes Lilljequist – SthlmConnection

Du måste dock sätta dina

tobiassjosten's picture

Du måste dock sätta dina placeholders direkt i första parametern till och ersättningar som följande parametrar till t()-funktionen. enzipher's kod kommer inte att fungera, även om den visar hur du bör använda concatenation för (X)HTML och inte lägga den direkt i t().

Jag vill tillägga att sprintf()-funktionen också kan komma till användning vid sådana här tillfällen. Jag använder den själv rätt flitigt för att öka läsbarheten och "redigerbarheten" i koden. Exempelvis:

<?php
$html  
= '<strong>%s</strong><a href="%s">%s</a><br />';
$output = sprintf($html, t('Tillverkare'), $node->brandurl, $node->brand);
?>

För länkar bör du dock kolla in funktionerna l() och url(). (Har jag helt enkelt en dålig vana med RTFM? :P)

Nu när jag kan skriva mer

fpersson's picture

Nu när jag kan skriva mer översättningsbar modul, kommer följd frågan hur man länkar till en modulspecifik översättnings fil. Jag tittade lite på translation.module, jag hade velat ha något i stil med "beer.po".

PS: Det är inget fel på RTFM, inte om man som du hänvisar till relevanta delar av manualen och inte bara manualen i sig. Man lär sig mycket av RTFM om man hittar det man vill :)

//Fredrik

Jag är inte säker på vad

zoo33's picture

Jag är inte säker på vad du menar med att länka till en modulspecifik översättningsfil. Men apropå att hänvisa till relevanta delar i manualen:

Translation of contributed modules

/ Hannes Lilljequist – SthlmConnection