Definir localizações personalizadas no Gnome3 (no Fedora 20)

15

Eu criei meus próprios customizados localee os coloquei com /etc/locale.confêxito se eu fizer login em um console virtual (Ctrl + Alt + F2). Na minha sessão do Gnome3, essas variáveis ​​não estão definidas. Para aplicativos de terminal, eu poderia simplesmente colocá-los no, .bashrcmas isso não vai me ajudar com aplicativos gráficos como Thunderbird e Pidgin.

Tentei seguir estas dicas: Configurações de localidade na inicialização do shell não usadas pela sessão do GNOME e até emulamos o bug no Localidade - ArchWiki criando um .pam_environmentarquivo, mas os localeainda são aqueles definidos pelo Gnome3. Existe um diálogo de configuração nas configurações do Gnome, mas apenas permite definir um conjunto muito limitado de localecombinações predefinidas e não há como personalizá-las.

Os arquivos relevantes no meu diretório pessoal:

user@localhost:~$ ls -lah .dmrc .pam_environment .session .xsession .xsessionrc
lrwxrwxrwx. 1 user user 16 12. Jun 08:57 .dmrc -> /etc/locale.conf
lrwxrwxrwx. 1 user user 16 11. Jun 20:23 .pam_environment -> /etc/locale.conf
lrwxrwxrwx. 1 user user 16 12. Jun 09:09 .session -> /etc/locale.conf
lrwxrwxrwx. 1 user user 16 12. Jun 09:07 .xsession -> /etc/locale.conf
lrwxrwxrwx. 1 user user  9 13. Jun 11:22 .xsessionrc -> .xsession
-rw-rw-r--. 1 user user 66 13. Jun 11:13 .profile

user@localhost:~$ cat .profile 
source /etc/locale.conf

O conteúdo de /etc/locale.conf:

LANG="en_US.utf8"
LC_TIME="de_MY.utf8" # NB: de_MY
LC_MONETARY="de_DE.utf8"
LC_PAPER="de_DE.utf8"
LC_NAME="de_DE.utf8"
LC_ADDRESS="de_DE.utf8"
LC_TELEPHONE="de_DE.utf8"
LC_MEASUREMENT="de_DE.utf8"
LC_IDENTIFICATION="de_DE.utf8"

Alguém sabe como definir locales personalizados no Gnome3?

Perseids
fonte

Respostas:

9

Informações básicas

Testei a solução no Fedora 21 com o GNOME Shell 3.14.4, mas acredito que também pode ser aplicada a outras versões.

A primeira coisa a entender é que o ambiente de área de trabalho do GNOME substitui as definições de localidade em todo o sistema e, portanto, não é afetado /etc/locale.conf. Além disso, pode haver aplicativos que tenham sua própria configuração de localidade e não usem as configurações do sistema ou do GNOME. Neste guia, descreverei uma maneira de personalizar as configurações de localidade de acordo com suas necessidades e o GNOME, e o sistema será consistente da perspectiva do localidade.


Verificando o status atual da localidade

Configurações em todo o sistema

No Guia do Administrador do Sistema do Fedora 21 :

As configurações de localidade em todo o sistema são armazenadas no /etc/locale.confarquivo, que é lido na inicialização antecipada pelo daemon systemd . As configurações de localidade configuradas /etc/locale.confsão herdadas por cada serviço ou usuário, a menos que programas ou usuários individuais os substituam.

Para ver o status atual da localidade, podemos executar:

$ localectl status
   System Locale: LANG=en_US.UTF-8
                  LC_NUMERIC=en_US.UTF-8
                  LC_TIME=en_US.UTF-8
                  LC_MONETARY=en_US.UTF-8
                  LC_PAPER=en_US.UTF-8
                  LC_MEASUREMENT=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us

Configurações do GNOME

$ gsettings get org.gnome.system.locale region
'en_US.UTF-8'

O GNOME tem apenas uma configuração. Ao dar uma rápida olhada no código-fonte do gnome-control-center , parece que quando a set_localed_locale()função é chamada, ela define todas as seguintes categorias (LC_TIME, LC_NUMERIC, LC_MONETARY, LC_MEASUREMENT, LC_PAPER) para o mesmo código de idioma definido em org.gnome.system.locale region.

Misturar diferentes configurações de localidade parece impossível sem criar uma localidade personalizada, mas felizmente não é uma tarefa muito complexa.


Criando localidade personalizada

Eu acho que a maneira mais fácil de explicar é pelo exemplo. No meu caso específico, eu queria ter um código de idioma personalizado, baseado principalmente em hebraico ( he_IL ), mas com LC_NAME, LC_MESSAGES de en_US e LC_TIME (com modificado first_weekdaye first_workday) de en_GB .

Agarrando arquivos de definição de localidade

Você deve ter uma ideia de quais localidades deseja misturar. Primeiro, precisamos localizar os arquivos de definição relacionados, que podem ser encontrados em /usr/share/i18n/locales/. Voltar ao meu exemplo, eu precisava o seguinte: he_IL , en_US e en_GB . Configurei uma pasta de trabalho em minha casa e copiei os arquivos necessários para ela:

$ cd /usr/share/i18n/locales
$ mkdir -v ~/custom-locale ; cp -v he_IL en_US en_GB ~/custom-locale/

Criando um novo arquivo de definição

Decidi ligar para minha localidade hc_IL e tomei he_IL como base. As linhas a seguir criam um novo arquivo hc_ILcom o conteúdo de he_ILe no caminho substitui todas as ocorrências de uma string he_IL dentro do arquivo por hc_IL .

$ cd ~/custom-locale/
$ sed 's/he_IL/hc_IL/g' he_IL > hc_IL

Modificando o novo arquivo de definição

Agora podemos personalizar o novo local para as nossas necessidades. Abra o arquivo recém-criado ~/custom-locale/hc_ILcom seu editor de texto favorito. Eu uso o vim (ele possui destaque de sintaxe apropriado para arquivos de definição de localidade):

$ vim ~/custom-locale/hc_IL

Para quem ainda não escolheu seu editor favorito e o vim não é sua xícara de chá, use o gedit :)

$ gedit ~/custom-locale/hc_IL

A estrutura do arquivo não é muito complicada. Essencialmente, é construído a partir de seções. Nas páginas do manual locale (5) :

A definição de localidade possui uma parte para cada categoria de localidade. Cada parte pode ser copiada de outro código de idioma existente ou pode ser definida do zero. Se a categoria deve ser copiada, a única palavra-chave válida na definição é copy seguida pelo nome do código do idioma que deve ser copiado.

A noção de cópia é muito útil. Isso economiza tempo e o arquivo resultante é claro e conciso. Por exemplo, em vez de copiar seções inteiras, você pode ter:

LC_MESSAGES
copy "en_US"
END LC_MESSAGES

A documentação completa em um arquivo de definição de localidade pode ser acessada via:

$ man 5 locale

Embora, se você deseja apenas criar um código de idioma personalizado, que é uma mistura dos existentes, não há necessidade de entender todos os detalhes.

No meu caso, modifiquei as seguintes categorias e palavras-chave:

  • LC_IDENTIFICATION

    title      "Custom Hebrew locale"
    source     "mydomain.ws"
    address    "http:////www.mydomain.ws"
    contact    ""
    email      "[email protected]"
    tel        ""
    fax        ""
    language   "Hebrew"
    territory  "Israel"
    revision   "1.0"
    date       "2015-04-21"
    

    Nota: Todas as linhas " category .. " na seção LC_IDENTIFICATION foram modificadas durante a criação do arquivo usando sed. Portanto, não precisamos mais tocá-los.

  • LC_TIME

    Copiei a seção completa de en_GB e modifiquei apenas as linhas que indicam o primeiro dia da semana e o primeiro dia útil:

    first_weekday 1
    first_workday 1
    
  • O restante das categorias que deixei como estão ou substituiu seu conteúdo pela diretiva de cópia, como em:

    LC_NAME
    copy "en_US"
    END LC_NAME
    

É isso aí, o arquivo de definição está pronto. Não se esqueça de salvar o arquivo :)

Compilar e copiar o novo local

A compilação do novo código do idioma é feita usando o seguinte comando como root ou sudo . Substitua hc_ILpor sua localidade:

$ sudo localedef  -c -v -i hc_IL -f UTF-8 hc_IL.UTF-8

Se a compilação for bem-sucedida, os dados do código do idioma compilado serão adicionados ao arquivo morto. /usr/lib/locale/locale-archive .

Copie o novo arquivo de definição de localidade para o diretório de definições de localidade. Substitua hc_ILpor sua localidade:

$ sudo cp -v hc_IL /usr/share/i18n/locales/

Ativando o novo local

Nesta etapa, queremos configurar o sistema e o GNOME para usar o novo código do idioma.

Configurações em todo o sistema

Edite o /etc/locale.confarquivo como root e defina todas as linhas que começarem com LC_seu novo código de idioma. Por exemplo:

LANG=en_US.UTF-8
LC_NUMERIC=hc_IL.utf8
LC_TIME=hc_IL.utf8
LC_MONETARY=hc_IL.utf8
LC_PAPER=hc_IL.utf8
LC_MEASUREMENT=hc_IL.utf8

Configurações do GNOME

Para ativar o novo código do idioma no GNOME, execute o seguinte comando. Substitua hc_ILpor sua localidade:

$ gsettings set org.gnome.system.locale region "hc_IL.utf8"

Validando as novas configurações

O último passo é validar se tudo funciona conforme o esperado. Para recarregar todas as configurações, o mais fácil para mim foi reiniciar.

  • Consulte a seção "Verificando o status da localidade atual" para verificar se a configuração do sistema está correta.
  • Use o GNOME Shell e aplicativos dependentes da localidade (gráfica e console) e verifique se eles se comportam conforme o esperado com a nova localidade. Por exemplo, se você personalizou LC_TIME, pode executar o datecomando para validar o formato da data:

    $ date +%x
    21/04/15
    

Nota: Tudo foi testado no Fedora 21 com o GNOME 3.14. Outras distribuições Linux podem exigir etapas adicionais ou diferentes.

Por favor, comente se você encontrar algum problema com as instruções.

dchrome
fonte
Posso confirmar que isso funciona no Fedora 22 com Cinnamon. Provavelmente também funcionará com o GNOME.
Dee'Kej
1
Tenho certeza de que, se eles se esforçarem muito, poderão tornar a configuração de localizações personalizadas um pouco mais difíceis ainda.
5heikki
Eu amo o GNOME, mas isso é ridículo. Pelo menos, deixe um caminho para os usuários avançados definirem suas configurações de localidade da maneira que quiserem. Eu quero uma localidade dos EUA para a maioria das coisas, mas a minha impressora utiliza papel A4 ...
static_rtti