Observação preliminar : Esta pergunta é não sobre a criação de um local, alterando LC_ALL
, LC_TIME
, LANG
, etc., é bastante sobre a mudança de um local definição , por exemplo, /usr/share/i18n/locales/de_DE
ou, respectivamente, para obter sugestões sobre opções mais apropriadas do que mudar essas configurações do sistema.
A intenção é obter representações de tempo ISO %Y-%m-%d
e %H:%M:%S
sem efeitos colaterais indesejados.
As sugestões que encontrei na rede ainda eram todas inadequadas (por exemplo, definir o local como "dinamarquês" não manterá os nomes de dias da semana escritos no idioma nativo).
Agora, a única opção que vejo atualmente para obter o comportamento desejado é alterar a definição do meu código de idioma nativo /usr/share/i18n/locales/de_DE
. Essa não é uma solução perfeita, pois com as atualizações do sistema, esses arquivos alterados podem ser substituídos novamente.
Minhas perguntas são:
- Existem opções melhores relacionadas ao código do idioma para obter a função desejada do que alterar o arquivo de código do idioma do sistema específico?
- Há algum problema a esperar ao alterar um arquivo de definição de localidade específico? (E como impedir que esse arquivo seja substituído em caso de atualizações do sistema?)
- Seria melhor definir uma nova variante específica de um arquivo de localidade existente e usá-la nas
LC_*
configurações? (E como esse novo arquivo / definição seria divulgado corretamente ao sistema?) - Alguma outra sugestão?
en_XX
- não sei quais são as restrições aqui, tentativa e erro podem ser suficientes), faça as alterações desejadas e use-o como local. Você vai ter de se regenerar a lista ou o que mais tarde, etc.LC_TIME
(em/etc/environment
ou/etc/default/locale
ou/etc/locale.conf
dependendo distro) para o local modificado (Eu chamei o meuisodate.UTF-8
) e o respectivo formato vai começar escolhido a partir desse local personalizado para única data / hora. Foi assim que customizei minhaen_US
configuração para exibir a data / hora ISO./var/lib/locales/supported.d/local
(ou um dos outros arquivos) e executardpkg-reconfigure locales
como superusuário para que a definição da localidade seja compilada. E sim, definirLC_TIME
para apontar para uma localidade personalizada parece ser o método menos intrusivo de tudo o que vi até agora. É por isso que o seu sistema possui configurações globais, ondeLC_TIME
é possível definir diferentes do "local geral".copy
abordagem em seções ou manter outras seções redundantes (para que eu possadiff
contra o arquivo original).Respostas:
Em uma pergunta recente , perguntei qual é a melhor prática para esse tipo de mudança. Ainda não houve resposta. No entanto, posso fornecer a receita que estou usando, que provou funcionar bem. Todos os programas selecionam a data corretamente.
Minha descrição é para o Ubuntu, mas provavelmente funcionará no Debian e no Mint.
Preparações
Copie o código de idioma do qual você deseja personalizar
/usr/share/i18n/locales
para um novo arquivo. Por exemploAjuste tudo, com exceção das
LC_TIME
seções, para:Ajuste a
LC_TIME
seção para corresponder ao resultado desejado. Você pode usar as configurações da minha pergunta vinculada acima como modelo. Parece que isso é exatamente o que você deseja.Se o seu código do idioma não usar a notação "AM / PM", defina-os como vazios:
Tornando-o conhecido pelo sistema
Edite o arquivo
/var/lib/locales/supported.d/local
e adicione as informações sobre sua definição de localidade. Ou seja, adicione uma linha como esta se o nome do seu arquivo acima forisodate
, ajuste de outra forma:Se
/var/lib/locales/supported.d/local
não existir, crie um arquivo com esse nome. Não coloque as alterações no respectivo arquivoen
oude
na pasta, pois elas podem ser substituídas assim que os pacoteslanguage-pack-*-base
elanguage-pack-*
no sistema receberem uma atualização.Agora execute
dpkg-reconfigure locales
:No seu caso, isso indicará que a
de_DE.UTF-8@isodate
localidade foi gerada (supondo que você não tenha problemas de sintaxe).Por último, mas não menos importante, adicione o seguinte a
/etc/default/locale
:Isso garantirá que apenas
LC_TIME
substitua o código do idioma padrão definido usandoLANG
.Efetue login novamente e você poderá ver a nova data / hora ISO ao usar
date
ou outras ferramentas usando a respectiva função libc runtime.A intenção aqui é fazer a alteração menos intrusiva enquanto também não estiver trabalhando contra o sistema (por exemplo, contra o gerenciador de pacotes e amigos). Obviamente, você também pode simplesmente criar uma cópia do seu código do idioma, instalá-lo de maneira semelhante à descrita acima e depois ajustar
LANG
. O ponto é que, desde que você não queira correr o risco de que suas alterações sejam substituídas por uma atualização de pacote, é necessário usar uma cópia personalizada (qualquer que seja a personalização que você faça;copy
ou seja, ou simplesmente mantenha as seções como estavam em o original). E se você mudaLANG
para apontar para a definição completa de localidade personalizada - ou se você adicionaLC_TIME
para apontar apenas para a seção personalizada relevante com o mesmo nome de um arquivo de definição de localidade personalizado - você não poderá ajustar uma das configurações globais.fonte
en_US.UTF-8@isodate
.copy
oLC_IDENTIFICATION
e como isso afetaria a nomeação dos arquivos e como você se referir ao local em/etc/default/locale
e/var/lib/locales/supported.d/local
respectivamente? Você pode dizer?en_US@isodate
arquivo de definição e usarialocaledef
para produzir os arquivos corretos; consulte sourceware.org/git/?p=glibc.git;a=blob;f=localedata/README para obter detalhes (e sourceware.org/git/?p=glibc.git;a=blob;f=localedata/locales/ … Por exemplo).localedef -i en_US@isodate -f UTF-8 en_US.UTF-8@isodate
: não tenho certeza da configuração específica do Debian, meu comentário foi principalmente sobre como para nomear o código do idioma./usr/local/share/i18n/locales
, adicionaria os pares locale / charmap suportados/usr/local/share/i18n/SUPPORTED
e executariadpkg-reconfigure locales
(veja também/etc/locale.gen
).