summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--includes/locale.inc38
-rw-r--r--modules/locale/locale.test62
2 files changed, 92 insertions, 8 deletions
diff --git a/includes/locale.inc b/includes/locale.inc
index 07d6d75bf..9b1e95b9a 100644
--- a/includes/locale.inc
+++ b/includes/locale.inc
@@ -2913,6 +2913,7 @@ function _locale_rebuild_js($langcode = NULL) {
}
// Construct the JavaScript file, if there are translations.
+ $data_hash = NULL;
$data = $status = '';
if (!empty($translations)) {
@@ -2931,22 +2932,38 @@ function _locale_rebuild_js($langcode = NULL) {
$dir = 'public://' . variable_get('locale_js_directory', 'languages');
// Delete old file, if we have no translations anymore, or a different file to be saved.
- if (!empty($language->javascript) && (!$data || $language->javascript != $data_hash)) {
+ $changed_hash = $language->javascript != $data_hash;
+ if (!empty($language->javascript) && (!$data || $changed_hash)) {
file_unmanaged_delete($dir . '/' . $language->language . '_' . $language->javascript . '.js');
$language->javascript = '';
$status = 'deleted';
}
- // Only create a new file if the content has changed.
- if ($data && $language->javascript != $data_hash) {
+ // Only create a new file if the content has changed or the original file got
+ // lost.
+ $dest = $dir . '/' . $language->language . '_' . $data_hash . '.js';
+ if ($data && ($changed_hash || !file_exists($dest))) {
// Ensure that the directory exists and is writable, if possible.
file_prepare_directory($dir, FILE_CREATE_DIRECTORY);
// Save the file.
- $dest = $dir . '/' . $language->language . '_' . $data_hash . '.js';
if (file_unmanaged_save_data($data, $dest)) {
$language->javascript = $data_hash;
- $status = ($status == 'deleted') ? 'updated' : 'created';
+ // If we deleted a previous version of the file and we replace it with a
+ // new one we have an update.
+ if ($status == 'deleted') {
+ $status = 'updated';
+ }
+ // If the file did not exist previously and the data has changed we have
+ // a fresh creation.
+ elseif ($changed_hash) {
+ $status = 'created';
+ }
+ // If the data hash is unchanged the translation was lost and has to be
+ // rebuilt.
+ else {
+ $status = 'rebuilt';
+ }
}
else {
$language->javascript = '';
@@ -2954,9 +2971,10 @@ function _locale_rebuild_js($langcode = NULL) {
}
}
- // Save the new JavaScript hash (or an empty value if the file
- // just got deleted). Act only if some operation was executed.
- if ($status) {
+ // Save the new JavaScript hash (or an empty value if the file just got
+ // deleted). Act only if some operation was executed that changed the hash
+ // code.
+ if ($status && $changed_hash) {
db_update('languages')
->fields(array(
'javascript' => $language->javascript,
@@ -2979,6 +2997,10 @@ function _locale_rebuild_js($langcode = NULL) {
case 'updated':
watchdog('locale', 'Updated JavaScript translation file for the language %language.', array('%language' => t($language->name)));
return TRUE;
+ case 'rebuilt':
+ watchdog('locale', 'JavaScript translation file %file.js was lost.', array('%file' => $language->javascript), WATCHDOG_WARNING);
+ // Proceed to the 'created' case as the JavaScript translation file has
+ // been created again.
case 'created':
watchdog('locale', 'Created JavaScript translation file for the language %language.', array('%language' => t($language->name)));
return TRUE;
diff --git a/modules/locale/locale.test b/modules/locale/locale.test
index b6306399f..d0647eb71 100644
--- a/modules/locale/locale.test
+++ b/modules/locale/locale.test
@@ -292,6 +292,68 @@ class LocaleTranslationFunctionalTest extends DrupalWebTestCase {
$this->assertNoText($name, t('Search now can not find the name.'));
}
+ /*
+ * Adds a language and checks that the JavaScript translation files are
+ * properly created and rebuilt on deletion.
+ */
+ function testJavaScriptTranslation() {
+ $user = $this->drupalCreateUser(array('translate interface', 'administer languages', 'access administration pages'));
+ $this->drupalLogin($user);
+
+ $langcode = 'xx';
+ // The English name for the language. This will be translated.
+ $name = $this->randomName(16);
+ // The native name for the language.
+ $native = $this->randomName(16);
+ // The domain prefix.
+ $prefix = $langcode;
+
+ // Add custom language.
+ $edit = array(
+ 'langcode' => $langcode,
+ 'name' => $name,
+ 'native' => $native,
+ 'prefix' => $prefix,
+ 'direction' => '0',
+ );
+ $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
+ drupal_static_reset('language_list');
+
+ // Build the JavaScript translation file.
+ $this->drupalGet('admin/config/regional/translate/translate');
+
+ // Retrieve the id of the first string available in the {locales_source}
+ // table and translate it.
+ $query = db_select('locales_source', 'l');
+ $query->addExpression('min(l.lid)', 'lid');
+ $result = $query->condition('l.location', '%.js%', 'LIKE')
+ ->condition('l.textgroup', 'default')
+ ->execute();
+ $url = 'admin/config/regional/translate/edit/' . $result->fetchObject()->lid;
+ $edit = array('translations['. $langcode .']' => $this->randomString());
+ $this->drupalPost($url, $edit, t('Save translations'));
+
+ // Trigger JavaScript translation parsing and building.
+ locale_inc_callback('_locale_rebuild_js', $langcode);
+
+ // Retrieve the JavaScript translation hash code for the custom language to
+ // check that the translation file has been properly built.
+ $file = db_select('languages', 'l')
+ ->fields('l', array('javascript'))
+ ->condition('language', $langcode)
+ ->execute()
+ ->fetchObject();
+ $js_file = 'public://' . variable_get('locale_js_directory', 'languages') . '/' . $langcode . '_' . $file->javascript . '.js';
+ $this->assertTrue($result = file_exists($js_file), t('JavaScript file created: %file', array('%file' => $result ? $js_file : t('not found'))));
+
+ // Test JavaScript translation rebuilding.
+ file_unmanaged_delete($js_file);
+ $this->assertTrue($result = !file_exists($js_file), t('JavaScript file deleted: %file', array('%file' => $result ? $js_file : t('found'))));
+ cache_clear_all();
+ locale_inc_callback('_locale_rebuild_js', $langcode);
+ $this->assertTrue($result = file_exists($js_file), t('JavaScript file rebuilt: %file', array('%file' => $result ? $js_file : t('not found'))));
+ }
+
/**
* Tests the validation of the translation input.
*/