<?
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();
?>LanguageList.php
application/x-php, 4108 bytes (load raw)

