5 * Internationalization (i18n) module
7 * @author Jose A. Reyero, 2004
9 * Multilingual Nodes support
12 // translation/node/id/lang
13 // translation/term/id
15 function i18n_translation_page() {
16 $op = $_POST['op'] ?
$_POST['op'] : arg(1);
17 $edit = $_POST['edit'];
21 print theme('page', i18n_translation_add(arg(2), arg(3)));
25 $edit = node_validate($edit);
26 print theme('page', node_preview($edit), t('Preview'));
30 drupal_set_title(t('Submit'));
31 print theme('page', node_submit($edit));
35 print theme('page', node_delete($edit), t('Delete'));
39 // print theme('page', node_page_default(), '');
43 function i18n_translation_add($nid, $lang) {
44 $type = i18n_get_node_type($nid);
45 return node_add($type);
49 * This is the callback for the tab 'translations' for nodes
51 function i18n_node_translation() {
53 $edit = $_POST['edit'];
61 $output = i18n_node_translation_status(arg(1));
64 print theme('page', $output);
67 function i18n_node_translation_status($nid) {
68 $languages = i18n_supported_languages();
69 $translations = i18n_node_get_translations($nid, true
);
71 $node = node_load(array('nid' => $nid));
72 $translations[$node->language
]= $node;
74 foreach ($languages as
$lang => $name) {
75 if (array_key_exists($lang, $translations)) {
76 $node = $translations[$lang];
77 $rows[] = array($name, l($node->title
, 'node/'.
$node->nid
), l(t('edit'), 'node/'.
$node->nid.
'/edit'));
78 if ($node->nid
== $nid) {
79 drupal_set_title(t('Translations of ').
$node->title
);
83 $rows[] = array($name, t('Not translated'), l(t('create translation'), 'translation/node/'.
$nid.
'/'.
$lang));
86 $header = array(t('Language'), t('Title'), t('Actions'));
87 $output .
= t('<h2>Translation Status</h2>') .
'<br />';
88 $output .
= theme('table', $header, $rows);
95 function i18n_nodeapi(&$node, $op, $arg = 0) {
97 if (variable_get("i18n_node_$node->type", 0)) {
100 return array('language');
107 if ( arg(0) == 'translation' ) {
108 i18n_node_create_translation($node->nid
, $node->language
, $node->i18n_snid
);
113 db_query('DELETE FROM {i18n_node} WHERE nid=%d', $node->nid
);
117 // Check language changed?
121 $languages = i18n_supported_languages();
123 $translations = i18n_node_get_translations($node->nid
);
125 elseif (arg(0) == 'translation') {
126 // We are translating a node
128 $node->language
= arg(3);
129 $form = form_hidden('i18n_snid', $node->i18n_snid ?
$node->i18n_snid
: $snid);
130 // Load the node to be translated
131 $trans = node_load(array('nid' => $snid));
132 foreach ($trans as
$field=>$value) {
133 if ($field != 'nid' && empty($node->$field)) {
134 $node->$field = $value;
137 $translations = i18n_node_get_translations($snid, true
);
139 if (!$translations) {
140 $translations[$trans->language
]= $trans;
145 foreach ($languages as
$lang => $langname) {
146 if ($trans = $translations[$lang]) {
147 $rows[] = array($langname, l($trans->title
, 'node/'.
$trans->nid.
'/edit'));
150 $langselect[$lang]= $langname;
155 $langselect = $languages;
158 $langselect = array_merge(array('' => ''), $langselect);
159 $form .
= form_select(t('Language'), 'language', $node->language ?
$node->language
: i18n_get_lang(), $langselect);
161 $header = array(t('Language'), t('Title'));
162 $form .
= form_group(t('translations'), theme('table', $header, $rows));
171 function i18n_node_available_langs($node) {
172 $languages = i18n_supported_languages();
174 $usedlangs = i18n_node_get_translations($node->nid
);
176 elseif ($node->i18n_snid
) {
177 $usedlangs = i18n_node_get_translations($node->i18n_snid
, true
);
183 foreach ($languages as
$lang=>$name) {
184 if (!array_key_exists($lang, $usedlangs)) {
185 $newlangs[$lang] = $name;
193 function i18n_node_get_lang($nid, $default = '') {
194 $lang = db_result(db_query('SELECT language FROM {node} WHERE nid=%d',$nid));
195 return $lang ?
$lang : $default ;
199 * getall = true to get the also node itself
202 function i18n_node_get_translations($nid, $getall = false
) {
203 $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';
205 $result = db_query($sql, $nid);
208 $result = db_query($sql .
' WHERE n.nid != %d', $nid, $nid);
211 while ($node = db_fetch_object($result)) {
212 $items[$node->language
] = $node;
219 function i18n_node_create_translation($nid, $lang, $snid) {
220 $trid = db_result(db_query('SELECT trid FROM {i18n_node} WHERE nid=%d', $snid));
222 $trid = db_next_id('{i18n_node}_trid');
223 db_query('INSERT INTO {i18n_node} (trid, nid) VALUES (%d, %d)', $trid, $snid);
225 db_query('INSERT INTO {i18n_node}(trid, nid) VALUES (%d, %d)', $trid, $nid);
228 function i18n_node_where_sql() {
229 return " AND ( n.language='" .
i18n_get_lang().
"' OR n.language='')";
232 function i18n_get_node_type($nid) {
233 return db_result(db_query('SELECT type FROM {node} WHERE nid=%d', $nid));