Pesquisar apenas o idioma atualmente ativo

23

Como posso restringir os resultados de uma pesquisa padrão no Drupal 7, para trazer apenas os nós que estão no idioma atual?

Meu site tem um alternador de três idiomas; o usuário escolhe qual idioma ele deseja usar ao visualizar o site. Se ele pesquisar alguma coisa, a página de resultados trará resultados de outros idiomas. Hoje, tenho apenas 3 idiomas ativados, mas planejamos expandir isso para 6 ou mais.

Israel Rodriguez
fonte

Respostas:

2

Você pode usar o global $languagepara saber em qual idioma você está. No Views, você pode filtrar usando "conteúdo: idioma -> idioma atual do usuário".

Ahmed
fonte
3
como isso ajuda? você poderia substituir a página de pesquisa por um nó? Isso tem alguma desvantagem?
Jumper
25

Existe uma maneira realmente elegante de fazer isso usando o aparentemente não documentado 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 é 100% baseado no excelente módulo Search Config .

Idioma do usuário x conteúdo

Alguns sites podem ter a detecção de idioma configurada para mostrar a interface no idioma preferido do usuário, enquanto o conteúdo da página é mostrado com base no URL ou no idioma do conteúdo.

Nesse caso, considere substituir

$language = i18n_language_interface();

com

$language = i18n_language_content();
Alex Weber
fonte
Funciona perfeitamente, mas afetará qualquer consulta no site, como a consulta gerada a partir do módulo Views, ou qualquer consulta drupal baseada em vez da "pesquisa / nó /%" padrão?
mohamad salama 24/09
@mohamadsalama isso afetará todas as consultas de pesquisa que afetam o acesso ao nó; em outras palavras, a maioria das consultas de visualizações deve ser afetada, a menos que você desative especificamente as verificações de acesso ao nó nas configurações avançadas (fora do topo da minha cabeça e não confirmadas).
Alex Weber
Este não é um gancho não documentado - na verdade, é o gancho hook_query_TAG_alter (), onde a tag é 'node_access'. Meu próprio código também verifica se já não existe uma condição de idioma na consulta, mas, caso contrário, é bastante semelhante.
John Fiala 23/02
4

Eu tinha os mesmos requisitos e usei o módulo de pesquisa personalizada , que inclui um submódulo chamado Internacionalização de pesquisa personalizada : " pesquisar conteúdo de todo ou apenas o idioma atual e todo o tratamento de tradução de selos e selos " (observe que este módulo também fornece vários outros recursos como blocos de pesquisa personalizados). Funciona perfeitamente.

Kojo
fonte
0

Não sei se o núcleo de pesquisa o suporta.

Eu vejo o projeto i18nluceneapi, mas ele não suporta a versão 7 no momento.

Estou usando o searchapi e crie facetas Language :). Pode ser usado no seu caso, criar facetas e filtro padrão na página de pesquisa.

Sang Le Thanh
fonte
0

Você pode usar o módulo Display suite, no qual pode escolher a opção Modo de exibição-> Idioma, que fornece os resultados da pesquisa no idioma atual que está no idioma atual do site.

Akshay Sawant
fonte