Construir un sitio con Drupal en !inglés (non-English)

  • 17 Jun 2015
  • Drupal 7, PHP

Para construir un sitio non-english en Drupal hay que tener claro un concepto. Es imposible construir un sitio en Drupal en un idioma diverso al inglés, porque Drupal es en inglés.

En el sitio oficial de Drupal existe una guía para llevar a cabo esta meta. Siguiendo esta guía, a un punto determinado se instala el idioma del sitio (imaginemos que sea italiano) y se configura como predeterminado (default). Aquí puede surgir un problema. Ilustrémoslo con un ejemplo práctico.

  • Defaul language: italiano
  • Instalar módulo countries
  • Translate interface: Refresh strings
  • Las cadenas originales del context countries son en italiano, pero están en inglés

Otra desventaja:

  • Crear tipo de contenido en italiano (labels, descriptions, etc)
  • Crear módulo feature
  • Instalar el módulo feature en otro sitio no-italiano
  • Modificar todas las etiquetas de los campos, descripciones, etc

Entonces, una forma alternativa para trabajar con sitios non-english, podría ser la siguiente:

  • Default language: Siempre inglés (porque Drupal es en inglés)
  • Language detection and selection
    • Si el usuario es anónimo, italiano.
    • Si el usuario está registrado: En su idioma predeterminado

Como establecer un idioma predeterminado para usuarios anónimos en Drupal?

Por defecto, el idioma predeterminado para usuarios anónimos es el configurado como default. Pero si decimos que Drupal es en inglés, nuestro idioma default no debería ser otro que inglés. Entonces la pregunta debería ser: Como establecer para usuarios anónimos un idioma que no sea el predeterminado?

Con algunas configuraciones dentro "detection and selection": admin/config/regional/language/configure y un poco de php es posible controlar el valor de la session que se ocupará de seleccionar el idioma del sitio.

Entonces, creamos un módulito que llamaremos anonymous_language que utilizando hook_language_negotiation_info_alter establece el valor de $_SESSION['language']. Todo configurable a través de un formulario mínimo. El código es más simple que explicarlo:

/**
* Implements hook_language_negotiation_info_alter().
*/
function anonymous_language_language_negotiation_info_alter(&$providers) {

  $providers[LOCALE_LANGUAGE_NEGOTIATION_SESSION]['callbacks']['language'] = 'anonymous_language_language_negotiation_session';
  $providers[LOCALE_LANGUAGE_NEGOTIATION_SESSION]['file'] = drupal_get_path('module', 'anonymous_language') . '/anonymous_language.module';
}

/**
* Set language to "english" only for admin user.. all others are italian people
*/
function anonymous_language_language_negotiation_session($languages) {
  // Use the core URL language provider to get a valid language code.
  global $user;
  
  $language_default = language_default();
  $param = variable_get('locale_language_negotiation_session_param', 'language');
  
  $language_default = language_default();

  if ($user->uid === 0) {
    $lang = variable_get('anonymous_language_language', $language_default->language);
  } else {
    $lang = $language_default->language;
  }

  $_SESSION[$param] = $lang;
  return $lang;
  
}

/**
 * Implements hook_menu().
 */
function anonymous_language_menu() {

  $items = array();

  $items['admin/config/regional/language/anonymous_language'] = array(
    'title' => 'Anonymous Language',
    'description' => 'Select which parts of the site should use the selected administration language.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('anonymous_language_settings'),
    'access arguments' => array('administer site configuration'),
    'weight' => 42,
    'type' => MENU_LOCAL_TASK,
  );

  return $items;

}


function anonymous_language_settings(){
  $form = array();
  
  $languages = language_list();
  foreach($languages as $key => $value) {
    $options[$key] = $value->name . " (" . $value->native . ")";
  }
  
  $language_default = language_default();
  $selected = variable_get('anonymous_language_language', $language_default->language);

  $form['anonymous_language_language'] = array(
      '#type' => 'select',
      '#title' => t('Anonymous language'),
      '#options' => $options,
      '#default_value' => $selected,
      '#description' => t('Set the default language for anonymous users'),
  );
  return system_settings_form($form);
}

Drupal - Detección y selección del idioma

Drupal - Configuración del módulo anonymous language