_locale_rebuild_js($langcode = NULL)
(Re-)Creates the JavaScript translation file for a language.
$langcode: The language, the translation file should be (re)created for.
bool TRUE if translation file exists, FALSE otherwise.
function _locale_rebuild_js($langcode = NULL) { $config = \Drupal::config('locale.settings'); if (!isset($langcode)) { $language = \Drupal::languageManager()->getCurrentLanguage(); } else { // Get information about the locale. $languages = \Drupal::languageManager()->getLanguages(); $language = $languages[$langcode]; } // Construct the array for JavaScript translations. // Only add strings with a translation to the translations array. $conditions = array( 'type' => 'javascript', 'language' => $language->getId(), 'translated' => TRUE, ); $translations = array(); foreach (\Drupal::service('locale.storage')->getTranslations($conditions) as $data) { $translations[$data->context][$data->source] = $data->translation; } // Construct the JavaScript file, if there are translations. $data_hash = NULL; $data = $status = ''; if (!empty($translations)) { $data = array( 'strings' => $translations, ); $locale_plurals = \Drupal::service('locale.plural.formula')->getFormula($language->getId()); if ($locale_plurals) { $data['pluralFormula'] = $locale_plurals; } $data = 'window.drupalTranslations = ' . Json::encode($data) . ';'; $data_hash = Crypt::hashBase64($data); } // Construct the filepath where JS translation files are stored. // There is (on purpose) no front end to edit that variable. $dir = 'public://' . $config->get('javascript.directory'); // Delete old file, if we have no translations anymore, or a different file to // be saved. $locale_javascripts = \Drupal::state()->get('locale.translation.javascript') ? : array(); $changed_hash = !isset($locale_javascripts[$language->getId()]) || ($locale_javascripts[$language->getId()] != $data_hash); if (!empty($locale_javascripts[$language->getId()]) && (!$data || $changed_hash)) { file_unmanaged_delete($dir . '/' . $language->getId() . '_' . $locale_javascripts[$language->getId()] . '.js'); $locale_javascripts[$language->getId()] = ''; $status = 'deleted'; } // Only create a new file if the content has changed or the original file got // lost. $dest = $dir . '/' . $language->getId() . '_' . $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. if (file_unmanaged_save_data($data, $dest)) { $locale_javascripts[$language->getId()] = $data_hash; // 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 { $locale_javascripts[$language->getId()] = ''; $status = 'error'; } } // 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) { \Drupal::state()->set('locale.translation.javascript', $locale_javascripts); } // Log the operation and return success flag. $logger = \Drupal::logger('locale'); switch ($status) { case 'updated': $logger->notice('Updated JavaScript translation file for the language %language.', array('%language' => $language->getName())); return TRUE; case 'rebuilt': $logger->warning('JavaScript translation file %file.js was lost.', array('%file' => $locale_javascripts[$language->getId()])); // Proceed to the 'created' case as the JavaScript translation file has // been created again. case 'created': $logger->notice('Created JavaScript translation file for the language %language.', array('%language' => $language->getName())); return TRUE; case 'deleted': $logger->notice('Removed JavaScript translation file for the language %language because no translations currently exist for that language.', array('%language' => $language->getName())); return TRUE; case 'error': $logger->error('An error occurred during creation of the JavaScript translation file for the language %language.', array('%language' => $language->getName())); return FALSE; default: // No operation needed. return TRUE; } }
© 2001–2016 by the original authors
Licensed under the GNU General Public License, version 2 and later.
Drupal is a registered trademark of Dries Buytaert.
https://api.drupal.org/api/drupal/core!modules!locale!locale.module/function/_locale_rebuild_js/8.1.x