Index: l10n_client.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/l10n_client/l10n_client.module,v retrieving revision 1.17 diff -u -p -r1.17 l10n_client.module --- l10n_client.module 13 Oct 2008 20:47:54 -0000 1.17 +++ l10n_client.module 20 Oct 2008 22:31:48 -0000 @@ -87,7 +87,7 @@ function l10n_client_menu() { * Implementation of hook_perm(). */ function l10n_client_perm() { - return array('use on-page translation'); + return array('use on-page translation', 'submit translations to localization server'); } /** @@ -112,7 +112,7 @@ function l10n_client_init() { drupal_add_js(drupal_get_path('module', 'l10n_client') .'/jquery.cookie.js', 'module'); drupal_add_js(drupal_get_path('module', 'l10n_client') .'/l10n_client.js', 'module'); // Add server address if we have a server set up. Otherwise add empty string. - drupal_add_js(array('l10n_client_server' => variable_get('l10n_client_use_server', 0) ? variable_get('l10n_client_server', '') .'/translate/remote/1.0/'. $language->language : ''), 'setting'); + drupal_add_js(array('l10n_client_server' => variable_get('l10n_client_use_server', FALSE) ? variable_get('l10n_client_server', '') .'/translate/remote/1.0/'. $language->language : ''), 'setting'); // We use textareas to be able to edit long text, which need resizing. drupal_add_js('misc/textarea.js', 'module'); } @@ -392,7 +392,7 @@ function l10n_client_search_form() { * Menu callback. Saves a string translation coming as POST data. */ function l10n_client_save_string() { - global $language; + global $user, $language; if (user_access('use on-page translation')) { if (isset($_POST['source']) && isset($_POST['target'])) { @@ -401,6 +401,11 @@ function l10n_client_save_string() { _locale_import_one_string_db($report, $language->language, $_POST['source'], $_POST['target'], 'default', NULL, LOCALE_IMPORT_OVERWRITE); cache_clear_all('locale:', 'cache', TRUE); _locale_invalidate_js($language->language); + + // Submit to remote server if enabled. + if (variable_get('l10n_client_use_server', FALSE) && user_access('submit translations to localization server') && !empty($user->l10n_client_key)) { + l10n_client_submit_translation($language->language, $_POST['source'], $_POST['target'], $user->l10n_client_key, l10n_client_user_token($user)); + } } } } @@ -487,7 +492,7 @@ function l10n_client_settings_form() { $form['l10n_client_use_server'] = array( '#title' => t('Enable sharing translations with server'), '#type' => 'checkbox', - '#default_value' => variable_get('l10n_client_use_server', 0), + '#default_value' => variable_get('l10n_client_use_server', FALSE), ); $form['l10n_client_server'] = array( '#title' => t('Address of localization server to use'), @@ -505,13 +510,85 @@ function l10n_client_settings_form() { */ function l10n_client_settings_form_validate($form, &$form_state) { if ($form_state['values']['l10n_client_use_server']) { + // Try to invoke the remote string submission with a test request. - $response = drupal_http_request($form_state['values']['l10n_client_server'] .'/translate/remote/1.0/test'); - if (!preg_match('!^<\!-- v1\.0 Localization community!', $response->data)) { - form_set_error('l10n_client_server', t('Invalid localization server address specified, or the given server could not handle the v1.0 remote submission API. Make sure you specified the right server address.')); + $response = xmlrpc($form_state['values']['l10n_client_server'] .'/xmlrpc.php', 'l10n.server.test', '2.0'); + + if ($response && !empty($response['name']) && !empty($response['version'])) { + if (empty($response['supported']) || !$response['supported']) { + form_set_error('l10n_client_server', t('The given server could not handle the v2.0 remote submission API.')); + } + else { + drupal_set_message(t('Verified that the specified server can handle remote string submissions. Supported languages: %languages.', array('%languages' => $response['languages']))); + } } else { - drupal_set_message(t('Verified that the specified server can handle remote string submissions.')); + form_set_error('l10n_client_server', t('Invalid localization server address specified. Make sure you specified the right server address.')); + } + } +} + +/** + * Implementation of hook_user(). + * + * Set up API key for localization server. + */ +function l10n_client_user($type, $edit, &$account, $category = NULL) { + if ($type == 'form' && $category == 'account' && variable_get('l10n_client_use_server', FALSE) && user_access('submit translations to localization server', $account)) { + $form['l10n_client'] = array( + '#type' => 'fieldset', + '#title' => t('Localization client'), + '#weight' => 1, + ); + // Build link to retrieve user key. + $server_link = variable_get('l10n_client_server', '') .'?q=translate/remote/userkey/'. l10n_client_user_token($account); + $form['l10n_client']['l10n_client_key'] = array( + '#type' => 'textfield', + '#title' => t('Your Loalization Server API key'), + '#default_value' => !empty($account->l10n_client_key) ? $account->l10n_client_key : '', + '#description' => t('This is a unique key that will allow you to send translations to the remote server. To get your API key go to !server-link.', array('!server-link' => l($server_link, $server_link))), + ); + return $form; + } +} + +/** + * Get user based semi unique token. This will ensure user keys are unique for each client. + */ +function l10n_client_user_token($account = NULL) { + global $user; + $account = isset($account) ? $account : $user; + return md5('l10n_client'. $account->uid . drupal_get_private_key()); +} + +/** + * Submit translation to the server. + */ +function l10n_client_submit_translation($langcode, $source, $translation, $user_key, $user_token) { + $server_uid = current(split(':', $user_key)); + $signature = md5($user_key . $langcode . $source . $translation . $user_token); + + $response = xmlrpc( + variable_get('l10n_client_server', '') .'/xmlrpc.php', + 'l10n.submit.translation', + $langcode, + $source, + $translation, + (int)$server_uid, + $user_token, + $signature + ); + + if (!empty($response) && isset($response['status'])) { + if ($response['status']) { + watchdog('l10n_client', 'Translation sent and accepted by remote server.'); + } else { + watchdog('l10n_client', 'Translation rejected by remote server. Reason: %reason', array('%reason' => $response['reason']), WATCHDOG_WARNING); } + return $response['status']; + } + else { + watchdog('l10n_client', 'The connection with the remote server failed with the following error: %error_code: %error_message.', array('%error_code' => xmlrpc_errno(), '%error_message' => xmlrpc_error_msg()), WATCHDOG_ERROR); + return FALSE; } }