Hay una forma realmente elegante de hacer esto usando el aparentemente indocumentado hook_query_node_access_alter()
:
function yourmodule_query_node_access_alter(QueryAlterableInterface $query) {
$search = FALSE;
$node = FALSE;
// Even though we know the node alias is going to be "n", by checking for the
// search_index table we make sure we're on the search page. Omitting this step will
// break the default admin/content page.
foreach ($query->getTables() as $alias => $table) {
if ($table['table'] == 'search_index') {
$search = $alias;
}
elseif ($table['table'] == 'node') {
$node = $alias;
}
}
// Make sure we're on the search page.
if ($node && $search) {
$db_and = db_and();
// I guess you *could* use global $language here instead but this is safer.
$language = i18n_language_interface();
$lang = $language->language;
$db_and->condition($node . '.language', $lang, '=');
$query->condition($db_and);
}
}
Nota: este código se basa 100% en el excelente módulo de configuración de búsqueda .
Lenguaje de usuario vs contenido
Algunos sitios pueden tener la detección de idioma configurada para mostrar la interfaz en el idioma preferido del usuario, mientras que el contenido de la página se muestra en función de la URL o el idioma del contenido.
En ese caso, considere reemplazar
$language = i18n_language_interface();
con
$language = i18n_language_content();