po-angular icon indicating copy to clipboard operation
po-angular copied to clipboard

PoI18nModule: O serviço não esta apagando as chaves do `localStorage` ao ser iniciado.

Open wsteixeira opened this issue 2 years ago • 2 comments

Reprodução

Utilize StackBlitz (https://stackblitz.com/edit/po-ui-pfhjpc?file=src/app/app.component.ts) para reproduzir o bug relatado na issue.

Passos para reproduzir:

  1. Execute o APP e verifique se o idioma que apareceu foi inglês ou português;
  2. Execute este passo caso o navegador seja em português:
  1. Descomente as linhas abaixo:
  • language: 'en-US', no app.module.ts;
  • this.poI18nService.setLanguage('en-US'); no app.component.ts ;
  1. Verifique se idioma apresentado no APP foi o inglês;
  2. Comente novamente a linhas que descomentou;
  3. Verifique que que o idioma permaneceu em inglês;
  1. Execute este passo caso o navegador seja em inglês:
  1. Descomente as linhas abaixo:
  • language: 'pt-BR', no app.module.ts;
  • this.poI18nService.setLanguage('pt-BR'); no app.component.ts ;
  1. Verifique se idioma apresentado no APP foi o português;
  2. Comente novamente a linhas que descomentou;
  3. Verifique que que o idioma permaneceu em português;
  1. Para voltar a situação original, descomente as linhas abaixo no app.module.ts:
  • localStorage.removeItem('PO_DEFAULT_LANGUAGE');
  • localStorage.removeItem('PO_USER_LOCALE');

Qual o comportamento atual?

O serviço não apaga as chaves PO_DEFAULT_LANGUAGE e PO_USER_LOCALE ao ser iniciado e quando se usa uma vez os recursos abaixo fica gravado no localStorage os valores, mesmo que não defina estes valores posteriormente:

  • default: { language: 'pt-BR' } por exemplo;
  • setLanguage('pt-BR') por exemplo;

Para garantir a escolha do idioma pelo navegador eu tenho que apagar manualmente esta "sujeira" no modulo principal via:

  • localStorage.removeItem('PO_DEFAULT_LANGUAGE')
  • localStorage.removeItem('PO_USER_LOCALE')

Que comportamento você esperava ver?

Que o serviço apague as chaves PO_DEFAULT_LANGUAGE e PO_USER_LOCALE ao ser iniciado para que os valores não fiquem gravados no localStorage, caso não defina estes valores posteriormente

Ambiente

  • PO UI: 6.14.0
  • Angular: 13.3.0
  • Browser(s):
    • [x] Chrome
    • [ ] Firefox
    • [ ] Edge
    • [ ] Safari
    • [ ] IE 11
    • [ ] Outros
  • Operating System:
    • [x] Windows
    • [ ] macOS
    • [ ] Ubuntu
    • [ ] Outros

wsteixeira avatar Jul 06 '22 01:07 wsteixeira

Olá @wsteixeira, tudo bem? o valor permanece sem mudança mesmo após a troca?

alinelariguet avatar Jul 21 '22 13:07 alinelariguet

 Olá, @alinelariguet, 

 Quando a mudança do idioma é feita via linha de comando, funciona normalmente independente do idioma atribuído. O problema acontece quando deixa de atribuir manualmente o idioma e espera que seja detectado automaticamente, assim como as variáveis estão presente no `localStorage`, o idioma passa a ser o ultimo atribuído manualmente e não o idioma do navegador. 

 Eu creio que se forem executadas duas aplicações PO-UI no mesmo navegador em português, sendo que a primeira delas usa a atribuição de idioma manual(forçada), por exemplo em Inglês e a outra com detecção do idioma automática,  a segunda também será exibida em Inglês apesar do navegador ser em português devido a sujeira do `localStorage`. Se você quiser posso simular desta forma também sem problemas.

wsteixeira avatar Jul 22 '22 13:07 wsteixeira

Essa alteração quebra o comportamento já existente em aplicações que utilizam o PoI18nModule. Como exemplo, temos uma aplicação onde o usuário pode em qualquer momento selecionar através de um po-select um idioma. É então feito um refresh através do próprio PoI18nService no método setLanguage passando a propriedade reload como true (https://po-ui.io/documentation/po-i18n#setLanguage).

Como essa informação não é salva em banco de dados, somente utilizando o comportamento já existente de buscar do localStorage (feito pelo próprio processo do module/service do PO) acaba nunca alterando o idioma para o desejado.

A exclusão das variáveis PO_DEFAULT_LANGUAGE e PO_USER_LOCALE no localStorage não deveria ser feito de modo arbitrário e sim através de algum parâmetro ou método onde a aplicação desejada pudesse escolher o comportamento (se pega o idioma via browser ou via localStorage caso já exista).

Quando duas aplicações PO-UI rodam no mesmo browser isso não afeta os idiomas de cada, pois cada uma tem seu contexto de storage separado por domínio.

guilnorth avatar Oct 17 '22 13:10 guilnorth