Eu gostaria de criar uma nova localidade no FreeBSD. Eu pensei que poderia simplesmente copiar um dos existentes, /usr/share/locale
mas aparentemente não é tão simples.
Em primeiro lugar, apenas crio uma cópia do en_US.UTF-8
locale.
$ sudo cp -R /usr/share/locale/en_US.UTF-8 /usr/share/locale/en_DK.UTF-8
Estou testando minha configuração com mosh, então com o padrão en_US.UTF-8
está tudo bem:
$ LC_ALL=en_US.UTF-8 PATH_LOCALE=/usr/share/locale mosh xyz.example.org
No entanto, se eu tentar usar a en_DK.UTF-8
localidade recém-criada, recebo os seguintes erros:
$ LC_ALL=en_DK.UTF-8 PATH_LOCALE=/usr/share/locale mosh xyz.example.org
The locale requested by LC_ALL=en_DK.UTF-8 isn't available here.
Running `locale-gen en_DK.UTF-8' may be necessary.
mosh-server needs a UTF-8 native locale to run.
Unfortunately, the local environment ([no charset variables]) specifies
the character set "US-ASCII",
The client-supplied environment (LC_ALL=en_DK.UTF-8) specifies
the character set "US-ASCII".
sh: warning: setlocale: LC_ALL: cannot change locale (en_DK.UTF-8)
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_DK.UTF-8
LC_CTYPE="en_DK.UTF-8"
LC_NUMERIC="en_DK.UTF-8"
LC_TIME="en_DK.UTF-8"
LC_COLLATE="en_DK.UTF-8"
LC_MONETARY="en_DK.UTF-8"
LC_MESSAGES="en_DK.UTF-8"
LC_PAPER="en_DK.UTF-8"
LC_NAME="en_DK.UTF-8"
LC_ADDRESS="en_DK.UTF-8"
LC_TELEPHONE="en_DK.UTF-8"
LC_MEASUREMENT="en_DK.UTF-8"
LC_IDENTIFICATION="en_DK.UTF-8"
LC_ALL=en_DK.UTF-8
Connection to xyz.example.org closed.
/usr/local/bin/mosh: Did not find mosh server startup message. (Have you installed mosh on your server?)
Parece que você está tentando um Linuxismo no FreeBSD. No FreeBSD você deve usar classes de login
Há uma ótima descrição geral de localidades em Como devo definir minha localidade e quais são as implicações de fazê-lo? .
A parte dessa resposta que você pode ignorar é "Instalando localidades". O FreeBSD vem com todas as localidades comuns instaladas. Você pode verificar isso com
Mas então você provavelmente afirma que tenta modificar a localidade e defini-la. E isso é o que eu chamo de Linuxismo. As pessoas adicionam a localidade ao linux sem entender o que realmente aconteceu e, em seguida, definem LC_ALL. A localidade define um conjunto de
LC_*
variáveis.LC_ALL
é então usado para substituir aqueles!No FreeBSD, a maneira preferida de alterar as configurações de localidade para um usuário (ou sistema) é usar 22.2.1.1. Método de aulas de login . Você também pode alterar os padrões de todo o sistema aqui.
LC_ALL só deve ser definido se você quiser (forçosamente) anular qualquer e todas as outras configurações de LC_*. Você pode pensar que está definindo um "locale" com
LC_ALL
, mas na verdade está apenas definindoLANG
comoLANG=en_DK.UTF-8
. Essa não é uma linguagem válida e você deve deixar isso para o Projeto Unicode CLDR . Para mais informações sobre isso, dê uma olhada em O que “LC_ALL=C” faz?Minha questão é então que você não queira inventar sua própria nova linguagem. Mas das combinações que você escolhe, meu palpite é que você gostaria que o sistema se comportasse como um sistema dinamarquês (DK), mas falasse inglês com você. Para isso, você pode misturar e combinar suas
LC_*
variáveis com seu conteúdo de aquecimento.Exemplo:
Se você não quiser definir sua classe de login (por algum motivo), você ainda deve manter as variáveis definidas pelo CLDR. Isso lhe dará os resultados mais portáteis:
Se for uma configuração de localidade que você deseja usar normalmente, você pode configurá-la usando uma classe de login. Veja o Manual do FreeBSD ou minha resposta para SSH para FreeBSD em UTF-8
Acho que sua resposta está em algum lugar acima. Mas se respondermos a sua pergunta literalmente, o FreeBSD atual adicionará um locale UTF-8 C em 13.0 (veja o commit r340144). Se você realmente deseja ver como adicionar uma nova localidade , dê uma olhada em introduzir a localidade C.UTF-8
ATUALIZAR
O diretório
/usr/share/locale/*
é apenas um diretório. Se você fizer uma cópia literal como no Q - as coisas funcionarão no FreeBSD 11.2. Eu ainda recomendo usar classes detalhadasLC_ALL
ou de login. Por enquanto acho que o problema tem sido "dedos gordos" .O diretório contém links simbólicos e arquivos de definição. Os arquivos podem ser criados pelo localdef que substituiu o mklocale em 2015 .
Se você não quiser alterar a ordem de agrupamento real, poderá vincular a um idioma que tenha a ordem de agrupamento "adequada" - ou simplesmente copiar o arquivo.
PATH_LOCALE=/usr/share/locale
está implícito, pois é o padrão.Fiz uma cópia literal no meu sistema para
test
een_DK.UTF-8
. Eles aparecemlocale -a
imediatamente. Ambos funcionaram como esperado: