5 * Internationalization (i18n) module
7 * @author Jose A. Reyero, 2004
9 * Multilingual Taxonomy support
13 * This is the callback for taxonomy translations
16 * admin/taxonomy/i18n/term/xx
17 * admin/taxonomy/i18n/term/new/xx
20 function i18n_taxonomy_admin() {
21 $op = $_POST['op'] ?
$_POST['op'] : arg(3);
22 $edit = $_POST['edit'];
25 print theme('page', i18n_taxonomy_term_form(arg(4), $edit), t('Term Translations'));
29 drupal_set_title(t('Submit'));
30 i18n_taxonomy_term_save($edit);
31 print theme('page', i18n_taxonomy_overview(), t("Term Translations"));
35 //print theme('page', node_delete($edit), t('Delete'));
39 print theme('page', i18n_taxonomy_overview(), t("Term Translations"));
44 * Generate a tabular listing of translations for vocabularies.
47 function i18n_taxonomy_overview() {
48 $languages = i18n_supported_languages();
49 $header = array_merge($languages, array(''));
50 $vocabularies = taxonomy_get_vocabularies();
52 foreach ($vocabularies as
$vocabulary) {
56 $rows[] = array(array('data' => $vocabulary->name
, 'colspan' => count($languages), 'align' => 'center'),
57 l(t('new translation'), 'admin/taxonomy/i18n/term/new/'.
$vocabulary->vid
));
58 // Get terms/translations for this vocab
59 $result = db_query('SELECT t.*,i.trid FROM {term_data} t LEFT JOIN {i18n_taxonomy_term} i USING(tid) WHERE t.vid=%d',$vocabulary->vid
);
61 while ($data = db_fetch_object($result)) {
66 foreach ($list as
$term) {
67 if ($term->language
) {
69 if (!array_key_exists($term->trid
, $data)) {
70 $data[$term->trid
] = array();
72 $data[$term->trid
][$term->language
]= $term;
75 $untranslated[$term->language
][] = $term;
79 // Reorder data for rows and languages
80 foreach ($data as
$trid => $terms) {
82 foreach ($languages as
$lang => $name) {
83 if (array_key_exists($lang, $terms)) {
84 $thisrow[] = $terms[$lang]->name
;
90 $thisrow[] = l(t('edit translations'), 'admin/taxonomy/i18n/term/'.
$trid);
96 return theme('table', $header, $rows);
99 function i18n_taxonomy_term_save($edit) {
101 $languages = i18n_supported_languages();
102 $translations = array();
103 foreach ($languages as
$lang => $name) {
104 $tid = $edit[$lang]['tid'];
105 $old = $edit[$lang]['old'];
107 $translations[] = $tid;
110 $trid = $edit['trid'];
111 // Remove old translations
112 if (is_numeric($trid)){
113 db_query('DELETE FROM {i18n_taxonomy_term} WHERE trid=%d',$trid);
115 // Save new translations
116 if (!empty($translations)) {
119 // New translation group
120 $trid = db_next_id('{i18n_taxonomy_term}_trid');
122 foreach ($translations as
$tid ) {
123 //$value = $new ? $trid : 'null';
124 //db_query('UPDATE {i18n_taxonomy_term} SET trid=%d WHERE tid=%d', $value, $tid);
125 db_query('INSERT INTO {i18n_taxonomy_term}(trid,tid) VALUES(%d,%d)',$trid,$tid);
128 drupal_set_message(t('Term translations have been updated'));
132 function i18n_taxonomy_term_form($trid) {
133 $languages = i18n_supported_languages();
134 if ($trid == 'new') {
135 $translations = array();
139 $translations =i18n_taxonomy_get_translations($trid);
140 $vid = $translations[key($translations)]->vid
;
142 $vocabulary = taxonomy_get_vocabulary($vid);
144 // List of terms for languages
145 foreach ($languages as
$lang => $langname) {
146 if ($trans = $translations[$lang]) {
147 $field1 = l($trans->name
, 'admin/taxonomy/edit/term/'.
$trans->tid
);
148 $tidtrans = $trans->tid
;
154 // Available terms for this language
155 $list = i18n_array2list(i18n_vocabulary_get_terms($vid, $lang, 'all'), 'tid', 'name');
157 $field2 = form_select('',
161 $field2 .
= form_hidden("$lang][old", $tidtrans);
162 $rows[] = array($langname, $field1, $field2);
164 $header = array(t('Language'), t('current translation'), t('change translation'));
165 // Prepares html form
166 $output = form_item(t("Vocabulary"), $vocabulary->name
);
167 $output .
= form_hidden('trid', $trid);
168 $output .
= theme('table', $header, $rows);
169 $output .
= form_submit(t('Submit'));
170 return form($output);
174 * Adds language and translation fields to term edition form
176 * This is a hook for taxonomy module
179 function i18n_taxonomy_form_term($edit = array()) {
181 $termlang= $edit['language'];
182 $vid = isset($edit['vid']) ?
$edit['vid'] : arg(4);
183 // $trid= $edit['trid'];
185 $languages = i18n_supported_languages();
186 $selectlang = array_merge(array('' => ''), $languages);
188 $vocabulary = taxonomy_get_vocabulary($vid);
189 // If vocabulary has language, this should be the one for the term
190 if ($vocabulary->language
) {
191 $edit['language'] = $vocabulary->language
;
192 $output = form_item(t('Language'),$languages[$vocabulary->language
],t('The vocabulary already has a language.'));
194 elseif ($termlang && $translations=i18n_term_get_translations($tid)) {
195 // Term has translations. Not all languages are valid
196 $selectlang = array('' => '');
197 foreach ($languages as
$lang => $langname) {
198 if ($trans = $translations[$lang]) {
199 $rows[] = array($langname, l($trans->name
, 'admin/taxonomy/edit/term/'.
$trans->tid
));
202 $selectlang[$lang] = $langname;
205 $output = form_select(t('Language'), 'language', $termlang, $selectlang);
207 $header = array(t('Language'), t('translated term'));
208 $output .
= form_group(t('term translations'), theme('table', $header, $rows));
211 $output = form_select(t('Language'), 'language', $termlang, $selectlang);
216 function i18n_taxonomy_form_vocabulary($edit = array()) {
218 $lang= $edit['language'];
219 $trid= $edit['trid'];
221 $languages = i18n_supported_languages();
222 $selectlang = array_merge(array('' => ''), $languages);
223 $output = form_select(t('Language'), 'language', $lang, $selectlang, t('This language will be set for all terms in this vocabulary'));
227 /* Returns an url for the translated taxonomy-page, if exists */
228 function i18n_taxonomy_l($str_tids, $lang) {
229 if (preg_match('/^([0-9]+[+ ])+[0-9]+$/', $str_tids)) {
231 // The '+' character in a query string may be parsed as ' '.
232 $tids = preg_split('/[+ ]/', $str_tids);
234 else if (preg_match('/^([0-9]+,)*[0-9]+$/', $str_tids)) {
236 $tids = explode(',', $str_tids);
242 $translated_tids = array();
243 foreach ($tids as
$tid) {
244 if ($translated_tid = i18n_term_get_translations($tid)) {
245 $translated_tids[] = $translated_tid[$lang]->tid
;
249 return implode($separator, $translated_tids);
252 function i18n_taxonomy_where_sql($table, $type, $param = '') {
253 //debug("$table $type $param");
255 case
'node': // Param is nid
256 $lang = i18n_node_get_lang($param, i18n_get_lang());
257 return "AND $table.language in ('$lang', '')";
258 case
'guess': // This is a difficult one :-). Guess from path
259 return i18n_taxonomy_where_sql_guess($table);
261 return "AND $table.language in ('".
i18n_get_lang() .
"','')";
265 function i18n_taxonomy_where_sql_guess($table) {
268 if (is_numeric($nid = arg(1))) {
269 $lang = i18n_node_get_lang($nid, i18n_get_lang());
272 $lang = i18n_get_lang();
280 return "AND $table.language in ('$lang','')";
287 * Converts a list of arrays to an array of the form keyfield => namefield
290 function i18n_array2list($data, $keyfield, $namefield = 'name') {
291 foreach ($data as
$key => $value) {
292 if (is_array($data)) {
293 $list[$value[$keyfield]] = $value[$namefield];
296 $list[$value->$keyfield] = $value->$namefield;
302 // returns array lang > term
303 function i18n_term_get_translations($tid, $getall = false
) {
304 $sql = 'SELECT t.* FROM {term_data} t INNER JOIN {i18n_taxonomy_term} i USING(tid) INNER JOIN {i18n_taxonomy_term} i2 ON i.trid = i2.trid WHERE i2.tid=%d';
306 $result = db_query($sql, $tid);
309 $result = db_query($sql.
' AND t.tid != %d',$tid, $tid);
311 while ($data = db_fetch_object($result)) {
312 $list[$data->language
] = $data;
317 function i18n_taxonomy_get_translations($trid) {
318 $result = db_query('SELECT t.*,i.trid FROM {term_data} t JOIN {i18n_taxonomy_term} i USING(tid) WHERE i.trid=%d',$trid);
320 while ($data = db_fetch_object($result)) {
321 $list[$data->language
] = $data;
326 function i18n_db_get_arrays($sql) {
327 $result = db_query($sql);
329 while ($data = db_fetch_array($result)) {
335 function i18n_db_get_objects($sql) {
336 $result = db_query($sql);
338 while ($data = db_fetch_object($result)) {
343 // returns array lang > term
344 function i18n_vocabulary_get_terms($vid, $lang, $status = 'all') {
345 if ($status=='translated') {
346 $andsql = ' AND i.trid > 0';
347 }elseif ( $status =='untranslated' ) {
348 $andsql = ' AND (i.trid = 0 or i.trid is null)';
351 $result = db_query("SELECT t.*, i.trid FROM {term_data} t LEFT JOIN {i18n_taxonomy_term} i USING(tid) WHERE t.vid=%d AND t.language='%s' " .
$andsql, $vid, $lang);
353 while ($term = db_fetch_array($result)) {
360 * $object parameter is an array, not an object !!
362 // $op = insert, update, delete
363 function i18n_taxonomy($op, $type, $edit) {
364 switch ("$type/$op") {
367 if (!$edit['language']) {
368 // Removed language, remove trid
369 db_query('DELETE FROM {i18n_taxonomy_term} WHERE tid=%d', $edit['tid']);
370 drupal_set_message(t('Removed translation info from term'));
373 case
'term/form pre':
374 return i18n_taxonomy_form_term($edit);
377 db_query('DELETE FROM {i18n_taxonomy_term} WHERE tid=%d', $edit['tid']);
379 case
'vocabulary/form pre':
380 return i18n_taxonomy_form_vocabulary($edit);
382 case
'vocabulary/update':
383 if (isset($edit['language'])) {
384 db_query("UPDATE {term_data} SET language='%s' WHERE vid='%d'",$edit['language'],$edit['vid']);