TRUE,
'use_remote' => TRUE,
);
$source = l10n_update_get_status(array($project), array($langcode));
$source = $source[$project][$langcode];
// Check the status of local translation files.
if (isset($source->files[L10N_UPDATE_LOCAL])) {
if ($file = l10n_update_source_check_file($source)) {
l10n_update_status_save($source->name, $source->langcode, L10N_UPDATE_LOCAL, $file);
}
$checked = TRUE;
}
// Check the status of remote translation files.
if ($options['use_remote'] && isset($source->files[L10N_UPDATE_REMOTE])) {
$remote_file = $source->files[L10N_UPDATE_REMOTE];
module_load_include('http.inc', 'l10n_update');
if ($result = l10n_update_http_check($remote_file->uri)) {
// Update the file object with the result data. In case of a redirect we
// store the resulting uri.
if (!empty($result->updated)) {
$remote_file->uri = isset($result->redirect_url) ? $result->redirect_url : $remote_file->uri;
$remote_file->timestamp = $result->updated;
l10n_update_status_save($source->name, $source->langcode, L10N_UPDATE_REMOTE, $remote_file);
}
// @todo What to do with when the file is not found (404)? To prevent
// re-checking within the TTL (1day, 1week) we can set a last_checked
// timestamp or cache the result.
$checked = TRUE;
}
else {
$failure = TRUE;
}
}
// Provide user feedback and record success or failure for reporting at the
// end of the batch.
if ($options['finish_feedback'] && $checked) {
$context['results']['files'][] = $source->name;
}
if ($failure && !$checked) {
$context['results']['failed_files'][] = $source->name;
}
$context['message'] = t('Checked translation for %project.', array('%project' => $source->project));
}
/**
* Batch finished callback: Set result message.
*
* @param bool $success
* TRUE if batch successfully completed.
* @param array $results
* Batch results.
*/
function l10n_update_batch_status_finished($success, array $results) {
if ($success) {
if (isset($results['failed_files'])) {
if (module_exists('dblog')) {
$message = format_plural(count($results['failed_files']), 'One translation file could not be checked. See the log for details.', '@count translation files could not be checked. See the log for details.', array('@url' => url('admin/reports/dblog')));
}
else {
$message = format_plural(count($results['failed_files']), 'One translation files could not be checked. See the log for details.', '@count translation files could not be checked. See the log for details.');
}
drupal_set_message($message, 'error');
}
if (isset($results['files'])) {
drupal_set_message(format_plural(
count($results['files']),
'Checked available interface translation updates for one project.',
'Checked available interface translation updates for @count projects.'
));
}
if (!isset($results['failed_files']) && !isset($results['files'])) {
drupal_set_message(t('Nothing to check.'));
}
variable_set('l10n_update_last_check', REQUEST_TIME);
}
else {
drupal_set_message(t('An error occurred trying to check available interface translation updates.'), 'error');
}
}
/**
* Batch operation: Download a remote translation file.
*
* Downloads a remote gettext file into the translations directory. When
* successfully the translation status is updated.
*
* @param string $project
* Name of the translatable project.
* @param string $langcode
* Language code.
* @param array $context
* The batch context.
*
* @see l10n_update_batch_fetch_import()
*/
function l10n_update_batch_fetch_download($project, $langcode, &$context) {
$sources = l10n_update_get_status(array($project), array($langcode));
if (isset($sources[$project][$langcode])) {
$source = $sources[$project][$langcode];
if (isset($source->type) && $source->type == L10N_UPDATE_REMOTE) {
if ($file = l10n_update_download_source($source->files[L10N_UPDATE_REMOTE], 'translations://')) {
$context['message'] = t('Downloaded translation for %project.', array('%project' => $source->project));
l10n_update_status_save($source->name, $source->langcode, L10N_UPDATE_LOCAL, $file);
}
else {
$context['results']['failed_files'][] = $source->files[L10N_UPDATE_REMOTE];
}
}
}
}
/**
* Batch process: Import translation file.
*
* Imports a gettext file from the translation directory. When successfully the
* translation status is updated.
*
* @param string $project
* Name of the translatable project.
* @param string $langcode
* Language code.
* @param array $options
* Array of import options.
* @param array $context
* The batch context.
*
* @see l10n_update_batch_import_files()
* @see l10n_update_batch_fetch_download()
*/
function l10n_update_batch_fetch_import($project, $langcode, array $options, &$context) {
$sources = l10n_update_get_status(array($project), array($langcode));
if (isset($sources[$project][$langcode])) {
$source = $sources[$project][$langcode];
if (isset($source->type)) {
if ($source->type == L10N_UPDATE_REMOTE || $source->type == L10N_UPDATE_LOCAL) {
$file = $source->files[L10N_UPDATE_LOCAL];
module_load_include('bulk.inc', 'l10n_update');
$options += array(
'message' => t('Importing translation for %project.', array('%project' => $source->project)),
);
// Import the translation file. For large files the batch operations is
// progressive and will be called repeatedly until finished.
l10n_update_batch_import($file, $options, $context);
// The import is finished.
if (isset($context['finished']) && $context['finished'] == 1) {
// The import is successful.
if (isset($context['results']['files'][$file->uri])) {
$context['message'] = t('Imported translation for %project.', array('%project' => $source->project));
// Save the data of imported source into the {l10n_update_file}
// table and update the current translation status.
l10n_update_status_save($project, $langcode, L10N_UPDATE_CURRENT, $source->files[L10N_UPDATE_LOCAL]);
}
}
}
}
}
}
/**
* Batch finished callback: Set result message.
*
* @param bool $success
* TRUE if batch successfully completed.
* @param array $results
* Batch results.
*/
function l10n_update_batch_fetch_finished($success, array $results) {
module_load_include('bulk.inc', 'l10n_update');
if ($success) {
variable_set('l10n_update_last_check', REQUEST_TIME);
}
l10n_update_batch_finished($success, $results);
}
/**
* Downloads a translation file from a remote server.
*
* @param object $source_file
* Source file object with at least:
* - "uri": uri to download the file from.
* - "project": Project name.
* - "langcode": Translation language.
* - "version": Project version.
* - "filename": File name.
* @param string $directory
* Directory where the downloaded file will be saved. Defaults to the
* temporary file path.
*
* @return object|bool
* File object if download was successful. FALSE on failure.
*/
function l10n_update_download_source($source_file, $directory = 'temporary://') {
if ($uri = system_retrieve_file($source_file->uri, $directory, FALSE, FILE_EXISTS_REPLACE)) {
$file = clone $source_file;
$file->type = L10N_UPDATE_LOCAL;
$file->uri = $uri;
$file->directory = $directory;
$file->timestamp = filemtime($uri);
return $file;
}
watchdog('l10n_update', 'Unable to download translation file @uri.', array('@uri' => $source_file->uri), WATCHDOG_ERROR);
return FALSE;
}