$nid));
$translations[$node->language]= $node;
}
foreach ($languages as $lang => $name) {
if (array_key_exists($lang, $translations)) {
$node = $translations[$lang];
$rows[] = array($name, l($node->title, 'node/'.$node->nid), l(t('edit'), 'node/'.$node->nid.'/edit'));
if ($node->nid == $nid) {
drupal_set_title(t('Translations of ').$node->title);
}
}
else {
$rows[] = array($name, t('Not translated'), l(t('create translation'), 'translation/node/'.$nid.'/'.$lang));
}
}
$header = array(t('Language'), t('Title'), t('Actions'));
$output .= t('
Translation Status
') .'
';
$output .= theme('table', $header, $rows);
return $output;
}
/**
* Hook nodeapi
*/
function i18n_nodeapi(&$node, $op, $arg = 0) {
if (variable_get("i18n_node_$node->type", 0)) {
switch ($op) {
case 'fields':
return array('language');
break;
case 'validate':
break;
case 'insert':
if ( arg(0) == 'translation' ) {
i18n_node_create_translation($node->nid, $node->language, $node->i18n_snid);
}
break;
case 'delete':
db_query('DELETE FROM {i18n_node} WHERE nid=%d', $node->nid);
break;
case 'update':
// Check language changed?
break;
case 'form pre':
$languages = i18n_supported_languages();
if ($node->nid) {
$translations = i18n_node_get_translations($node->nid);
}
elseif (arg(0) == 'translation') {
// We are translating a node
$snid = arg(2);
$node->language = arg(3);
$form = form_hidden('i18n_snid', $node->i18n_snid ? $node->i18n_snid : $snid);
// Load the node to be translated
$trans = node_load(array('nid' => $snid));
foreach ($trans as $field=>$value) {
if ($field != 'nid' && empty($node->$field)) {
$node->$field = $value;
}
}
$translations = i18n_node_get_translations($snid, true);
if (!$translations) {
$translations[$trans->language]= $trans;
}
}
if ($translations) {
foreach ($languages as $lang => $langname) {
if ($trans = $translations[$lang]) {
$rows[] = array($langname, l($trans->title, 'node/'.$trans->nid.'/edit'));
}
else {
$langselect[$lang]= $langname;
}
}
}
else {
$langselect = $languages;
}
$langselect = array_merge(array('' => ''), $langselect);
$form .= form_select(t('Language'), 'language', $node->language ? $node->language : i18n_get_lang(), $langselect);
if ($rows) {
$header = array(t('Language'), t('Title'));
$form .= form_group(t('translations'), theme('table', $header, $rows));
}
return $form;
break;
}
}
}
function i18n_node_available_langs($node) {
$languages = i18n_supported_languages();
if ($node->nid) {
$usedlangs = i18n_node_get_translations($node->nid);
}
elseif ($node->i18n_snid) {
$usedlangs = i18n_node_get_translations($node->i18n_snid, true);
}
else {
return $languages;
}
foreach ($languages as $lang=>$name) {
if (!array_key_exists($lang, $usedlangs)) {
$newlangs[$lang] = $name;
}
}
return $newlangs;
}
function i18n_node_get_lang($nid, $default = '') {
$lang = db_result(db_query('SELECT language FROM {node} WHERE nid=%d',$nid));
return $lang ? $lang : $default ;
}
/**
* getall = true to get the also node itself
*/
function i18n_node_get_translations($nid, $getall = false) {
$sql = 'SELECT n.nid, n.language, n.title, a.trid FROM {node} n INNER JOIN {i18n_node} a ON n.nid = a.nid INNER JOIN {i18n_node} b ON a.trid = b.trid AND b.nid =%d';
if ($getall) {
$result = db_query($sql, $nid);
}
else {
$result = db_query($sql . ' WHERE n.nid != %d', $nid, $nid);
}
$items = array();
while ($node = db_fetch_object($result)) {
$items[$node->language] = $node;
}
//debug($items);
return $items;
}
// snid = source nid
function i18n_node_create_translation($nid, $lang, $snid) {
$trid = db_result(db_query('SELECT trid FROM {i18n_node} WHERE nid=%d', $snid));
if (!$trid) {
$trid = db_next_id('{i18n_node}_trid');
db_query('INSERT INTO {i18n_node} (trid, nid) VALUES (%d, %d)', $trid, $snid);
}
db_query('INSERT INTO {i18n_node}(trid, nid) VALUES (%d, %d)', $trid, $nid);
}
function i18n_node_where_sql() {
return " AND ( n.language='" . i18n_get_lang(). "' OR n.language='')";
}
function i18n_get_node_type($nid) {
return db_result(db_query('SELECT type FROM {node} WHERE nid=%d', $nid));
}
?>