language) || $langcode != $language->language) { pathauto_create_alias( $entity_type, $op, $uri['path'], array($entity_type => $entity), $bundle, $language->language ); } } } /** * Returns the configured default value for a bundle. */ function pathauto_i18n_get_bundle_default($entity_type, $bundle, $default = 1) { return variable_get('pathauto_i18n_default_' . $entity_type . '_' . $bundle, $default); } /** * Sets a default value for a bundle. */ function pathauto_i18n_set_bundle_default($entity_type, $bundle, $value) { variable_set('pathauto_i18n_default_' . $entity_type . '_' . $bundle, $value); } /** * Attach Pathauto i18n field configuration to form. * * @param array $form * Form to attach. * * @param object $entity * Entity object. * * @param string $entity_type * Entity type. * * @see pathauto_field_attach_form() */ function pathauto_i18n_configuration_form(&$form, $entity, $entity_type, $bundle) { $access = user_access('create url aliases') || user_access('administer url aliases'); if ($entity && $access) { $default = pathauto_i18n_get_bundle_default($entity_type, $bundle); $form['path']['pathauto_i18n_status'] = array( '#type' => 'checkbox', '#title' => t('Generate automatic URL alias for all languages'), '#description' => t('Allows you to generate aliases for all available languages.', array('@entity_type' => $entity_type)), '#default_value' => isset($entity->path['pathauto_i18n_status']) ? $entity->path['pathauto_i18n_status'] : $default, '#weight' => -0.99, ); $form['path']['pathauto_i18n_undefined_language_tip'] = array( '#type' => 'item', '#markup' => t('URL alias for "Language neutral" won\'t be created, because you use automatic alias.') . '', '#weight' => -0.98, '#states' => array( 'visible' => array( 'select[name="language"]' => array('value' => LANGUAGE_NONE), 'input[name="path[pathauto]"]' => array('checked' => TRUE), 'input[name="path[pathauto_i18n_status]"]' => array('checked' => TRUE), ), ), ); $form['path']['pathauto_i18n_undefined_language_custom_tip'] = array( '#type' => 'item', '#markup' => t('URL alias for "Language neutral" will be created, because you use custom alias.'), '#weight' => -0.98, '#states' => array( 'visible' => array( 'select[name="language"]' => array('value' => LANGUAGE_NONE), 'input[name="path[pathauto]"]' => array('checked' => FALSE), 'input[name="path[pathauto_i18n_status]"]' => array('checked' => TRUE), ), ), ); } } /** * Insert settings for entity. */ function pathauto_i18n_insert_settings($entity_id, $entity_type, $bundle, $path_status) { db_merge('pathauto_i18n') ->key(array('entity_id' => $entity_id, 'entity_type' => $entity_type)) ->fields( array( 'entity_id' => $entity_id, 'entity_type' => $entity_type, 'bundle' => $bundle, 'path_status' => $path_status, ) ) ->execute(); } /** * Load settings for entity. */ function pathauto_i18n_load_settings($ids, $entity_type) { return db_select('pathauto_i18n', 'p') ->fields('p', array( 'entity_id', 'path_status', )) ->condition('p.entity_id', $ids, 'IN') ->condition('p.entity_type', $entity_type) ->execute(); } /** * Load settings for entity. */ function pathauto_i18n_load_settings_single($id, $entity_type) { return db_select('pathauto_i18n', 'p') ->fields('p', array( 'entity_id', 'path_status', )) ->condition('p.entity_id', $id) ->condition('p.entity_type', $entity_type) ->execute() ->fetchAssoc(); } /** * Delete settings for certain entity. */ function pathauto_i18n_delete_settings($entity_id, $entity_type) { db_delete('pathauto_i18n') ->condition('entity_id', $entity_id) ->condition('entity_type', $entity_type) ->execute(); } /** * Implements hook_form_FORM_ID_alter(). * * Make pathauto_ignore_words global and add fields for languages. */ function pathauto_i18n_form_pathauto_settings_form_alter(&$form, &$form_state, $form_id) { module_load_include('inc', 'pathauto'); $languages = language_list(); $form['pathauto_ignore_words']['#title'] = t('Strings to Remove - @language', array('@language' => t('Global'))); foreach ($languages as $language) { $key = 'pathauto_ignore_words_' . $language->language . '_language'; $form[$key] = array( '#type' => 'textarea', '#title' => t('Strings to Remove - @language', array('@language' => $language->name)), '#default_value' => variable_get($key, ''), '#wysiwyg' => FALSE, ); } } /** * Clean up a string segment for certain language. */ function pathauto_i18n_cleanstring($language, $string) { $ignore_words = variable_get('pathauto_ignore_words_' . $language . '_language', ''); $ignore_words_regex = preg_replace(array('/^[,\s]+|[,\s]+$/', '/[,\s]+/'), array('', '\b|\b'), $ignore_words); if ($ignore_words_regex) { $ignore_words_regex = '\b' . $ignore_words_regex . '\b'; if (function_exists('mb_eregi_replace')) { $ignore_words_callback = 'mb_eregi_replace'; } else { $ignore_words_callback = 'preg_replace'; $ignore_words_regex = '/' . $ignore_words_regex . '/i'; } if (!empty($ignore_words_regex) && !empty($ignore_words_callback)) { $words_removed = $ignore_words_callback($ignore_words_regex, '', $string); if (drupal_strlen(trim($words_removed)) > 0) { $string = $words_removed; } } } return $string; } /** * Implements hook_tokens_alter(). */ function pathauto_i18n_tokens_alter(&$replacements, array $context) { // @todo need tests. if (!empty($context['options']['pathauto'])) { foreach ($context['tokens'] as $name => $original) { if (!empty($replacements[$original]) && !empty($context['options']['language']->language) && $context['options']['language']->language != LANGUAGE_NONE) { $replacements[$original] = pathauto_i18n_cleanstring($context['options']['language']->language, $replacements[$original]); } } } } /** * Init the property. */ function pathauto_i18n_init_property(&$entity, $type, $bundle) { $default = pathauto_i18n_get_bundle_default($type, $bundle); switch ($type) { case 'user': $entity->pathauto_i18n_status = isset($entity->pathauto_i18n_status) ? $entity->pathauto_i18n_status : $default; break; default: $entity->path['pathauto_i18n_status'] = isset($entity->path['pathauto_i18n_status']) ? $entity->path['pathauto_i18n_status'] : $default; break; } }