Capítulo 20. Idioma

Sumário
20.1. Suporte a idioma
20.1.1. Visão geral
20.1.2. Comportamento
20.1.3. Problemas
20.2. Suporte a conjuntos de caracteres
20.2.1. Conjuntos de caracteres aceitos
20.2.2. Definição do conjunto de caracteres
20.2.3. Conversão automática do conjunto de caracteres entre cliente e servidor
20.2.4. Leitura adicional

Este capítulo descreve as funcionalidades de idioma (locale) disponíveis do ponto de vista do administrador. O suporte a idioma no PostgreSQL é realizado de duas maneiras:

20.1. Suporte a idioma

O suporte a idioma se refere a um aplicativo que respeita as preferências culturais com relação ao alfabeto, classificação, formatação de números, etc. O PostgreSQL utiliza as facilidades de idioma ISO C e POSIX padrão fornecidas pelo sistema operacional do servidor. Para obter informações adicionais deve ser consultada a documentação do sistema utilizado.

20.1.1. Visão geral

O suporte a idioma é inicializado, automaticamente, quando o agrupamento de bancos de dados é criado utilizando o utilitário initdb. Por padrão, o initdb inicializa o agrupamento de bancos de dados com a definição de idioma do ambiente onde executa; portanto, se o sistema operacional estiver definido para utilizar o mesmo idioma desejado para o agrupamento de bancos de dados, então não será necessário fazer mais nada. Se for desejado utilizar um idioma diferente (ou não houver certeza do idioma definido no sistema operacional), poderá ser informado ao initdb qual é o idioma desejado através da opção --locale. Por exemplo:

initdb --locale=pt_BR

Este exemplo define o idioma como Português (pt) conforme falado no Brasil (BR). Outras possibilidades são en_US (Inglês dos Estados Unidos) e fr_CA (Francês do Canadá). Se o idioma permitir utilizar mais de um conjunto de caracteres, então a especificação ficará parecida com esta: pt_BR.ISO8859-1. Quais idiomas estão disponíveis no sistema operacional, e quais são os seus nomes, depende do que é disponibilizado pelo distribuidor do sistema operacional, e do que foi instalado (Na maioria dos sistemas o comando locale -a mostra a relação de idiomas disponíveis).

Ocasionalmente é útil combinar regras de idiomas diferentes como, por exemplo, regras de intercalação do Inglês com mensagens em Português. Para que isto seja possível, existe um conjunto de subcategorias de idioma controlando somente certos aspectos das regras de idioma.

LC_COLLATE Ordem de classificação das cadeias de caracteres [a] [b] [c] [d] [e]
LC_CTYPE Classificação dos caracteres (O que é uma letra? Sua letra maiúscula equivalente?) [f]
LC_MESSAGES Idioma das mensagens
LC_MONETARY Formatação das quantias monetárias
LC_NUMERIC Formatação dos números
LC_TIME Formatação das datas e das horas
Notas:
a. collation; collating sequence — Um método para comparar duas cadeias de caracteres comparáveis. Todo conjunto de caracteres possui seu collation padrão. (Second Informal Review Draft) ISO/IEC 9075:1992, Database Language SQL- July 30, 1992. (N. do T.)
b. SQL Serverintercalação (collation) — é um conjunto de regras que determina como os dados são comparados, ordenados e apresentados. Os dados caractere são classificados de acordo com a informação de intercalação, que inclui o idioma, a ordem de classificação e a diferenciação de letras minúsculas e maiúsculas. SQL Server 2005 Books Online — Glossary of Terms (N. do T.)
c. collation é uma classificação apropriada para o idioma. Collation (N. do T.)
d. collation — [informática, computadores] — s. intercalação, f. collation | Portuguese | Dictionary & Translation by Babylon (N. do T.)
e. collation — O processo de ordenar unidades de informação textuais, geralmente específico de um determiando idioma. Glossary of Unicode Terms (N. do T.)
f. LC_CTYPE — Define a classificação do caractere, conversão maiúscula/minúscula, e outros atributos do caractere. LC_CTYPE Category for the Locale Definition Source File Format (N. do T.)
No utilitário initdb os nomes das categorias se traduzem em nomes de opção que mudam a escolha de idioma para uma determinada categoria. Por exemplo, para definir o idioma como sendo Francês do Canadá, mas utilizar as regras dos E.U.A para formatar valores monetários, deve ser utilizado initdb --locale=fr_CA --lc-monetary=en_US.

Se for desejado que o sistema se comporte como não tendo suporte a idioma, devem ser utilizados os idiomas especiais C ou POSIX.

Os valores de algumas categorias de idioma devem permanecer fixos por toda a existência do agrupamento de bancos de dados. Ou seja, uma vez executado o utilitário initdb não pode mais haver alteração dos valores definidos para estas categorias. Estas categorias são LC_COLLATE e LC_CTYPE, que afetam a ordem de classificação dos índices e, portanto, devem permanecer fixas ou os índices das colunas de texto vão ficar danificados. O PostgreSQL impõe esta restrição registrando os valores de LC_COLLATE e LC_CTYPE usados pelo initdb. O servidor adota estes dois valores, automaticamente, na inicialização.

Quando o servidor está em execução as demais categorias de idioma podem ser alteradas como se desejar, definindo as variáveis de configuração em tempo de execução que possuem o mesmo nome das categorias de idioma (consulte a Seção 16.4.8.2 para obter detalhes). Na verdade, os padrões escolhidos pelo utilitário initdb são escritos no arquivo de configuração postgresql.conf apenas para servirem como padrão quando o servidor é inicializado. Se forem removidas as atribuições presentes no arquivo postgresql.conf, o servidor herdará as definições do ambiente de execução.

Deve ser observado que o comportamento de idioma do servidor é determinado pelas variáveis de ambiente enxergadas pelo servidor, e não pelo ambiente de qualquer um dos clientes. Portanto, antes de inicializar o servidor deve-se tomar o cuidado de configurar as definições de idioma corretamente. Uma conseqüência deste fato é que, se o cliente e o servidor forem configurados com idiomas diferentes, as mensagens poderão ser mostradas em idiomas diferentes dependendo de onde forem originadas.

Nota: Quando se fala em herdar o idioma do ambiente de execução, isto significa o seguinte na maioria dos sistemas operacionais: Para uma determinada categoria de idioma, como a intercalação, as seguintes variáveis de ambiente são consultadas, nesta ordem, até ser encontrada uma com valor definido: LC_ALL, LC_COLLATE (a variável correspondente à respectiva categoria) e LANG. Se nenhuma destas variáveis de ambiente estiver definida, então o padrão é utilizar o idioma C.

Algumas bibliotecas de idioma de mensagem também examinam a variável de ambiente LANGUAGE, que prevalece sobre todas as outras definições de idioma para a finalidade de definir o idioma das mensagens. Em caso de dúvida, deve ser consultada a documentação do sistema operacional para obter informações adicionais, em particular a documentação sobre gettext.

Para ativar as mensagens traduzidas para o idioma preferido do usuário, deve ser ativado o NLS (suporte a idioma nacional) em tempo de construção. Esta escolha independe dos outros suportes a idioma.

20.1.2. Comportamento

O suporte a idioma exerce influência sobre as seguintes funcionalidades:

  • Ordem de classificação das consultas que utilizam a cláusula ORDER BY.

  • A capacidade de utilizar índices com a cláusula LIKE.

  • A família de funções to_char.

A desvantagem de utilizar idiomas diferentes de C e POSIX no PostgreSQL é o impacto no desempenho. Torna a manipulação de caracteres mais lenta, e impede a utilização de índices comuns na cláusula LIKE. Por estes motivos, a utilização de idioma deve ser feita somente quando for realmente necessária.

20.1.3. Problemas

Se, apesar do que foi explicado acima, o suporte a idioma não funcionar, deve ser verificado no sistema operacional se o suporte a idioma está configurado de forma correta. Pode ser utilizado o comando locale -a para verificar quais idiomas estão instalados no sistema operacional, caso este comando esteja disponível no sistema operacional utilizado. [1]

Deve ser verificado se o PostgreSQL está realmente utilizando o idioma que se pensa que esteja utilizando. As definições de LC_COLLATE e LC_CTYPE são determinadas quando o utilitário initdb é executado, não podendo ser mudadas sem que o initdb seja executado novamente. Outras definições de idioma, incluindo LC_MESSAGES e LC_MONETARY, são determinadas inicialmente a partir do ambiente onde o servidor é posto em execução. As definições ativas de idioma podem ser verificadas utilizando o comando SHOW.

Na distribuição do código fonte, o diretório src/test/locale contém um conjunto de testes para o suporte a idioma do PostgreSQL.

Como é obvio, os aplicativos cliente que tratam os erros gerados pelo servidor analisando o texto da mensagem de erro terão problemas quando as mensagens do servidor estiverem em outro idioma. Os autores destes aplicativos são aconselhados a utilizar o esquema de códigos de erro para tratar erros, em vez dos textos das mensagens.

A manutenção dos catálogos de mensagens traduzidas requer o esforço contínuo de muitos voluntários que desejam ver o PostgreSQL falando bem o seu idioma. Se as mensagens no seu idioma não estiverem disponíveis atualmente, ou se não estiverem inteiramente traduzidas, sua ajuda será apreciada. Se desejar ajudar, consulte o Capítulo 45 ou escreva para a lista de discussão dos desenvolvedores.

Notas

[1]

O comando locale -a executado no Fedora Core 3 mostrou a seguinte relação: aa_DJ, aa_DJ.iso88591, aa_ER, aa_ER@saaho, aa_ER.utf8, aa_ER.utf8@saaho, aa_ET, aa_ET.utf8, af_ZA, af_ZA.iso88591, ... , portuguese, POSIX, pt_BR, pt_BR.iso88591, pt_BR.utf8, pt_PT, pt_PT@euro, pt_PT.iso88591, pt_PT.iso885915@euro, pt_PT.utf8, ... , zu_ZA, zu_ZA.iso88591, zu_ZA.utf8. (N. do T.)

SourceForge.net Logo CSS válido!