po-angular
po-angular copied to clipboard
PoI18nModule: O serviço não esta apagando as chaves do `localStorage` ao ser iniciado.
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:
- Execute o APP e verifique se o idioma que apareceu foi inglês ou português;
- Execute este passo caso o navegador seja em português:
- Descomente as linhas abaixo:
language: 'en-US',
noapp.module.ts
;this.poI18nService.setLanguage('en-US');
noapp.component.ts
;
- Verifique se idioma apresentado no APP foi o inglês;
- Comente novamente a linhas que descomentou;
- Verifique que que o idioma permaneceu em inglês;
- Execute este passo caso o navegador seja em inglês:
- Descomente as linhas abaixo:
language: 'pt-BR',
noapp.module.ts
;this.poI18nService.setLanguage('pt-BR');
noapp.component.ts
;
- Verifique se idioma apresentado no APP foi o português;
- Comente novamente a linhas que descomentou;
- Verifique que que o idioma permaneceu em português;
- 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
Olá @wsteixeira, tudo bem? o valor permanece sem mudança mesmo após a troca?
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.
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.