root > WikiSense-trunk > tools > LanguageList.php

LanguageList.php

application/x-php, 4108 bytes (load raw)
<?
define("WS_ADMIN",true);
require_once( "../common/WSInit.php" );

function addNames( $slot, $names, &$languages ) {
  foreach ($names as $lang => $name) {
      if (!isset($languages[$lang])) $languages[$lang] = array( 'lang' => $lang, 'native_name' => NULL, 'english_name' => NULL );

      $languages[$lang][$slot] = $name;
  }
}

function parseIANArecord( $lines, &$ofs ) {
  $rec = array();
  while ($ofs < count($lines)) {
    $s = $lines[$ofs];
    $ofs += 1;

    $s = trim($s);
    if ($s == "") continue;
    if ($s == "%%") break;

    if (preg_match('/^\s*(.*?)\s*:\s*(.*?)\s*$/', $s, $m)) {
        $key = $m[1];
        $val = $m[2];

        $rec[$key] = $val;
    }
  }

  return $rec;
}

function parseIANAlanguages( $lines ) {
  $languages = array();
  $ofs = 0;

  while ($ofs < count($lines)) {
      $rec = parseIANArecord($lines, $ofs);
      if (!$rec) continue;
      if (!isset($rec['Type'])) continue;
      if ($rec['Type'] != 'language' && $rec['Type'] != 'extlang') continue;

      $code = $rec['Subtag'];
      $name = $rec['Description'];

      $languages[$code] = $name;
  }

  return $languages;
}


function printLanguageInfo( $info ) {
  print $info['lang'];
  print "\t";
  print $info['english_name'];
  print "\t";
  print $info['native_name'];

  print "\n";
}

function updateLanguageInfo( &$db, $info ) {
  global $table;
 
  $info= wsfStripIntKeys($info);
 
  $values= '';
  foreach ($info as $k => $v) {
    if ($values) $values.= ', ';
    $values.= "$k = ";
   
    if (is_int($v) || is_float($v)) $values.= $v;
    else if (is_bool($v)) $values.= $v ? '1' : '0';
    else $values.= $db->addQuotes($v);
  }
 
  $sql = "INSERT INTO $table
          SET $values
          ON DUPLICATE KEY UPDATE
          native_name = if(native_name is NULL, values(native_name), native_name),
          english_name = if(english_name is NULL, values(english_name), english_name)
          ;
  "
;
 
  $res= $db->query($sql,'LanguageList::updateLanguageInfo');
 
  #if ($res) $db->freeResult($res);
 
  return $res;
}

#--------------------------------------------------------
$update= @$options['update'];
$csv= @$options['csv'];
$show= NULL;

$truncate= @$options['truncate'];

if (isset( $options['show'])) {
    $show= $options['show'];
}

$targetDB= $wsgWikiListDB;
$table= 'language';
$iana= false;
$ianaURL = 'http://www.iana.org/assignments/language-subtag-registry';

if (isset($options['db'])) $targetDB= $options['db'];
if (isset($options['table'])) $table= $options['table'];
if (isset($options['iana'])) $iana= true;

$u= $targetDB;
if (strpos($u,':')===false && strpos($u, '%')!==0) $u= "$wsgWikiDB/$targetDB";

if ($update) {
  $db= openConnection($u);

  if (!$db) {
    wsfLog("failed to connect to database!",LL_ERROR);
    die();
  }
}
else $db = NULL;

if (!isset($table)) $table = 'language';

if ($show) {
    $sql= "select * from $table where domain = ".$db->addQuotes($show);
   
    $res= $db->query($sql,'LanguageList: show entry');
   
    while ( $row= $db->fetchRow($res) ) {
        printLanguageInfo($row);
    }
   
    $db->freeResult($res);
}
else if (@$options['test']) {
    $wiki = getWikiInfoFromDomain($options['test']);

    $info= makeLanguageInfo($wiki);

    foreach ($info as $ns) {
        printLanguageInfo($ns);
    }
}
else if ($update || $csv) {
    if ($truncate && $db) {
        wsfLog("truncating $table", LL_INFO);
        $db->query("TRUNCATE $table");
    }

    $languages = array();
    $nativeNames = Language::getLanguageNames( true );
    addNames( 'native_name', $nativeNames, $languages );

    if ($iana) {
        $ianaLines = file($ianaURL);
        if (!$ianaLines) die("faield to fetch $ianaURL\n");

        $ianaNames = parseIANAlanguages($ianaLines);
        addNames( 'english_name', $ianaNames, $languages );
    }

    ksort( $languages );
   
    foreach ( $languages as $code => $rec ) {
        if ($csv) printLanguageInfo($rec);
        else {
            updateLanguageInfo($db, $rec);
            wsfLog("updated {$rec['lang']}: {$rec['english_name']} / {$rec['native_name']}",LL_INFO);
        }
    }
}
else {
    wsfLog("nothing to do. Use --show, --update, or --csv",LL_WARN);
}

if ($db) $db->close();

?>