Como posso personalizar um código de idioma do sistema?

24

No sistema Administração Suporte ao idioma Texto. Só posso escolher localizações padrão, mas gostaria de ajustar. Por exemplo, no Windows, eu poderia personalizar coisas como formato de hora e data, unidades de medida, separador decimal, moeda, etc. manualmente - como posso fazer isso no Ubuntu?

Ivan
fonte

Respostas:

28

Esta resposta demonstrará como personalizar totalmente um código de idioma, opcionalmente usando um código de idioma existente como base. O tipo de localidade que será usado nesta resposta é o i18ntipo; esse tipo de local será implícito em todas as menções à palavra "local" no corpo da resposta.

Encontre um guia

A primeira coisa que você precisa para personalizar um código de idioma é conhecer o formato do código de idioma. Esse editor de local da web possui uma descrição abrangente de todos os campos em um local, apesar de não ser utilizável por ninguém de maneira imediata. Este será o guia para usar.

Ferramentas necessárias

As únicas ferramentas necessárias para trabalhar com localidades são

  1. Um editor de texto. Qualquer um servirá, embora o VIM seja excelente.
  2. Um conversor de texto para unicode. Seria de se esperar que você não tivesse um, por isso fornecerei um simples. Leia a próxima subseção para obtê-lo.

Eu recomendo que você crie um diretório e salve nele tudo relacionado ao trabalho que você fará no local.

Conversor de texto para unicode (encodestr)

NOTA: se você estiver usando caracteres não comuns, poderá ter problemas com o script que escrevo abaixo; convém dar uma olhada nos scripts alternativos vinculados por nass .

Salve o seguinte código em um arquivo. Este arquivo será identificado pelo seu sistema como um script python, o que é bom porque é um. Este guia pressupõe que você chamou o script encodestr.

#!/usr/bin/python

def encode(string):
    newstring = str()
    for ch in string:
        newstring += "<U%04X>" % ord(ch)
    return newstring

if __name__ == '__main__':
    import sys
    print encode(sys.argv[1])

Depois de salvá-lo, dê permissão para a execução do arquivo - isso será útil. Você pode fazer isso usando Nautilus, ou pela execução de um terminal o seguinte comando no diretório em que você salvou o script: chmod +x encodestr.

Agora você pode testar esse script em execução no mesmo diretório: ./encodestr hello. Você deve obter uma saída igual a <U0068><U0065><U006C><U006C><U006F>.

Modificar um código de idioma existente

Modificar um código de idioma existente é o caso mais fácil, pois, idealmente, você escolherá um código de idioma que atenda quase totalmente às suas necessidades; nesse caso, você precisará fazer apenas pequenas modificações. Para adaptá-lo, você pode usar o guia para saber quais seções são as que você deseja alterar e como pode alterá-las. Todos os códigos de idioma instalados residem /usr/share/i18n/locales, no entanto, o guia contém praticamente todos os códigos de idioma já criados.

No entanto, a primeira coisa que você notará ao abrir um código de idioma é ler palavras em inglês tanto quanto <UXXXX>códigos estranhos . Você precisará criar esses códigos - é aqui que o encodestrscript vem.

Quando você sabe quais seções você deve alterar, precisa conhecer cada campo contido na seção.

Por exemplo, a LC_TIMEseção contém o campo t_fmte muitos outros. Cada campo tem sua própria descrição no guia .

Agora que você sabe quais campos modificar, use o guia novamente para descobrir quais valores o campo aceita.

Por exemplo, o campo t_fmtaceita texto e as variáveis ​​strfmt comuns .

Quando você souber o que escrever nos campos que deseja modificar, execute o texto através do encodestrscript para obter seu equivalente codificado.

NOTA: Nem todos os campos precisam ser codificados; use um código de idioma existente como referência, se necessário.

Por exemplo, se você deseja ter o formato da hora Time: %Tno t_fmtcampo, execute ./encodestr "Time: %T"; isso retornará <U0054><U0069><U006D><U0065><U003A><U0020><U0025><U0054>e, assim, você terá a linha t_fmt <U0054><U0069><U006D><U0065><U003A><U0020><U0025><U0054>em sua localidade (na respectiva seção, é claro).

Depois de modificar todos os campos que você deseja, será necessário continuar com a instalação do código do idioma no sistema, para que ele possa ser usado. Prossiga para a seção de instalação para isso.

Criando uma localidade do zero

Ao contrário de modificar um, o outro método que você pode usar para criar seu código de idioma personalizado está trabalhando nele do zero. Isso não é muito difícil se - novamente - você usar o guia . Aqui está uma dica útil: você pode copiar seções de outros locais sem os métodos reais de copiar e colar . Você apenas precisa seguir este formato:

LC_SECTION
copy "locale"
END LC_SECTION

Onde LC_SECTIONestá a seção que você deseja modificar e localeo local do qual você deseja copiar essa seção.

Por exemplo, se você deseja copiar o formato da hora no código do idioma inglês, você terá este texto como seu arquivo de código do idioma personalizado:

LC_TIME
copy "en_GB"
END LC_TIME

Isso economiza muito trabalho e garante que qualquer alteração feita no local de referência seja refletida no seu.

Instalando seu Código de Idioma Customizado

Os passos que vou mostrar abaixo podem não ser ótimos, mas funcionam.

  1. Compile seu código de idioma. Não entre em pânico! Isso não leva tempo. Basta executar o comando sudo localedef -i custom -f UTF-8 custom.UTF-8 -c -vonde customestá o nome do seu código do idioma.

  2. Copie seu código do idioma para o /usr/share/i18n/locales/diretório Definitivamente, você precisará de privilégios sudo para fazer isso, e pode fazê-lo com o comando sudo cp locale /usr/share/i18n/locales/onde localeestá o nome do arquivo do seu código do idioma personalizado.

  3. Especifique seu código de idioma em /var/lib/locales/supported.d/. Por exemplo, crie um nome de arquivo /var/lib/locales/supported.d/asde adicione a linha custom UTF-8, em que custom é o nome do seu código do idioma.

  4. Execute o comando mágico. Na verdade, eu não sei exatamente o que esse comando faz, mas é crucial. Corra sudo locale-gen. É mais provável que gere referências aos locais disponíveis, quando necessário.

  5. Diga ao seu sistema para usar o código do idioma. Se você deseja que o código do idioma seja usado em todo o sistema, modifique o /etc/environmentarquivo. Caso contrário, você pode modificar seu ~/.profilearquivo ou qualquer outro que seja originado na inicialização. Se você não sabe o que significa este último, não se preocupe, basta usar o ~/.profilearquivo. Para saber o que você precisa escrever nele, primeiro execute o localecomando. Deve emitir uma lista com itens como LANGUAGE, LC_MESSAGES, LC_CTYPEe muitos outros. Você escreverá, para cada uma das seções que desejar (listadas pelo comando anterior), em linhas separadas, SECTION="locale"onde SECTIONé a seção e localeo nome do seu código de idioma personalizado.

Por exemplo, se você deseja usar o formato de hora da Holanda, mas o idioma inglês, escreva:

LANGUAGE="en_GB:en"
LC_TIME="nl_NL"

NOTA: Se você deseja usar um código de idioma para cada configuração de código de idioma, escreva LC_ALL="locale"onde localeé o nome do código de idioma personalizado. Se você deseja usar um código de idioma para tudo, menos para o idioma, você pode escrever LANG="locale"e (em outra linha, é claro) LANGUAGE="locale":XXonde XXestá o código de duas letras do idioma desejado.

Por exemplo, se você quiser usar o idioma holandês e o idioma inglês, poderá usar:

LANG="nl_NL"
LANGUAGE="nl_NL:en"

Você terminou

Na próxima vez que você fizer login, seu código de idioma deverá estar em uso. Você pode testar isso executando o localecomando novamente.

Por favor, comente sobre inconsistências ou declarações falsas neste guia!

Severo Raz
fonte
Olá, O código python que você usa não funciona em todos os casos. Para caracteres gregos πμ, ele gera <U00CF><U0080><U00CE><U00BC>, em vez dos caracteres esperados <U03C0><U03BC>. Aqui está um link que funciona.
Nass
Obrigado pela sua contribuição! Eu incluí o seu comentário no texto em que é devido :)
Severo Raz
Eu tive que adicionar custom UTF-8a /usr/share/i18n/SUPPORTEDantes que eu pudesse correr sudo locale-gen. Caso contrário, não estaria na lista.
Wilbert
Copiou o método de conversão de string para minha coleção de scripts de shell: github.com/budhajeewa/shell-scripts/commit/… . Obrigado!
budhajeewa
Se alguém estiver procurando por uma função para fazer o inverso do método nesta resposta (eu precisava ler valores hexadecimais existentes em arquivos de localidade), escrevi um script PHP para isso. github.com/budhajeewa/shell-scripts/commit/… . Se alguém puder escrever em Python, me avise. Eu gostaria de adicionar isso à minha coleção.
budhajeewa
8

Não tem certeza do tipo de personalização que deseja, mas você pode definir algumas variáveis ​​de localidade usando o seu ~/.locale. Por exemplo, para receber mensagens em inglês, mas com horário alemão e os gostos que eu uso

export LC_ALL=""
export LANG="en_GB.utf8"
export LC_CTYPE="de_DE.utf8"
export LC_NUMERIC="de_DE.utf8"
export LC_TIME="de_DE.utf8"
export LC_COLLATE="de_DE.utf8"
export LC_MONETARY="de_DE.utf8"
export LC_MESSAGES="en_GB.utf8"
export LC_PAPER="de_DE.utf8"
export LC_NAME="en_GB.utf8"
export LC_ADDRESS="de_DE.utf8"
export LC_TELEPHONE="de_DE.utf8"
export LC_MEASUREMENT="de_DE.utf8"
export LC_IDENTIFICATION="de_DE.utf8"

Também é possível gerar localidades personalizadas. Veja, por exemplo, este guia para datas.

Carsten Thiel
fonte
1
Não, eu quero personalização de nível inferior. Por exemplo: mensagens em inglês, unidades métricas, data / hora tcheca modificada (DD.MM.YYYY HH: mm em vez de DMYYYY H.MM), um ponto como separador decimal (existe uma vírgula na localidade tcheca) e € como a moeda (existe a moeda Kč na localidade tcheca).
Ivan
Entendo. Tomar en_USpara LC_NUMERICe de_DEpara LC_MONETARYe LC_MEASUREMENTlhe dá outros efeitos colaterais? Consulte também o novo link para gerar um código de idioma pessoal.
Carsten Thiel
1
as instruções por trás do link parecem responder maravilhosamente à pergunta, talvez você possa replicar os bits mais importantes aqui, caso o link não esteja acessível algum dia?
Stefano Palazzo