Skip to content

Tudo para WordPress, desenvolvimento web — e não só

🔢 Tradução de números com PHP e JavaScript: algarismos árabes para devanágari e vice-versa

🔢 Tradução de números com PHP e JavaScript: algarismos árabes para devanágari e vice-versa

Um utilizador preenche um formulário num site e os números transformam-se em caracteres ilegíveis. Esta é uma situação familiar para quem trabalha com projetos multilingues: a versão nepalesa de uma loja online mostra preços em अक्षर, e o formulário de contacto falha a validação por causa de dígitos «incorretos».

O problema é que diferentes línguas usam diferentes sistemas de numeração. O inglês e o russo usam algarismos árabes (0-9). O hindi, o nepalês e o marata usam símbolos devanágari (०-९). O PHP e o JavaScript não alternam entre eles de forma nativa. No entanto, a tarefa pode ser resolvida sem uma única biblioteca externa, usando apenas funções de string integradas. Sem dependências para instalar, sem APIs de terceiros.

Abaixo estão dois excertos de código prontos a usar que resolvem este problema em 5 minutos. Sem frameworks, sem pacotes Composer, sem dependências npm, apenas PHP simples e JavaScript vanilla. Copie-os, substitua os seus símbolos e funciona.

💡 Visão geral rápida:

  • Copie a função PHP para o ficheiro functions.php do seu tema ou através do plugin Code Snippets; converte algarismos árabes em devanágari e vice-versa
  • Para o frontend, use o código JavaScript pronto com objetos dicionário para conversão em tempo real diretamente no campo de entrada
  • A substituição usa uma tabela de correspondência de glifos em vez de matemática, tornando o método universal para qualquer sistema de escrita
  • Teste: passe 1234 e obtenha १२३४, e vice-versa; ambas as direções funcionam simetricamente

Como funcionam os sistemas de numeração em diferentes línguas

A maioria dos sites trabalha com algarismos árabes: 0 1 2 3 4 5 6 7 8 9. Historicamente, este sistema veio da Índia, mas difundiu-se através do mundo árabe, daí o nome.

Existem conjuntos alternativos em dezenas de sistemas de escrita. O devanágari (hindi, nepalês, marata) usa a sua própria série: ० १ २ ३ ४ ५ ६ ७ ८ ९. Os algarismos árabes orientais (árabe, persa, urdu) usam um conjunto diferente: ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩. O bengali, o tailandês e o khmer têm cada um os seus próprios glifos e os seus próprios intervalos Unicode. Existem mais de vinte sistemas destes no total.

Mas o valor numérico permanece o mesmo. 5, e ٥ são todos o mesmo número «cinco», apenas escrito com símbolos diferentes. Portanto, a tradução entre sistemas é uma substituição de glifos usando uma tabela de correspondência, não uma conversão matemática. Não há nada para recalcular; só precisa de saber os pares de símbolos corretos.

Este é exatamente o princípio por detrás do código abaixo.

Passo 1: Converter números com PHP

Programador a trabalhar num portátil com um editor de código aberto

A abordagem em PHP é o mais simples possível: a função str_replace() recebe dois arrays, o que procurar e pelo que substituir. A string é processada numa única passagem e todas as correspondências são substituídas.

Adicione este código ao functions.php do seu tema filho ou através do plugin Code Snippets. A função aceita um número ou uma string contendo dígitos e devolve o resultado com símbolos devanágari.

1<?php
2/**
3 * Converts Arabic numerals to Devanagari characters (Hindi, Nepali).
4 *
5 * @param string|int $input String or number to convert.
6 * @return string String with Devanagari numerals.
7 */
8function convert_to_devanagari($input) {
9 $english = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
10 $devanagari = array("०", "१", "२", "३", "४", "५", "६", "७", "८", "९");
11
12 return str_replace($english, $devanagari, (string) $input);
13}
14
15/* Usage example */
16echo convert_to_devanagari(2026);
17// Output: २०२६
18?>

O que acontece aqui: str_replace() itera pelo array $english e, para cada elemento (por exemplo, "2"), substitui o elemento correspondente de $devanagari ("२"). A conversão para (string) garante que a função funciona tanto com números como com strings.

A conversão inversa, de devanágari para algarismos árabes, é feita trocando os arrays:

1<?php
2/**
3 * Converts Devanagari characters back to Arabic numerals.
4 *
5 * @param string $input String with Devanagari numerals.
6 * @return string String with Arabic numerals.
7 */
8function convert_from_devanagari($input) {
9 $english = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
10 $devanagari = array("०", "१", "२", "३", "४", "५", "६", "७", "८", "९");
11
12 return str_replace($devanagari, $english, $input);
13}
14
15/* Example */
16echo convert_from_devanagari('२०२६');
17// Output: 2026
18?>

Os arrays são os mesmos; apenas a ordem dos argumentos muda. O primeiro array contém agora símbolos devanágari (o que procuramos), o segundo contém algarismos árabes (pelo que substituímos).

Onde usar. A função é útil em qualquer parte do tema onde os números são exibidos: preços de produtos no WooCommerce, datas em artigos de blogue, numeração de páginas. Envolva a chamada onde precisar de localização de dígitos para um público específico.

Tratamento de casos limite em PHP

A função convert_to_devanagari() aceita string|int, mas na prática a entrada pode ser qualquer coisa. O que acontece se passar null, uma string vazia ou uma string sem dígitos? (string) null devolve uma string vazia, e str_replace() com uma string vazia também devolve vazio sem erros. Uma string sem dígitos (por exemplo, "Hello") é devolvida inalterada, uma vez que a substituição não encontra correspondências.

Se o número contiver separadores (vírgulas para milhares, um ponto para decimais), estes permanecem no lugar; apenas os dígitos em si são substituídos. Para números de vírgula flutuante, este comportamento está correto, mas se a formatação do número for importante e os separadores deverem mudar de acordo com a configuração regional, adicione processamento separado via number_format() antes da conversão.

Para números muito longos (por exemplo, identificadores de 20 dígitos), a abordagem funciona sem alterações: str_replace() processa strings de qualquer comprimento, limitado apenas pela memória PHP disponível. Os caracteres devanágari ocupam 3 bytes cada em UTF-8, pelo que a string resultante será mais longa do que a original em bytes. Para contagem de caracteres, use mb_strlen(), não strlen().

Passo 2: Converter números com JavaScript

No frontend, a mesma lógica é implementada usando objetos dicionário e o método String.replace() com uma expressão regular. Isto é conveniente para interfaces dinâmicas: o utilizador introduz um número num campo e o script mostra instantaneamente o equivalente devanágari.

Coloque este código num ficheiro .js separado no seu tema ou via wp_add_inline_script no functions.php. Sem dependências, ES5 simples, funciona mesmo em navegadores antigos.

1/**
2 * Dictionaries for translating between Arabic numerals and Devanagari.
3 */
4var englishToDevanagari = {
5 '0': '०', '1': '१', '2': '२', '3': '३', '4': '४',
6 '5': '५', '6': '६', '7': '७', '8': '८', '9': '९'
7};
8
9var devanagariToEnglish = {
10 '०': '0', '१': '1', '२': '2', '३': '3', '४': '4',
11 '५': '5', '६': '6', '७': '7', '८': '8', '९': '9'
12};
13
14/**
15 * Converts Arabic numerals in a string to Devanagari characters.
16 * @param {string|number} input
17 * @returns {string}
18 */
19function toDevanagari(input) {
20 return String(input).replace(/[0-9]/g, function(match) {
21 return englishToDevanagari[match];
22 });
23}
24
25/**
26 * Converts Devanagari characters to Arabic numerals.
27 * @param {string} input
28 * @returns {string}
29 */
30function fromDevanagari(input) {
31 return input.replace(/[०-९]/g, function(match) {
32 return devanagariToEnglish[match];
33 });
34}
35
36// Examples:
37console.log(toDevanagari(9857)); // ९८५७
38console.log(fromDevanagari('१२३४')); // 1234

O ponto-chave é a expressão regular /[0-9]/g. A flag g (global) faz com que replace() processe cada dígito na string, não apenas o primeiro. A função de callback anónima recebe o caractere correspondido e devolve o seu equivalente do dicionário.

Para dígitos devanágari, o intervalo [०-९] é usado; em Unicode, estes caracteres são sequenciais, pelo que a regex funciona corretamente.

Onde usar. Entrada em tempo real em formulários (conversão instantânea durante a digitação), exibição de preços e datas em versões localizadas do site, conversão inversa antes de enviar o formulário para o servidor, para que os algarismos árabes cheguem sempre à base de dados.

Exemplo prático: formulário de contacto com conversão em tempo real

Vamos combinar ambas as abordagens numa configuração funcional. Suponha que a versão nepalesa de um site tem um formulário de encomenda onde o utilizador introduz um montante em devanágari. A tarefa: mostrar o número introduzido em ambos os sistemas para verificação e enviar algarismos árabes para o servidor.

A marcação do formulário contém um <input> e um bloco de pré-visualização. A cada tecla premida no campo, o manipulador de eventos input é acionado, chamando toDevanagari() e exibindo o resultado num <span> adjacente. Quando o formulário é submetido, fromDevanagari() é acionado e o corpo do pedido POST enviado para o servidor contém algarismos árabes. O código do lado do servidor PHP recebe o número em formato padrão e trabalha com ele como habitualmente, sem conversão adicional.

Este mesmo padrão aplica-se a campos de preço, datas, números de telefone e quaisquer outros campos onde o utilizador espera ver o seu sistema de numeração nativo, enquanto o sistema precisa de armazenar um formato unificado. A conversão demora microssegundos e não afeta a capacidade de resposta da interface.

Veja também: vídeo sobre sistemas de numeração em programação

Para uma visão mais ampla do tópico de como os sistemas de numeração funcionam em código e como converter entre eles em JavaScript, veja esta análise da Techno Geek. Abrange sistemas binário, octal e decimal com um projeto pronto.

⁉️🤔 Perguntas frequentes

Este mesmo método pode converter dígitos para árabe (símbolos árabes orientais)?

Sim. Substitua o array devanágari pelos símbolos árabes orientais: array("٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"). A lógica é a mesma: str_replace() em PHP e um dicionário com regex em JS. Adapta-se com a mesma facilidade a bengali, tailandês, khmer e qualquer outro sistema de escrita com os seus próprios glifos numéricos.

É seguro usar str_replace() para strings multibyte em PHP?

Sim, str_replace() funciona corretamente com UTF-8 e caracteres multibyte, ao contrário de strpos() ou substr(), que precisam de equivalentes mbstring. Os símbolos devanágari (, ) ocupam 3 bytes cada em UTF-8, mas str_replace() trata-os de forma segura em termos de bytes porque procura correspondências exatas de sequências binárias. Não haverá problemas.

E se a string contiver uma mistura de algarismos árabes e símbolos devanágari?

Ambas as funções processam apenas os seus respetivos intervalos. Se convert_to_devanagari() receber a string "Price: 500 रुपय", o numeral 500 torna-se ५०० enquanto o texto permanece intacto. A função inversa convert_from_devanagari() afeta apenas os dígitos devanágari. A entrada mista é tratada corretamente de forma automática.

Como posso aplicar a conversão a todos os números numa página WordPress sem editar cada modelo?

Use a abordagem JavaScript do passo 2 e execute uma travessia de nós DOM no carregamento da página. Encontre todos os nós de texto que contenham dígitos (via TreeWalker ou travessia recursiva de childNodes) e aplique toDevanagari() ao seu conteúdo. Para a abordagem PHP no lado do servidor, use um filtro em the_content ou gettext se os números estiverem incorporados nas traduções.

Onde posso encontrar tabelas de caracteres para outros sistemas de escrita?

A fonte autorizada é o Unicode Consortium. Para dígitos devanágari, este é o intervalo U+0966-U+096F. O árabe oriental é U+0660-U+0669. O bengali é U+09E6-U+09EF. Basta copiar os caracteres da tabela e substituí-los nos arrays; o código não precisa de ser alterado.

Desempenho e limitações da abordagem

str_replace() com arrays de 10 elementos realiza exatamente 10 comparações para cada posição na string. Para uma string típica com 5 a 10 dígitos, isto significa 50 a 100 operações; o tempo de execução é medido em microssegundos. Em comparação, a abordagem usando preg_replace_callback() com uma expressão regular adiciona sobrecarga para compilação de padrão e invocação de callback para cada correspondência. A diferença é impercetível para strings pequenas, mas str_replace() ganha em grandes volumes.

A principal limitação da abordagem é que substitui glifos, não a semântica do número. Se precisar de aritmética com números devanágari (adição, multiplicação), os símbolos devanágari não serão reconhecidos como números pelo PHP. Converta sempre para algarismos árabes antes de operações matemáticas e converta de volta depois. Isto não é uma falha do método, mas uma consequência da diferença entre sistemas de escrita e tipos de dados numéricos.

Outra nuance: o método assume uma correspondência um-para-um de «um glifo, um dígito». Para sistemas de escrita onde os números são escritos com ligaduras compostas (como em alguns sistemas históricos), a abordagem de substituição simples não funcionará. Mas para todos os scripts indianos modernos (devanágari, bengali, gurmukhi, guzerate, oriá, tâmil, telugu, canarim, malaiala), bem como para algarismos árabes orientais, a correspondência é estritamente de 1 para 1, e o método funciona na perfeição.

O que colocar em produção: PHP, JavaScript ou ambos?

A solução PHP é para casos em que os números devem ser renderizados no sistema de símbolos de destino no servidor antes de o HTML ser enviado. Isto é correto para SEO: o motor de busca vê o conteúdo imediatamente na configuração regional de destino, não algarismos árabes que são depois substituídos por um script. Para uma loja WooCommerce, isto significa que os preços do catálogo e das páginas de produto são indexados com dígitos devanágari, o que afeta positivamente o posicionamento nos segmentos nepalês e hindi.

A variante JavaScript é para interação dinâmica: um campo de entrada com pré-visualização instantânea, mudança de idioma sem recarregar a página, conversão de dados de formulário antes do envio. É também indispensável para aplicações de página única (SPA) onde o servidor devolve JSON com algarismos árabes e o frontend renderiza-os na configuração regional do utilizador.

Na prática, uma combinação funciona bem: o PHP renderiza a página com dígitos localizados para indexação, enquanto o JavaScript trata da entrada do utilizador e converte de um lado para o outro em tempo real. Ambos os excertos de código, sem dependências externas, têm menos de 40 linhas combinadas e resolvem completamente a tarefa para qualquer sistema de escrita com os seus próprios glifos numéricos.

Antes de colocar em produção, teste três cenários: uma chamada de função direta com um número, uma string com conteúdo misto (dígitos mais texto) e conversão inversa. Certifique-se de que os algarismos árabes chegam sempre ao servidor e que a interface mostra ao utilizador o sistema que corresponde às suas expectativas linguísticas. Cinco minutos de teste poupam horas de depuração em tráfego real.

Copie ambos os excertos de código para o seu projeto, substitua os símbolos necessários da tabela Unicode para o seu sistema de escrita e a tarefa está concluída. Tudo o que precisa já está incorporado na linguagem.