How-to: adapt 1.4m2 to a multilanguage environment

In this board you can talk about general questions about phpMyFAQ

Moderator: Thorsten

Post Reply
ronan
Posts: 8
Joined: Mon Dec 01, 2003 4:10 pm

How-to: adapt 1.4m2 to a multilanguage environment

Post by ronan »

Hi,

I relly needed to show the user only articles in his language. 1.4m2 is a good starting point for this behaviour, even though it requires a few changes.

This post is quite long, but there are really few changes needed:
  1. restrict allowed languages
    • Remove unneeded languages by deleting language files in the lang subdirectory
    • Delete unneeded languages entry in the $LANGINI array in inc/languages.php line 22
  2. Edit inc/functions.php and change several functions (most changes consist in adding $LANG as a global variable, and adding a condition to the SQL query: faqdata.lang='$LANG')
    • function generateNumberOfArticles
      function generateNumberOfArticles()
      {
      global $db, $LANG;
      $num = $db->num_rows($db->query("SELECT id FROM ".SQLPREFIX."faqdata WHERE active = 'yes' AND lang='$LANG'"));
      if ($num > 0) {
      return "<b>".$num."</b>";
      }
      else {
      return "<b>0</b>";
      }
      }
    • function printCategoriesPlusNumber
      function printCategoriesPlusNumber()
      {
      global $db, $sids, $msgEntries, $err_noHeaders, $LANG;

      $result = $db->query("SELECT ".SQLPREFIX."faqrubrik.rubrik, ".SQLPREFIX."faqrubrik.titel, count(".SQLPREFIX."faqdata.rubrik) AS number FROM ".SQLPREFIX."faqrubrik LEFT JOIN ".SQLPREFIX."faqdata ON ".SQLPREFIX."faqdata.rubrik = ".SQLPREFIX."faqrubrik.rubrik AND ".SQLPREFIX."faqdata.active = 'yes' AND ".SQLPREFIX."faqdata.lang='$LANG' GROUP BY ".SQLPREFIX."faqrubrik.rubrik ORDER BY ".SQLPREFIX."faqrubrik.rubrik");

      $output = "";
      if ($db->num_rows($result) > 0) {
      while ($row = $db->fetch_object($result)) {
      $layer = (strlen($row->rubrik) / 3) - 1;
      for ($h = 1; $h <= $layer; $h++):
      $output .= "\t&nbsp;&nbsp;";
      endfor;
      $output .= "\t<b>·</b> <a href=\"".$_SERVER["PHP_SELF"]."?".$sids."action=show&cat=".$row->rubrik."\">".$row->titel."</a> (".$row->number." ".$msgEntries.")<br />\n";
      }
      }
      else {
      $output .= "\t<b>".$err_noHeaders."</b><br />";
      }

      return $output;
      }
    • function printThemes
      function printThemes($category)
      {
      global $db, $sids, $msgEntries, $msgPage, $msgVoteFrom, $msgPages, $msgViews, $msgPrevious, $msgNext, $err_noArticles, $PMF_CONF, $LANG;
      $seite = 1;
      $output = "";

      if (isset($_REQUEST["seite"])) {
      $seite = $_REQUEST["seite"];
      }

      $numResult = $db->query("SELECT id FROM ".SQLPREFIX."faqdata WHERE active = 'yes' AND lang='$LANG' AND rubrik = '".$category."'");
      $num = $db->num_rows($numResult);
      $seiten = ceil($num / $PMF_CONF["numRecordsPage"]);

      if ($seite == 1) {
      $first = 0;
      }
      else {
      $first = ($seite * $PMF_CONF["numRecordsPage"]) - $PMF_CONF["numRecordsPage"];
      }

      $result = $db->query("SELECT ".SQLPREFIX."faqdata.id, ".SQLPREFIX."faqdata.lang, ".SQLPREFIX."faqdata.thema, ".SQLPREFIX."faqdata.rubrik, ".SQLPREFIX."faqvisits.visits
      FROM ".SQLPREFIX."faqdata LEFT JOIN ".SQLPREFIX."faqvisits ON ".SQLPREFIX."faqdata.id = ".SQLPREFIX."faqvisits.id AND ".SQLPREFIX."faqvisits.lang = ".SQLPREFIX."faqdata.lang
      WHERE ".SQLPREFIX."faqdata.active = 'yes'
      AND ".SQLPREFIX."faqdata.rubrik = '".$category."'
      AND ".SQLPREFIX."faqdata.lang='$LANG'
      ORDER BY ".SQLPREFIX."faqdata.id LIMIT ".$first.", ".$PMF_CONF["numRecordsPage"]);
      $num = $db->num_rows($result);

      if ($num > 0) {
      if ($seiten > 1) {
      $output .= "<p><b>".$msgPage.$seite." ".$msgVoteFrom." ".$seiten.$msgPages."</b></p>";
      }
      $output .= "<ul type=\"square\">\n";
      while ($row = $db->fetch_object($result)) {
      if (empty($row->visits)) {
      $visits = "0";
      }
      else {
      $visits = $row->visits;
      }
      $output .= "<li><a href=\"".$_SERVER["PHP_SELF"]."?".$sids."action=artikel&cat=".$row->rubrik."&id=".$row->id."&lang=".$row->lang."\">".stripslashes($row->thema)."</a> [".$row->lang."]<br><div class=\"little\">(".$visits." ".$msgViews.")</div></li>";
      }
      $output .= "</ul>\n";
      }
      else {
      $output = $err_noArticles;
      }

      if ($seiten > 1) {
      $output .= "<p align=\"center\"><b>";
      $previous = $seite - 1;
      $next = $seite + 1;
      if ($previous != 0) {
      $output .= "[ <a href=\"".$_SERVER["PHP_SELF"]."?".$sids."action=show&cat=".$category."&seite=".$previous."\">".$msgPrevious."</a> ]";
      }
      $output .= " ";
      if ($next <= $seiten) {
      $output .= "[ <a href=\"".$_SERVER["PHP_SELF"]."?".$sids."action=show&cat=".$category."&seite=".$next."\">".$msgNext."</a> ]";
      }
      $output .= "</b></p>";
      }
      return $output;
      }
    • function generateTopTen
      function generateTopTen()
      {
      global $db, $sids, $err_noTopTen, $msgViews, $LANG;

      $result = $db->query("SELECT DISTINCT ".SQLPREFIX."faqdata.id, ".SQLPREFIX."faqdata.lang, ".SQLPREFIX."faqdata.thema, ".SQLPREFIX."faqdata.rubrik, ".SQLPREFIX."faqvisits.visits
      FROM ".SQLPREFIX."faqvisits, ".SQLPREFIX."faqdata
      WHERE ".SQLPREFIX."faqdata.id = ".SQLPREFIX."faqvisits.id
      AND ".SQLPREFIX."faqdata.lang = ".SQLPREFIX."faqvisits.lang
      AND ".SQLPREFIX."faqdata.active = 'yes'
      AND ".SQLPREFIX."faqdata.lang = '$LANG' ORDER BY ".SQLPREFIX."faqvisits.visits DESC
      LIMIT 0,10");
      $output = "";
      if ($db->num_rows($result) > 0) {
      $i = 1;
      while ($row = $db->fetch_object($result)) {
      $output .= "<tr>\n\t<td class=\"topten\">\n";
      $output .= "\t<b>[".$i.".] ".$row->visits." ".$msgViews.":</b><br /><a href=\"".$_SERVER["PHP_SELF"]."?".$sids."action=artikel&cat=".$row->rubrik."&id=".$row->id."&lang=".$row->lang."\">".stripslashes(makeShorterText($row->thema, 8))."</a>\n";
      $output .= "\t</td>\n\t</tr>\n";
      $i++;
      }
      }
      else {
      $output = "<tr><td class=\"topten\">".$err_noTopTen."</td></tr>";
      }
      return $output;
      }
    • function generateFiveNewest
      function generateFiveNewest()
      {
      global $db, $sids, $err_noTopTen, $msgViews, $LANG;

      $result = $db->query("SELECT DISTINCT ".SQLPREFIX."faqdata.id, ".SQLPREFIX."faqdata.lang, ".SQLPREFIX."faqdata.rubrik, ".SQLPREFIX."faqdata.thema, ".SQLPREFIX."faqdata.datum, ".SQLPREFIX."faqvisits.visits
      FROM ".SQLPREFIX."faqdata, ".SQLPREFIX."faqvisits
      WHERE ".SQLPREFIX."faqdata.id = ".SQLPREFIX."faqvisits.id
      AND ".SQLPREFIX."faqdata.lang = ".SQLPREFIX."faqvisits.lang
      AND ".SQLPREFIX."faqdata.active = 'yes'
      AND ".SQLPREFIX."faqdata.lang = '$LANG' ORDER BY ".SQLPREFIX."faqdata.datum desc LIMIT 0,5");

      if ($num = $db->num_rows($result) > 0) {
      $output = "";
      while ($row = $db->fetch_object($result)) {
      $output .= "\t\t<tr>\n";
      $output .= "\t\t\t<td valign=\"top\" class=\"fivenewest\" nowrap>".makeDate($row->datum)."</td>\n";
      $output .= "\t\t\t<td valign=\"top\" class=\"fivenewest\"><a href=\"".$_SERVER["PHP_SELF"]."?".$sids."action=artikel&cat=".$row->rubrik."&id=".$row->id."&lang=".$row->lang."\">".stripslashes(makeShorterText($row->thema, 8))."</a></td>\n";
      $output .= "\t\t\t<td valign=\"top\" class=\"fivenewest\" nowrap>".$row->visits." ".$msgViews."</td>\n";
      $output .= "\t\t</tr>\n";
      }
      }
      else {
      $output = "<tr class=\"fivenewest\"><td>".$err_noTopTen."</td></tr>";
      }
      return $output;
      }
    • function searchEngine
      function searchEngine($begriff)
      {
      global $db, $sids, $msgEntries, $msgPage, $msgPages, $msgPrevious, $msgNext, $err_noArticles, $msgSearchAmount, $msgSearchAmounts, $msgVoteFrom, $msgSearchContent, $PMF_CONF, $LANG;

      $categories = getCategories();
      $seite = "";
      $output = "";

      if (isset($_REQUEST["seite"])) {
      $seite = $_REQUEST["seite"];
      }
      if (isset($_REQUEST["search"])) {
      $begriff = $_REQUEST["search"];
      }
      $begriff = trim($begriff);

      if (mysql_check("4.0.1") == FALSE) {
      // Search with MySQL 3.23.23+
      $query = "SELECT id, lang, rubrik, thema, content FROM ".SQLPREFIX."faqdata WHERE MATCH (thema,content,keywords) AGAINST ('".$begriff."') AND active = 'yes' AND lang='$LANG'";
      }
      else {
      // Search with MySQL 4.0.1+
      $query = "SELECT id, lang, rubrik, thema, content FROM ".SQLPREFIX."faqdata WHERE MATCH (thema,content,keywords) AGAINST ('".str_replace(" ", "* ", trim($begriff))."*' IN BOOLEAN MODE) AND active = 'yes' AND lang='$LANG'";
      }

      $result = $db->query($query);
      $num = $db->num_rows($result);

      $seiten = ceil($num / $PMF_CONF["numRecordsPage"]);
      if (!$seite) {
      $seite = 1;
      }
      $y = $seite * $PMF_CONF["numRecordsPage"];
      $x = $y - $PMF_CONF["numRecordsPage"];
      if ($y > $num) {
      $y = $num;
      }

      $result = $db->query($query." LIMIT ".$x.",".$PMF_CONF["numRecordsPage"]);

      if ($num > 0) {
      if ($num == "1") {
      $output .= "<p>".$num.$msgSearchAmount."</p>\n";
      }
      else {
      $output .= "<p>".$num.$msgSearchAmounts."</p>\n";
      }
      if ($seiten > 1) {
      $output .= "<p><b>".$msgPage.$seite." ".$msgVoteFrom." ".$seiten.$msgPages."</b></p>";
      }
      $output .= "<ul type=\"square\">\n";
      for ($i = $x; $i < $y ; $i++) {
      list($id, $lang, $rubrik, $thema, $content) = $db->fetch_row($result);
      $rubriktext = $categories[$rubrik];
      $thema = chopString($thema, 15);
      $content = chopString($content, 25);
      if ($PMF_CONF["ubbcode"]) {
      $bbcode = new BBCode();
      $content = $bbcode->parse($content);
      }
      else {
      $content = stripslashes($content);
      }
      $thema = preg_replace('/(((href|src)="[^"]*)?'.$begriff.'(?(1).*"))/umies', "highlight_no_links(\"\\1\")", $thema);
      $content = preg_replace('/(((href|src)="[^"]*)?'.$begriff.'(?(1).*"))/umies', "highlight_no_links(\"\\1\")", $content);
      $output .= "<li><b>".$rubriktext."</b>: <a href=\"".$_SERVER["PHP_SELF"]."?".$sids."action=artikel&cat=".$rubrik."&id=".$id."&lang=".$lang."&highlight=".$begriff."\">".stripslashes($thema)."...</a><br><div style=\"font-size: 10px;\"><b>".$msgSearchContent."</b> ".stripslashes($content)."...</div><br /></li>\n";
      }
      $output .= "</ul>\n";
      }
      else {
      $output = $err_noArticles;
      }

      if ($num > $PMF_CONF["numRecordsPage"]) {
      $output .= "<p align=\"center\"><b>";
      $vor = $seite - 1;
      $next = $seite + 1;
      if ($vor != 0) {
      $output .= "[ <a href=\"".$_SERVER["PHP_SELF"]."?".$sids."action=search&&search=".$begriff."&seite=".$vor."\">".$msgPrevious."</a> ]";
      }
      $output .= " ";
      if ($next <= $seiten) {
      $output .= "[ <a href=\"".$_SERVER["PHP_SELF"]."?".$sids."action=search&search=".$begriff."&seite=".$next."\">".$msgNext."</a> ]";
      }
      $output .= "</b></p>";
      }
      return $output;
      }
These changes seem to provide a basic FAQ per language. There might be a few issues:
  • categories exist one language (i.e. category names are not translated).
  • Open questions seem not to be related to one language
  • Comments seem not to be related to one language
  • I did not test the search feature yet
I might have oerviewed a lot of problems. If you have any comment on this let me know.

Ronan
Post Reply