Alterar uma definição de localidade (em oposição a uma configuração de localidade)

8

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_DEou, 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:%Ssem 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:

  1. 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?
  2. 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?)
  3. 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?)
  4. Alguma outra sugestão?
Janis
fonte
Eu sugiro que você copie o arquivo de localidade em que está interessado, dê um nome único a essa cópia (por exemplo, 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.
Goldilocks
1
Você pode ler minha pergunta , que contém detalhes sobre o que eu fiz. Ainda tenho que empacotar, mas por enquanto isso funciona muito bem. Basta definir LC_TIME(em /etc/environmentou /etc/default/localeou /etc/locale.confdependendo distro) para o local modificado (Eu chamei o meu isodate.UTF-8) e o respectivo formato vai começar escolhido a partir desse local personalizado para única data / hora. Foi assim que customizei minha en_USconfiguração para exibir a data / hora ISO.
0xC0000022L
1
@ Janis: no Debian e no Ubuntu, você também deseja colocar o nome da sua localidade /var/lib/locales/supported.d/local(ou um dos outros arquivos) e executar dpkg-reconfigure localescomo 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, onde LC_TIMEé possível definir diferentes do "local geral".
0xC0000022L
@ 0xC0000022L; Sua experiência aqui é muito valiosa. Com as sugestões até agora, irei para um novo arquivo de localidade. Ainda estou indeciso se devo usar a copyabordagem em seções ou manter outras seções redundantes (para que eu possa diffcontra o arquivo original).
Janis

Respostas:

5

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/localespara um novo arquivo. Por exemplo

cp /usr/share/i18n/locales/de_DE /usr/share/i18n/locales/de_DE@isodate

Ajuste tudo, com exceção das LC_TIMEseções, para:

copy "de_DE"

Ajuste a LC_TIMEseçã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:

t_fmt_ampm ""
am_pm   "";""

Tornando-o conhecido pelo sistema

Edite o arquivo /var/lib/locales/supported.d/locale adicione as informações sobre sua definição de localidade. Ou seja, adicione uma linha como esta se o nome do seu arquivo acima for isodate, ajuste de outra forma:

de_DE.UTF-8@isodate UTF-8

Se /var/lib/locales/supported.d/localnão existir, crie um arquivo com esse nome. Não coloque as alterações no respectivo arquivo enou dena pasta, pois elas podem ser substituídas assim que os pacotes language-pack-*-basee language-pack-*no sistema receberem uma atualização.

Agora execute dpkg-reconfigure locales:

# dpkg-reconfigure locales
Generating locales...
  de_DE.UTF-8@isodate... done
  de_DE.UTF-8... up-to-date
Generation complete.

No seu caso, isso indicará que a de_DE.UTF-8@isodatelocalidade 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:

LC_TIME="de_DE.UTF-8@isodate"

Isso garantirá que apenas LC_TIME substitua o código do idioma padrão definido usando LANG.

Efetue login novamente e você poderá ver a nova data / hora ISO ao usar dateou 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; copyou seja, ou simplesmente mantenha as seções como estavam em o original). E se você muda LANGpara apontar para a definição completa de localidade personalizada - ou se você adiciona LC_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.

0xC0000022L
fonte
3
Como prática recomendada, você deve usar o sufixo seu código de idioma com algo parecido en_US.UTF-8@isodate.
Stéphane Chazelas
@ StéphaneChazelas: Hah! Impressionante. No entanto, então você não pode copyo LC_IDENTIFICATIONe como isso afetaria a nomeação dos arquivos e como você se referir ao local em /etc/default/localee /var/lib/locales/supported.d/localrespectivamente? Você pode dizer?
0xC0000022L
1
Você criaria um en_US@isodatearquivo de definição e usaria localedefpara 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).
Stephen Kitt
1
Sim, em qualquer caso, você gostaria de mudar a seção LC_IDENTIFICATION (en_US @ isodate), pois é uma localidade diferente. O comando final seria 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.
Stéphane Chazelas
1
Pelo que entendi, no Debian você adicionaria sua definição de localidade /usr/local/share/i18n/locales, adicionaria os pares locale / charmap suportados /usr/local/share/i18n/SUPPORTEDe executaria dpkg-reconfigure locales(veja também /etc/locale.gen).
Stephen Kitt