Implementação de Internacionalização Frontend com jQuery.i18n.properties

A internacionalização (i18n) de websites front-end permite que o conteúdo seja exibido em diferentes idiomas de forma dinâmica. O plugin jQuery.i18n.properties facilita esse processo carregando traduções de arquivos .properties. Este plugin inicialmente carrega o arquivo de recursos padrão (strings.properties), seguido por um arquivo específico para o idioma alvo (strings_pt-BR.properties), garantindo que uma tradução padrão sempre esteja disponível.

O fluxo de trabalho envolve: detectar o idioma do usuário, carregar as strings correspondentes e substituir o conteúdo textual na página por meio de seletores CSS específicos.

Estrutura de um Exemplo Prático

Considere uma página HTML com elementos que precisam ser traduzidos. Utilizamos atributos de classe e atributos personalizados para identificar o conteúdo a ser substituído.

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="js/jquery.i18n.properties.min.js"></script>
<script src="js/app.js"></script>

</div>O JavaScript (`app.js`) gerencia a lógica de seleção de idioma, utilização de cookies para persistência e a aplicação das traduções.

<div>```
// Gerencia cookies para armazenar a preferência de idioma
function gerenciarCookie(nome, valor, diasExpiracao) {
    if (valor !== undefined) {
        // Define o cookie
        let stringExpiracao = '';
        if (diasExpiracao) {
            const data = new Date();
            data.setTime(data.getTime() + (diasExpiracao * 24 * 60 * 60 * 1000));
            stringExpiracao = '; expires=' + data.toUTCString();
        }
        document.cookie = nome + '=' + encodeURIComponent(valor) + stringExpiracao + '; path=/';
    } else {
        // Lê o cookie
        const nomeIgual = nome + '=';
        const cookies = document.cookie.split(';');
        for (let i = 0; i < cookies.length; i++) {
            let cookie = cookies[i].trim();
            if (cookie.indexOf(nomeIgual) === 0) {
                return decodeURIComponent(cookie.substring(nomeIgual.length, cookie.length));
            }
        }
        return null;
    }
}

// Obtém o idioma do navegador (primeiros 2 caracteres)
function idiomaNavegador() {
    const nav = navigator.language || navigator.userLanguage;
    return nav ? nav.substring(0, 2) : null;
}

// Configuração e inicialização da internacionalização
(function configurarI18n() {
    const IDIOMAS_SUPORTADOS = ['pt', 'en'];
    let idiomaAtual = gerenciarCookie('idioma_preferido') || idiomaNavegador() || 'pt';

    // Verifica se o idioma detectado é suportado
    if (IDIOMAS_SUPORTADOS.indexOf(idiomaAtual) === -1) {
        idiomaAtual = 'pt'; // Fallback para o idioma padrão
    }

    // Carrega os recursos de idioma
    if (typeof jQuery.i18n !== 'undefined') {
        jQuery.i18n.properties({
            name: 'mensagens',
            path: 'i18n/',
            mode: 'map',
            language: idiomaAtual,
            cache: false,
            encoding: 'UTF-8',
            callback: function() {
                // Aplica traduções aos elementos com data-i18n para conteúdo HTML
                $('[data-i18n]').each(function() {
                    const chave = $(this).data('i18n');
                    $(this).html($.i18n.prop(chave));
                });

                // Aplica traduções aos atributos (ex: placeholder)
                $('[data-i18n-placeholder]').each(function() {
                    const chave = $(this).data('i18n-placeholder');
                    $(this).attr('placeholder', $.i18n.prop(chave));
                });
            }
        });
    } else {
        console.error('jQuery.i18n.properties não está carregado.');
    }

    // Define o valor atual no seletor de idioma
    $('#seletor-idioma').val(idiomaAtual);

    // Evento de mudança de idioma
    $('#seletor-idioma').on('change', function() {
        const novoIdioma = $(this).val();
        gerenciarCookie('idioma_preferido', novoIdioma, 30);
        location.reload(); // Recarrega a página para aplicar as mudanças
    });
})();

As traduções são armazenadas em arquivos .properties dentro de um diretório, por exemplo, i18n/.

mensagens_pt.properties (Padrão/Português):


</div>**mensagens\_en.properties** (Inglês):

<div>```
tituloPagina=Internationalization Example
rotuloIdioma=Select language:
mensagemPrincipal=This is a dynamically translated message.
campoPesquisa=Enter your search here...

  • Seletores: Utiliza atributos data- (data-i18n, data-i18n-placeholder) para uma marcação semântica e flexível.
  • Persistência: O idioma selecionado é salvo em um cookie para lembrar a perferência do usuário em visitas futuras.
  • Detecção: O idioma do navegador é utilizado como fallback caso não haja uma preferência salva.
  • Carga Dinâmica: O plugin carrega e aplica as traduções de forma assíncrona, atualizando a interface após o carregamento.

Tags: jQuery Internacionalização i18n properties frontend

Publicado em 6-23 21:13