Newer
Older
Gábor Hojtsy
committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php
/**
* @file
* Internationalization (i18n) package - translatable strings reusable admin UI.
*
* @author Jose A. Reyero, 2007
*/
/**
* Generic translation interface for i18n_strings objects.
*/
function i18n_string_translate_page($form_meta, $langcode = NULL) {
$form_meta += array(
'#item_title_header' => t('Title'),
);
if (empty($langcode)) {
drupal_set_title($form_meta['#page_title']);
return i18n_string_translate_page_overview($form_meta);
}
else {
$languages = language_list();
drupal_set_title(t('Translate to @language', array('@language' => $languages[$langcode]->name)));
return drupal_get_form('i18n_string_translate_page_form', $form_meta, $langcode);
}
}
/**
* Provide a core translation module like overview page for this object.
*/
function i18n_string_translate_page_overview($form_meta) {
include_once DRUPAL_ROOT . '/includes/language.inc';
$header = array(t('Language'), $form_meta['#item_title_header'], t('Status'), t('Operations'));
$default_language = language_default();
$rows = array();
foreach (language_list() as $langcode => $language) {
if ($langcode == $default_language->language) {
$rows[] = array(
$language->name . ' ' . t('(source)'),
$form_meta['#item_title_default'],
t('original'),
l(t('edit'), $form_meta['#edit']),
);
}
else {
// Try to figure out if this item has any of its properties translated.
$translated = FALSE;
foreach($form_meta['#items'] as $item) {
$str = i18n_string($item['#string_key'], $item['#default_value'], array('langcode' => $langcode, 'sanitize' => FALSE));
if ($str != $item['#default_value']) {
$translated = TRUE;
break;
}
}
// Translate the item that was requested to be displayed as title.
$item_title = i18n_string($form_meta['#item_title_key'], $form_meta['#item_title_default'], array('langcode' => $langcode));
$rows[] = array(
$language->name,
$item_title,
$translated ? t('translated') : t('not translated'),
l(t('translate'), $form_meta['#translate'] . '/' . $langcode),
Gábor Hojtsy
committed
);
}
}
$build['i18n_string_translation_overview'] = array(
'#theme' => 'table',
'#header' => $header,
'#rows' => $rows,
);
return $build;
}
/**
* Form builder callback for in-place string translation.
*/
function i18n_string_translate_page_form($form, &$form_state, $form_meta, $langcode) {
$formats = filter_formats();
$form['langcode'] = array(
'#type' => 'value',
'#value' => $langcode,
);
$form['strings'] = array(
// Use a tree, so we can access the values easily.
'#tree' => TRUE,
);
foreach ($form_meta['#items'] as $item) {
$disabled = FALSE;
$description = '';
Gábor Hojtsy
committed
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
list($textgroup, $context) = i18n_string_context($item['#string_key']);
$source = db_select('i18n_string', 'i18ns')
->fields('i18ns')
->condition('textgroup', $textgroup)
->condition('context', implode(':', $context))
->execute()
->fetchObject();
if ($source) {
if ($source->format) {
$format = $formats[$source->format];
$disabled = !filter_access($format);
if ($disabled) {
$description = t('This string uses the %name text format. You are not allowed to translate or edit texts with this format.', array('%name' => $format->name));
}
else {
$description = '<h5>' . t('Text format: @name', array('@name' => $format->name)) . '</h5>' . theme('filter_tips', array('tips' => _filter_tips($source->format, FALSE)));
}
}
}
$default_value = i18n_string($item['#string_key'], $item['#default_value'], array('langcode' => $langcode, 'sanitize' => FALSE));
$form['strings'][implode(':', $item['#string_key'])] = array(
'#title' => $item['#title'],
'#type' => 'textarea',
'#default_value' => $default_value,
'#disabled' => $disabled,
'#description' => $description,
'#i18n_string_format' => !empty($source) ? $source->format : 0,
'#rows' => min(ceil(str_word_count($default_value) / 12), 10),
);
}
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Save translation'),
);
$form['#validate'] = array(
'i18n_string_translate_page_form_validate'
);
$form['#redirect'] = array(
$form_meta['#translate'],
);
Gábor Hojtsy
committed
return $form;
}
/**
* Validation submission callback for in-place string translation.
*/
function i18n_string_translate_page_form_validate($form, &$form_state) {
foreach($form_state['values']['strings'] as $key => $value) {
// We don't need to validate disabled form fields because those are already
// validated by the FormAPI.
if (empty($form['strings'][$key]['#i18n_string_format'])) {
i18n_string_validate_submission("strings][$key", $value);
}
}
}
/**
* Form submission callback for in-place string translation.
*/
function i18n_string_translate_page_form_submit($form, &$form_state) {
foreach($form_state['values']['strings'] as $key => $value) {
list($textgroup, $context) = i18n_string_context(explode(':', $key));
i18n_string_textgroup($textgroup)->update_translation($context, $form_state['values']['langcode'], $value);
}
drupal_set_message(t('Translations saved.'));
$form_state['redirect'] = $form['#redirect'];
Gábor Hojtsy
committed
}
/**
* String submission validation callback.
*/
function i18n_string_validate_submission($formkey, $value) {
// Validation based on locale_translate_edit_form_validate.
if (!locale_string_is_safe($value)) {
form_set_error($formkey, t('The submitted string contains disallowed HTML: %string', array('%string' => $value)));
watchdog('locale', 'Attempted submission of a translation string with disallowed HTML: %string', array('%string' => $value), WATCHDOG_WARNING);
}
}