Pular para conteúdo

accept-language: Módulo Accept-Language do NGINX

Instalação

Você pode instalar este módulo em qualquer distribuição baseada em RHEL, incluindo, mas não se limitando a:

  • RedHat Enterprise Linux 7, 8, 9 e 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 e Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-accept-language
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-accept-language

Ative o módulo adicionando o seguinte no topo de /etc/nginx/nginx.conf:

load_module modules/ngx_http_accept_language_module.so;

Este documento descreve o nginx-module-accept-language v1.0.0 lançado em 30 de outubro de 2018.


Este módulo analisa o cabeçalho Accept-Language e fornece a localidade mais adequada para o usuário a partir de uma lista de localidades suportadas pelo seu site.

Sintaxe

set_from_accept_language $lang en ja pl;
  • $lang é a variável na qual armazenar a localidade
  • en ja pl são as localidades suportadas pelo seu site

Se nenhuma das localidades do Accept-Language estiver disponível no seu site, ele define a variável para a primeira localidade das localidades suportadas pelo seu site (neste caso, en).

Advertência

Atualmente, assume-se que o Accept-Language está ordenado por valores de qualidade (pelos meus testes, esse é o caso para safari, firefox, opera e ie) e descarta o q (veja http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html). Na situação em que estou usando o módulo, essa suposição funciona... mas comprador, cuidado :-)

Exemplo de configuração

Se você tiver subdomínios diferentes para cada idioma

server {
    listen 80;
    server_name your_domain.com;
    set_from_accept_language $lang en ja zh;
    rewrite ^/(.*) http://$lang.your_domain.com redirect;
}

Ou você poderia fazer algo assim, redirecionando pessoas que vêm para '/' para /en (ou /pt):

location / {
    set_from_accept_language $lang pt en;
     if ( $request_uri ~ ^/$ ) {
       rewrite ^/$ /$lang redirect;
       break;
     }
}

Por que eu criei isso?

Estou usando cache de página com merb em um site multilíngue e precisava de uma maneira de servir a página do idioma correto do cache. Em breve colocarei um exemplo em http://gom-jabbar.org

Agradecimentos

Obrigado a Evan Miller pelo seu guia sobre como escrever módulos nginx.

GitHub

Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório do GitHub para nginx-module-accept-language.