Wie exportiere ich Einstellungen für übersetzte Variablen in Code?

7

In einem benutzerdefinierten Modul definiere ich mehrere Konfigurationsvariablen, indem ich die API des Variablenmoduls implementiere . Das Modul ist Teil eines mehrsprachigen Site-Projekts, daher sollten einige dieser Variablen übersetzbar sein.

In meiner hook_variable_info()Implementierung sind diese Variablen wie bei definiert, 'localize' => TRUEsodass sie in der Schnittstelle Mehrsprachige Einstellungen> Variablen verfügbar sind , die vom Modul für die Variablenübersetzung (Teil der Internationalisierung ) bereitgestellt wird . Ihr Standardzustand ist jedoch nicht zu übersetzen. Damit die Variable übersetzt werden kann, muss der Site-Administrator die Seite besuchen und die Variablen meines Moduls auswählen.

Ich muss meine benutzerdefinierten Variablen automatisch übersetzen, wenn das Modul installiert wird.

Das Modul verwendet bereits Features, um andere Konfigurationen zu exportieren. Eine auf Features basierende Lösung wäre also hilfreich. Es kann aber rein codebasiert sein.

Pierre Buyle
quelle
+1 Für interessante Fragen. Ich wusste vorher noch nicht einmal über dieses Modul Bescheid! Es ist neu in D7.
Amateur Barista

Antworten:

4

Update : Mit der neuesten Version des Variablenübersetzungsmoduls (dh 7.x-1.7) wird die Liste der übersetzten Variablen vom language Variablenbereichscontroller in seiner listVariablen gespeichert . Der folgende Code zeigt, wie Sie mit dem Realm-Controller übersetzte Variablen aus einer Modulimplementierung festlegen hook_enable().

function MODULE_enable() {
  // Get the language variable controller.
  $controller = variable_realm_controller('language');
  // The list of translatable variables.
  $translatable_variables = $controller->getEnabledVariables();
  // The list of variables that could be translated.
  $available_variables = $controller->getAvailableVariables();
  // Add our variables to $translatable_variables.
  foreach ($available_variables as $name) {
    // Translate user mail messages.
    if (preg_match('/^user_mail_[a-zA-Z_\[\]]*\[mail_part\]$/', $name)) {
      $translatable_variables[] = $name;
    }
  }
  $translatable_variables = array_merge($translatable_variables, array(
    'user_registration_help',
    'user_picture_guidelines',
    'maintenance_mode_message',
    'menu_main_links_source',
    'menu_secondary_links_source',
  ));
  // Save the updated list of translatable variables.
  $controller->setRealmVariable('list', array_unique($translatable_variables));
}

Update : Dies ist nicht der richtige Weg, es sei denn, Sie verwenden eine alte Version des Variablenübersetzungsmoduls (<7.x-1.7).

Die Namen der übersetzten Variablen werden in der i18n_variable_confVariablen gespeichert . Diese Variable selbst kann nicht mit Strongarm (oder einer ähnlichen Lösung) exportiert werden. Ich habe einen alten Trick angewendet: die Variable in einer hook_initImplementierung überprüfen und bei Bedarf festlegen. Das Array im foreach-Controller enthält die Namen der zu übersetzenden Variablen.

/**
 * Implements hook_init();
 */
function MODULE_init() {
  $i18n_variable_conf = variable_get('i18n_variable_conf', array());
  $i18n_variable_conf_updated = FALSE;
  foreach(array(...) as $name) {
    if (!in_array($name, $i18n_variable_conf)) {
      $i18n_variable_conf[] = $name;
      $i18n_variable_conf_updated = TRUE;
    }
  }
  if ($i18n_variable_conf_updated) {
    variable_set('i18n_variable_conf', $i18n_variable_conf);
    variable_set('i18n_variable_list', variable_children($i18n_variable_conf));
    cache_clear_all('*', I18N_VARIABLE_CACHE, TRUE);
  }
}

Im Vergleich zu einer funktionsbasierten Lösung werden dadurch die Einstellungen für die konfigurierten Variablen erzwungen und alle manuellen Bearbeitungen abgebrochen. Dies kann gewollt oder nicht gewollt sein. In meinem Fall war es.

Mein einziges Problem mit dieser Lösung ist, dass jede Anforderung einen gewissen Overhead hatte.

Pierre Buyle
quelle