<?php
const LOCALE_TRANSLATION_SOURCE_COMPARE_LT = -1;
const LOCALE_TRANSLATION_SOURCE_COMPARE_EQ = 0;
const LOCALE_TRANSLATION_SOURCE_COMPARE_GT = 1;
function locale_translation_get_projects($project_names = array()) {
$projects =& drupal_static(__FUNCTION__, array());
if (empty($projects)) {
$result = db_query('SELECT name, project_type, core, version, server_pattern, status FROM {locale_project}');
if ($result
->rowCount() == 0 && module_exists('update')) {
module_load_include('compare.inc', 'locale');
locale_translation_build_projects();
$result = db_query('SELECT name, project_type, core, version, server_pattern, status FROM {locale_project}');
}
foreach ($result as $project) {
$projects[$project->name] = $project;
}
}
if ($project_names) {
return array_intersect_key($projects, drupal_map_assoc($project_names));
}
return $projects;
}
function locale_translation_clear_cache_projects() {
drupal_static('locale_translation_get_projects', array());
}
function locale_translation_load_sources($projects = NULL, $langcodes = NULL) {
$sources = array();
$projects = $projects ? $projects : array_keys(locale_translation_get_projects());
$langcodes = $langcodes ? $langcodes : array_keys(locale_translatable_language_list());
$status = Drupal::state()
->get('locale.translation_status');
foreach ($projects as $project) {
foreach ($langcodes as $langcode) {
$sources[$project . ':' . $langcode] = isset($status[$project][$langcode]) ? $status[$project][$langcode] : NULL;
}
}
return $sources;
}
function locale_translation_build_sources($projects = array(), $langcodes = array()) {
$sources = array();
$projects = locale_translation_get_projects($projects);
$langcodes = $langcodes ? $langcodes : array_keys(locale_translatable_language_list());
foreach ($projects as $project) {
foreach ($langcodes as $langcode) {
$source = locale_translation_source_build($project, $langcode);
$sources[$source->name . ':' . $source->langcode] = $source;
}
}
return $sources;
}
function locale_translation_source_check_file(&$source) {
if (isset($source->files[LOCALE_TRANSLATION_LOCAL])) {
$directory = $source->files[LOCALE_TRANSLATION_LOCAL]->directory;
$filename = '/' . preg_quote($source->files[LOCALE_TRANSLATION_LOCAL]->filename) . '$/';
if ($scheme = file_uri_scheme($directory)) {
$directory = str_replace($scheme . '://', drupal_realpath($scheme . '://'), $directory);
}
if ($files = file_scan_directory($directory, $filename, array(
'key' => 'name',
'recurse' => FALSE,
))) {
$file = current($files);
$source->files[LOCALE_TRANSLATION_LOCAL]->uri = $file->uri;
$source->files[LOCALE_TRANSLATION_LOCAL]->timestamp = filemtime($file->uri);
return $file;
}
}
return FALSE;
}
function locale_translation_source_build($project, $langcode, $filename = NULL) {
$source = clone $project;
$source->project = $project->name;
$source->langcode = $langcode;
$filename = $filename ? $filename : config('locale.settings')
->get('translation.default_filename');
$files = array();
if (_locale_translation_file_is_remote($source->server_pattern)) {
$files[LOCALE_TRANSLATION_REMOTE] = (object) array(
'project' => $project->name,
'langcode' => $langcode,
'version' => $project->version,
'type' => LOCALE_TRANSLATION_REMOTE,
'filename' => locale_translation_build_server_pattern($source, basename($source->server_pattern)),
'uri' => locale_translation_build_server_pattern($source, $source->server_pattern),
);
if (config('locale.settings')
->get('translation.path')) {
$files[LOCALE_TRANSLATION_LOCAL] = (object) array(
'project' => $project->name,
'langcode' => $langcode,
'version' => $project->version,
'type' => LOCALE_TRANSLATION_LOCAL,
'filename' => locale_translation_build_server_pattern($source, $filename),
'directory' => 'translations://',
);
$files[LOCALE_TRANSLATION_LOCAL]->uri = $files[LOCALE_TRANSLATION_LOCAL]->directory . $files[LOCALE_TRANSLATION_LOCAL]->filename;
}
}
else {
$files[LOCALE_TRANSLATION_LOCAL] = (object) array(
'project' => $project->name,
'langcode' => $langcode,
'version' => $project->version,
'type' => LOCALE_TRANSLATION_LOCAL,
'filename' => locale_translation_build_server_pattern($source, basename($source->server_pattern)),
'directory' => locale_translation_build_server_pattern($source, drupal_dirname($source->server_pattern)),
);
$files[LOCALE_TRANSLATION_LOCAL]->uri = $files[LOCALE_TRANSLATION_LOCAL]->directory . '/' . $files[LOCALE_TRANSLATION_LOCAL]->filename;
}
$source->files = $files;
return $source;
}
function _locale_translation_file_is_remote($uri) {
$scheme = file_uri_scheme($uri);
if ($scheme) {
return !drupal_realpath($scheme . '://');
}
return FALSE;
}
function _locale_translation_source_compare($source1, $source2) {
if (isset($source1->timestamp) && isset($source2->timestamp)) {
if ($source1->timestamp == $source2->timestamp) {
return LOCALE_TRANSLATION_SOURCE_COMPARE_EQ;
}
else {
return $source1->timestamp > $source2->timestamp ? LOCALE_TRANSLATION_SOURCE_COMPARE_GT : LOCALE_TRANSLATION_SOURCE_COMPARE_LT;
}
}
elseif (isset($source1->timestamp) && !isset($source2->timestamp)) {
return LOCALE_TRANSLATION_SOURCE_COMPARE_GT;
}
elseif (!isset($source1->timestamp) && isset($source2->timestamp)) {
return LOCALE_TRANSLATION_SOURCE_COMPARE_LT;
}
else {
return LOCALE_TRANSLATION_SOURCE_COMPARE_EQ;
}
}
function _locale_translation_default_update_options() {
$config = config('locale.settings');
return array(
'customized' => LOCALE_NOT_CUSTOMIZED,
'overwrite_options' => array(
'not_customized' => $config
->get('translation.overwrite_not_customized'),
'customized' => $config
->get('translation.overwrite_customized'),
),
);
}